mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-14 09:05:17 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95f7345ff7 | ||
|
|
bc02f3e67b | ||
|
|
8db42c44bf | ||
|
|
404e6f1cc0 | ||
|
|
5741f669d5 | ||
|
|
6a67149b16 | ||
|
|
c8d934bafd | ||
|
|
075e240303 | ||
|
|
d00665ee65 | ||
|
|
ebb74a5f30 | ||
|
|
5b0117ec76 | ||
|
|
e06d9d0fbc | ||
|
|
ab91647546 | ||
|
|
b236a4a4db | ||
|
|
a480a83a98 | ||
|
|
3a9f123a16 | ||
|
|
8d27fb0692 | ||
|
|
d369fe1c25 | ||
|
|
98b71f2dd4 | ||
|
|
fef0f6422d | ||
|
|
2eb81ac88b | ||
|
|
e02a91f008 | ||
|
|
ced1b95155 | ||
|
|
8f910dfa5d | ||
|
|
05a854cd2a | ||
|
|
22738de028 | ||
|
|
cd0466395a | ||
|
|
24c4056651 | ||
|
|
59fe905695 | ||
|
|
6f3da97365 | ||
|
|
edc1fb24e2 | ||
|
|
f1d68ed4c8 | ||
|
|
ac97370f94 | ||
|
|
82e9de8641 | ||
|
|
843a13c1ab | ||
|
|
3bf50c4bbe | ||
|
|
4922e90d81 | ||
|
|
a3a920437f | ||
|
|
787c0c4a6a | ||
|
|
8517a824e5 | ||
|
|
2cca7aa759 | ||
|
|
23b070c7d0 | ||
|
|
49111e9c5c | ||
|
|
c0cca7f41d | ||
|
|
99bb50d8f8 | ||
|
|
00f00b17bf | ||
|
|
62fdbad74c | ||
|
|
f0bba74a47 | ||
|
|
cf9b5b445b | ||
|
|
aa200923f0 | ||
|
|
ddadf93ca1 | ||
|
|
781c681216 | ||
|
|
cfda7fc738 | ||
|
|
58ba24add2 | ||
|
|
dcf069ca52 | ||
|
|
c3fda11d10 | ||
|
|
11ac46daeb | ||
|
|
2dcabe0123 | ||
|
|
42f1d87955 | ||
|
|
334a76de75 | ||
|
|
677a6e578e | ||
|
|
a3b5eaacfd | ||
|
|
b3d4ea05ec | ||
|
|
8f35adca7a | ||
|
|
394f424185 | ||
|
|
ada52078c7 | ||
|
|
0daf1a6df4 | ||
|
|
edffd04ed2 | ||
|
|
7aea09f4ca | ||
|
|
5673c1dd29 | ||
|
|
1774e2bf30 | ||
|
|
4836b3272a | ||
|
|
a31607ae7d | ||
|
|
57ad221cc6 | ||
|
|
00c7883088 | ||
|
|
1de89525cc | ||
|
|
704a70902f | ||
|
|
570faeb790 | ||
|
|
8b8837c9ff | ||
|
|
eff464cf0e | ||
|
|
26ccb9106e | ||
|
|
0d84487412 | ||
|
|
2bc6a0666f | ||
|
|
82bc9f1b35 | ||
|
|
d73ac867df | ||
|
|
ede93d438f | ||
|
|
5e1949eb0e | ||
|
|
2d368c4c2e | ||
|
|
d9db27275e | ||
|
|
591a25722b | ||
|
|
d1ff1967b5 | ||
|
|
012a755bb9 | ||
|
|
748eece456 | ||
|
|
f709ce7579 | ||
|
|
33efc35b60 | ||
|
|
687d3c059d | ||
|
|
aaf02ea2ac | ||
|
|
625da6492d | ||
|
|
a573faf92d | ||
|
|
9565529baf | ||
|
|
3c346247e1 | ||
|
|
ce949e6099 | ||
|
|
5e3af8ac0e | ||
|
|
5cc90f060c | ||
|
|
577b19c1cf | ||
|
|
8905237306 | ||
|
|
c5d5f4e516 | ||
|
|
24022ab6ba | ||
|
|
6370c242f0 | ||
|
|
4762d4d8ef | ||
|
|
8f2dbf7046 | ||
|
|
23ea835fa7 | ||
|
|
d88db6c0cf | ||
|
|
c6dab815f4 | ||
|
|
7b722bfcd6 | ||
|
|
a90504315e | ||
|
|
3765ceb02d | ||
|
|
dab22f5b74 | ||
|
|
b301e8e4c1 | ||
|
|
f647929993 | ||
|
|
984291cee9 | ||
|
|
ac16845fc4 | ||
|
|
29edd242cd | ||
|
|
ca2d8bd834 | ||
|
|
2a779ec328 | ||
|
|
591e65fa1a | ||
|
|
485db6be2e | ||
|
|
25f3fcad46 | ||
|
|
6bf7c9878c | ||
|
|
95d0ff18cd | ||
|
|
1642bad402 | ||
|
|
179c504746 |
No files matched your search
@@ -12,3 +12,6 @@ fmlbranding.properties
|
||||
/mcp
|
||||
/eclipse
|
||||
/deobfuscation_data*.zip
|
||||
/binpatch
|
||||
/mcp_data/
|
||||
/map_client.txt
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": "FML152",
|
||||
"time": "2013-03-20T12:00:00-04:00",
|
||||
"releaseTime": "2013-03-20T12:00:00-04:00",
|
||||
"type": "release",
|
||||
"minecraftArguments": "${auth_player_name} ${auth_session} --gameDir ${game_directory} --assetsDir ${game_assets} --tweakClass cpw.mods.fml.common.launcher.FMLTweaker",
|
||||
"libraries": [
|
||||
{
|
||||
"name": "cpw.mods:fml:5.2"
|
||||
},
|
||||
{
|
||||
"name": "net.minecraft:launchwrapper:1.3"
|
||||
},
|
||||
{
|
||||
"name": "net.sf.jopt-simple:jopt-simple:4.5"
|
||||
},
|
||||
{
|
||||
"name": "argo:argo:2.25_fixed"
|
||||
},
|
||||
{
|
||||
"name": "org.ow2.asm:asm-all:4.1"
|
||||
},
|
||||
{
|
||||
"name": "org.lwjgl.lwjgl:lwjgl:2.9.0"
|
||||
},
|
||||
{
|
||||
"name": "org.lwjgl.lwjgl:lwjgl_util:2.9.0"
|
||||
},
|
||||
{
|
||||
"name": "net.java.jinput:jinput:2.0.5"
|
||||
},
|
||||
{
|
||||
"name": "org.bouncycastle:bcprov-jdk15on:1.47"
|
||||
},
|
||||
{
|
||||
"name": "com.google.guava:guava:14.0"
|
||||
},
|
||||
{
|
||||
"name": "net.java.jutils:jutils:1.0.0"
|
||||
},
|
||||
{
|
||||
"name": "org.lwjgl.lwjgl:lwjgl-platform:2.9.0",
|
||||
"natives": {
|
||||
"linux": "natives-linux",
|
||||
"windows": "natives-windows",
|
||||
"osx": "natives-osx"
|
||||
},
|
||||
"extract": {
|
||||
"exclude": [
|
||||
"META-INF/"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "net.java.jinput:jinput-platform:2.0.5",
|
||||
"natives": {
|
||||
"linux": "natives-linux",
|
||||
"windows": "natives-windows",
|
||||
"osx": "natives-osx"
|
||||
},
|
||||
"extract": {
|
||||
"exclude": [
|
||||
"META-INF/"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"mainClass": "net.minecraft.launchwrapper.Launch"
|
||||
}
|
||||
@@ -9,6 +9,12 @@ included based on guidelines at
|
||||
http://www.softwarefreedom.org/resources/2007/gpl-non-gpl-collaboration.html
|
||||
with notices intact. The only change is a non-functional change of package name.
|
||||
|
||||
This software contains a partial repackaging of javaxdelta, a BSD licensed program for generating
|
||||
binary differences and applying them, sourced from the subversion at http://sourceforge.net/projects/javaxdelta/
|
||||
authored by genman, heikok, pivot.
|
||||
The only changes are to replace some Trove collection types with standard Java collections, and repackaged.
|
||||
|
||||
|
||||
=== MCP Data ===
|
||||
This software includes data from the Minecraft Coder Pack (MCP), with kind permission
|
||||
from them. The license to MCP data is not transitive - distribution of this data by
|
||||
@@ -16,6 +22,14 @@ third parties requires independent licensing from the MCP team. This data is not
|
||||
redistributable without permission from the MCP team.
|
||||
|
||||
=== Sharing ===
|
||||
I grant permission for some parts of FML to be redistributed outside the terms of the LGPL, for the benefit of
|
||||
the minecraft modding community. All contributions to these parts should be licensed under the same additional grant.
|
||||
|
||||
-- Runtime patcher --
|
||||
License is granted to redistribute the runtime patcher code (common/cpw/mods/fml/patcher and subdirectories) under
|
||||
any alternative open source license as classified by the OSI (http://opensource.org/licenses)
|
||||
|
||||
-- ASM transformers --
|
||||
License is granted to redistribute the ASM transformer code (common/cpw/mods/fml/common/asm/ and subdirectories)
|
||||
under any alternative open source license as classified by the OSI (http://opensource.org/licenses)
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
<arg value="${mcp.home}" />
|
||||
</exec>
|
||||
<propertyfile file="fmlversion.properties">
|
||||
<entry key="fmlbuild.build.number" type="int" value="${version.build}"/>
|
||||
<entry key="fmlbuild.deobfuscation.hash" type="string" value="${deobf.checksum}"/>
|
||||
<entry key="fmlbuild.build.number" type="int" value="${version.build}" />
|
||||
<entry key="fmlbuild.deobfuscation.hash" type="string" value="${deobf.checksum}" />
|
||||
</propertyfile>
|
||||
</target>
|
||||
|
||||
@@ -34,11 +34,11 @@
|
||||
<os family="Windows" />
|
||||
</condition>
|
||||
<condition property="mcp.exists">
|
||||
<available file="${mcp.home}/runtime/commands.py"/>
|
||||
<available file="${mcp.home}/runtime/commands.py" />
|
||||
</condition>
|
||||
<condition property="signature.exists">
|
||||
<available file="${env.JENKINS_HOME}/fmlsigned.properties" />
|
||||
</condition>
|
||||
<condition property="signature.exists">
|
||||
<available file="${env.JENKINS_HOME}/fmlsigned.properties"/>
|
||||
</condition>
|
||||
<property name="mcp.obfoutput" location="${mcp.home}/reobf" />
|
||||
<property name="client.mcp.obfoutput" location="${mcp.obfoutput}/minecraft" />
|
||||
<property name="mcp.srcdir" location="${mcp.home}/src" />
|
||||
@@ -54,7 +54,7 @@
|
||||
<condition property="version.build" value="${env.BUILD_NUMBER}" else="1">
|
||||
<isset property="env.BUILD_NUMBER" />
|
||||
</condition>
|
||||
<available file="eclipse" property="eclipse.exists"/>
|
||||
<available file="eclipse" property="eclipse.exists" />
|
||||
</target>
|
||||
|
||||
<target name="makeversion" depends="buildenvsetup">
|
||||
@@ -79,8 +79,11 @@
|
||||
<target name="clean" depends="buildenvsetup,makeclean" if="mcp.exists">
|
||||
<exec executable="${python.exe}" dir="${mcp.home}">
|
||||
<arg value="${basedir}/decompile.py" />
|
||||
<arg value="--mcp-dir" />
|
||||
<arg value="${mcp.home}" />
|
||||
<arg value="--fml-dir" />
|
||||
<arg value="${basedir}" />
|
||||
<arg value="--gen-conf" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
@@ -89,19 +92,19 @@
|
||||
<arg value="${mcp.home}/runtime/reobfuscate.py" />
|
||||
</exec>
|
||||
<fail message="Reobfuscation failed">
|
||||
<condition>
|
||||
<not>
|
||||
<and>
|
||||
<available file="${mcp.home}/temp/client.md5"/>
|
||||
<available file="${mcp.home}/temp/client_reobf.md5"/>
|
||||
</and>
|
||||
</not>
|
||||
</condition>
|
||||
<condition>
|
||||
<not>
|
||||
<and>
|
||||
<available file="${mcp.home}/temp/client.md5" />
|
||||
<available file="${mcp.home}/temp/client_reobf.md5" />
|
||||
</and>
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
<exec executable="${python.exe}" dir="${mcp.home}">
|
||||
<arg value="${basedir}/generatechangedfilelist.py"/>
|
||||
<arg value="${mcp.home}"/>
|
||||
<arg value="${basedir}/difflist.txt"/>
|
||||
<arg value="${basedir}/generatechangedfilelist.py" />
|
||||
<arg value="${mcp.home}" />
|
||||
<arg value="${basedir}/difflist.txt" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
@@ -110,11 +113,11 @@
|
||||
<arg value="${mcp.home}/runtime/recompile.py" />
|
||||
</exec>
|
||||
<fail message="Compilation failed">
|
||||
<condition>
|
||||
<not>
|
||||
<available file="${mcp.home}/bin/minecraft/net/minecraft/client/Minecraft.class"/>
|
||||
</not>
|
||||
</condition>
|
||||
<condition>
|
||||
<not>
|
||||
<available file="${mcp.home}/bin/minecraft/net/minecraft/client/Minecraft.class" />
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
</target>
|
||||
|
||||
@@ -132,7 +135,7 @@
|
||||
|
||||
<target name="merge-source" depends="buildenvsetup,merge-client,merge-common" />
|
||||
|
||||
<target name="build-universal" depends="buildenvsetup,merge-client,merge-common,reobfuscate,makeversion">
|
||||
<target name="build-universal" depends="buildenvsetup,merge-client,merge-common,reobfuscate,makeversion,makebinpatches">
|
||||
<condition property="universal.jarname" value="${modname}-universal-${version.minecraft}-${version}" else="${modname}-universal-${version.minecraft}-${version}-${version.branch}">
|
||||
<equals arg1="${version.branch}" arg2="master" />
|
||||
</condition>
|
||||
@@ -140,19 +143,20 @@
|
||||
<mkdir dir="${basedir}/target" />
|
||||
<jar destfile="${basedir}/target/${universal.jarname}.zip" duplicate="preserve">
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="net.minecraft.server.MinecraftServer"/>
|
||||
<attribute name="Class-Path" value="minecraft_server.jar"/>
|
||||
<attribute name="Main-Class" value="cpw.mods.fml.relauncher.ServerLaunchWrapper" />
|
||||
<attribute name="Class-Path" value="minecraft_server.jar:lib/guava-14.0-rc3.jar:lib/bcprov-jdk15on-148-src.zip:lib/asm-debug-all-4.1.jar:lib/scala-library.jar:lib/argo-3.2-src.jar" />
|
||||
</manifest>
|
||||
<fileset dir="${client.mcp.obfoutput}" includes="**/*.class" excludes="*.class"/>
|
||||
<fileset dir="${client.mcp.obfoutput}" includes="**/*.class" excludes="*.class,net/minecraft/**/*.class" />
|
||||
</jar>
|
||||
<antcall target="signjar"/>
|
||||
<zip update="true" destfile="${basedir}/target/${universal.jarname}.zip" >
|
||||
<fileset dir="${client.mcp.obfoutput}" includes="*.class"/>
|
||||
<zipfileset dir="${basedir}" includes="fmlversion.properties"/>
|
||||
<antcall target="signjar" />
|
||||
<zip update="true" destfile="${basedir}/target/${universal.jarname}.zip">
|
||||
<zipfileset dir="${basedir}/binpatch" prefix="binpatch" includes="**/*.binpatch"/>
|
||||
<fileset dir="${client.mcp.obfoutput}" includes="*.class" />
|
||||
<zipfileset dir="${basedir}" includes="fmlversion.properties" />
|
||||
<zipfileset dir="${basedir}" includes="LICENSE-fml.txt" />
|
||||
<zipfileset dir="${common.src.dir}" includes="mcpmod.info" />
|
||||
<zipfileset dir="${client.src.dir}" includes="mcp.png" />
|
||||
<zipfileset dir="${basedir}" includes="install/CREDITS-fml.txt" fullpath="CREDITS-fml.txt"/>
|
||||
<zipfileset dir="${common.src.dir}" includes="mcpmod.info" />
|
||||
<zipfileset dir="${client.src.dir}" includes="mcp.png" />
|
||||
<zipfileset dir="${basedir}" includes="install/CREDITS-fml.txt" fullpath="CREDITS-fml.txt" />
|
||||
<zipfileset dir="${common.src.dir}" includes="*.cfg" />
|
||||
<mappedresources>
|
||||
<concat>
|
||||
@@ -205,25 +209,30 @@
|
||||
</target>
|
||||
|
||||
<target name="build-deobf-data" depends="makeversion">
|
||||
<mkdir dir="build-tmp-deobf"/>
|
||||
<mkdir dir="build-tmp-deobf" />
|
||||
<copy todir="build-tmp-deobf">
|
||||
<mappedresources>
|
||||
<fileset dir="${mcp.home}/conf" includes="packaged.srg"/>
|
||||
<globmapper from="packaged.srg" to="joined.srg"/>
|
||||
<fileset dir="${mcp.home}/conf" includes="packaged.srg" />
|
||||
<globmapper from="packaged.srg" to="deobfuscation_data-${version.minecraft}" />
|
||||
</mappedresources>
|
||||
</copy>
|
||||
<touch millis="0" file="build-tmp-deobf/joined.srg"/>
|
||||
<zip file="deobfuscation_data_${version.minecraft}.zip" encoding="UTF-8">
|
||||
<fileset dir="build-tmp-deobf" includes="joined.srg"/>
|
||||
</zip>
|
||||
<checksum algorithm="SHA1" property="deobf.checksum" file="deobfuscation_data_${version.minecraft}.zip"/>
|
||||
<antcall target="writeversion"/>
|
||||
<exec executable="lzma">
|
||||
<arg line="build-tmp-deobf/deobfuscation_data-${version.minecraft}"/>
|
||||
<arg line="-v"/>
|
||||
</exec>
|
||||
<copy todir="${basedir}">
|
||||
<fileset dir="build-tmp-deobf" includes="*.lzma" />
|
||||
</copy>
|
||||
<antcall target="writeversion" />
|
||||
<delete dir="build-tmp-deobf" />
|
||||
<zip destfile="deobfuscation_data-${version.minecraft}.jar" basedir="${basedir}">
|
||||
<include name="deobfuscation_data-${version.minecraft}.lzma"/>
|
||||
</zip>
|
||||
</target>
|
||||
|
||||
<target name="build" depends="buildenvsetup,merge-client,merge-common,build-deobf-data,build-universal,build-source-pack" />
|
||||
|
||||
<target name="jenkinsbuild" depends="buildenvsetup,jenkinsfmldecompile,patch,build"/>
|
||||
<target name="jenkinsbuild" depends="buildenvsetup,jenkinsfmldecompile,patch,build" />
|
||||
|
||||
<target name="patch" depends="buildenvsetup">
|
||||
<exec executable="${python.exe}" dir="${basedir}">
|
||||
@@ -242,87 +251,91 @@
|
||||
</condition>
|
||||
<fail if="do.not.continue">You have decided not to continue. This script will stop now.</fail>
|
||||
<echo>Preparing the MCP environment at ${mcp.home}</echo>
|
||||
<antcall target="fmldecompile"/>
|
||||
<antcall target="fmldecompile" />
|
||||
<echo>Moving old patched sources at ${patch.mcp.srcdir} out of the way</echo>
|
||||
<move todir="${mcp.home}/src-work${timestamp}" failonerror="false" verbose="true">
|
||||
<fileset dir="${patch.mcp.srcdir}"/>
|
||||
<fileset dir="${patch.mcp.srcdir}" />
|
||||
</move>
|
||||
<echo>Deleting old patch references at ${clean.mcp.srcdir}</echo>
|
||||
<delete dir="${clean.mcp.srcdir}" failonerror="false"/>
|
||||
<delete dir="${clean.mcp.srcdir}" failonerror="false" />
|
||||
<echo>Creating new patch references at ${clean.mcp.srcdir}</echo>
|
||||
<copy todir="${clean.mcp.srcdir}">
|
||||
<fileset dir="${mcp.srcdir}"/>
|
||||
<fileset dir="${mcp.srcdir}" />
|
||||
</copy>
|
||||
<antcall target="cleanargo"/>
|
||||
<antcall target="patch"/>
|
||||
<antcall target="cleanargo" />
|
||||
<antcall target="patch" />
|
||||
<echo>Creating clean patched references at ${patch.mcp.srcdir}</echo>
|
||||
<copy todir="${patch.mcp.srcdir}">
|
||||
<fileset dir="${mcp.srcdir}"/>
|
||||
<fileset dir="${mcp.srcdir}" />
|
||||
</copy>
|
||||
<antcall target="writeversion"/>
|
||||
<antcall target="makeeclipse"/>
|
||||
<antcall target="writeversion" />
|
||||
<antcall target="makeeclipse" />
|
||||
<echo>Setup complete! You should now be able to open ${basedir}/eclipse as a workspace in eclipse and import/refresh the FML project</echo>
|
||||
</target>
|
||||
|
||||
<target name="fmldecompile" depends="buildenvsetup,makeclean">
|
||||
<exec executable="${python.exe}" dir="${basedir}">
|
||||
<arg value="${basedir}/decompile.py" />
|
||||
<arg value="--mcp-dir" />
|
||||
<arg value="${mcp.home}" />
|
||||
<arg value="--fml-dir" />
|
||||
<arg value="${basedir}" />
|
||||
<arg value="--gen-conf" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="jenkinsfmldecompile" depends="buildenvsetup,makeclean">
|
||||
<exec executable="${python.exe}" dir="${basedir}">
|
||||
<arg value="${basedir}/decompile.py" />
|
||||
<arg value="--mcp-dir" />
|
||||
<arg value="${mcp.home}" />
|
||||
<arg value="--fml-dir" />
|
||||
<arg value="${basedir}" />
|
||||
<arg value="-no_gen_conf" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="repatch" depends="buildenvsetup,checkpatches">
|
||||
<echo>Moving old patched sources at ${mcp.home}/src-work out of the way</echo>
|
||||
<move todir="${mcp.home}/src-work${timestamp}" failonerror="false" verbose="true">
|
||||
<fileset dir="${patch.mcp.srcdir}"/>
|
||||
<fileset dir="${patch.mcp.srcdir}" />
|
||||
</move>
|
||||
<delete dir="${mcp.srcdir}"/>
|
||||
<delete dir="${mcp.srcdir}" />
|
||||
<copy todir="${mcp.srcdir}">
|
||||
<fileset dir="${clean.mcp.srcdir}"/>
|
||||
<fileset dir="${clean.mcp.srcdir}" />
|
||||
</copy>
|
||||
|
||||
<antcall target="cleanargo"/>
|
||||
<antcall target="cleanargo" />
|
||||
|
||||
<antcall target="patch"/>
|
||||
<antcall target="patch" />
|
||||
<copy todir="${patch.mcp.srcdir}">
|
||||
<fileset dir="${mcp.srcdir}"/>
|
||||
<fileset dir="${mcp.srcdir}" />
|
||||
</copy>
|
||||
</target>
|
||||
|
||||
<target name="repatchclean" depends="buildenvsetup">
|
||||
<delete dir="${mcp.srcdir}"/>
|
||||
<delete dir="${mcp.srcdir}" />
|
||||
<copy todir="${mcp.srcdir}">
|
||||
<fileset dir="${clean.mcp.srcdir}"/>
|
||||
<fileset dir="${clean.mcp.srcdir}" />
|
||||
</copy>
|
||||
|
||||
<antcall target="cleanargo"/>
|
||||
<antcall target="cleanargo" />
|
||||
|
||||
<antcall target="patch"/>
|
||||
<antcall target="patch" />
|
||||
</target>
|
||||
|
||||
<target name="cleanargo" depends="buildenvsetup">
|
||||
<delete dir="${client.mcp.srcdir}/argo"/>
|
||||
<delete dir="${client.mcp.srcdir}/org"/>
|
||||
<delete dir="${client.mcp.srcdir}/argo" />
|
||||
<delete dir="${client.mcp.srcdir}/org" />
|
||||
</target>
|
||||
|
||||
<target name="checkpatches" depends="buildenvsetup">
|
||||
<uptodate property="checkUptodate.uptodate">
|
||||
<srcfiles dir="${patch.mcp.srcdir}" includes="**/*.java">
|
||||
<present targetdir="${patch.src.dir}">
|
||||
<globmapper from="*.java" to="*.java.patch"/>
|
||||
<globmapper from="*.java" to="*.java.patch" />
|
||||
</present>
|
||||
</srcfiles>
|
||||
<globmapper from="*.java" to="${patch.src.dir}/*.java.patch"/>
|
||||
<globmapper from="*.java" to="${patch.src.dir}/*.java.patch" />
|
||||
</uptodate>
|
||||
<fail unless="checkUptodate.uptodate">
|
||||
A patch is out of date. Update your patches!
|
||||
@@ -332,8 +345,8 @@
|
||||
<target name="updatepatches" depends="buildenvsetup">
|
||||
<exec executable="${python.exe}" dir="${basedir}">
|
||||
<arg value="${basedir}/update_patches.py" />
|
||||
<arg value="${mcp.home}"/>
|
||||
<arg value="${basedir}"/>
|
||||
<arg value="${mcp.home}" />
|
||||
<arg value="${basedir}" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
@@ -341,30 +354,55 @@
|
||||
<echo>
|
||||
Extracting fresh eclipse workspace to ${basedir}/eclipse
|
||||
</echo>
|
||||
<unzip src="${basedir}/eclipse-workspace-dev.zip" dest="${basedir}"/>
|
||||
<unzip src="${basedir}/eclipse-workspace-dev.zip" dest="${basedir}" />
|
||||
</target>
|
||||
|
||||
<target name="makerenamedsource" depends="buildenvsetup,repatch,merge-client,merge-common,reobfuscate">
|
||||
<copy todir="${tmp.mcp.srcdir}">
|
||||
<fileset dir="${mcp.srcdir}"/>
|
||||
<fileset dir="${mcp.srcdir}" />
|
||||
</copy>
|
||||
<exec executable="${python.exe}" dir="${mcp.home}">
|
||||
<arg value="${mcp.home}/runtime/updatenames.py" />
|
||||
<arg value="-f" />
|
||||
</exec>
|
||||
<copy todir="${renamed.mcp.srcdir}">
|
||||
<fileset dir="${mcp.srcdir}"/>
|
||||
<fileset dir="${mcp.srcdir}" />
|
||||
</copy>
|
||||
<move todir="${mcp.srcdir}">
|
||||
<fileset dir="${tmp.mcp.srcdir}"/>
|
||||
<fileset dir="${tmp.mcp.srcdir}" />
|
||||
</move>
|
||||
</target>
|
||||
<target name="signjar" depends="buildenvsetup,makeversion" if="signature.exists">
|
||||
<condition property="universal.jarname" value="${modname}-universal-${version.minecraft}-${version}" else="${modname}-universal-${version.minecraft}-${version}-${version.branch}">
|
||||
<equals arg1="${version.branch}" arg2="master" />
|
||||
</condition>
|
||||
<property file="${env.JENKINS_HOME}/fmlsigned.properties" prefix="sign"/>
|
||||
<echo>${env.JENKINS_HOME} ${universal.jarname} ${sign.KEYPASS}</echo>
|
||||
<signjar alias="FML" jar="${basedir}/target/${universal.jarname}.zip" keypass="${sign.KEYPASS}" keystore="${env.JENKINS_HOME}/${sign.KEYSTORE}" storepass="${sign.STOREPASS}" verbose="true"/>
|
||||
<property file="${env.JENKINS_HOME}/fmlsigned.properties" prefix="sign" />
|
||||
<echo>${env.JENKINS_HOME} ${universal.jarname} ${sign.KEYPASS}</echo>
|
||||
<signjar alias="FML" jar="${basedir}/target/${universal.jarname}.zip" keypass="${sign.KEYPASS}" keystore="${env.JENKINS_HOME}/${sign.KEYSTORE}" storepass="${sign.STOREPASS}" verbose="true" />
|
||||
</target>
|
||||
<target name="makebinpatches" depends="buildenvsetup,makeversion">
|
||||
<delete dir="${basedir}/binpatch" verbose="true"/>
|
||||
<java classname="cpw.mods.fml.common.patcher.GenDiffSet">
|
||||
<classpath>
|
||||
<pathelement path="${mcp.obfoutput}/minecraft"/>
|
||||
<fileset dir="${mcp.home}/lib" includes="guava-14.0-rc3.jar,asm-debug-all-4.1.jar"/>
|
||||
</classpath>
|
||||
<arg path="${mcp.home}/jars/versions/${version.minecraft}/${version.minecraft}.jar.backup"/>
|
||||
<arg path="${mcp.obfoutput}/minecraft"/>
|
||||
<arg path="${basedir}/deobfuscation_data-${version.minecraft}.lzma"/>
|
||||
<arg path="${basedir}/binpatch/client"/>
|
||||
<arg value="false"/>
|
||||
</java>
|
||||
<java classname="cpw.mods.fml.common.patcher.GenDiffSet">
|
||||
<classpath>
|
||||
<pathelement path="${mcp.obfoutput}/minecraft"/>
|
||||
<fileset dir="${mcp.home}/lib" includes="guava-14.0-rc3.jar,asm-debug-all-4.1.jar"/>
|
||||
</classpath>
|
||||
<arg path="${mcp.home}/jars/minecraft_server.${version.minecraft}.jar.backup"/>
|
||||
<arg path="${mcp.obfoutput}/minecraft"/>
|
||||
<arg path="${basedir}/deobfuscation_data-${version.minecraft}.lzma"/>
|
||||
<arg path="${basedir}/binpatch/server"/>
|
||||
<arg value="true"/>
|
||||
</java>
|
||||
</target>
|
||||
</project>
|
||||
@@ -71,6 +71,7 @@ import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData;
|
||||
import cpw.mods.fml.common.registry.IThrowableEntity;
|
||||
import cpw.mods.fml.common.registry.ItemData;
|
||||
import cpw.mods.fml.common.registry.LanguageRegistry;
|
||||
import cpw.mods.fml.common.toposort.ModSortingException;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
|
||||
|
||||
@@ -113,6 +114,8 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
|
||||
private MissingModsException modsMissing;
|
||||
|
||||
private ModSortingException modSorting;
|
||||
|
||||
private boolean loading;
|
||||
|
||||
private WrongMinecraftVersionException wrongMC;
|
||||
@@ -130,6 +133,7 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
*/
|
||||
public void beginMinecraftLoading(Minecraft minecraft)
|
||||
{
|
||||
client = minecraft;
|
||||
if (minecraft.func_71355_q())
|
||||
{
|
||||
FMLLog.severe("DEMO MODE DETECTED, FML will not work. Finishing now.");
|
||||
@@ -138,8 +142,6 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
}
|
||||
|
||||
loading = true;
|
||||
client = minecraft;
|
||||
ObfuscationReflectionHelper.detectObfuscation(World.class);
|
||||
// TextureFXManager.instance().setClient(client);
|
||||
FMLCommonHandler.instance().beginLoading(this);
|
||||
new ModLoaderClientHelper(client);
|
||||
@@ -172,6 +174,10 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
{
|
||||
modsMissing = missing;
|
||||
}
|
||||
catch (ModSortingException sorting)
|
||||
{
|
||||
modSorting = sorting;
|
||||
}
|
||||
catch (CustomModLoadingErrorDisplayException custom)
|
||||
{
|
||||
FMLLog.log(Level.SEVERE, custom, "A custom exception was thrown by a mod, the game will now halt");
|
||||
@@ -198,7 +204,7 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
@SuppressWarnings("deprecation")
|
||||
public void finishMinecraftLoading()
|
||||
{
|
||||
if (modsMissing != null || wrongMC != null || customError!=null || dupesFound!=null)
|
||||
if (modsMissing != null || wrongMC != null || customError!=null || dupesFound!=null || modSorting!=null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -238,14 +244,18 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
{
|
||||
client.func_71373_a(new GuiDupesFound(dupesFound));
|
||||
}
|
||||
else if (customError != null)
|
||||
else if (modSorting != null)
|
||||
{
|
||||
client.func_71373_a(new GuiSortingProblem(modSorting));
|
||||
}
|
||||
else if (customError != null)
|
||||
{
|
||||
client.func_71373_a(new GuiCustomModLoadingErrorScreen(customError));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Force renderengine to reload and re-initialize all textures
|
||||
client.field_71446_o.func_78352_b();
|
||||
// client.field_71446_o.func_78352_b();
|
||||
// TextureFXManager.instance().loadTextures(client.field_71418_C.func_77292_e());
|
||||
}
|
||||
}
|
||||
@@ -341,6 +351,7 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
else
|
||||
{
|
||||
entity = (Entity)(cls.getConstructor(World.class).newInstance(wc));
|
||||
int offset = packet.entityId - entity.field_70157_k;
|
||||
entity.field_70157_k = packet.entityId;
|
||||
entity.func_70012_b(packet.scaledX, packet.scaledY, packet.scaledZ, packet.scaledYaw, packet.scaledPitch);
|
||||
if (entity instanceof EntityLiving)
|
||||
@@ -348,6 +359,14 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
((EntityLiving)entity).field_70759_as = packet.scaledHeadYaw;
|
||||
}
|
||||
|
||||
Entity parts[] = entity.func_70021_al();
|
||||
if (parts != null)
|
||||
{
|
||||
for (int j = 0; j < parts.length; j++)
|
||||
{
|
||||
parts[j].field_70157_k += offset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
entity.field_70118_ct = packet.rawX;
|
||||
@@ -360,18 +379,6 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
((IThrowableEntity)entity).setThrower(thrower);
|
||||
}
|
||||
|
||||
|
||||
Entity parts[] = entity.func_70021_al();
|
||||
if (parts != null)
|
||||
{
|
||||
int i = packet.entityId - entity.field_70157_k;
|
||||
for (int j = 0; j < parts.length; j++)
|
||||
{
|
||||
parts[j].field_70157_k += i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (packet.metadata != null)
|
||||
{
|
||||
entity.func_70096_w().func_75687_a((List)packet.metadata);
|
||||
@@ -532,4 +539,15 @@ public class FMLClientHandler implements IFMLSidedHandler
|
||||
// Show error screen
|
||||
warnIDMismatch(s, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this GUI type open?
|
||||
*
|
||||
* @param gui The type of GUI to test for
|
||||
* @return if a GUI of this type is open
|
||||
*/
|
||||
public boolean isGUIOpen(Class<? extends GuiScreen> gui)
|
||||
{
|
||||
return client.field_71462_r != null && client.field_71462_r.getClass().equals(gui);
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -17,6 +17,7 @@ import java.util.Map.Entry;
|
||||
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.GuiYesNo;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.util.StringTranslate;
|
||||
|
||||
import com.google.common.collect.Lists;
|
||||
@@ -37,13 +38,13 @@ public class GuiIdMismatchScreen extends GuiYesNo {
|
||||
field_73942_a = this;
|
||||
for (Entry<Integer, ItemData> entry : idDifferences.entriesOnlyOnLeft().entrySet())
|
||||
{
|
||||
missingIds.add(String.format("ID %d (ModID: %s, type %s) is missing", entry.getValue().getItemId(), entry.getValue().getModId(), entry.getValue().getItemType()));
|
||||
missingIds.add(String.format("ID %d from Mod %s is missing", entry.getValue().getItemId(), entry.getValue().getModId(), entry.getValue().getItemType()));
|
||||
}
|
||||
for (Entry<Integer, ValueDifference<ItemData>> entry : idDifferences.entriesDiffering().entrySet())
|
||||
{
|
||||
ItemData world = entry.getValue().leftValue();
|
||||
ItemData game = entry.getValue().rightValue();
|
||||
mismatchedIds.add(String.format("ID %d is mismatched. World: (ModID: %s, type %s, ordinal %d) Game (ModID: %s, type %s, ordinal %d)", world.getItemId(), world.getModId(), world.getItemType(), world.getOrdinal(), game.getModId(), game.getItemType(), game.getOrdinal()));
|
||||
mismatchedIds.add(String.format("ID %d is mismatched between world and game", world.getItemId()));
|
||||
}
|
||||
this.allowContinue = allowContinue;
|
||||
}
|
||||
@@ -62,37 +63,44 @@ public class GuiIdMismatchScreen extends GuiYesNo {
|
||||
{
|
||||
field_73887_h.remove(0);
|
||||
}
|
||||
int offset = Math.max(85 - missingIds.size() * 10 + mismatchedIds.size() * 30, 10);
|
||||
this.func_73732_a(this.field_73886_k, "Forge Mod Loader has found world ID mismatches", this.field_73880_f / 2, offset, 0xFFFFFF);
|
||||
offset += 10;
|
||||
int offset = Math.max(85 - (missingIds.size() + mismatchedIds.size()) * 10, 30);
|
||||
this.func_73732_a(this.field_73886_k, "Forge Mod Loader has found ID mismatches", this.field_73880_f / 2, 10, 0xFFFFFF);
|
||||
this.func_73732_a(this.field_73886_k, "Complete details are in the log file", this.field_73880_f / 2, 20, 0xFFFFFF);
|
||||
int maxLines = 20;
|
||||
for (String s: missingIds) {
|
||||
this.func_73732_a(this.field_73886_k, s, this.field_73880_f / 2, offset, 0xEEEEEE);
|
||||
offset += 10;
|
||||
maxLines --;
|
||||
if (maxLines < 0) break;
|
||||
if (offset >= this.field_73881_g - 30) break;
|
||||
}
|
||||
for (String s: mismatchedIds) {
|
||||
this.func_73732_a(this.field_73886_k, s, this.field_73880_f / 2, offset, 0xEEEEEE);
|
||||
offset += 10;
|
||||
if (maxLines > 0 && offset < this.field_73881_g - 30)
|
||||
{
|
||||
for (String s: mismatchedIds) {
|
||||
this.func_73732_a(this.field_73886_k, s, this.field_73880_f / 2, offset, 0xEEEEEE);
|
||||
offset += 10;
|
||||
maxLines --;
|
||||
if (maxLines < 0) break;
|
||||
if (offset >= this.field_73881_g - 30) break;
|
||||
}
|
||||
}
|
||||
offset += 10;
|
||||
if (allowContinue)
|
||||
{
|
||||
this.func_73732_a(this.field_73886_k, "Do you wish to continue loading?", this.field_73880_f / 2, offset, 0xFFFFFF);
|
||||
offset += 10;
|
||||
this.func_73732_a(this.field_73886_k, "Do you wish to continue loading?", this.field_73880_f / 2, this.field_73881_g - 30, 0xFFFFFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.func_73732_a(this.field_73886_k, "You cannot connect to this server", this.field_73880_f / 2, offset, 0xFFFFFF);
|
||||
offset += 10;
|
||||
this.func_73732_a(this.field_73886_k, "You cannot connect to this server", this.field_73880_f / 2, this.field_73881_g - 30, 0xFFFFFF);
|
||||
}
|
||||
// super.super. Grrr
|
||||
for (int var4 = 0; var4 < this.field_73887_h.size(); ++var4)
|
||||
{
|
||||
GuiButton var5 = (GuiButton)this.field_73887_h.get(var4);
|
||||
var5.field_73743_d = Math.min(offset + 10, this.field_73881_g - 20);
|
||||
var5.field_73743_d = this.field_73881_g - 20;
|
||||
if (!allowContinue)
|
||||
{
|
||||
var5.field_73746_c = this.field_73880_f / 2 - 75;
|
||||
var5.field_73744_e = StringTranslate.func_74808_a().func_74805_b("gui.done");
|
||||
var5.field_73744_e = I18n.func_135053_a("gui.done");
|
||||
}
|
||||
var5.func_73737_a(this.field_73882_e, p_73863_1_, p_73863_2_);
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.gui.GuiSmallButton;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.util.StringTranslate;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
@@ -80,8 +81,7 @@ public class GuiModList extends GuiScreen
|
||||
listWidth=Math.max(listWidth,getFontRenderer().func_78256_a(mod.getVersion()) + 10);
|
||||
}
|
||||
listWidth=Math.min(listWidth, 150);
|
||||
StringTranslate translations = StringTranslate.func_74808_a();
|
||||
this.field_73887_h.add(new GuiSmallButton(6, this.field_73880_f / 2 - 75, this.field_73881_g - 38, translations.func_74805_b("gui.done")));
|
||||
this.field_73887_h.add(new GuiSmallButton(6, this.field_73880_f / 2 - 75, this.field_73881_g - 38, I18n.func_135053_a("gui.done")));
|
||||
this.modList=new GuiSlotModList(this, mods, listWidth);
|
||||
this.modList.registerScrollButtons(this.field_73887_h, 7, 8);
|
||||
}
|
||||
@@ -120,7 +120,8 @@ public class GuiModList extends GuiScreen
|
||||
if (!logoFile.isEmpty())
|
||||
{
|
||||
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
this.field_73882_e.field_71446_o.func_98187_b(logoFile);
|
||||
// TODO
|
||||
// this.field_73882_e.field_71446_o.func_98187_b(logoFile);
|
||||
Dimension dim = TextureFXManager.instance().getTextureDimensions(logoFile);
|
||||
double scaleX = dim.width / 200.0;
|
||||
double scaleY = dim.height / 65.0;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -15,6 +15,7 @@ package cpw.mods.fml.client;
|
||||
import net.minecraft.client.gui.GuiErrorScreen;
|
||||
import cpw.mods.fml.common.MissingModsException;
|
||||
import cpw.mods.fml.common.versioning.ArtifactVersion;
|
||||
import cpw.mods.fml.common.versioning.DefaultArtifactVersion;
|
||||
|
||||
public class GuiModsMissing extends GuiErrorScreen
|
||||
{
|
||||
@@ -43,6 +44,15 @@ public class GuiModsMissing extends GuiErrorScreen
|
||||
for (ArtifactVersion v : modsMissing.missingMods)
|
||||
{
|
||||
offset+=10;
|
||||
if (v instanceof DefaultArtifactVersion)
|
||||
{
|
||||
DefaultArtifactVersion dav = (DefaultArtifactVersion)v;
|
||||
if (dav.getRange() != null && dav.getRange().isUnboundedAbove())
|
||||
{
|
||||
this.func_73732_a(this.field_73886_k, String.format("%s : minimum version required is %s", v.getLabel(), dav.getRange().getLowerBoundString()), this.field_73880_f / 2, offset, 0xEEEEEE);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
this.func_73732_a(this.field_73886_k, String.format("%s : %s", v.getLabel(), v.getRangeString()), this.field_73880_f / 2, offset, 0xEEEEEE);
|
||||
}
|
||||
offset+=20;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -15,6 +15,7 @@ package cpw.mods.fml.client;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.gui.GuiSmallButton;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.util.StringTranslate;
|
||||
import cpw.mods.fml.common.network.ModMissingPacket;
|
||||
import cpw.mods.fml.common.versioning.ArtifactVersion;
|
||||
@@ -31,8 +32,7 @@ public class GuiModsMissingForServer extends GuiScreen
|
||||
@Override
|
||||
public void func_73866_w_()
|
||||
{
|
||||
StringTranslate translations = StringTranslate.func_74808_a();
|
||||
this.field_73887_h.add(new GuiSmallButton(1, this.field_73880_f / 2 - 75, this.field_73881_g - 38, translations.func_74805_b("gui.done")));
|
||||
this.field_73887_h.add(new GuiSmallButton(1, this.field_73880_f / 2 - 75, this.field_73881_g - 38, I18n.func_135053_a("gui.done")));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -15,6 +15,7 @@ package cpw.mods.fml.client;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.Gui;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
|
||||
@@ -264,7 +265,7 @@ public abstract class GuiScrollingList
|
||||
GL11.glDisable(GL11.GL_LIGHTING);
|
||||
GL11.glDisable(GL11.GL_FOG);
|
||||
Tessellator var18 = Tessellator.field_78398_a;
|
||||
this.client.field_71446_o.func_98187_b("/gui/background.png");
|
||||
this.client.field_71446_o.func_110577_a(Gui.field_110325_k);
|
||||
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
float var17 = 32.0F;
|
||||
var18.func_78382_b();
|
||||
@@ -397,7 +398,7 @@ public abstract class GuiScrollingList
|
||||
private void overlayBackground(int p_22239_1_, int p_22239_2_, int p_22239_3_, int p_22239_4_)
|
||||
{
|
||||
Tessellator var5 = Tessellator.field_78398_a;
|
||||
this.client.field_71446_o.func_98187_b("/gui/background.png");
|
||||
this.client.field_71446_o.func_110577_a(Gui.field_110325_k);
|
||||
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
float var6 = 32.0F;
|
||||
var5.func_78382_b();
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package cpw.mods.fml.client;
|
||||
|
||||
import cpw.mods.fml.common.ModContainer;
|
||||
import cpw.mods.fml.common.toposort.ModSortingException;
|
||||
import cpw.mods.fml.common.toposort.ModSortingException.SortingExceptionData;
|
||||
import cpw.mods.fml.common.versioning.ArtifactVersion;
|
||||
import cpw.mods.fml.common.versioning.DefaultArtifactVersion;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
|
||||
public class GuiSortingProblem extends GuiScreen {
|
||||
private ModSortingException modSorting;
|
||||
private SortingExceptionData<ModContainer> failedList;
|
||||
|
||||
public GuiSortingProblem(ModSortingException modSorting)
|
||||
{
|
||||
this.modSorting = modSorting;
|
||||
this.failedList = modSorting.getExceptionData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void func_73866_w_()
|
||||
{
|
||||
super.func_73866_w_();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void func_73863_a(int p_73863_1_, int p_73863_2_, float p_73863_3_)
|
||||
{
|
||||
this.func_73873_v_();
|
||||
int offset = Math.max(85 - (failedList.getVisitedNodes().size() + 3) * 10, 10);
|
||||
this.func_73732_a(this.field_73886_k, "Forge Mod Loader has found a problem with your minecraft installation", this.field_73880_f / 2, offset, 0xFFFFFF);
|
||||
offset+=10;
|
||||
this.func_73732_a(this.field_73886_k, "A mod sorting cycle was detected and loading cannot continue", this.field_73880_f / 2, offset, 0xFFFFFF);
|
||||
offset+=10;
|
||||
this.func_73732_a(this.field_73886_k, String.format("The first mod in the cycle is %s", failedList.getFirstBadNode()), this.field_73880_f / 2, offset, 0xFFFFFF);
|
||||
offset+=10;
|
||||
this.func_73732_a(this.field_73886_k, "The remainder of the cycle involves these mods", this.field_73880_f / 2, offset, 0xFFFFFF);
|
||||
offset+=5;
|
||||
for (ModContainer mc : failedList.getVisitedNodes())
|
||||
{
|
||||
offset+=10;
|
||||
this.func_73732_a(this.field_73886_k, String.format("%s : before: %s, after: %s", mc.toString(), mc.getDependants(), mc.getDependencies()), this.field_73880_f / 2, offset, 0xEEEEEE);
|
||||
}
|
||||
offset+=20;
|
||||
this.func_73732_a(this.field_73886_k, "The file 'ForgeModLoader-client-0.log' contains more information", this.field_73880_f / 2, offset, 0xFFFFFF);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Forge Mod Loader
|
||||
* Copyright (c) 2012-2013 cpw.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.client;
|
||||
|
||||
import java.awt.Dimension;
|
||||
|
||||
import net.minecraft.client.renderer.RenderEngine;
|
||||
import net.minecraft.client.texturepacks.ITexturePack;
|
||||
|
||||
public interface ITextureFX
|
||||
{
|
||||
public void onTexturePackChanged(RenderEngine engine, ITexturePack texturepack, Dimension dimensions);
|
||||
|
||||
public void onTextureDimensionsUpdate(int width, int height);
|
||||
|
||||
public void setErrored(boolean errored);
|
||||
|
||||
public boolean getErrored();
|
||||
}
|
||||
@@ -20,10 +20,14 @@ import java.util.Map;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.lwjgl.opengl.ContextCapabilities;
|
||||
import org.lwjgl.opengl.GLContext;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.RenderEngine;
|
||||
|
||||
public class TextureFXManager
|
||||
{
|
||||
@@ -34,24 +38,26 @@ public class TextureFXManager
|
||||
private Map<Integer,TextureHolder> texturesById = Maps.newHashMap();
|
||||
private Map<String, TextureHolder> texturesByName = Maps.newHashMap();
|
||||
|
||||
// private TextureHelper helper;
|
||||
|
||||
void setClient(Minecraft client)
|
||||
{
|
||||
this.client = client;
|
||||
}
|
||||
public BufferedImage loadImageFromTexturePack(RenderEngine renderEngine, String path) throws IOException
|
||||
{
|
||||
InputStream image=client.field_71418_C.func_77292_e().func_77532_a(path);
|
||||
if (image==null) {
|
||||
throw new RuntimeException(String.format("The requested image path %s is not found",path));
|
||||
}
|
||||
BufferedImage result=ImageIO.read(image);
|
||||
if (result==null)
|
||||
{
|
||||
throw new RuntimeException(String.format("The requested image path %s appears to be corrupted",path));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// public BufferedImage loadImageFromTexturePack(RenderEngine renderEngine, String path) throws IOException
|
||||
// {
|
||||
// InputStream image=client.field_71418_C.func_77292_e().func_77532_a(path);
|
||||
// if (image==null) {
|
||||
// throw new RuntimeException(String.format("The requested image path %s is not found",path));
|
||||
// }
|
||||
// BufferedImage result=ImageIO.read(image);
|
||||
// if (result==null)
|
||||
// {
|
||||
// throw new RuntimeException(String.format("The requested image path %s appears to be corrupted",path));
|
||||
// }
|
||||
// return result;
|
||||
// }
|
||||
//
|
||||
public static TextureFXManager instance()
|
||||
{
|
||||
return INSTANCE;
|
||||
@@ -102,4 +108,35 @@ public class TextureFXManager
|
||||
{
|
||||
return texturesByName.containsKey(texture) ? new Dimension(texturesByName.get(texture).x, texturesByName.get(texture).y) : new Dimension(1,1);
|
||||
}
|
||||
|
||||
|
||||
// public TextureHelper getHelper()
|
||||
// {
|
||||
// if (helper == null)
|
||||
// {
|
||||
// ContextCapabilities capabilities = GLContext.getCapabilities();
|
||||
// boolean has43 = false;
|
||||
// try
|
||||
// {
|
||||
// has43 = capabilities.getClass().getField("GL_ARB_copy_image").getBoolean(capabilities);
|
||||
// }
|
||||
// catch (Exception e)
|
||||
// {
|
||||
// //e.printStackTrace();
|
||||
// // NOOP - LWJGL needs updating
|
||||
// FMLLog.info("Forge Mod Loader has detected an older LWJGL version, new advanced texture animation features are disabled");
|
||||
// }
|
||||
//// if (has43 && Boolean.parseBoolean(System.getProperty("fml.useGL43","true")))
|
||||
//// {
|
||||
//// FMLLog.info("Using the new OpenGL 4.3 advanced capability for animations");
|
||||
//// helper = new OpenGL43TextureHelper();
|
||||
//// }
|
||||
//// else
|
||||
// {
|
||||
// FMLLog.info("Not using advanced OpenGL 4.3 advanced capability for animations : OpenGL 4.3 is %s", has43 ? "available" : "not available");
|
||||
//// helper = new CopySubimageTextureHelper();
|
||||
// }
|
||||
// }
|
||||
// return helper;
|
||||
// }
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -48,9 +48,8 @@ public class RenderingRegistry
|
||||
*/
|
||||
public static int addNewArmourRendererPrefix(String armor)
|
||||
{
|
||||
RenderPlayer.field_77110_j = ObjectArrays.concat(RenderPlayer.field_77110_j, armor);
|
||||
RenderBiped.field_82424_k = RenderPlayer.field_77110_j;
|
||||
return RenderPlayer.field_77110_j.length - 1;
|
||||
RenderBiped.field_82424_k = ObjectArrays.concat(RenderBiped.field_82424_k, armor);
|
||||
return RenderBiped.field_82424_k.length - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -330,6 +330,8 @@ public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseModPr
|
||||
}
|
||||
/**
|
||||
* Called client side to receive a custom payload for this mod
|
||||
*
|
||||
* NOTE: this method is not provided in Risugami's implementation of BaseMod!
|
||||
*
|
||||
* @param packet
|
||||
*/
|
||||
@@ -356,7 +358,9 @@ public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseModPr
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: this method is not provided in Risugami's implementation of BaseMod!
|
||||
*/
|
||||
@Override
|
||||
public void serverConnect(NetHandler handler) {
|
||||
|
||||
@@ -368,6 +372,9 @@ public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseModPr
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: this method is not provided in Risugami's implementation of BaseMod!
|
||||
*/
|
||||
@Override
|
||||
public void serverDisconnect() {
|
||||
|
||||
@@ -411,6 +418,8 @@ public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseModPr
|
||||
}
|
||||
/**
|
||||
* Called when a new client logs in.
|
||||
*
|
||||
* NOTE: this method is not provided in Risugami's implementation of BaseMod!
|
||||
*
|
||||
* @param player
|
||||
*/
|
||||
@@ -421,6 +430,8 @@ public abstract class BaseMod implements cpw.mods.fml.common.modloader.BaseModPr
|
||||
|
||||
/**
|
||||
* Called when a client logs out of the server.
|
||||
*
|
||||
* NOTE: this method is not provided in Risugami's implementation of BaseMod!
|
||||
*/
|
||||
@Override
|
||||
public void onClientLogout(INetworkManager mgr)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -19,8 +19,6 @@ import java.util.logging.Logger;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.client.renderer.RenderEngine;
|
||||
import net.minecraft.client.texturepacks.ITexturePack;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
|
||||
import cpw.mods.fml.client.TextureFXManager;
|
||||
@@ -70,4 +68,9 @@ public class FMLRenderAccessLibrary
|
||||
{
|
||||
return RenderingRegistry.instance().renderItemAsFull3DBlock(modelId);
|
||||
}
|
||||
|
||||
// public static void doTextureCopy(Texture atlas, Texture source, int targetX, int targetY)
|
||||
// {
|
||||
// TextureFXManager.instance().getHelper().doTextureCopy(atlas, source, targetX, targetY);
|
||||
// }
|
||||
}
|
||||
@@ -26,7 +26,6 @@ import net.minecraft.client.*;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
import net.minecraft.client.multiplayer.NetClientHandler;
|
||||
import net.minecraft.client.renderer.RenderBlocks;
|
||||
import net.minecraft.client.renderer.RenderEngine;
|
||||
import net.minecraft.client.renderer.entity.Render;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
||||
import net.minecraft.client.settings.KeyBinding;
|
||||
@@ -541,7 +540,7 @@ public class ModLoader
|
||||
@SideOnly(CLIENT)
|
||||
public static boolean isGUIOpen(Class<? extends GuiScreen> gui)
|
||||
{
|
||||
return FMLClientHandler.instance().getClient().field_71462_r != null && FMLClientHandler.instance().getClient().field_71462_r.equals(gui);
|
||||
return FMLClientHandler.instance().isGUIOpen(gui);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -564,11 +563,11 @@ public class ModLoader
|
||||
{
|
||||
}
|
||||
|
||||
@SideOnly(CLIENT)
|
||||
public static BufferedImage loadImage(RenderEngine renderEngine, String path) throws Exception
|
||||
{
|
||||
return TextureFXManager.instance().loadImageFromTexturePack(renderEngine, path);
|
||||
}
|
||||
// @SideOnly(CLIENT)
|
||||
// public static BufferedImage loadImage(RenderEngine renderEngine, String path) throws Exception
|
||||
// {
|
||||
// return TextureFXManager.instance().loadImageFromTexturePack(renderEngine, path);
|
||||
// }
|
||||
|
||||
/**
|
||||
* Call in from elsewhere. Unimplemented here.
|
||||
@@ -616,11 +615,11 @@ public class ModLoader
|
||||
return keys;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@SideOnly(CLIENT)
|
||||
public static void registerAllTextureOverrides(RenderEngine cache)
|
||||
{
|
||||
}
|
||||
// @Deprecated
|
||||
// @SideOnly(CLIENT)
|
||||
// public static void registerAllTextureOverrides(RenderEngine cache)
|
||||
// {
|
||||
// }
|
||||
|
||||
/**
|
||||
* Register a new block
|
||||
@@ -810,14 +809,12 @@ public class ModLoader
|
||||
@Deprecated
|
||||
public static void serverChat(String text)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@SideOnly(CLIENT)
|
||||
public static void serverLogin(NetClientHandler handler, Packet1Login loginPacket)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
public static void serverSendPacket(NetServerHandler handler, Packet packet)
|
||||
|
||||
+13
-95
@@ -1,24 +1,15 @@
|
||||
--- commands.py
|
||||
+++ commands.py
|
||||
@@ -58,6 +58,8 @@
|
||||
|
||||
|
||||
def reallyrmtree(path):
|
||||
+ if os.path.isfile(os.path.join(path, 'asm-4.1.tar.gz')): #Check if asm exists, indicating the libs folder, if so, don't delete it
|
||||
+ return
|
||||
if not sys.platform.startswith('win'):
|
||||
if os.path.exists(path):
|
||||
shutil.rmtree(path)
|
||||
@@ -139,6 +141,8 @@
|
||||
@@ -142,6 +142,8 @@
|
||||
fieldnames = csvreader.fieldnames
|
||||
return set(fieldnames)
|
||||
|
||||
+def commands_sanity_check():
|
||||
+ print 'Commands patch applied successfully'
|
||||
+ print ' Commands patch applied successfully'
|
||||
|
||||
class Commands(object):
|
||||
"""Contains the commands and initialisation for a full mcp run"""
|
||||
@@ -796,6 +800,8 @@
|
||||
@@ -980,6 +982,8 @@
|
||||
binlk = {CLIENT: self.binclient, SERVER: self.binserver}
|
||||
testlk = {CLIENT: self.testclient, SERVER: self.testserver}
|
||||
|
||||
@@ -27,17 +18,17 @@
|
||||
if not os.path.exists(os.path.join(binlk[side], os.path.normpath(testlk[side] + '.class'))):
|
||||
return False
|
||||
return True
|
||||
@@ -1037,6 +1043,9 @@
|
||||
@@ -1311,6 +1315,9 @@
|
||||
pathbinlk = {CLIENT: self.binclient, SERVER: self.binserver}
|
||||
pathsrclk = {CLIENT: self.srcclient, SERVER: self.srcserver}
|
||||
pathlog = {CLIENT: self.clientrecomplog, SERVER: self.serverrecomplog}
|
||||
|
||||
+
|
||||
+ if side == SERVER: #Warn about server because FML recombines it into client
|
||||
+ self.logger.info('Server side recompiling might be skipped, this is normal, do not complain to FML/Forge team about server side.')
|
||||
+
|
||||
|
||||
if not os.path.exists(pathbinlk[side]):
|
||||
os.makedirs(pathbinlk[side])
|
||||
|
||||
@@ -1070,7 +1079,7 @@
|
||||
@@ -1368,7 +1375,7 @@
|
||||
raise
|
||||
|
||||
def startserver(self):
|
||||
@@ -46,7 +37,7 @@
|
||||
classpath = [os.path.join('..', p) for p in classpath]
|
||||
classpath = os.pathsep.join(classpath)
|
||||
os.chdir(self.dirjars)
|
||||
@@ -1078,7 +1087,7 @@
|
||||
@@ -1376,7 +1383,7 @@
|
||||
self.runmc(forkcmd)
|
||||
|
||||
def startclient(self):
|
||||
@@ -55,47 +46,7 @@
|
||||
classpath = [os.path.join('..', p) for p in classpath]
|
||||
classpath = os.pathsep.join(classpath)
|
||||
natives = os.path.join('..', self.dirnatives)
|
||||
@@ -1205,20 +1214,20 @@
|
||||
with open(self.csvmethods, 'rb') as fh:
|
||||
methodsreader = csv.DictReader(fh)
|
||||
for row in methodsreader:
|
||||
- if int(row['side']) == side:
|
||||
+ if int(row['side']) == side or int(row['side']) == 2:
|
||||
if row['name'] != row['searge']:
|
||||
names['methods'][row['searge']] = row['name']
|
||||
with open(self.csvfields, 'rb') as fh:
|
||||
fieldsreader = csv.DictReader(fh)
|
||||
for row in fieldsreader:
|
||||
- if int(row['side']) == side:
|
||||
+ if int(row['side']) == side or int(row['side']) == 2:
|
||||
if row['name'] != row['searge']:
|
||||
names['fields'][row['searge']] = row['name']
|
||||
if self.has_param_csv:
|
||||
with open(self.csvparams, 'rb') as fh:
|
||||
paramsreader = csv.DictReader(fh)
|
||||
for row in paramsreader:
|
||||
- if int(row['side']) == side:
|
||||
+ if int(row['side']) == side or int(row['side']) == 2:
|
||||
names['params'][row['param']] = row['name']
|
||||
|
||||
regexps = {
|
||||
@@ -1352,13 +1361,13 @@
|
||||
methods = {}
|
||||
for row in methodsreader:
|
||||
#HINT: Only include methods that have a non-empty description
|
||||
- if int(row['side']) == side and row['desc']:
|
||||
+ if (int(row['side']) == side or int(row['side']) == 2) and row['desc']:
|
||||
methods[row['searge']] = row['desc'].replace('*/', '* /')
|
||||
|
||||
fields = {}
|
||||
for row in fieldsreader:
|
||||
#HINT: Only include fields that have a non-empty description
|
||||
- if int(row['side']) == side and row['desc']:
|
||||
+ if (int(row['side']) == side or int(row['side']) == 2) and row['desc']:
|
||||
fields[row['searge']] = row['desc'].replace('*/', '* /')
|
||||
|
||||
regexps = {
|
||||
@@ -1435,7 +1444,7 @@
|
||||
@@ -1733,7 +1740,7 @@
|
||||
self.runcmd(forkcmd)
|
||||
return True
|
||||
|
||||
@@ -104,7 +55,7 @@
|
||||
if not reobf:
|
||||
md5lk = {CLIENT: self.md5client, SERVER: self.md5server}
|
||||
else:
|
||||
@@ -1450,6 +1459,9 @@
|
||||
@@ -1748,6 +1755,9 @@
|
||||
class_path = ''
|
||||
else:
|
||||
class_path += '/'
|
||||
@@ -114,40 +65,7 @@
|
||||
for class_file in fnmatch.filter(filelist, '*.class'):
|
||||
class_name = class_path + os.path.splitext(class_file)[0]
|
||||
bin_file = os.path.normpath(os.path.join(path, class_file))
|
||||
@@ -1546,6 +1558,8 @@
|
||||
if not os.path.exists(outpathlk[side]):
|
||||
os.makedirs(outpathlk[side])
|
||||
|
||||
+ reserved = ['CON', 'PRN', 'AUX', 'NUL', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9']
|
||||
+
|
||||
# HINT: We extract the modified class files
|
||||
with closing(zipfile.ZipFile(jarlk[side])) as zipjar:
|
||||
for in_class in trgclasses:
|
||||
@@ -1559,6 +1573,23 @@
|
||||
out_class = out_class.replace(self.nullpkg, '')
|
||||
if out_class[0] == '/':
|
||||
out_class = out_class[1:]
|
||||
+
|
||||
+ rename = False
|
||||
+ for res in reserved:
|
||||
+ if out_class.upper().startswith(res):
|
||||
+ rename = True
|
||||
+ break
|
||||
+
|
||||
+ if rename:
|
||||
+ try:
|
||||
+ f = open(os.path.join(outpathlk[side], '_' + out_class), 'wb')
|
||||
+ f.write(zipjar.read(out_class))
|
||||
+ f.close()
|
||||
+ self.logger.info('> Outputted %s to %s as %s', in_class.ljust(35), outpathlk[side], '_' + out_class)
|
||||
+ except IOError:
|
||||
+ self.logger.error('* File %s failed extracting for %s', out_class, in_class)
|
||||
+ continue
|
||||
+
|
||||
try:
|
||||
zipjar.extract(out_class, outpathlk[side])
|
||||
self.logger.info('> Outputted %s to %s as %s', in_class.ljust(35), outpathlk[side], out_class)
|
||||
@@ -1605,6 +1636,9 @@
|
||||
@@ -1920,6 +1930,9 @@
|
||||
sys.exit(1)
|
||||
|
||||
for entry in newfiles:
|
||||
@@ -157,7 +75,7 @@
|
||||
if entry[3] == 'U':
|
||||
self.logger.info('Retrieving file from server : %s', entry[0])
|
||||
cur_file = os.path.normpath(entry[0])
|
||||
@@ -1625,6 +1659,9 @@
|
||||
@@ -1940,6 +1953,9 @@
|
||||
md5reoblk = {CLIENT: self.md5reobfclient, SERVER: self.md5reobfserver}
|
||||
outpathlk = {CLIENT: self.srcmodclient, SERVER: self.srcmodserver}
|
||||
src = {CLIENT: self.srcclient, SERVER: self.srcserver}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -16,6 +16,7 @@ import java.io.File;
|
||||
import java.security.cert.Certificate;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.common.eventbus.EventBus;
|
||||
@@ -28,12 +29,17 @@ public class DummyModContainer implements ModContainer
|
||||
{
|
||||
private ModMetadata md;
|
||||
private ArtifactVersion processedVersion;
|
||||
private String label;
|
||||
|
||||
public DummyModContainer(ModMetadata md)
|
||||
{
|
||||
this.md = md;
|
||||
}
|
||||
|
||||
public DummyModContainer(String label)
|
||||
{
|
||||
this.label = label;
|
||||
}
|
||||
public DummyModContainer()
|
||||
{
|
||||
}
|
||||
@@ -157,4 +163,16 @@ public class DummyModContainer implements ModContainer
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return md != null ? getModId() : "Dummy Container ("+label+") @" + System.identityHashCode(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getCustomModProperties()
|
||||
{
|
||||
return EMPTY_PROPERTIES;
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -38,6 +38,7 @@ import net.minecraft.world.World;
|
||||
import net.minecraft.world.storage.SaveHandler;
|
||||
import net.minecraft.world.storage.WorldInfo;
|
||||
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
@@ -115,7 +116,7 @@ public class FMLCommonHandler
|
||||
for (IScheduledTickHandler ticker : scheduledTicks)
|
||||
{
|
||||
EnumSet<TickType> ticksToRun = EnumSet.copyOf(Objects.firstNonNull(ticker.ticks(), EnumSet.noneOf(TickType.class)));
|
||||
ticksToRun.removeAll(EnumSet.complementOf(ticks));
|
||||
ticksToRun.retainAll(ticks);
|
||||
if (!ticksToRun.isEmpty())
|
||||
{
|
||||
ticker.tickStart(ticksToRun, data);
|
||||
@@ -134,7 +135,7 @@ public class FMLCommonHandler
|
||||
for (IScheduledTickHandler ticker : scheduledTicks)
|
||||
{
|
||||
EnumSet<TickType> ticksToRun = EnumSet.copyOf(Objects.firstNonNull(ticker.ticks(), EnumSet.noneOf(TickType.class)));
|
||||
ticksToRun.removeAll(EnumSet.complementOf(ticks));
|
||||
ticksToRun.retainAll(ticks);
|
||||
if (!ticksToRun.isEmpty())
|
||||
{
|
||||
ticker.tickEnd(ticksToRun, data);
|
||||
@@ -244,12 +245,9 @@ public class FMLCommonHandler
|
||||
{
|
||||
brd.addAll(sidedDelegate.getAdditionalBrandingInformation());
|
||||
}
|
||||
try {
|
||||
Properties props=new Properties();
|
||||
props.load(getClass().getClassLoader().getResourceAsStream("fmlbranding.properties"));
|
||||
brd.add(props.getProperty("fmlbranding"));
|
||||
} catch (Exception ex) {
|
||||
// Ignore - no branding file found
|
||||
if (Loader.instance().getFMLBrandingProperties().containsKey("fmlbranding"))
|
||||
{
|
||||
brd.add(Loader.instance().getFMLBrandingProperties().get("fmlbranding"));
|
||||
}
|
||||
int tModCount = Loader.instance().getModList().size();
|
||||
int aModCount = Loader.instance().getActiveModList().size();
|
||||
@@ -467,6 +465,25 @@ public class FMLCommonHandler
|
||||
|
||||
public void handleServerStopped()
|
||||
{
|
||||
MinecraftServer server = getMinecraftServerInstance();
|
||||
Loader.instance().serverStopped();
|
||||
// FORCE the internal server to stop: hello optifine workaround!
|
||||
ObfuscationReflectionHelper.setPrivateValue(MinecraftServer.class, server, false, "field_71316_v", "u", "serverStopped");
|
||||
}
|
||||
|
||||
public String getModName()
|
||||
{
|
||||
List<String> modNames = Lists.newArrayListWithExpectedSize(3);
|
||||
modNames.add("fml");
|
||||
if (!noForge)
|
||||
{
|
||||
modNames.add("forge");
|
||||
}
|
||||
|
||||
if (Loader.instance().getFMLBrandingProperties().containsKey("snooperbranding"))
|
||||
{
|
||||
modNames.add(Loader.instance().getFMLBrandingProperties().get("snooperbranding"));
|
||||
}
|
||||
return Joiner.on(',').join(modNames);
|
||||
}
|
||||
}
|
||||
@@ -38,8 +38,10 @@ import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.ImmutableBiMap;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableList.Builder;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Iterators;
|
||||
import com.google.common.collect.ListMultimap;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Multimap;
|
||||
import com.google.common.collect.SetMultimap;
|
||||
@@ -47,6 +49,7 @@ import com.google.common.collect.Sets;
|
||||
import com.google.common.eventbus.EventBus;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
|
||||
import cpw.mods.fml.common.Mod.CustomProperty;
|
||||
import cpw.mods.fml.common.Mod.Instance;
|
||||
import cpw.mods.fml.common.Mod.Metadata;
|
||||
import cpw.mods.fml.common.discovery.ASMDataTable;
|
||||
@@ -83,7 +86,6 @@ public class FMLModContainer implements ModContainer
|
||||
private boolean overridesMetadata;
|
||||
private EventBus eventBus;
|
||||
private LoadController controller;
|
||||
private Multimap<Class<? extends Annotation>, Object> annotations;
|
||||
private DefaultArtifactVersion processedVersion;
|
||||
private boolean isNetworkMod;
|
||||
|
||||
@@ -107,35 +109,17 @@ public class FMLModContainer implements ModContainer
|
||||
private Certificate certificate;
|
||||
private String modLanguage;
|
||||
private ILanguageAdapter languageAdapter;
|
||||
private ListMultimap<Class<? extends FMLEvent>,Method> eventMethods;
|
||||
private Map<String, String> customModProperties;
|
||||
|
||||
public static interface ILanguageAdapter {
|
||||
public Object getNewInstance(FMLModContainer container, Class<?> objectClass, ClassLoader classLoader) throws Exception;
|
||||
}
|
||||
|
||||
public static class ScalaAdapter implements ILanguageAdapter {
|
||||
@Override
|
||||
public Object getNewInstance(FMLModContainer container, Class<?> scalaObjectClass, ClassLoader classLoader) throws Exception
|
||||
{
|
||||
System.out.println("Scala class : "+ scalaObjectClass);
|
||||
Class<?> sObjectClass = Class.forName(scalaObjectClass.getName()+"$",true,classLoader);
|
||||
return sObjectClass.getField("MODULE$").get(null);
|
||||
}
|
||||
}
|
||||
|
||||
public static class JavaAdapter implements ILanguageAdapter {
|
||||
@Override
|
||||
public Object getNewInstance(FMLModContainer container, Class<?> objectClass, ClassLoader classLoader) throws Exception
|
||||
{
|
||||
return objectClass.newInstance();
|
||||
}
|
||||
}
|
||||
public FMLModContainer(String className, File modSource, Map<String,Object> modDescriptor)
|
||||
{
|
||||
this.className = className;
|
||||
this.source = modSource;
|
||||
this.descriptor = modDescriptor;
|
||||
this.modLanguage = (String) modDescriptor.get("modLanguage");
|
||||
this.languageAdapter = "scala".equals(modLanguage) ? new ScalaAdapter() : new JavaAdapter();
|
||||
this.languageAdapter = "scala".equals(modLanguage) ? new ILanguageAdapter.ScalaAdapter() : new ILanguageAdapter.JavaAdapter();
|
||||
this.eventMethods = ArrayListMultimap.create();
|
||||
}
|
||||
|
||||
private ILanguageAdapter getLanguageAdapter()
|
||||
@@ -333,10 +317,9 @@ public class FMLModContainer implements ModContainer
|
||||
}
|
||||
}
|
||||
|
||||
private Multimap<Class<? extends Annotation>, Object> gatherAnnotations(Class<?> clazz) throws Exception
|
||||
private Method gatherAnnotations(Class<?> clazz) throws Exception
|
||||
{
|
||||
Multimap<Class<? extends Annotation>,Object> anns = ArrayListMultimap.create();
|
||||
|
||||
Method factoryMethod = null;
|
||||
for (Method m : clazz.getDeclaredMethods())
|
||||
{
|
||||
for (Annotation a : m.getAnnotations())
|
||||
@@ -344,20 +327,47 @@ public class FMLModContainer implements ModContainer
|
||||
if (modTypeAnnotations.containsKey(a.annotationType()))
|
||||
{
|
||||
Class<?>[] paramTypes = new Class[] { modTypeAnnotations.get(a.annotationType()) };
|
||||
|
||||
if (Arrays.equals(m.getParameterTypes(), paramTypes))
|
||||
{
|
||||
m.setAccessible(true);
|
||||
anns.put(a.annotationType(), m);
|
||||
eventMethods.put(modTypeAnnotations.get(a.annotationType()), m);
|
||||
}
|
||||
else
|
||||
{
|
||||
FMLLog.log(getModId(), Level.SEVERE,"The mod %s appears to have an invalid method annotation %s. This annotation can only apply to methods with argument types %s -it will not be called", getModId(), a.annotationType().getSimpleName(), Arrays.toString(paramTypes));
|
||||
}
|
||||
}
|
||||
else if (a.annotationType().equals(Mod.EventHandler.class))
|
||||
{
|
||||
if (m.getParameterTypes().length == 1 && modAnnotationTypes.containsKey(m.getParameterTypes()[0]))
|
||||
{
|
||||
m.setAccessible(true);
|
||||
eventMethods.put((Class<? extends FMLEvent>) m.getParameterTypes()[1],m);
|
||||
}
|
||||
else
|
||||
{
|
||||
FMLLog.log(getModId(), Level.SEVERE,"The mod %s appears to have an invalid event annotation %s. This annotation can only apply to methods with recognized event arguments - it will not be called", getModId(), a.annotationType().getSimpleName());
|
||||
}
|
||||
}
|
||||
else if (a.annotationType().equals(Mod.InstanceFactory.class))
|
||||
{
|
||||
if (Modifier.isStatic(m.getModifiers()) && m.getParameterTypes().length == 0 && factoryMethod == null)
|
||||
{
|
||||
m.setAccessible(true);
|
||||
factoryMethod = m;
|
||||
}
|
||||
else if (!(Modifier.isStatic(m.getModifiers()) && m.getParameterTypes().length == 0))
|
||||
{
|
||||
FMLLog.log(getModId(), Level.SEVERE, "The InstanceFactory annotation can only apply to a static method, taking zero arguments - it will be ignored on %s(%s)", m.getName(), Arrays.asList(m.getParameterTypes()));
|
||||
}
|
||||
else if (factoryMethod != null)
|
||||
{
|
||||
FMLLog.log(getModId(), Level.SEVERE, "The InstanceFactory annotation can only be used once, the application to %s(%s) will be ignored", m.getName(), Arrays.asList(m.getParameterTypes()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return anns;
|
||||
return factoryMethod;
|
||||
}
|
||||
|
||||
private void processFieldAnnotations(ASMDataTable asmDataTable) throws Exception
|
||||
@@ -482,14 +492,30 @@ public class FMLModContainer implements ModContainer
|
||||
}
|
||||
}
|
||||
|
||||
annotations = gatherAnnotations(clazz);
|
||||
CustomProperty[] props = (CustomProperty[]) descriptor.get("customProperties");
|
||||
if (props!=null && props.length > 0)
|
||||
{
|
||||
com.google.common.collect.ImmutableMap.Builder<String, String> builder = ImmutableMap.<String,String>builder();
|
||||
for (CustomProperty p : props)
|
||||
{
|
||||
builder.put(p.k(),p.v());
|
||||
}
|
||||
customModProperties = builder.build();
|
||||
}
|
||||
else
|
||||
{
|
||||
customModProperties = EMPTY_PROPERTIES;
|
||||
}
|
||||
|
||||
|
||||
Method factoryMethod = gatherAnnotations(clazz);
|
||||
isNetworkMod = FMLNetworkHandler.instance().registerNetworkMod(this, clazz, event.getASMHarvestedData());
|
||||
modInstance = getLanguageAdapter().getNewInstance(this,clazz, modClassLoader);
|
||||
modInstance = getLanguageAdapter().getNewInstance(this,clazz, modClassLoader, factoryMethod);
|
||||
if (fingerprintNotPresent)
|
||||
{
|
||||
eventBus.post(new FMLFingerprintViolationEvent(source.isDirectory(), source, ImmutableSet.copyOf(this.sourceFingerprints), expectedFingerprint));
|
||||
}
|
||||
ProxyInjector.inject(this, event.getASMHarvestedData(), FMLCommonHandler.instance().getSide());
|
||||
ProxyInjector.inject(this, event.getASMHarvestedData(), FMLCommonHandler.instance().getSide(), getLanguageAdapter());
|
||||
processFieldAnnotations(event.getASMHarvestedData());
|
||||
}
|
||||
catch (Throwable e)
|
||||
@@ -502,23 +528,20 @@ public class FMLModContainer implements ModContainer
|
||||
@Subscribe
|
||||
public void handleModStateEvent(FMLEvent event)
|
||||
{
|
||||
Class<? extends Annotation> annotation = modAnnotationTypes.get(event.getClass());
|
||||
if (annotation == null)
|
||||
if (!eventMethods.containsKey(event.getClass()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
for (Object o : annotations.get(annotation))
|
||||
for (Method m : eventMethods.get(event.getClass()))
|
||||
{
|
||||
Method m = (Method) o;
|
||||
m.invoke(modInstance, event);
|
||||
}
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
controller.errorOccurred(this, t);
|
||||
Throwables.propagateIfPossible(t);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -560,4 +583,16 @@ public class FMLModContainer implements ModContainer
|
||||
{
|
||||
return certificate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "FMLMod:"+getModId()+"{"+getVersion()+"}";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getCustomModProperties()
|
||||
{
|
||||
return customModProperties;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,197 @@
|
||||
package cpw.mods.fml.common;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import cpw.mods.fml.common.Mod.Instance;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
|
||||
public interface ILanguageAdapter {
|
||||
public Object getNewInstance(FMLModContainer container, Class<?> objectClass, ClassLoader classLoader, Method factoryMarkedAnnotation) throws Exception;
|
||||
public boolean supportsStatics();
|
||||
public void setProxy(Field target, Class<?> proxyTarget, Object proxy) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException;
|
||||
public void setInternalProxies(ModContainer mod, Side side, ClassLoader loader);
|
||||
|
||||
public static class ScalaAdapter implements ILanguageAdapter {
|
||||
@Override
|
||||
public Object getNewInstance(FMLModContainer container, Class<?> scalaObjectClass, ClassLoader classLoader, Method factoryMarkedAnnotation) throws Exception
|
||||
{
|
||||
Class<?> sObjectClass = Class.forName(scalaObjectClass.getName()+"$",true,classLoader);
|
||||
return sObjectClass.getField("MODULE$").get(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsStatics()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProxy(Field target, Class<?> proxyTarget, Object proxy) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException
|
||||
{
|
||||
try
|
||||
{
|
||||
// Get the actual singleton class. The two variants are from
|
||||
// whether the @SidedProxy is declared in a the class block
|
||||
// of the object directly, or in the object block, i.e.
|
||||
// whether it's:
|
||||
// class ModName {
|
||||
// @SidedProxy ...
|
||||
// }
|
||||
// object ModName extends ModName {}
|
||||
// which leads to us getting the outer class, or
|
||||
// object ModName {
|
||||
// @SidedProxy ...
|
||||
// }
|
||||
// which leads to us getting the inner class.
|
||||
if (!proxyTarget.getName().endsWith("$"))
|
||||
{
|
||||
// Get internal class generated by Scala.
|
||||
proxyTarget = Class.forName(proxyTarget.getName() + "$", true, proxyTarget.getClassLoader());
|
||||
}
|
||||
}
|
||||
catch (ClassNotFoundException e)
|
||||
{
|
||||
// Not a singleton, look for @Instance field as a fallback.
|
||||
FMLLog.log(Level.INFO, e, "An error occured trying to load a proxy into %s.%s. Did you declare your mod as 'class' instead of 'object'?", proxyTarget.getSimpleName(), target.getName());
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the instance via the MODULE$ field which is
|
||||
// automatically generated by the Scala compiler for
|
||||
// singletons.
|
||||
Object targetInstance = proxyTarget.getField("MODULE$").get(null);
|
||||
|
||||
try
|
||||
{
|
||||
// Find setter function. We do it this way because we can't
|
||||
// necessarily use proxyTarget.getMethod(proxy.getClass()), as
|
||||
// it might be a subclass and not the exact parameter type.
|
||||
// All fields are private in Scala, wrapped by a getter and
|
||||
// setter named <fieldname> and <fieldname>_$eq. To those
|
||||
// familiar with scala.reflect.BeanProperty: these will always
|
||||
// be there, set<Fieldname> and get<Fieldname> will always
|
||||
// only be generated *additionally*.
|
||||
final String setterName = target.getName() + "_$eq";
|
||||
for (Method setter : proxyTarget.getMethods())
|
||||
{
|
||||
Class<?>[] setterParameters = setter.getParameterTypes();
|
||||
if (setterName.equals(setter.getName()) &&
|
||||
// Some more validation.
|
||||
setterParameters.length == 1 &&
|
||||
setterParameters[0].isAssignableFrom(proxy.getClass()))
|
||||
{
|
||||
// Here goes nothing...
|
||||
setter.invoke(targetInstance, proxy);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (InvocationTargetException e)
|
||||
{
|
||||
FMLLog.log(Level.SEVERE, e, "An error occured trying to load a proxy into %s.%s", proxyTarget.getSimpleName(), target.getName());
|
||||
throw new LoaderException(e);
|
||||
}
|
||||
|
||||
// If we come here we could not find a setter for this proxy.
|
||||
FMLLog.severe("Failed loading proxy into %s.%s, could not find setter function. Did you declare the field with 'val' instead of 'var'?", proxyTarget.getSimpleName(), target.getName());
|
||||
throw new LoaderException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInternalProxies(ModContainer mod, Side side, ClassLoader loader)
|
||||
{
|
||||
// For Scala mods, we want to enable authors to write them like so:
|
||||
// object ModName {
|
||||
// @SidedProxy(...)
|
||||
// var proxy: ModProxy = null
|
||||
// }
|
||||
// For this to work, we have to search inside the inner class Scala
|
||||
// generates for singletons, which is in called ModName$. These are
|
||||
// not automatically handled, because the mod discovery code ignores
|
||||
// internal classes.
|
||||
// Note that it is alternatively possible to write this like so:
|
||||
// class ModName {
|
||||
// @SidedProxy(...)
|
||||
// var proxy: ModProxy = null
|
||||
// }
|
||||
// object ModName extends ModName { ... }
|
||||
// which will fall back to the normal injection code which calls
|
||||
// setProxy in turn.
|
||||
|
||||
// Get the actual mod implementation, which will be the inner class
|
||||
// if we have a singleton.
|
||||
Class<?> proxyTarget = mod.getMod().getClass();
|
||||
if (proxyTarget.getName().endsWith("$"))
|
||||
{
|
||||
// So we have a singleton class, check if there are targets.
|
||||
for (Field target : proxyTarget.getDeclaredFields())
|
||||
{
|
||||
// This will not turn up anything if the alternative
|
||||
// approach was taken (manually declaring the class).
|
||||
// So we don't initialize the field twice.
|
||||
if (target.getAnnotation(SidedProxy.class) != null)
|
||||
{
|
||||
String targetType = side.isClient() ? target.getAnnotation(SidedProxy.class).clientSide() : target.getAnnotation(SidedProxy.class).serverSide();
|
||||
try
|
||||
{
|
||||
Object proxy = Class.forName(targetType, true, loader).newInstance();
|
||||
|
||||
if (!target.getType().isAssignableFrom(proxy.getClass()))
|
||||
{
|
||||
FMLLog.severe("Attempted to load a proxy type %s into %s.%s, but the types don't match", targetType, proxyTarget.getSimpleName(), target.getName());
|
||||
throw new LoaderException();
|
||||
}
|
||||
|
||||
setProxy(target, proxyTarget, proxy);
|
||||
}
|
||||
catch (Exception e) {
|
||||
FMLLog.log(Level.SEVERE, e, "An error occured trying to load a proxy into %s.%s", proxyTarget.getSimpleName(), target.getName());
|
||||
throw new LoaderException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FMLLog.finer("Mod does not appear to be a singleton.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class JavaAdapter implements ILanguageAdapter {
|
||||
@Override
|
||||
public Object getNewInstance(FMLModContainer container, Class<?> objectClass, ClassLoader classLoader, Method factoryMarkedMethod) throws Exception
|
||||
{
|
||||
if (factoryMarkedMethod != null)
|
||||
{
|
||||
return factoryMarkedMethod.invoke(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
return objectClass.newInstance();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean supportsStatics()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProxy(Field target, Class<?> proxyTarget, Object proxy) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException,
|
||||
SecurityException
|
||||
{
|
||||
target.set(null, proxy);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInternalProxies(ModContainer mod, Side side, ClassLoader loader)
|
||||
{
|
||||
// Nothing to do here.
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -15,6 +15,7 @@ package cpw.mods.fml.common;
|
||||
import java.io.File;
|
||||
import java.security.cert.Certificate;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.common.eventbus.EventBus;
|
||||
@@ -25,7 +26,7 @@ import cpw.mods.fml.common.versioning.VersionRange;
|
||||
public class InjectedModContainer implements ModContainer
|
||||
{
|
||||
private File source;
|
||||
private ModContainer wrappedContainer;
|
||||
public final ModContainer wrappedContainer;
|
||||
|
||||
public InjectedModContainer(ModContainer mc, File source)
|
||||
{
|
||||
@@ -148,4 +149,16 @@ public class InjectedModContainer implements ModContainer
|
||||
{
|
||||
return wrappedContainer.getSigningCertificate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Wrapped{"+wrappedContainer.toString()+"}";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getCustomModProperties()
|
||||
{
|
||||
return wrappedContainer.getCustomModProperties();
|
||||
}
|
||||
}
|
||||
@@ -13,15 +13,18 @@
|
||||
package cpw.mods.fml.common;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.google.common.base.Functions;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.Collections2;
|
||||
import com.google.common.collect.ImmutableBiMap;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableMap.Builder;
|
||||
@@ -36,6 +39,8 @@ import cpw.mods.fml.common.event.FMLEvent;
|
||||
import cpw.mods.fml.common.event.FMLLoadEvent;
|
||||
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
|
||||
import cpw.mods.fml.common.event.FMLStateEvent;
|
||||
import cpw.mods.fml.common.functions.ArtifactVersionNameFunction;
|
||||
import cpw.mods.fml.common.versioning.ArtifactVersion;
|
||||
|
||||
public class LoadController
|
||||
{
|
||||
@@ -99,11 +104,11 @@ public class LoadController
|
||||
}
|
||||
}
|
||||
|
||||
public void transition(LoaderState desiredState)
|
||||
public void transition(LoaderState desiredState, boolean forceState)
|
||||
{
|
||||
LoaderState oldState = state;
|
||||
state = state.transition(!errors.isEmpty());
|
||||
if (state != desiredState)
|
||||
if (state != desiredState && !forceState)
|
||||
{
|
||||
Throwable toThrow = null;
|
||||
FMLLog.severe("Fatal errors were detected during the transition from %s to %s. Loading cannot continue", oldState, desiredState);
|
||||
@@ -142,6 +147,12 @@ public class LoadController
|
||||
throw new LoaderException(toThrow);
|
||||
}
|
||||
}
|
||||
else if (state != desiredState && forceState)
|
||||
{
|
||||
FMLLog.info("The state engine was in incorrect state %s and forced into state %s. Errors may have been discarded.", state, desiredState);
|
||||
forceState(desiredState);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public ModContainer activeContainer()
|
||||
@@ -158,23 +169,38 @@ public class LoadController
|
||||
}
|
||||
for (ModContainer mc : activeModList)
|
||||
{
|
||||
activeContainer = mc;
|
||||
String modId = mc.getModId();
|
||||
stateEvent.applyModContainer(activeContainer());
|
||||
FMLLog.log(modId, Level.FINEST, "Sending event %s to mod %s", stateEvent.getEventType(), modId);
|
||||
eventChannels.get(modId).post(stateEvent);
|
||||
FMLLog.log(modId, Level.FINEST, "Sent event %s to mod %s", stateEvent.getEventType(), modId);
|
||||
activeContainer = null;
|
||||
if (stateEvent instanceof FMLStateEvent)
|
||||
sendEventToModContainer(stateEvent, mc);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendEventToModContainer(FMLEvent stateEvent, ModContainer mc)
|
||||
{
|
||||
String modId = mc.getModId();
|
||||
Collection<String> requirements = Collections2.transform(mc.getRequirements(),new ArtifactVersionNameFunction());
|
||||
for (ArtifactVersion av : mc.getDependencies())
|
||||
{
|
||||
if (av.getLabel()!= null && requirements.contains(av.getLabel()) && modStates.containsEntry(av.getLabel(),ModState.ERRORED))
|
||||
{
|
||||
if (!errors.containsKey(modId))
|
||||
{
|
||||
modStates.put(modId, ((FMLStateEvent)stateEvent).getModState());
|
||||
}
|
||||
else
|
||||
{
|
||||
modStates.put(modId, ModState.ERRORED);
|
||||
}
|
||||
FMLLog.log(modId, Level.SEVERE, "Skipping event %s and marking errored mod %s since required dependency %s has errored", stateEvent.getEventType(), modId, av.getLabel());
|
||||
modStates.put(modId, ModState.ERRORED);
|
||||
return;
|
||||
}
|
||||
}
|
||||
activeContainer = mc;
|
||||
stateEvent.applyModContainer(activeContainer());
|
||||
FMLLog.log(modId, Level.FINEST, "Sending event %s to mod %s", stateEvent.getEventType(), modId);
|
||||
eventChannels.get(modId).post(stateEvent);
|
||||
FMLLog.log(modId, Level.FINEST, "Sent event %s to mod %s", stateEvent.getEventType(), modId);
|
||||
activeContainer = null;
|
||||
if (stateEvent instanceof FMLStateEvent)
|
||||
{
|
||||
if (!errors.containsKey(modId))
|
||||
{
|
||||
modStates.put(modId, ((FMLStateEvent)stateEvent).getModState());
|
||||
}
|
||||
else
|
||||
{
|
||||
modStates.put(modId, ModState.ERRORED);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -216,7 +242,7 @@ public class LoadController
|
||||
{
|
||||
for (ModContainer mc : loader.getModList())
|
||||
{
|
||||
ret.append("\n\t").append(mc.getModId()).append(" [").append(mc.getName()).append("] (").append(mc.getSource().getName()).append(") ");
|
||||
ret.append("\n\t").append(mc.getModId()).append("{").append(mc.getVersion()).append("} [").append(mc.getName()).append("] (").append(mc.getSource().getName()).append(") ");
|
||||
Joiner.on("->"). appendTo(ret, modStates.get(mc.getModId()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
package cpw.mods.fml.common;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
@@ -26,15 +27,20 @@ import java.util.concurrent.Callable;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import net.minecraft.crash.CallableMinecraftVersion;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import com.google.common.base.CharMatcher;
|
||||
import com.google.common.base.Charsets;
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Joiner.MapJoiner;
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableListMultimap;
|
||||
import com.google.common.collect.ImmutableListMultimap.Builder;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableMultiset;
|
||||
import com.google.common.collect.Iterables;
|
||||
@@ -47,17 +53,21 @@ import com.google.common.collect.Multiset.Entry;
|
||||
import com.google.common.collect.Multisets;
|
||||
import com.google.common.collect.Ordering;
|
||||
import com.google.common.collect.Sets.SetView;
|
||||
import com.google.common.collect.Table;
|
||||
import com.google.common.collect.TreeMultimap;
|
||||
import com.google.common.io.Files;
|
||||
|
||||
import cpw.mods.fml.common.LoaderState.ModState;
|
||||
import cpw.mods.fml.common.discovery.ModDiscoverer;
|
||||
import cpw.mods.fml.common.event.FMLInterModComms;
|
||||
import cpw.mods.fml.common.event.FMLLoadEvent;
|
||||
import cpw.mods.fml.common.functions.ArtifactVersionNameFunction;
|
||||
import cpw.mods.fml.common.functions.ModIdFunction;
|
||||
import cpw.mods.fml.common.modloader.BaseModProxy;
|
||||
import cpw.mods.fml.common.registry.GameData;
|
||||
import cpw.mods.fml.common.toposort.ModSorter;
|
||||
import cpw.mods.fml.common.toposort.ModSortingException;
|
||||
import cpw.mods.fml.common.toposort.ModSortingException.SortingExceptionData;
|
||||
import cpw.mods.fml.common.toposort.TopologicalSort;
|
||||
import cpw.mods.fml.common.versioning.ArtifactVersion;
|
||||
import cpw.mods.fml.common.versioning.VersionParser;
|
||||
@@ -144,6 +154,7 @@ public class Loader
|
||||
private static File minecraftDir;
|
||||
private static List<String> injectedContainers;
|
||||
private File loggingProperties;
|
||||
private ImmutableMap<String, String> fmlBrandingProperties;
|
||||
|
||||
public static Loader instance()
|
||||
{
|
||||
@@ -204,13 +215,7 @@ public class Loader
|
||||
FMLLog.severe("The mod %s does not wish to run in Minecraft version %s. You will have to remove it to play.", mod.getModId(), getMCVersionString());
|
||||
throw new WrongMinecraftVersionException(mod);
|
||||
}
|
||||
Map<String,ArtifactVersion> names = Maps.uniqueIndex(mod.getRequirements(), new Function<ArtifactVersion, String>()
|
||||
{
|
||||
public String apply(ArtifactVersion v)
|
||||
{
|
||||
return v.getLabel();
|
||||
}
|
||||
});
|
||||
Map<String,ArtifactVersion> names = Maps.uniqueIndex(mod.getRequirements(), new ArtifactVersionNameFunction());
|
||||
Set<ArtifactVersion> versionMissingMods = Sets.newHashSet();
|
||||
Set<String> missingMods = Sets.difference(names.keySet(), modVersions.keySet());
|
||||
if (!missingMods.isEmpty())
|
||||
@@ -260,10 +265,15 @@ public class Loader
|
||||
catch (ModSortingException sortException)
|
||||
{
|
||||
FMLLog.severe("A dependency cycle was detected in the input mod set so an ordering cannot be determined");
|
||||
FMLLog.severe("The visited mod list is %s", sortException.getExceptionData().getVisitedNodes());
|
||||
FMLLog.severe("The first mod in the cycle is %s", sortException.getExceptionData().getFirstBadNode());
|
||||
SortingExceptionData<ModContainer> exceptionData = sortException.getExceptionData();
|
||||
FMLLog.severe("The first mod in the cycle is %s", exceptionData.getFirstBadNode());
|
||||
FMLLog.severe("The mod cycle involves");
|
||||
for (ModContainer mc : exceptionData.getVisitedNodes())
|
||||
{
|
||||
FMLLog.severe("%s : before: %s, after: %s", mc.toString(), mc.getDependants(), mc.getDependencies());
|
||||
}
|
||||
FMLLog.log(Level.SEVERE, sortException, "The full error");
|
||||
throw new LoaderException(sortException);
|
||||
throw sortException;
|
||||
}
|
||||
}
|
||||
finally
|
||||
@@ -466,7 +476,7 @@ public class Loader
|
||||
mods = Lists.newArrayList();
|
||||
namedMods = Maps.newHashMap();
|
||||
modController = new LoadController(this);
|
||||
modController.transition(LoaderState.LOADING);
|
||||
modController.transition(LoaderState.LOADING, false);
|
||||
ModDiscoverer disc = identifyMods();
|
||||
disableRequestedMods();
|
||||
FMLLog.fine("Reloading logging properties from %s", loggingProperties.getPath());
|
||||
@@ -490,7 +500,7 @@ public class Loader
|
||||
}
|
||||
}
|
||||
}
|
||||
modController.transition(LoaderState.CONSTRUCTING);
|
||||
modController.transition(LoaderState.CONSTRUCTING, false);
|
||||
modController.distributeStateMessage(LoaderState.CONSTRUCTING, modClassLoader, disc.getASMTable());
|
||||
FMLLog.fine("Mod signature data");
|
||||
for (ModContainer mod : getActiveModList())
|
||||
@@ -501,9 +511,9 @@ public class Loader
|
||||
{
|
||||
FMLLog.fine("No user mod signature data found");
|
||||
}
|
||||
modController.transition(LoaderState.PREINITIALIZATION);
|
||||
modController.transition(LoaderState.PREINITIALIZATION, false);
|
||||
modController.distributeStateMessage(LoaderState.PREINITIALIZATION, disc.getASMTable(), canonicalConfigDir);
|
||||
modController.transition(LoaderState.INITIALIZATION);
|
||||
modController.transition(LoaderState.INITIALIZATION, false);
|
||||
}
|
||||
|
||||
private void disableRequestedMods()
|
||||
@@ -571,6 +581,11 @@ public class Loader
|
||||
|
||||
public String getCrashInformation()
|
||||
{
|
||||
// Handle being called before we've begun setup
|
||||
if (modController == null)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
StringBuilder ret = new StringBuilder();
|
||||
List<String> branding = FMLCommonHandler.instance().getBrandings();
|
||||
|
||||
@@ -674,13 +689,15 @@ public class Loader
|
||||
{
|
||||
// Mod controller should be in the initialization state here
|
||||
modController.distributeStateMessage(LoaderState.INITIALIZATION);
|
||||
modController.transition(LoaderState.POSTINITIALIZATION);
|
||||
modController.transition(LoaderState.POSTINITIALIZATION, false);
|
||||
// Construct the "mod object table" so mods can refer to it in IMC and postinit
|
||||
GameData.buildModObjectTable();
|
||||
modController.distributeStateMessage(FMLInterModComms.IMCEvent.class);
|
||||
modController.distributeStateMessage(LoaderState.POSTINITIALIZATION);
|
||||
modController.transition(LoaderState.AVAILABLE);
|
||||
modController.transition(LoaderState.AVAILABLE, false);
|
||||
modController.distributeStateMessage(LoaderState.AVAILABLE);
|
||||
// Dump the custom registry data map, if necessary
|
||||
GameData.dumpRegistry(minecraftDir);
|
||||
FMLLog.info("Forge Mod Loader has successfully loaded %d mod%s", mods.size(), mods.size()==1 ? "" : "s");
|
||||
}
|
||||
|
||||
@@ -721,7 +738,7 @@ public class Loader
|
||||
try
|
||||
{
|
||||
modController.distributeStateMessage(LoaderState.SERVER_STARTING, server);
|
||||
modController.transition(LoaderState.SERVER_STARTING);
|
||||
modController.transition(LoaderState.SERVER_STARTING, false);
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
@@ -734,13 +751,13 @@ public class Loader
|
||||
public void serverStarted()
|
||||
{
|
||||
modController.distributeStateMessage(LoaderState.SERVER_STARTED);
|
||||
modController.transition(LoaderState.SERVER_STARTED);
|
||||
modController.transition(LoaderState.SERVER_STARTED, false);
|
||||
}
|
||||
|
||||
public void serverStopping()
|
||||
{
|
||||
modController.distributeStateMessage(LoaderState.SERVER_STOPPING);
|
||||
modController.transition(LoaderState.SERVER_STOPPING);
|
||||
modController.transition(LoaderState.SERVER_STOPPING, false);
|
||||
}
|
||||
|
||||
public BiMap<ModContainer, Object> getModObjectList()
|
||||
@@ -779,16 +796,8 @@ public class Loader
|
||||
public void serverStopped()
|
||||
{
|
||||
modController.distributeStateMessage(LoaderState.SERVER_STOPPED);
|
||||
try
|
||||
{
|
||||
modController.transition(LoaderState.SERVER_STOPPED);
|
||||
}
|
||||
catch (LoaderException e)
|
||||
{
|
||||
modController.forceState(LoaderState.SERVER_STOPPED);
|
||||
// Discard any exceptions here - they mask other, real, exceptions
|
||||
}
|
||||
modController.transition(LoaderState.AVAILABLE);
|
||||
modController.transition(LoaderState.SERVER_STOPPED, true);
|
||||
modController.transition(LoaderState.AVAILABLE, true);
|
||||
}
|
||||
|
||||
public boolean serverAboutToStart(Object server)
|
||||
@@ -796,7 +805,7 @@ public class Loader
|
||||
try
|
||||
{
|
||||
modController.distributeStateMessage(LoaderState.SERVER_ABOUT_TO_START, server);
|
||||
modController.transition(LoaderState.SERVER_ABOUT_TO_START);
|
||||
modController.transition(LoaderState.SERVER_ABOUT_TO_START, false);
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
@@ -805,4 +814,28 @@ public class Loader
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public Map<String,String> getFMLBrandingProperties()
|
||||
{
|
||||
if (fmlBrandingProperties == null)
|
||||
{
|
||||
Properties loaded = new Properties();
|
||||
try
|
||||
{
|
||||
loaded.load(getClass().getClassLoader().getResourceAsStream("fmlbranding.properties"));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// File not found - ignore
|
||||
}
|
||||
fmlBrandingProperties = Maps.fromProperties(loaded);
|
||||
}
|
||||
return fmlBrandingProperties;
|
||||
}
|
||||
|
||||
|
||||
public Map<String,String> getCustomModProperties(String modId)
|
||||
{
|
||||
return getIndexedModList().get(modId).getCustomModProperties();
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -18,12 +18,57 @@ import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.network.packet.Packet250CustomPayload;
|
||||
|
||||
import cpw.mods.fml.common.event.FMLFingerprintViolationEvent;
|
||||
import cpw.mods.fml.common.event.FMLInitializationEvent;
|
||||
import cpw.mods.fml.common.event.FMLInterModComms;
|
||||
import cpw.mods.fml.common.event.FMLInterModComms.IMCEvent;
|
||||
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
|
||||
import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage;
|
||||
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
|
||||
import cpw.mods.fml.common.event.FMLServerAboutToStartEvent;
|
||||
import cpw.mods.fml.common.event.FMLServerStartedEvent;
|
||||
import cpw.mods.fml.common.event.FMLServerStartingEvent;
|
||||
import cpw.mods.fml.common.event.FMLServerStoppedEvent;
|
||||
import cpw.mods.fml.common.event.FMLServerStoppingEvent;
|
||||
import cpw.mods.fml.common.event.FMLStateEvent;
|
||||
import cpw.mods.fml.common.network.IPacketHandler;
|
||||
import cpw.mods.fml.common.network.NetworkMod;
|
||||
import cpw.mods.fml.common.registry.GameRegistry;
|
||||
|
||||
/**
|
||||
* The new mod style in FML 1.3
|
||||
* This defines a Mod to FML.
|
||||
* Any class found with this annotation applied will be loaded as a Mod. The instance that is loaded will
|
||||
* represent the mod to other Mods in the system. It will be sent various subclasses of {@link FMLEvent}
|
||||
* at pre-defined times during the loading of the game, based on where you have applied the {@link EventHandler}
|
||||
* annotation.
|
||||
*
|
||||
* This annotation is usually paired with a second annotation {@link NetworkMod}, which declares the
|
||||
* network related properties of this mod.
|
||||
*
|
||||
* <p>This is a simple example of a Mod. It has the modId of "MyModId", the name of "My example mod", it is
|
||||
* version 1.0, and depends on FML being loaded. It has the {@link NetworkMod} annotation as well, declaring it uses channel
|
||||
* "MyModChannel" and {@link IPacketHandler} class PacketHandler.
|
||||
* <pre>{@code
|
||||
* package mymod;
|
||||
* // Declare that this is a mod with modId "MyModId", name "My example mod", version "1.0" and dependency on FML.
|
||||
* {@literal @}Mod(modId="MyModId",name="My example mod",version="1.0",dependencies="required-after:FML")
|
||||
* // Declare that this is a network mod using the {@link Packet250CustomPayload} channel "MyModChannel", required on the client if it's present
|
||||
* // on the server, with {@link IPacketHandler} class PacketHandler.
|
||||
* {@literal @}NetworkMod(channels = { "MyModChannel" }, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketHandler.class)
|
||||
* public class MyMod {
|
||||
* // Populate this field with the instance of the mod created by FML
|
||||
* {@literal @}Instance("MyModId")
|
||||
* public MyMod instance;
|
||||
*
|
||||
* // Mark this method for receiving an {@link FMLEvent} (in this case, it's the {@link FMLPreInitializationEvent})
|
||||
* {@literal @}EventHandler public void preInit(FMLPreInitializationEvent event)
|
||||
* {
|
||||
* // Do stuff in pre-init phase (read config, create blocks and items, register them)
|
||||
* }
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @author cpw
|
||||
*
|
||||
@@ -65,10 +110,14 @@ public @interface Mod
|
||||
* An optional bukkit plugin that will be injected into the bukkit plugin framework if
|
||||
* this mod is loaded into the FML framework and the bukkit coremod is present.
|
||||
* Instances of the bukkit plugin can be obtained via the {@link BukkitPluginRef} annotation on fields.
|
||||
*
|
||||
* This may be implemented by a bukkit integration. It is not provided with vanilla FML or MinecraftForge.
|
||||
*
|
||||
* @return The name of the plugin to load for this mod
|
||||
*/
|
||||
String bukkitPlugin() default "";
|
||||
/**
|
||||
* NOT YET IMPLEMENTED.</br>
|
||||
* Mods that this mod will <strong>not</strong> load with.
|
||||
* An optional comma separated string of (+|-)(*|modid[@value]) which specify mods that
|
||||
* this mod will refuse to load with, resulting in the game failing to start.
|
||||
@@ -98,34 +147,109 @@ public @interface Mod
|
||||
*
|
||||
* @return A string listing modids to exclude from loading with this mod.
|
||||
*/
|
||||
@Deprecated
|
||||
String modExclusionList() default "";
|
||||
/**
|
||||
* Specifying this field allows for a mod to expect a signed jar with a fingerprint matching this value.
|
||||
* The fingerprint should be SHA-1 encoded, lowercase with ':' removed. An empty value indicates that
|
||||
* the mod is not expecting to be signed.
|
||||
*
|
||||
* Any incorrectness of the fingerprint, be it missing or wrong, will result in the {@link FingerprintWarning}
|
||||
* method firing <i>prior to any other event on the mod</i>.
|
||||
* Any incorrectness of the fingerprint, be it missing or wrong, will result in the {@link FMLFingerprintViolationEvent}
|
||||
* event firing <i>prior to any other event on the mod</i>.
|
||||
*
|
||||
* @return A certificate fingerprint that is expected for this mod.
|
||||
*/
|
||||
String certificateFingerprint() default "";
|
||||
|
||||
/**
|
||||
* The language the mod is authored in. This will be used to control certain libraries being downloaded.
|
||||
* The language the mod is authored in. This will be used to control certain compatibility behaviours for this mod.
|
||||
* Valid values are currently "java", "scala"
|
||||
*
|
||||
* @return The language the mod is authored in
|
||||
*/
|
||||
String modLanguage() default "java";
|
||||
/**
|
||||
* NOT YET IMPLEMENTED. </br>
|
||||
* An optional ASM hook class, that can be used to apply ASM to classes loaded from this mod. It is also given
|
||||
* the ASM tree of the class declaring {@link Mod} to with what it will.
|
||||
* the ASM tree of the class declaring {@link Mod} to do with what it will.
|
||||
*
|
||||
* @return The name of a class to be loaded and executed. Must implement {@link IASMHook}.
|
||||
*/
|
||||
@Deprecated
|
||||
String asmHookClass() default "";
|
||||
|
||||
/**
|
||||
* A list of custom properties for this mod. Completely up to the mod author if/when they
|
||||
* want to put anything in here.
|
||||
* @return an optional list of custom properties
|
||||
*/
|
||||
CustomProperty[] customProperties() default {};
|
||||
|
||||
/**
|
||||
* A custom key => value property pair for use with {@link Mod#customProperties()}
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({})
|
||||
public @interface CustomProperty
|
||||
{
|
||||
/**
|
||||
* A key. Should be unique.
|
||||
* @return A key
|
||||
*/
|
||||
String k();
|
||||
/**
|
||||
* A value. Can be anything.
|
||||
* @return A value
|
||||
*/
|
||||
String v();
|
||||
}
|
||||
/**
|
||||
* Marks the associated method as handling an FML lifecycle event.
|
||||
* The method must have a single parameter, one of the following types. This annotation
|
||||
* replaces the multiple different annotations that previously were used.
|
||||
*
|
||||
* Current event classes. This first section is standard lifecycle events. They are dispatched
|
||||
* at various phases as the game starts. Each event should have information useful to that
|
||||
* phase of the lifecycle. They are fired in this order.
|
||||
*
|
||||
* These suggestions are mostly just suggestions on what to do in each event.
|
||||
* <ul>
|
||||
* <li> {@link FMLPreInitializationEvent} : Run before anything else. Read your config, create blocks,
|
||||
* items, etc, and register them with the {@link GameRegistry}.</li>
|
||||
* <li> {@link FMLInitializationEvent} : Do your mod setup. Build whatever data structures you care about. Register recipes,
|
||||
* send {@link FMLInterModComms} messages to other mods.</li>
|
||||
* <li> {@link FMLPostInitializationEvent} : Handle interaction with other mods, complete your setup based on this.</li>
|
||||
* </ul>
|
||||
* <p>These are the server lifecycle events. They are fired whenever a server is running, or about to run. Each time a server
|
||||
* starts they will be fired in this sequence.
|
||||
* <ul>
|
||||
* <li> {@link FMLServerAboutToStartEvent} : Use if you need to handle something before the server has even been created.</li>
|
||||
* <li> {@link FMLServerStartingEvent} : Do stuff you need to do to set up the server. register commands, tweak the server.</li>
|
||||
* <li> {@link FMLServerStartedEvent} : Do what you need to with the running server.</li>
|
||||
* <li> {@link FMLServerStoppingEvent} : Do what you need to before the server has started it's shutdown sequence.</li>
|
||||
* <li> {@link FMLServerStoppedEvent} : Do whatever cleanup you need once the server has shutdown. Generally only useful
|
||||
* on the integrated server.</li>
|
||||
* </ul>
|
||||
* The second set of events are more specialized, for receiving notification of specific
|
||||
* information.
|
||||
* <ul>
|
||||
* <li> {@link FMLFingerprintViolationEvent} : Sent just before {@link FMLPreInitializationEvent}
|
||||
* if something is wrong with your mod signature</li>
|
||||
* <li> {@link IMCEvent} : Sent just after {@link FMLInitializationEvent} if you have IMC messages waiting
|
||||
* from other mods</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface EventHandler{}
|
||||
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as to be called at if there is something wrong with the certificate fingerprint of
|
||||
* the mod's jar, or it is missing, or otherwise a problem.
|
||||
* @author cpw
|
||||
@@ -133,72 +257,90 @@ public @interface Mod
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface FingerprintWarning {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as being called at the "pre-initialization" phase
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface PreInit {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as being called at the "initialization" phase
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface Init {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as being called at the "post-initialization" phase
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface PostInit {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as being called at the "server-about-to-start" phase
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface ServerAboutToStart {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as being called at the "server-starting" phase
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface ServerStarting {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as being called at the "server-started" phase
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface ServerStarted {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as being called at the "server-stopping" phase
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface ServerStopping {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as being called at the "server-stopped" phase
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface ServerStopped {}
|
||||
/**
|
||||
* Deprecated for {@link EventHandler}<br/>
|
||||
* Mark the designated method as the receiver for {@link FMLInterModComms} messages
|
||||
* Called between {@link Init} and {@link PostInit}
|
||||
* @author cpw
|
||||
@@ -206,9 +348,11 @@ public @interface Mod
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
@Deprecated
|
||||
public @interface IMCCallback {}
|
||||
/**
|
||||
* Populate the annotated field with the mod instance.
|
||||
* Populate the annotated field with the mod instance based on the specified ModId. This can be used
|
||||
* to retrieve instances of other mods.
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@@ -234,12 +378,14 @@ public @interface Mod
|
||||
String value() default "";
|
||||
}
|
||||
/**
|
||||
* Populate the annotated field with an instance of the Block as specified
|
||||
* NOT IMPLEMENTED AND SCHEDULED FOR REMOVAL.<br/>
|
||||
* Populate the annotated field with an instance of the Block as specified. This never worked. It will be removed.
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
@Deprecated
|
||||
public @interface Block {
|
||||
/**
|
||||
* The block's name
|
||||
@@ -251,12 +397,14 @@ public @interface Mod
|
||||
Class<?> itemTypeClass() default ItemBlock.class;
|
||||
}
|
||||
/**
|
||||
* Populate the annotated field with an Item
|
||||
* NOT IMPLEMENTED AND SCHEDULED FOR REMOVAL.<br/>
|
||||
* Populate the annotated field with an Item. This never worked. It will be removed.
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
@Deprecated
|
||||
public @interface Item {
|
||||
/**
|
||||
* The name of the item
|
||||
@@ -267,4 +415,14 @@ public @interface Mod
|
||||
*/
|
||||
String typeClass();
|
||||
}
|
||||
|
||||
/**
|
||||
* Mod instance factory method. Should return an instance of the mod. Applies only to static methods on the same class as {@link Mod}.
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
public @interface InstanceFactory {
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -20,12 +20,13 @@ import java.net.URLClassLoader;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import cpw.mods.fml.common.asm.ASMTransformer;
|
||||
import cpw.mods.fml.common.asm.transformers.AccessTransformer;
|
||||
import cpw.mods.fml.common.modloader.BaseModProxy;
|
||||
import cpw.mods.fml.relauncher.RelaunchClassLoader;
|
||||
|
||||
/**
|
||||
* A simple delegating class loader used to load mods into the system
|
||||
@@ -37,16 +38,16 @@ import cpw.mods.fml.relauncher.RelaunchClassLoader;
|
||||
public class ModClassLoader extends URLClassLoader
|
||||
{
|
||||
private static final List<String> STANDARD_LIBRARIES = ImmutableList.of("jinput.jar", "lwjgl.jar", "lwjgl_util.jar");
|
||||
private RelaunchClassLoader mainClassLoader;
|
||||
private LaunchClassLoader mainClassLoader;
|
||||
|
||||
public ModClassLoader(ClassLoader parent) {
|
||||
super(new URL[0], null);
|
||||
this.mainClassLoader = (RelaunchClassLoader)parent;
|
||||
this.mainClassLoader = (LaunchClassLoader)parent;
|
||||
}
|
||||
|
||||
public void addFile(File modFile) throws MalformedURLException
|
||||
{
|
||||
URL url = modFile.toURI().toURL();
|
||||
URL url = modFile.toURI().toURL();
|
||||
mainClassLoader.addURL(url);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -15,8 +15,10 @@ package cpw.mods.fml.common;
|
||||
import java.io.File;
|
||||
import java.security.cert.Certificate;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.eventbus.EventBus;
|
||||
|
||||
import cpw.mods.fml.common.versioning.ArtifactVersion;
|
||||
@@ -131,4 +133,7 @@ public interface ModContainer
|
||||
VersionRange acceptableMinecraftVersionRange();
|
||||
|
||||
Certificate getSigningCertificate();
|
||||
|
||||
public static final Map<String,String> EMPTY_PROPERTIES = ImmutableMap.of();
|
||||
Map<String,String> getCustomModProperties();
|
||||
}
|
||||
@@ -15,6 +15,7 @@ package cpw.mods.fml.common;
|
||||
import java.util.Arrays;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
|
||||
import cpw.mods.fml.relauncher.ReflectionHelper;
|
||||
import cpw.mods.fml.relauncher.ReflectionHelper.UnableToAccessFieldException;
|
||||
import cpw.mods.fml.relauncher.ReflectionHelper.UnableToFindFieldException;
|
||||
@@ -27,8 +28,6 @@ import cpw.mods.fml.relauncher.ReflectionHelper.UnableToFindFieldException;
|
||||
*/
|
||||
public class ObfuscationReflectionHelper
|
||||
{
|
||||
public static boolean obfuscation;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T, E> T getPrivateValue(Class<? super E> classToAccess, E instance, int fieldIndex)
|
||||
{
|
||||
@@ -43,12 +42,23 @@ public class ObfuscationReflectionHelper
|
||||
}
|
||||
}
|
||||
|
||||
public static String[] remapFieldNames(String className, String... fieldNames)
|
||||
{
|
||||
String internalClassName = FMLDeobfuscatingRemapper.INSTANCE.unmap(className.replace('.', '/'));
|
||||
String[] mappedNames = new String[fieldNames.length];
|
||||
int i = 0;
|
||||
for (String fName : fieldNames)
|
||||
{
|
||||
mappedNames[i++] = FMLDeobfuscatingRemapper.INSTANCE.mapFieldName(internalClassName, fName, null);
|
||||
}
|
||||
return mappedNames;
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T, E> T getPrivateValue(Class<? super E> classToAccess, E instance, String... fieldNames)
|
||||
{
|
||||
try
|
||||
{
|
||||
return ReflectionHelper.getPrivateValue(classToAccess, instance, fieldNames);
|
||||
return ReflectionHelper.getPrivateValue(classToAccess, instance, remapFieldNames(classToAccess.getName(),fieldNames));
|
||||
}
|
||||
catch (UnableToFindFieldException e)
|
||||
{
|
||||
@@ -91,7 +101,7 @@ public class ObfuscationReflectionHelper
|
||||
{
|
||||
try
|
||||
{
|
||||
ReflectionHelper.setPrivateValue(classToAccess, instance, value, fieldNames);
|
||||
ReflectionHelper.setPrivateValue(classToAccess, instance, value, remapFieldNames(classToAccess.getName(), fieldNames));
|
||||
}
|
||||
catch (UnableToFindFieldException e)
|
||||
{
|
||||
@@ -104,13 +114,4 @@ public class ObfuscationReflectionHelper
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public static void detectObfuscation(Class<?> clazz)
|
||||
{
|
||||
obfuscation = !clazz.getSimpleName().equals("World");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -17,6 +17,8 @@ import java.lang.reflect.Modifier;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
|
||||
import cpw.mods.fml.common.discovery.ASMDataTable;
|
||||
import cpw.mods.fml.common.discovery.ASMDataTable.ASMData;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
@@ -27,7 +29,7 @@ import cpw.mods.fml.relauncher.Side;
|
||||
*/
|
||||
public class ProxyInjector
|
||||
{
|
||||
public static void inject(ModContainer mod, ASMDataTable data, Side side)
|
||||
public static void inject(ModContainer mod, ASMDataTable data, Side side, ILanguageAdapter languageAdapter)
|
||||
{
|
||||
FMLLog.fine("Attempting to inject @SidedProxy classes into %s", mod.getModId());
|
||||
Set<ASMData> targets = data.getAnnotationsFor(mod).get(SidedProxy.class.getName());
|
||||
@@ -46,10 +48,16 @@ public class ProxyInjector
|
||||
throw new LoaderException();
|
||||
}
|
||||
|
||||
String targetType = side.isClient() ? target.getAnnotation(SidedProxy.class).clientSide() : target.getAnnotation(SidedProxy.class).serverSide();
|
||||
SidedProxy annotation = target.getAnnotation(SidedProxy.class);
|
||||
if (!Strings.isNullOrEmpty(annotation.modId()) && !annotation.modId().equals(mod.getModId()))
|
||||
{
|
||||
FMLLog.fine("Skipping proxy injection for %s.%s since it is not for mod %s", targ.getClassName(), targ.getObjectName(), mod.getModId());
|
||||
continue;
|
||||
}
|
||||
String targetType = side.isClient() ? annotation.clientSide() : annotation.serverSide();
|
||||
Object proxy=Class.forName(targetType, true, mcl).newInstance();
|
||||
|
||||
if ((target.getModifiers() & Modifier.STATIC) == 0 )
|
||||
if (languageAdapter.supportsStatics() && (target.getModifiers() & Modifier.STATIC) == 0 )
|
||||
{
|
||||
FMLLog.severe("Attempted to load a proxy type %s into %s.%s, but the field is not static", targetType, targ.getClassName(), targ.getObjectName());
|
||||
throw new LoaderException();
|
||||
@@ -59,7 +67,7 @@ public class ProxyInjector
|
||||
FMLLog.severe("Attempted to load a proxy type %s into %s.%s, but the types don't match", targetType, targ.getClassName(), targ.getObjectName());
|
||||
throw new LoaderException();
|
||||
}
|
||||
target.set(null, proxy);
|
||||
languageAdapter.setProxy(target, proxyTarget, proxy);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -67,5 +75,8 @@ public class ProxyInjector
|
||||
throw new LoaderException(e);
|
||||
}
|
||||
}
|
||||
|
||||
// Allow language specific proxy injection.
|
||||
languageAdapter.setInternalProxies(mod, side, mcl);
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -18,6 +18,29 @@ import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Sided proxies are loaded based on the specific environment they find themselves loaded into.
|
||||
* They are used to ensure that client-specific code (such as GUIs) is only loaded into the game
|
||||
* on the client side.
|
||||
* It is applied to static fields of a class, anywhere in your mod code. FML will scan
|
||||
* and load any classes with this annotation at mod construction time.
|
||||
*
|
||||
* <p>
|
||||
* This example will load a CommonProxy on the server side, and a ClientProxy on the client side.
|
||||
*
|
||||
* <pre>{@code
|
||||
* public class MySidedProxyHolder {
|
||||
* {@literal @}SidedProxy(modId="MyModId",clientSide="mymod.ClientProxy", serverSide="mymod.CommonProxy")
|
||||
* public static CommonProxy proxy;
|
||||
* }
|
||||
*
|
||||
* public class CommonProxy {
|
||||
* // Common or server stuff here that needs to be overridden on the client
|
||||
* }
|
||||
*
|
||||
* public class ClientProxy extends CommonProxy {
|
||||
* // Override common stuff with client specific stuff here
|
||||
* }
|
||||
* </pre>
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@@ -35,8 +58,17 @@ public @interface SidedProxy
|
||||
*/
|
||||
String serverSide() default "";
|
||||
|
||||
@Deprecated
|
||||
/**
|
||||
* Not implemented
|
||||
* The name of a special bukkit plugin class to load and populate
|
||||
*/
|
||||
String bukkitSide() default "";
|
||||
|
||||
/**
|
||||
* The (optional) name of a mod to load this proxy for. This will help ensure correct behaviour when loading a combined
|
||||
* scala/java mod package. It is almost never going to be required, unless you ship both Scala and Java {@link Mod} content
|
||||
* in a single jar.
|
||||
*/
|
||||
String modId() default "";
|
||||
}
|
||||
@@ -5,13 +5,15 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.common.asm;
|
||||
|
||||
import net.minecraft.launchwrapper.IClassTransformer;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
@@ -19,7 +21,6 @@ import org.objectweb.asm.Type;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
import cpw.mods.fml.common.registry.BlockProxy;
|
||||
import cpw.mods.fml.relauncher.IClassTransformer;
|
||||
|
||||
public class ASMTransformer implements IClassTransformer
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -30,10 +30,13 @@ import java.security.cert.TrustAnchor;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassVisitor;
|
||||
import org.objectweb.asm.FieldVisitor;
|
||||
@@ -41,9 +44,10 @@ import org.objectweb.asm.Opcodes;
|
||||
|
||||
import cpw.mods.fml.common.CertificateHelper;
|
||||
import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
|
||||
import cpw.mods.fml.common.patcher.ClassPatchManager;
|
||||
import cpw.mods.fml.relauncher.FMLLaunchHandler;
|
||||
import cpw.mods.fml.relauncher.FMLRelaunchLog;
|
||||
import cpw.mods.fml.relauncher.IFMLCallHook;
|
||||
import cpw.mods.fml.relauncher.RelaunchClassLoader;
|
||||
|
||||
public class FMLSanityChecker implements IFMLCallHook
|
||||
{
|
||||
@@ -68,7 +72,7 @@ public class FMLSanityChecker implements IFMLCallHook
|
||||
}
|
||||
}
|
||||
|
||||
private RelaunchClassLoader cl;
|
||||
private LaunchClassLoader cl;
|
||||
|
||||
@Override
|
||||
public Void call() throws Exception
|
||||
@@ -137,8 +141,11 @@ public class FMLSanityChecker implements IFMLCallHook
|
||||
@Override
|
||||
public void injectData(Map<String, Object> data)
|
||||
{
|
||||
cl = (RelaunchClassLoader) data.get("classLoader");
|
||||
FMLDeobfuscatingRemapper.INSTANCE.setup((File)data.get("mcLocation"), cl, (String) data.get("deobfuscationFileName"));
|
||||
cl = (LaunchClassLoader) data.get("classLoader");
|
||||
File mcDir = (File)data.get("mcLocation");
|
||||
FMLDeobfuscatingRemapper.INSTANCE.setup(mcDir, cl, (String) data.get("deobfuscationFileName"));
|
||||
File binpatches = new File(mcDir,"binpatch");
|
||||
ClassPatchManager.INSTANCE.setup(FMLLaunchHandler.side());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -32,6 +32,8 @@ import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
import net.minecraft.launchwrapper.IClassTransformer;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
@@ -48,7 +50,7 @@ import com.google.common.io.LineProcessor;
|
||||
import com.google.common.io.Resources;
|
||||
|
||||
import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
|
||||
import cpw.mods.fml.relauncher.IClassTransformer;
|
||||
import cpw.mods.fml.relauncher.FMLRelaunchLog;
|
||||
|
||||
public class AccessTransformer implements IClassTransformer
|
||||
{
|
||||
@@ -152,6 +154,7 @@ public class AccessTransformer implements IClassTransformer
|
||||
return true;
|
||||
}
|
||||
});
|
||||
System.out.printf("Loaded %d rules from AccessTransformer config file %s\n", modifiers.size(), rulesFile);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -161,6 +164,10 @@ public class AccessTransformer implements IClassTransformer
|
||||
if (bytes == null) { return null; }
|
||||
boolean makeAllPublic = FMLDeobfuscatingRemapper.INSTANCE.isRemappedClass(name);
|
||||
|
||||
if (DEBUG)
|
||||
{
|
||||
FMLRelaunchLog.fine("Considering all methods and fields on %s (%s): %b\n", name, transformedName, makeAllPublic);
|
||||
}
|
||||
if (!makeAllPublic && !modifiers.containsKey(name)) { return bytes; }
|
||||
|
||||
ClassNode classNode = new ClassNode();
|
||||
@@ -183,8 +190,12 @@ public class AccessTransformer implements IClassTransformer
|
||||
m = new Modifier();
|
||||
m.targetAccess = ACC_PUBLIC;
|
||||
m.name = "*";
|
||||
m.desc = "";
|
||||
m.desc = "<dummy>";
|
||||
modifiers.put(name,m);
|
||||
if (DEBUG)
|
||||
{
|
||||
System.out.printf("Injected all public modifiers for %s (%s)\n", name, transformedName);
|
||||
}
|
||||
}
|
||||
|
||||
Collection<Modifier> mods = modifiers.get(name);
|
||||
|
||||
@@ -5,13 +5,16 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.common.asm.transformers;
|
||||
|
||||
import net.minecraft.launchwrapper.IClassNameTransformer;
|
||||
import net.minecraft.launchwrapper.IClassTransformer;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.Opcodes;
|
||||
@@ -20,8 +23,6 @@ import org.objectweb.asm.tree.ClassNode;
|
||||
|
||||
import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
|
||||
import cpw.mods.fml.common.asm.transformers.deobf.FMLRemappingAdapter;
|
||||
import cpw.mods.fml.relauncher.IClassNameTransformer;
|
||||
import cpw.mods.fml.relauncher.IClassTransformer;
|
||||
|
||||
public class DeobfuscationTransformer implements IClassTransformer, IClassNameTransformer {
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ public class MCPMerger
|
||||
private static HashSet<String> copyToServer = new HashSet<String>();
|
||||
private static HashSet<String> copyToClient = new HashSet<String>();
|
||||
private static HashSet<String> dontAnnotate = new HashSet<String>();
|
||||
private static HashSet<String> dontProcess = new HashSet<String>();
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
public static void main(String[] args)
|
||||
@@ -71,9 +72,8 @@ public class MCPMerger
|
||||
File map_file = new File(args[0]);
|
||||
File client_jar = new File(args[1]);
|
||||
File server_jar = new File(args[2]);
|
||||
File client_jar_tmp = new File(args[1] + ".MergeBack");
|
||||
File server_jar_tmp = new File(args[2] + ".MergeBack");
|
||||
|
||||
File client_jar_tmp = new File(args[1] + ".backup_merge");
|
||||
File server_jar_tmp = new File(args[2] + ".backup_merge");
|
||||
|
||||
if (client_jar_tmp.exists() && !client_jar_tmp.delete())
|
||||
{
|
||||
@@ -155,7 +155,8 @@ public class MCPMerger
|
||||
{
|
||||
case '!': dontAnnotate.add(line); break;
|
||||
case '<': copyToClient.add(line); break;
|
||||
case '>': copyToServer.add(line); break;
|
||||
case '>': copyToServer.add(line); break;
|
||||
case '^': dontProcess.add(line); break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,8 +345,20 @@ public class MCPMerger
|
||||
outFile.putNextEntry(entry);
|
||||
continue;
|
||||
}
|
||||
|
||||
String entryName = entry.getName();
|
||||
if (!entryName.endsWith(".class") || entryName.startsWith("."))
|
||||
|
||||
boolean filtered = false;
|
||||
for (String filter : dontProcess)
|
||||
{
|
||||
if (entryName.startsWith(filter))
|
||||
{
|
||||
filtered = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (filtered || !entryName.endsWith(".class") || entryName.startsWith("."))
|
||||
{
|
||||
ZipEntry newEntry = new ZipEntry(entry.getName());
|
||||
outFile.putNextEntry(newEntry);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -26,6 +26,8 @@ import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
import net.minecraft.launchwrapper.IClassTransformer;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
@@ -39,8 +41,6 @@ import com.google.common.collect.Lists;
|
||||
import com.google.common.io.LineProcessor;
|
||||
import com.google.common.io.Resources;
|
||||
|
||||
import cpw.mods.fml.relauncher.IClassTransformer;
|
||||
|
||||
public class MarkerTransformer implements IClassTransformer
|
||||
{
|
||||
private ListMultimap<String, String> markers = ArrayListMultimap.create();
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package cpw.mods.fml.common.asm.transformers;
|
||||
|
||||
import net.minecraft.launchwrapper.IClassTransformer;
|
||||
import cpw.mods.fml.common.patcher.ClassPatchManager;
|
||||
|
||||
public class PatchingTransformer implements IClassTransformer {
|
||||
@Override
|
||||
public byte[] transform(String name, String transformedName, byte[] bytes)
|
||||
{
|
||||
return ClassPatchManager.INSTANCE.applyPatch(name, transformedName, bytes);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -15,6 +15,8 @@ package cpw.mods.fml.common.asm.transformers;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import net.minecraft.launchwrapper.IClassTransformer;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.ClassWriter;
|
||||
import org.objectweb.asm.Type;
|
||||
@@ -23,13 +25,12 @@ import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.FieldNode;
|
||||
import org.objectweb.asm.tree.MethodNode;
|
||||
|
||||
import cpw.mods.fml.relauncher.FMLRelauncher;
|
||||
import cpw.mods.fml.relauncher.IClassTransformer;
|
||||
import cpw.mods.fml.relauncher.FMLLaunchHandler;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
public class SideTransformer implements IClassTransformer
|
||||
{
|
||||
private static String SIDE = FMLRelauncher.side();
|
||||
private static String SIDE = FMLLaunchHandler.side().name();
|
||||
private static final boolean DEBUG = false;
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
package cpw.mods.fml.common.asm.transformers.deobf;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
@@ -23,21 +24,27 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.commons.Remapper;
|
||||
|
||||
import com.google.common.base.CharMatcher;
|
||||
import com.google.common.base.Charsets;
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
import com.google.common.collect.ImmutableBiMap;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.ListMultimap;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
@@ -47,7 +54,8 @@ import com.google.common.io.InputSupplier;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.relauncher.FMLRelaunchLog;
|
||||
import cpw.mods.fml.relauncher.RelaunchClassLoader;
|
||||
import org.objectweb.asm.tree.ClassNode;
|
||||
import org.objectweb.asm.tree.FieldNode;
|
||||
|
||||
public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
public static final FMLDeobfuscatingRemapper INSTANCE = new FMLDeobfuscatingRemapper();
|
||||
@@ -61,7 +69,7 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
private Map<String,Map<String,String>> fieldNameMaps;
|
||||
private Map<String,Map<String,String>> methodNameMaps;
|
||||
|
||||
private RelaunchClassLoader classLoader;
|
||||
private LaunchClassLoader classLoader;
|
||||
|
||||
private FMLDeobfuscatingRemapper()
|
||||
{
|
||||
@@ -69,16 +77,61 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
mcpNameBiMap=ImmutableBiMap.of();
|
||||
}
|
||||
|
||||
public void setup(File mcDir, RelaunchClassLoader classLoader, String deobfFileName)
|
||||
public void setupLoadOnly(String deobfFileName, boolean loadAll)
|
||||
{
|
||||
try
|
||||
{
|
||||
File mapData = new File(deobfFileName);
|
||||
LZMAInputSupplier zis = new LZMAInputSupplier(new FileInputStream(mapData));
|
||||
InputSupplier<InputStreamReader> srgSupplier = CharStreams.newReaderSupplier(zis,Charsets.UTF_8);
|
||||
List<String> srgList = CharStreams.readLines(srgSupplier);
|
||||
rawMethodMaps = Maps.newHashMap();
|
||||
rawFieldMaps = Maps.newHashMap();
|
||||
Builder<String, String> builder = ImmutableBiMap.<String,String>builder();
|
||||
Builder<String, String> mcpBuilder = ImmutableBiMap.<String,String>builder();
|
||||
Splitter splitter = Splitter.on(CharMatcher.anyOf(": ")).omitEmptyStrings().trimResults();
|
||||
for (String line : srgList)
|
||||
{
|
||||
String[] parts = Iterables.toArray(splitter.split(line),String.class);
|
||||
String typ = parts[0];
|
||||
if ("CL".equals(typ))
|
||||
{
|
||||
parseClass(builder, parts);
|
||||
parseMCPClass(mcpBuilder,parts);
|
||||
}
|
||||
else if ("MD".equals(typ) && loadAll)
|
||||
{
|
||||
parseMethod(parts);
|
||||
}
|
||||
else if ("FD".equals(typ) && loadAll)
|
||||
{
|
||||
parseField(parts);
|
||||
}
|
||||
}
|
||||
classNameBiMap = builder.build();
|
||||
// Special case some mappings for modloader mods
|
||||
mcpBuilder.put("BaseMod","net/minecraft/src/BaseMod");
|
||||
mcpBuilder.put("ModLoader","net/minecraft/src/ModLoader");
|
||||
mcpBuilder.put("EntityRendererProxy","net/minecraft/src/EntityRendererProxy");
|
||||
mcpBuilder.put("MLProp","net/minecraft/src/MLProp");
|
||||
mcpBuilder.put("TradeEntry","net/minecraft/src/TradeEntry");
|
||||
mcpNameBiMap = mcpBuilder.build();
|
||||
}
|
||||
catch (IOException ioe)
|
||||
{
|
||||
Logger.getLogger("FML").log(Level.SEVERE, "An error occurred loading the deobfuscation map data", ioe);
|
||||
}
|
||||
methodNameMaps = Maps.newHashMapWithExpectedSize(rawMethodMaps.size());
|
||||
fieldNameMaps = Maps.newHashMapWithExpectedSize(rawFieldMaps.size());
|
||||
|
||||
}
|
||||
public void setup(File mcDir, LaunchClassLoader classLoader, String deobfFileName)
|
||||
{
|
||||
this.classLoader = classLoader;
|
||||
try
|
||||
{
|
||||
File libDir = new File(mcDir, "lib");
|
||||
File mapData = new File(libDir, deobfFileName);
|
||||
ZipFile mapZip = new ZipFile(mapData);
|
||||
ZipEntry classData = mapZip.getEntry("joined.srg");
|
||||
ZipInputSupplier zis = new ZipInputSupplier(mapZip, classData);
|
||||
InputStream classData = getClass().getResourceAsStream(deobfFileName);
|
||||
LZMAInputSupplier zis = new LZMAInputSupplier(classData);
|
||||
InputSupplier<InputStreamReader> srgSupplier = CharStreams.newReaderSupplier(zis,Charsets.UTF_8);
|
||||
List<String> srgList = CharStreams.readLines(srgSupplier);
|
||||
rawMethodMaps = Maps.newHashMap();
|
||||
@@ -123,7 +176,8 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
|
||||
public boolean isRemappedClass(String className)
|
||||
{
|
||||
return classNameBiMap.containsKey(className) || mcpNameBiMap.containsKey(className);
|
||||
className = className.replace('.', '/');
|
||||
return classNameBiMap.containsKey(className) || mcpNameBiMap.containsKey(className) || (!classNameBiMap.isEmpty() && className.indexOf('/') == -1);
|
||||
}
|
||||
|
||||
private void parseField(String[] parts)
|
||||
@@ -139,7 +193,46 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
{
|
||||
rawFieldMaps.put(cl, Maps.<String,String>newHashMap());
|
||||
}
|
||||
rawFieldMaps.get(cl).put(oldName, newName);
|
||||
rawFieldMaps.get(cl).put(oldName + ":" + getFieldType(cl, oldName), newName);
|
||||
rawFieldMaps.get(cl).put(oldName + ":null", newName);
|
||||
}
|
||||
|
||||
/*
|
||||
* Cache the field descriptions for classes so we don't repeatedly reload the same data again and again
|
||||
*/
|
||||
private Map<String,Map<String,String>> fieldDescriptions = Maps.newHashMap();
|
||||
|
||||
private String getFieldType(String owner, String name)
|
||||
{
|
||||
if (fieldDescriptions.containsKey(owner))
|
||||
{
|
||||
return fieldDescriptions.get(owner).get(name);
|
||||
}
|
||||
synchronized (fieldDescriptions)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] classBytes = classLoader.getClassBytes(owner);
|
||||
if (classBytes == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
ClassReader cr = new ClassReader(classBytes);
|
||||
ClassNode classNode = new ClassNode();
|
||||
cr.accept(classNode, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
|
||||
Map<String,String> resMap = Maps.newHashMap();
|
||||
for (FieldNode fieldNode : (List<FieldNode>) classNode.fields) {
|
||||
resMap.put(fieldNode.name, fieldNode.desc);
|
||||
}
|
||||
fieldDescriptions.put(owner, resMap);
|
||||
return resMap.get(name);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
FMLLog.log(Level.SEVERE,e, "A critical exception occured reading a class file %s", owner);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void parseClass(Builder<String, String> builder, String[] parts)
|
||||
@@ -178,7 +271,7 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
return name;
|
||||
}
|
||||
Map<String, String> fieldMap = getFieldMap(owner);
|
||||
return fieldMap!=null && fieldMap.containsKey(name) ? fieldMap.get(name) : name;
|
||||
return fieldMap!=null && fieldMap.containsKey(name+":"+desc) ? fieldMap.get(name+":"+desc) : name;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -189,18 +282,29 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
return typeName;
|
||||
}
|
||||
|
||||
String result = classNameBiMap.containsKey(typeName) ? classNameBiMap.get(typeName) : mcpNameBiMap.containsKey(typeName) ? mcpNameBiMap.get(typeName) : typeName;
|
||||
int dollarIdx = typeName.indexOf('$');
|
||||
String realType = dollarIdx > -1 ? typeName.substring(0, dollarIdx) : typeName;
|
||||
String subType = dollarIdx > -1 ? typeName.substring(dollarIdx+1) : "";
|
||||
|
||||
String result = classNameBiMap.containsKey(realType) ? classNameBiMap.get(realType) : mcpNameBiMap.containsKey(realType) ? mcpNameBiMap.get(realType) : realType;
|
||||
result = dollarIdx > -1 ? result+"$"+subType : result;
|
||||
// System.out.printf("Mapping %s=>%s\n",typeName,result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public String unmap(String typeName)
|
||||
{
|
||||
if (classNameBiMap == null)
|
||||
if (classNameBiMap == null || classNameBiMap.isEmpty())
|
||||
{
|
||||
return typeName;
|
||||
}
|
||||
String result = classNameBiMap.containsValue(typeName) ? classNameBiMap.inverse().get(typeName) : mcpNameBiMap.containsValue(typeName) ? mcpNameBiMap.inverse().get(typeName) : typeName;
|
||||
int dollarIdx = typeName.indexOf('$');
|
||||
String realType = dollarIdx > -1 ? typeName.substring(0, dollarIdx) : typeName;
|
||||
String subType = dollarIdx > -1 ? typeName.substring(dollarIdx+1) : "";
|
||||
|
||||
|
||||
String result = classNameBiMap.containsValue(realType) ? classNameBiMap.inverse().get(realType) : mcpNameBiMap.containsValue(realType) ? mcpNameBiMap.inverse().get(realType) : realType;
|
||||
result = dollarIdx > -1 ? result+"$"+subType : result;
|
||||
// System.out.printf("Unmapping %s=>%s\n",typeName,result);
|
||||
return result;
|
||||
}
|
||||
@@ -261,16 +365,24 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
}
|
||||
public void mergeSuperMaps(String name, String superName, String[] interfaces)
|
||||
{
|
||||
// System.out.printf("Computing super maps for %s: %s %s\n", name, superName, Arrays.asList(interfaces));
|
||||
if (classNameBiMap == null || classNameBiMap.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
// Skip Object
|
||||
if (Strings.isNullOrEmpty(superName))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> allParents = ImmutableList.<String>builder().add(superName).addAll(Arrays.asList(interfaces)).build();
|
||||
// generate maps for all parent objects
|
||||
for (String parentThing : allParents)
|
||||
{
|
||||
if (superName != null && classNameBiMap.containsKey(superName) && !methodNameMaps.containsKey(superName))
|
||||
if (!methodNameMaps.containsKey(parentThing))
|
||||
{
|
||||
findAndMergeSuperMaps(superName);
|
||||
findAndMergeSuperMaps(parentThing);
|
||||
}
|
||||
}
|
||||
Map<String, String> methodMap = Maps.<String,String>newHashMap();
|
||||
@@ -296,5 +408,11 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
}
|
||||
methodNameMaps.put(name, ImmutableMap.copyOf(methodMap));
|
||||
fieldNameMaps.put(name, ImmutableMap.copyOf(fieldMap));
|
||||
// System.out.printf("Maps: %s %s\n", name, methodMap);
|
||||
}
|
||||
|
||||
public Set<String> getObfedClasses()
|
||||
{
|
||||
return ImmutableSet.copyOf(classNameBiMap.keySet());
|
||||
}
|
||||
}
|
||||
+8
-8
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -17,22 +17,22 @@ import java.io.InputStream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
import LZMA.LzmaInputStream;
|
||||
|
||||
import com.google.common.io.InputSupplier;
|
||||
|
||||
public class ZipInputSupplier implements InputSupplier<InputStream> {
|
||||
private ZipFile zipFile;
|
||||
private ZipEntry zipEntry;
|
||||
public class LZMAInputSupplier implements InputSupplier<InputStream> {
|
||||
private InputStream compressedData;
|
||||
|
||||
public ZipInputSupplier(ZipFile zip, ZipEntry entry)
|
||||
public LZMAInputSupplier(InputStream compressedData)
|
||||
{
|
||||
this.zipFile = zip;
|
||||
this.zipEntry = entry;
|
||||
this.compressedData = compressedData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getInput() throws IOException
|
||||
{
|
||||
return zipFile.getInputStream(zipEntry);
|
||||
return new LzmaInputStream(this.compressedData);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -27,7 +27,7 @@ import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.common.LoaderException;
|
||||
import cpw.mods.fml.common.ModClassLoader;
|
||||
import cpw.mods.fml.common.ModContainer;
|
||||
import cpw.mods.fml.relauncher.RelaunchLibraryManager;
|
||||
import cpw.mods.fml.relauncher.CoreModManager;
|
||||
|
||||
public class ModDiscoverer
|
||||
{
|
||||
@@ -41,7 +41,7 @@ public class ModDiscoverer
|
||||
|
||||
public void findClasspathMods(ModClassLoader modClassLoader)
|
||||
{
|
||||
List<String> knownLibraries = ImmutableList.<String>builder().addAll(modClassLoader.getDefaultLibraries()).addAll(RelaunchLibraryManager.getLibraries()).build();
|
||||
List<String> knownLibraries = ImmutableList.<String>builder().addAll(modClassLoader.getDefaultLibraries()).addAll(CoreModManager.getLibraries()).build();
|
||||
File[] minecraftSources = modClassLoader.getParentSources();
|
||||
if (minecraftSources.length == 1 && minecraftSources[0].isFile())
|
||||
{
|
||||
|
||||
@@ -25,6 +25,7 @@ import org.objectweb.asm.ClassReader;
|
||||
import org.objectweb.asm.Type;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
@@ -64,7 +65,7 @@ public class ASMModParser
|
||||
{
|
||||
this.asmType = Type.getObjectType(typeQName);
|
||||
this.classVersion = classVersion;
|
||||
this.asmSuperType = Type.getObjectType(superClassQName);
|
||||
this.asmSuperType = !Strings.isNullOrEmpty(superClassQName) ? Type.getObjectType(superClassQName) : null;
|
||||
}
|
||||
|
||||
public void startClassAnnotation(String annotationName)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -62,6 +62,7 @@ public class FMLInterModComms {
|
||||
public void applyModContainer(ModContainer activeContainer)
|
||||
{
|
||||
this.activeContainer = activeContainer;
|
||||
this.currentList = null;
|
||||
FMLLog.finest("Attempting to deliver %d IMC messages to mod %s", modMessages.get(activeContainer.getModId()).size(), activeContainer.getModId());
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package cpw.mods.fml.common.functions;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
import cpw.mods.fml.common.versioning.ArtifactVersion;
|
||||
|
||||
public class ArtifactVersionNameFunction implements Function<ArtifactVersion, String> {
|
||||
public String apply(ArtifactVersion v)
|
||||
{
|
||||
return v.getLabel();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package cpw.mods.fml.common.launcher;
|
||||
|
||||
import cpw.mods.fml.relauncher.FMLLaunchHandler;
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
public class FMLServerTweaker extends FMLTweaker {
|
||||
@Override
|
||||
public String getLaunchTarget()
|
||||
{
|
||||
return "net.minecraft.server.MinecraftServer";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectIntoClassLoader(LaunchClassLoader classLoader)
|
||||
{
|
||||
FMLLaunchHandler.configureForServerLaunch(classLoader, this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package cpw.mods.fml.common.launcher;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.ObjectArrays;
|
||||
|
||||
import cpw.mods.fml.relauncher.FMLLaunchHandler;
|
||||
|
||||
import net.minecraft.launchwrapper.ITweaker;
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
public class FMLTweaker implements ITweaker {
|
||||
private List<String> args;
|
||||
private File gameDir;
|
||||
private File assetsDir;
|
||||
private String profile;
|
||||
private static URI jarLocation;
|
||||
private String[] array;
|
||||
|
||||
@Override
|
||||
public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile)
|
||||
{
|
||||
this.args = args;
|
||||
this.gameDir = (gameDir == null ? new File(".") : gameDir);
|
||||
this.assetsDir = assetsDir;
|
||||
this.profile = profile;
|
||||
try
|
||||
{
|
||||
jarLocation = getClass().getProtectionDomain().getCodeSource().getLocation().toURI();
|
||||
}
|
||||
catch (URISyntaxException e)
|
||||
{
|
||||
Logger.getLogger("FMLTWEAK").log(Level.SEVERE, "Missing URI information for FML tweak");
|
||||
throw Throwables.propagate(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectIntoClassLoader(LaunchClassLoader classLoader)
|
||||
{
|
||||
classLoader.addTransformerExclusion("cpw.mods.fml.repackage.");
|
||||
classLoader.addTransformerExclusion("cpw.mods.fml.relauncher.");
|
||||
classLoader.addTransformerExclusion("cpw.mods.fml.common.asm.transformers.");
|
||||
FMLLaunchHandler.configureForClientLaunch(classLoader, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLaunchTarget()
|
||||
{
|
||||
return "net.minecraft.client.main.Main";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] getLaunchArguments()
|
||||
{
|
||||
String[] array = args.toArray(new String[args.size()]);
|
||||
|
||||
if (gameDir != null)
|
||||
{
|
||||
array = ObjectArrays.concat(gameDir.getAbsolutePath(),array);
|
||||
array = ObjectArrays.concat("--gameDir",array);
|
||||
}
|
||||
|
||||
if (assetsDir != null)
|
||||
{
|
||||
array = ObjectArrays.concat(assetsDir.getAbsolutePath(),array);
|
||||
array = ObjectArrays.concat("--assetsDir",array);
|
||||
}
|
||||
if (profile != null)
|
||||
{
|
||||
array = ObjectArrays.concat(profile,array);
|
||||
array = ObjectArrays.concat("--version",array);
|
||||
}
|
||||
else
|
||||
{
|
||||
array = ObjectArrays.concat("UnknownFMLProfile",array);
|
||||
array = ObjectArrays.concat("--version",array);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
public File getGameDir()
|
||||
{
|
||||
return gameDir;
|
||||
}
|
||||
|
||||
public static URI getJarLocation()
|
||||
{
|
||||
return jarLocation;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -40,6 +40,7 @@ import com.google.common.eventbus.Subscribe;
|
||||
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.common.ILanguageAdapter;
|
||||
import cpw.mods.fml.common.LoadController;
|
||||
import cpw.mods.fml.common.Loader;
|
||||
import cpw.mods.fml.common.LoaderException;
|
||||
@@ -496,7 +497,7 @@ public class ModLoaderModContainer implements ModContainer
|
||||
{
|
||||
dummyHandler.setBaseMod(mod);
|
||||
}
|
||||
ProxyInjector.inject(this, event.getASMHarvestedData(), FMLCommonHandler.instance().getSide());
|
||||
ProxyInjector.inject(this, event.getASMHarvestedData(), FMLCommonHandler.instance().getSide(), new ILanguageAdapter.JavaAdapter());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -614,4 +615,10 @@ public class ModLoaderModContainer implements ModContainer
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getCustomModProperties()
|
||||
{
|
||||
return EMPTY_PROPERTIES;
|
||||
}
|
||||
}
|
||||
@@ -184,8 +184,7 @@ public class EntitySpawnPacket extends FMLPacket
|
||||
ModContainer mc = nmh.getContainer();
|
||||
|
||||
EntityRegistration registration = EntityRegistry.instance().lookupModSpawn(mc, modEntityId);
|
||||
Class<? extends Entity> cls = registration.getEntityClass();
|
||||
if (cls == null)
|
||||
if (registration == null || registration.getEntityClass() == null)
|
||||
{
|
||||
FMLLog.log(Level.WARNING, "Missing mod entity information for %s : %d", mc.getModId(), modEntityId);
|
||||
return;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -41,6 +41,7 @@ import com.google.common.hash.Hashing;
|
||||
|
||||
import cpw.mods.fml.common.FMLCommonHandler;
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.common.InjectedModContainer;
|
||||
import cpw.mods.fml.common.Loader;
|
||||
import cpw.mods.fml.common.ModContainer;
|
||||
import cpw.mods.fml.common.discovery.ASMDataTable;
|
||||
@@ -269,6 +270,10 @@ public class FMLNetworkHandler
|
||||
|
||||
public NetworkModHandler findNetworkModHandler(Object mc)
|
||||
{
|
||||
if (mc instanceof InjectedModContainer)
|
||||
{
|
||||
return networkModHandlers.get(((InjectedModContainer)mc).wrappedContainer);
|
||||
}
|
||||
if (mc instanceof ModContainer)
|
||||
{
|
||||
return networkModHandlers.get(mc);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -96,6 +96,10 @@ public class NetworkModHandler
|
||||
}
|
||||
}
|
||||
|
||||
configureNetworkMod(container);
|
||||
}
|
||||
protected void configureNetworkMod(ModContainer container)
|
||||
{
|
||||
if (this.checkHandler == null)
|
||||
{
|
||||
String versionBounds = mod.versionBounds();
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package cpw.mods.fml.common.patcher;
|
||||
|
||||
public class ClassPatch {
|
||||
public final String name;
|
||||
public final String sourceClassName;
|
||||
public final String targetClassName;
|
||||
public final boolean existsAtTarget;
|
||||
public final byte[] patch;
|
||||
public ClassPatch(String name, String sourceClassName, String targetClassName, boolean existsAtTarget, byte[] patch)
|
||||
{
|
||||
this.name = name;
|
||||
this.sourceClassName = sourceClassName;
|
||||
this.targetClassName = targetClassName;
|
||||
this.existsAtTarget = existsAtTarget;
|
||||
this.patch = patch;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return String.format("%s : %s => %s (%b) size %d", name, sourceClassName, targetClassName, existsAtTarget, patch.length);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
package cpw.mods.fml.common.patcher;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.security.CodeSource;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.logging.Level;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.ArrayListMultimap;
|
||||
import com.google.common.collect.ListMultimap;
|
||||
import com.google.common.io.ByteArrayDataInput;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import com.google.common.io.Files;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.common.launcher.FMLTweaker;
|
||||
import cpw.mods.fml.relauncher.FMLRelaunchLog;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.repackage.com.nothome.delta.GDiffPatcher;
|
||||
|
||||
public class ClassPatchManager {
|
||||
public static final ClassPatchManager INSTANCE = new ClassPatchManager();
|
||||
|
||||
private GDiffPatcher patcher = new GDiffPatcher();
|
||||
private ListMultimap<String, ClassPatch> patches;
|
||||
private ClassPatchManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public byte[] applyPatch(String name, String mappedName, byte[] inputData)
|
||||
{
|
||||
if (patches == null)
|
||||
{
|
||||
return inputData;
|
||||
}
|
||||
List<ClassPatch> list = patches.get(name);
|
||||
if (list.isEmpty())
|
||||
{
|
||||
return inputData;
|
||||
}
|
||||
for (ClassPatch patch: list)
|
||||
{
|
||||
if (!patch.targetClassName.equals(mappedName))
|
||||
{
|
||||
FMLLog.warning("Binary patch found %s for wrong class %s", patch.targetClassName, mappedName);
|
||||
}
|
||||
if (!patch.existsAtTarget && (inputData == null || inputData.length == 0))
|
||||
{
|
||||
inputData = new byte[0];
|
||||
}
|
||||
else if (!patch.existsAtTarget)
|
||||
{
|
||||
FMLLog.warning("Patcher expecting empty class data file for %s, but received non-empty", patch.targetClassName);
|
||||
}
|
||||
synchronized (patcher)
|
||||
{
|
||||
try
|
||||
{
|
||||
inputData = patcher.patch(inputData, patch.patch);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
FMLLog.log(Level.SEVERE, e, "Encountered problem runtime patching class %s", name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
FMLLog.fine("Successfully applied runtime patches for %s", mappedName);
|
||||
return inputData;
|
||||
}
|
||||
|
||||
public void setup(Side side)
|
||||
{
|
||||
Pattern binpatchMatcher = Pattern.compile(String.format("binpatch/%s/.*.binpatch", side.toString().toLowerCase(Locale.ENGLISH)));
|
||||
JarFile fmlJar;
|
||||
try
|
||||
{
|
||||
FMLRelaunchLog.fine("FML URI is %s", FMLTweaker.getJarLocation());
|
||||
File fmlJarFile = new File(FMLTweaker.getJarLocation());
|
||||
if (!fmlJarFile.exists() || !fmlJarFile.isFile())
|
||||
{
|
||||
FMLRelaunchLog.log(Level.INFO, "Not found an FML jar, I assume you're developing FML. Hi cpw or Lex!");
|
||||
patches = ArrayListMultimap.create();
|
||||
return;
|
||||
}
|
||||
fmlJar = new JarFile(fmlJarFile);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
FMLRelaunchLog.log(Level.SEVERE, e, "Error occurred reading binary patches. Problems may occur");
|
||||
throw Throwables.propagate(e);
|
||||
}
|
||||
|
||||
patches = ArrayListMultimap.create();
|
||||
|
||||
for (JarEntry entry : Collections.list(fmlJar.entries()))
|
||||
{
|
||||
if (binpatchMatcher.matcher(entry.getName()).matches())
|
||||
{
|
||||
ClassPatch cp = readPatch(entry, fmlJar);
|
||||
if (cp != null)
|
||||
{
|
||||
patches.put(cp.sourceClassName, cp);
|
||||
}
|
||||
}
|
||||
}
|
||||
FMLLog.fine("Read %d binary patches from %s", patches.size(), fmlJar.getName());
|
||||
FMLLog.fine("Patch list :\n\t%s", Joiner.on("\t\n").join(patches.asMap().entrySet()));
|
||||
}
|
||||
|
||||
private ClassPatch readPatch(JarEntry patchEntry, JarFile jarFile)
|
||||
{
|
||||
FMLLog.finest("Reading patch data from %s in file %s", patchEntry.getName(), jarFile.getName());
|
||||
ByteArrayDataInput input;
|
||||
try
|
||||
{
|
||||
input = ByteStreams.newDataInput(ByteStreams.toByteArray(jarFile.getInputStream(patchEntry)));
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
FMLLog.log(Level.WARNING, e, "Unable to read binpatch file %s - ignoring", patchEntry.getName());
|
||||
return null;
|
||||
}
|
||||
String name = input.readUTF();
|
||||
String sourceClassName = input.readUTF();
|
||||
String targetClassName = input.readUTF();
|
||||
boolean exists = input.readBoolean();
|
||||
int patchLength = input.readInt();
|
||||
byte[] patchBytes = new byte[patchLength];
|
||||
input.readFully(patchBytes);
|
||||
|
||||
return new ClassPatch(name, sourceClassName, targetClassName, exists, patchBytes);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package cpw.mods.fml.common.patcher;
|
||||
|
||||
public class ClassPatchingTransformer {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
package cpw.mods.fml.common.patcher;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Iterators;
|
||||
import com.google.common.io.ByteArrayDataOutput;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import com.google.common.io.Files;
|
||||
|
||||
import cpw.mods.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
|
||||
import cpw.mods.fml.repackage.com.nothome.delta.Delta;
|
||||
|
||||
public class GenDiffSet {
|
||||
|
||||
public static void main(String[] args) throws IOException
|
||||
{
|
||||
String sourceJar = args[0]; //Clean Vanilla jar minecraft.jar or minecraft_server.jar
|
||||
String targetDir = args[1]; //Directory containing obfed output classes, typically mcp/reobf/minecraft
|
||||
String deobfData = args[2]; //Path to FML's deobfusication_data.zip
|
||||
String outputDir = args[3]; //Path to place generated .binpatch
|
||||
String killTarget = args[4]; //"true" if we should destroy the target file if it generated a successful .binpatch
|
||||
|
||||
Logger.getLogger("GENDIFF").log(Level.INFO, String.format("Creating patches at %s for %s from %s", outputDir, sourceJar, targetDir));
|
||||
Delta delta = new Delta();
|
||||
FMLDeobfuscatingRemapper remapper = FMLDeobfuscatingRemapper.INSTANCE;
|
||||
remapper.setupLoadOnly(deobfData, false);
|
||||
JarFile sourceZip = new JarFile(sourceJar);
|
||||
boolean kill = killTarget.equalsIgnoreCase("true");
|
||||
|
||||
File f = new File(outputDir);
|
||||
f.mkdirs();
|
||||
|
||||
for (String name : remapper.getObfedClasses())
|
||||
{
|
||||
// Logger.getLogger("GENDIFF").info(String.format("Evaluating path for data :%s",name));
|
||||
File targetFile = new File(targetDir, name.replace('/', File.separatorChar) + ".class");
|
||||
if (targetFile.exists())
|
||||
{
|
||||
String sourceClassName = name.replace('/', '.');
|
||||
String targetClassName = remapper.map(name).replace('/', '.');
|
||||
JarEntry entry = sourceZip.getJarEntry(name);
|
||||
|
||||
byte[] vanillaBytes = entry != null ? ByteStreams.toByteArray(sourceZip.getInputStream(entry)) : new byte[0];
|
||||
byte[] patchedBytes = Files.toByteArray(targetFile);
|
||||
|
||||
byte[] diff = delta.compute(vanillaBytes, patchedBytes);
|
||||
|
||||
ByteArrayDataOutput diffOut = ByteStreams.newDataOutput(diff.length + 50);
|
||||
// Original name
|
||||
diffOut.writeUTF(name);
|
||||
// Source name
|
||||
diffOut.writeUTF(sourceClassName);
|
||||
// Target name
|
||||
diffOut.writeUTF(targetClassName);
|
||||
// exists at original
|
||||
diffOut.writeBoolean(entry != null);
|
||||
// length of patch
|
||||
diffOut.writeInt(diff.length);
|
||||
// patch
|
||||
diffOut.write(diff);
|
||||
|
||||
File target = new File(outputDir, targetClassName+".binpatch");
|
||||
target.getParentFile().mkdirs();
|
||||
Files.write(diffOut.toByteArray(), target);
|
||||
Logger.getLogger("GENDIFF").info(String.format("Wrote patch for %s (%s) at %s",name, targetClassName, target.getAbsolutePath()));
|
||||
if (kill)
|
||||
{
|
||||
targetFile.delete();
|
||||
Logger.getLogger("GENDIFF").info(String.format(" Deleted target: %s", targetFile.toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
sourceZip.close();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -25,11 +25,17 @@ import java.util.logging.Level;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockSand;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.base.Joiner.MapJoiner;
|
||||
import com.google.common.collect.HashBasedTable;
|
||||
import com.google.common.collect.ImmutableListMultimap;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableTable;
|
||||
import com.google.common.collect.ImmutableTable.Builder;
|
||||
@@ -40,6 +46,7 @@ import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.Table;
|
||||
import com.google.common.collect.Table.Cell;
|
||||
import com.google.common.io.Files;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.common.Loader;
|
||||
@@ -54,6 +61,7 @@ public class GameData {
|
||||
private static boolean shouldContinue = true;
|
||||
private static boolean isSaveValid = true;
|
||||
private static ImmutableTable<String, String, Integer> modObjectTable;
|
||||
private static Table<String, String, ItemStack> customItemStacks = HashBasedTable.create();
|
||||
private static Map<String,String> ignoredMods;
|
||||
|
||||
private static boolean isModIgnoredForIdValidation(String modId)
|
||||
@@ -277,7 +285,7 @@ public class GameData {
|
||||
}
|
||||
static Item findItem(String modId, String name)
|
||||
{
|
||||
if (modObjectTable == null)
|
||||
if (modObjectTable == null || !modObjectTable.contains(modId, name))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
@@ -293,10 +301,65 @@ public class GameData {
|
||||
}
|
||||
|
||||
Integer blockId = modObjectTable.get(modId, name);
|
||||
if (blockId >= Block.field_71973_m.length)
|
||||
if (blockId == null || blockId >= Block.field_71973_m.length)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return Block.field_71973_m[blockId];
|
||||
}
|
||||
|
||||
static ItemStack findItemStack(String modId, String name)
|
||||
{
|
||||
ItemStack is = customItemStacks.get(modId, name);
|
||||
if (is == null)
|
||||
{
|
||||
Item i = findItem(modId, name);
|
||||
if (i != null)
|
||||
{
|
||||
is = new ItemStack(i, 0 ,0);
|
||||
}
|
||||
}
|
||||
if (is == null)
|
||||
{
|
||||
Block b = findBlock(modId, name);
|
||||
if (b != null)
|
||||
{
|
||||
is = new ItemStack(b, 0, Short.MAX_VALUE);
|
||||
}
|
||||
}
|
||||
return is;
|
||||
}
|
||||
|
||||
static void registerCustomItemStack(String name, ItemStack itemStack)
|
||||
{
|
||||
customItemStacks.put(Loader.instance().activeModContainer().getModId(), name, itemStack);
|
||||
}
|
||||
|
||||
public static void dumpRegistry(File minecraftDir)
|
||||
{
|
||||
if (customItemStacks == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (Boolean.valueOf(System.getProperty("fml.dumpRegistry", "false")).booleanValue())
|
||||
{
|
||||
ImmutableListMultimap.Builder<String, String> builder = ImmutableListMultimap.builder();
|
||||
for (String modId : customItemStacks.rowKeySet())
|
||||
{
|
||||
builder.putAll(modId, customItemStacks.row(modId).keySet());
|
||||
}
|
||||
|
||||
File f = new File(minecraftDir, "itemStackRegistry.csv");
|
||||
MapJoiner mapJoiner = Joiner.on("\n").withKeyValueSeparator(",");
|
||||
try
|
||||
{
|
||||
Files.write(mapJoiner.join(builder.build().entries()), f, Charsets.UTF_8);
|
||||
FMLLog.log(Level.INFO, "Dumped item registry data to %s", f.getAbsolutePath());
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
FMLLog.log(Level.SEVERE, e, "Failed to write registry data to %s", f.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -221,7 +221,7 @@ public class GameRegistry
|
||||
}
|
||||
catch (NoSuchMethodException e)
|
||||
{
|
||||
itemCtor = itemclass.getConstructor(int.class, Block.class);
|
||||
itemCtor = itemclass.getConstructor(int.class, net.minecraft.block.Block.class);
|
||||
i = itemCtor.newInstance(blockItemId, block);
|
||||
}
|
||||
GameRegistry.registerItem(i,name, modId);
|
||||
@@ -275,7 +275,7 @@ public class GameRegistry
|
||||
public static void registerTileEntityWithAlternatives(Class<? extends TileEntity> tileEntityClass, String id, String... alternatives)
|
||||
{
|
||||
TileEntity.func_70306_a(tileEntityClass, id);
|
||||
Map<String,Class> teMappings = ObfuscationReflectionHelper.getPrivateValue(TileEntity.class, null, "field_70326_a", "a");
|
||||
Map<String,Class> teMappings = ObfuscationReflectionHelper.getPrivateValue(TileEntity.class, null, "field_" + "70326_a", "field_70326_a", "a");
|
||||
for (String s: alternatives)
|
||||
{
|
||||
if (!teMappings.containsKey(s))
|
||||
@@ -394,4 +394,40 @@ public class GameRegistry
|
||||
{
|
||||
return GameData.findItem(modId, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Manually register a custom item stack with FML for later tracking. It is automatically scoped with the active modid
|
||||
*
|
||||
* @param name The name to register it under
|
||||
* @param itemStack The itemstack to register
|
||||
*/
|
||||
public static void registerCustomItemStack(String name, ItemStack itemStack)
|
||||
{
|
||||
GameData.registerCustomItemStack(name, itemStack);
|
||||
}
|
||||
/**
|
||||
* Lookup an itemstack based on mod and name. It will create "default" itemstacks from blocks and items if no
|
||||
* explicit itemstack is found.
|
||||
*
|
||||
* If it is built from a block, the metadata is by default the "wildcard" value.
|
||||
*
|
||||
* Custom itemstacks can be dumped from minecraft by setting the system property fml.dumpRegistry to true
|
||||
* (-Dfml.dumpRegistry=true on the command line will work)
|
||||
*
|
||||
* @param modId The modid of the stack owner
|
||||
* @param name The name of the stack
|
||||
* @param stackSize The size of the stack returned
|
||||
* @return The custom itemstack or null if no such itemstack was found
|
||||
*/
|
||||
public static ItemStack findItemStack(String modId, String name, int stackSize)
|
||||
{
|
||||
ItemStack foundStack = GameData.findItemStack(modId, name);
|
||||
if (foundStack != null)
|
||||
{
|
||||
ItemStack is = foundStack.func_77946_l();
|
||||
is.field_77994_a = Math.min(stackSize, is.func_77976_d());
|
||||
return is;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -28,6 +28,7 @@ import cpw.mods.fml.common.Loader;
|
||||
import cpw.mods.fml.common.ModContainer;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.StringTranslate;
|
||||
@@ -45,7 +46,7 @@ public class LanguageRegistry
|
||||
|
||||
public String getStringLocalization(String key)
|
||||
{
|
||||
return getStringLocalization(key, StringTranslate.func_74808_a().func_74811_c());
|
||||
return getStringLocalization(key, Minecraft.func_71410_x().func_135016_M().func_135041_c().func_135034_a());
|
||||
}
|
||||
|
||||
public String getStringLocalization(String key, String lang)
|
||||
@@ -93,9 +94,9 @@ public class LanguageRegistry
|
||||
|
||||
public static void reloadLanguageTable()
|
||||
{
|
||||
// reload language table by forcing lang to null and reloading the properties file
|
||||
String lang = StringTranslate.func_74808_a().func_74811_c();
|
||||
StringTranslate.func_74808_a().func_74810_a(lang, true);
|
||||
// // reload language table by forcing lang to null and reloading the properties file
|
||||
// String lang = StringTranslate.func_74808_a().func_74811_c();
|
||||
// StringTranslate.func_74808_a().func_74810_a(lang, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -120,17 +121,17 @@ public class LanguageRegistry
|
||||
instance().addNameForObject(objectToName, "en_US", name);
|
||||
}
|
||||
|
||||
public void loadLanguageTable(Properties languagePack, String lang)
|
||||
public void loadLanguageTable(Map field_135032_a, String lang)
|
||||
{
|
||||
Properties usPack=modLanguageData.get("en_US");
|
||||
if (usPack!=null) {
|
||||
languagePack.putAll(usPack);
|
||||
field_135032_a.putAll(usPack);
|
||||
}
|
||||
Properties langPack=modLanguageData.get(lang);
|
||||
if (langPack==null) {
|
||||
return;
|
||||
}
|
||||
languagePack.putAll(langPack);
|
||||
field_135032_a.putAll(langPack);
|
||||
}
|
||||
|
||||
public void loadLocalization(String localizationFile, String lang, boolean isXML)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -19,6 +19,7 @@ import java.util.Random;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
|
||||
import net.minecraft.client.resources.ResourceLocation;
|
||||
import net.minecraft.entity.passive.EntityVillager;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.util.Tuple;
|
||||
@@ -32,6 +33,8 @@ import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Multimap;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
|
||||
/**
|
||||
* Registry for villager trading control
|
||||
@@ -45,8 +48,9 @@ public class VillagerRegistry
|
||||
|
||||
private Multimap<Integer, IVillageTradeHandler> tradeHandlers = ArrayListMultimap.create();
|
||||
private Map<Class<?>, IVillageCreationHandler> villageCreationHandlers = Maps.newHashMap();
|
||||
private Map<Integer, String> newVillagers = Maps.newHashMap();
|
||||
private List<Integer> newVillagerIds = Lists.newArrayList();
|
||||
@SideOnly(Side.CLIENT)
|
||||
private Map<Integer, ResourceLocation> newVillagers;
|
||||
|
||||
/**
|
||||
* Allow access to the {@link net.minecraft.world.gen.structure.StructureVillagePieces} array controlling new village
|
||||
@@ -110,21 +114,33 @@ public class VillagerRegistry
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register your villager id
|
||||
* @param id
|
||||
*/
|
||||
public void registerVillagerId(int id)
|
||||
{
|
||||
if (newVillagerIds.contains(id))
|
||||
{
|
||||
FMLLog.severe("Attempt to register duplicate villager id %d", id);
|
||||
throw new RuntimeException();
|
||||
}
|
||||
newVillagerIds.add(id);
|
||||
}
|
||||
/**
|
||||
* Register a new skin for a villager type
|
||||
*
|
||||
* @param villagerId
|
||||
* @param villagerSkin
|
||||
*/
|
||||
public void registerVillagerType(int villagerId, String villagerSkin)
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void registerVillagerSkin(int villagerId, ResourceLocation villagerSkin)
|
||||
{
|
||||
if (newVillagers.containsKey(villagerId))
|
||||
if (newVillagers == null)
|
||||
{
|
||||
FMLLog.severe("Attempt to register duplicate villager id %d", villagerId);
|
||||
throw new RuntimeException();
|
||||
newVillagers = Maps.newHashMap();
|
||||
}
|
||||
newVillagers.put(villagerId, villagerSkin);
|
||||
newVillagerIds.add(villagerId);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -154,7 +170,8 @@ public class VillagerRegistry
|
||||
* @param villagerType
|
||||
* @param defaultSkin
|
||||
*/
|
||||
public static String getVillagerSkin(int villagerType, String defaultSkin)
|
||||
@SideOnly(Side.CLIENT)
|
||||
public static ResourceLocation getVillagerSkin(int villagerType, ResourceLocation defaultSkin)
|
||||
{
|
||||
if (instance().newVillagers.containsKey(villagerType))
|
||||
{
|
||||
|
||||
@@ -32,10 +32,10 @@ public class ModSorter
|
||||
{
|
||||
private DirectedGraph<ModContainer> modGraph;
|
||||
|
||||
private ModContainer beforeAll = new DummyModContainer();
|
||||
private ModContainer afterAll = new DummyModContainer();
|
||||
private ModContainer before = new DummyModContainer();
|
||||
private ModContainer after = new DummyModContainer();
|
||||
private ModContainer beforeAll = new DummyModContainer("BeforeAll");
|
||||
private ModContainer afterAll = new DummyModContainer("AfterAll");
|
||||
private ModContainer before = new DummyModContainer("Before");
|
||||
private ModContainer after = new DummyModContainer("After");
|
||||
|
||||
public ModSorter(List<ModContainer> modList, Map<String, ModContainer> nameLookup)
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -25,6 +25,11 @@ import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.Sets.SetView;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
|
||||
/**
|
||||
* Topological sort for mod loading
|
||||
*
|
||||
@@ -174,8 +179,14 @@ public class TopologicalSort
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.printf("%s: %s\n%s\n%s\n", node, sortedResult, visitedNodes, expandedNodes);
|
||||
throw new ModSortingException("There was a cycle detected in the input graph, sorting is not possible", node, visitedNodes);
|
||||
FMLLog.severe("Mod Sorting failed.");
|
||||
FMLLog.severe("Visting node %s", node);
|
||||
FMLLog.severe("Current sorted list : %s", sortedResult);
|
||||
FMLLog.severe("Visited set for this node : %s", visitedNodes);
|
||||
FMLLog.severe("Explored node set : %s", expandedNodes);
|
||||
SetView<T> cycleList = Sets.difference(visitedNodes, expandedNodes);
|
||||
FMLLog.severe("Likely cycle is in : %s", cycleList);
|
||||
throw new ModSortingException("There was a cycle detected in the input graph, sorting is not possible", node, cycleList);
|
||||
}
|
||||
|
||||
// Visit this node
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -98,4 +98,9 @@ public class DefaultArtifactVersion implements ArtifactVersion
|
||||
{
|
||||
return label == null ? comparableVersion.toString() : label + ( unbounded ? "" : "@" + range);
|
||||
}
|
||||
|
||||
public VersionRange getRange()
|
||||
{
|
||||
return range;
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -549,4 +549,15 @@ public class VersionRange
|
||||
hash = 31 * hash + ( restrictions == null ? 0 : restrictions.hashCode() );
|
||||
return hash;
|
||||
}
|
||||
|
||||
public boolean isUnboundedAbove()
|
||||
{
|
||||
return restrictions.size() == 1 && restrictions.get(0).getUpperBound() == null && !restrictions.get(0).isUpperBoundInclusive();
|
||||
}
|
||||
|
||||
public String getLowerBoundString()
|
||||
{
|
||||
return restrictions.size() == 1 ? restrictions.get(0).getLowerBound().getVersionString() : "";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
/*
|
||||
* Forge Mod Loader
|
||||
* Copyright (c) 2012-2013 cpw.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
public class ArgsWrapper
|
||||
{
|
||||
public ArgsWrapper(String[] args)
|
||||
{
|
||||
this.args=args;
|
||||
}
|
||||
|
||||
public String[] args;
|
||||
}
|
||||
+49
-21
@@ -37,10 +37,13 @@ import java.util.jar.Attributes;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
import cpw.mods.fml.common.CertificateHelper;
|
||||
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion;
|
||||
import cpw.mods.fml.relauncher.IFMLLoadingPlugin.TransformerExclusions;
|
||||
|
||||
public class RelaunchLibraryManager
|
||||
public class CoreModManager
|
||||
{
|
||||
private static String[] rootPlugins = { "cpw.mods.fml.relauncher.FMLCorePlugin" , "net.minecraftforge.classloading.FMLForgePlugin" };
|
||||
private static List<String> loadedLibraries = new ArrayList<String>();
|
||||
@@ -49,12 +52,12 @@ public class RelaunchLibraryManager
|
||||
private static List<ILibrarySet> libraries;
|
||||
private static boolean deobfuscatedEnvironment;
|
||||
|
||||
public static void handleLaunch(File mcDir, RelaunchClassLoader actualClassLoader)
|
||||
public static void handleLaunch(File mcDir, LaunchClassLoader classLoader)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Are we in a 'decompiled' environment?
|
||||
byte[] bs = actualClassLoader.getClassBytes("net.minecraft.world.World");
|
||||
byte[] bs = classLoader.getClassBytes("net.minecraft.world.World");
|
||||
if (bs != null)
|
||||
{
|
||||
FMLRelaunchLog.info("Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation");
|
||||
@@ -71,17 +74,13 @@ public class RelaunchLibraryManager
|
||||
}
|
||||
pluginLocations = new HashMap<IFMLLoadingPlugin, File>();
|
||||
loadPlugins = new ArrayList<IFMLLoadingPlugin>();
|
||||
libraries = new ArrayList<ILibrarySet>();
|
||||
for (String s : rootPlugins)
|
||||
{
|
||||
try
|
||||
{
|
||||
IFMLLoadingPlugin plugin = (IFMLLoadingPlugin) Class.forName(s, true, actualClassLoader).newInstance();
|
||||
FMLRelaunchLog.finest("Adding coremod for loading %s", s);
|
||||
IFMLLoadingPlugin plugin = (IFMLLoadingPlugin) Class.forName(s, true, classLoader).newInstance();
|
||||
loadPlugins.add(plugin);
|
||||
for (String libName : plugin.getLibraryRequestClass())
|
||||
{
|
||||
libraries.add((ILibrarySet) Class.forName(libName, true, actualClassLoader).newInstance());
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -106,14 +105,14 @@ public class RelaunchLibraryManager
|
||||
FMLRelaunchLog.info("Found a command line coremod : %s", s);
|
||||
try
|
||||
{
|
||||
actualClassLoader.addTransformerExclusion(s);
|
||||
Class<?> coreModClass = Class.forName(s, true, actualClassLoader);
|
||||
classLoader.addTransformerExclusion(s);
|
||||
Class<?> coreModClass = Class.forName(s, true, classLoader);
|
||||
TransformerExclusions trExclusions = coreModClass.getAnnotation(IFMLLoadingPlugin.TransformerExclusions.class);
|
||||
if (trExclusions!=null)
|
||||
{
|
||||
for (String st : trExclusions.value())
|
||||
{
|
||||
actualClassLoader.addTransformerExclusion(st);
|
||||
classLoader.addTransformerExclusion(st);
|
||||
}
|
||||
}
|
||||
IFMLLoadingPlugin plugin = (IFMLLoadingPlugin) coreModClass.newInstance();
|
||||
@@ -122,7 +121,7 @@ public class RelaunchLibraryManager
|
||||
{
|
||||
for (String libName : plugin.getLibraryRequestClass())
|
||||
{
|
||||
libraries.add((ILibrarySet) Class.forName(libName, true, actualClassLoader).newInstance());
|
||||
libraries.add((ILibrarySet) Class.forName(libName, true, classLoader).newInstance());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -132,7 +131,7 @@ public class RelaunchLibraryManager
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
discoverCoreMods(mcDir, actualClassLoader, loadPlugins, libraries);
|
||||
discoverCoreMods(mcDir, classLoader, loadPlugins, libraries);
|
||||
|
||||
List<Throwable> caughtErrors = new ArrayList<Throwable>();
|
||||
try
|
||||
@@ -148,6 +147,7 @@ public class RelaunchLibraryManager
|
||||
return;
|
||||
}
|
||||
|
||||
libraries = new ArrayList<ILibrarySet>();
|
||||
for (ILibrarySet lib : libraries)
|
||||
{
|
||||
for (int i=0; i<lib.getLibraries().length; i++)
|
||||
@@ -212,7 +212,7 @@ public class RelaunchLibraryManager
|
||||
|
||||
try
|
||||
{
|
||||
actualClassLoader.addURL(libFile.toURI().toURL());
|
||||
classLoader.addURL(libFile.toURI().toURL());
|
||||
loadedLibraries.add(libName);
|
||||
}
|
||||
catch (MalformedURLException e)
|
||||
@@ -267,19 +267,21 @@ public class RelaunchLibraryManager
|
||||
{
|
||||
for (String xformClass : plug.getASMTransformerClass())
|
||||
{
|
||||
actualClassLoader.registerTransformer(xformClass);
|
||||
FMLRelaunchLog.finest("Registering transformer %s", xformClass);
|
||||
classLoader.registerTransformer(xformClass);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Deobfuscation transformer, always last
|
||||
if (!deobfuscatedEnvironment)
|
||||
{
|
||||
actualClassLoader.registerTransformer("cpw.mods.fml.common.asm.transformers.DeobfuscationTransformer");
|
||||
classLoader.registerTransformer("cpw.mods.fml.common.asm.transformers.DeobfuscationTransformer");
|
||||
}
|
||||
downloadMonitor.updateProgressString("Running coremod plugins");
|
||||
Map<String,Object> data = new HashMap<String,Object>();
|
||||
data.put("mcLocation", mcDir);
|
||||
data.put("coremodList", loadPlugins);
|
||||
data.put("runtimeDeobfuscationEnabled", !deobfuscatedEnvironment);
|
||||
for (IFMLLoadingPlugin plugin : loadPlugins)
|
||||
{
|
||||
downloadMonitor.updateProgressString("Running coremod plugin %s", plugin.getClass().getSimpleName());
|
||||
@@ -290,9 +292,11 @@ public class RelaunchLibraryManager
|
||||
{
|
||||
try
|
||||
{
|
||||
IFMLCallHook call = (IFMLCallHook) Class.forName(setupClass, true, actualClassLoader).newInstance();
|
||||
IFMLCallHook call = (IFMLCallHook) Class.forName(setupClass, true, classLoader).newInstance();
|
||||
Map<String,Object> callData = new HashMap<String, Object>();
|
||||
callData.put("classLoader", actualClassLoader);
|
||||
callData.put("mcLocation", mcDir);
|
||||
callData.put("classLoader", classLoader);
|
||||
callData.put("coremodLocation", pluginLocations.get(plugin));
|
||||
callData.put("deobfuscationFileName", FMLInjectionData.debfuscationDataName());
|
||||
call.injectData(callData);
|
||||
call.call();
|
||||
@@ -313,7 +317,7 @@ public class RelaunchLibraryManager
|
||||
try
|
||||
{
|
||||
downloadMonitor.updateProgressString("Validating minecraft");
|
||||
Class<?> loaderClazz = Class.forName("cpw.mods.fml.common.Loader", true, actualClassLoader);
|
||||
Class<?> loaderClazz = Class.forName("cpw.mods.fml.common.Loader", true, classLoader);
|
||||
Method m = loaderClazz.getMethod("injectData", Object[].class);
|
||||
m.invoke(null, (Object)FMLInjectionData.data());
|
||||
m = loaderClazz.getMethod("instance");
|
||||
@@ -329,7 +333,7 @@ public class RelaunchLibraryManager
|
||||
}
|
||||
}
|
||||
|
||||
private static void discoverCoreMods(File mcDir, RelaunchClassLoader classLoader, List<IFMLLoadingPlugin> loadPlugins, List<ILibrarySet> libraries)
|
||||
private static void discoverCoreMods(File mcDir, LaunchClassLoader classLoader, List<IFMLLoadingPlugin> loadPlugins, List<ILibrarySet> libraries)
|
||||
{
|
||||
downloadMonitor.updateProgressString("Discovering coremods");
|
||||
File coreMods = setupCoreModDir(mcDir);
|
||||
@@ -352,6 +356,11 @@ public class RelaunchLibraryManager
|
||||
try
|
||||
{
|
||||
jar = new JarFile(coreMod);
|
||||
if (jar.getManifest() == null)
|
||||
{
|
||||
FMLRelaunchLog.warning("Found an un-manifested jar file in the coremods folder : %s, it will be ignored.", coreMod.getName());
|
||||
continue;
|
||||
}
|
||||
mfAttributes = jar.getManifest().getMainAttributes();
|
||||
}
|
||||
catch (IOException ioe)
|
||||
@@ -398,6 +407,25 @@ public class RelaunchLibraryManager
|
||||
downloadMonitor.updateProgressString("Loading coremod %s", coreMod.getName());
|
||||
classLoader.addTransformerExclusion(fmlCorePlugin);
|
||||
Class<?> coreModClass = Class.forName(fmlCorePlugin, true, classLoader);
|
||||
MCVersion requiredMCVersion = coreModClass.getAnnotation(IFMLLoadingPlugin.MCVersion.class);
|
||||
String version = "";
|
||||
if (requiredMCVersion == null)
|
||||
{
|
||||
FMLRelaunchLog.log(Level.WARNING, "The coremod %s does not have a MCVersion annotation, it may cause issues with this version of Minecraft", fmlCorePlugin);
|
||||
}
|
||||
else
|
||||
{
|
||||
version = requiredMCVersion.value();
|
||||
}
|
||||
if (!"".equals(version) && !FMLInjectionData.mccversion.equals(version))
|
||||
{
|
||||
FMLRelaunchLog.log(Level.SEVERE, "The coremod %s is requesting minecraft version %s and minecraft is %s. It will be ignored.", fmlCorePlugin, version, FMLInjectionData.mccversion);
|
||||
continue;
|
||||
}
|
||||
else if (!"".equals(version))
|
||||
{
|
||||
FMLRelaunchLog.log(Level.FINE, "The coremod %s requested minecraft version %s and minecraft is %s. It will be loaded.", fmlCorePlugin, version, FMLInjectionData.mccversion);
|
||||
}
|
||||
TransformerExclusions trExclusions = coreModClass.getAnnotation(IFMLLoadingPlugin.TransformerExclusions.class);
|
||||
if (trExclusions!=null)
|
||||
{
|
||||
@@ -5,13 +5,15 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class DummyDownloader implements IDownloadDisplay
|
||||
{
|
||||
|
||||
@@ -46,8 +48,7 @@ public class DummyDownloader implements IDownloadDisplay
|
||||
@Override
|
||||
public void updateProgressString(String string, Object... data)
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
FMLRelaunchLog.log(Level.FINE, string, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -26,6 +26,7 @@ public class FMLCorePlugin implements IFMLLoadingPlugin
|
||||
public String[] getASMTransformerClass()
|
||||
{
|
||||
return new String[] {
|
||||
"cpw.mods.fml.common.asm.transformers.PatchingTransformer",
|
||||
"cpw.mods.fml.common.asm.transformers.AccessTransformer",
|
||||
"cpw.mods.fml.common.asm.transformers.MarkerTransformer",
|
||||
"cpw.mods.fml.common.asm.transformers.SideTransformer",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -20,6 +20,8 @@ import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
public class FMLInjectionData
|
||||
{
|
||||
static File minecraftHome;
|
||||
@@ -33,7 +35,7 @@ public class FMLInjectionData
|
||||
|
||||
public static List<String> containers = new ArrayList<String>();
|
||||
|
||||
static void build(File mcHome, RelaunchClassLoader classLoader)
|
||||
static void build(File mcHome, LaunchClassLoader classLoader)
|
||||
{
|
||||
minecraftHome = mcHome;
|
||||
InputStream stream = classLoader.getResourceAsStream("fmlversion.properties");
|
||||
@@ -62,7 +64,7 @@ public class FMLInjectionData
|
||||
|
||||
static String debfuscationDataName()
|
||||
{
|
||||
return "deobfuscation_data_"+mccversion+".zip";
|
||||
return "/deobfuscation_data-"+mccversion+".lzma";
|
||||
}
|
||||
public static Object[] data()
|
||||
{
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Forge Mod Loader
|
||||
* Copyright (c) 2012-2013 cpw.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
|
||||
import cpw.mods.fml.common.launcher.FMLTweaker;
|
||||
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
public class FMLLaunchHandler
|
||||
{
|
||||
private static FMLLaunchHandler INSTANCE;
|
||||
static Side side;
|
||||
private LaunchClassLoader classLoader;
|
||||
private FMLTweaker tweaker;
|
||||
private File minecraftHome;
|
||||
|
||||
public static void configureForClientLaunch(LaunchClassLoader loader, FMLTweaker tweaker)
|
||||
{
|
||||
instance(loader, tweaker).setupClient();
|
||||
}
|
||||
|
||||
public static void configureForServerLaunch(LaunchClassLoader loader, FMLTweaker tweaker)
|
||||
{
|
||||
instance(loader, tweaker).setupServer();
|
||||
}
|
||||
|
||||
private static FMLLaunchHandler instance(LaunchClassLoader launchLoader, FMLTweaker tweaker)
|
||||
{
|
||||
if (INSTANCE == null)
|
||||
{
|
||||
INSTANCE = new FMLLaunchHandler(launchLoader, tweaker);
|
||||
}
|
||||
return INSTANCE;
|
||||
|
||||
}
|
||||
|
||||
private FMLLaunchHandler(LaunchClassLoader launchLoader, FMLTweaker tweaker)
|
||||
{
|
||||
this.classLoader = launchLoader;
|
||||
this.tweaker = tweaker;
|
||||
this.minecraftHome = tweaker.getGameDir();
|
||||
this.classLoader.addClassLoaderExclusion("cpw.mods.fml.relauncher.");
|
||||
this.classLoader.addClassLoaderExclusion("net.minecraftforge.classloading.");
|
||||
this.classLoader.addTransformerExclusion("cpw.mods.fml.common.asm.transformers.deobf.");
|
||||
this.classLoader.addTransformerExclusion("cpw.mods.fml.common.patcher.");
|
||||
}
|
||||
|
||||
private void showWindow(boolean showIt)
|
||||
{
|
||||
if (CoreModManager.downloadMonitor != null) { return; }
|
||||
CoreModManager.downloadMonitor = new DummyDownloader();
|
||||
}
|
||||
|
||||
private void setupClient()
|
||||
{
|
||||
showWindow(true);
|
||||
FMLRelaunchLog.logFileNamePattern = "ForgeModLoader-client-%g.log";
|
||||
side = Side.CLIENT;
|
||||
setupHome();
|
||||
}
|
||||
|
||||
private void setupServer()
|
||||
{
|
||||
showWindow(false);
|
||||
FMLRelaunchLog.logFileNamePattern = "ForgeModLoader-server-%g.log";
|
||||
side = Side.SERVER;
|
||||
setupHome();
|
||||
|
||||
}
|
||||
|
||||
private void setupHome()
|
||||
{
|
||||
FMLInjectionData.build(minecraftHome, classLoader);
|
||||
FMLRelaunchLog.minecraftHome = minecraftHome;
|
||||
FMLRelaunchLog.info("Forge Mod Loader version %s.%s.%s.%s for Minecraft %s loading", FMLInjectionData.major, FMLInjectionData.minor,
|
||||
FMLInjectionData.rev, FMLInjectionData.build, FMLInjectionData.mccversion, FMLInjectionData.mcpversion);
|
||||
FMLRelaunchLog.info("Java is %s, version %s, running on %s:%s:%s, installed at %s", System.getProperty("java.vm.name"), System.getProperty("java.version"), System.getProperty("os.name"), System.getProperty("os.arch"), System.getProperty("os.version"), System.getProperty("java.home"));
|
||||
FMLRelaunchLog.fine("Java classpath at launch is %s", System.getProperty("java.class.path"));
|
||||
FMLRelaunchLog.fine("Java library path at launch is %s", System.getProperty("java.library.path"));
|
||||
|
||||
try
|
||||
{
|
||||
CoreModManager.handleLaunch(minecraftHome, classLoader);
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
t.printStackTrace();
|
||||
FMLRelaunchLog.log(Level.SEVERE, t, "An error occurred trying to configure the minecraft home at %s for Forge Mod Loader", minecraftHome.getAbsolutePath());
|
||||
throw Throwables.propagate(t);
|
||||
}
|
||||
}
|
||||
|
||||
public static Side side()
|
||||
{
|
||||
return side;
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -28,6 +28,10 @@ import java.util.logging.LogManager;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import net.minecraft.launchwrapper.LogWrapper;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
|
||||
public class FMLRelaunchLog
|
||||
{
|
||||
|
||||
@@ -110,16 +114,20 @@ public class FMLRelaunchLog
|
||||
super.reset();
|
||||
|
||||
currentMessage.append(record.replace(FMLLogFormatter.LINE_SEPARATOR, "\n"));
|
||||
if (currentMessage.lastIndexOf("\n")>=0)
|
||||
// Are we longer than just the line separator?
|
||||
int lastIdx = -1;
|
||||
int idx = currentMessage.indexOf("\n",lastIdx+1);
|
||||
while (idx >= 0)
|
||||
{
|
||||
// Are we longer than just the line separator?
|
||||
if (currentMessage.length()>1)
|
||||
{
|
||||
// Trim the line separator
|
||||
currentMessage.setLength(currentMessage.length()-1);
|
||||
log.log(Level.INFO, currentMessage.toString());
|
||||
}
|
||||
log.log(Level.INFO, currentMessage.substring(lastIdx+1,idx));
|
||||
lastIdx = idx;
|
||||
idx = currentMessage.indexOf("\n",lastIdx+1);
|
||||
}
|
||||
if (lastIdx >= 0)
|
||||
{
|
||||
String rem = currentMessage.substring(lastIdx+1);
|
||||
currentMessage.setLength(0);
|
||||
currentMessage.append(rem);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -142,6 +150,8 @@ public class FMLRelaunchLog
|
||||
|
||||
private static FMLLogFormatter formatter;
|
||||
|
||||
static String logFileNamePattern;
|
||||
|
||||
private FMLRelaunchLog()
|
||||
{
|
||||
}
|
||||
@@ -155,6 +165,7 @@ public class FMLRelaunchLog
|
||||
globalLogger.setLevel(Level.OFF);
|
||||
|
||||
log.myLog = Logger.getLogger("ForgeModLoader");
|
||||
LogWrapper.retarget(log.myLog);
|
||||
|
||||
Logger stdOut = Logger.getLogger("STDOUT");
|
||||
stdOut.setParent(log.myLog);
|
||||
@@ -168,7 +179,7 @@ public class FMLRelaunchLog
|
||||
formatter = new FMLLogFormatter();
|
||||
try
|
||||
{
|
||||
File logPath = new File(minecraftHome, FMLRelauncher.logFileNamePattern);
|
||||
File logPath = new File(minecraftHome, logFileNamePattern);
|
||||
fileHandler = new FileHandler(logPath.getPath(), 0, 3)
|
||||
{
|
||||
public synchronized void close() throws SecurityException {
|
||||
@@ -176,8 +187,9 @@ public class FMLRelaunchLog
|
||||
}
|
||||
};
|
||||
}
|
||||
catch (Exception e)
|
||||
catch (Throwable t)
|
||||
{
|
||||
throw Throwables.propagate(t);
|
||||
}
|
||||
|
||||
resetLoggingHandlers();
|
||||
|
||||
@@ -1,329 +0,0 @@
|
||||
/*
|
||||
* Forge Mod Loader
|
||||
* Copyright (c) 2012-2013 cpw.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URLClassLoader;
|
||||
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
public class FMLRelauncher
|
||||
{
|
||||
private static FMLRelauncher INSTANCE;
|
||||
public static String logFileNamePattern;
|
||||
private static String side;
|
||||
private RelaunchClassLoader classLoader;
|
||||
private Object newApplet;
|
||||
private Class<? super Object> appletClass;
|
||||
|
||||
JDialog popupWindow;
|
||||
|
||||
public static void handleClientRelaunch(ArgsWrapper wrap)
|
||||
{
|
||||
logFileNamePattern = "ForgeModLoader-client-%g.log";
|
||||
side = "CLIENT";
|
||||
instance().relaunchClient(wrap);
|
||||
}
|
||||
|
||||
public static void handleServerRelaunch(ArgsWrapper wrap)
|
||||
{
|
||||
logFileNamePattern = "ForgeModLoader-server-%g.log";
|
||||
side = "SERVER";
|
||||
instance().relaunchServer(wrap);
|
||||
}
|
||||
|
||||
static FMLRelauncher instance()
|
||||
{
|
||||
if (INSTANCE == null)
|
||||
{
|
||||
INSTANCE = new FMLRelauncher();
|
||||
}
|
||||
return INSTANCE;
|
||||
|
||||
}
|
||||
|
||||
private FMLRelauncher()
|
||||
{
|
||||
URLClassLoader ucl = (URLClassLoader) getClass().getClassLoader();
|
||||
|
||||
classLoader = new RelaunchClassLoader(ucl.getURLs());
|
||||
|
||||
}
|
||||
|
||||
private void showWindow(boolean showIt)
|
||||
{
|
||||
if (RelaunchLibraryManager.downloadMonitor != null) { return; }
|
||||
try
|
||||
{
|
||||
if (showIt)
|
||||
{
|
||||
RelaunchLibraryManager.downloadMonitor = new Downloader();
|
||||
popupWindow = (JDialog) RelaunchLibraryManager.downloadMonitor.makeDialog();
|
||||
}
|
||||
else
|
||||
{
|
||||
RelaunchLibraryManager.downloadMonitor = new DummyDownloader();
|
||||
}
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
if (RelaunchLibraryManager.downloadMonitor == null)
|
||||
{
|
||||
RelaunchLibraryManager.downloadMonitor = new DummyDownloader();
|
||||
e.printStackTrace();
|
||||
}
|
||||
else
|
||||
{
|
||||
RelaunchLibraryManager.downloadMonitor.makeHeadless();
|
||||
}
|
||||
popupWindow = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void relaunchClient(ArgsWrapper wrap)
|
||||
{
|
||||
showWindow(true);
|
||||
// Now we re-inject the home into the "new" minecraft under our control
|
||||
Class<? super Object> client;
|
||||
try
|
||||
{
|
||||
File minecraftHome = computeExistingClientHome();
|
||||
setupHome(minecraftHome);
|
||||
|
||||
client = setupNewClientHome(minecraftHome);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (popupWindow != null)
|
||||
{
|
||||
popupWindow.setVisible(false);
|
||||
popupWindow.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
if (RelaunchLibraryManager.downloadMonitor.shouldStopIt())
|
||||
{
|
||||
System.exit(1);
|
||||
}
|
||||
try
|
||||
{
|
||||
ReflectionHelper.findMethod(client, null, new String[] { "fmlReentry" }, ArgsWrapper.class).invoke(null, wrap);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
// Hmmm
|
||||
}
|
||||
}
|
||||
|
||||
private Class<? super Object> setupNewClientHome(File minecraftHome)
|
||||
{
|
||||
Class<? super Object> client = ReflectionHelper.getClass(classLoader, "net.minecraft.client.Minecraft");
|
||||
ReflectionHelper.setPrivateValue(client, null, minecraftHome, "field_71463_am", "an", "minecraftDir");
|
||||
return client;
|
||||
}
|
||||
|
||||
private void relaunchServer(ArgsWrapper wrap)
|
||||
{
|
||||
showWindow(false);
|
||||
// Now we re-inject the home into the "new" minecraft under our control
|
||||
Class<? super Object> server;
|
||||
File minecraftHome = new File(".");
|
||||
setupHome(minecraftHome);
|
||||
|
||||
server = ReflectionHelper.getClass(classLoader, "net.minecraft.server.MinecraftServer");
|
||||
try
|
||||
{
|
||||
ReflectionHelper.findMethod(server, null, new String[] { "fmlReentry" }, ArgsWrapper.class).invoke(null, wrap);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void setupHome(File minecraftHome)
|
||||
{
|
||||
FMLInjectionData.build(minecraftHome, classLoader);
|
||||
FMLRelaunchLog.minecraftHome = minecraftHome;
|
||||
FMLRelaunchLog.info("Forge Mod Loader version %s.%s.%s.%s for Minecraft %s loading", FMLInjectionData.major, FMLInjectionData.minor,
|
||||
FMLInjectionData.rev, FMLInjectionData.build, FMLInjectionData.mccversion, FMLInjectionData.mcpversion);
|
||||
|
||||
try
|
||||
{
|
||||
RelaunchLibraryManager.handleLaunch(minecraftHome, classLoader);
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
if (popupWindow != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
String logFile = new File(minecraftHome, "ForgeModLoader-client-0.log").getCanonicalPath();
|
||||
JOptionPane.showMessageDialog(popupWindow, String.format(
|
||||
"<html><div align=\"center\"><font size=\"+1\">There was a fatal error starting up minecraft and FML</font></div><br/>"
|
||||
+ "Minecraft cannot launch in it's current configuration<br/>"
|
||||
+ "Please consult the file <i><a href=\"file:///%s\">%s</a></i> for further information</html>", logFile, logFile),
|
||||
"Fatal FML error", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// ah well, we tried
|
||||
}
|
||||
}
|
||||
throw new RuntimeException(t);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the location of the client home
|
||||
*/
|
||||
private File computeExistingClientHome()
|
||||
{
|
||||
Class<? super Object> mcMaster = ReflectionHelper.getClass(getClass().getClassLoader(), "net.minecraft.client.Minecraft");
|
||||
// If we get the system property we inject into the old MC, setup the
|
||||
// dir, then pull the value
|
||||
String str = System.getProperty("minecraft.applet.TargetDirectory");
|
||||
if (str != null)
|
||||
{
|
||||
str = str.replace('/', File.separatorChar);
|
||||
ReflectionHelper.setPrivateValue(mcMaster, null, new File(str), "minecraftDir", "an", "minecraftDir");
|
||||
}
|
||||
// We force minecraft to setup it's homedir very early on so we can
|
||||
// inject stuff into it
|
||||
Method setupHome = ReflectionHelper.findMethod(mcMaster, null, new String[] { "func_71380_b", "getMinecraftDir", "b" });
|
||||
try
|
||||
{
|
||||
setupHome.invoke(null);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// Hmmm
|
||||
}
|
||||
File minecraftHome = ReflectionHelper.getPrivateValue(mcMaster, null, "field_71463_am", "an", "minecraftDir");
|
||||
return minecraftHome;
|
||||
}
|
||||
|
||||
public static void appletEntry(Applet minecraftApplet)
|
||||
{
|
||||
side = "CLIENT";
|
||||
logFileNamePattern = "ForgeModLoader-client-%g.log";
|
||||
instance().relaunchApplet(minecraftApplet);
|
||||
}
|
||||
|
||||
private void relaunchApplet(Applet minecraftApplet)
|
||||
{
|
||||
showWindow(true);
|
||||
|
||||
appletClass = ReflectionHelper.getClass(classLoader, "net.minecraft.client.MinecraftApplet");
|
||||
if (minecraftApplet.getClass().getClassLoader() == classLoader)
|
||||
{
|
||||
if (popupWindow != null)
|
||||
{
|
||||
popupWindow.setVisible(false);
|
||||
popupWindow.dispose();
|
||||
}
|
||||
try
|
||||
{
|
||||
newApplet = minecraftApplet;
|
||||
ReflectionHelper.findMethod(appletClass, newApplet, new String[] { "fmlInitReentry" }).invoke(newApplet);
|
||||
return;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
System.out.println("FMLRelauncher.relaunchApplet");
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
File mcDir = computeExistingClientHome();
|
||||
setupHome(mcDir);
|
||||
setupNewClientHome(mcDir);
|
||||
|
||||
Class<? super Object> parentAppletClass = ReflectionHelper.getClass(getClass().getClassLoader(), "java.applet.Applet");
|
||||
|
||||
try
|
||||
{
|
||||
newApplet = appletClass.newInstance();
|
||||
Object appletContainer = ReflectionHelper.getPrivateValue(ReflectionHelper.getClass(getClass().getClassLoader(), "java.awt.Component"),
|
||||
minecraftApplet, "parent");
|
||||
|
||||
String launcherClassName = System.getProperty("minecraft.applet.WrapperClass", "net.minecraft.Launcher");
|
||||
Class<? super Object> launcherClass = ReflectionHelper.getClass(getClass().getClassLoader(), launcherClassName);
|
||||
if (launcherClass.isInstance(appletContainer))
|
||||
{
|
||||
ReflectionHelper.findMethod(ReflectionHelper.getClass(getClass().getClassLoader(), "java.awt.Container"), minecraftApplet,
|
||||
new String[] { "removeAll" }).invoke(appletContainer);
|
||||
ReflectionHelper.findMethod(launcherClass, appletContainer, new String[] { "replace" }, parentAppletClass).invoke(appletContainer, newApplet);
|
||||
}
|
||||
else
|
||||
{
|
||||
FMLRelaunchLog.severe("Found unknown applet parent %s, unable to inject!\n", appletContainer.getClass().getName());
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (popupWindow != null)
|
||||
{
|
||||
popupWindow.setVisible(false);
|
||||
popupWindow.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void appletStart(Applet applet)
|
||||
{
|
||||
instance().startApplet(applet);
|
||||
}
|
||||
|
||||
private void startApplet(Applet applet)
|
||||
{
|
||||
if (applet.getClass().getClassLoader() == classLoader)
|
||||
{
|
||||
if (popupWindow != null)
|
||||
{
|
||||
popupWindow.setVisible(false);
|
||||
popupWindow.dispose();
|
||||
}
|
||||
if (RelaunchLibraryManager.downloadMonitor.shouldStopIt())
|
||||
{
|
||||
System.exit(1);
|
||||
}
|
||||
try
|
||||
{
|
||||
ReflectionHelper.findMethod(appletClass, newApplet, new String[] { "fmlStartReentry" }).invoke(newApplet);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
System.out.println("FMLRelauncher.startApplet");
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
public static String side()
|
||||
{
|
||||
return side;
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
/*
|
||||
* Forge Mod Loader
|
||||
* Copyright (c) 2012-2013 cpw.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
public interface IClassNameTransformer {
|
||||
public String remapClassName(String name);
|
||||
|
||||
public String unmapClassName(String name);
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
/*
|
||||
* Forge Mod Loader
|
||||
* Copyright (c) 2012-2013 cpw.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
public interface IClassTransformer
|
||||
{
|
||||
public byte[] transform(String name, String transformedName, byte[] bytes);
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -32,6 +32,7 @@ public interface IFMLLoadingPlugin
|
||||
*
|
||||
* @return a list of classes that implement the ILibrarySet interface
|
||||
*/
|
||||
@Deprecated
|
||||
String[] getLibraryRequestClass();
|
||||
/**
|
||||
* Return a list of classes that implements the IClassTransformer interface
|
||||
@@ -87,4 +88,18 @@ public interface IFMLLoadingPlugin
|
||||
{
|
||||
public String[] value() default "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this to target a specific minecraft version for your coremod. It will refuse to load with an error if
|
||||
* minecraft is not this exact version.
|
||||
*
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface MCVersion
|
||||
{
|
||||
public String value() default "";
|
||||
}
|
||||
}
|
||||
@@ -1,395 +0,0 @@
|
||||
/*
|
||||
* Forge Mod Loader
|
||||
* Copyright (c) 2012-2013 cpw.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.JarURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.net.URLConnection;
|
||||
import java.security.CodeSigner;
|
||||
import java.security.CodeSource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.jar.Attributes.Name;
|
||||
import java.util.jar.Attributes;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.jar.Manifest;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import cpw.mods.fml.common.FMLLog;
|
||||
|
||||
public class RelaunchClassLoader extends URLClassLoader
|
||||
{
|
||||
private List<URL> sources;
|
||||
private ClassLoader parent;
|
||||
|
||||
private List<IClassTransformer> transformers;
|
||||
private Map<String, Class> cachedClasses;
|
||||
private Set<String> invalidClasses;
|
||||
|
||||
private Set<String> classLoaderExceptions = new HashSet<String>();
|
||||
private Set<String> transformerExceptions = new HashSet<String>();
|
||||
private Map<Package,Manifest> packageManifests = new HashMap<Package,Manifest>();
|
||||
private IClassNameTransformer renameTransformer;
|
||||
|
||||
private static Manifest EMPTY = new Manifest();
|
||||
|
||||
private ThreadLocal<byte[]> loadBuffer = new ThreadLocal<byte[]>();
|
||||
|
||||
private static final String[] RESERVED = {"CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"};
|
||||
|
||||
private static final boolean DEBUG_CLASSLOADING = Boolean.parseBoolean(System.getProperty("fml.debugClassLoading", "false"));
|
||||
|
||||
public RelaunchClassLoader(URL[] sources)
|
||||
{
|
||||
super(sources, null);
|
||||
this.sources = new ArrayList<URL>(Arrays.asList(sources));
|
||||
this.parent = getClass().getClassLoader();
|
||||
this.cachedClasses = new HashMap<String,Class>(1000);
|
||||
this.invalidClasses = new HashSet<String>(1000);
|
||||
this.transformers = new ArrayList<IClassTransformer>(2);
|
||||
// ReflectionHelper.setPrivateValue(ClassLoader.class, null, this, "scl");
|
||||
Thread.currentThread().setContextClassLoader(this);
|
||||
|
||||
// standard classloader exclusions
|
||||
addClassLoaderExclusion("java.");
|
||||
addClassLoaderExclusion("sun.");
|
||||
addClassLoaderExclusion("org.lwjgl.");
|
||||
addClassLoaderExclusion("cpw.mods.fml.relauncher.");
|
||||
addClassLoaderExclusion("net.minecraftforge.classloading.");
|
||||
|
||||
// standard transformer exclusions
|
||||
addTransformerExclusion("javax.");
|
||||
addTransformerExclusion("argo.");
|
||||
addTransformerExclusion("org.objectweb.asm.");
|
||||
addTransformerExclusion("com.google.common.");
|
||||
addTransformerExclusion("org.bouncycastle.");
|
||||
addTransformerExclusion("cpw.mods.fml.common.asm.transformers.deobf.");
|
||||
}
|
||||
|
||||
public void registerTransformer(String transformerClassName)
|
||||
{
|
||||
try
|
||||
{
|
||||
IClassTransformer transformer = (IClassTransformer) loadClass(transformerClassName).newInstance();
|
||||
transformers.add(transformer);
|
||||
if (transformer instanceof IClassNameTransformer && renameTransformer == null)
|
||||
{
|
||||
renameTransformer = (IClassNameTransformer) transformer;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
FMLRelaunchLog.log(Level.SEVERE, e, "A critical problem occured registering the ASM transformer class %s", transformerClassName);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public Class<?> findClass(String name) throws ClassNotFoundException
|
||||
{
|
||||
if (invalidClasses.contains(name))
|
||||
{
|
||||
throw new ClassNotFoundException(name);
|
||||
}
|
||||
for (String st : classLoaderExceptions)
|
||||
{
|
||||
if (name.startsWith(st))
|
||||
{
|
||||
return parent.loadClass(name);
|
||||
}
|
||||
}
|
||||
|
||||
if (cachedClasses.containsKey(name))
|
||||
{
|
||||
return cachedClasses.get(name);
|
||||
}
|
||||
|
||||
for (String st : transformerExceptions)
|
||||
{
|
||||
if (name.startsWith(st))
|
||||
{
|
||||
try
|
||||
{
|
||||
Class<?> cl = super.findClass(name);
|
||||
cachedClasses.put(name, cl);
|
||||
return cl;
|
||||
}
|
||||
catch (ClassNotFoundException e)
|
||||
{
|
||||
invalidClasses.add(name);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
CodeSigner[] signers = null;
|
||||
String transformedName = transformName(name);
|
||||
String untransformedName = untransformName(name);
|
||||
int lastDot = untransformedName.lastIndexOf('.');
|
||||
String pkgname = lastDot == -1 ? "" : untransformedName.substring(0, lastDot);
|
||||
String fName = untransformedName.replace('.', '/').concat(".class");
|
||||
String pkgPath = pkgname.replace('.', '/');
|
||||
URLConnection urlConnection = findCodeSourceConnectionFor(fName);
|
||||
if (urlConnection instanceof JarURLConnection && lastDot > -1 && !untransformedName.startsWith("net.minecraft."))
|
||||
{
|
||||
JarURLConnection jarUrlConn = (JarURLConnection)urlConnection;
|
||||
JarFile jf = jarUrlConn.getJarFile();
|
||||
if (jf != null && jf.getManifest() != null)
|
||||
{
|
||||
Manifest mf = jf.getManifest();
|
||||
JarEntry ent = jf.getJarEntry(fName);
|
||||
Package pkg = getPackage(pkgname);
|
||||
getClassBytes(untransformedName);
|
||||
signers = ent.getCodeSigners();
|
||||
if (pkg == null)
|
||||
{
|
||||
pkg = definePackage(pkgname, mf, jarUrlConn.getJarFileURL());
|
||||
packageManifests.put(pkg, mf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pkg.isSealed() && !pkg.isSealed(jarUrlConn.getJarFileURL()))
|
||||
{
|
||||
FMLLog.severe("The jar file %s is trying to seal already secured path %s", jf.getName(), pkgname);
|
||||
}
|
||||
else if (isSealed(pkgname, mf))
|
||||
{
|
||||
FMLLog.severe("The jar file %s has a security seal for path %s, but that path is defined and not secure", jf.getName(), pkgname);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (lastDot > -1 && !untransformedName.startsWith("net.minecraft."))
|
||||
{
|
||||
Package pkg = getPackage(pkgname);
|
||||
if (pkg == null)
|
||||
{
|
||||
pkg = definePackage(pkgname, null, null, null, null, null, null, null);
|
||||
packageManifests.put(pkg, EMPTY);
|
||||
}
|
||||
else if (pkg.isSealed())
|
||||
{
|
||||
FMLLog.severe("The URL %s is defining elements for sealed path %s", urlConnection.getURL(), pkgname);
|
||||
}
|
||||
}
|
||||
byte[] basicClass = getClassBytes(untransformedName);
|
||||
byte[] transformedClass = runTransformers(untransformedName, transformedName, basicClass);
|
||||
Class<?> cl = defineClass(transformedName, transformedClass, 0, transformedClass.length, new CodeSource(urlConnection.getURL(), signers));
|
||||
cachedClasses.put(transformedName, cl);
|
||||
return cl;
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
invalidClasses.add(name);
|
||||
if (DEBUG_CLASSLOADING)
|
||||
{
|
||||
FMLLog.log(Level.FINEST, e, "Exception encountered attempting classloading of %s", name);
|
||||
}
|
||||
throw new ClassNotFoundException(name, e);
|
||||
}
|
||||
}
|
||||
|
||||
private String untransformName(String name)
|
||||
{
|
||||
if (renameTransformer != null)
|
||||
{
|
||||
return renameTransformer.unmapClassName(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
private String transformName(String name)
|
||||
{
|
||||
if (renameTransformer != null)
|
||||
{
|
||||
return renameTransformer.remapClassName(name);
|
||||
}
|
||||
else
|
||||
{
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isSealed(String path, Manifest man)
|
||||
{
|
||||
Attributes attr = man.getAttributes(path);
|
||||
String sealed = null;
|
||||
if (attr != null) {
|
||||
sealed = attr.getValue(Name.SEALED);
|
||||
}
|
||||
if (sealed == null) {
|
||||
if ((attr = man.getMainAttributes()) != null) {
|
||||
sealed = attr.getValue(Name.SEALED);
|
||||
}
|
||||
}
|
||||
return "true".equalsIgnoreCase(sealed);
|
||||
}
|
||||
|
||||
private URLConnection findCodeSourceConnectionFor(String name)
|
||||
{
|
||||
URL res = findResource(name);
|
||||
if (res != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
return res.openConnection();
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] runTransformers(String name, String transformedName, byte[] basicClass)
|
||||
{
|
||||
for (IClassTransformer transformer : transformers)
|
||||
{
|
||||
basicClass = transformer.transform(name, transformedName, basicClass);
|
||||
}
|
||||
return basicClass;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addURL(URL url)
|
||||
{
|
||||
super.addURL(url);
|
||||
sources.add(url);
|
||||
}
|
||||
|
||||
public List<URL> getSources()
|
||||
{
|
||||
return sources;
|
||||
}
|
||||
|
||||
|
||||
private byte[] readFully(InputStream stream)
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] buf = loadBuffer.get();
|
||||
if (buf == null)
|
||||
{
|
||||
loadBuffer.set(new byte[1 << 12]);
|
||||
buf = loadBuffer.get();
|
||||
}
|
||||
|
||||
int r, totalLength = 0;
|
||||
while ((r = stream.read(buf, totalLength, buf.length - totalLength)) != -1)
|
||||
{
|
||||
totalLength += r;
|
||||
if (totalLength >= buf.length - 1)
|
||||
{
|
||||
byte[] oldbuf = buf;
|
||||
buf = new byte[ oldbuf.length + (1 << 12 )];
|
||||
System.arraycopy(oldbuf, 0, buf, 0, oldbuf.length);
|
||||
}
|
||||
}
|
||||
|
||||
byte[] result = new byte[totalLength];
|
||||
System.arraycopy(buf, 0, result, 0, totalLength);
|
||||
return result;
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
FMLRelaunchLog.log(Level.WARNING, t, "Problem loading class");
|
||||
return new byte[0];
|
||||
}
|
||||
}
|
||||
|
||||
public List<IClassTransformer> getTransformers()
|
||||
{
|
||||
return Collections.unmodifiableList(transformers);
|
||||
}
|
||||
|
||||
private void addClassLoaderExclusion(String toExclude)
|
||||
{
|
||||
classLoaderExceptions.add(toExclude);
|
||||
}
|
||||
|
||||
void addTransformerExclusion(String toExclude)
|
||||
{
|
||||
transformerExceptions.add(toExclude);
|
||||
}
|
||||
|
||||
public byte[] getClassBytes(String name) throws IOException
|
||||
{
|
||||
if (name.indexOf('.') == -1)
|
||||
{
|
||||
for (String res : RESERVED)
|
||||
{
|
||||
if (name.toUpperCase(Locale.ENGLISH).startsWith(res))
|
||||
{
|
||||
byte[] data = getClassBytes("_" + name);
|
||||
if (data != null)
|
||||
{
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InputStream classStream = null;
|
||||
try
|
||||
{
|
||||
URL classResource = findResource(name.replace('.', '/').concat(".class"));
|
||||
if (classResource == null)
|
||||
{
|
||||
if (DEBUG_CLASSLOADING)
|
||||
{
|
||||
FMLLog.finest("Failed to find class resource %s", name.replace('.', '/').concat(".class"));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
classStream = classResource.openStream();
|
||||
if (DEBUG_CLASSLOADING)
|
||||
{
|
||||
FMLLog.finest("Loading class %s from resource %s", name, classResource.toString());
|
||||
}
|
||||
return readFully(classStream);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (classStream != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
classStream.close();
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
// Swallow the close exception
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import net.minecraft.launchwrapper.Launch;
|
||||
import net.minecraft.launchwrapper.LaunchClassLoader;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
|
||||
public class ServerLaunchWrapper {
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new ServerLaunchWrapper().run(args);
|
||||
}
|
||||
|
||||
private ServerLaunchWrapper()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void run(String[] args)
|
||||
{
|
||||
Launch.main(args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -13,7 +13,7 @@
|
||||
package cpw.mods.fml.relauncher;
|
||||
|
||||
public enum Side {
|
||||
CLIENT, SERVER, BUKKIT;
|
||||
CLIENT, SERVER;
|
||||
|
||||
/**
|
||||
* @return If this is the server environment
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* are made available under the terms of the GNU Lesser Public License v2.1
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
||||
*
|
||||
*
|
||||
* Contributors:
|
||||
* cpw - implementation
|
||||
*/
|
||||
@@ -17,7 +17,22 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import cpw.mods.fml.common.SidedProxy;
|
||||
|
||||
|
||||
/**
|
||||
* Marks the associated element as being only available on a certain {@link Side}. This is
|
||||
* generally meant for internal Forge and FML use only and should only be used on mod classes
|
||||
* when other more common mechanisms, such as using a {@link SidedProxy} fail to work.
|
||||
*
|
||||
* Note, this will <em>only</em> apply to the direct element marked. This code:
|
||||
* <code> @SideOnly public MyField field = new MyField();</code> will <strong>not</strong> work, as the initializer
|
||||
* is a separate piece of code to the actual field declaration, and will not be able to find
|
||||
* it's field on the wrong side.
|
||||
*
|
||||
* @author cpw
|
||||
*
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
|
||||
public @interface SideOnly
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* ByteArraySeekableSource.java
|
||||
*
|
||||
* Created on May 17, 2006, 12:41 PM
|
||||
* Copyright (c) 2006 Heiko Klein
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
/**
|
||||
* Wraps a byte buffer as a source
|
||||
*/
|
||||
public class ByteBufferSeekableSource implements SeekableSource {
|
||||
|
||||
private ByteBuffer bb;
|
||||
private ByteBuffer cur;
|
||||
|
||||
/**
|
||||
* Constructs a new ByteArraySeekableSource.
|
||||
*/
|
||||
public ByteBufferSeekableSource(byte[] source) {
|
||||
this(ByteBuffer.wrap(source));
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new ByteArraySeekableSource.
|
||||
*/
|
||||
public ByteBufferSeekableSource(ByteBuffer bb) {
|
||||
if (bb == null)
|
||||
throw new NullPointerException("bb");
|
||||
this.bb = bb;
|
||||
bb.rewind();
|
||||
try {
|
||||
seek(0);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void seek(long pos) throws IOException {
|
||||
cur = bb.slice();
|
||||
if (pos > cur.limit())
|
||||
throw new IOException("pos " + pos + " cannot seek " + cur.limit());
|
||||
cur.position((int) pos);
|
||||
}
|
||||
|
||||
public int read(ByteBuffer dest) throws IOException {
|
||||
if (!cur.hasRemaining())
|
||||
return -1;
|
||||
int c = 0;
|
||||
while (cur.hasRemaining() && dest.hasRemaining()) {
|
||||
dest.put(cur.get());
|
||||
c++;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
public void close() throws IOException {
|
||||
bb = null;
|
||||
cur = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a debug <code>String</code>.
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "BBSeekable" +
|
||||
" bb=" + this.bb.position() + "-" + bb.limit() +
|
||||
" cur=" + this.cur.position() + "-" + cur.limit() +
|
||||
"";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001 Torgeir Veimo
|
||||
* Copyright (c) 2002 Nicolas PERIDONT
|
||||
* Copyright (c) 2006 Heiko Klein
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Map;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
/**
|
||||
* Checksum computation class.
|
||||
*/
|
||||
public class Checksum {
|
||||
|
||||
static final boolean debug = false;
|
||||
|
||||
private Map<Long,Integer> checksums = Maps.newHashMap();
|
||||
|
||||
private static final char single_hash[] = {
|
||||
/* Random numbers generated using SLIB's pseudo-random number generator. */
|
||||
0xbcd1, 0xbb65, 0x42c2, 0xdffe, 0x9666, 0x431b, 0x8504, 0xeb46,
|
||||
0x6379, 0xd460, 0xcf14, 0x53cf, 0xdb51, 0xdb08, 0x12c8, 0xf602,
|
||||
0xe766, 0x2394, 0x250d, 0xdcbb, 0xa678, 0x02af, 0xa5c6, 0x7ea6,
|
||||
0xb645, 0xcb4d, 0xc44b, 0xe5dc, 0x9fe6, 0x5b5c, 0x35f5, 0x701a,
|
||||
0x220f, 0x6c38, 0x1a56, 0x4ca3, 0xffc6, 0xb152, 0x8d61, 0x7a58,
|
||||
0x9025, 0x8b3d, 0xbf0f, 0x95a3, 0xe5f4, 0xc127, 0x3bed, 0x320b,
|
||||
0xb7f3, 0x6054, 0x333c, 0xd383, 0x8154, 0x5242, 0x4e0d, 0x0a94,
|
||||
0x7028, 0x8689, 0x3a22, 0x0980, 0x1847, 0xb0f1, 0x9b5c, 0x4176,
|
||||
0xb858, 0xd542, 0x1f6c, 0x2497, 0x6a5a, 0x9fa9, 0x8c5a, 0x7743,
|
||||
0xa8a9, 0x9a02, 0x4918, 0x438c, 0xc388, 0x9e2b, 0x4cad, 0x01b6,
|
||||
0xab19, 0xf777, 0x365f, 0x1eb2, 0x091e, 0x7bf8, 0x7a8e, 0x5227,
|
||||
0xeab1, 0x2074, 0x4523, 0xe781, 0x01a3, 0x163d, 0x3b2e, 0x287d,
|
||||
0x5e7f, 0xa063, 0xb134, 0x8fae, 0x5e8e, 0xb7b7, 0x4548, 0x1f5a,
|
||||
0xfa56, 0x7a24, 0x900f, 0x42dc, 0xcc69, 0x02a0, 0x0b22, 0xdb31,
|
||||
0x71fe, 0x0c7d, 0x1732, 0x1159, 0xcb09, 0xe1d2, 0x1351, 0x52e9,
|
||||
0xf536, 0x5a4f, 0xc316, 0x6bf9, 0x8994, 0xb774, 0x5f3e, 0xf6d6,
|
||||
0x3a61, 0xf82c, 0xcc22, 0x9d06, 0x299c, 0x09e5, 0x1eec, 0x514f,
|
||||
0x8d53, 0xa650, 0x5c6e, 0xc577, 0x7958, 0x71ac, 0x8916, 0x9b4f,
|
||||
0x2c09, 0x5211, 0xf6d8, 0xcaaa, 0xf7ef, 0x287f, 0x7a94, 0xab49,
|
||||
0xfa2c, 0x7222, 0xe457, 0xd71a, 0x00c3, 0x1a76, 0xe98c, 0xc037,
|
||||
0x8208, 0x5c2d, 0xdfda, 0xe5f5, 0x0b45, 0x15ce, 0x8a7e, 0xfcad,
|
||||
0xaa2d, 0x4b5c, 0xd42e, 0xb251, 0x907e, 0x9a47, 0xc9a6, 0xd93f,
|
||||
0x085e, 0x35ce, 0xa153, 0x7e7b, 0x9f0b, 0x25aa, 0x5d9f, 0xc04d,
|
||||
0x8a0e, 0x2875, 0x4a1c, 0x295f, 0x1393, 0xf760, 0x9178, 0x0f5b,
|
||||
0xfa7d, 0x83b4, 0x2082, 0x721d, 0x6462, 0x0368, 0x67e2, 0x8624,
|
||||
0x194d, 0x22f6, 0x78fb, 0x6791, 0xb238, 0xb332, 0x7276, 0xf272,
|
||||
0x47ec, 0x4504, 0xa961, 0x9fc8, 0x3fdc, 0xb413, 0x007a, 0x0806,
|
||||
0x7458, 0x95c6, 0xccaa, 0x18d6, 0xe2ae, 0x1b06, 0xf3f6, 0x5050,
|
||||
0xc8e8, 0xf4ac, 0xc04c, 0xf41c, 0x992f, 0xae44, 0x5f1b, 0x1113,
|
||||
0x1738, 0xd9a8, 0x19ea, 0x2d33, 0x9698, 0x2fe9, 0x323f, 0xcde2,
|
||||
0x6d71, 0xe37d, 0xb697, 0x2c4f, 0x4373, 0x9102, 0x075d, 0x8e25,
|
||||
0x1672, 0xec28, 0x6acb, 0x86cc, 0x186e, 0x9414, 0xd674, 0xd1a5
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize checksums for source. The checksum for the <code>chunkSize</code> bytes at offset
|
||||
* <code>chunkSize</code> * i is inserted into a hash map.
|
||||
*/
|
||||
public Checksum(SeekableSource source, int chunkSize) throws IOException {
|
||||
ByteBuffer bb = ByteBuffer.allocate(chunkSize * 2);
|
||||
int count = 0;
|
||||
while (true) {
|
||||
source.read(bb);
|
||||
bb.flip();
|
||||
if (bb.remaining() < chunkSize)
|
||||
break;
|
||||
while (bb.remaining() >= chunkSize) {
|
||||
long queryChecksum = queryChecksum0(bb, chunkSize);
|
||||
checksums.put(queryChecksum, count++);
|
||||
}
|
||||
bb.compact();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the checksum computed from the buffer.
|
||||
* Marks, gets, then resets the buffer.
|
||||
*/
|
||||
public static long queryChecksum(ByteBuffer bb, int len) {
|
||||
bb.mark();
|
||||
long sum = queryChecksum0(bb, len);
|
||||
bb.reset();
|
||||
return sum;
|
||||
}
|
||||
|
||||
private static long queryChecksum0(ByteBuffer bb, int len) {
|
||||
int high = 0; int low = 0;
|
||||
for (int i = 0; i < len; i++) {
|
||||
low += single_hash[bb.get()+128];
|
||||
high += low;
|
||||
}
|
||||
return ((high & 0xffff) << 16) | (low & 0xffff);
|
||||
}
|
||||
|
||||
/**
|
||||
* Increments a checksum.
|
||||
* @param checksum initial checksum
|
||||
* @param out byte leaving view
|
||||
* @param in byte entering view
|
||||
* @param chunkSize size of chunks
|
||||
* @return new checksum
|
||||
*/
|
||||
public static long incrementChecksum(long checksum, byte out, byte in, int chunkSize) {
|
||||
char old_c = single_hash[out+128];
|
||||
char new_c = single_hash[in+128];
|
||||
int low = ((int)((checksum) & 0xffff) - old_c + new_c) & 0xffff;
|
||||
int high = ((int)((checksum) >> 16) - (old_c * chunkSize) + low) & 0xffff;
|
||||
return (high << 16) | (low & 0xffff);
|
||||
}
|
||||
|
||||
/**
|
||||
* 256 random hash values.
|
||||
*/
|
||||
public static char[] getSingleHash() {
|
||||
return single_hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the index of a checksum.
|
||||
*/
|
||||
public int findChecksumIndex(long hashf) {
|
||||
if (!checksums.containsKey(hashf))
|
||||
return -1;
|
||||
return checksums.get(hashf);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a debug <code>String</code>.
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return super.toString() +
|
||||
" checksums=" + this.checksums;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001 Torgeir Veimo
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* For debugging patch generation.
|
||||
*/
|
||||
public class DebugDiffWriter implements DiffWriter {
|
||||
|
||||
private ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
|
||||
/**
|
||||
* Constructs a new DebugDiffWriter.
|
||||
*/
|
||||
public DebugDiffWriter() {}
|
||||
|
||||
public void addCopy(long offset, int length) throws IOException {
|
||||
if (os.size() > 0)
|
||||
writeBuf();
|
||||
System.err.println("COPY off: " + offset + ", len: " + length);
|
||||
}
|
||||
|
||||
public void addData(byte b) throws IOException {
|
||||
os.write(b);
|
||||
writeBuf();
|
||||
}
|
||||
private void writeBuf() {
|
||||
System.err.print("DATA: ");
|
||||
byte[] ba = os.toByteArray();
|
||||
for (int ix = 0; ix < ba.length; ix++) {
|
||||
if (ba[ix] == '\n')
|
||||
System.err.print("\\n");
|
||||
else
|
||||
System.err.print(String.valueOf((char)((char) ba[ix])));
|
||||
//System.err.print("0x" + Integer.toHexString(buf[ix]) + " "); // hex output
|
||||
}
|
||||
System.err.println("");
|
||||
os.reset();
|
||||
}
|
||||
|
||||
public void flush() throws IOException {
|
||||
System.err.println("FLUSH");
|
||||
}
|
||||
public void close() throws IOException {
|
||||
System.err.println("CLOSE");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,446 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001 Torgeir Veimo
|
||||
* Copyright (c) 2002 Nicolas PERIDONT
|
||||
* Bug Fixes: Daniel Morrione dan@morrione.net
|
||||
* Copyright (c) 2006 Heiko Klein
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Change Log:
|
||||
* iiimmddyyn nnnnn Description
|
||||
* ---------- ----- -------------------------------------------------------
|
||||
* gls100603a Fixes from Torgeir Veimo and Dan Morrione
|
||||
* gls110603a Stream not being closed thus preventing a file from
|
||||
* being subsequently deleted.
|
||||
* gls031504a Error being written to stderr rather than throwing exception
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
|
||||
/**
|
||||
* Class for computing deltas against a source.
|
||||
* The source file is read by blocks and a hash is computed per block.
|
||||
* Then the target is scanned for matching blocks.
|
||||
* <p/>
|
||||
* This class is not thread safe. Use one instance per thread.
|
||||
* <p/>
|
||||
* This class should support files over 4GB in length, although you must
|
||||
* use a larger checksum size, such as 1K, as all checksums use "int" indexing.
|
||||
* Newer versions may eventually support paging in/out of checksums.
|
||||
*/
|
||||
public class Delta {
|
||||
|
||||
/**
|
||||
* Debug flag.
|
||||
*/
|
||||
final static boolean debug = false;
|
||||
|
||||
/**
|
||||
* Default size of 16.
|
||||
* For "Lorem ipsum" text files (see the tests) the ideal size is about 14.
|
||||
* Any smaller and the patch size becomes actually be larger.
|
||||
* <p>
|
||||
* Use a size like 64 or 128 for large files.
|
||||
*/
|
||||
public static final int DEFAULT_CHUNK_SIZE = 1<<4;
|
||||
|
||||
/**
|
||||
* Chunk Size.
|
||||
*/
|
||||
private int S;
|
||||
|
||||
private SourceState source;
|
||||
private TargetState target;
|
||||
private DiffWriter output;
|
||||
|
||||
/**
|
||||
* Constructs a new Delta.
|
||||
* In the future, additional constructor arguments will set the algorithm details.
|
||||
*/
|
||||
public Delta() {
|
||||
setChunkSize(DEFAULT_CHUNK_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the chunk size used.
|
||||
* Larger chunks are faster and use less memory, but create larger patches
|
||||
* as well.
|
||||
*
|
||||
* @param size
|
||||
*/
|
||||
public void setChunkSize(int size) {
|
||||
if (size <= 0)
|
||||
throw new IllegalArgumentException("Invalid size");
|
||||
S = size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares the source bytes with target bytes, writing to output.
|
||||
*/
|
||||
public void compute(byte source[], byte target[], OutputStream output)
|
||||
throws IOException {
|
||||
compute(new ByteBufferSeekableSource(source),
|
||||
new ByteArrayInputStream(target),
|
||||
new GDiffWriter(output));
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares the source bytes with target bytes, returning output.
|
||||
*/
|
||||
public byte[] compute(byte source[], byte target[])
|
||||
throws IOException {
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
compute(source, target, os);
|
||||
return os.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares the source bytes with target input, writing to output.
|
||||
*/
|
||||
public void compute(byte[] sourceBytes, InputStream inputStream,
|
||||
DiffWriter diffWriter) throws IOException
|
||||
{
|
||||
compute(new ByteBufferSeekableSource(sourceBytes),
|
||||
inputStream, diffWriter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares the source file with a target file, writing to output.
|
||||
*
|
||||
* @param output will be closed
|
||||
*/
|
||||
public void compute(File sourceFile, File targetFile, DiffWriter output)
|
||||
throws IOException {
|
||||
RandomAccessFileSeekableSource source = new RandomAccessFileSeekableSource(new RandomAccessFile(sourceFile, "r"));
|
||||
InputStream is = new BufferedInputStream(new FileInputStream(targetFile));
|
||||
try {
|
||||
compute(source, is, output);
|
||||
} finally {
|
||||
source.close();
|
||||
is.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares the source with a target, writing to output.
|
||||
*
|
||||
* @param output will be closed
|
||||
*/
|
||||
public void compute(SeekableSource seekSource, InputStream targetIS, DiffWriter output)
|
||||
throws IOException {
|
||||
|
||||
if (debug) {
|
||||
debug("using match length S = " + S);
|
||||
}
|
||||
|
||||
source = new SourceState(seekSource);
|
||||
target = new TargetState(targetIS);
|
||||
this.output = output;
|
||||
if (debug)
|
||||
debug("checksums " + source.checksum);
|
||||
|
||||
while (!target.eof()) {
|
||||
debug("!target.eof()");
|
||||
int index = target.find(source);
|
||||
if (index != -1) {
|
||||
if (debug)
|
||||
debug("found hash " + index);
|
||||
long offset = (long)index * S;
|
||||
source.seek(offset);
|
||||
int match = target.longestMatch(source);
|
||||
if (match >= S) {
|
||||
if (debug)
|
||||
debug("output.addCopy("+offset+","+match+")");
|
||||
output.addCopy(offset, match);
|
||||
} else {
|
||||
// move the position back according to how much we can't copy
|
||||
target.tbuf.position(target.tbuf.position() - match);
|
||||
addData();
|
||||
}
|
||||
} else {
|
||||
addData();
|
||||
}
|
||||
}
|
||||
output.close();
|
||||
}
|
||||
|
||||
private void addData() throws IOException {
|
||||
int i = target.read();
|
||||
if (debug)
|
||||
debug("addData " + Integer.toHexString(i));
|
||||
if (i == -1)
|
||||
return;
|
||||
output.addData((byte)i);
|
||||
}
|
||||
|
||||
class SourceState {
|
||||
|
||||
private Checksum checksum;
|
||||
private SeekableSource source;
|
||||
|
||||
public SourceState(SeekableSource source) throws IOException {
|
||||
checksum = new Checksum(source, S);
|
||||
this.source = source;
|
||||
source.seek(0);
|
||||
}
|
||||
|
||||
public void seek(long index) throws IOException {
|
||||
source.seek(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a debug <code>String</code>.
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Source"+
|
||||
" checksum=" + this.checksum +
|
||||
" source=" + this.source +
|
||||
"";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class TargetState {
|
||||
|
||||
private ReadableByteChannel c;
|
||||
private ByteBuffer tbuf = ByteBuffer.allocate(blocksize());
|
||||
private ByteBuffer sbuf = ByteBuffer.allocate(blocksize());
|
||||
private long hash;
|
||||
private boolean hashReset = true;
|
||||
private boolean eof;
|
||||
|
||||
TargetState(InputStream targetIS) throws IOException {
|
||||
c = Channels.newChannel(targetIS);
|
||||
tbuf.limit(0);
|
||||
}
|
||||
|
||||
private int blocksize() {
|
||||
return Math.min(1024 * 16, S * 4);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the index of the next N bytes of the stream.
|
||||
*/
|
||||
public int find(SourceState source) throws IOException {
|
||||
if (eof)
|
||||
return -1;
|
||||
sbuf.clear();
|
||||
sbuf.limit(0);
|
||||
if (hashReset) {
|
||||
debug("hashReset");
|
||||
while (tbuf.remaining() < S) {
|
||||
tbuf.compact();
|
||||
int read = c.read(tbuf);
|
||||
tbuf.flip();
|
||||
if (read == -1) {
|
||||
debug("target ending");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
hash = Checksum.queryChecksum(tbuf, S);
|
||||
hashReset = false;
|
||||
}
|
||||
if (debug)
|
||||
debug("hash " + hash + " " + dump());
|
||||
return source.checksum.findChecksumIndex(hash);
|
||||
}
|
||||
|
||||
public boolean eof() {
|
||||
return eof;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a byte.
|
||||
* @throws IOException
|
||||
*/
|
||||
public int read() throws IOException {
|
||||
if (tbuf.remaining() <= S) {
|
||||
readMore();
|
||||
if (!tbuf.hasRemaining()) {
|
||||
eof = true;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
byte b = tbuf.get();
|
||||
if (tbuf.remaining() >= S) {
|
||||
byte nchar = tbuf.get( tbuf.position() + S -1 );
|
||||
hash = Checksum.incrementChecksum(hash, b, nchar, S);
|
||||
} else {
|
||||
debug("out of char");
|
||||
}
|
||||
return b & 0xFF;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the longest match length at the source location.
|
||||
*/
|
||||
public int longestMatch(SourceState source) throws IOException {
|
||||
debug("longestMatch");
|
||||
int match = 0;
|
||||
hashReset = true;
|
||||
while (true) {
|
||||
if (!sbuf.hasRemaining()) {
|
||||
sbuf.clear();
|
||||
int read = source.source.read(sbuf);
|
||||
sbuf.flip();
|
||||
if (read == -1)
|
||||
return match;
|
||||
}
|
||||
if (!tbuf.hasRemaining()) {
|
||||
readMore();
|
||||
if (!tbuf.hasRemaining()) {
|
||||
debug("target ending");
|
||||
eof = true;
|
||||
return match;
|
||||
}
|
||||
}
|
||||
if (sbuf.get() != tbuf.get()) {
|
||||
tbuf.position(tbuf.position() - 1);
|
||||
return match;
|
||||
}
|
||||
match++;
|
||||
}
|
||||
}
|
||||
|
||||
private void readMore() throws IOException {
|
||||
if (debug)
|
||||
debug("readMore " + tbuf);
|
||||
tbuf.compact();
|
||||
c.read(tbuf);
|
||||
tbuf.flip();
|
||||
}
|
||||
|
||||
void hash() {
|
||||
hash = Checksum.queryChecksum(tbuf, S);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a debug <code>String</code>.
|
||||
*/
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Target[" +
|
||||
" targetBuff=" + dump() + // this.tbuf +
|
||||
" sourceBuff=" + this.sbuf +
|
||||
" hashf=" + this.hash +
|
||||
" eof=" + this.eof +
|
||||
"]";
|
||||
}
|
||||
|
||||
private String dump() { return dump(tbuf); }
|
||||
|
||||
private String dump(ByteBuffer bb) {
|
||||
return getTextDump(bb);
|
||||
}
|
||||
|
||||
private void append(StringBuffer sb, int value) {
|
||||
char b1 = (char)((value >> 4) & 0x0F);
|
||||
char b2 = (char)((value) & 0x0F);
|
||||
sb.append( Character.forDigit(b1, 16) );
|
||||
sb.append( Character.forDigit(b2, 16) );
|
||||
}
|
||||
|
||||
public String getTextDump(ByteBuffer bb)
|
||||
{
|
||||
StringBuffer sb = new StringBuffer(bb.remaining() * 2);
|
||||
bb.mark();
|
||||
while (bb.hasRemaining()) {
|
||||
int val = bb.get();
|
||||
if (val > 32 && val < 127)
|
||||
sb.append(" ").append((char)val);
|
||||
else
|
||||
append(sb, val);
|
||||
}
|
||||
bb.reset();
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a patch using file names.
|
||||
*/
|
||||
public static void main(String argv[]) throws Exception {
|
||||
if (argv.length != 3) {
|
||||
System.err.println("usage Delta [-d] source target [output]");
|
||||
System.err.println("either -d or an output filename must be specified.");
|
||||
System.err.println("aborting..");
|
||||
return;
|
||||
}
|
||||
DiffWriter output = null;
|
||||
File sourceFile = null;
|
||||
File targetFile = null;
|
||||
if (argv[0].equals("-d")) {
|
||||
sourceFile = new File(argv[1]);
|
||||
targetFile = new File(argv[2]);
|
||||
output = new DebugDiffWriter();
|
||||
} else {
|
||||
sourceFile = new File(argv[0]);
|
||||
targetFile = new File(argv[1]);
|
||||
output =
|
||||
new GDiffWriter(
|
||||
new DataOutputStream(
|
||||
new BufferedOutputStream(
|
||||
new FileOutputStream(new File(argv[2])))));
|
||||
}
|
||||
|
||||
if (sourceFile.length() > Integer.MAX_VALUE
|
||||
|| targetFile.length() > Integer.MAX_VALUE) {
|
||||
System.err.println(
|
||||
"source or target is too large, max length is "
|
||||
+ Integer.MAX_VALUE);
|
||||
System.err.println("aborting..");
|
||||
return;
|
||||
}
|
||||
|
||||
Delta d = new Delta();
|
||||
d.compute(sourceFile, targetFile, output);
|
||||
|
||||
output.flush();
|
||||
output.close();
|
||||
if (debug) //gls031504a
|
||||
System.out.println("finished generating delta");
|
||||
}
|
||||
|
||||
private void debug(String s) {
|
||||
if (debug)
|
||||
System.err.println(s);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001 Torgeir Veimo
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Interface for DIFF writers.
|
||||
*/
|
||||
public interface DiffWriter extends Closeable {
|
||||
|
||||
/**
|
||||
* Add a GDIFF copy instruction.
|
||||
*/
|
||||
public void addCopy(long offset, int length) throws IOException;
|
||||
|
||||
/**
|
||||
* Add a GDIFF data instruction.
|
||||
* Implementors should buffer the data.
|
||||
*/
|
||||
public void addData(byte b) throws IOException;
|
||||
|
||||
/**
|
||||
* Flushes to output, e.g. any data added.
|
||||
*/
|
||||
public void flush() throws IOException;
|
||||
|
||||
/**
|
||||
* Closes this stream.
|
||||
* Note that {@link Diff} will invoke this method at the end.
|
||||
*/
|
||||
public void close() throws IOException;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001 Torgeir Veimo
|
||||
* Copyright (c) 2006 Heiko Klein
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.COPY_INT_INT;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.COPY_INT_UBYTE;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.COPY_INT_USHORT;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.COPY_LONG_INT;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.COPY_USHORT_INT;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.COPY_USHORT_UBYTE;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.COPY_USHORT_USHORT;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.DATA_INT;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.DATA_MAX;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.DATA_USHORT;
|
||||
import static cpw.mods.fml.repackage.com.nothome.delta.GDiffWriter.EOF;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.EOFException;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
/**
|
||||
* This class patches an input file with a GDIFF patch fil�e.
|
||||
*
|
||||
* The patch file follows the GDIFF file specification available at
|
||||
* {@link http://www.w3.org/TR/NOTE-gdiff-19970901.html}.
|
||||
*/
|
||||
public class GDiffPatcher {
|
||||
|
||||
private ByteBuffer buf = ByteBuffer.allocate(1024);
|
||||
private byte buf2[] = buf.array();
|
||||
|
||||
/**
|
||||
* Constructs a new GDiffPatcher.
|
||||
*/
|
||||
public GDiffPatcher() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Patches to an output file.
|
||||
*/
|
||||
public void patch(File sourceFile, File patchFile, File outputFile)
|
||||
throws IOException
|
||||
{
|
||||
RandomAccessFileSeekableSource source =new RandomAccessFileSeekableSource(new RandomAccessFile(sourceFile, "r"));
|
||||
InputStream patch = new FileInputStream(patchFile);
|
||||
OutputStream output = new FileOutputStream(outputFile);
|
||||
try {
|
||||
patch(source, patch, output);
|
||||
} catch (IOException e) {
|
||||
throw e;
|
||||
} finally {
|
||||
source.close();
|
||||
patch.close();
|
||||
output.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Patches to an output stream.
|
||||
*/
|
||||
public void patch(byte[] source, InputStream patch, OutputStream output) throws IOException {
|
||||
patch(new ByteBufferSeekableSource(source), patch, output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Patches in memory, returning the patch result.
|
||||
*/
|
||||
public byte[] patch(byte[] source, byte[] patch) throws IOException {
|
||||
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
||||
patch(source, new ByteArrayInputStream(patch), os);
|
||||
return os.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Patches to an output stream.
|
||||
*/
|
||||
public void patch(SeekableSource source, InputStream patch, OutputStream out) throws IOException {
|
||||
|
||||
DataOutputStream outOS = new DataOutputStream(out);
|
||||
DataInputStream patchIS = new DataInputStream(patch);
|
||||
|
||||
// the magic string is 'd1 ff d1 ff' + the version number
|
||||
if (patchIS.readUnsignedByte() != 0xd1 ||
|
||||
patchIS.readUnsignedByte() != 0xff ||
|
||||
patchIS.readUnsignedByte() != 0xd1 ||
|
||||
patchIS.readUnsignedByte() != 0xff ||
|
||||
patchIS.readUnsignedByte() != 0x04) {
|
||||
|
||||
throw new PatchException("magic string not found, aborting!");
|
||||
}
|
||||
|
||||
while (true) {
|
||||
int command = patchIS.readUnsignedByte();
|
||||
if (command == EOF)
|
||||
break;
|
||||
int length;
|
||||
int offset;
|
||||
|
||||
if (command <= DATA_MAX) {
|
||||
append(command, patchIS, outOS);
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (command) {
|
||||
case DATA_USHORT: // ushort, n bytes following; append
|
||||
length = patchIS.readUnsignedShort();
|
||||
append(length, patchIS, outOS);
|
||||
break;
|
||||
case DATA_INT: // int, n bytes following; append
|
||||
length = patchIS.readInt();
|
||||
append(length, patchIS, outOS);
|
||||
break;
|
||||
case COPY_USHORT_UBYTE:
|
||||
offset = patchIS.readUnsignedShort();
|
||||
length = patchIS.readUnsignedByte();
|
||||
copy(offset, length, source, outOS);
|
||||
break;
|
||||
case COPY_USHORT_USHORT:
|
||||
offset = patchIS.readUnsignedShort();
|
||||
length = patchIS.readUnsignedShort();
|
||||
copy(offset, length, source, outOS);
|
||||
break;
|
||||
case COPY_USHORT_INT:
|
||||
offset = patchIS.readUnsignedShort();
|
||||
length = patchIS.readInt();
|
||||
copy(offset, length, source, outOS);
|
||||
break;
|
||||
case COPY_INT_UBYTE:
|
||||
offset = patchIS.readInt();
|
||||
length = patchIS.readUnsignedByte();
|
||||
copy(offset, length, source, outOS);
|
||||
break;
|
||||
case COPY_INT_USHORT:
|
||||
offset = patchIS.readInt();
|
||||
length = patchIS.readUnsignedShort();
|
||||
copy(offset, length, source, outOS);
|
||||
break;
|
||||
case COPY_INT_INT:
|
||||
offset = patchIS.readInt();
|
||||
length = patchIS.readInt();
|
||||
copy(offset, length, source, outOS);
|
||||
break;
|
||||
case COPY_LONG_INT:
|
||||
long loffset = patchIS.readLong();
|
||||
length = patchIS.readInt();
|
||||
copy(loffset, length, source, outOS);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("command " + command);
|
||||
}
|
||||
}
|
||||
outOS.flush();
|
||||
}
|
||||
|
||||
private void copy(long offset, int length, SeekableSource source, OutputStream output)
|
||||
throws IOException
|
||||
{
|
||||
source.seek(offset);
|
||||
while (length > 0) {
|
||||
int len = Math.min(buf.capacity(), length);
|
||||
buf.clear().limit(len);
|
||||
int res = source.read(buf);
|
||||
if (res == -1)
|
||||
throw new EOFException("in copy " + offset + " " + length);
|
||||
output.write(buf.array(), 0, res);
|
||||
length -= res;
|
||||
}
|
||||
}
|
||||
|
||||
private void append(int length, InputStream patch, OutputStream output) throws IOException {
|
||||
while (length > 0) {
|
||||
int len = Math.min(buf2.length, length);
|
||||
int res = patch.read(buf2, 0, len);
|
||||
if (res == -1)
|
||||
throw new EOFException("cannot read " + length);
|
||||
output.write(buf2, 0, res);
|
||||
length -= res;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple command line tool to patch a file.
|
||||
*/
|
||||
public static void main(String argv[]) {
|
||||
|
||||
if (argv.length != 3) {
|
||||
System.err.println("usage GDiffPatch source patch output");
|
||||
System.err.println("aborting..");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
File sourceFile = new File(argv[0]);
|
||||
File patchFile = new File(argv[1]);
|
||||
File outputFile = new File(argv[2]);
|
||||
|
||||
if (sourceFile.length() > Integer.MAX_VALUE ||
|
||||
patchFile.length() > Integer.MAX_VALUE) {
|
||||
System.err.println("source or patch is too large, max length is " + Integer.MAX_VALUE);
|
||||
System.err.println("aborting..");
|
||||
return;
|
||||
}
|
||||
GDiffPatcher patcher = new GDiffPatcher();
|
||||
patcher.patch(sourceFile, patchFile, outputFile);
|
||||
|
||||
System.out.println("finished patching file");
|
||||
|
||||
} catch (Exception ioe) { //gls031504a
|
||||
System.err.println("error while patching: " + ioe);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2001 Torgeir Veimo
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
/**
|
||||
* Outputs a diff following the GDIFF file specification available at
|
||||
* http://www.w3.org/TR/NOTE-gdiff-19970901.html.
|
||||
*/
|
||||
public class GDiffWriter implements DiffWriter {
|
||||
|
||||
/**
|
||||
* Max length of a chunk.
|
||||
*/
|
||||
public static final int CHUNK_SIZE = Short.MAX_VALUE;
|
||||
|
||||
public static final byte EOF = 0;
|
||||
|
||||
/**
|
||||
* Max length for single length data encode.
|
||||
*/
|
||||
public static final int DATA_MAX = 246;
|
||||
|
||||
public static final int DATA_USHORT = 247;
|
||||
public static final int DATA_INT = 248;
|
||||
public static final int COPY_USHORT_UBYTE = 249;
|
||||
public static final int COPY_USHORT_USHORT = 250;
|
||||
public static final int COPY_USHORT_INT = 251;
|
||||
public static final int COPY_INT_UBYTE = 252;
|
||||
public static final int COPY_INT_USHORT = 253;
|
||||
public static final int COPY_INT_INT = 254;
|
||||
public static final int COPY_LONG_INT = 255;
|
||||
|
||||
private ByteArrayOutputStream buf = new ByteArrayOutputStream();
|
||||
|
||||
private boolean debug = false;
|
||||
|
||||
private DataOutputStream output = null;
|
||||
|
||||
/**
|
||||
* Constructs a new GDiffWriter.
|
||||
*/
|
||||
public GDiffWriter(DataOutputStream os) throws IOException {
|
||||
this.output = os;
|
||||
// write magic string "d1 ff d1 ff 04"
|
||||
output.writeByte(0xd1);
|
||||
output.writeByte(0xff);
|
||||
output.writeByte(0xd1);
|
||||
output.writeByte(0xff);
|
||||
output.writeByte(0x04);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new GDiffWriter.
|
||||
*/
|
||||
public GDiffWriter(OutputStream output) throws IOException {
|
||||
this(new DataOutputStream(output));
|
||||
}
|
||||
|
||||
public void addCopy(long offset, int length) throws IOException {
|
||||
writeBuf();
|
||||
|
||||
//output debug data
|
||||
if (debug)
|
||||
System.err.println("COPY off: " + offset + ", len: " + length);
|
||||
|
||||
// output real data
|
||||
if (offset > Integer.MAX_VALUE) {
|
||||
// Actually, we don't support longer files than int.MAX_VALUE at the moment..
|
||||
output.writeByte(COPY_LONG_INT);
|
||||
output.writeLong(offset);
|
||||
output.writeInt(length);
|
||||
} else if (offset < 65536) {
|
||||
if (length < 256) {
|
||||
output.writeByte(COPY_USHORT_UBYTE);
|
||||
output.writeShort((int)offset);
|
||||
output.writeByte(length);
|
||||
} else if (length > 65535) {
|
||||
output.writeByte(COPY_USHORT_INT);
|
||||
output.writeShort((int)offset);
|
||||
output.writeInt(length);
|
||||
} else {
|
||||
output.writeByte(COPY_USHORT_USHORT);
|
||||
output.writeShort((int)offset);
|
||||
output.writeShort(length);
|
||||
}
|
||||
} else {
|
||||
if (length < 256) {
|
||||
output.writeByte(COPY_INT_UBYTE);
|
||||
output.writeInt((int)offset);
|
||||
output.writeByte(length);
|
||||
} else if (length > 65535) {
|
||||
output.writeByte(COPY_INT_INT);
|
||||
output.writeInt((int)offset);
|
||||
output.writeInt(length);
|
||||
} else {
|
||||
output.writeByte(COPY_INT_USHORT);
|
||||
output.writeInt((int)offset);
|
||||
output.writeShort(length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a data byte.
|
||||
*/
|
||||
public void addData(byte b) throws IOException {
|
||||
buf.write(b);
|
||||
if (buf.size() >= CHUNK_SIZE)
|
||||
writeBuf();
|
||||
}
|
||||
|
||||
private void writeBuf() throws IOException {
|
||||
if (buf.size() > 0) {
|
||||
if (buf.size() <= DATA_MAX) {
|
||||
output.writeByte(buf.size());
|
||||
} else if (buf.size() <= 65535) {
|
||||
output.writeByte(DATA_USHORT);
|
||||
output.writeShort(buf.size());
|
||||
} else {
|
||||
output.writeByte(DATA_INT);
|
||||
output.writeInt(buf.size());
|
||||
}
|
||||
buf.writeTo(output);
|
||||
buf.reset();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Flushes accumulated data bytes, if any.
|
||||
*/
|
||||
public void flush() throws IOException
|
||||
{
|
||||
writeBuf();
|
||||
output.flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the final EOF byte, closes the underlying stream.
|
||||
*/
|
||||
public void close() throws IOException {
|
||||
this.flush();
|
||||
output.write((byte)EOF);
|
||||
output.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* PatchException.java
|
||||
*
|
||||
* Created on June 6, 2006, 9:34 PM
|
||||
* Copyright (c) 2006 Heiko Klein
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Thrown when a patch is invalid.
|
||||
*/
|
||||
public class PatchException extends IOException {
|
||||
|
||||
private static final long serialVersionUID = 1;
|
||||
|
||||
/**
|
||||
* Creates a new instance of <code>PatchException</code> without detail message.
|
||||
*/
|
||||
public PatchException() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of <code>PatchException</code> with the specified detail message.
|
||||
* @param msg the detail message.
|
||||
*/
|
||||
public PatchException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* RandomAccessFileSeekableSource.java
|
||||
*
|
||||
* Created on May 17, 2006, 1:45 PM
|
||||
* Copyright (c) 2006 Heiko Klein
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
/**
|
||||
* Wraps a random access file.
|
||||
*/
|
||||
public class RandomAccessFileSeekableSource implements SeekableSource {
|
||||
|
||||
private RandomAccessFile raf;
|
||||
|
||||
/**
|
||||
* Constructs a new RandomAccessFileSeekableSource.
|
||||
* @param raf
|
||||
*/
|
||||
public RandomAccessFileSeekableSource(RandomAccessFile raf) {
|
||||
if (raf == null)
|
||||
throw new NullPointerException("raf");
|
||||
this.raf = raf;
|
||||
}
|
||||
|
||||
public void seek(long pos) throws IOException {
|
||||
raf.seek(pos);
|
||||
}
|
||||
|
||||
public int read(byte[] b, int off, int len) throws IOException {
|
||||
return raf.read(b, off, len);
|
||||
}
|
||||
|
||||
public long length() throws IOException {
|
||||
return raf.length();
|
||||
}
|
||||
|
||||
public void close() throws IOException {
|
||||
raf.close();
|
||||
}
|
||||
|
||||
public int read(ByteBuffer bb) throws IOException {
|
||||
int c = raf.read(bb.array(), bb.position(), bb.remaining());
|
||||
if (c == -1)
|
||||
return -1;
|
||||
bb.position(bb.position() + c);
|
||||
return c;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* SeekableSource.java
|
||||
*
|
||||
* Created on May 17, 2006, 12:33 PM
|
||||
* Copyright (c) 2006 Heiko Klein
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
package cpw.mods.fml.repackage.com.nothome.delta;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
/**
|
||||
* For sources of random-access data, such as {@link RandomAccessFile}.
|
||||
*/
|
||||
public interface SeekableSource extends Closeable {
|
||||
|
||||
/**
|
||||
* Sets the position for the next {@link #read(ByteBuffer)}.
|
||||
*/
|
||||
void seek(long pos) throws IOException ;
|
||||
|
||||
/**
|
||||
* Reads up to {@link ByteBuffer#remaining()} bytes from the source,
|
||||
* returning the number of bytes read, or -1 if no bytes were read
|
||||
* and EOF was reached.
|
||||
*/
|
||||
int read(ByteBuffer bb) throws IOException;
|
||||
|
||||
}
|
||||
@@ -82,7 +82,6 @@ public class FMLServerHandler implements IFMLSidedHandler
|
||||
public void beginServerLoading(MinecraftServer minecraftServer)
|
||||
{
|
||||
server = minecraftServer;
|
||||
ObfuscationReflectionHelper.detectObfuscation(World.class);
|
||||
Loader.instance().loadMods();
|
||||
}
|
||||
|
||||
|
||||
+44
-41
@@ -1,73 +1,76 @@
|
||||
#Main FML Access Transformer configuration file
|
||||
# TileEntity addMapping
|
||||
public aqj.a(Ljava/lang/Class;Ljava/lang/String;)V #MD:TileEntity/func_70306_a
|
||||
public ash.a(Ljava/lang/Class;Ljava/lang/String;)V #MD:TileEntity/func_70306_a
|
||||
# EntityList addMappings
|
||||
public mv.a(Ljava/lang/Class;Ljava/lang/String;I)V #MD:EntityList/func_75618_a
|
||||
public mv.a(Ljava/lang/Class;Ljava/lang/String;III)V #MD:EntityList/func_75614_a
|
||||
public mv.b #FD:EntityList/field_75625_b #nameToClassMap
|
||||
public mv.c #FD:EntityList/field_75626_c #classToNameMap
|
||||
public mv.d #FD:EntityList/field_75623_d #idToClassMap
|
||||
public np.a(Ljava/lang/Class;Ljava/lang/String;I)V #MD:EntityList/func_75618_a
|
||||
public np.a(Ljava/lang/Class;Ljava/lang/String;III)V #MD:EntityList/func_75614_a
|
||||
public np.b #FD:EntityList/field_75625_b #nameToClassMap
|
||||
public np.c #FD:EntityList/field_75626_c #classToNameMap
|
||||
public np.d #FD:EntityList/field_75623_d #idToClassMap
|
||||
# RenderEngine
|
||||
#public bba.h #FD:RenderEngine/field_78367_h #textureList # -- MISSING MAPPING # -- MISSING MAPPING
|
||||
public bfy.g #FD:RenderEngine/field_78366_k #texturePack
|
||||
#public bge.g #FD:RenderEngine/field_78366_k #texturePack # -- MISSING MAPPING
|
||||
# RenderManager
|
||||
public bgs.q #FD:RenderManager/field_78729_o #renderers
|
||||
public bfx.q #FD:RenderManager/field_78729_o #renderers
|
||||
# RenderBlocks - everything
|
||||
public bfz.* #FD:RenderBlocks/*
|
||||
public bfz.*() #MD:RenderBlocks/*
|
||||
public bfd.* #FD:RenderBlocks/*
|
||||
public bfd.*() #MD:RenderBlocks/*
|
||||
#RenderPlayer
|
||||
public-f bhn.h #FD:RenderPlayer/field_77110_j #armorlist
|
||||
#public-f bht.h #FD:RenderPlayer/field_77110_j #armorlist # -- MISSING MAPPING
|
||||
#RenderBiped
|
||||
public-f bha.k #FD:RenderBiped/field_82424_k #armorlist
|
||||
public-f bgg.l #FD:RenderBiped/field_82424_k #armorlist
|
||||
#StringTranslate
|
||||
public bp.b #FD:StringTranslate/field_74815_b
|
||||
public bp.e #FD:StringTranslate/field_74813_d
|
||||
#public bp.b #FD:StringTranslate/field_74815_b # -- MISSING MAPPING
|
||||
#public bp.e #FD:StringTranslate/field_74813_d # -- MISSING MAPPING
|
||||
# TileEntityRenderer
|
||||
public bix.m #FD:TileEntityRenderer/field_76966_m
|
||||
public bip.m #FD:TileEntityRenderer/field_76966_m
|
||||
# CraftingManager - make the add recipe methods public
|
||||
public ye.a(Lwg;[Ljava/lang/Object;)Lyh; #MD:CraftingManager/func_92103_a
|
||||
public ye.b(Lwg;[Ljava/lang/Object;)V #MD:CraftingManager/func_77596_b
|
||||
public zz.a(Lxy;[Ljava/lang/Object;)Laac; #MD:CraftingManager/func_92103_a
|
||||
public zz.b(Lxy;[Ljava/lang/Object;)V #MD:CraftingManager/func_77596_b
|
||||
# WeightedRandomItem
|
||||
public lo.a #FD:WeightedRandomItem/field_76292_a #probability
|
||||
public mf.a #FD:WeightedRandomItem/field_76292_a #probability
|
||||
# ItemStack
|
||||
#public+f tv.c #FD:ItemStack/field_77993_c #itemId
|
||||
# StatBase
|
||||
public ka.a #FD:StatBase/field_75978_a #statName
|
||||
public kq.a #FD:StatBase/field_75978_a #statName
|
||||
# NetLoginHandler
|
||||
public jf.a(Ljf;Z)Z #MD:NetLoginHandler/func_72531_a #'complete connection'
|
||||
public jf.g #FD:NetLoginHandler/field_72543_h #userName
|
||||
public ju.a(Lju;Z)Z #MD:NetLoginHandler/func_72531_a #'complete connection'
|
||||
public ju.g #FD:NetLoginHandler/field_72543_h #userName
|
||||
# EntityPlayerMP getNextWindowId
|
||||
public jc.cr()V #MD:EntityPlayerMP/func_71117_bO
|
||||
public jc.cu #FD:EntityPlayerMP/field_71139_cq
|
||||
public jr.bJ()V #MD:EntityPlayerMP/func_71117_bO
|
||||
public jr.bX #FD:EntityPlayerMP/field_71139_cq
|
||||
# EntityAITaskEntry
|
||||
public oi #CL:EntityAITaskEntry
|
||||
public pq #CL:EntityAITaskEntry
|
||||
# EntityAITasks
|
||||
public oh.a #FD:EntityAITasks/field_75782_a #taskList
|
||||
public pp.a #FD:EntityAITasks/field_75782_a #taskList
|
||||
# BlockChest
|
||||
public alh.m(Lzv;III)Z #MD:BlockChest/func_72292_n #isOcelotBlockingChest
|
||||
public anc.m(Labq;III)Z #MD:BlockChest/func_72292_n #isOcelotBlockingChest
|
||||
# EntityLiving
|
||||
public ng.aU #FD:EntityLiving/field_70736_aM #carryoverDamage
|
||||
public ng.bo #FD:EntityLiving/field_70714_bg #tasks
|
||||
public ng.bG #FD:EntityLiving/field_70703_bu #isJumping
|
||||
#public ng.aU #FD:EntityLiving/field_70736_aM #carryoverDamage # -- MISSING MAPPING
|
||||
public oc.c #FD:EntityLiving/field_70714_bg #tasks
|
||||
#public ng.bG #FD:EntityLiving/field_70703_bu #isJumping # -- MISSING MAPPING
|
||||
# EntityAIOcelotSit
|
||||
protected ou.a(Lzv;III)Z #MD:EntityAIOcelotSit/func_75398_a #nearestSittableBlock
|
||||
protected ou.f()Z #MD:EntityAIOcelotSit/func_75399_f #isblocksittable
|
||||
protected qc.a(Labq;III)Z #MD:EntityAIOcelotSit/func_75398_a #nearestSittableBlock
|
||||
protected qc.f()Z #MD:EntityAIOcelotSit/func_75399_f #isblocksittable
|
||||
# CallableMinecraftVersion - sanity check the MC version
|
||||
public c #CL:CallableMinecraftVersion
|
||||
public c.<init>(Lb;)V #MD:CallableMinecraftVersion/<init>(Lnet/minecraft/src/CrashReport;) #constructor
|
||||
# EntityAnimal
|
||||
public qb.d #FD:EntityAnimal/field_70881_d #inLove
|
||||
public rl.bp #FD:EntityAnimal/field_70881_d #inLove
|
||||
# WorldType
|
||||
public aaf.<init>(ILjava/lang/String;)V #MD:WorldType/<init>(ILjava/lang/String;)
|
||||
public aaf.<init>(ILjava/lang/String;I)V #MD:WorldType/<init>(ILjava/lang/String;I)
|
||||
public aca.<init>(ILjava/lang/String;)V #MD:WorldType/<init>(ILjava/lang/String;)
|
||||
public aca.<init>(ILjava/lang/String;I)V #MD:WorldType/<init>(ILjava/lang/String;I)
|
||||
# ComponentVillage
|
||||
public ahj #CL:ComponentVillage
|
||||
public aje #CL:ComponentVillage
|
||||
# EntityVillager - minmax lists
|
||||
public sg.a(Lzl;ILjava/util/Random;F)V #MD:EntityVillager/func_70948_a #addBuy
|
||||
public sg.b(Lzl;ILjava/util/Random;F)V #MD:EntityVillager/func_70949_b #addSell
|
||||
public sg.bP #FD:EntityVillager/field_70958_bB
|
||||
public sg.bQ #FD:EntityVillager/field_70960_bC
|
||||
public tv.a(Labg;ILjava/util/Random;F)V #MD:EntityVillager/func_70948_a #addBuy
|
||||
public tv.b(Labg;ILjava/util/Random;F)V #MD:EntityVillager/func_70949_b #addSell
|
||||
public tv.bB #FD:EntityVillager/field_70958_bB
|
||||
public tv.bC #FD:EntityVillager/field_70960_bC
|
||||
# GuiButtonMerchant
|
||||
public azc #CL:GuiButtonMerchant
|
||||
public axn #CL:GuiButtonMerchant
|
||||
|
||||
protected awe.a #FD:GuiYesNo/field_73942_a #guiScreen
|
||||
protected aun.a #FD:GuiYesNo/field_73942_a #guiScreen
|
||||
# Minecraft
|
||||
public atm.C #FD:Minecraft/field_71425_J #running
|
||||
public atm.M #FD:Minecraft/field_71446_o # textureManager
|
||||
@@ -2,11 +2,11 @@
|
||||
# Only runs at runtime because it's not necessary at compile time
|
||||
# has deobf and obf mappings so it runs OK in mcp
|
||||
# entityplayer -> network/player
|
||||
sk cpw/mods/fml/common/network/Player
|
||||
tz cpw/mods/fml/common/network/Player
|
||||
net.minecraft.entity.player.EntityPlayer cpw/mods/fml/common/network/Player
|
||||
# block -> blockproxy
|
||||
aou cpw/mods/fml/common/registry/BlockProxy
|
||||
aqr cpw/mods/fml/common/registry/BlockProxy
|
||||
net.minecraft.block.Block cpw/mods/fml/common/registry/BlockProxy
|
||||
# item -> itemproxy
|
||||
we cpw/mods/fml/common/registry/ItemProxy
|
||||
xw cpw/mods/fml/common/registry/ItemProxy
|
||||
net.minecraft.item.Item cpw/mods/fml/common/registry/ItemProxy
|
||||
+2
-2
@@ -3,8 +3,8 @@
|
||||
"modid": "mcp",
|
||||
"name": "Minecraft Coder Pack",
|
||||
"description": "Modding toolkit to decompile and deobfuscate the Minecraft client and server files.",
|
||||
"version": "7.42",
|
||||
"mcversion": "1.5",
|
||||
"version": "7.51",
|
||||
"mcversion": "1.5.2",
|
||||
"logoFile": "/mcp.png",
|
||||
"url": "http://mcp.ocean-labs.de/",
|
||||
"updateUrl": "",
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ break-closing-brackets
|
||||
|
||||
indent-switches
|
||||
|
||||
max-instatement-indent=2
|
||||
max-instatement-indent=40
|
||||
|
||||
pad-oper
|
||||
pad-header
|
||||
|
||||
+382
-150
File diff suppressed because it is too large.
Load diff
+93
-61
@@ -167,6 +167,7 @@ net/minecraft/client/Minecraft.func_71404_a(Lnet/minecraft/src/CrashReport;)V=|p
|
||||
net/minecraft/client/Minecraft.func_71409_c(Ljava/lang/String;)Z=|p_71409_1_
|
||||
net/minecraft/client/Minecraft.main([Ljava/lang/String;)V=|p_main_0_
|
||||
net/minecraft/server/MinecraftServer.<init>(Ljava/io/File;)V=|p_i3375_1_
|
||||
net/minecraft/server/MinecraftServer.func_104055_i(Z)V=|p_104055_1_
|
||||
net/minecraft/server/MinecraftServer.func_70000_a(Lnet/minecraft/src/PlayerUsageSnooper;)V=|p_70000_1_
|
||||
net/minecraft/server/MinecraftServer.func_70001_b(Lnet/minecraft/src/PlayerUsageSnooper;)V=|p_70001_1_
|
||||
net/minecraft/server/MinecraftServer.func_70003_b(ILjava/lang/String;)Z=|p_70003_1_,p_70003_2_
|
||||
@@ -666,7 +667,6 @@ net/minecraft/src/BlockDirectional.<init>(ILnet/minecraft/src/Material;)V=|p_i39
|
||||
net/minecraft/src/BlockDirectional.func_72217_d(I)I=|p_72217_0_
|
||||
net/minecraft/src/BlockDirt.<init>(I)V=|p_i9052_1_
|
||||
net/minecraft/src/BlockDispenser.<init>(I)V=|p_i3938_1_
|
||||
net/minecraft/src/BlockDispenser.func_100001_j_(I)Lnet/minecraft/src/EnumFacing;=|p_100001_0_
|
||||
net/minecraft/src/BlockDispenser.func_100009_j_(I)Lnet/minecraft/src/EnumFacing;=|p_100009_0_
|
||||
net/minecraft/src/BlockDispenser.func_71847_b(Lnet/minecraft/src/World;IIILjava/util/Random;)V=|p_71847_1_,p_71847_2_,p_71847_3_,p_71847_4_,p_71847_5_
|
||||
net/minecraft/src/BlockDispenser.func_71852_a(Lnet/minecraft/src/World;IIIII)V=|p_71852_1_,p_71852_2_,p_71852_3_,p_71852_4_,p_71852_5_,p_71852_6_
|
||||
@@ -868,6 +868,7 @@ net/minecraft/src/BlockFurnace.func_71861_g(Lnet/minecraft/src/World;III)V=|p_71
|
||||
net/minecraft/src/BlockFurnace.func_71862_a(Lnet/minecraft/src/World;IIILjava/util/Random;)V=|p_71862_1_,p_71862_2_,p_71862_3_,p_71862_4_,p_71862_5_
|
||||
net/minecraft/src/BlockFurnace.func_71885_a(ILjava/util/Random;I)I=|p_71885_1_,p_71885_2_,p_71885_3_
|
||||
net/minecraft/src/BlockFurnace.func_71903_a(Lnet/minecraft/src/World;IIILnet/minecraft/src/EntityPlayer;IFFF)Z=|p_71903_1_,p_71903_2_,p_71903_3_,p_71903_4_,p_71903_5_,p_71903_6_,p_71903_7_,p_71903_8_,p_71903_9_
|
||||
net/minecraft/src/BlockFurnace.func_71922_a(Lnet/minecraft/src/World;III)I=|p_71922_1_,p_71922_2_,p_71922_3_,p_71922_4_
|
||||
net/minecraft/src/BlockFurnace.func_72274_a(Lnet/minecraft/src/World;)Lnet/minecraft/src/TileEntity;=|p_72274_1_
|
||||
net/minecraft/src/BlockFurnace.func_72285_l(Lnet/minecraft/src/World;III)V=|p_72285_1_,p_72285_2_,p_72285_3_,p_72285_4_
|
||||
net/minecraft/src/BlockFurnace.func_72286_a(ZLnet/minecraft/src/World;III)V=|p_72286_0_,p_72286_1_,p_72286_2_,p_72286_3_,p_72286_4_
|
||||
@@ -1559,6 +1560,12 @@ net/minecraft/src/CallableChunkPosHash.<init>(Lnet/minecraft/src/MapGenStructure
|
||||
net/minecraft/src/CallableClientMemoryStats.<init>(Lnet/minecraft/client/Minecraft;)V=|p_i5000_1_
|
||||
net/minecraft/src/CallableClientProfiler.<init>(Lnet/minecraft/client/Minecraft;)V=|p_i3017_1_
|
||||
net/minecraft/src/CallableCrashMemoryReport.<init>(Lnet/minecraft/src/CrashReport;)V=|p_i6000_1_
|
||||
net/minecraft/src/CallableEffectAmplifier.<init>(Lnet/minecraft/src/EntityLiving;Lnet/minecraft/src/PotionEffect;)V=|p_i22006_1_,p_i22006_2_
|
||||
net/minecraft/src/CallableEffectDuration.<init>(Lnet/minecraft/src/EntityLiving;Lnet/minecraft/src/PotionEffect;)V=|p_i22005_1_,p_i22005_2_
|
||||
net/minecraft/src/CallableEffectID.<init>(Lnet/minecraft/src/EntityLiving;Lnet/minecraft/src/PotionEffect;)V=|p_i22004_1_,p_i22004_2_
|
||||
net/minecraft/src/CallableEffectIsAmbient.<init>(Lnet/minecraft/src/EntityLiving;Lnet/minecraft/src/PotionEffect;)V=|p_i22008_1_,p_i22008_2_
|
||||
net/minecraft/src/CallableEffectIsSplash.<init>(Lnet/minecraft/src/EntityLiving;Lnet/minecraft/src/PotionEffect;)V=|p_i22007_1_,p_i22007_2_
|
||||
net/minecraft/src/CallableEffectName.<init>(Lnet/minecraft/src/EntityLiving;Lnet/minecraft/src/PotionEffect;)V=|p_i22003_1_,p_i22003_2_
|
||||
net/minecraft/src/CallableEntityName.<init>(Lnet/minecraft/src/Entity;)V=|p_i10048_1_
|
||||
net/minecraft/src/CallableEntityTracker.<init>(Lnet/minecraft/src/EntityTracker;I)V=|p_i10045_1_,p_i10045_2_
|
||||
net/minecraft/src/CallableEntityType.<init>(Lnet/minecraft/src/Entity;)V=|p_i6811_1_
|
||||
@@ -1656,7 +1663,7 @@ net/minecraft/src/Chunk.func_76627_f(III)V=|p_76627_1_,p_76627_2_,p_76627_3_
|
||||
net/minecraft/src/Chunk.func_76628_c(III)I=|p_76628_1_,p_76628_2_,p_76628_3_
|
||||
net/minecraft/src/Chunk.func_76629_c(IIII)I=|p_76629_1_,p_76629_2_,p_76629_3_,p_76629_4_
|
||||
net/minecraft/src/Chunk.func_76633_a(Lnet/minecraft/src/EnumSkyBlock;IIII)V=|p_76633_1_,p_76633_2_,p_76633_3_,p_76633_4_,p_76633_5_
|
||||
net/minecraft/src/ChunkCache.<init>(Lnet/minecraft/src/World;IIIIII)V=|p_i3740_1_,p_i3740_2_,p_i3740_3_,p_i3740_4_,p_i3740_5_,p_i3740_6_,p_i3740_7_
|
||||
net/minecraft/src/ChunkCache.<init>(Lnet/minecraft/src/World;IIIIIII)V=|p_i22009_1_,p_i22009_2_,p_i22009_3_,p_i22009_4_,p_i22009_5_,p_i22009_6_,p_i22009_7_,p_i22009_8_
|
||||
net/minecraft/src/ChunkCache.func_72796_p(III)Lnet/minecraft/src/TileEntity;=|p_72796_1_,p_72796_2_,p_72796_3_
|
||||
net/minecraft/src/ChunkCache.func_72797_t(III)Z=|p_72797_1_,p_72797_2_,p_72797_3_
|
||||
net/minecraft/src/ChunkCache.func_72798_a(III)I=|p_72798_1_,p_72798_2_,p_72798_3_
|
||||
@@ -3869,7 +3876,7 @@ net/minecraft/src/GuiCommandBlock.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73
|
||||
net/minecraft/src/GuiCommandBlock.func_73864_a(III)V=|p_73864_1_,p_73864_2_,p_73864_3_
|
||||
net/minecraft/src/GuiCommandBlock.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
net/minecraft/src/GuiCommandBlock.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/GuiConfirmOpenLink.<init>(Lnet/minecraft/src/GuiScreen;Ljava/lang/String;I)V=|p_i3102_1_,p_i3102_2_,p_i3102_3_
|
||||
net/minecraft/src/GuiConfirmOpenLink.<init>(Lnet/minecraft/src/GuiScreen;Ljava/lang/String;IZ)V=|p_i23004_1_,p_i23004_2_,p_i23004_3_,p_i23004_4_
|
||||
net/minecraft/src/GuiConfirmOpenLink.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiConfirmOpenLink.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/GuiConnecting.<init>(Lnet/minecraft/src/GuiScreen;Lnet/minecraft/client/Minecraft;Ljava/lang/String;I)V=|p_i11014_1_,p_i11014_2_,p_i11014_3_,p_i11014_4_
|
||||
@@ -3888,6 +3895,7 @@ net/minecraft/src/GuiConnecting.func_74257_b(Lnet/minecraft/src/GuiConnecting;)Z
|
||||
net/minecraft/src/GuiConnecting.func_98096_h(Lnet/minecraft/src/GuiConnecting;)Lnet/minecraft/client/Minecraft;=|p_98096_0_
|
||||
net/minecraft/src/GuiConnecting.func_98097_e(Lnet/minecraft/src/GuiConnecting;)Lnet/minecraft/src/GuiScreen;=|p_98097_0_
|
||||
net/minecraft/src/GuiContainer.<init>(Lnet/minecraft/src/Container;)V=|p_i3079_1_
|
||||
net/minecraft/src/GuiContainer.func_102021_a(Ljava/util/List;II)V=|p_102021_1_,p_102021_2_,p_102021_3_
|
||||
net/minecraft/src/GuiContainer.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiContainer.func_73864_a(III)V=|p_73864_1_,p_73864_2_,p_73864_3_
|
||||
net/minecraft/src/GuiContainer.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
@@ -4019,6 +4027,26 @@ net/minecraft/src/GuiLogOutputHandler.<init>(Ljavax/swing/JTextArea;)V=|p_i4102_
|
||||
net/minecraft/src/GuiLogOutputHandler.close()V=|
|
||||
net/minecraft/src/GuiLogOutputHandler.flush()V=|
|
||||
net/minecraft/src/GuiLogOutputHandler.publish(Ljava/util/logging/LogRecord;)V=|p_publish_1_
|
||||
net/minecraft/src/GuiMainMenu.func_104004_a(Lnet/minecraft/src/GuiMainMenu;)Ljava/lang/Object;=|p_104004_0_
|
||||
net/minecraft/src/GuiMainMenu.func_104005_a(Lnet/minecraft/src/GuiMainMenu;Ljava/lang/String;)Ljava/lang/String;=|p_104005_0_,p_104005_1_
|
||||
net/minecraft/src/GuiMainMenu.func_104006_a(Lnet/minecraft/src/GuiMainMenu;I)I=|p_104006_0_,p_104006_1_
|
||||
net/minecraft/src/GuiMainMenu.func_104007_d(Lnet/minecraft/src/GuiMainMenu;)Lnet/minecraft/src/FontRenderer;=|p_104007_0_
|
||||
net/minecraft/src/GuiMainMenu.func_104008_c(Lnet/minecraft/src/GuiMainMenu;I)I=|p_104008_0_,p_104008_1_
|
||||
net/minecraft/src/GuiMainMenu.func_104009_d(Lnet/minecraft/src/GuiMainMenu;I)I=|p_104009_0_,p_104009_1_
|
||||
net/minecraft/src/GuiMainMenu.func_98059_a(Z)Z=|p_98059_0_
|
||||
net/minecraft/src/GuiMainMenu.func_104011_e(Lnet/minecraft/src/GuiMainMenu;I)I=|p_104011_0_,p_104011_1_
|
||||
net/minecraft/src/GuiMainMenu.func_104012_f(Lnet/minecraft/src/GuiMainMenu;I)I=|p_104012_0_,p_104012_1_
|
||||
net/minecraft/src/GuiMainMenu.func_104013_b(Lnet/minecraft/src/GuiMainMenu;Ljava/lang/String;)Ljava/lang/String;=|p_104013_0_,p_104013_1_
|
||||
net/minecraft/src/GuiMainMenu.func_104014_b(Lnet/minecraft/src/GuiMainMenu;I)I=|p_104014_0_,p_104014_1_
|
||||
net/minecraft/src/GuiMainMenu.func_104015_f(Lnet/minecraft/src/GuiMainMenu;)I=|p_104015_0_
|
||||
net/minecraft/src/GuiMainMenu.func_104016_e(Lnet/minecraft/src/GuiMainMenu;)I=|p_104016_0_
|
||||
net/minecraft/src/GuiMainMenu.func_98058_a(Lnet/minecraft/src/GuiMainMenu;)Lnet/minecraft/client/Minecraft;=|p_98058_0_
|
||||
net/minecraft/src/GuiMainMenu.func_104018_h(Lnet/minecraft/src/GuiMainMenu;)I=|p_104018_0_
|
||||
net/minecraft/src/GuiMainMenu.func_104019_g(Lnet/minecraft/src/GuiMainMenu;)Ljava/util/List;=|p_104019_0_
|
||||
net/minecraft/src/GuiMainMenu.func_104020_i(Lnet/minecraft/src/GuiMainMenu;)I=|p_104020_0_
|
||||
net/minecraft/src/GuiMainMenu.func_98061_a(Lnet/minecraft/src/GuiMainMenu;Lnet/minecraft/src/StringTranslate;II)V=|p_98061_0_,p_98061_1_,p_98061_2_,p_98061_3_
|
||||
net/minecraft/src/GuiMainMenu.func_104022_c(Lnet/minecraft/src/GuiMainMenu;)Lnet/minecraft/src/FontRenderer;=|p_104022_0_
|
||||
net/minecraft/src/GuiMainMenu.func_104023_b(Lnet/minecraft/src/GuiMainMenu;)Ljava/lang/String;=|p_104023_0_
|
||||
net/minecraft/src/GuiMainMenu.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiMainMenu.func_73864_a(III)V=|p_73864_1_,p_73864_2_,p_73864_3_
|
||||
net/minecraft/src/GuiMainMenu.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
@@ -4030,10 +4058,7 @@ net/minecraft/src/GuiMainMenu.func_73970_b(IIF)V=|p_73970_1_,p_73970_2_,p_73970_
|
||||
net/minecraft/src/GuiMainMenu.func_73971_c(IIF)V=|p_73971_1_,p_73971_2_,p_73971_3_
|
||||
net/minecraft/src/GuiMainMenu.func_73972_b(IILnet/minecraft/src/StringTranslate;)V=|p_73972_1_,p_73972_2_,p_73972_3_
|
||||
net/minecraft/src/GuiMainMenu.func_96137_a(Lnet/minecraft/src/StringTranslate;II)V=|p_96137_1_,p_96137_2_,p_96137_3_
|
||||
net/minecraft/src/GuiMainMenu.func_98058_a(Lnet/minecraft/src/GuiMainMenu;)Lnet/minecraft/client/Minecraft;=|p_98058_0_
|
||||
net/minecraft/src/GuiMainMenu.func_98059_a(Z)Z=|p_98059_0_
|
||||
net/minecraft/src/GuiMainMenu.func_98060_b(Lnet/minecraft/src/StringTranslate;II)V=|p_98060_1_,p_98060_2_,p_98060_3_
|
||||
net/minecraft/src/GuiMainMenu.func_98061_a(Lnet/minecraft/src/GuiMainMenu;Lnet/minecraft/src/StringTranslate;II)V=|p_98061_0_,p_98061_1_,p_98061_2_,p_98061_3_
|
||||
net/minecraft/src/GuiMemoryErrorScreen.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiMemoryErrorScreen.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
net/minecraft/src/GuiMemoryErrorScreen.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
@@ -4143,19 +4168,13 @@ net/minecraft/src/GuiScreenConfigureWorld.func_96274_a(Lnet/minecraft/src/GuiScr
|
||||
net/minecraft/src/GuiScreenConfirmation.<init>(Lnet/minecraft/src/GuiScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V=|p_i10019_1_,p_i10019_2_,p_i10019_3_,p_i10019_4_,p_i10019_5_
|
||||
net/minecraft/src/GuiScreenConfirmation.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.<init>(Lnet/minecraft/src/GuiScreen;)V=|p_i10010_1_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_96246_c(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)Lnet/minecraft/client/Minecraft;=|p_96246_0_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_96247_b(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)Lnet/minecraft/src/GuiScreen;=|p_96247_0_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_73864_a(III)V=|p_73864_1_,p_73864_2_,p_73864_3_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_96246_c(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)Lnet/minecraft/client/Minecraft;=|p_96246_0_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_96247_b(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)Lnet/minecraft/src/GuiScreen;=|p_96247_0_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_96248_a(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)Lnet/minecraft/client/Minecraft;=|p_96248_0_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_96251_a(Lnet/minecraft/src/Location;Ljava/lang/String;Ljava/lang/String;)V=|p_96251_1_,p_96251_2_,p_96251_3_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_98099_d(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)Lnet/minecraft/client/Minecraft;=|p_98099_0_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_98100_a(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;Lnet/minecraft/src/Location;)Lnet/minecraft/src/Location;=|p_98100_0_,p_98100_1_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_98101_b(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)Lnet/minecraft/src/Location;=|p_98101_0_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_98102_a(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;Ljava/util/List;)Ljava/util/List;=|p_98102_0_,p_98102_1_
|
||||
net/minecraft/src/GuiScreenCreateOnlineWorld.func_98103_c(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)Ljava/util/List;=|p_98103_0_
|
||||
net/minecraft/src/GuiScreenDemo.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiScreenDemo.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/GuiScreenDisconnectedOnline.<init>(Lnet/minecraft/src/GuiScreen;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V=|p_i11007_1_,p_i11007_2_,p_i11007_3_,p_i11007_4_
|
||||
@@ -4167,7 +4186,8 @@ net/minecraft/src/GuiScreenEditOnlineWorld.func_73863_a(IIF)V=|p_73863_1_,p_7386
|
||||
net/minecraft/src/GuiScreenEditOnlineWorld.func_73864_a(III)V=|p_73864_1_,p_73864_2_,p_73864_3_
|
||||
net/minecraft/src/GuiScreenEditOnlineWorld.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
net/minecraft/src/GuiScreenEditOnlineWorld.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/GuiScreenInvite.<init>(Lnet/minecraft/src/GuiScreen;Lnet/minecraft/src/GuiScreen;Lnet/minecraft/src/McoServer;)V=|p_i10015_1_,p_i10015_2_,p_i10015_3_
|
||||
net/minecraft/src/GuiScreenInvite.<init>(Lnet/minecraft/src/GuiScreen;Lnet/minecraft/src/GuiScreenConfigureWorld;Lnet/minecraft/src/McoServer;)V=|p_i22002_1_,p_i22002_2_,p_i22002_3_
|
||||
net/minecraft/src/GuiScreenInvite.func_101015_a(Ljava/lang/String;)V=|p_101015_1_
|
||||
net/minecraft/src/GuiScreenInvite.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiScreenInvite.func_73864_a(III)V=|p_73864_1_,p_73864_2_,p_73864_3_
|
||||
net/minecraft/src/GuiScreenInvite.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
@@ -4179,38 +4199,47 @@ net/minecraft/src/GuiScreenLongRunningTask.func_73875_a(Lnet/minecraft/src/GuiBu
|
||||
net/minecraft/src/GuiScreenLongRunningTask.func_96209_a(Ljava/lang/String;)V=|p_96209_1_
|
||||
net/minecraft/src/GuiScreenLongRunningTask.func_96210_b(Ljava/lang/String;)V=|p_96210_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.<init>(Lnet/minecraft/src/GuiScreen;)V=|p_i10007_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98079_k(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98079_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101001_e(IIII)V=|p_101001_1_,p_101001_2_,p_101001_3_,p_101001_4_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101006_d(IIII)V=|p_101006_1_,p_101006_2_,p_101006_3_,p_101006_4_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101008_c(IIII)V=|p_101008_1_,p_101008_2_,p_101008_3_,p_101008_4_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101009_c(Lnet/minecraft/src/GuiScreenOnlineServers;IIII)V=|p_101009_0_,p_101009_1_,p_101009_2_,p_101009_3_,p_101009_4_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101012_b(Lnet/minecraft/src/GuiScreenOnlineServers;IIII)V=|p_101012_0_,p_101012_1_,p_101012_2_,p_101012_3_,p_101012_4_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_102018_a(J)V=|p_102018_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101011_a(Lnet/minecraft/src/GuiScreenOnlineServers;Ljava/lang/String;)Ljava/lang/String;=|p_101011_0_,p_101011_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98074_m(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98074_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98087_l(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98087_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101004_o(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_101004_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_104030_a(Lnet/minecraft/src/GuiScreenOnlineServers;IIIII)V=|p_104030_0_,p_104030_1_,p_104030_2_,p_104030_3_,p_104030_4_,p_104030_5_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_104031_c(Lnet/minecraft/src/GuiScreenOnlineServers;IIII)V=|p_104031_0_,p_104031_1_,p_104031_2_,p_104031_3_,p_104031_4_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_104032_j(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_104032_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101000_n(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_101000_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101002_a(Lnet/minecraft/src/GuiScreenOnlineServers;Lnet/minecraft/src/McoServer;)V=java/io/IOException|p_101002_0_,p_101002_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98091_h(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_98091_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_104038_i(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_104038_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_104039_b(IIIII)V=|p_104039_1_,p_104039_2_,p_104039_3_,p_104039_4_,p_104039_5_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98084_i(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98084_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101005_j(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_101005_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96159_a(I)V=|p_96159_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96161_f(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/GuiButton;=|p_96161_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96165_a(Ljava/lang/String;II)V=|p_96165_1_,p_96165_2_,p_96165_3_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96168_c(II)V=|p_96168_1_,p_96168_2_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96174_a(Lnet/minecraft/src/McoServer;)V=java/io/IOException|p_96174_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96175_b(II)V=|p_96175_1_,p_96175_2_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96177_a(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_96177_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96179_a(Lnet/minecraft/src/GuiScreenOnlineServers;Lnet/minecraft/src/McoServer;)V=java/io/IOException|p_96179_0_,p_96179_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96182_l(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_96182_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98070_a(Lnet/minecraft/src/GuiScreenOnlineServers;II)V=|p_98070_0_,p_98070_1_,p_98070_2_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98071_n(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_98071_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98072_d(Lnet/minecraft/src/GuiScreenOnlineServers;)I=|p_98072_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98074_m(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98074_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98075_b(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_98075_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98076_f(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_98076_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98077_c(Lnet/minecraft/src/GuiScreenOnlineServers;II)V=|p_98077_0_,p_98077_1_,p_98077_2_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98078_c(Lnet/minecraft/src/GuiScreenOnlineServers;I)V=|p_98078_0_,p_98078_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98079_k(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98079_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98081_a(Lnet/minecraft/src/GuiScreenOnlineServers;I)I=|p_98081_0_,p_98081_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98083_b(Lnet/minecraft/src/GuiScreenOnlineServers;II)V=|p_98083_0_,p_98083_1_,p_98083_2_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98084_i(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98084_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98085_a(Lnet/minecraft/src/GuiScreenOnlineServers;Ljava/lang/String;)Ljava/lang/String;=|p_98085_0_,p_98085_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98086_a(J)Lnet/minecraft/src/McoServer;=|p_98086_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98087_l(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98087_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98088_b(II)V=|p_98088_1_,p_98088_2_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98089_b(Lnet/minecraft/src/GuiScreenOnlineServers;I)I=|p_98089_0_,p_98089_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98091_h(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98091_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98092_g(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/GuiButton;=|p_98092_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_98094_c(Lnet/minecraft/src/GuiScreenOnlineServers;)Ljava/util/List;=|p_98094_0_
|
||||
net/minecraft/src/GuiScreenOnlineServersSubscreen.<init>(IIII)V=|p_i23000_1_,p_i23000_2_,p_i23000_3_,p_i23000_4_
|
||||
net/minecraft/src/GuiScreenOnlineServersSubscreen.func_104069_a(Lnet/minecraft/src/GuiButton;)V=|p_104069_1_
|
||||
net/minecraft/src/GuiScreenOnlineServersSubscreen.func_104071_a(Lnet/minecraft/src/GuiScreen;Lnet/minecraft/src/FontRenderer;)V=|p_104071_1_,p_104071_2_
|
||||
net/minecraft/src/GuiScreenResetWorld.<init>(Lnet/minecraft/src/GuiScreen;Lnet/minecraft/src/McoServer;)V=|p_i10003_1_,p_i10003_2_
|
||||
net/minecraft/src/GuiScreenResetWorld.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiScreenResetWorld.func_73864_a(III)V=|p_73864_1_,p_73864_2_,p_73864_3_
|
||||
@@ -4218,16 +4247,14 @@ net/minecraft/src/GuiScreenResetWorld.func_73869_a(CI)V=|p_73869_1_,p_73869_2_
|
||||
net/minecraft/src/GuiScreenResetWorld.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/GuiScreenResetWorld.func_96147_b(Lnet/minecraft/src/GuiScreenResetWorld;)Lnet/minecraft/client/Minecraft;=|p_96147_0_
|
||||
net/minecraft/src/GuiScreenResetWorld.func_96148_a(Lnet/minecraft/src/GuiScreenResetWorld;)Lnet/minecraft/src/GuiScreen;=|p_96148_0_
|
||||
net/minecraft/src/GuiScreenSelectLocation.<init>(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;Ljava/util/List;Lnet/minecraft/src/Location;Ljava/lang/String;Ljava/lang/String;)V=|p_i10005_1_,p_i10005_2_,p_i10005_3_,p_i10005_4_,p_i10005_5_
|
||||
net/minecraft/src/GuiScreenSelectLocation.<init>(Lnet/minecraft/client/Minecraft;IIIII)V=|p_i23001_1_,p_i23001_2_,p_i23001_3_,p_i23001_4_,p_i23001_5_,p_i23001_6_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_104083_b(IIII)V=|p_104083_1_,p_104083_2_,p_104083_3_,p_104083_4_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_104084_a(IIII)V=|p_104084_1_,p_104084_2_,p_104084_3_,p_104084_4_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_104087_b(II)V=|p_104087_1_,p_104087_2_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_104088_a(IILnet/minecraft/src/Tessellator;)V=|p_104088_1_,p_104088_2_,p_104088_3_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_104089_a(II)V=|p_104089_1_,p_104089_2_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_96230_c(Lnet/minecraft/src/GuiScreenSelectLocation;)Lnet/minecraft/src/GuiSmallButton;=|p_96230_0_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_96231_e(Lnet/minecraft/src/GuiScreenSelectLocation;)Lnet/minecraft/src/FontRenderer;=|p_96231_0_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_96232_a(Lnet/minecraft/src/GuiScreenSelectLocation;)Lnet/minecraft/client/Minecraft;=|p_96232_0_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_96233_d(Lnet/minecraft/src/GuiScreenSelectLocation;)Lnet/minecraft/src/Location;=|p_96233_0_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_96234_a(Lnet/minecraft/src/GuiScreenSelectLocation;Lnet/minecraft/src/Location;)Lnet/minecraft/src/Location;=|p_96234_0_,p_96234_1_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_96235_f(Lnet/minecraft/src/GuiScreenSelectLocation;)Lnet/minecraft/src/FontRenderer;=|p_96235_0_
|
||||
net/minecraft/src/GuiScreenSelectLocation.func_96236_b(Lnet/minecraft/src/GuiScreenSelectLocation;)Ljava/util/List;=|p_96236_0_
|
||||
net/minecraft/src/GuiScreenServerList.<init>(Lnet/minecraft/src/GuiScreen;Lnet/minecraft/src/ServerData;)V=|p_i3066_1_,p_i3066_2_
|
||||
net/minecraft/src/GuiScreenServerList.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiScreenServerList.func_73864_a(III)V=|p_73864_1_,p_73864_2_,p_73864_3_
|
||||
@@ -4288,6 +4315,7 @@ net/minecraft/src/GuiSlotLanguage.func_77213_a(IZ)V=|p_77213_1_,p_77213_2_
|
||||
net/minecraft/src/GuiSlotLanguage.func_77214_a(IIIILnet/minecraft/src/Tessellator;)V=|p_77214_1_,p_77214_2_,p_77214_3_,p_77214_4_,p_77214_5_
|
||||
net/minecraft/src/GuiSlotLanguage.func_77218_a(I)Z=|p_77218_1_
|
||||
net/minecraft/src/GuiSlotOnlineServerList.<init>(Lnet/minecraft/src/GuiScreenOnlineServers;)V=|p_i10004_1_
|
||||
net/minecraft/src/GuiSlotOnlineServerList.func_104086_b(I)Z=|p_104086_1_
|
||||
net/minecraft/src/GuiSlotOnlineServerList.func_77213_a(IZ)V=|p_77213_1_,p_77213_2_
|
||||
net/minecraft/src/GuiSlotOnlineServerList.func_77214_a(IIIILnet/minecraft/src/Tessellator;)V=|p_77214_1_,p_77214_2_,p_77214_3_,p_77214_4_,p_77214_5_
|
||||
net/minecraft/src/GuiSlotOnlineServerList.func_77218_a(I)Z=|p_77218_1_
|
||||
@@ -4427,6 +4455,7 @@ net/minecraft/src/GuiYesNo.<init>(Lnet/minecraft/src/GuiScreen;Ljava/lang/String
|
||||
net/minecraft/src/GuiYesNo.<init>(Lnet/minecraft/src/GuiScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V=|p_i3048_1_,p_i3048_2_,p_i3048_3_,p_i3048_4_,p_i3048_5_,p_i3048_6_
|
||||
net/minecraft/src/GuiYesNo.func_73863_a(IIF)V=|p_73863_1_,p_73863_2_,p_73863_3_
|
||||
net/minecraft/src/GuiYesNo.func_73875_a(Lnet/minecraft/src/GuiButton;)V=|p_73875_1_
|
||||
net/minecraft/src/HttpUtil.func_104145_a(Ljava/net/URL;)Ljava/lang/String;=java/io/IOException|p_104145_0_
|
||||
net/minecraft/src/HttpUtil.func_76179_a(Ljava/util/Map;)Ljava/lang/String;=|p_76179_0_
|
||||
net/minecraft/src/HttpUtil.func_76180_a(Lnet/minecraft/src/ILogAgent;Ljava/net/URL;Ljava/lang/String;Z)Ljava/lang/String;=|p_76180_0_,p_76180_1_,p_76180_2_,p_76180_3_
|
||||
net/minecraft/src/HttpUtil.func_76181_a()I=java/io/IOException|
|
||||
@@ -4927,9 +4956,6 @@ net/minecraft/src/LoadingScreenRenderer.func_73719_c(Ljava/lang/String;)V=|p_737
|
||||
net/minecraft/src/LoadingScreenRenderer.func_73720_a(Ljava/lang/String;)V=|p_73720_1_
|
||||
net/minecraft/src/LoadingScreenRenderer.func_73721_b(Ljava/lang/String;)V=|p_73721_1_
|
||||
net/minecraft/src/LoadingScreenRenderer.func_73722_d(Ljava/lang/String;)V=|p_73722_1_
|
||||
net/minecraft/src/Location.func_98167_a(Largo/jdom/JsonNode;)Lnet/minecraft/src/Location;=|p_98167_0_
|
||||
net/minecraft/src/Location.func_98168_a(Largo/jdom/JsonNode;Ljava/lang/String;)Lnet/minecraft/src/Location;=|p_98168_0_,p_98168_1_
|
||||
net/minecraft/src/Locations.func_98174_a(Ljava/lang/String;)Lnet/minecraft/src/Locations;=|p_98174_0_
|
||||
net/minecraft/src/LogAgent.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V=|p_i11036_1_,p_i11036_2_,p_i11036_3_
|
||||
net/minecraft/src/LogAgent.func_98076_a()Ljava/util/logging/Logger;=|
|
||||
net/minecraft/src/LogAgent.func_98230_d(Ljava/lang/String;)V=|p_98230_1_
|
||||
@@ -5050,7 +5076,7 @@ net/minecraft/src/MathHelper.func_82716_a(Ljava/util/Random;DD)D=|p_82716_0_,p_8
|
||||
net/minecraft/src/McoClient.<init>(Lnet/minecraft/src/Session;)V=|p_i20001_1_
|
||||
net/minecraft/src/McoClient.func_96374_a(J)Lnet/minecraft/src/McoServerAddress;=net/minecraft/src/ExceptionMcoService,java/io/IOException|p_96374_1_
|
||||
net/minecraft/src/McoClient.func_96375_b()Ljava/lang/Boolean;=net/minecraft/src/ExceptionMcoService,java/io/IOException|
|
||||
net/minecraft/src/McoClient.func_96376_d(J)Ljava/lang/Boolean;=net/minecraft/src/ExceptionMcoService,java/io/IOException|p_96376_1_
|
||||
net/minecraft/src/McoClient.func_96376_d(JLjava/lang/String;)Ljava/lang/Boolean;=net/minecraft/src/ExceptionMcoService,java/io/UnsupportedEncodingException|p_96376_1_,p_96376_3_
|
||||
net/minecraft/src/McoClient.func_96377_a(Lnet/minecraft/src/Request;)Ljava/lang/String;=net/minecraft/src/ExceptionMcoService|p_96377_1_
|
||||
net/minecraft/src/McoClient.func_96378_c(J)Ljava/lang/Boolean;=net/minecraft/src/ExceptionMcoService,java/io/IOException|p_96378_1_
|
||||
net/minecraft/src/McoClient.func_96379_c()I=net/minecraft/src/ExceptionMcoService|
|
||||
@@ -5058,9 +5084,8 @@ net/minecraft/src/McoClient.func_96380_a(Ljava/lang/String;)Ljava/lang/String;=j
|
||||
net/minecraft/src/McoClient.func_96381_a(JLjava/lang/String;)V=net/minecraft/src/ExceptionMcoService|p_96381_1_,p_96381_3_
|
||||
net/minecraft/src/McoClient.func_96382_a()Lnet/minecraft/src/ValueObjectList;=net/minecraft/src/ExceptionMcoService|
|
||||
net/minecraft/src/McoClient.func_96383_b(J)Ljava/lang/Boolean;=net/minecraft/src/ExceptionMcoService,java/io/IOException|p_96383_1_
|
||||
net/minecraft/src/McoClient.func_96384_a(JLjava/lang/String;Ljava/lang/String;)V=net/minecraft/src/ExceptionMcoService,java/io/UnsupportedEncodingException|p_96384_1_,p_96384_3_,p_96384_4_
|
||||
net/minecraft/src/McoClient.func_96385_d()Lnet/minecraft/src/Locations;=net/minecraft/src/ExceptionMcoService,java/io/IOException|
|
||||
net/minecraft/src/McoClient.func_96386_a(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V=java/io/IOException,net/minecraft/src/ExceptionMcoService,java/io/UnsupportedEncodingException|p_96386_1_,p_96386_2_,p_96386_3_
|
||||
net/minecraft/src/McoClient.func_96384_a(JLjava/lang/String;Ljava/lang/String;II)V=net/minecraft/src/ExceptionMcoService,java/io/UnsupportedEncodingException|p_96384_1_,p_96384_3_,p_96384_4_,p_96384_5_,p_96384_6_
|
||||
net/minecraft/src/McoClient.func_96386_a(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V=net/minecraft/src/ExceptionMcoService,java/io/UnsupportedEncodingException|p_96386_1_,p_96386_2_,p_96386_3_,p_96386_4_
|
||||
net/minecraft/src/McoClient.func_96387_b(JLjava/lang/String;)Lnet/minecraft/src/McoServer;=net/minecraft/src/ExceptionMcoService,java/io/IOException|p_96387_1_,p_96387_3_
|
||||
net/minecraft/src/McoClient.func_98176_a(J)Lnet/minecraft/src/McoServer;=net/minecraft/src/ExceptionMcoService,java/io/IOException|p_98176_1_
|
||||
net/minecraft/src/McoClient.func_98177_f(J)Lnet/minecraft/src/ValueObjectSubscription;=net/minecraft/src/ExceptionMcoService,java/io/IOException|p_98177_1_
|
||||
@@ -6189,6 +6214,7 @@ net/minecraft/src/RenderBlaze.func_76986_a(Lnet/minecraft/src/Entity;DDDFF)V=|p_
|
||||
net/minecraft/src/RenderBlaze.func_77031_a(Lnet/minecraft/src/EntityLiving;DDDFF)V=|p_77031_1_,p_77031_2_,p_77031_4_,p_77031_6_,p_77031_8_,p_77031_9_
|
||||
net/minecraft/src/RenderBlaze.func_77067_a(Lnet/minecraft/src/EntityBlaze;DDDFF)V=|p_77067_1_,p_77067_2_,p_77067_4_,p_77067_6_,p_77067_8_,p_77067_9_
|
||||
net/minecraft/src/RenderBlocks.<init>(Lnet/minecraft/src/IBlockAccess;)V=|p_i3187_1_
|
||||
net/minecraft/src/RenderBlocks.func_102027_b(Lnet/minecraft/src/Block;IIIFFF)Z=|p_102027_1_,p_102027_2_,p_102027_3_,p_102027_4_,p_102027_5_,p_102027_6_,p_102027_7_
|
||||
net/minecraft/src/RenderBlocks.func_78565_t(Lnet/minecraft/src/BlockStairs;III)Z=|p_78565_1_,p_78565_2_,p_78565_3_,p_78565_4_
|
||||
net/minecraft/src/RenderBlocks.func_78566_o(Lnet/minecraft/src/Block;III)Z=|p_78566_1_,p_78566_2_,p_78566_3_,p_78566_4_
|
||||
net/minecraft/src/RenderBlocks.func_78567_v(Lnet/minecraft/src/BlockEndPortalFrame;III)Z=|p_78567_1_,p_78567_2_,p_78567_3_,p_78567_4_
|
||||
@@ -6584,6 +6610,7 @@ net/minecraft/src/RenderZombie.func_82430_a(Lnet/minecraft/src/EntityZombie;FFF)
|
||||
net/minecraft/src/ReportedException.<init>(Lnet/minecraft/src/CrashReport;)V=|p_i3253_1_
|
||||
net/minecraft/src/Request.<init>(Ljava/lang/String;II)V=|p_i10026_1_,p_i10026_2_,p_i10026_3_
|
||||
net/minecraft/src/Request.func_100006_a(Ljava/lang/String;Ljava/lang/String;)V=|p_100006_1_,p_100006_2_
|
||||
net/minecraft/src/Request.func_104064_a(Ljava/lang/String;Ljava/lang/String;II)Lnet/minecraft/src/Request;=|p_104064_0_,p_104064_1_,p_104064_2_,p_104064_3_
|
||||
net/minecraft/src/Request.func_96352_a(Ljava/io/InputStream;)Ljava/lang/String;=java/io/IOException|p_96352_1_
|
||||
net/minecraft/src/Request.func_96353_a(Ljava/lang/String;Ljava/lang/String;II)Lnet/minecraft/src/Request;=|p_96353_0_,p_96353_1_,p_96353_2_,p_96353_3_
|
||||
net/minecraft/src/Request.func_96355_b(Ljava/lang/String;)Lnet/minecraft/src/Request;=|p_96355_0_
|
||||
@@ -6594,6 +6621,7 @@ net/minecraft/src/RequestDelete.<init>(Ljava/lang/String;II)V=|p_i10031_1_,p_i10
|
||||
net/minecraft/src/RequestGet.<init>(Ljava/lang/String;II)V=|p_i10030_1_,p_i10030_2_,p_i10030_3_
|
||||
net/minecraft/src/RequestPost.<init>(Ljava/lang/String;[BII)V=|p_i10027_1_,p_i10027_2_,p_i10027_3_,p_i10027_4_
|
||||
net/minecraft/src/RequestPut.<init>(Ljava/lang/String;[BII)V=|p_i10029_1_,p_i10029_2_,p_i10029_3_,p_i10029_4_
|
||||
net/minecraft/src/RunnableTitleScreen.<init>(Lnet/minecraft/src/GuiMainMenu;)V=|p_i23005_1_
|
||||
net/minecraft/src/SaveFormatComparator.<init>(Ljava/lang/String;Ljava/lang/String;JJLnet/minecraft/src/EnumGameType;ZZZ)V=|p_i3917_1_,p_i3917_2_,p_i3917_3_,p_i3917_5_,p_i3917_7_,p_i3917_8_,p_i3917_9_,p_i3917_10_
|
||||
net/minecraft/src/SaveFormatComparator.compareTo(Ljava/lang/Object;)I=|p_compareTo_1_
|
||||
net/minecraft/src/SaveFormatComparator.func_75787_a(Lnet/minecraft/src/SaveFormatComparator;)I=|p_75787_1_
|
||||
@@ -6695,10 +6723,6 @@ net/minecraft/src/SelectionListInvited.func_96609_a(I)Z=|p_96609_1_
|
||||
net/minecraft/src/SelectionListInvited.func_96610_a(IIIILnet/minecraft/src/Tessellator;)V=|p_96610_1_,p_96610_2_,p_96610_3_,p_96610_4_,p_96610_5_
|
||||
net/minecraft/src/SelectionListInvited.func_96615_a(IZ)V=|p_96615_1_,p_96615_2_
|
||||
net/minecraft/src/SelectionListInvited.func_98263_b(IIIILnet/minecraft/src/Tessellator;)V=|p_98263_1_,p_98263_2_,p_98263_3_,p_98263_4_,p_98263_5_
|
||||
net/minecraft/src/SelectionListLocation.<init>(Lnet/minecraft/src/GuiScreenSelectLocation;)V=|p_i10002_1_
|
||||
net/minecraft/src/SelectionListLocation.func_77213_a(IZ)V=|p_77213_1_,p_77213_2_
|
||||
net/minecraft/src/SelectionListLocation.func_77214_a(IIIILnet/minecraft/src/Tessellator;)V=|p_77214_1_,p_77214_2_,p_77214_3_,p_77214_4_,p_77214_5_
|
||||
net/minecraft/src/SelectionListLocation.func_77218_a(I)Z=|p_77218_1_
|
||||
net/minecraft/src/ServerAddress.<init>(Ljava/lang/String;I)V=|p_i3096_1_,p_i3096_2_
|
||||
net/minecraft/src/ServerAddress.func_78860_a(Ljava/lang/String;)Lnet/minecraft/src/ServerAddress;=|p_78860_0_
|
||||
net/minecraft/src/ServerAddress.func_78862_a(Ljava/lang/String;I)I=|p_78862_0_,p_78862_1_
|
||||
@@ -6788,7 +6812,6 @@ net/minecraft/src/ServerList.func_78857_a(II)V=|p_78857_1_,p_78857_2_
|
||||
net/minecraft/src/ServerListenThread.<init>(Lnet/minecraft/src/NetworkListenThread;Ljava/net/InetAddress;I)V=java/io/IOException|p_i3384_1_,p_i3384_2_,p_i3384_3_
|
||||
net/minecraft/src/ServerListenThread.func_71764_a(Lnet/minecraft/src/NetLoginHandler;)V=|p_71764_1_
|
||||
net/minecraft/src/ServerListenThread.func_71769_a(Ljava/net/InetAddress;)V=|p_71769_1_
|
||||
net/minecraft/src/ServerListenThread.func_71770_b(Ljava/net/InetAddress;)Z=|p_71770_0_
|
||||
net/minecraft/src/ServerScoreboard.<init>(Lnet/minecraft/server/MinecraftServer;)V=|p_i10044_1_
|
||||
net/minecraft/src/ServerScoreboard.func_96512_b(Ljava/lang/String;Lnet/minecraft/src/ScorePlayerTeam;)V=|p_96512_1_,p_96512_2_
|
||||
net/minecraft/src/ServerScoreboard.func_96513_c(Lnet/minecraft/src/ScorePlayerTeam;)V=|p_96513_1_
|
||||
@@ -7065,8 +7088,8 @@ net/minecraft/src/TaskOnlineConnect.func_96580_a(Lnet/minecraft/src/TaskOnlineCo
|
||||
net/minecraft/src/TaskOnlineConnect.func_96582_a(Ljava/lang/String;I)V=|p_96582_1_,p_96582_2_
|
||||
net/minecraft/src/TaskOnlineConnect.func_96583_a(Lnet/minecraft/src/TaskOnlineConnect;Lnet/minecraft/src/NetClientHandler;)Lnet/minecraft/src/NetClientHandler;=|p_96583_0_,p_96583_1_
|
||||
net/minecraft/src/TaskOnlineConnect.func_98172_a(Lnet/minecraft/src/TaskOnlineConnect;)Lnet/minecraft/src/GuiScreen;=|p_98172_0_
|
||||
net/minecraft/src/TaskResetWorld.<init>(Lnet/minecraft/src/GuiScreenResetWorld;J)V=|p_i10011_1_,p_i10011_2_
|
||||
net/minecraft/src/TaskWorldCreation.<init>(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V=|p_i10017_1_,p_i10017_2_,p_i10017_3_,p_i10017_4_
|
||||
net/minecraft/src/TaskResetWorld.<init>(Lnet/minecraft/src/GuiScreenResetWorld;JLjava/lang/String;)V=|p_i23002_1_,p_i23002_2_,p_i23002_4_
|
||||
net/minecraft/src/TaskWorldCreation.<init>(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V=|p_i23003_1_,p_i23003_2_,p_i23003_3_,p_i23003_4_,p_i23003_5_
|
||||
net/minecraft/src/TcpConnection.<init>(Lnet/minecraft/src/ILogAgent;Ljava/net/Socket;Ljava/lang/String;Lnet/minecraft/src/NetHandler;)V=java/io/IOException|p_i11026_1_,p_i11026_2_,p_i11026_3_,p_i11026_4_
|
||||
net/minecraft/src/TcpConnection.<init>(Lnet/minecraft/src/ILogAgent;Ljava/net/Socket;Ljava/lang/String;Lnet/minecraft/src/NetHandler;Ljava/security/PrivateKey;)V=java/io/IOException|p_i11027_1_,p_i11027_2_,p_i11027_3_,p_i11027_4_,p_i11027_5_
|
||||
net/minecraft/src/TcpConnection.func_74424_a(Ljava/lang/String;[Ljava/lang/Object;)V=|p_74424_1_,p_74424_2_
|
||||
@@ -7113,6 +7136,7 @@ net/minecraft/src/Tessellator.func_78386_a(FFF)V=|p_78386_1_,p_78386_2_,p_78386_
|
||||
net/minecraft/src/Texture.<init>(Ljava/lang/String;IIIIIIII)V=|p_i11021_1_,p_i11021_2_,p_i11021_3_,p_i11021_4_,p_i11021_5_,p_i11021_6_,p_i11021_7_,p_i11021_8_,p_i11021_9_
|
||||
net/minecraft/src/Texture.<init>(Ljava/lang/String;IIIIIIIILjava/awt/image/BufferedImage;)V=|p_i11023_1_,p_i11023_2_,p_i11023_3_,p_i11023_4_,p_i11023_5_,p_i11023_6_,p_i11023_7_,p_i11023_8_,p_i11023_9_,p_i11023_10_
|
||||
net/minecraft/src/Texture.<init>(Ljava/lang/String;IIIIIIILjava/awt/image/BufferedImage;)V=|p_i11022_1_,p_i11022_2_,p_i11022_3_,p_i11022_4_,p_i11022_5_,p_i11022_6_,p_i11022_7_,p_i11022_8_,p_i11022_9_
|
||||
net/minecraft/src/Texture.func_104062_b(IILnet/minecraft/src/Texture;)V=|p_104062_1_,p_104062_2_,p_104062_3_
|
||||
net/minecraft/src/Texture.func_94272_a(Lnet/minecraft/src/Rect2i;I)V=|p_94272_1_,p_94272_2_
|
||||
net/minecraft/src/Texture.func_94277_a(I)V=|p_94277_1_
|
||||
net/minecraft/src/Texture.func_94278_a(Ljava/awt/image/BufferedImage;)V=|p_94278_1_
|
||||
@@ -7172,7 +7196,6 @@ net/minecraft/src/TexturedQuad.func_78236_a(Lnet/minecraft/src/Tessellator;F)V=|
|
||||
net/minecraft/src/ThreadClientSleep.<init>(Lnet/minecraft/client/Minecraft;Ljava/lang/String;)V=|p_i3019_1_,p_i3019_2_
|
||||
net/minecraft/src/ThreadConnectToOnlineServer.<init>(Lnet/minecraft/src/GuiSlotOnlineServerList;Lnet/minecraft/src/McoServer;)V=|p_i10009_1_,p_i10009_2_
|
||||
net/minecraft/src/ThreadConnectToServer.<init>(Lnet/minecraft/src/GuiConnecting;Ljava/lang/String;I)V=|p_i3110_1_,p_i3110_2_,p_i3110_3_
|
||||
net/minecraft/src/ThreadCreateOnlineWorldScreen.<init>(Lnet/minecraft/src/GuiScreenCreateOnlineWorld;)V=|p_i11008_1_
|
||||
net/minecraft/src/ThreadDedicatedServer.<init>(Lnet/minecraft/src/DedicatedServer;)V=|p_i11000_1_
|
||||
net/minecraft/src/ThreadDedicatedServer.run()V=|
|
||||
net/minecraft/src/ThreadDownloadImage.<init>(Lnet/minecraft/src/ThreadDownloadImageData;Ljava/lang/String;Lnet/minecraft/src/IImageBuffer;)V=|p_i5000_1_,p_i5000_2_,p_i5000_3_
|
||||
@@ -7218,6 +7241,8 @@ net/minecraft/src/TileEntityBeacon.func_94041_b(ILnet/minecraft/src/ItemStack;)Z
|
||||
net/minecraft/src/TileEntityBeacon.func_94047_a(Ljava/lang/String;)V=|p_94047_1_
|
||||
net/minecraft/src/TileEntityBeaconRenderer.func_76894_a(Lnet/minecraft/src/TileEntity;DDDF)V=|p_76894_1_,p_76894_2_,p_76894_4_,p_76894_6_,p_76894_8_
|
||||
net/minecraft/src/TileEntityBeaconRenderer.func_82398_a(Lnet/minecraft/src/TileEntityBeacon;DDDF)V=|p_82398_1_,p_82398_2_,p_82398_4_,p_82398_6_,p_82398_8_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_102007_a(ILnet/minecraft/src/ItemStack;I)Z=|p_102007_1_,p_102007_2_,p_102007_3_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_102008_b(ILnet/minecraft/src/ItemStack;I)Z=|p_102008_1_,p_102008_2_,p_102008_3_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_70298_a(II)Lnet/minecraft/src/ItemStack;=|p_70298_1_,p_70298_2_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_70299_a(ILnet/minecraft/src/ItemStack;)V=|p_70299_1_,p_70299_2_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_70300_a(Lnet/minecraft/src/EntityPlayer;)Z=|p_70300_1_
|
||||
@@ -7228,8 +7253,7 @@ net/minecraft/src/TileEntityBrewingStand.func_70310_b(Lnet/minecraft/src/NBTTagC
|
||||
net/minecraft/src/TileEntityBrewingStand.func_70352_b(ILnet/minecraft/src/ItemStack;)I=|p_70352_1_,p_70352_2_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_70354_c(I)V=|p_70354_1_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_94041_b(ILnet/minecraft/src/ItemStack;)Z=|p_94041_1_,p_94041_2_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_94127_c(I)I=|p_94127_1_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_94128_d(I)I=|p_94128_1_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_94128_d(I)[I=|p_94128_1_
|
||||
net/minecraft/src/TileEntityBrewingStand.func_94131_a(Ljava/lang/String;)V=|p_94131_1_
|
||||
net/minecraft/src/TileEntityChest.func_70298_a(II)Lnet/minecraft/src/ItemStack;=|p_70298_1_,p_70298_2_
|
||||
net/minecraft/src/TileEntityChest.func_70299_a(ILnet/minecraft/src/ItemStack;)V=|p_70299_1_,p_70299_2_
|
||||
@@ -7274,6 +7298,8 @@ net/minecraft/src/TileEntityEnderChest.func_70315_b(II)Z=|p_70315_1_,p_70315_2_
|
||||
net/minecraft/src/TileEntityEnderChest.func_70365_a(Lnet/minecraft/src/EntityPlayer;)Z=|p_70365_1_
|
||||
net/minecraft/src/TileEntityEnderChestRenderer.func_76894_a(Lnet/minecraft/src/TileEntity;DDDF)V=|p_76894_1_,p_76894_2_,p_76894_4_,p_76894_6_,p_76894_8_
|
||||
net/minecraft/src/TileEntityEnderChestRenderer.func_76899_a(Lnet/minecraft/src/TileEntityEnderChest;DDDF)V=|p_76899_1_,p_76899_2_,p_76899_4_,p_76899_6_,p_76899_8_
|
||||
net/minecraft/src/TileEntityFurnace.func_102007_a(ILnet/minecraft/src/ItemStack;I)Z=|p_102007_1_,p_102007_2_,p_102007_3_
|
||||
net/minecraft/src/TileEntityFurnace.func_102008_b(ILnet/minecraft/src/ItemStack;I)Z=|p_102008_1_,p_102008_2_,p_102008_3_
|
||||
net/minecraft/src/TileEntityFurnace.func_70298_a(II)Lnet/minecraft/src/ItemStack;=|p_70298_1_,p_70298_2_
|
||||
net/minecraft/src/TileEntityFurnace.func_70299_a(ILnet/minecraft/src/ItemStack;)V=|p_70299_1_,p_70299_2_
|
||||
net/minecraft/src/TileEntityFurnace.func_70300_a(Lnet/minecraft/src/EntityPlayer;)Z=|p_70300_1_
|
||||
@@ -7286,9 +7312,12 @@ net/minecraft/src/TileEntityFurnace.func_70398_a(Lnet/minecraft/src/ItemStack;)I
|
||||
net/minecraft/src/TileEntityFurnace.func_70401_b(Lnet/minecraft/src/ItemStack;)Z=|p_70401_0_
|
||||
net/minecraft/src/TileEntityFurnace.func_70403_d(I)I=|p_70403_1_
|
||||
net/minecraft/src/TileEntityFurnace.func_94041_b(ILnet/minecraft/src/ItemStack;)Z=|p_94041_1_,p_94041_2_
|
||||
net/minecraft/src/TileEntityFurnace.func_94127_c(I)I=|p_94127_1_
|
||||
net/minecraft/src/TileEntityFurnace.func_94128_d(I)I=|p_94128_1_
|
||||
net/minecraft/src/TileEntityFurnace.func_94128_d(I)[I=|p_94128_1_
|
||||
net/minecraft/src/TileEntityFurnace.func_94129_a(Ljava/lang/String;)V=|p_94129_1_
|
||||
net/minecraft/src/TileEntityHopper.func_102012_a(Lnet/minecraft/src/Hopper;Lnet/minecraft/src/IInventory;II)Z=|p_102012_0_,p_102012_1_,p_102012_2_,p_102012_3_
|
||||
net/minecraft/src/TileEntityHopper.func_102013_b(Lnet/minecraft/src/IInventory;Lnet/minecraft/src/ItemStack;II)Z=|p_102013_0_,p_102013_1_,p_102013_2_,p_102013_3_
|
||||
net/minecraft/src/TileEntityHopper.func_102014_c(Lnet/minecraft/src/IInventory;Lnet/minecraft/src/ItemStack;II)Lnet/minecraft/src/ItemStack;=|p_102014_0_,p_102014_1_,p_102014_2_,p_102014_3_
|
||||
net/minecraft/src/TileEntityHopper.func_102015_a(Lnet/minecraft/src/IInventory;Lnet/minecraft/src/ItemStack;II)Z=|p_102015_0_,p_102015_1_,p_102015_2_,p_102015_3_
|
||||
net/minecraft/src/TileEntityHopper.func_70298_a(II)Lnet/minecraft/src/ItemStack;=|p_70298_1_,p_70298_2_
|
||||
net/minecraft/src/TileEntityHopper.func_70299_a(ILnet/minecraft/src/ItemStack;)V=|p_70299_1_,p_70299_2_
|
||||
net/minecraft/src/TileEntityHopper.func_70300_a(Lnet/minecraft/src/EntityPlayer;)Z=|p_70300_1_
|
||||
@@ -7298,7 +7327,6 @@ net/minecraft/src/TileEntityHopper.func_70307_a(Lnet/minecraft/src/NBTTagCompoun
|
||||
net/minecraft/src/TileEntityHopper.func_70310_b(Lnet/minecraft/src/NBTTagCompound;)V=|p_70310_1_
|
||||
net/minecraft/src/TileEntityHopper.func_94041_b(ILnet/minecraft/src/ItemStack;)Z=|p_94041_1_,p_94041_2_
|
||||
net/minecraft/src/TileEntityHopper.func_94114_a(Lnet/minecraft/src/ItemStack;Lnet/minecraft/src/ItemStack;)Z=|p_94114_1_,p_94114_2_
|
||||
net/minecraft/src/TileEntityHopper.func_94115_a(Lnet/minecraft/src/IInventory;I)I=|p_94115_1_,p_94115_2_
|
||||
net/minecraft/src/TileEntityHopper.func_94117_a(Lnet/minecraft/src/IInventory;Lnet/minecraft/src/ItemStack;I)Lnet/minecraft/src/ItemStack;=|p_94117_1_,p_94117_2_,p_94117_3_
|
||||
net/minecraft/src/TileEntityHopper.func_96114_a(Lnet/minecraft/src/IInventory;Lnet/minecraft/src/EntityItem;)Z=|p_96114_0_,p_96114_1_
|
||||
net/minecraft/src/TileEntityHopper.func_96115_a(Ljava/lang/String;)V=|p_96115_1_
|
||||
@@ -7360,6 +7388,11 @@ net/minecraft/src/TileEntitySpecialRenderer.func_82392_a(Ljava/lang/String;Ljava
|
||||
net/minecraft/src/Timer.<init>(F)V=|p_i3005_1_
|
||||
net/minecraft/src/TimerTaskMcoServerListUpdate.<init>(Lnet/minecraft/src/McoServerList;)V=|p_i11000_1_
|
||||
net/minecraft/src/TimerTaskMcoServerListUpdate.<init>(Lnet/minecraft/src/McoServerList;Lnet/minecraft/src/McoServerListINNER1;)V=|p_i11001_1_,p_i11001_2_
|
||||
net/minecraft/src/TimerTaskMcoServerListUpdate.func_101018_a(Ljava/util/List;)V=|p_101018_1_
|
||||
net/minecraft/src/TimerTaskMcoServerListUpdateComparator.<init>(Lnet/minecraft/src/TimerTaskMcoServerListUpdate;Ljava/lang/String;)V=|p_i22000_1_,p_i22000_2_
|
||||
net/minecraft/src/TimerTaskMcoServerListUpdateComparator.<init>(Lnet/minecraft/src/TimerTaskMcoServerListUpdate;Ljava/lang/String;Lnet/minecraft/src/McoServerListINNER1;)V=|p_i22001_1_,p_i22001_2_,p_i22001_3_
|
||||
net/minecraft/src/TimerTaskMcoServerListUpdateComparator.compare(Ljava/lang/Object;Ljava/lang/Object;)I=|p_compare_1_,p_compare_2_
|
||||
net/minecraft/src/TimerTaskMcoServerListUpdateComparator.func_102023_a(Lnet/minecraft/src/McoServer;Lnet/minecraft/src/McoServer;)I=|p_102023_1_,p_102023_2_
|
||||
net/minecraft/src/Tuple.<init>(Ljava/lang/Object;Ljava/lang/Object;)V=|p_i3422_1_,p_i3422_2_
|
||||
net/minecraft/src/ValueObject.func_96394_a(Ljava/lang/reflect/Field;)Z=|p_96394_0_
|
||||
net/minecraft/src/ValueObjectList.func_98161_a(Ljava/lang/String;)Lnet/minecraft/src/ValueObjectList;=|p_98161_0_
|
||||
@@ -7441,7 +7474,7 @@ net/minecraft/src/WeightedRandomMinecart.<init>(Lnet/minecraft/src/MobSpawnerBas
|
||||
net/minecraft/src/WeightedRandomMinecart.<init>(Lnet/minecraft/src/MobSpawnerBaseLogic;Lnet/minecraft/src/NBTTagCompound;Ljava/lang/String;)V=|p_i11042_1_,p_i11042_2_,p_i11042_3_
|
||||
net/minecraft/src/World.<init>(Lnet/minecraft/src/ISaveHandler;Ljava/lang/String;Lnet/minecraft/src/WorldProvider;Lnet/minecraft/src/WorldSettings;Lnet/minecraft/src/Profiler;Lnet/minecraft/src/ILogAgent;)V=|p_i11043_1_,p_i11043_2_,p_i11043_3_,p_i11043_4_,p_i11043_5_,p_i11043_6_
|
||||
net/minecraft/src/World.<init>(Lnet/minecraft/src/ISaveHandler;Ljava/lang/String;Lnet/minecraft/src/WorldSettings;Lnet/minecraft/src/WorldProvider;Lnet/minecraft/src/Profiler;Lnet/minecraft/src/ILogAgent;)V=|p_i11044_1_,p_i11044_2_,p_i11044_3_,p_i11044_4_,p_i11044_5_,p_i11044_6_
|
||||
net/minecraft/src/World.func_100002_v()I=|
|
||||
net/minecraft/src/World.func_102026_a(Lnet/minecraft/src/Block;I)Z=|p_102026_1_,p_102026_2_
|
||||
net/minecraft/src/World.func_72796_p(III)Lnet/minecraft/src/TileEntity;=|p_72796_1_,p_72796_2_,p_72796_3_
|
||||
net/minecraft/src/World.func_72797_t(III)Z=|p_72797_1_,p_72797_2_,p_72797_3_
|
||||
net/minecraft/src/World.func_72798_a(III)I=|p_72798_1_,p_72798_2_,p_72798_3_
|
||||
@@ -7522,7 +7555,6 @@ net/minecraft/src/World.func_72900_e(Lnet/minecraft/src/Entity;)V=|p_72900_1_
|
||||
net/minecraft/src/World.func_72901_a(Lnet/minecraft/src/Vec3;Lnet/minecraft/src/Vec3;Z)Lnet/minecraft/src/MovingObjectPosition;=|p_72901_1_,p_72901_2_,p_72901_3_
|
||||
net/minecraft/src/World.func_72902_n(III)V=|p_72902_1_,p_72902_2_,p_72902_3_
|
||||
net/minecraft/src/World.func_72904_c(IIIIII)Z=|p_72904_1_,p_72904_2_,p_72904_3_,p_72904_4_,p_72904_5_,p_72904_6_
|
||||
net/minecraft/src/World.func_72906_B()V=net/minecraft/src/MinecraftException|
|
||||
net/minecraft/src/World.func_72907_a(Ljava/lang/Class;)I=|p_72907_1_
|
||||
net/minecraft/src/World.func_72908_a(DDDLjava/lang/String;FF)V=|p_72908_1_,p_72908_3_,p_72908_5_,p_72908_7_,p_72908_8_,p_72908_9_
|
||||
net/minecraft/src/World.func_72909_d(IIIIII)V=|p_72909_1_,p_72909_2_,p_72909_3_,p_72909_4_,p_72909_5_,p_72909_6_
|
||||
@@ -7581,6 +7613,7 @@ net/minecraft/src/World.func_72980_b(DDDLjava/lang/String;FFZ)V=|p_72980_1_,p_72
|
||||
net/minecraft/src/World.func_82733_a(Ljava/lang/Class;Lnet/minecraft/src/AxisAlignedBB;Lnet/minecraft/src/IEntitySelector;)Ljava/util/List;=|p_82733_1_,p_82733_2_,p_82733_3_
|
||||
net/minecraft/src/World.func_82734_g(II)I=|p_82734_1_,p_82734_2_
|
||||
net/minecraft/src/World.func_82735_a(Lnet/minecraft/src/EntityMinecart;)Lnet/minecraft/src/IUpdatePlayerListBox;=|p_82735_1_
|
||||
net/minecraft/src/World.func_72906_B()V=net/minecraft/src/MinecraftException|
|
||||
net/minecraft/src/World.func_82738_a(J)V=|p_82738_1_
|
||||
net/minecraft/src/World.func_82739_e(IIIII)V=|p_82739_1_,p_82739_2_,p_82739_3_,p_82739_4_,p_82739_5_
|
||||
net/minecraft/src/World.func_82740_a(IIIIII)V=|p_82740_1_,p_82740_2_,p_82740_3_,p_82740_4_,p_82740_5_,p_82740_6_
|
||||
@@ -7756,7 +7789,6 @@ net/minecraft/src/WorldManager.func_72710_a(III)V=|p_72710_1_,p_72710_2_,p_72710
|
||||
net/minecraft/src/WorldManager.func_72711_b(III)V=|p_72711_1_,p_72711_2_,p_72711_3_
|
||||
net/minecraft/src/WorldManager.func_82746_a(IIIII)V=|p_82746_1_,p_82746_2_,p_82746_3_,p_82746_4_,p_82746_5_
|
||||
net/minecraft/src/WorldManager.func_85102_a(Lnet/minecraft/src/EntityPlayer;Ljava/lang/String;DDDFF)V=|p_85102_1_,p_85102_2_,p_85102_3_,p_85102_5_,p_85102_7_,p_85102_9_,p_85102_10_
|
||||
net/minecraft/src/WorldProvider.func_100003_a(J)I=|p_100003_1_
|
||||
net/minecraft/src/WorldProvider.func_76558_a(Lnet/minecraft/src/World;)V=|p_76558_1_
|
||||
net/minecraft/src/WorldProvider.func_76559_b(J)I=|p_76559_1_
|
||||
net/minecraft/src/WorldProvider.func_76560_a(FF)[F=|p_76560_1_,p_76560_2_
|
||||
|
||||
+14084
-13995
File diff suppressed because it is too large.
Load diff
+18
-12
@@ -34,12 +34,12 @@ ReobfClientSrg = %(DirTemp)s/client_ro_srg.srg
|
||||
ReobfServerSrg = %(DirTemp)s/server_ro_srg.srg
|
||||
|
||||
[JAR]
|
||||
DirNatives = %(DirJars)s/bin/natives
|
||||
Client = %(DirJars)s/bin/minecraft.jar
|
||||
Server = %(DirJars)s/minecraft_server.jar
|
||||
LWJGL = %(DirJars)s/bin/jinput.jar,%(DirJars)s/bin/lwjgl.jar,%(DirJars)s/bin/lwjgl_util.jar
|
||||
MD5Client = d39baadeeb124a29b2542d778713493f
|
||||
MD5Server = 22223b1d00b72cc51fdb8b7cdd45f9c1
|
||||
DirNatives = %(DirJars)s/versions/1.6/natives
|
||||
Json = %(DirJars)s/versions/1.6/1.6.json
|
||||
Client = %(DirJars)s/versions/1.6/1.6.jar
|
||||
Server = %(DirJars)s/minecraft_server.1.6.jar
|
||||
MD5Client = 6a64a2136e3a3fe4d29b0a0df30b25fc
|
||||
MD5Server = 7c03305c8bf97a8e8f3cdb147fc90607
|
||||
|
||||
[RETROGUARD]
|
||||
Location = %(DirRuntime)s/bin/retroguard.jar
|
||||
@@ -71,6 +71,8 @@ ClsServerTemp = %(DirTempCls)s/minecraft_server
|
||||
SrcClientTemp = %(DirTempSrc)s/minecraft
|
||||
SrcServerTemp = %(DirTempSrc)s/minecraft_server
|
||||
FFSource = net
|
||||
FFClientIn = %(DirTemp)s/minecraft_ff_in.jar
|
||||
FFServerIn = %(DirTemp)s/minecraft_server_ff_in.jar
|
||||
|
||||
[OUTPUT]
|
||||
BinClientTemp = %(DirTempBin)s/minecraft
|
||||
@@ -94,11 +96,11 @@ BinClient = %(DirBin)s/minecraft
|
||||
BinServer = %(DirBin)s/minecraft_server
|
||||
LogClient = %(DirLogs)s/client_compile.log
|
||||
LogServer = %(DirLogs)s/server_compile.log
|
||||
ClassPathClient = %(DirLib)s/,%(DirLib)s/*,%(DirJars)s/bin/minecraft.jar,%(DirJars)s/bin/jinput.jar,%(DirJars)s/bin/lwjgl.jar,%(DirJars)s/bin/lwjgl_util.jar
|
||||
ClassPathServer = %(DirLib)s/,%(DirLib)s/*,%(DirJars)s/minecraft_server.jar
|
||||
ClassPathClient = %(DirLib)s/,%(DirLib)s/*,%(DirJars)s/versions/1.6/1.6.jar
|
||||
ClassPathServer = %(DirLib)s/,%(DirLib)s/*,%(DirJars)s/minecraft_server.1.6.jar
|
||||
ClientFixes = %(DirConf)s/patches
|
||||
FixStart = Start
|
||||
IgnorePkg = paulscode,com/jcraft,isom,ibxm,de/matthiasmann/twl,org/xmlpull,javax/xml,com/fasterxml,javax/ws,org/bouncycastle,argo
|
||||
IgnorePkg = paulscode,com,isom,ibxm,de/matthiasmann/twl,org,javax/xml,javax/ws,argo
|
||||
|
||||
[REOBF]
|
||||
MD5Client = %(DirTemp)s/client.md5
|
||||
@@ -125,8 +127,8 @@ LogFile = %(DirLogs)s/mcp.log
|
||||
LogFileErr = %(DirLogs)s/mcperr.log
|
||||
UpdateUrl =
|
||||
IgnoreUpdate = %(DirBin)s,%(DirLib)s,%(DirLogs)s,%(DirModSrc)s,%(DirReobf)s,%(DirSrc)s,%(DirTemp)s,%(DirEclipse)s/Client/bin,%(DirEclipse)s/Server/bin,%(DirJars)s/world,%(DirJars)s/saves,%(DirJars)s/resources
|
||||
RGIndex = 100000
|
||||
ParamIndex = 20000
|
||||
RGIndex = 130000
|
||||
ParamIndex = 30000
|
||||
|
||||
[ASTYLE]
|
||||
AstyleConfig = %(DirConf)s/astyle.cfg
|
||||
@@ -144,14 +146,18 @@ AStyle_osx = %(DirRuntime)s/bin/astyle-osx
|
||||
JadRetro = %(DirRuntime)s/bin/jadretro.jar
|
||||
Fernflower = %(DirRuntime)s/bin/fernflower.jar
|
||||
Exceptor = %(DirRuntime)s/bin/mcinjector.jar
|
||||
SpecialSource = %(DirRuntime)s/bin/specialsource.jar
|
||||
CmdPatch = %s -p1 -u -i {patchfile} -d {srcdir}
|
||||
CmdJad = %s -b -d {outdir} -dead -o -r -s .java -stat -ff {classes}
|
||||
CmdAStyle = %s --suffix=none --quiet --options={conffile} {classes}
|
||||
CmdRG = %s -cp "{classpath}" RetroGuard -searge {conffile}
|
||||
CmdRGReobf = %s -cp "{classpath}" RetroGuard -notch {conffile}
|
||||
CmdSS = %s -cp "{classpath}" -jar %s -i {injar} -o {outjar} -m {mapfile} --kill-source
|
||||
CmdSSReobf = %s -cp "{classpath}" -jar %s -i {injar} -o {outjar} -r -m {mapfile} -d {identifier} -e %s
|
||||
CmdJadretro = %s -jar %s {targetdir}
|
||||
CmdFernflower = %s -jar %s -din=0 -rbr=0 -dgs=1 -asc=1 -log=WARN {indir} {outdir}
|
||||
CmdFernflower = %s -Xmx512M -jar %s -din=0 -rbr=0 -dgs=1 -asc=1 -log=WARN {indir} {outdir}
|
||||
CmdExceptor = %s -jar %s {input} {output} {conf} {log}
|
||||
CmdRecomp = %s -encoding UTF-8 -Xlint:-options -deprecation -g -source 1.6 -target 1.6 -classpath "{classpath}" -sourcepath {sourcepath} -d {outpath} {pkgs}
|
||||
CmdRecompScala = %s -encoding UTF-8 -deprecation -target:jvm-1.6 -classpath "{classpath}" -sourcepath {sourcepath} -d {outpath} {pkgs}
|
||||
CmdStartSrv = %s -Xincgc -Xms1024M -Xmx1024M -cp "{classpath}" net.minecraft.server.MinecraftServer
|
||||
CmdStartClt = %s -Xincgc -Xms1024M -Xmx1024M -cp "{classpath}" -Djava.library.path={natives} Start
|
||||
+396
-83
@@ -1,4 +1,14 @@
|
||||
searge,name,side,desc
|
||||
func_100008_d,isDurationMax,2,"Returns true if duration is at maximum, false otherwise."
|
||||
func_100009_j_,getFacing,2,
|
||||
func_100011_g,getIsPotionDurationMax,2,
|
||||
func_100012_b,setPotionDurationMax,2,Toggle the isPotionDurationMax field.
|
||||
func_100015_a,isKeyDown,2,Returns whether the specified key binding is currently being pressed.
|
||||
func_102007_a,canInsertItem,2,"Returns true if automation can insert the given item in the given slot from the given side. Args: Slot, item, side"
|
||||
func_102008_b,canExtractItem,2,"Returns true if automation can extract the given item in the given slot from the given side. Args: Slot, item, side"
|
||||
func_102013_b,canExtractItemFromInventory,2,
|
||||
func_102026_a,isBlockTopFacingSurfaceSolid,2,"Performs check to see if the block is a normal, solid block, or if the metadata of the block indicates that its facing puts its solid side upwards. (inverted stairs, for example)"
|
||||
func_102028_d,isSplashPotionEffect,2,
|
||||
func_70000_a,addServerStatsToSnooper,2,
|
||||
func_70001_b,addServerTypeToSnooper,2,
|
||||
func_70002_Q,isSnooperEnabled,2,Returns whether snooping is enabled or not.
|
||||
@@ -183,12 +193,6 @@ func_70361_i,getRandomStackFromInventory,2,
|
||||
func_70364_a,openChest,2,
|
||||
func_70365_a,isUseableByPlayer,2,
|
||||
func_70366_b,closeChest,2,
|
||||
func_70382_c,getMobEntity,2,will create the entity from the internalID the first time it is accessed
|
||||
func_70383_a,writeNBTTagsTo,2,
|
||||
func_70384_a,getMobID,2,
|
||||
func_70385_a,setMobID,2,
|
||||
func_70386_b,anyPlayerInRange,2,Returns true if there is a player in range (using World.getClosestPlayer)
|
||||
func_70387_f,updateDelay,2,Sets the delay before a new spawn (base delay of 200 + random number up to 600).
|
||||
func_70397_c,getCookProgressScaled,2,Returns an integer between 0 and the passed value representing how close the current item is to being completely cooked
|
||||
func_70398_a,getItemBurnTime,2,"Returns the number of ticks that the supplied fuel item will keep the furnace burning, or 0 if the item isn't fuel"
|
||||
func_70399_k,smeltItem,2,Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack
|
||||
@@ -235,14 +239,12 @@ func_70471_c,setCurrentRecipeIndex,2,
|
||||
func_70485_a,setAssociatedChest,2,
|
||||
func_70486_a,loadInventoryFromNBT,2,
|
||||
func_70487_g,saveInventoryToNBT,2,
|
||||
func_70490_h,isMinecartPowered,2,Is this minecart powered (Fuel > 0)
|
||||
func_70491_i,getDamage,2,Gets the current amount of damage the minecart has taken. Decreases over time. The cart breaks when this is over 40.
|
||||
func_70492_c,setDamage,2,Sets the current amount of damage the minecart has taken. Decreases over time. The cart breaks when this is over 40.
|
||||
func_70493_k,getRollingDirection,2,Gets the rolling direction the cart rolls while being attacked. Can be 1 or -1.
|
||||
func_70494_i,setRollingDirection,2,Sets the rolling direction the cart rolls while being attacked. Can be 1 or -1.
|
||||
func_70496_j,getRollingAmplitude,2,Gets the rolling amplitude the cart rolls while being attacked.
|
||||
func_70497_h,setRollingAmplitude,2,Sets the rolling amplitude the cart rolls while being attacked.
|
||||
func_70498_d,setMinecartPowered,2,Set if this minecart is powered (Fuel > 0)
|
||||
func_70515_d,explode,2,
|
||||
func_70518_d,onValidSurface,2,checks to make sure painting can be placed there
|
||||
func_70526_d,getXpValue,2,Returns the XP value of this XP orb.
|
||||
@@ -254,7 +256,6 @@ func_70536_a,setParticleTextureIndex,2,Public method to set private field partic
|
||||
func_70537_b,getFXLayer,2,
|
||||
func_70538_b,setRBGColorF,2,
|
||||
func_70539_a,renderParticle,2,
|
||||
func_70540_h,getParticleTextureIndex,2,
|
||||
func_70541_f,multipleParticleScaleBy,2,
|
||||
func_70542_f,getGreenColorF,2,
|
||||
func_70543_e,multiplyVelocity,2,
|
||||
@@ -455,7 +456,7 @@ func_70950_c,addDefaultEquipmentAndRecipies,2,"based on the villagers profession
|
||||
func_70951_a,getRandomSizedStack,2,
|
||||
func_70965_a,attackEntityFromPart,2,
|
||||
func_70967_k,setNewTarget,2,Sets a new target for the flight AI. It can be a random coordinate or a nearby player.
|
||||
func_70968_i,getDragonHealth,2,Returns the health points of the dragon.
|
||||
func_70968_i,getBossHealth,2,Returns the health points of the dragon.
|
||||
func_70969_j,updateDragonEnderCrystal,2,Updates the state of the enderdragon's current endercrystal.
|
||||
func_70970_a,collideWithEntities,2,Pushes all entities inside the list away from the enderdragon.
|
||||
func_70971_b,attackEntitiesInList,2,"Attacks all entities inside this list, dealing 5 hearts of damage."
|
||||
@@ -470,7 +471,6 @@ func_70999_a,wakeUpPlayer,2,Wake up the player if they're sleeping.
|
||||
func_71000_j,addMovementStat,2,"Adds a value to a movement statistic field - like run, walk, swin or climb."
|
||||
func_71001_a,onItemPickup,2,"Called whenever an item is picked up from walking over it. Args: pickedUpEntity, stackSize"
|
||||
func_71002_c,displayGUIEnchantment,2,
|
||||
func_71003_h,isPVPEnabled,2,returns if pvp is enabled or not
|
||||
func_71004_bE,respawnPlayer,2,
|
||||
func_71005_bN,getInventoryEnderChest,2,Returns the InventoryEnderChest of this player.
|
||||
func_71006_a,displayGUIDispenser,2,Displays the dipsenser GUI for the passed in dispenser entity. Args: TileEntityDispenser
|
||||
@@ -638,7 +638,7 @@ func_71267_a,saveAllWorlds,2,par1 indicates if a log message should be output.
|
||||
func_71268_U,getCanSpawnAnimals,2,
|
||||
func_71269_o,setTexturePack,2,
|
||||
func_71270_I,getFolderName,2,
|
||||
func_71272_O,deleteWorldAndStopServer,2,WARNING : directly calls getActiveAnvilConverter().deleteWorldDirectory(theWorldServer[0].getSaveHandler().getSaveDirectoryName());
|
||||
func_71272_O,deleteWorldAndStopServer,2,WARNING : directly calls getActiveAnvilConverter().deleteWorldDirectory(theWorldServer[0].getSaveHandler().getWorldDirectoryName());
|
||||
func_71273_Y,getMOTD,2,
|
||||
func_71274_v,getServerMOTD,2,Returns the server message of the day
|
||||
func_71275_y,getMaxPlayers,2,Returns the maximum number of players allowed on the server.
|
||||
@@ -674,7 +674,6 @@ func_71364_i,setIngameNotInFocus,2,"Resets the player keystate, disables the ing
|
||||
func_71365_K,screenshotListener,2,checks if keys are down
|
||||
func_71366_a,displayDebugInfo,2,
|
||||
func_71367_a,setServer,2,
|
||||
func_71368_v,isDebugInfoEnabled,2,
|
||||
func_71369_N,getGLMaximumTextureSize,2,Used in the usage snooper.
|
||||
func_71370_a,resize,2,Called to resize the current screen.
|
||||
func_71371_a,launchIntegratedServer,2,"Arguments: World foldername, World ingame name, WorldSettings"
|
||||
@@ -802,7 +801,6 @@ func_71764_a,addPendingConnection,2,
|
||||
func_71765_d,getMyPort,2,
|
||||
func_71766_a,processPendingConnections,2,
|
||||
func_71767_c,getInetAddress,2,
|
||||
func_71770_b,isLocalHost,2,
|
||||
func_71779_a,getIV,2,
|
||||
func_71780_b,getParameters,2,
|
||||
func_71783_a,getKey,2,
|
||||
@@ -842,13 +840,13 @@ func_71854_d,canBlockStay,2,Can this block stay at this position. Similar to ca
|
||||
func_71855_c,isProvidingStrongPower,2,"Returns true if the block is emitting direct/strong redstone power on the specified side. Args: World, X, Y, Z, side. Note that the side is reversed - eg it is 1 (up) when checking the bottom of the block."
|
||||
func_71856_s_,getRenderBlockPass,2,Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
|
||||
func_71857_b,getRenderType,2,The type of render function that is called for this block
|
||||
func_71858_a,getBlockTextureFromSideAndMetadata,2,"From the specified side and block metadata retrieves the blocks texture. Args: side, metadata"
|
||||
func_71858_a,getIcon,2,"From the specified side and block metadata retrieves the blocks texture. Args: side, metadata"
|
||||
func_71859_p_,tickRate,2,How many world ticks before ticking
|
||||
func_71860_a,onBlockPlacedBy,2,Called when the block is placed in the world.
|
||||
func_71861_g,onBlockAdded,2,"Called whenever the block is added into the world. Args: world, x, y, z"
|
||||
func_71862_a,randomDisplayTick,2,A randomly called display update to be able to add particles or other items for display
|
||||
func_71863_a,onNeighborBlockChange,2,"Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are their own) Args: x, y, z, neighbor blockID"
|
||||
func_71864_b,setUnlocalizedName,2,"Sets the unlocalized name of the block to the string passed as a parameter, prefixed by ""tile."""
|
||||
func_71864_b,setUnlocalizedName,2,
|
||||
func_71865_a,isProvidingWeakPower,2,"Returns true if the block is emitting indirect/weak redstone power on the specified side. If isBlockNormalCube returns true, standard redstone propagation rules will apply instead and this will not be called. Args: World, X, Y, Z, side. Note that the side is reversed - eg it is 1 (up) when checking the bottom of the block."
|
||||
func_71866_a,onFallenUpon,2,Block's chance to react to an entity falling on it.
|
||||
func_71867_k,onBlockDestroyedByExplosion,2,Called upon the block being destroyed by an explosion
|
||||
@@ -895,7 +893,6 @@ func_71907_b,setTickRandomly,2,Sets whether this block type will receive random
|
||||
func_71908_a,getPlayerRelativeBlockHardness,2,"Gets the hardness of block at the given coordinates in the given world, relative to the ability of the given EntityPlayer."
|
||||
func_71910_a,quantityDroppedWithBonus,2,Returns the usual quantity dropped by the block plus a bonus of 1 to 'i' (inclusive).
|
||||
func_71911_a_,getSelectedBoundingBoxFromPool,2,Returns the bounding box of the wired rectangular prism to render.
|
||||
func_71912_p,setRequiresSelfNotify,2,Blocks with this attribute will not notify all near blocks when it's metadata change. The default behavior is always notify every neightbor block when anything changes.
|
||||
func_71913_a,canCollideCheck,2,"Returns whether this block is collideable based on the arguments passed in Args: blockMetaData, unknownFlag"
|
||||
func_71914_a,dropBlockAsItemWithChance,2,Drops the block items with a specified chance of dropping the specified items
|
||||
func_71915_e,getMobilityFlag,2,"Returns the mobility information of the block, 0 = free, 1 = can't push but can move over, 2 = total immobility and stop pistons"
|
||||
@@ -963,13 +960,10 @@ func_72172_n,notifyWireNeighborsOfNeighborChange,2,"Calls World.notifyBlocksOfNe
|
||||
func_72173_e,isPowerProviderOrWire,2,"Returns true if redstone wire can connect to the specified block. Params: World, X, Y, Z, side (not a normal notch-side, this can be 0, 1, 2, 3 or -1)"
|
||||
func_72176_l,glow,2,The redstone ore glows.
|
||||
func_72177_n,sparkle,2,The redstone ore sparkles.
|
||||
func_72179_a,isPoweredBlockRail,2,Return true if the blocks passed is a power related rail.
|
||||
func_72180_d_,isRailBlockAt,2,"Returns true if the block at the coordinates of world passed is a valid rail block (current is rail, powered or detector)."
|
||||
func_72181_a,refreshTrackShape,2,Completely recalculates the track shape based on neighboring tracks
|
||||
func_72182_a,isNeighborRailPowered,2,"Powered minecart rail is conductive like wire, so check for powered neighbors"
|
||||
func_72183_n,isPowered,2,Returns true if the block is power related rail.
|
||||
func_72184_d,isRailBlock,2,"Return true if the parameter is a blockID for a valid rail block (current is rail, powered or detector)."
|
||||
func_72185_a,isRailPassingPower,2,Returns true if the specified rail is passing power to its neighbor
|
||||
func_72187_e,setStateIfMinecartInteractsWithRail,2,"Update the detector rail power state if a minecart enter, stays or leave the block."
|
||||
func_72190_l,tryToFall,2,If there is space to fall below will start this block falling
|
||||
func_72191_e_,canFallBelow,2,Checks to see if the sand can fall into the block below it
|
||||
@@ -993,7 +987,7 @@ func_72211_e,getSmallestFlowDecay,2,"getSmallestFlowDecay(World world, intx, int
|
||||
func_72215_l,setNotStationary,2,Changes the block ID to that of an updating fluid.
|
||||
func_72216_n,isFlammable,2,Checks to see if the block is flammable.
|
||||
func_72217_d,getDirection,2,Returns the orentation value from the specified metadata
|
||||
func_72220_e,ignoreTick,2,
|
||||
func_72220_e,getInputStrength,2,"Returns the signal strength at one input of the block. Args: world, X, Y, Z, side"
|
||||
func_72224_c,isFenceGateOpen,2,Returns if the fence gate is open according to its metadata.
|
||||
func_72225_b_,isBedOccupied,2,Return whether or not the bed is occupied.
|
||||
func_72226_b,getNearestEmptyChunkCoordinates,2,Gets the nearest empty chunk coordinates for the player to wake up from a bed into.
|
||||
@@ -1361,17 +1355,16 @@ func_72813_a,getLightValueExt,2,Get light value with flag
|
||||
func_72819_i,getWeightedThunderStrength,2,
|
||||
func_72820_D,getWorldTime,2,
|
||||
func_72821_m,notifyBlockOfNeighborChange,2,"Notifies a block that one of its neighbor change to the specified type Args: x, y, z, blockID"
|
||||
func_72822_b,setBlock,2,"Sets the block to the specified blockID at the block coordinates Args x, y, z, blockID"
|
||||
func_72823_a,setItemData,2,"Assigns the given String id to the given MapDataBase using the MapStorage, removing any existing ones of the same id."
|
||||
func_72824_f,getCloudColour,2,
|
||||
func_72825_h,getTopSolidOrLiquidBlock,2,"Finds the highest block on the x, z coordinate that is solid and returns its y coord. Args x, z"
|
||||
func_72826_c,getCelestialAngle,2,calls calculateCelestialAngle
|
||||
func_72827_u,getProviderName,2,"Returns the name of the current chunk provider, by calling chunkprovider.makeString()"
|
||||
func_72828_b,unloadEntities,2,Adds a list of entities to be unloaded on the next pass of World.updateEntities()
|
||||
func_72829_c,isAABBNonEmpty,2,Returns true if there are any blocks in the region constrained by an AxisAlignedBB
|
||||
func_72829_c,checkBlockCollision,2,Returns true if there are any blocks in the region constrained by an AxisAlignedBB
|
||||
func_72830_b,isAABBInMaterial,2,checks if the given AABB is in the material given. Used while swimming.
|
||||
func_72831_a,rayTraceBlocks_do_do,2,
|
||||
func_72832_d,setBlockAndMetadataWithNotify,2,"Sets the block ID and metadata, then notifies neighboring blocks of the change Params: x, y, z, BlockID, Metadata"
|
||||
func_72832_d,setBlock,2,"Sets the block ID and metadata at a given location. Args: X, Y, Z, new block ID, new metadata, flags. Flag 1 will cause a block update. Flag 2 will send the change to clients (you almost always want this). Flag 4 prevents the block from being re-rendered, if this is a client world. Flags can be added together."
|
||||
func_72833_a,getSkyColor,2,Calculates the color for the skybox
|
||||
func_72834_c,canBlockFreeze,2,"checks to see if a given block is both water, and cold enough to freeze - if the par4 boolean is set, this will only return true if there is a non-water block immediately adjacent to the specified block"
|
||||
func_72835_b,tick,2,Runs a single tick for the world
|
||||
@@ -1379,7 +1372,7 @@ func_72836_a,scheduleBlockUpdate,2,Schedules a tick to a block with a delay (Mos
|
||||
func_72837_a,setBlockTileEntity,2,"Sets the TileEntity for a given block in X, Y, Z coordinates"
|
||||
func_72838_d,spawnEntityInWorld,2,Called to place all entities as part of a world
|
||||
func_72839_b,getEntitiesWithinAABBExcludingEntity,2,"Will get all entities within the specified AABB excluding the one passed into it. Args: entityToExclude, aabb"
|
||||
func_72840_a,getAllCollidingBoundingBoxes,2,calculates and returns a list of colliding bounding boxes within a given AABB
|
||||
func_72840_a,getCollidingBlockBounds,2,calculates and returns a list of colliding bounding boxes within a given AABB
|
||||
func_72841_b,getUniqueDataId,2,Returns an unique new data id from the MapStorage for the given prefix and saves the idCounts map to the 'idcounts' file.
|
||||
func_72842_a,getBlockDensity,2,"Gets the percentage of real blocks within within a bounding box, along a specified vector."
|
||||
func_72843_D,setRandomSeed,2,puts the World Random seed to a specific state dependant on the inputs
|
||||
@@ -1394,14 +1387,12 @@ func_72851_f,notifyBlockChange,2,"The block type change and need to notify other
|
||||
func_72852_a,addTileEntity,2,
|
||||
func_72853_d,getMoonPhase,2,
|
||||
func_72854_c,updateAllPlayersSleepingFlag,2,Updates the flag that indicates whether or not all players in the world are sleeping.
|
||||
func_72855_b,checkIfAABBIsClear,2,"Returns true if there are no solid, live entities in the specified AxisAlignedBB"
|
||||
func_72855_b,checkNoEntityCollision,2,"Returns true if there are no solid, live entities in the specified AxisAlignedBB"
|
||||
func_72856_b,getClosestVulnerablePlayerToEntity,2,"Returns the closest vulnerable player to this entity within the given radius, or null if none is found"
|
||||
func_72857_a,findNearestEntityWithinAABB,2,
|
||||
func_72858_w,canSnowAt,2,Tests whether or not snow can be placed at a given location
|
||||
func_72859_e,setBlockWithNotify,2,"Sets a block and notifies relevant systems with the block change Args: x, y, z, blockID"
|
||||
func_72860_G,getSaveHandler,2,Returns this world's current save handler
|
||||
func_72861_E,getSpawnPoint,2,Returns the coordinates of the spawn point
|
||||
func_72862_i,markBlockForRenderUpdate2,2,"On the client, re-renders this block. On the server, does nothing. Appears to be redundant."
|
||||
func_72863_F,getChunkProvider,2,gets the IChunkProvider this world uses.
|
||||
func_72864_z,isBlockIndirectlyGettingPowered,2,"Used to see if one of the blocks next to you or your block is getting power from a neighboring block. Used by items like TNT or Doors so they don't have redstone going straight into them. Args: x, y, z"
|
||||
func_72865_a,getPathEntityToEntity,2,
|
||||
@@ -1410,17 +1401,15 @@ func_72867_j,getRainStrength,2,Not sure about this actually. Reverting this one
|
||||
func_72868_a,addLoadedEntities,2,"adds entities to the loaded entities list, and loads thier skins."
|
||||
func_72869_a,spawnParticle,2,"Spawns a particle. Args particleName, x, y, z, velX, velY, velZ"
|
||||
func_72870_g,updateEntity,2,Will update the entity in the world if the chunk the entity is in is currently loaded. Args: entity
|
||||
func_72871_y,isBlockGettingPowered,2,"Whether one of the neighboring blocks is putting power into this block. Args: x, y, z"
|
||||
func_72872_a,getEntitiesWithinAABB,2,"Returns all entities of the specified class type which intersect with the AABB. Args: entityClass, aabb"
|
||||
func_72873_a,doChunksNearChunkExist,2,Checks if any of the chunks within distance (argument 4) blocks of the given block exist
|
||||
func_72874_g,getPrecipitationHeight,2,Gets the height to which rain/snow will fall. Calculates it if not already stored.
|
||||
func_72875_a,isMaterialInBB,2,Returns true if the given bounding box contains the given material
|
||||
func_72876_a,createExplosion,2,"Creates an explosion. Args: entity, x, y, z, strength"
|
||||
func_72877_b,setWorldTime,2,Sets the world time.
|
||||
func_72878_l,isBlockIndirectlyProvidingPowerTo,2,"Is a block next to you getting powered (if its an attachable block) or is it providing power directly to you. Args: x, y, z, direction"
|
||||
func_72878_l,getIndirectPowerLevelTo,2,"Gets the power level from a certain block face. Args: x, y, z, direction"
|
||||
func_72879_k,isBlockProvidingPowerTo,2,"Is this block powering in the specified direction Args: x, y, z, direction"
|
||||
func_72880_h,getStarBrightness,2,How bright are stars in the sky
|
||||
func_72881_d,setBlockMetadata,2,Set the metadata of a block in global coordinates
|
||||
func_72882_A,sendQuittingDisconnectingPacket,2,"If on MP, sends a quitting packet."
|
||||
func_72883_k,getFullBlockLightValue,2,Does the same as getBlockLightValue_do but without checking if its not a normal block
|
||||
func_72884_u,isBlockFreezable,2,checks to see if a given block is both water and is cold enough to freeze
|
||||
@@ -1434,7 +1423,6 @@ func_72891_a,setAllowedSpawnTypes,2,Set which types of mobs are allowed to spawn
|
||||
func_72892_b,scheduleBlockUpdateFromLoad,2,Schedules a block update from the saved information in a chunk. Called when the chunk is loaded.
|
||||
func_72893_g,tickBlocksAndAmbiance,2,plays random cave ambient sounds and runs updateTick on random blocks within each chunk in the vacinity of a player
|
||||
func_72894_k,setRainStrength,2,
|
||||
func_72895_f,computeBlockLightValue,2,
|
||||
func_72896_J,isRaining,2,Returns true if the current rain strength is greater than 0.2
|
||||
func_72897_h,joinEntityInSurroundings,2,spwans an entity and loads surrounding chunks
|
||||
func_72898_h,notifyBlocksOfNeighborChange,2,"Notifies neighboring blocks that this specified block changed Args: x, y, z, blockID"
|
||||
@@ -1456,11 +1444,11 @@ func_72913_w,toggleRain,2,
|
||||
func_72914_a,addWorldInfoToCrashReport,2,Adds some basic stats of the world to the given crash report.
|
||||
func_72915_b,setLightValue,2,"Sets the light value either into the sky map or block map depending on if enumSkyBlock is set to sky or block. Args: enumSkyBlock, x, y, z, lightValue"
|
||||
func_72916_c,chunkExists,2,"Returns whether a chunk exists at chunk coordinates x, y"
|
||||
func_72917_a,checkIfAABBIsClearExcludingEntity,2,"Returns true if there are no solid, live entities in the specified AxisAlignedBB, excluding the given entity"
|
||||
func_72917_a,checkNoEntityCollision,2,"Returns true if there are no solid, live entities in the specified AxisAlignedBB, excluding the given entity"
|
||||
func_72918_a,handleMaterialAcceleration,2,handles the acceleration of an object whilst in water. Not sure if it is used elsewhere.
|
||||
func_72919_O,getHorizon,2,Returns horizon height for use in rendering the sky.
|
||||
func_72920_a,getPendingBlockUpdates,2,
|
||||
func_72921_c,setBlockMetadataWithNotify,2,"Sets the blocks metadata and if set will then notify blocks that this block changed. Args: x, y, z, metadata"
|
||||
func_72921_c,setBlockMetadataWithNotify,2,"Sets the blocks metadata and if set will then notify blocks that this block changed, depending on the flag. Args: x, y, z, metadata, flag. See setBlock for flag description"
|
||||
func_72922_b,getFirstUncoveredBlock,2,"Returns the block ID of the first block at this (x,z) location with air above it, searching from sea level upwards."
|
||||
func_72923_a,obtainEntitySkin,2,"Start the skin for this entity downloading, if necessary, and increment its reference counter"
|
||||
func_72924_a,getPlayerEntityByName,2,Find a player by name in this world.
|
||||
@@ -1469,7 +1457,6 @@ func_72926_e,playAuxSFX,2,See description for func_72706_a.
|
||||
func_72927_d,blockHasTileEntity,2,Checks if a block at a given position should have a tile entity.
|
||||
func_72928_a,markTileEntityForDespawn,2,adds tile entity to despawn list (renamed from markEntityForDespawn)
|
||||
func_72929_e,getCelestialAngleRadians,2,Return getCelestialAngle()*2*PI
|
||||
func_72930_a,setBlockAndMetadataWithUpdate,2,"Sets the block ID and metadata of a block, optionally marking it as needing update. Args: X,Y,Z, blockID, metadata, needsUpdate"
|
||||
func_72931_a,canPlaceEntityOnSide,2,Returns true if the given Entity can be placed on the given side of the given block position.
|
||||
func_72932_q,removeBlockTileEntity,2,"Removes the TileEntity for a given block in X,Y,Z coordinates"
|
||||
func_72933_a,rayTraceBlocks,2,"ray traces all blocks, including non-collideable ones"
|
||||
@@ -1488,10 +1475,8 @@ func_72945_a,getCollidingBoundingBoxes,2,"Returns a list of bounding boxes that
|
||||
func_72946_b,findClosestStructure,2,Returns the location of the closest structure of the specified type. If not found returns null.
|
||||
func_72947_a,calculateInitialWeather,2,Called from World constructor to set rainingStrength and thunderingStrength
|
||||
func_72948_g,getFogColor,2,Returns vector(ish) with R/G/B for fog
|
||||
func_72949_a,computeSkyLightValue,2,
|
||||
func_72950_A,setSpawnLocation,2,
|
||||
func_72951_B,canLightningStrikeAt,2,
|
||||
func_72952_b,getBlockLightOpacity,2,
|
||||
func_72953_d,isAnyLiquid,2,Returns if any of the blocks within the aabb are liquids. Args: aabb
|
||||
func_72954_a,addWorldAccess,2,Adds a IWorldAccess to the list of worldAccesses
|
||||
func_72955_a,tickUpdates,2,Runs through the list of updates to run and ticks them
|
||||
@@ -1500,7 +1485,6 @@ func_72957_l,getBlockLightValue,2,Gets the light value of a block location
|
||||
func_72958_C,isBlockHighHumidity,2,"Checks to see if the biome rainfall values for a given x,y,z coordinate set are extremely high"
|
||||
func_72959_q,getWorldChunkManager,2,
|
||||
func_72960_a,setEntityState,2,sends a Packet 38 (Entity Status) to all tracked players of that entity
|
||||
func_72961_c,setBlockAndMetadata,2,Sets the block ID and metadata of a block in global coordinates
|
||||
func_72962_a,canMineBlock,2,Called when checking if a certain block can be mined or not. The 'spawn safe zone' check is located here.
|
||||
func_72963_a,initialize,2,
|
||||
func_72964_e,getChunkFromChunkCoords,2,"Returns back a chunk looked up by chunk coordinates Args: x, y"
|
||||
@@ -1526,6 +1510,7 @@ func_73025_a,doPreChunk,2,
|
||||
func_73026_a,getEntityList,2,
|
||||
func_73027_a,addEntityToWorld,2,Add an ID to Entity mapping to entityHashSet
|
||||
func_73028_b,removeEntityFromWorld,2,
|
||||
func_73029_E,doVoidFogParticles,2,
|
||||
func_73030_b,getEntitySpawnQueue,2,
|
||||
func_73031_a,invalidateBlockReceiveRegion,2,"Invalidates an AABB region of blocks from the receive queue, in the event that the block has been modified client-side in the intervening 80 receive ticks."
|
||||
func_73039_n,getEntityTracker,2,Gets the EntityTracker
|
||||
@@ -1671,6 +1656,7 @@ func_73463_g,getChatVisibility,2,
|
||||
func_73473_d,getText,2,
|
||||
func_73475_d,getIsServer,2,Get whether this is a server
|
||||
func_73489_c,getMetadata,2,
|
||||
func_73509_c,getWatchedMetadata,2,
|
||||
func_73568_g,getEffectY,2,
|
||||
func_73569_h,getEffectZ,2,
|
||||
func_73570_d,getSoundName,2,
|
||||
@@ -1681,19 +1667,11 @@ func_73580_b,getChunkPosZ,2,
|
||||
func_73581_d,getNumberOfChunkInPacket,2,
|
||||
func_73582_a,getChunkPosX,2,
|
||||
func_73583_c,getChunkCompressedData,2,
|
||||
func_73593_d,getCompressedChunkData,2,
|
||||
func_73594_a,getMapChunkData,2,
|
||||
func_73641_d,connectToNeighbor,2,"The specified neighbor has just formed a new connection, so update accordingly"
|
||||
func_73642_a,isMinecartTrack,2,
|
||||
func_73643_c,canConnectFrom,2,Determines whether or not the target rail can connect to this rail
|
||||
func_73644_a,refreshConnectedTracks,2,"Neighboring tracks have potentially been broken, so prune the connected track list"
|
||||
func_73645_a,setConnections,2,
|
||||
func_73646_c,canConnectTo,2,Determines whether or not the track can bend to meet the specified rail
|
||||
func_73647_b,isConnectedTo,2,
|
||||
func_73648_a,getMinecartTrackLogic,2,
|
||||
func_73649_b,isInTrack,2,Returns true if the specified block is in the same railway.
|
||||
func_73650_a,getAdjacentTrackCount,2,Get the number of adjacent tracks.
|
||||
func_73651_b,getAdjacentTracks,2,
|
||||
func_73652_a,refreshTrackShape,2,Completely recalculates the track shape based on neighboring tracks and power state
|
||||
func_73607_d,getPlayerVelocityX,2,Gets the X velocity of the player being pushed by the explosion.
|
||||
func_73608_g,getPlayerVelocityZ,2,Gets the Z velocity of the player being pushed by the explosion.
|
||||
func_73609_f,getPlayerVelocityY,2,Gets the Y velocity of the player being pushed by the explosion.
|
||||
func_73660_a,update,2,Updates the JList with a new model.
|
||||
func_73665_c,getPropertiesFile,2,Returns this PropertyManager's file object used for property saving.
|
||||
func_73666_a,logMessageAndSave,2,logs an info message then calls saveSettingsToFile Yes this appears to be a potential stack overflow - these 2 functions call each other repeatdly if an exception occurs.
|
||||
@@ -1714,7 +1692,6 @@ func_73688_c,parse,2,
|
||||
func_73689_b,setBanReason,2,
|
||||
func_73690_c,getBannedBy,2,
|
||||
func_73691_b,setBanEndDate,2,
|
||||
func_73699_a,init,2,Initialises the console logger.
|
||||
func_73703_b,saveToFile,2,par1: include header
|
||||
func_73704_a,isBanned,2,
|
||||
func_73705_d,removeExpiredBans,2,
|
||||
@@ -1825,6 +1802,7 @@ func_73879_b,mouseMovedOrUp,2,"Called when the mouse is moved or a mouse button
|
||||
func_73892_a,getSentHistory,2,"input is relative and is applied directly to the sentHistoryCursor so -1 is the previous message, 1 is the next message from the current cursor position"
|
||||
func_73895_u_,completePlayerName,2,Autocompletes player name
|
||||
func_73906_g,wakeEntity,2,Wakes the entity from the bed
|
||||
func_73907_g,getLeftBorder,2,Gets the distance from the left border of the window to left border of the controls screen
|
||||
func_73912_g,makeUseableName,2,"Makes a the name for a world save folder based on your world name, replacing specific characters for _s and appending -s to the end until a free name is available."
|
||||
func_73914_h,updateButtonText,2,
|
||||
func_73945_e,copyLinkToClipboard,2,Copies the link to the system clipboard.
|
||||
@@ -2493,12 +2471,12 @@ func_75756_e,getSaveHandler,2,returns null if no saveHandler is relevent (eg. SM
|
||||
func_75757_d,loadWorldInfo,2,Loads and returns the world info
|
||||
func_75758_b,getMapFileFromName,2,Gets the file location of the given map
|
||||
func_75759_a,flush,2,"Called to flush all changes to disk, waiting for them to complete."
|
||||
func_75760_g,getSaveDirectoryName,2,Returns the name of the directory where world information is saved.
|
||||
func_75760_g,getWorldDirectoryName,2,Returns the name of the directory where world information is saved.
|
||||
func_75761_a,saveWorldInfo,2,Saves the passed in world info.
|
||||
func_75762_c,checkSessionLock,2,Checks the session lock to prevent save collisions
|
||||
func_75763_a,getChunkLoader,2,Returns the chunk loader with the provided world provider
|
||||
func_75764_a,getPlayerData,2,Gets the player data for the given playername as a NBTTagCompound.
|
||||
func_75765_b,getSaveDirectory,2,gets the File object corresponding to the base directory of this save (saves/404 for a save called 404 etc)
|
||||
func_75765_b,getWorldDirectory,2,Gets the File object corresponding to the base directory of this world.
|
||||
func_75766_h,setSessionLock,2,Creates a session lock file for this process
|
||||
func_75773_a,canContinue,2,Determine if a specific AI Task should continue being executed.
|
||||
func_75774_a,onUpdateTasks,2,
|
||||
@@ -2537,6 +2515,7 @@ func_75820_a,writeChunkToNBT,2,"Writes the Chunk passed as an argument to the NB
|
||||
func_75821_a,writeChunkNBTTags,2,
|
||||
func_75822_a,checkedReadChunkFromNBT,2,Wraps readChunkFromNBT. Checks the coordinates and several NBT tags.
|
||||
func_75823_a,readChunkFromNBT,2,Reads the data stored in the passed NBTTagCompound and creates a Chunk with that data in the passed World. Returns the created Chunk.
|
||||
func_75824_a,addChunkToPending,2,
|
||||
func_75829_a,distanceTo,2,Returns the linear distance to another path point
|
||||
func_75830_a,makeHash,2,
|
||||
func_75831_a,isAssigned,2,Returns true if this point has already been assigned to a path
|
||||
@@ -2590,6 +2569,7 @@ func_75904_a,getInts,2,"Returns a list of integer values generated by this layer
|
||||
func_75905_a,initWorldGenSeed,2,Initialize layer's local worldGenSeed based on its own baseSeed and the world's global seed (passed in as an argument).
|
||||
func_75912_b,choose,2,randomly choose between the four args
|
||||
func_75913_a,choose,2,randomly choose between the two args
|
||||
func_75915_a,magnify,2,"Magnify a layer. Parms are seed adjustment, layer, number of times to magnify"
|
||||
func_75916_b,modeOrRandom,2,returns the mode (most frequently occuring number) or a random number from the 4 integers provided
|
||||
func_75917_a,choose,2,Chooses one of the two inputs randomly.
|
||||
func_75918_d,initCraftableStats,2,Initializes statistics related to craftable items. Is only called after both block and item stats have been initialized.
|
||||
@@ -2680,7 +2660,7 @@ func_76126_a,sin,2,sin looked up in a table
|
||||
func_76127_a,average,2,
|
||||
func_76128_c,floor_double,2,Returns the greatest integer less than or equal to the double argument
|
||||
func_76129_c,sqrt_float,2,
|
||||
func_76130_a,abs_int,2,
|
||||
func_76130_a,abs_int,2,Returns the unsigned value of an int.
|
||||
func_76131_a,clamp_float,2,"Returns the value of the first parameter, clamped to be within the lower and upper limits given by the second and third parameters"
|
||||
func_76132_a,abs_max,2,Maximum of the absolute value of two numbers.
|
||||
func_76133_a,sqrt_double,2,
|
||||
@@ -2883,7 +2863,6 @@ func_76594_o,enqueueRelightChecks,2,"Called once-per-chunk-per-tick, and advance
|
||||
func_76595_e,propagateSkylightOcclusion,2,Propagates a given sky-visible block's light value downward and upward to neighboring blocks as necessary.
|
||||
func_76596_b,getBlockLightOpacity,2,
|
||||
func_76597_e,getChunkBlockTileEntity,2,Gets the TileEntity for a given block in this chunk
|
||||
func_76598_a,setBlockID,2,"Sets a blockID for a position in the chunk. Args: x, y, z, blockID"
|
||||
func_76599_g,checkSkylightNeighborHeight,2,Checks the height of a block next to a sky-visible block and schedules a lighting update as necessary.
|
||||
func_76600_a,isAtLocation,2,Checks whether the chunk is at the X/Z location specified
|
||||
func_76601_a,needsSaving,2,Returns true if this Chunk needs to be saved
|
||||
@@ -2988,8 +2967,6 @@ func_76837_b,getBiomeGenAt,2,"Returns the BiomeGenBase related to the x, z posit
|
||||
func_76838_a,cleanupCache,2,Removes BiomeCacheBlocks from this cache that haven't been accessed in at least 30 seconds.
|
||||
func_76839_e,getCachedBiomes,2,Returns the array of cached biome types in the BiomeCacheBlock at the given location.
|
||||
func_76840_a,getBiomeCacheBlock,2,Returns a biome cache block at location specified.
|
||||
func_76845_a,bindImage,2,
|
||||
func_76846_a,onTick,2,
|
||||
func_76885_a,getBiomeGenAt,2,"Returns the BiomeGenBase related to the x, z position from the cache block."
|
||||
func_76893_a,setTileEntityRenderer,2,Associate a TileEntityRenderer with this TileEntitySpecialRenderer
|
||||
func_76894_a,renderTileEntityAt,2,
|
||||
@@ -3003,7 +2980,6 @@ func_76905_a,renderTileEntityMobSpawner,2,
|
||||
func_76906_a,renderEndPortalTileEntity,2,Renders the End Portal.
|
||||
func_76909_a,renderTileEntitySignAt,2,
|
||||
func_76911_a,renderTileEntityChestAt,2,Renders the TileEntity for the chest at a position.
|
||||
func_76914_a,setWaterBiomeColorizer,2,
|
||||
func_76916_f,getBlockID,2,Gets the BlockID for this BlockEventData
|
||||
func_76917_e,getEventParameter,2,"Get the Event Parameter (different for each BlockID,EventID)"
|
||||
func_76918_d,getEventID,2,Get the Event ID (different for each BlockID)
|
||||
@@ -3055,8 +3031,8 @@ func_77009_a,renderThePainting,2,
|
||||
func_77012_a,renderTheMinecart,2,Renders the Minecart.
|
||||
func_77014_a,doRenderItem,2,Renders the item
|
||||
func_77015_a,renderItemIntoGUI,2,Renders the item's icon or block into the UI at the specified position.
|
||||
func_77016_a,renderTexturedQuad,2,"Adds a textured quad to the tesselator at the specified position with the specified texture coords, width and height. Args: x, y, u, v, width, height"
|
||||
func_77017_a,renderQuad,2,"Adds a quad to the tesselator at the specified position with the set width and height and color. Args: tessellator, x, y, width, height, color"
|
||||
func_77018_a,renderGlint,2,
|
||||
func_77020_a,renderDroppedItem,2,Renders a dropped item
|
||||
func_77021_b,renderItemOverlayIntoGUI,2,Renders the item's overlay information. Examples being stack count or damage on top of the item's image at the specified position.
|
||||
func_77028_a,doRenderLightningBolt,2,Actually renders the lightning bolt. This method is called through the doRender method.
|
||||
@@ -3083,7 +3059,6 @@ func_77051_a,renderVillagerEquipedItems,2,
|
||||
func_77052_b,preRenderVillager,2,
|
||||
func_77053_a,shouldVillagerRenderPass,2,Determines wether Villager Render pass or not.
|
||||
func_77054_a,renderVillager,2,
|
||||
func_77055_a,passVillagerSpecialRender,2,Passes the Villager special render.
|
||||
func_77057_a,getTailRotation,2,
|
||||
func_77059_a,renderCow,2,
|
||||
func_77060_a,updateCreeperScale,2,Updates creeper scale in prerender callback
|
||||
@@ -3116,7 +3091,6 @@ func_77099_a,renderSaddledPig,2,
|
||||
func_77100_a,renderSpecials,2,Method for adding special render rules
|
||||
func_77101_a,renderPlayer,2,
|
||||
func_77102_a,rotatePlayer,2,Rotates the player if the player is sleeping. This method is called in rotateCorpse.
|
||||
func_77103_a,renderName,2,Used to render a player's name above their head
|
||||
func_77104_b,renderPlayerScale,2,
|
||||
func_77105_b,renderPlayerSleep,2,Renders player with sleeping offset if sleeping
|
||||
func_77107_a,setArmorModel,2,"Set the specified armor model as the player model. Args: player, armorSlot, partialTick"
|
||||
@@ -3199,6 +3173,7 @@ func_77296_a,requestDownloadOfTexture,2,filename must end in .zip
|
||||
func_77297_a,downloadTexture,2,
|
||||
func_77298_g,getAcceptsTextures,2,
|
||||
func_77299_i,getTexturePackDirContents,2,Return a List<File> of file/directories in the texture pack directory.
|
||||
func_77301_a,isDownloading,2,
|
||||
func_77302_a,generateTexturePackID,2,"Generate an internal texture pack ID from the file/directory name, last modification time, and file size. Returns null if the file/directory is not a texture pack."
|
||||
func_77303_a,setSelectedTexturePack,2,Set the selectedTexturePack field (Inner class static accessor method).
|
||||
func_77304_b,onDownloadFinished,2,Called from Minecraft.loadWorld() if getIsDownloading() returned true to prepare the downloaded texture for usage.
|
||||
@@ -3295,7 +3270,6 @@ func_77525_a,getPingResponse,2,
|
||||
func_77531_d,getFirstDescriptionLine,2,Get the first line of the texture pack description (read from the pack.txt file)
|
||||
func_77532_a,getResourceAsStream,2,Gives a texture resource as InputStream.
|
||||
func_77533_a,deleteTexturePack,2,"Delete the OpenGL texture id of the pack's thumbnail image, and close the zip file in case of TexturePackCustom."
|
||||
func_77534_f,getTexturePackResolution,2,Return the texture pack's resolution (16 by default). Used only by PlayerUsageSnooper. Presumably meant to be overriden by HD texture mods.
|
||||
func_77535_b,bindThumbnailTexture,2,"Bind the texture id of the pack's thumbnail image, loading it if necessary."
|
||||
func_77536_b,getTexturePackID,2,Get the texture pack ID
|
||||
func_77537_e,getSecondDescriptionLine,2,Get the second line of the texture pack description (read from the pack.txt file)
|
||||
@@ -3369,7 +3343,6 @@ func_77648_a,onItemUse,2,"Callback for item usage. If the item does something sp
|
||||
func_77649_a,getDamageVsEntity,2,Returns the damage against a given entity.
|
||||
func_77650_f,getIconIndex,2,Returns the icon index of the stack given as argument.
|
||||
func_77651_p,getShareTag,2,"If this function returns true (or the item is damageable), the ItemStack's NBT tag will be sent to the client."
|
||||
func_77652_b,setIconCoord,2,
|
||||
func_77654_b,onEaten,2,
|
||||
func_77655_b,setUnlocalizedName,2,"Sets the unlocalized name of this item to the string passed as the parameter, prefixed by ""item."""
|
||||
func_77656_e,setMaxDamage,2,set max damage of an Item
|
||||
@@ -3381,7 +3354,6 @@ func_77661_b,getItemUseAction,2,returns the action that specifies what animation
|
||||
func_77662_d,isFull3D,2,Returns True is the item is renderer in full 3D when hold.
|
||||
func_77663_a,onUpdate,2,Called each tick as long the item is on a player inventory. Uses by maps to check if is on a player hand and update it's contents.
|
||||
func_77664_n,setFull3D,2,Sets bFull3D to True and return the object.
|
||||
func_77665_c,setIconIndex,2,Sets the icon index for this item. Returns the item.
|
||||
func_77666_t,getPotionEffect,2,Returns a string representing what this item does to a potion.
|
||||
func_77667_c,getUnlocalizedName,2,Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have different names based on their damage or NBT.
|
||||
func_77668_q,getContainerItem,2,
|
||||
@@ -3393,6 +3365,7 @@ func_77832_l,getEffects,2,Returns a list of potion effects for the specified ite
|
||||
func_77833_h,isEffectInstant,2,
|
||||
func_77834_f,getEffects,2,Returns a list of effects for the specified potion damage value.
|
||||
func_77840_a,spawnCreature,2,"Spawns the creature specified by the egg's type in the location specified by the last three parameters. Parameters: world, entityID, x, y, z."
|
||||
func_77842_f,getMaterialName,2,"Returns the name of the material this tool is made from as it is declared in EnumToolMaterial (meaning diamond would return ""EMERALD"")"
|
||||
func_77844_a,setPotionEffect,2,"sets a potion effect on the item. Args: int potionId, int duration (will be multiplied by 20), int amplifier, float probability of effect happening"
|
||||
func_77845_h,isWolfsFavoriteMeat,2,Whether wolves like this food (true for raw and cooked porkchop).
|
||||
func_77846_g,getSaturationModifier,2,gets the saturationModifier of the ItemFood
|
||||
@@ -3558,8 +3531,6 @@ func_78350_a,getTextureForDownloadableImage,2,"Takes a URL of a downloadable ima
|
||||
func_78351_a,setupTexture,2,Copy the supplied image onto the specified OpenGL texture
|
||||
func_78352_b,refreshTextures,2,Call setupTexture on all currently-loaded textures again to account for changes in rendering options
|
||||
func_78353_a,allocateAndSetupTexture,2,"Copy the supplied image onto a newly-allocated OpenGL texture, returning the allocated texture name"
|
||||
func_78354_c,unwrapImageByColumns,2,Takes an image with multiple 16-pixel-wide columns and creates a new 16-pixel-wide image where the columns are stacked vertically
|
||||
func_78355_a,registerTextureFX,2,
|
||||
func_78356_a,obtainImageData,2,"Return a ThreadDownloadImageData instance for the given URL. If it does not already exist, it is created and uses the passed ImageBuffer. If it does, its reference count is incremented."
|
||||
func_78369_a,setColorRGBA_F,2,"Sets the RGBA values for the color, converting from floats between 0 and 1 to integers from 0-255."
|
||||
func_78370_a,setColorRGBA,2,Sets the RGBA values for the color. Also clamps them to 0-255.
|
||||
@@ -3631,7 +3602,7 @@ func_78569_d,renderBlockCactusImpl,2,Render block cactus implementation
|
||||
func_78570_q,renderStandardBlock,2,Renders a standard cube block at the given coordinates
|
||||
func_78571_c,renderPistonRodEW,2,Render piston rod east/west
|
||||
func_78572_c,renderBlockTorch,2,Renders a torch block at the given coordinates
|
||||
func_78573_e,renderNorthFace,2,"Renders the given texture to the north (x-negative) face of the block. Args: block, x, y, z, texture"
|
||||
func_78573_e,renderFaceXNeg,2,"Renders the given texture to the west (x-negative) face of the block. Args: block, x, y, z, texture"
|
||||
func_78574_w,renderBlockBed,2,render a bed at the given coordinates
|
||||
func_78575_a,renderBlockStemSmall,2,Render block stem small
|
||||
func_78576_j,renderBlockLadder,2,Renders a ladder block at the given coordinates
|
||||
@@ -3663,24 +3634,24 @@ func_78601_u,renderBlockDoor,2,Renders a door block at the given coordinates
|
||||
func_78602_a,getAoBrightness,2,Get ambient occlusion brightness
|
||||
func_78603_m,renderBlockStem,2,Render block stem
|
||||
func_78604_a,renderBlockUsingTexture,2,Renders a block using the given texture instead of the block's own default texture
|
||||
func_78605_f,renderSouthFace,2,"Renders the given texture to the south (x-positive) face of the block. Args: block, x, y, z, texture"
|
||||
func_78605_f,renderFaceXPos,2,"Renders the given texture to the east (x-positive) face of the block. Args: block, x, y, z, texture"
|
||||
func_78606_a,renderBlockStemBig,2,Render block stem big
|
||||
func_78607_b,renderPistonRodSN,2,Render piston rod south/north
|
||||
func_78608_c,renderPistonExtension,2,renders the pushing part of a piston
|
||||
func_78609_c,renderStandardBlockWithColorMultiplier,2,"Renders a standard cube block at the given coordinates, with a given color ratio. Args: block, x, y, z, r, g, b"
|
||||
func_78610_x,renderBlockRepeater,2,render a redstone repeater at the given coordinates
|
||||
func_78611_c,renderEastFace,2,"Renders the given texture to the east (z-negative) face of the block. Args: block, x, y, z, texture"
|
||||
func_78611_c,renderFaceZNeg,2,"Renders the given texture to the north (z-negative) face of the block. Args: block, x, y, z, texture"
|
||||
func_78612_b,renderBlockByRenderType,2,Renders the block at the given coordinates using the block's rendering type
|
||||
func_78613_a,renderBottomFace,2,"Renders the given texture to the bottom face of the block. Args: block, x, y, z, texture"
|
||||
func_78613_a,renderFaceYNeg,2,"Renders the given texture to the bottom face of the block. Args: block, x, y, z, texture"
|
||||
func_78614_n,renderBlockCrops,2,Render block crops
|
||||
func_78615_a,renderBlockCauldron,2,Render block cauldron
|
||||
func_78616_a,renderBlockCocoa,2,Renders a Cocoa block at the given coordinates
|
||||
func_78617_b,renderTopFace,2,"Renders the given texture to the top face of the block. Args: block, x, y, z, texture"
|
||||
func_78617_b,renderFaceYPos,2,"Renders the given texture to the top face of the block. Args: block, x, y, z, texture"
|
||||
func_78618_a,renderBlockDragonEgg,2,
|
||||
func_78619_g,renderBlockTripWire,2,Renders a trip wire block at the given coordinates
|
||||
func_78620_l,renderCrossedSquares,2,"Renders any block requiring croseed squares such as reeds, flowers, and mushrooms"
|
||||
func_78621_p,renderBlockFluids,2,Renders a block based on the BlockFluids class at the given coordinates
|
||||
func_78622_d,renderWestFace,2,"Renders the given texture to the west (z-positive) face of the block. Args: block, x, y, z, texture"
|
||||
func_78622_d,renderFaceZPos,2,"Renders the given texture to the south (z-positive) face of the block. Args: block, x, y, z, texture"
|
||||
func_78623_a,renderTorchAtAngle,2,"Renders a torch at the given coordinates, with the base slanting at the given delta"
|
||||
func_78713_a,getEntityRenderObject,2,
|
||||
func_78714_a,getDistanceToCamera,2,
|
||||
@@ -3798,6 +3769,7 @@ func_80006_f,getUniqueID,2,
|
||||
func_80007_l,getDimensionName,2,"Returns the dimension's name, e.g. ""The End"", ""Nether"", or ""Overworld""."
|
||||
func_82011_an,enableGui,2,
|
||||
func_82114_b,getPlayerCoordinates,2,Return the position for this command sender.
|
||||
func_82115_m,getMaxRenderDistanceSquared,2,
|
||||
func_82116_a,setSkullRotation,2,Set the skull's rotation
|
||||
func_82117_a,getSkullType,2,Get the entity type for the skull
|
||||
func_82118_a,setSkullType,2,Set the entity type for the skull
|
||||
@@ -3811,12 +3783,14 @@ func_82130_k,getLevels,2,Return the levels of this beacon's pyramid.
|
||||
func_82131_u,updateState,2,Checks if the Beacon has a valid pyramid underneath and direct sunlight above
|
||||
func_82132_j,getSecondaryEffect,2,Return the secondary potion effect given by this beacon.
|
||||
func_82141_a,copyDataFrom,2,"Copies important data from another entity to this entity. Used when teleporting entities between worlds, as this actually deletes the teleporting entity and re-creates it on the other side. Params: Entity to copy from, unused (always true)"
|
||||
func_82142_c,setHasActivePotion,2,
|
||||
func_82142_c,setInvisible,2,
|
||||
func_82144_au,doesEntityNotTriggerPressurePlate,2,Return whether this entity should NOT trigger a pressure plate or a tripwire.
|
||||
func_82145_z,getMaxInPortalTime,2,Return the amount of time this entity should stay in a portal before being transported.
|
||||
func_82147_ab,getPortalCooldown,2,Return the amount of cooldown before this entity can use a portal again.
|
||||
func_82150_aj,getHasActivePotion,2,
|
||||
func_82148_at,getTeleportDirection,2,
|
||||
func_82150_aj,isInvisible,2,
|
||||
func_82154_e,setIsAnvil,2,
|
||||
func_82159_b,getArmorPosition,2,
|
||||
func_82160_b,dropEquipment,2,Drop the equipment for this entity.
|
||||
func_82161_a,getArmorItemForSlot,2,"Params: Armor slot, Item tier"
|
||||
func_82163_bD,initCreature,2,Initialize this creature.
|
||||
@@ -3857,6 +3831,8 @@ func_82244_d,displayGUIAnvil,2,Displays the GUI for interacting with an anvil.
|
||||
func_82245_bX,isSpawnForced,2,
|
||||
func_82246_f,canCurrentToolHarvestBlock,2,"Returns true if the item the player is holding can harvest the block at the given coords. Args: x, y, z."
|
||||
func_82247_a,canPlayerEdit,2,
|
||||
func_82265_c,setEnabled,2,
|
||||
func_82266_h,setDisabledTextColour,2,
|
||||
func_82273_a,setFlatGeneratorInfo,2,
|
||||
func_82274_h,getRenderItem,2,
|
||||
func_82275_e,getFlatGeneratorInfo,2,
|
||||
@@ -3885,6 +3861,7 @@ func_82356_Z,isCommandBlockEnabled,2,Return whether command blocks are enabled.
|
||||
func_82357_ak,getSpawnProtectionSize,2,Return the spawn protection area's size.
|
||||
func_82358_a,isUsernameIndex,2,Return whether the specified command parameter index is a username parameter.
|
||||
func_82362_a,getRequiredPermissionLevel,2,Return the required permission level for this command.
|
||||
func_82363_b,parseDouble,2,Parses a double from the given string or throws an exception if it's not a double.
|
||||
func_82364_d,getDifficultyForName,2,Return the difficulty value for the specified string.
|
||||
func_82366_d,getGameRules,2,Return the game rule set this command should be able to manipulate.
|
||||
func_82369_d,getAllOnlineUsernames,2,Return all usernames currently connected to the server.
|
||||
@@ -3903,7 +3880,6 @@ func_82383_a,hasTheseArguments,2,Returns whether the given token (parameter 1) h
|
||||
func_82384_c,getDefaultMinimumRange,2,Gets the default minimum range (argument rm).
|
||||
func_82385_b,matchPlayersAsString,2,Returns a nicely-formatted string listing the matching players.
|
||||
func_82386_a,matchOnePlayer,2,Returns the one player that matches the given at-token. Returns null if more than one player matches.
|
||||
func_82390_a,drawNeedle,2,Draws the compass needle
|
||||
func_82392_a,bindTextureByURL,2,"Binds a texture that Minecraft will attempt to load from the given URL. (arguments: url, localFallback)"
|
||||
func_82394_a,renderTileEntitySkullAt,2,Render a skull tile entity.
|
||||
func_82398_a,renderTileEntityBeaconAt,2,Render a beacon tile entity.
|
||||
@@ -3919,7 +3895,7 @@ func_82463_b,setEntitySoundPitch,2,"Sets the pitch of the sound associated with
|
||||
func_82464_d,stopAllSounds,2,Stops all currently playing sounds
|
||||
func_82465_b,isEntitySoundPlaying,2,"Returns true if a sound is currently associated with the given entity, or false otherwise."
|
||||
func_82466_e,pauseAllSounds,2,Pauses all currently playing sounds
|
||||
func_82467_a,playEntitySound,2,"If a sound is already playing from the given entity, update the position and velocity of that sound to match the entity. Otherwise, start playing a sound from that entity. Args: The sound name, the entity, the volume, the pitch, unknown flag"
|
||||
func_82467_a,playEntitySound,2,"If a sound is already playing from the given entity, update the position and velocity of that sound to match the entity. Otherwise, start playing a sound from that entity. Setting the last flag to true will prevent other sounds from overriding this one. Args: The sound name, the entity, the volume, the pitch, priority"
|
||||
func_82468_a,setEntitySoundVolume,2,"Sets the volume of the sound associated with the given entity, if one is playing. The volume is scaled by the global sound volume. Args: the entity, the volume (from 0 to 1)"
|
||||
func_82469_c,stopEntitySound,2,Stops playing the sound associated with the given entity
|
||||
func_82482_a,dispense,2,Dispenses the specified ItemStack from a dispenser.
|
||||
@@ -3928,9 +3904,9 @@ func_82486_a,doDispense,2,
|
||||
func_82487_b,dispenseStack,2,"Dispense the specified stack, play the dispense sound and spawn particles."
|
||||
func_82489_a,spawnDispenseParticles,2,Order clients to display dispense particles from the specified block and facing.
|
||||
func_82499_a,getProjectileEntity,2,Return the projectile entity spawned by this dispense behavior.
|
||||
func_82505_u_,isFlowerPot,2,Returns true only if block is flowerPot
|
||||
func_82519_a_,onFinishFalling,2,Called when the falling block entity for this block hits the ground and turns back into a block
|
||||
func_82520_a,onStartFalling,2,Called when the falling block entity for this block is created
|
||||
func_82523_e,isLockedByAnotherRepeater,2,
|
||||
func_82524_c,isRedstoneRepeaterBlockID,2,
|
||||
func_82525_a,getIPositionFromBlockSource,2,
|
||||
func_82526_n,dispense,2,
|
||||
@@ -3942,6 +3918,8 @@ func_82533_j,getCropItem,2,Generate a crop produce ItemStack for this crop.
|
||||
func_82538_d,canConnectWallTo,2,Return whether an adjacent block can connect to a wall.
|
||||
func_82543_e,isBlockStairsID,2,Checks if supplied ID is one of a BlockStairs
|
||||
func_82547_a,comparePlayers,2,Compare the position of two players.
|
||||
func_82558_j,getWalkSpeed,2,
|
||||
func_82560_d,getRelativeVolumeDisabled,2,
|
||||
func_82563_j,getShowCape,2,
|
||||
func_82571_y,getGeneratorOptions,2,
|
||||
func_82572_b,incrementTotalWorldTime,2,
|
||||
@@ -3961,6 +3939,8 @@ func_82615_a,getX,2,
|
||||
func_82616_c,getZ,2,
|
||||
func_82617_b,getY,2,
|
||||
func_82618_k,getWorld,2,
|
||||
func_82619_j,getBlockTileEntity,2,
|
||||
func_82620_h,getBlockMetadata,2,
|
||||
func_82621_f,getZInt,2,
|
||||
func_82622_e,getYInt,2,
|
||||
func_82623_d,getXInt,2,
|
||||
@@ -4008,6 +3988,7 @@ func_82725_o,isMagicDamage,2,Returns true if the damage is magic based.
|
||||
func_82726_p,setMagicDamage,2,Define the damage type as magic based.
|
||||
func_82732_R,getWorldVec3Pool,2,Return the Vec3Pool object for this world.
|
||||
func_82733_a,selectEntitiesWithinAABB,2,
|
||||
func_82734_g,getChunkHeightMapMinimum,2,"Gets the heightMapMinimum field of the given chunk, or 0 if the chunk is not loaded. Coords are in blocks. Args: X, Z"
|
||||
func_82736_K,getGameRules,2,Gets the GameRules instance.
|
||||
func_82737_E,getTotalWorldTime,2,
|
||||
func_82742_i,resetUpdateEntityTick,2,Resets the updateEntityTick field to 0
|
||||
@@ -4027,7 +4008,6 @@ func_82767_a,getGameRuleStringValue,2,Gets the string Game Rule value.
|
||||
func_82768_a,readGameRulesFromNBT,2,Set defined game rules from NBT.
|
||||
func_82769_a,addGameRule,2,Define a game rule and its default value.
|
||||
func_82770_a,writeGameRulesToNBT,2,Return the defined game rules as NBT.
|
||||
func_82772_a,updateDynamicTexture,2,Updates a single dynamic texture
|
||||
func_82773_c,hasImageData,2,Checks if urlToImageDataMap has image data for the given key
|
||||
func_82774_a,setOverrideBlockTexture,2,Sets overrideBlockTexture
|
||||
func_82775_a,renderBlockAnvil,2,Renders anvil
|
||||
@@ -4074,6 +4054,7 @@ func_82877_b,setPlayerWalkSpeed,2,
|
||||
func_82879_c,sendSettingsToServer,2,Send a client info packet with settings information to the server
|
||||
func_82883_a,getUnicodeFlag,2,Get unicodeFlag controlling whether strings should be rendered with Unicode fonts instead of the default.png font.
|
||||
func_82889_a,getBatSize,2,"not actually sure this is size, is not used as of now, but the model would be recreated if the value changed and it seems a good match for a bats size"
|
||||
func_83003_a,getMemoryReport,2,Returns a string with allocated and used memory.
|
||||
func_83005_z,getBlockBoundsMinZ,2,returns the block bounderies minZ value
|
||||
func_83006_A,getBlockBoundsMaxZ,2,returns the block bounderies maxZ value
|
||||
func_83007_w,getBlockBoundsMaxX,2,returns the block bounderies maxX value
|
||||
@@ -4101,43 +4082,375 @@ func_85054_d,searchForOtherItemsNearby,2,Looks for other itemstacks nearby and t
|
||||
func_85055_a,makeCrashReport,2,Creates a crash report for the exception
|
||||
func_85057_a,makeCategoryDepth,2,Creates a CrashReportCategory for the given stack trace depth
|
||||
func_85058_a,makeCategory,2,Creates a CrashReportCategory
|
||||
func_85062_a,callBlockDataValue,2,
|
||||
func_85064_a,callBlockLocationInfo,2,
|
||||
func_85071_a,getLocationInfo,2,"Returns a string with world information on location.Args:x,y,z"
|
||||
func_85079_a,callBlockType,2,
|
||||
func_85085_a,callSuspiciousClasses,2,
|
||||
func_85093_e,renderArrowsStuckInEntity,2,"renders arrows the Entity has been attacked with, attached to it"
|
||||
func_85096_a,renderBlockAnvilMetadata,2,Renders anvil block with metadata
|
||||
func_85097_a,callParticlePositionInfo,2,
|
||||
func_85102_a,playSoundToNearExcept,2,Plays sound to all near players except the player reference given
|
||||
func_85103_a,canDropFromExplosion,2,Return whether this block can drop from an explosion.
|
||||
func_85104_a,onBlockPlaced,2,"Called when a block is placed using its ItemBlock. Args: World, X, Y, Z, side, hitX, hitY, hitZ, block metadata"
|
||||
func_85105_g,onPostBlockPlaced,2,Called after a block is placed
|
||||
func_85106_a,insertRecord,2,Insert the specified music disc in the jukebox at the given coordinates
|
||||
func_85107_d,updateLadderBounds,2,Update the ladder block bounds based on the given metadata value.
|
||||
func_85108_a,callLevelGameModeInfo,2,
|
||||
func_85110_a,callLevelWeatherInfo,2,
|
||||
func_85112_a,callLevelStorageFormat,2,
|
||||
func_85114_a,callLevelDimension,2,
|
||||
func_85116_n,getThundering,2,Returns wether it's thundering or not.
|
||||
func_85118_a,addToCrashReport,2,Adds this WorldInfo instance to the crash report.
|
||||
func_85119_k,getRainTime,2,
|
||||
func_85120_o,getGameType,2,
|
||||
func_85121_j,getSaveVersion,2,
|
||||
func_85123_f,getSpawnZCoordinate,2,
|
||||
func_85124_e,getSpawnYCoordinate,2,
|
||||
func_85125_d,getSpawnXCoordinate,2,
|
||||
func_85127_l,getRaining,2,Returns wether it's raining or not.
|
||||
func_85128_b,getMapFeaturesEnabled,2,Return the map feautures enabled of a world
|
||||
func_85129_h,getWorldTime,2,
|
||||
func_85130_c,getWorldGeneratorOptions,2,
|
||||
func_85132_a,getTerrainTypeOfWorld,2,Return the terrain type of a world
|
||||
func_85133_m,getThunderTime,2,
|
||||
func_85134_a,callLevelSpawnLocation,2,
|
||||
func_85136_a,callLevelTime,2,
|
||||
func_85138_a,callLevelGeneratorInfo,2,
|
||||
func_85140_a,callLevelGeneratorOptions,2,
|
||||
func_85142_a,callLevelSeed,2,
|
||||
func_85145_a,callTileEntityName,2,
|
||||
func_85151_d,getLowerChestInventory,2,Return this chest container's lower chest inventory.
|
||||
func_85154_a,callEntityType,2,
|
||||
func_85156_a,removeTask,2,removes the indicated task from the entity's AI tasks.
|
||||
func_85157_q,isAlwaysHarvested,2,Check to see if we can harvest it in any case.
|
||||
func_85158_p,setAlwaysHarvested,2,Set as harvestable in any case.
|
||||
func_85160_a,callStructureType,2,
|
||||
func_85162_a,callChunkPositionHash,2,
|
||||
func_85170_a,callServerType,2,
|
||||
func_85173_a,playSoundToNearExcept,2,Plays sound to all near players except the player reference given
|
||||
func_85175_e,blockGetRenderType,2,Returns the render type of the block at the given coordinate.
|
||||
func_85176_s,getDefaultTeleporter,2,
|
||||
func_85181_a,getRandomModelBox,2,
|
||||
func_85182_a,sameToolAndBlock,2,
|
||||
func_85187_a,drawString,2,"Draws the specified string. Args: string, x, y, color, dropShadow"
|
||||
func_85188_a,makePortal,2,
|
||||
func_85189_a,removeStalePortalLocations,2,called periodically to remove out-of-date portal locations from the cache list. Argument par1 is a WorldServer.getTotalWorldTime() value.
|
||||
func_90010_a,isPartOfLargeChest,2,Return whether the given inventory is part of this large chest.
|
||||
func_90011_a,createChild,2,
|
||||
func_90019_g,applyRenderColor,2,Creates a new EntityDiggingFX with the block render color applied to the base particle color
|
||||
func_90022_d,getListOfPlayers,2,
|
||||
func_90023_a,callMouseLocation,2,
|
||||
func_90027_a,callScreenSize,2,
|
||||
func_90030_a,getRendererMinecraft,2,Get minecraft reference from the EntityRenderer
|
||||
func_90031_a,callScreenName,2,
|
||||
func_90033_f,canLoadWorld,2,Return whether the given world can be loaded.
|
||||
func_90035_a,getClassFromID,2,Return the class assigned to this entity ID.
|
||||
func_90036_a,getFireAspectModifier,2,
|
||||
func_90042_d,getRecord,2,Return the record item corresponding to the given name.
|
||||
func_90043_g,getRecordTitle,2,Return the title for this record.
|
||||
func_90045_a,callClientProfilerInfo,2,
|
||||
func_90047_a,callClientMemoryStats,2,
|
||||
func_90050_a,callTexturePack,2,
|
||||
func_90052_a,callParticleScreenName,2,
|
||||
func_90054_a,callUpdatingScreenName,2,
|
||||
func_90999_ad,canRenderOnFire,2,Return whether this entity should be rendered as on fire.
|
||||
func_92013_a,setEntityItem,2,Sets the ItemStack corresponding to this Entity (and updates the DataWatcher for it)
|
||||
func_92014_d,getEntityItem,2,"Returns the ItemStack corresponding to the Entity (Note: if no item exists, will log an error but still return an ItemStack containing Block.stone)"
|
||||
func_92015_a,getMobID,2,
|
||||
func_92027_k,sendChatMsg,2,Sends the given string to every player as chat message.
|
||||
func_92051_a,addRecipe,2,
|
||||
func_92058_a,setEntityItemStack,2,Sets the ItemStack for this entity
|
||||
func_92059_d,getEntityItem,2,"Returns the ItemStack corresponding to the Entity (Note: if no item exists, will log an error but still return an ItemStack containing Block.stone)"
|
||||
func_92062_k,sendChatMsg,2,Sends the given string to every player as chat message.
|
||||
func_92085_d,getIsBlank,2,
|
||||
func_92087_a,causeThornsDamage,2,Returns the EntityDamageSource of the Thorns enchantment
|
||||
func_92089_a,canApply,2,
|
||||
func_92097_a,negateDamage,2,"Used by ItemStack.attemptDamageItem. Randomly determines if a point of damage should be negated using the enchantment level (par1). If the ItemStack is Armor then there is a flat 60% chance for damage to be negated no matter the enchantment level, otherwise there is a 1-(par/1) chance for damage to be negated."
|
||||
func_92103_a,addRecipe,2,
|
||||
func_94041_b,isStackValidForSlot,2,Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot.
|
||||
func_94042_c,isInvNameLocalized,2,"If this returns false, the inventory name will be used as an unlocalized name, and translated into the player's language. Otherwise it will be used directly."
|
||||
func_94049_a,setCustomName,2,
|
||||
func_94052_a,setParticleIcon,2,
|
||||
func_94053_h,nextTextureIndexX,2,
|
||||
func_94064_a,displayGUIHopper,2,
|
||||
func_94065_a,drawTexturedModelRectFromIcon,2,
|
||||
func_94083_c,getTntPlacedBy,2,returns null or the entityliving it was placed or ignited by
|
||||
func_94085_r,getDefaultDisplayTileOffset,2,
|
||||
func_94086_l,setDisplayTileOffset,2,
|
||||
func_94087_l,getMinecartType,2,
|
||||
func_94089_m,getDisplayTile,2,
|
||||
func_94090_a,createMinecart,2,"Creates a new minecart of the specified type in the specified location in the given world. par0World - world to create the minecart in, double par1,par3,par5 represent x,y,z respectively. int par7 specifies the type: 1 for MinecartChest, 2 for MinecartFurnace, 3 for MinecartTNT, 4 for MinecartMobSpawner, 5 for MinecartHopper and 0 for a standard empty minecart"
|
||||
func_94091_a,updateOnTrack,2,
|
||||
func_94092_k,setDisplayTileData,2,
|
||||
func_94093_n,getDefaultDisplayTile,2,
|
||||
func_94094_j,setDisplayTile,2,
|
||||
func_94095_a,killMinecart,2,
|
||||
func_94096_e,setHasDisplayTile,2,
|
||||
func_94097_p,getDefaultDisplayTileData,2,
|
||||
func_94098_o,getDisplayTileData,2,
|
||||
func_94099_q,getDisplayTileOffset,2,
|
||||
func_94100_s,hasDisplayTile,2,
|
||||
func_94101_h,applyDrag,2,
|
||||
func_94103_c,explodeCart,2,Makes the minecart explode.
|
||||
func_94105_c,ignite,2,Ignites this TNT cart.
|
||||
func_94107_f,setMinecartPowered,2,
|
||||
func_94108_c,isMinecartPowered,2,
|
||||
func_94114_a,areItemStacksEqualItem,2,
|
||||
func_94116_j,insertItemToInventory,2,Inserts one item from the hopper into the inventory the hopper is pointing at.
|
||||
func_94117_a,insertStack,2,"Inserts a stack into an inventory. Args: Inventory, stack, side. Returns leftover items."
|
||||
func_94119_v,getOutputInventory,2,Gets the inventory the hopper is pointing at.
|
||||
func_94128_d,getAccessibleSlotsFromSide,2,Returns an array containing the indices of the slots that can be accessed by automation on the given side of this block.
|
||||
func_94140_a,registerDestroyBlockIcons,2,
|
||||
func_94143_a,updateIcons,2,
|
||||
func_94144_a,renderBlockInMinecart,2,Renders the block that is inside the minecart.
|
||||
func_94148_a,renderItemOverlayIntoGUI,2,
|
||||
func_94149_a,renderIcon,2,
|
||||
func_94152_c,refreshTextureMaps,2,
|
||||
func_94156_a,intersection,2,
|
||||
func_94157_d,getRectHeight,2,
|
||||
func_94158_a,getRectX,2,
|
||||
func_94159_c,getRectWidth,2,
|
||||
func_94160_b,getRectY,2,
|
||||
func_94165_a,getBlockIconFromSideAndMetadata,2,
|
||||
func_94167_b,hasOverrideBlockTexture,2,
|
||||
func_94170_a,getBlockIcon,2,
|
||||
func_94171_a,renderBlockComparator,2,
|
||||
func_94172_a,renderBlockHopper,2,
|
||||
func_94173_a,getBlockIconFromSide,2,
|
||||
func_94174_a,renderBlockRedstoneLogicMetadata,2,
|
||||
func_94175_b,getBlockIcon,2,
|
||||
func_94176_a,renderBlockRedstoneLogic,2,
|
||||
func_94178_a,updateIcons,2,
|
||||
func_94179_g,isCompatible,2,
|
||||
func_94183_a,getStitchHolder,2,
|
||||
func_94184_a,getAllStitchSlots,2,Gets the slot and all its subslots
|
||||
func_94185_c,getOriginY,2,
|
||||
func_94186_b,getOriginX,2,
|
||||
func_94193_b,ceil16,2,
|
||||
func_94194_d,rotate,2,
|
||||
func_94195_e,isRotated,2,
|
||||
func_94196_a,setNewDimension,2,
|
||||
func_94197_a,getWidth,2,
|
||||
func_94198_a,compareToStitchHolder,2,See Comparable.compareTo.
|
||||
func_94199_b,getHeight,2,
|
||||
func_94206_g,getMinV,2,Returns the minimum V coordinate to use when rendering with this icon.
|
||||
func_94207_b,getInterpolatedV,2,Gets a V coordinate on the icon. 0 returns vMin and 16 returns vMax. Other arguments return in-between values.
|
||||
func_94208_k,getSheetHeight,2,"Returns the height of the texture sheet this icon is on, in pixels."
|
||||
func_94209_e,getMinU,2,Returns the minimum U coordinate to use when rendering with this icon.
|
||||
func_94210_h,getMaxV,2,Returns the maximum V coordinate to use when rendering with this icon.
|
||||
func_94211_a,getOriginX,2,"Returns the X position of this icon on its texture sheet, in pixels."
|
||||
func_94212_f,getMaxU,2,Returns the maximum U coordinate to use when rendering with this icon.
|
||||
func_94213_j,getSheetWidth,2,"Returns the width of the texture sheet this icon is on, in pixels."
|
||||
func_94214_a,getInterpolatedU,2,Gets a U coordinate on the icon. 0 returns uMin and 16 returns uMax. Other arguments return in-between values.
|
||||
func_94215_i,getIconName,2,
|
||||
func_94216_b,getOriginY,2,"Returns the Y position of this icon on its texture sheet, in pixels."
|
||||
func_94217_a,copyFrom,2,
|
||||
func_94218_a,init,2,
|
||||
func_94219_l,updateAnimation,2,
|
||||
func_94220_a,makeTextureStitched,2,
|
||||
func_94221_a,readAnimationInfo,2,
|
||||
func_94241_a,updateCompass,2,"Updates the compass based on the given x,z coords and camera direction"
|
||||
func_94245_a,registerIcon,2,
|
||||
func_94246_d,getTexture,2,
|
||||
func_94247_b,refreshTextures,2,
|
||||
func_94248_c,updateAnimations,2,
|
||||
func_94259_a,registerTexture,2,
|
||||
func_94261_a,makeTexture,2,
|
||||
func_94262_d,createStitcher,2,
|
||||
func_94263_a,init,2,
|
||||
func_94264_a,registerTexture,2,
|
||||
func_94265_c,getNextTextureId,2,
|
||||
func_94266_e,createTexture,2,
|
||||
func_94267_b,instance,2,
|
||||
func_94272_a,fillRect,2,
|
||||
func_94273_h,getTextureData,2,
|
||||
func_94274_a,getTextureRect,2,
|
||||
func_94275_d,getWidth,2,
|
||||
func_94276_e,getHeight,2,
|
||||
func_94277_a,bindTexture,2,
|
||||
func_94278_a,transferFromImage,2,
|
||||
func_94279_c,writeImage,2,
|
||||
func_94280_f,getTextureName,2,
|
||||
func_94281_a,copyFrom,2,
|
||||
func_94282_c,getGlTextureId,2,
|
||||
func_94284_b,getTextureId,2,
|
||||
func_94285_g,uploadTexture,2,
|
||||
func_94305_f,doStitch,2,
|
||||
func_94306_e,getTexture,2,
|
||||
func_94308_a,getCeilPowerOf2,2,Returns power of 2 >= the specified value
|
||||
func_94309_g,getStichSlots,2,
|
||||
func_94310_b,allocateSlot,2,Attempts to find space for specified tile
|
||||
func_94311_c,expandAndAllocateSlot,2,Expand stitched texture in order to make space for specified tile
|
||||
func_94312_a,addStitchHolder,2,
|
||||
func_94327_t_,getItemIconName,2,Gets the icon name of the ItemBlock corresponding to this block. Used by hoppers.
|
||||
func_94328_b_,getComparatorInputOverride,2,"If hasComparatorInputOverride returns true, the return value from this is used instead of the redstone signal strength when this block inputs to a comparator."
|
||||
func_94329_b,isAssociatedBlockID,2,Static version of isAssociatedBlockID.
|
||||
func_94330_A,getUnlocalizedName2,2,Returns the unlocalized name without the tile. prefix. Caution: client-only.
|
||||
func_94331_a,canPlaceBlockOnSide,2,
|
||||
func_94332_a,registerIcons,2,"When this method is called, your block should register all the icons it needs with the given IconRegister. This is the only chance you get to register icons."
|
||||
func_94334_h,isAssociatedBlockID,2,"Returns true if the given block ID is equivalent to this one. Example: redstoneTorchOn matches itself and redstoneTorchOff, and vice versa. Most blocks only match themselves."
|
||||
func_94350_c,getPowerSupply,2,Argument is metadata. Returns power level (0-15)
|
||||
func_94351_d,getPlateState,2,Returns the current state of the pressure plate. Returns a value between 0 and 15 based on the number of items on it.
|
||||
func_94352_a,getSensitiveAABB,2,
|
||||
func_94355_d,getMetaFromWeight,2,Argument is weight (0-15). Return the metadata to be set because of it.
|
||||
func_94434_o,getIconSideOverlay,2,
|
||||
func_94442_h_,getInventory,2,"Gets the inventory of the chest at the specified coords, accounting for blocks or ocelots on top of the chest, and double chests."
|
||||
func_94444_j_,updateLightLevel,2,
|
||||
func_94446_i,getBeaconIcon,2,
|
||||
func_94448_e,getBrewingStandIcon,2,
|
||||
func_94451_c,getDirectionFromMetadata,2,
|
||||
func_94452_d,getIsBlockNotPoweredFromMetadata,2,
|
||||
func_94453_b,getHopperIcon,2,
|
||||
func_94501_a,getRailLogic,2,
|
||||
func_94502_a,isMinecartTrack,2,
|
||||
func_94503_c,canConnectFrom,2,
|
||||
func_94504_a,setBasicRail,2,
|
||||
func_94505_a,getNumberOfAdjacentTracks,2,
|
||||
func_94506_c,connectToNeighbor,2,
|
||||
func_94507_b,canConnectTo,2,
|
||||
func_94508_a,isRailChunkPositionCorrect,2,Checks if the rail is at the chunk position it is expected to be.
|
||||
func_94509_b,refreshConnectedTracks,2,
|
||||
func_94510_b,isPartOfTrack,2,
|
||||
func_94520_b,containsTranslateKey,2,
|
||||
func_94526_b,calcRedstoneFromInventory,2,
|
||||
func_94539_a,setExplosionSource,2,
|
||||
func_94540_d,setExplosion,2,
|
||||
func_94541_c,isExplosion,2,
|
||||
func_94571_i,setBlockToAir,2,"Sets a block to 0 and notifies relevant systems with the block change Args: x, y, z"
|
||||
func_94572_D,getStrongestIndirectPower,2,
|
||||
func_94573_a,isBlockTickScheduled,2,"Returns true if the given block will receive a scheduled tick in the future. Args: X, Y, Z, blockID"
|
||||
func_94574_k,getIndirectPowerOutput,2,"Returns the indirect signal strength being outputted by the given block in the *opposite* of the given direction. Args: X, Y, Z, direction"
|
||||
func_94575_c,setBlock,2,"Sets a block and notifies relevant systems with the block change Args: x, y, z, blockID"
|
||||
func_94576_a,getEntitiesWithinAABBExcludingEntity,2,
|
||||
func_94577_B,getBlockPowerInput,2,"Returns the highest redstone signal strength powering the given block. Args: X, Y, Z."
|
||||
func_94578_a,destroyBlock,2,"Destroys a block and optionally drops items. Args: X, Y, Z, dropItems"
|
||||
func_94581_a,registerIcons,2,
|
||||
func_94599_c,getItemIconForUseDuration,2,"used to cycle through icons based on their used duration, i.e. for the bow"
|
||||
func_94608_d,getItemSpriteNumber,2,
|
||||
func_94609_a,callTileEntityID,2,
|
||||
func_94611_a,callTileEntityDataInfo,2,
|
||||
func_94901_k,getSpriteNumber,2,"Returns 0 for /terrain.png, 1 for /gui/items.png"
|
||||
func_96090_ax,getTranslatedEntityName,2,Returns the translated name of the entity.
|
||||
func_96095_a,onActivatorRailPass,2,Called every tick the minecart is on an activator rail.
|
||||
func_96096_ay,isIgnited,2,Returns true if the TNT minecart is ignited.
|
||||
func_96104_c,setCommandSenderName,2,Sets the name of the command sender
|
||||
func_96107_aA,getXPos,2,Gets the world X position for this hopper entity.
|
||||
func_96108_aC,getZPos,2,Gets the world Z position for this hopper entity.
|
||||
func_96109_aB,getYPos,2,Gets the world Y position for this hopper entity.
|
||||
func_96110_f,setBlocked,2,Set whether this hopper minecart is being blocked by an activator rail.
|
||||
func_96111_ay,getBlocked,2,Get whether this hopper minecart is being blocked by an activator rail.
|
||||
func_96115_a,setInventoryName,2,
|
||||
func_96116_a,suckItemsIntoHopper,2,Sucks one item into the given hopper from an inventory or EntityItem above it.
|
||||
func_96117_b,getInventoryAtLocation,2,Gets an inventory at the given location to extract items into or take items from. Can find either a tile entity or regular entity implementing IInventory.
|
||||
func_96118_b,getInventoryAboveHopper,2,"Looks for anything, that can hold items (like chests, furnaces, etc.) one block above the given hopper."
|
||||
func_96123_co,getWorldScoreboard,2,
|
||||
func_96124_cp,getTeam,2,
|
||||
func_96125_a,displayGUIHopperMinecart,2,
|
||||
func_96334_d,getScoreboardFromWorldServer,2,
|
||||
func_96335_a,getScoreObjectivesList,2,"If the parameter is true, does not return read-only entries."
|
||||
func_96336_d,getObjectivesList,2,Handler for the 'scoreboard objectives list' command.
|
||||
func_96337_e,removeObjective,2,Handler for the 'scoreboard objectives remove' command.
|
||||
func_96338_a,getTeam,2,Returns the ScorePlayerTeam for the given team name.
|
||||
func_96339_l,setPlayerScore,2,Handler for the 'scoreboard players [add|remove|set]' commands.
|
||||
func_96340_c,addTeam,2,Handler for the 'scoreboard teams add' command.
|
||||
func_96341_k,listPlayers,2,Handler for the 'scoreboard players list' command.
|
||||
func_96342_g,joinTeam,2,Handler for the 'scoreboard teams join' command.
|
||||
func_96343_e,removeTeam,2,Handler for the 'scoreboard teams remove' command.
|
||||
func_96344_f,getTeamList,2,Handler for the 'scoreboard teams list' command.
|
||||
func_96345_a,getScoreObjective,2,"User-safe version of Scoreboard.getObjective, does checks against the objective not being found and whether it's read-only or not. If true, the second parameter makes the function throw an exception if the objective is read-only."
|
||||
func_96346_i,emptyTeam,2,Handler for the 'scoreboard teams empty' command.
|
||||
func_96347_j,setObjectivesDisplay,2,Handler for the 'scoreboard objectives setdisplay' command.
|
||||
func_96348_d,setTeamOption,2,Handler for the 'scoreboard teams option' command.
|
||||
func_96349_h,leaveTeam,2,Handler for the 'scoreboard teams leave' command.
|
||||
func_96350_b,addObjective,2,Handler for the 'scoreboard objectives add' command.
|
||||
func_96351_m,resetPlayerScore,2,Handler for the 'scoreboard players reset' command.
|
||||
func_96435_a,handleSetPlayerTeam,2,Handle a set player team packet.
|
||||
func_96436_a,handleSetObjective,2,Handle a set objective packet.
|
||||
func_96437_a,handleSetScore,2,Handle a set score packet.
|
||||
func_96438_a,handleSetDisplayObjective,2,Handle a set display objective packet.
|
||||
func_96439_d,notifyBlocksOfNeighborChange,2,"Calls notifyBlockOfNeighborChange on adjacent blocks, except the one on the given side. Args: X, Y, Z, changingBlockID, side"
|
||||
func_96441_U,getScoreboard,2,
|
||||
func_96444_a,mixAoBrightness,2,
|
||||
func_96445_r,renderBlockQuartz,2,
|
||||
func_96446_b,getIconSafe,2,
|
||||
func_96447_a,renderBlockHopperMetadata,2,
|
||||
func_96448_c,getMissingIcon,2,
|
||||
func_96455_e,getMissingIcon,2,
|
||||
func_96468_q_,hasComparatorInputOverride,2,"If this returns true, then comparators facing away from this block will use the value from getComparatorInputOverride instead of the actual redstone signal strength."
|
||||
func_96471_k,updateMetadata,2,Updates the Metadata to include if the Hopper gets powered by Redstone or not
|
||||
func_96472_a,getBehaviorForItemStack,2,Returns the behavior for the given ItemStack.
|
||||
func_96475_a_,getTileEntityComparator,2,Returns the blockTileEntity at given coordinates.
|
||||
func_96477_c,markOrGrowMarked,2,
|
||||
func_96478_d,setBlockBoundsForSnowDepth,2,"calls setBlockBounds based on the depth of the snow. Int is any values 0x0-0x7, usually this blocks metadata."
|
||||
func_96509_i,getPlayersTeam,2,Gets the ScorePlayerTeam object for the given username.
|
||||
func_96512_b,removePlayerFromTeam,2,Removes the given username from the given ScorePlayerTeam. If the player is not on the team then an IllegalStateException is thrown.
|
||||
func_96514_c,getScoreObjectives,2,
|
||||
func_96517_b,getObjectiveDisplaySlot,2,"Returns 'list' for 0, 'sidebar' for 1, 'belowName for 2, otherwise null."
|
||||
func_96518_b,getObjective,2,Returns a ScoreObjective for the objective name
|
||||
func_96526_d,getObjectiveNames,2,
|
||||
func_96537_j,getObjectiveDisplaySlotNumber,2,"Returns 0 for (case-insensitive) 'list', 1 for 'sidebar', 2 for 'belowName', otherwise -1."
|
||||
func_96556_a,callServerMemoryStats,2,
|
||||
func_96557_a,callServerProfiler,2,
|
||||
func_96559_d,getFrontOffsetY,2,
|
||||
func_96563_a,callEntityName,2,
|
||||
func_96631_a,attemptDamageItem,2,"Attempts to damage the ItemStack with par1 amount of damage, If the ItemStack has the Unbreaking enchantment there is a chance for each point of damage to be negated. Returns true if it takes more damage than getMaxDamage(). Returns false otherwise or if the ItemStack can't be damaged or if all points of damage are negated."
|
||||
func_96632_a,callItemDisplayName,2,
|
||||
func_96637_b,isReadOnly,2,
|
||||
func_96670_d,getMembershipCollection,2,
|
||||
func_96678_d,getDisplayName,2,
|
||||
func_96679_b,getName,2,
|
||||
func_96680_c,getCriteria,2,
|
||||
func_96681_a,setDisplayName,2,
|
||||
func_96682_a,getScoreboard,2,
|
||||
func_98033_al,getLogAgent,2,
|
||||
func_98035_c,addNotRiddenEntityID,2,
|
||||
func_98042_n,setTransferTicker,2,"Sets the transfer ticker, used to determine the delay between transfers."
|
||||
func_98043_aE,canTransfer,2,Returns whether the hopper cart can currently transfer an item.
|
||||
func_98046_c,setTransferCooldown,2,
|
||||
func_98047_l,isCoolingDown,2,
|
||||
func_98052_bS,canPickUpLoot,2,
|
||||
func_98053_h,setCanPickUpLoot,2,
|
||||
func_98076_a,getServerLogger,2,
|
||||
func_98145_a,createEmptyTexture,2,
|
||||
func_98146_d,getBasename,2,"Strips directory and file extension from the specified path, returning only the filename"
|
||||
func_98147_a,hasAnimationTxt,2,Returns true if specified texture pack contains animation data for the specified texture file
|
||||
func_98152_d,getAllUsernames,2,
|
||||
func_98179_a,computeLightValue,2,
|
||||
func_98180_V,getWorldLogAgent,2,
|
||||
func_98182_a,handleWorldParticles,2,Handle a world particles packet.
|
||||
func_98184_a,setupTextureExt,2,
|
||||
func_98185_a,resetBoundTexture,2,
|
||||
func_98186_a,colorToAnaglyph,2,
|
||||
func_98187_b,bindTexture,2,
|
||||
func_98194_g,getPositionY,2,Gets the Y position of the particle.
|
||||
func_98195_d,getParticleName,2,
|
||||
func_98196_i,getOffsetX,2,This is added to the X position after being multiplied by random.nextGaussian()
|
||||
func_98197_l,getSpeed,2,Gets the speed of the particles.
|
||||
func_98198_h,getPositionZ,2,Gets the Z position of the particle.
|
||||
func_98199_k,getOffsetZ,2,This is added to the Z position after being multiplied by random.nextGaussian()
|
||||
func_98200_f,getPositionX,2,Gets the X position of the particle.
|
||||
func_98201_j,getOffsetY,2,This is added to the Y position after being multiplied by random.nextGaussian()
|
||||
func_98202_m,getQuantity,2,Gets the number of particles to create.
|
||||
func_98213_d,getHopperTile,2,
|
||||
func_98225_a,getPacketClass,2,
|
||||
func_98230_d,logFine,2,
|
||||
func_98231_b,logWarningFormatted,2,
|
||||
func_98232_c,logSevere,2,
|
||||
func_98233_a,logInfo,2,
|
||||
func_98234_c,logSevereException,2,
|
||||
func_98235_b,logWarningException,2,
|
||||
func_98236_b,logWarning,2,
|
||||
func_98238_b,setupLogger,2,Sets up the logger for usage.
|
||||
func_98243_a,callPacketID,2,
|
||||
func_98266_d,getSpawnerZ,2,
|
||||
func_98268_b,setDelayToMin,2,"Sets the delay to minDelay if parameter given is 1, else return false."
|
||||
func_98269_i,getRandomMinecart,2,
|
||||
func_98270_a,readFromNBT,2,
|
||||
func_98271_a,getSpawnerWorld,2,
|
||||
func_98272_a,setMobID,2,
|
||||
func_98274_c,getSpawnerY,2,
|
||||
func_98275_b,getSpawnerX,2,
|
||||
func_98276_e,getEntityNameToSpawn,2,Gets the entity name that should be spawned.
|
||||
func_98277_a,setRandomMinecart,2,
|
||||
func_98278_g,updateSpawner,2,
|
||||
func_98279_f,canRun,2,Returns true if there's a player close enough to this mob spawner to activate it.
|
||||
func_98280_b,writeToNBT,2,
|
||||
func_98304_a,readFontData,2,
|
||||
func_98305_c,readFontTexture,2,
|
||||
func_98306_d,readGlyphSizes,2,
|
||||
|
+154
-62
@@ -13,12 +13,13 @@ BlockButtonStone,net/minecraft/block
|
||||
BlockButtonWood,net/minecraft/block
|
||||
BlockCactus,net/minecraft/block
|
||||
BlockCake,net/minecraft/block
|
||||
BlockCarpet,net/minecraft/block
|
||||
BlockCarrot,net/minecraft/block
|
||||
BlockCauldron,net/minecraft/block
|
||||
BlockChest,net/minecraft/block
|
||||
BlockClay,net/minecraft/block
|
||||
BlockCloth,net/minecraft/block
|
||||
BlockCocoa,net/minecraft/block
|
||||
BlockColored,net/minecraft/block
|
||||
BlockCommandBlock,net/minecraft/block
|
||||
BlockComparator,net/minecraft/block
|
||||
BlockContainer,net/minecraft/block
|
||||
@@ -51,6 +52,7 @@ BlockGlowStone,net/minecraft/block
|
||||
BlockGrass,net/minecraft/block
|
||||
BlockGravel,net/minecraft/block
|
||||
BlockHalfSlab,net/minecraft/block
|
||||
BlockHay,net/minecraft/block
|
||||
BlockHopper,net/minecraft/block
|
||||
BlockIce,net/minecraft/block
|
||||
BlockJukeBox,net/minecraft/block
|
||||
@@ -93,6 +95,7 @@ BlockRedstoneRepeater,net/minecraft/block
|
||||
BlockRedstoneTorch,net/minecraft/block
|
||||
BlockRedstoneWire,net/minecraft/block
|
||||
BlockReed,net/minecraft/block
|
||||
BlockRotatedPillar,net/minecraft/block
|
||||
BlockSand,net/minecraft/block
|
||||
BlockSandStone,net/minecraft/block
|
||||
BlockSapling,net/minecraft/block
|
||||
@@ -141,28 +144,23 @@ CallableClientMemoryStats,net/minecraft/client
|
||||
CallableClientProfiler,net/minecraft/client
|
||||
CallableGLInfo,net/minecraft/client
|
||||
CallableLWJGLVersion,net/minecraft/client
|
||||
CallableLaunchedVersion,net/minecraft/client
|
||||
CallableModded,net/minecraft/client
|
||||
CallableParticleScreenName,net/minecraft/client
|
||||
CallableTexturePack,net/minecraft/client
|
||||
CallableTickingScreenName,net/minecraft/client
|
||||
CallableType2,net/minecraft/client
|
||||
CallableUpdatingScreenName,net/minecraft/client
|
||||
CanvasCrashReport,net/minecraft/client
|
||||
CanvasMinecraftApplet,net/minecraft/client
|
||||
CanvasMojangLogo,net/minecraft/client
|
||||
EnumOSHelper,net/minecraft/client
|
||||
GameWindowListener,net/minecraft/client
|
||||
MinecraftAppletImpl,net/minecraft/client
|
||||
MinecraftFakeLauncher,net/minecraft/client
|
||||
PanelCrashReport,net/minecraft/client
|
||||
Minecraft,net/minecraft/client
|
||||
StatStringFormatKeyInv,net/minecraft/client
|
||||
ThreadClientSleep,net/minecraft/client
|
||||
ThreadShutdown,net/minecraft/client
|
||||
CodecMus,net/minecraft/client/audio
|
||||
MusInputStream,net/minecraft/client/audio
|
||||
ScheduledSound,net/minecraft/client/audio
|
||||
SoundManager,net/minecraft/client/audio
|
||||
SoundManagerINNER1,net/minecraft/client/audio
|
||||
SoundPool,net/minecraft/client/audio
|
||||
SoundPoolEntry,net/minecraft/client/audio
|
||||
SoundPoolProtocolHandler,net/minecraft/client/audio
|
||||
SoundPoolURLConnection,net/minecraft/client/audio
|
||||
AbstractClientPlayer,net/minecraft/client/entity
|
||||
EntityClientPlayerMP,net/minecraft/client/entity
|
||||
EntityOtherPlayerMP,net/minecraft/client/entity
|
||||
EntityPlayerSP,net/minecraft/client/entity
|
||||
@@ -201,9 +199,7 @@ GuiMerchant,net/minecraft/client/gui
|
||||
GuiMultiplayer,net/minecraft/client/gui
|
||||
GuiNewChat,net/minecraft/client/gui
|
||||
GuiOptions,net/minecraft/client/gui
|
||||
GuiParticle,net/minecraft/client/gui
|
||||
GuiPlayerInfo,net/minecraft/client/gui
|
||||
GuiProgress,net/minecraft/client/gui
|
||||
GuiRenameWorld,net/minecraft/client/gui
|
||||
GuiRepair,net/minecraft/client/gui
|
||||
GuiScreen,net/minecraft/client/gui
|
||||
@@ -211,14 +207,13 @@ GuiScreenAddServer,net/minecraft/client/gui
|
||||
GuiScreenBook,net/minecraft/client/gui
|
||||
GuiScreenConfigureWorld,net/minecraft/client/gui
|
||||
GuiScreenConfirmation,net/minecraft/client/gui
|
||||
GuiScreenCreateOnlineWorld,net/minecraft/client/gui
|
||||
GuiScreenDemo,net/minecraft/client/gui
|
||||
GuiScreenDisconnectedOnline,net/minecraft/client/gui
|
||||
GuiScreenEditOnlineWorld,net/minecraft/client/gui
|
||||
GuiScreenInvite,net/minecraft/client/gui
|
||||
GuiScreenLongRunningTask,net/minecraft/client/gui
|
||||
GuiScreenOnlineServers,net/minecraft/client/gui
|
||||
GuiScreenResetWorld,net/minecraft/client/gui
|
||||
GuiScreenOnlineServersSubscreen,net/minecraft/client/gui
|
||||
GuiScreenSelectLocation,net/minecraft/client/gui
|
||||
GuiScreenServerList,net/minecraft/client/gui
|
||||
GuiScreenSubscription,net/minecraft/client/gui
|
||||
@@ -240,22 +235,17 @@ GuiWorldSlot,net/minecraft/client/gui
|
||||
GuiYesNo,net/minecraft/client/gui
|
||||
LoadingScreenRenderer,net/minecraft/client/gui
|
||||
MapItemRenderer,net/minecraft/client/gui
|
||||
Particle,net/minecraft/client/gui
|
||||
RunnableTitleScreen,net/minecraft/client/gui
|
||||
ScaledResolution,net/minecraft/client/gui
|
||||
ScreenChatOptions,net/minecraft/client/gui
|
||||
SelectionListBase,net/minecraft/client/gui
|
||||
SelectionListInvited,net/minecraft/client/gui
|
||||
SelectionListLocation,net/minecraft/client/gui
|
||||
TaskLongRunning,net/minecraft/client/gui
|
||||
TaskOnlineConnect,net/minecraft/client/gui
|
||||
TaskResetWorld,net/minecraft/client/gui
|
||||
TaskWorldCreation,net/minecraft/client/gui
|
||||
ThreadConnectToOnlineServer,net/minecraft/client/gui
|
||||
ThreadCreateOnlineWorldScreen,net/minecraft/client/gui
|
||||
ThreadOnlineConnect,net/minecraft/client/gui
|
||||
ThreadOnlineScreen,net/minecraft/client/gui
|
||||
ThreadPollServers,net/minecraft/client/gui
|
||||
ThreadTitleScreen,net/minecraft/client/gui
|
||||
GuiAchievement,net/minecraft/client/gui/achievement
|
||||
GuiAchievements,net/minecraft/client/gui/achievement
|
||||
GuiSlotStats,net/minecraft/client/gui/achievement
|
||||
@@ -281,29 +271,50 @@ GuiDispenser,net/minecraft/client/gui/inventory
|
||||
GuiEditSign,net/minecraft/client/gui/inventory
|
||||
GuiFurnace,net/minecraft/client/gui/inventory
|
||||
GuiInventory,net/minecraft/client/gui/inventory
|
||||
GuiScreenHorseInventory,net/minecraft/client/gui/inventory
|
||||
SlotCreativeInventory,net/minecraft/client/gui/inventory
|
||||
GuiScreenBackup,net/minecraft/client/gui/mco
|
||||
GuiScreenBackupDownloadThread,net/minecraft/client/gui/mco
|
||||
GuiScreenBackupRestoreTask,net/minecraft/client/gui/mco
|
||||
GuiScreenBackupSelectionList,net/minecraft/client/gui/mco
|
||||
GuiScreenCreateOnlineWorld,net/minecraft/client/gui/mco
|
||||
GuiScreenMcoWorldTemplate,net/minecraft/client/gui/mco
|
||||
GuiScreenMcoWorldTemplateDownloadThread,net/minecraft/client/gui/mco
|
||||
GuiScreenMcoWorldTemplateSelectionList,net/minecraft/client/gui/mco
|
||||
GuiScreenPendingInvitation,net/minecraft/client/gui/mco
|
||||
GuiScreenPendingInvitationINNER1,net/minecraft/client/gui/mco
|
||||
GuiScreenPendingInvitationINNER2,net/minecraft/client/gui/mco
|
||||
GuiScreenPendingInvitationINNER3,net/minecraft/client/gui/mco
|
||||
GuiScreenPendingInvitationList,net/minecraft/client/gui/mco
|
||||
GuiScreenResetWorld,net/minecraft/client/gui/mco
|
||||
ScreenWithCallback,net/minecraft/client/gui/mco
|
||||
TaskResetWorld,net/minecraft/client/gui/mco
|
||||
TaskWorldCreation,net/minecraft/client/gui/mco
|
||||
MainProxyAuthenticator,net/minecraft/client/main
|
||||
MainShutdownHook,net/minecraft/client/main
|
||||
Backup,net/minecraft/client/mco
|
||||
BackupList,net/minecraft/client/mco
|
||||
ExceptionMcoHttp,net/minecraft/client/mco
|
||||
ExceptionMcoService,net/minecraft/client/mco
|
||||
ExceptionRetryCall,net/minecraft/client/mco
|
||||
Location,net/minecraft/client/mco
|
||||
Locations,net/minecraft/client/mco
|
||||
McoClient,net/minecraft/client/mco
|
||||
McoOption,net/minecraft/client/mco
|
||||
McoOptionNone,net/minecraft/client/mco
|
||||
McoOptionSome,net/minecraft/client/mco
|
||||
McoPair,net/minecraft/client/mco
|
||||
McoServer,net/minecraft/client/mco
|
||||
McoServerAddress,net/minecraft/client/mco
|
||||
McoServerList,net/minecraft/client/mco
|
||||
McoServerListINNER1,net/minecraft/client/mco
|
||||
McoServerListEmptyAnon,net/minecraft/client/mco
|
||||
McoServerListUpdateThread,net/minecraft/client/mco
|
||||
McoServerListUpdateThreadComparer,net/minecraft/client/mco
|
||||
PendingInvite,net/minecraft/client/mco
|
||||
PendingInvitesList,net/minecraft/client/mco
|
||||
Request,net/minecraft/client/mco
|
||||
RequestDelete,net/minecraft/client/mco
|
||||
RequestGet,net/minecraft/client/mco
|
||||
RequestPost,net/minecraft/client/mco
|
||||
RequestPut,net/minecraft/client/mco
|
||||
TimerTaskMcoServerListUpdate,net/minecraft/client/mco
|
||||
ValueObjectList,net/minecraft/client/mco
|
||||
ValueObjectSubscription,net/minecraft/client/mco
|
||||
WorldTemplate,net/minecraft/client/mco
|
||||
WorldTemplateList,net/minecraft/client/mco
|
||||
ModelBase,net/minecraft/client/model
|
||||
ModelBat,net/minecraft/client/model
|
||||
ModelBiped,net/minecraft/client/model
|
||||
@@ -319,8 +330,10 @@ ModelDragon,net/minecraft/client/model
|
||||
ModelEnderCrystal,net/minecraft/client/model
|
||||
ModelEnderman,net/minecraft/client/model
|
||||
ModelGhast,net/minecraft/client/model
|
||||
ModelHorse,net/minecraft/client/model
|
||||
ModelIronGolem,net/minecraft/client/model
|
||||
ModelLargeChest,net/minecraft/client/model
|
||||
ModelLeashKnot,net/minecraft/client/model
|
||||
ModelMagmaCube,net/minecraft/client/model
|
||||
ModelMinecart,net/minecraft/client/model
|
||||
ModelOcelot,net/minecraft/client/model
|
||||
@@ -353,7 +366,6 @@ GuiConnecting,net/minecraft/client/multiplayer
|
||||
LanServer,net/minecraft/client/multiplayer
|
||||
LanServerList,net/minecraft/client/multiplayer
|
||||
NetClientHandler,net/minecraft/client/multiplayer
|
||||
NetClientWebTextures,net/minecraft/client/multiplayer
|
||||
PlayerControllerMP,net/minecraft/client/multiplayer
|
||||
ServerAddress,net/minecraft/client/multiplayer
|
||||
ServerData,net/minecraft/client/multiplayer
|
||||
@@ -393,10 +405,13 @@ EntitySnowShovelFX,net/minecraft/client/particle
|
||||
EntitySpellParticleFX,net/minecraft/client/particle
|
||||
EntitySplashFX,net/minecraft/client/particle
|
||||
EntitySuspendFX,net/minecraft/client/particle
|
||||
RenderCaveSpider,net/minecraft/client/render/entity
|
||||
RenderHorse,net/minecraft/client/render/entity
|
||||
RenderLeashKnot,net/minecraft/client/render/entity
|
||||
RendererLivingEntity,net/minecraft/client/render/entity
|
||||
ActiveRenderInfo,net/minecraft/client/renderer
|
||||
CallableMouseLocation,net/minecraft/client/renderer
|
||||
CallableParticlePositionInfo,net/minecraft/client/renderer
|
||||
CallableParticleScreenName,net/minecraft/client/renderer
|
||||
CallableScreenName,net/minecraft/client/renderer
|
||||
CallableScreenSize,net/minecraft/client/renderer
|
||||
ChestItemRenderHelper,net/minecraft/client/renderer
|
||||
@@ -412,15 +427,14 @@ ItemRenderer,net/minecraft/client/renderer
|
||||
OpenGlCapsChecker,net/minecraft/client/renderer
|
||||
OpenGlHelper,net/minecraft/client/renderer
|
||||
RenderBlocks,net/minecraft/client/renderer
|
||||
RenderEngine,net/minecraft/client/renderer
|
||||
RenderGlobal,net/minecraft/client/renderer
|
||||
RenderHelper,net/minecraft/client/renderer
|
||||
RenderList,net/minecraft/client/renderer
|
||||
RenderSorter,net/minecraft/client/renderer
|
||||
StitcherException,net/minecraft/client/renderer
|
||||
Tessellator,net/minecraft/client/renderer
|
||||
ThreadDownloadImage,net/minecraft/client/renderer
|
||||
ThreadDownloadImageData,net/minecraft/client/renderer
|
||||
ThreadDownloadImageDataINNER1,net/minecraft/client/renderer
|
||||
WorldRenderer,net/minecraft/client/renderer
|
||||
ClippingHelper,net/minecraft/client/renderer/culling
|
||||
ClippingHelperImpl,net/minecraft/client/renderer/culling
|
||||
@@ -472,17 +486,24 @@ RenderWither,net/minecraft/client/renderer/entity
|
||||
RenderWolf,net/minecraft/client/renderer/entity
|
||||
RenderXPOrb,net/minecraft/client/renderer/entity
|
||||
RenderZombie,net/minecraft/client/renderer/entity
|
||||
AbstractTexture,net/minecraft/client/renderer/texture
|
||||
DynamicTexture,net/minecraft/client/renderer/texture
|
||||
IconRegister,net/minecraft/client/renderer/texture
|
||||
Rect2i,net/minecraft/client/renderer/texture
|
||||
LayeredTexture,net/minecraft/client/renderer/texture
|
||||
SimpleTexture,net/minecraft/client/renderer/texture
|
||||
StitchHolder,net/minecraft/client/renderer/texture
|
||||
StitchSlot,net/minecraft/client/renderer/texture
|
||||
Stitcher,net/minecraft/client/renderer/texture
|
||||
Texture,net/minecraft/client/renderer/texture
|
||||
TextureAtlasSprite,net/minecraft/client/renderer/texture
|
||||
TextureClock,net/minecraft/client/renderer/texture
|
||||
TextureCompass,net/minecraft/client/renderer/texture
|
||||
TextureManager,net/minecraft/client/renderer/texture
|
||||
TextureManagerINNER1,net/minecraft/client/renderer/texture
|
||||
TextureMap,net/minecraft/client/renderer/texture
|
||||
TextureStitched,net/minecraft/client/renderer/texture
|
||||
TextureObject,net/minecraft/client/renderer/texture
|
||||
TextureUtil,net/minecraft/client/renderer/texture
|
||||
Tickable,net/minecraft/client/renderer/texture
|
||||
TickableTextureObject,net/minecraft/client/renderer/texture
|
||||
RenderEndPortal,net/minecraft/client/renderer/tileentity
|
||||
RenderEnderCrystal,net/minecraft/client/renderer/tileentity
|
||||
RenderItemFrame,net/minecraft/client/renderer/tileentity
|
||||
@@ -496,20 +517,55 @@ TileEntityRendererPiston,net/minecraft/client/renderer/tileentity
|
||||
TileEntitySignRenderer,net/minecraft/client/renderer/tileentity
|
||||
TileEntitySkullRenderer,net/minecraft/client/renderer/tileentity
|
||||
TileEntitySpecialRenderer,net/minecraft/client/renderer/tileentity
|
||||
AbstractResourcePack,net/minecraft/client/resources
|
||||
DefaultResourcePack,net/minecraft/client/resources
|
||||
FallbackResourceManager,net/minecraft/client/resources
|
||||
FileResourcePack,net/minecraft/client/resources
|
||||
FolderResourcePack,net/minecraft/client/resources
|
||||
FolderResourcePackFilter,net/minecraft/client/resources
|
||||
FoliageColorReloadListener,net/minecraft/client/resources
|
||||
GrassColorReloadListener,net/minecraft/client/resources
|
||||
GuiScreenTemporaryResourcePackSelect,net/minecraft/client/resources
|
||||
GuiScreenTemporaryResourcePackSelectSelectionList,net/minecraft/client/resources
|
||||
I18n,net/minecraft/client/resources
|
||||
Language,net/minecraft/client/resources
|
||||
LanguageManager,net/minecraft/client/resources
|
||||
Locale,net/minecraft/client/resources
|
||||
ReloadableResourceManager,net/minecraft/client/resources
|
||||
Resource,net/minecraft/client/resources
|
||||
ResourceLocation,net/minecraft/client/resources
|
||||
ResourceManager,net/minecraft/client/resources
|
||||
ResourceManagerReloadListener,net/minecraft/client/resources
|
||||
ResourcePack,net/minecraft/client/resources
|
||||
ResourcePackFileNotFoundException,net/minecraft/client/resources
|
||||
ResourcePackRepository,net/minecraft/client/resources
|
||||
ResourcePackRepositoryEntry,net/minecraft/client/resources
|
||||
ResourcePackRepositoryFilter,net/minecraft/client/resources
|
||||
SimpleReloadableResourceManager,net/minecraft/client/resources
|
||||
SimpleReloadableResourceManagerINNER1,net/minecraft/client/resources
|
||||
SimpleResource,net/minecraft/client/resources
|
||||
AnimationFrame,net/minecraft/client/resources/data
|
||||
AnimationMetadataSection,net/minecraft/client/resources/data
|
||||
AnimationMetadataSectionSerializer,net/minecraft/client/resources/data
|
||||
BaseMetadataSectionSerializer,net/minecraft/client/resources/data
|
||||
FontMetadataSection,net/minecraft/client/resources/data
|
||||
FontMetadataSectionSerializer,net/minecraft/client/resources/data
|
||||
LanguageMetadataSection,net/minecraft/client/resources/data
|
||||
LanguageMetadataSectionSerializer,net/minecraft/client/resources/data
|
||||
MetadataSection,net/minecraft/client/resources/data
|
||||
MetadataSectionSerializer,net/minecraft/client/resources/data
|
||||
MetadataSerializer,net/minecraft/client/resources/data
|
||||
MetadataSerializerEmptyAnon,net/minecraft/client/resources/data
|
||||
MetadataSerializerRegistration,net/minecraft/client/resources/data
|
||||
PackMetadataSection,net/minecraft/client/resources/data
|
||||
PackMetadataSectionSerializer,net/minecraft/client/resources/data
|
||||
TextureMetadataSection,net/minecraft/client/resources/data
|
||||
TextureMetadataSectionSerializer,net/minecraft/client/resources/data
|
||||
EnumOptions,net/minecraft/client/settings
|
||||
EnumOptionsHelper,net/minecraft/client/settings
|
||||
GameSettings,net/minecraft/client/settings
|
||||
KeyBinding,net/minecraft/client/settings
|
||||
StatPlaceholder,net/minecraft/client/stats
|
||||
GuiTexturePackSlot,net/minecraft/client/texturepacks
|
||||
GuiTexturePacks,net/minecraft/client/texturepacks
|
||||
ITexturePack,net/minecraft/client/texturepacks
|
||||
TexturePackCustom,net/minecraft/client/texturepacks
|
||||
TexturePackDefault,net/minecraft/client/texturepacks
|
||||
TexturePackDownloadSuccess,net/minecraft/client/texturepacks
|
||||
TexturePackFolder,net/minecraft/client/texturepacks
|
||||
TexturePackImplementation,net/minecraft/client/texturepacks
|
||||
TexturePackList,net/minecraft/client/texturepacks
|
||||
CommandBase,net/minecraft/command
|
||||
CommandClearInventory,net/minecraft/command
|
||||
CommandDebug,net/minecraft/command
|
||||
@@ -546,6 +602,8 @@ CommandServerTp,net/minecraft/command
|
||||
CommandServerWhitelist,net/minecraft/command
|
||||
CommandSetSpawnpoint,net/minecraft/command
|
||||
CommandShowSeed,net/minecraft/command
|
||||
CommandSpreadPlayers,net/minecraft/command
|
||||
CommandSpreadPlayersPosition,net/minecraft/command
|
||||
CommandTime,net/minecraft/command
|
||||
CommandToggleDownfall,net/minecraft/command
|
||||
CommandWeather,net/minecraft/command
|
||||
@@ -655,8 +713,12 @@ EntityCreature,net/minecraft/entity
|
||||
EntityEggInfo,net/minecraft/entity
|
||||
EntityFlying,net/minecraft/entity
|
||||
EntityHanging,net/minecraft/entity
|
||||
EntityLeashKnot,net/minecraft/entity
|
||||
EntityList,net/minecraft/entity
|
||||
EntityLiving,net/minecraft/entity
|
||||
EntityLivingBase,net/minecraft/entity
|
||||
EntityLivingData,net/minecraft/entity
|
||||
EntityOwnable,net/minecraft/entity
|
||||
EntitySelectorArmoredMob,net/minecraft/entity
|
||||
EntityTracker,net/minecraft/entity
|
||||
EntityTrackerEntry,net/minecraft/entity
|
||||
@@ -670,6 +732,8 @@ INpc,net/minecraft/entity
|
||||
IProjectile,net/minecraft/entity
|
||||
IRangedAttackMob,net/minecraft/entity
|
||||
NpcMerchant,net/minecraft/entity
|
||||
SharedMonsterAttributes,net/minecraft/entity
|
||||
SpiderEffectsGroupData,net/minecraft/entity
|
||||
WatchableObject,net/minecraft/entity
|
||||
EntityAIArrowAttack,net/minecraft/entity/ai
|
||||
EntityAIAttackOnCollide,net/minecraft/entity/ai
|
||||
@@ -698,6 +762,7 @@ EntityAIMoveThroughVillage,net/minecraft/entity/ai
|
||||
EntityAIMoveTowardsTarget,net/minecraft/entity/ai
|
||||
EntityAIMoveTwardsRestriction,net/minecraft/entity/ai
|
||||
EntityAINearestAttackableTarget,net/minecraft/entity/ai
|
||||
EntityAINearestAttackableTargetSelector,net/minecraft/entity/ai
|
||||
EntityAINearestAttackableTargetSorter,net/minecraft/entity/ai
|
||||
EntityAIOcelotAttack,net/minecraft/entity/ai
|
||||
EntityAIOcelotSit,net/minecraft/entity/ai
|
||||
@@ -708,6 +773,7 @@ EntityAIPanic,net/minecraft/entity/ai
|
||||
EntityAIPlay,net/minecraft/entity/ai
|
||||
EntityAIRestrictOpenDoor,net/minecraft/entity/ai
|
||||
EntityAIRestrictSun,net/minecraft/entity/ai
|
||||
EntityAIRunAroundLikeCrazy,net/minecraft/entity/ai
|
||||
EntityAISit,net/minecraft/entity/ai
|
||||
EntityAISwimming,net/minecraft/entity/ai
|
||||
EntityAITarget,net/minecraft/entity/ai
|
||||
@@ -727,6 +793,16 @@ EntityMinecartMobSpawnerLogic,net/minecraft/entity/ai
|
||||
EntityMoveHelper,net/minecraft/entity/ai
|
||||
EntitySenses,net/minecraft/entity/ai
|
||||
RandomPositionGenerator,net/minecraft/entity/ai
|
||||
Attribute,net/minecraft/entity/ai/attributes
|
||||
AttributeInstance,net/minecraft/entity/ai/attributes
|
||||
AttributeModifier,net/minecraft/entity/ai/attributes
|
||||
BaseAttribute,net/minecraft/entity/ai/attributes
|
||||
BaseAttributeMap,net/minecraft/entity/ai/attributes
|
||||
ClientsideAttributeMap,net/minecraft/entity/ai/attributes
|
||||
ModifiableAttributeInstance,net/minecraft/entity/ai/attributes
|
||||
RangedAttribute,net/minecraft/entity/ai/attributes
|
||||
ReadonlyAttributeInstance,net/minecraft/entity/ai/attributes
|
||||
ServersideAttributeMap,net/minecraft/entity/ai/attributes
|
||||
BossStatus,net/minecraft/entity/boss
|
||||
EntityDragon,net/minecraft/entity/boss
|
||||
EntityDragonPart,net/minecraft/entity/boss
|
||||
@@ -781,6 +857,9 @@ EntityAnimal,net/minecraft/entity/passive
|
||||
EntityBat,net/minecraft/entity/passive
|
||||
EntityChicken,net/minecraft/entity/passive
|
||||
EntityCow,net/minecraft/entity/passive
|
||||
EntityHorse,net/minecraft/entity/passive
|
||||
EntityHorseBredSelector,net/minecraft/entity/passive
|
||||
EntityHorseGroupData,net/minecraft/entity/passive
|
||||
EntityMooshroom,net/minecraft/entity/passive
|
||||
EntityOcelot,net/minecraft/entity/passive
|
||||
EntityPig,net/minecraft/entity/passive
|
||||
@@ -818,6 +897,8 @@ ContainerHopper,net/minecraft/inventory
|
||||
ContainerMerchant,net/minecraft/inventory
|
||||
ContainerPlayer,net/minecraft/inventory
|
||||
ContainerRepair,net/minecraft/inventory
|
||||
ContainerRepairINNER1,net/minecraft/inventory
|
||||
ContainerRepairINNER2,net/minecraft/inventory
|
||||
ContainerWorkbench,net/minecraft/inventory
|
||||
ICrafting,net/minecraft/inventory
|
||||
IInvBasic,net/minecraft/inventory
|
||||
@@ -829,7 +910,6 @@ InventoryCrafting,net/minecraft/inventory
|
||||
InventoryEnderChest,net/minecraft/inventory
|
||||
InventoryLargeChest,net/minecraft/inventory
|
||||
InventoryMerchant,net/minecraft/inventory
|
||||
InventoryRepair,net/minecraft/inventory
|
||||
Slot,net/minecraft/inventory
|
||||
SlotArmor,net/minecraft/inventory
|
||||
SlotBeacon,net/minecraft/inventory
|
||||
@@ -840,7 +920,10 @@ SlotEnchantment,net/minecraft/inventory
|
||||
SlotEnchantmentTable,net/minecraft/inventory
|
||||
SlotFurnace,net/minecraft/inventory
|
||||
SlotMerchantResult,net/minecraft/inventory
|
||||
SlotRepair,net/minecraft/inventory
|
||||
AnimalChest,net/minecraft/inventroy
|
||||
ContainerHorseInventory,net/minecraft/inventroy
|
||||
ContainerHorseInventorySlotArmor,net/minecraft/inventroy
|
||||
ContainerHorseInventorySlotSaddle,net/minecraft/inventroy
|
||||
BehaviorDispenseArmor,net/minecraft/item
|
||||
BehaviorDispenseMinecart,net/minecraft/item
|
||||
EnumAction,net/minecraft/item
|
||||
@@ -883,6 +966,7 @@ ItemGlassBottle,net/minecraft/item
|
||||
ItemHangingEntity,net/minecraft/item
|
||||
ItemHoe,net/minecraft/item
|
||||
ItemInWorldManager,net/minecraft/item
|
||||
ItemLeash,net/minecraft/item
|
||||
ItemLeaves,net/minecraft/item
|
||||
ItemLilyPad,net/minecraft/item
|
||||
ItemMap,net/minecraft/item
|
||||
@@ -890,6 +974,7 @@ ItemMapBase,net/minecraft/item
|
||||
ItemMinecart,net/minecraft/item
|
||||
ItemMonsterPlacer,net/minecraft/item
|
||||
ItemMultiTextureTile,net/minecraft/item
|
||||
ItemNameTag,net/minecraft/item
|
||||
ItemPickaxe,net/minecraft/item
|
||||
ItemPiston,net/minecraft/item
|
||||
ItemPotion,net/minecraft/item
|
||||
@@ -931,7 +1016,7 @@ ShapedRecipes,net/minecraft/item/crafting
|
||||
ShapelessRecipes,net/minecraft/item/crafting
|
||||
ILogAgent,net/minecraft/logging
|
||||
LogAgent,net/minecraft/logging
|
||||
LogAgentINNER1,net/minecraft/logging
|
||||
LogAgentEmptyAnon,net/minecraft/logging
|
||||
LogFormatter,net/minecraft/logging
|
||||
CallableTagCompound1,net/minecraft/nbt
|
||||
CallableTagCompound2,net/minecraft/nbt
|
||||
@@ -949,6 +1034,7 @@ NBTTagList,net/minecraft/nbt
|
||||
NBTTagLong,net/minecraft/nbt
|
||||
NBTTagShort,net/minecraft/nbt
|
||||
NBTTagString,net/minecraft/nbt
|
||||
CallableConnectionName,net/minecraft/network
|
||||
CallablePacketClass,net/minecraft/network
|
||||
CallablePacketID,net/minecraft/network
|
||||
INetworkManager,net/minecraft/network
|
||||
@@ -1009,6 +1095,7 @@ Packet254ServerPing,net/minecraft/network/packet
|
||||
Packet255KickDisconnect,net/minecraft/network/packet
|
||||
Packet25EntityPainting,net/minecraft/network/packet
|
||||
Packet26EntityExpOrb,net/minecraft/network/packet
|
||||
Packet27PlayerInput,net/minecraft/network/packet
|
||||
Packet28EntityVelocity,net/minecraft/network/packet
|
||||
Packet29DestroyEntity,net/minecraft/network/packet
|
||||
Packet2ClientProtocol,net/minecraft/network/packet
|
||||
@@ -1025,6 +1112,7 @@ Packet40EntityMetadata,net/minecraft/network/packet
|
||||
Packet41EntityEffect,net/minecraft/network/packet
|
||||
Packet42RemoveEntityEffect,net/minecraft/network/packet
|
||||
Packet43Experience,net/minecraft/network/packet
|
||||
Packet44UpdateAttributes,net/minecraft/network/packet
|
||||
Packet4UpdateTime,net/minecraft/network/packet
|
||||
Packet51MapChunk,net/minecraft/network/packet
|
||||
Packet51MapChunkData,net/minecraft/network/packet
|
||||
@@ -1060,8 +1148,11 @@ PathFinder,net/minecraft/pathfinding
|
||||
PathNavigate,net/minecraft/pathfinding
|
||||
PathPoint,net/minecraft/pathfinding
|
||||
Potion,net/minecraft/potion
|
||||
PotionAbsoption,net/minecraft/potion
|
||||
PotionAttackDamage,net/minecraft/potion
|
||||
PotionEffect,net/minecraft/potion
|
||||
PotionHealth,net/minecraft/potion
|
||||
PotionHealthBoost,net/minecraft/potion
|
||||
PotionHelper,net/minecraft/potion
|
||||
IPlayerUsage,net/minecraft/profiler
|
||||
PlayerUsageSnooper,net/minecraft/profiler
|
||||
@@ -1095,16 +1186,16 @@ DedicatedServerCommandThread,net/minecraft/server/dedicated
|
||||
DedicatedServerListenThread,net/minecraft/server/dedicated
|
||||
DedicatedServerSleepThread,net/minecraft/server/dedicated
|
||||
PropertyManager,net/minecraft/server/dedicated
|
||||
GuiLogFormatter,net/minecraft/server/gui
|
||||
GuiLogOutputHandler,net/minecraft/server/gui
|
||||
GuiStatsComponent,net/minecraft/server/gui
|
||||
GuiStatsListener,net/minecraft/server/gui
|
||||
IUpdatePlayerListBox,net/minecraft/server/gui
|
||||
PlayerListBox,net/minecraft/server/gui
|
||||
ServerGUI,net/minecraft/server/gui
|
||||
ServerGuiCommandListener,net/minecraft/server/gui
|
||||
ServerGuiFocusAdapter,net/minecraft/server/gui
|
||||
ServerWindowAdapter,net/minecraft/server/gui
|
||||
MinecraftServerGui,net/minecraft/server/gui
|
||||
MinecraftServerGuiINNER1,net/minecraft/server/gui
|
||||
MinecraftServerGuiINNER2,net/minecraft/server/gui
|
||||
MinecraftServerGuiINNER3,net/minecraft/server/gui
|
||||
PlayerListComponent,net/minecraft/server/gui
|
||||
StatsComponent,net/minecraft/server/gui
|
||||
StatsComponentINNER1,net/minecraft/server/gui
|
||||
TextAreaLogHandler,net/minecraft/server/gui
|
||||
TextAreaLogHandlerINNER1,net/minecraft/server/gui
|
||||
CallableIsModded,net/minecraft/server/integrated
|
||||
CallableType3,net/minecraft/server/integrated
|
||||
IntegratedPlayerList,net/minecraft/server/integrated
|
||||
@@ -1128,6 +1219,7 @@ StatCrafting,net/minecraft/stats
|
||||
StatFileWriter,net/minecraft/stats
|
||||
StatList,net/minecraft/stats
|
||||
StatTypeDistance,net/minecraft/stats
|
||||
StatTypeFloat,net/minecraft/stats
|
||||
StatTypeSimple,net/minecraft/stats
|
||||
StatTypeTime,net/minecraft/stats
|
||||
StatsSyncher,net/minecraft/stats
|
||||
@@ -1164,6 +1256,7 @@ AABBLocalPool,net/minecraft/util
|
||||
AABBPool,net/minecraft/util
|
||||
AxisAlignedBB,net/minecraft/util
|
||||
ChatAllowedCharacters,net/minecraft/util
|
||||
ChatMessageComponent,net/minecraft/util
|
||||
ChunkCoordinates,net/minecraft/util
|
||||
CombatEntry,net/minecraft/util
|
||||
CombatTracker,net/minecraft/util
|
||||
@@ -1181,8 +1274,6 @@ EnumOS,net/minecraft/util
|
||||
Facing,net/minecraft/util
|
||||
FoodStats,net/minecraft/util
|
||||
HttpUtil,net/minecraft/util
|
||||
HttpUtilRunnable,net/minecraft/util
|
||||
IDownloadSuccess,net/minecraft/util
|
||||
IProgressUpdate,net/minecraft/util
|
||||
Icon,net/minecraft/util
|
||||
IntHashMap,net/minecraft/util
|
||||
@@ -1191,6 +1282,7 @@ LongHashMap,net/minecraft/util
|
||||
LongHashMapEntry,net/minecraft/util
|
||||
MD5String,net/minecraft/util
|
||||
MathHelper,net/minecraft/util
|
||||
MessageComponentSerializer,net/minecraft/util
|
||||
MinecraftError,net/minecraft/util
|
||||
MouseFilter,net/minecraft/util
|
||||
MouseHelper,net/minecraft/util
|
||||
@@ -1203,9 +1295,9 @@ Session,net/minecraft/util
|
||||
StatCollector,net/minecraft/util
|
||||
StringTranslate,net/minecraft/util
|
||||
StringUtils,net/minecraft/util
|
||||
ThreadDownloadResources,net/minecraft/util
|
||||
Timer,net/minecraft/util
|
||||
Tuple,net/minecraft/util
|
||||
Util,net/minecraft/util
|
||||
ValueObject,net/minecraft/util
|
||||
Vec3,net/minecraft/util
|
||||
Vec3Pool,net/minecraft/util
|
||||
|
||||
|
+209
-86
@@ -1,12 +1,162 @@
|
||||
param,name,side
|
||||
p_100001_0_,par0,2
|
||||
p_100003_1_,par1,2
|
||||
p_100006_1_,par1Str,2
|
||||
p_100006_2_,par2Str,2
|
||||
p_100009_0_,par0,2
|
||||
p_100012_1_,par1,2
|
||||
p_100014_0_,par0McoServerList,2
|
||||
p_100015_0_,par0KeyBinding,2
|
||||
p_101000_0_,par0GuiScreenOnlineServers,2
|
||||
p_101001_1_,par1,2
|
||||
p_101001_2_,par2,2
|
||||
p_101001_3_,par3,2
|
||||
p_101001_4_,par4,2
|
||||
p_101006_1_,par1,2
|
||||
p_101006_2_,par2,2
|
||||
p_101006_3_,par3,2
|
||||
p_101006_4_,par4,2
|
||||
p_101008_1_,par1,2
|
||||
p_101008_2_,par2,2
|
||||
p_101008_3_,par3,2
|
||||
p_101008_4_,par4,2
|
||||
p_101009_0_,par0GuiScreenOnlineServers,2
|
||||
p_101009_1_,par1,2
|
||||
p_101009_2_,par2,2
|
||||
p_101009_3_,par3,2
|
||||
p_101009_4_,par4,2
|
||||
p_101012_0_,par0GuiScreenOnlineServers,2
|
||||
p_101012_1_,par1,2
|
||||
p_101012_2_,par2,2
|
||||
p_101012_3_,par3,2
|
||||
p_101012_4_,par4,2
|
||||
p_101015_1_,par1Str,2
|
||||
p_101018_1_,par1List,2
|
||||
p_102007_1_,par1,2
|
||||
p_102007_2_,par2ItemStack,2
|
||||
p_102007_3_,par3,2
|
||||
p_102008_1_,par1,2
|
||||
p_102008_2_,par2ItemStack,2
|
||||
p_102008_3_,par3,2
|
||||
p_102012_0_,par0Hopper,2
|
||||
p_102012_1_,par1IInventory,2
|
||||
p_102012_2_,par2,2
|
||||
p_102012_3_,par3,2
|
||||
p_102013_0_,par0IInventory,2
|
||||
p_102013_1_,par1ItemStack,2
|
||||
p_102013_2_,par2,2
|
||||
p_102013_3_,par3,2
|
||||
p_102014_0_,par0IInventory,2
|
||||
p_102014_1_,par1ItemStack,2
|
||||
p_102014_2_,par2,2
|
||||
p_102014_3_,par3,2
|
||||
p_102015_0_,par0IInventory,2
|
||||
p_102015_1_,par1ItemStack,2
|
||||
p_102015_2_,par2,2
|
||||
p_102015_3_,par3,2
|
||||
p_102018_1_,par1,2
|
||||
p_102021_1_,par1List,2
|
||||
p_102021_2_,par2,2
|
||||
p_102021_3_,par3,2
|
||||
p_102023_1_,par1McoServer,2
|
||||
p_102023_2_,par2McoServer,2
|
||||
p_102026_1_,par1Block,2
|
||||
p_102026_2_,par2,2
|
||||
p_102027_1_,par1Block,2
|
||||
p_102027_2_,par2,2
|
||||
p_102027_3_,par3,2
|
||||
p_102027_4_,par4,2
|
||||
p_102027_5_,par5,2
|
||||
p_102027_6_,par6,2
|
||||
p_102027_7_,par7,2
|
||||
p_104004_0_,par0GuiMainMenu,2
|
||||
p_104005_0_,par0GuiMainMenu,2
|
||||
p_104005_1_,par1Str,2
|
||||
p_104006_0_,par0GuiMainMenu,2
|
||||
p_104006_1_,par1,2
|
||||
p_104007_0_,par0GuiMainMenu,2
|
||||
p_104008_0_,par0GuiMainMenu,2
|
||||
p_104008_1_,par1,2
|
||||
p_104009_0_,par0GuiMainMenu,2
|
||||
p_104009_1_,par1,2
|
||||
p_104010_0_,par0,2
|
||||
p_104011_0_,par0GuiMainMenu,2
|
||||
p_104011_1_,par1,2
|
||||
p_104012_0_,par0GuiMainMenu,2
|
||||
p_104012_1_,par1,2
|
||||
p_104013_0_,par0GuiMainMenu,2
|
||||
p_104013_1_,par1Str,2
|
||||
p_104014_0_,par0GuiMainMenu,2
|
||||
p_104014_1_,par1,2
|
||||
p_104015_0_,par0GuiMainMenu,2
|
||||
p_104016_0_,par0GuiMainMenu,2
|
||||
p_104017_0_,par0GuiMainMenu,2
|
||||
p_104018_0_,par0GuiMainMenu,2
|
||||
p_104019_0_,par0GuiMainMenu,2
|
||||
p_104020_0_,par0GuiMainMenu,2
|
||||
p_104021_0_,par0GuiMainMenu,2
|
||||
p_104021_1_,par1StringTranslate,2
|
||||
p_104021_2_,par2,2
|
||||
p_104021_3_,par3,2
|
||||
p_104022_0_,par0GuiMainMenu,2
|
||||
p_104023_0_,par0GuiMainMenu,2
|
||||
p_104026_0_,par0GuiScreenOnlineServers,2
|
||||
p_104026_1_,par1Str,2
|
||||
p_104027_0_,par0GuiScreenOnlineServers,2
|
||||
p_104028_0_,par0GuiScreenOnlineServers,2
|
||||
p_104029_0_,par0GuiScreenOnlineServers,2
|
||||
p_104030_0_,par0GuiScreenOnlineServers,2
|
||||
p_104030_1_,par1,2
|
||||
p_104030_2_,par2,2
|
||||
p_104030_3_,par3,2
|
||||
p_104030_4_,par4,2
|
||||
p_104030_5_,par5,2
|
||||
p_104031_0_,par0GuiScreenOnlineServers,2
|
||||
p_104031_1_,par1,2
|
||||
p_104031_2_,par2,2
|
||||
p_104031_3_,par3,2
|
||||
p_104031_4_,par4,2
|
||||
p_104032_0_,par0GuiScreenOnlineServers,2
|
||||
p_104033_0_,par0GuiScreenOnlineServers,2
|
||||
p_104034_0_,par0GuiScreenOnlineServers,2
|
||||
p_104034_1_,par1McoServer,2
|
||||
p_104036_0_,par0GuiScreenOnlineServers,2
|
||||
p_104038_0_,par0GuiScreenOnlineServers,2
|
||||
p_104039_1_,par1,2
|
||||
p_104039_2_,par2,2
|
||||
p_104039_3_,par3,2
|
||||
p_104039_4_,par4,2
|
||||
p_104039_5_,par5,2
|
||||
p_104040_0_,par0GuiScreenOnlineServers,2
|
||||
p_104043_0_,par0GuiScreenOnlineServers,2
|
||||
p_104047_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_104048_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_104055_1_,par1,2
|
||||
p_104062_1_,par1,2
|
||||
p_104062_2_,par2,2
|
||||
p_104062_3_,par3Texture,2
|
||||
p_104064_0_,par0Str,2
|
||||
p_104064_1_,par1Str,2
|
||||
p_104064_2_,par2,2
|
||||
p_104064_3_,par3,2
|
||||
p_104069_1_,par1GuiButton,2
|
||||
p_104071_1_,par1GuiScreen,2
|
||||
p_104071_2_,par2FontRenderer,2
|
||||
p_104083_1_,par1,2
|
||||
p_104083_2_,par2,2
|
||||
p_104083_3_,par3,2
|
||||
p_104083_4_,par4,2
|
||||
p_104084_1_,par1,2
|
||||
p_104084_2_,par2,2
|
||||
p_104084_3_,par3,2
|
||||
p_104084_4_,par4,2
|
||||
p_104086_1_,par1,2
|
||||
p_104087_1_,par1,2
|
||||
p_104087_2_,par2,2
|
||||
p_104088_1_,par1,2
|
||||
p_104088_2_,par2,2
|
||||
p_104088_3_,par3Tessellator,2
|
||||
p_104089_1_,par1,2
|
||||
p_104089_2_,par2,2
|
||||
p_104145_0_,par0URL,2
|
||||
p_70000_1_,par1PlayerUsageSnooper,2
|
||||
p_70001_1_,par1PlayerUsageSnooper,2
|
||||
p_70003_1_,par1,2
|
||||
@@ -650,7 +800,6 @@ p_71754_2_,par2Str,2
|
||||
p_71761_1_,par1InetAddress,2
|
||||
p_71764_1_,par1NetLoginHandler,2
|
||||
p_71769_1_,par1InetAddress,2
|
||||
p_71770_0_,par0InetAddress,2
|
||||
p_71789_1_,par1,2
|
||||
p_71790_1_,par1ArrayOfByte,2
|
||||
p_71790_2_,par2,2
|
||||
@@ -7221,12 +7370,9 @@ p_94103_1_,par1,2
|
||||
p_94107_1_,par1,2
|
||||
p_94114_1_,par1ItemStack,2
|
||||
p_94114_2_,par2ItemStack,2
|
||||
p_94115_1_,par1IInventory,2
|
||||
p_94115_2_,par2,2
|
||||
p_94117_1_,par1IInventory,2
|
||||
p_94117_2_,par2ItemStack,2
|
||||
p_94117_3_,par3,2
|
||||
p_94127_1_,par1,2
|
||||
p_94128_1_,par1,2
|
||||
p_94129_1_,par1Str,2
|
||||
p_94131_1_,par1Str,2
|
||||
@@ -7590,31 +7736,11 @@ p_96161_0_,par0GuiScreenOnlineServers,2
|
||||
p_96165_1_,par1Str,2
|
||||
p_96165_2_,par2,2
|
||||
p_96165_3_,par3,2
|
||||
p_96168_1_,par1,2
|
||||
p_96168_2_,par2,2
|
||||
p_96174_1_,par1McoServer,2
|
||||
p_96175_1_,par1,2
|
||||
p_96175_2_,par2,2
|
||||
p_96177_0_,par0GuiScreenOnlineServers,2
|
||||
p_96179_0_,par0GuiScreenOnlineServers,2
|
||||
p_96179_1_,par1McoServer,2
|
||||
p_96182_0_,par0GuiScreenOnlineServers,2
|
||||
p_96209_1_,par1Str,2
|
||||
p_96210_1_,par1Str,2
|
||||
p_96230_0_,par0GuiScreenSelectLocation,2
|
||||
p_96231_0_,par0GuiScreenSelectLocation,2
|
||||
p_96232_0_,par0GuiScreenSelectLocation,2
|
||||
p_96233_0_,par0GuiScreenSelectLocation,2
|
||||
p_96234_0_,par0GuiScreenSelectLocation,2
|
||||
p_96234_1_,par1Location,2
|
||||
p_96235_0_,par0GuiScreenSelectLocation,2
|
||||
p_96236_0_,par0GuiScreenSelectLocation,2
|
||||
p_96246_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_96247_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_96248_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_96251_1_,par1Location,2
|
||||
p_96251_2_,par2Str,2
|
||||
p_96251_3_,par3Str,2
|
||||
p_96263_0_,par0GuiScreenConfigureWorld,2
|
||||
p_96264_1_,par1,2
|
||||
p_96265_0_,par0GuiScreenConfigureWorld,2
|
||||
@@ -7703,6 +7829,7 @@ p_96363_0_,par0Str,2
|
||||
p_96363_1_,par1Str,2
|
||||
p_96374_1_,par1,2
|
||||
p_96376_1_,par1,2
|
||||
p_96376_3_,par3Str,2
|
||||
p_96377_1_,par1Request,2
|
||||
p_96378_1_,par1,2
|
||||
p_96380_1_,par1Str,2
|
||||
@@ -7712,9 +7839,12 @@ p_96383_1_,par1,2
|
||||
p_96384_1_,par1,2
|
||||
p_96384_3_,par3Str,2
|
||||
p_96384_4_,par4Str,2
|
||||
p_96384_5_,par5,2
|
||||
p_96384_6_,par6,2
|
||||
p_96386_1_,par1Str,2
|
||||
p_96386_2_,par2Str,2
|
||||
p_96386_3_,par3Str,2
|
||||
p_96386_4_,par4Str,2
|
||||
p_96387_1_,par1,2
|
||||
p_96387_3_,par3Str,2
|
||||
p_96394_0_,par0Field,2
|
||||
@@ -7901,57 +8031,25 @@ p_98046_1_,par1,2
|
||||
p_98053_1_,par1,2
|
||||
p_98054_1_,par1,2
|
||||
p_98055_1_,par1,2
|
||||
p_98058_0_,par0GuiMainMenu,2
|
||||
p_98059_0_,par0,2
|
||||
p_98060_1_,par1StringTranslate,2
|
||||
p_98060_2_,par2,2
|
||||
p_98060_3_,par3,2
|
||||
p_98061_0_,par0GuiMainMenu,2
|
||||
p_98061_1_,par1StringTranslate,2
|
||||
p_98061_2_,par2,2
|
||||
p_98061_3_,par3,2
|
||||
p_98062_1_,par1,2
|
||||
p_98063_1_,par1,2
|
||||
p_98070_0_,par0GuiScreenOnlineServers,2
|
||||
p_98070_1_,par1,2
|
||||
p_98070_2_,par2,2
|
||||
p_98071_0_,par0GuiScreenOnlineServers,2
|
||||
p_98072_0_,par0GuiScreenOnlineServers,2
|
||||
p_98074_0_,par0GuiScreenOnlineServers,2
|
||||
p_98075_0_,par0GuiScreenOnlineServers,2
|
||||
p_98076_0_,par0GuiScreenOnlineServers,2
|
||||
p_98077_0_,par0GuiScreenOnlineServers,2
|
||||
p_98077_1_,par1,2
|
||||
p_98077_2_,par2,2
|
||||
p_98078_0_,par0GuiScreenOnlineServers,2
|
||||
p_98078_1_,par1,2
|
||||
p_98079_0_,par0GuiScreenOnlineServers,2
|
||||
p_98081_0_,par0GuiScreenOnlineServers,2
|
||||
p_98081_1_,par1,2
|
||||
p_98083_0_,par0GuiScreenOnlineServers,2
|
||||
p_98083_1_,par1,2
|
||||
p_98083_2_,par2,2
|
||||
p_98084_0_,par0GuiScreenOnlineServers,2
|
||||
p_98085_0_,par0GuiScreenOnlineServers,2
|
||||
p_98085_1_,par1Str,2
|
||||
p_98086_1_,par1,2
|
||||
p_98087_0_,par0GuiScreenOnlineServers,2
|
||||
p_98088_1_,par1,2
|
||||
p_98088_2_,par2,2
|
||||
p_98089_0_,par0GuiScreenOnlineServers,2
|
||||
p_98089_1_,par1,2
|
||||
p_98091_0_,par0GuiScreenOnlineServers,2
|
||||
p_98092_0_,par0GuiScreenOnlineServers,2
|
||||
p_98094_0_,par0GuiScreenOnlineServers,2
|
||||
p_98096_0_,par0GuiConnecting,2
|
||||
p_98097_0_,par0GuiConnecting,2
|
||||
p_98099_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_98100_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_98100_1_,par1Location,2
|
||||
p_98101_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_98102_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_98102_1_,par1List,2
|
||||
p_98103_0_,par0GuiScreenCreateOnlineWorld,2
|
||||
p_98137_1_,par1Str,2
|
||||
p_98137_2_,par2,2
|
||||
p_98138_1_,par1Str,2
|
||||
@@ -7979,12 +8077,8 @@ p_98162_0_,par0Str,2
|
||||
p_98163_0_,par0JsonNode,2
|
||||
p_98164_0_,par0List,2
|
||||
p_98165_0_,par0Str,2
|
||||
p_98167_0_,par0JsonNode,2
|
||||
p_98168_0_,par0JsonNode,2
|
||||
p_98168_1_,par1Str,2
|
||||
p_98169_0_,par0Str,2
|
||||
p_98172_0_,par0TaskOnlineConnect,2
|
||||
p_98174_0_,par0Str,2
|
||||
p_98176_1_,par1,2
|
||||
p_98177_1_,par1,2
|
||||
p_98179_1_,par1,2
|
||||
@@ -8079,11 +8173,9 @@ p_i10003_1_,par1,2
|
||||
p_i10003_2_,par2,2
|
||||
p_i10004_1_,par1,2
|
||||
p_i10004_2_,par2,2
|
||||
p_i10005_1_,par1,2
|
||||
p_i10005_2_,par2,2
|
||||
p_i10005_1_,par1ScorePlayerTeam,2
|
||||
p_i10005_2_,par2Collection,2
|
||||
p_i10005_3_,par3,2
|
||||
p_i10005_4_,par4Str,2
|
||||
p_i10005_5_,par5Str,2
|
||||
p_i10006_1_,par1,2
|
||||
p_i10006_2_,par2,2
|
||||
p_i10007_1_,par1,2
|
||||
@@ -8093,8 +8185,6 @@ p_i10008_3_,par3TaskLongRunning,2
|
||||
p_i10009_1_,par1GuiSlotOnlineServerList,2
|
||||
p_i10009_2_,par2McoServer,2
|
||||
p_i10010_1_,par1GuiScreen,2
|
||||
p_i10011_1_,par1GuiScreenResetWorld,2
|
||||
p_i10011_2_,par2,2
|
||||
p_i10012_1_,par1Minecraft,2
|
||||
p_i10012_2_,par2,2
|
||||
p_i10012_3_,par3,2
|
||||
@@ -8106,13 +8196,6 @@ p_i10013_2_,par2GuiScreen,2
|
||||
p_i10013_3_,par3McoServer,2
|
||||
p_i10014_1_,par1GuiScreen,2
|
||||
p_i10014_2_,par2McoServer,2
|
||||
p_i10015_1_,par1GuiScreen,2
|
||||
p_i10015_2_,par2GuiScreen,2
|
||||
p_i10015_3_,par3McoServer,2
|
||||
p_i10017_1_,par1GuiScreenCreateOnlineWorld,2
|
||||
p_i10017_2_,par2Str,2
|
||||
p_i10017_3_,par3Str,2
|
||||
p_i10017_4_,par4Str,2
|
||||
p_i10018_1_,par1TaskOnlineConnect,2
|
||||
p_i10018_2_,par2Str,2
|
||||
p_i10018_3_,par3,2
|
||||
@@ -8214,7 +8297,6 @@ p_i11007_1_,par1GuiScreen,2
|
||||
p_i11007_2_,par2Str,2
|
||||
p_i11007_3_,par3Str,2
|
||||
p_i11007_4_,par4ArrayOfObj,2
|
||||
p_i11008_1_,par1GuiScreenCreateOnlineWorld,2
|
||||
p_i11011_1_,par1GuiScreenOnlineServers,2
|
||||
p_i11012_1_,par1Minecraft,2
|
||||
p_i11012_2_,par2Str,2
|
||||
@@ -8346,6 +8428,57 @@ p_i11045_1_,par1Str,2
|
||||
p_i11046_1_,par1TileEntityMobSpawner,2
|
||||
p_i20000_1_,par1Session,2
|
||||
p_i20001_1_,par1Session,2
|
||||
p_i22000_1_,par1TimerTaskMcoServerListUpdate,2
|
||||
p_i22000_2_,par2Str,2
|
||||
p_i22001_1_,par1TimerTaskMcoServerListUpdate,2
|
||||
p_i22001_2_,par2Str,2
|
||||
p_i22001_3_,par3McoServerListINNER1,2
|
||||
p_i22002_1_,par1GuiScreen,2
|
||||
p_i22002_2_,par2GuiScreenConfigureWorld,2
|
||||
p_i22002_3_,par3McoServer,2
|
||||
p_i22003_1_,par1EntityLiving,2
|
||||
p_i22003_2_,par2PotionEffect,2
|
||||
p_i22004_1_,par1EntityLiving,2
|
||||
p_i22004_2_,par2PotionEffect,2
|
||||
p_i22005_1_,par1EntityLiving,2
|
||||
p_i22005_2_,par2PotionEffect,2
|
||||
p_i22006_1_,par1EntityLiving,2
|
||||
p_i22006_2_,par2PotionEffect,2
|
||||
p_i22007_1_,par1EntityLiving,2
|
||||
p_i22007_2_,par2PotionEffect,2
|
||||
p_i22008_1_,par1EntityLiving,2
|
||||
p_i22008_2_,par2PotionEffect,2
|
||||
p_i22009_1_,par1World,2
|
||||
p_i22009_2_,par2,2
|
||||
p_i22009_3_,par3,2
|
||||
p_i22009_4_,par4,2
|
||||
p_i22009_5_,par5,2
|
||||
p_i22009_6_,par6,2
|
||||
p_i22009_7_,par7,2
|
||||
p_i22009_8_,par8,2
|
||||
p_i23000_1_,par1,2
|
||||
p_i23000_2_,par2,2
|
||||
p_i23000_3_,par3,2
|
||||
p_i23000_4_,par4,2
|
||||
p_i23001_1_,par1Minecraft,2
|
||||
p_i23001_2_,par2,2
|
||||
p_i23001_3_,par3,2
|
||||
p_i23001_4_,par4,2
|
||||
p_i23001_5_,par5,2
|
||||
p_i23001_6_,par6,2
|
||||
p_i23002_1_,par1GuiScreenResetWorld,2
|
||||
p_i23002_2_,par2,2
|
||||
p_i23002_4_,par4Str,2
|
||||
p_i23003_1_,par1GuiScreenCreateOnlineWorld,2
|
||||
p_i23003_2_,par2Str,2
|
||||
p_i23003_3_,par3Str,2
|
||||
p_i23003_4_,par4Str,2
|
||||
p_i23003_5_,par5Str,2
|
||||
p_i23004_1_,par1GuiScreen,2
|
||||
p_i23004_2_,par2Str,2
|
||||
p_i23004_3_,par3,2
|
||||
p_i23004_4_,par4,2
|
||||
p_i23005_1_,par1GuiMainMenu,2
|
||||
p_i3000_1_,par1File,2
|
||||
p_i3000_2_,par2Minecraft,2
|
||||
p_i3001_1_,par1Map,2
|
||||
@@ -8551,9 +8684,6 @@ p_i3101_1_,par1Minecraft,2
|
||||
p_i3101_2_,par2World,2
|
||||
p_i3101_3_,par3Session,2
|
||||
p_i3101_4_,par4NetClientHandler,2
|
||||
p_i3102_1_,par1GuiScreen,2
|
||||
p_i3102_2_,par2Str,2
|
||||
p_i3102_3_,par3,2
|
||||
p_i3103_1_,par1Minecraft,2
|
||||
p_i3103_2_,par2Str,2
|
||||
p_i3103_3_,par3,2
|
||||
@@ -9976,13 +10106,6 @@ p_i3738_3_,par3,2
|
||||
p_i3739_1_,par1Str,2
|
||||
p_i3739_2_,par2,2
|
||||
p_i3739_3_,par3,2
|
||||
p_i3740_1_,par1World,2
|
||||
p_i3740_2_,par2,2
|
||||
p_i3740_3_,par3,2
|
||||
p_i3740_4_,par4,2
|
||||
p_i3740_5_,par5,2
|
||||
p_i3740_6_,par6,2
|
||||
p_i3740_7_,par7,2
|
||||
p_i3741_1_,par1,2
|
||||
p_i3741_2_,par2,2
|
||||
p_i3741_3_,par3,2
|
||||
|
||||
|
Loaded 100 of 163 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user