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 |
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;
|
||||
@@ -171,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");
|
||||
@@ -197,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;
|
||||
}
|
||||
@@ -237,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());
|
||||
}
|
||||
}
|
||||
@@ -528,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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
@@ -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()
|
||||
@@ -679,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");
|
||||
}
|
||||
|
||||
@@ -726,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)
|
||||
{
|
||||
@@ -739,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()
|
||||
@@ -784,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)
|
||||
@@ -801,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)
|
||||
{
|
||||
@@ -810,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();
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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")
|
||||
@@ -163,7 +166,7 @@ public class AccessTransformer implements IClassTransformer
|
||||
|
||||
if (DEBUG)
|
||||
{
|
||||
System.out.printf("Considering all methods and fields on %s (%s): %b\n", name, transformedName, makeAllPublic);
|
||||
FMLRelaunchLog.fine("Considering all methods and fields on %s (%s): %b\n", name, transformedName, makeAllPublic);
|
||||
}
|
||||
if (!makeAllPublic && !modifiers.containsKey(name)) { return bytes; }
|
||||
|
||||
|
||||
@@ -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,9 +24,12 @@ 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;
|
||||
|
||||
@@ -38,7 +42,9 @@ 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;
|
||||
@@ -48,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();
|
||||
@@ -62,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()
|
||||
{
|
||||
@@ -70,17 +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);
|
||||
mapData = mapData.getCanonicalFile();
|
||||
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();
|
||||
@@ -125,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)
|
||||
@@ -141,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)
|
||||
@@ -180,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
|
||||
@@ -319,4 +410,9 @@ public class FMLDeobfuscatingRemapper extends Remapper {
|
||||
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())
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
+21
-21
@@ -37,11 +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>();
|
||||
@@ -50,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");
|
||||
@@ -72,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)
|
||||
{
|
||||
@@ -107,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();
|
||||
@@ -123,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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -133,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
|
||||
@@ -149,6 +147,7 @@ public class RelaunchLibraryManager
|
||||
return;
|
||||
}
|
||||
|
||||
libraries = new ArrayList<ILibrarySet>();
|
||||
for (ILibrarySet lib : libraries)
|
||||
{
|
||||
for (int i=0; i<lib.getLibraries().length; i++)
|
||||
@@ -213,7 +212,7 @@ public class RelaunchLibraryManager
|
||||
|
||||
try
|
||||
{
|
||||
actualClassLoader.addURL(libFile.toURI().toURL());
|
||||
classLoader.addURL(libFile.toURI().toURL());
|
||||
loadedLibraries.add(libName);
|
||||
}
|
||||
catch (MalformedURLException e)
|
||||
@@ -268,14 +267,15 @@ 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>();
|
||||
@@ -292,10 +292,10 @@ 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("mcLocation", mcDir);
|
||||
callData.put("classLoader", actualClassLoader);
|
||||
callData.put("classLoader", classLoader);
|
||||
callData.put("coremodLocation", pluginLocations.get(plugin));
|
||||
callData.put("deobfuscationFileName", FMLInjectionData.debfuscationDataName());
|
||||
call.injectData(callData);
|
||||
@@ -317,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");
|
||||
@@ -333,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);
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -113,7 +117,7 @@ public class FMLRelaunchLog
|
||||
// Are we longer than just the line separator?
|
||||
int lastIdx = -1;
|
||||
int idx = currentMessage.indexOf("\n",lastIdx+1);
|
||||
while (idx > 0)
|
||||
while (idx >= 0)
|
||||
{
|
||||
log.log(Level.INFO, currentMessage.substring(lastIdx+1,idx));
|
||||
lastIdx = idx;
|
||||
@@ -121,7 +125,9 @@ public class FMLRelaunchLog
|
||||
}
|
||||
if (lastIdx >= 0)
|
||||
{
|
||||
String rem = currentMessage.substring(lastIdx+1);
|
||||
currentMessage.setLength(0);
|
||||
currentMessage.append(rem);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -144,6 +150,8 @@ public class FMLRelaunchLog
|
||||
|
||||
private static FMLLogFormatter formatter;
|
||||
|
||||
static String logFileNamePattern;
|
||||
|
||||
private FMLRelaunchLog()
|
||||
{
|
||||
}
|
||||
@@ -157,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);
|
||||
@@ -170,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 {
|
||||
@@ -178,8 +187,9 @@ public class FMLRelaunchLog
|
||||
}
|
||||
};
|
||||
}
|
||||
catch (Exception e)
|
||||
catch (Throwable t)
|
||||
{
|
||||
throw Throwables.propagate(t);
|
||||
}
|
||||
|
||||
resetLoggingHandlers();
|
||||
|
||||
@@ -1,335 +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" /*Separate that so that MCP's updatenames does not replace it*/,
|
||||
"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);
|
||||
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
|
||||
{
|
||||
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);
|
||||
|
||||
if (minecraftApplet.getClass().getClassLoader() == classLoader)
|
||||
{
|
||||
if (popupWindow != null)
|
||||
{
|
||||
popupWindow.setVisible(false);
|
||||
popupWindow.dispose();
|
||||
}
|
||||
try
|
||||
{
|
||||
newApplet = minecraftApplet;
|
||||
appletClass = ReflectionHelper.getClass(classLoader, "net.minecraft.client.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
|
||||
{
|
||||
appletClass = ReflectionHelper.getClass(classLoader, "net.minecraft.client.MinecraftApplet");
|
||||
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);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -1,411 +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"));
|
||||
private static final boolean DEBUG_CLASSLOADING_FINER = DEBUG_CLASSLOADING && Boolean.parseBoolean(System.getProperty("fml.debugClassLoadingFiner", "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, (urlConnection == null ? null : 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)
|
||||
{
|
||||
if (DEBUG_CLASSLOADING_FINER)
|
||||
{
|
||||
FMLRelaunchLog.finest("Beginning transform of %s (%s) Start Length: %d", name, transformedName, (basicClass == null ? 0 : basicClass.length));
|
||||
for (IClassTransformer transformer : transformers)
|
||||
{
|
||||
String transName = transformer.getClass().getName();
|
||||
FMLRelaunchLog.finest("Before Transformer %s: %d", transName, (basicClass == null ? 0 : basicClass.length));
|
||||
basicClass = transformer.transform(name, transformedName, basicClass);
|
||||
FMLRelaunchLog.finest("After Transformer %s: %d", transName, (basicClass == null ? 0 : basicClass.length));
|
||||
}
|
||||
FMLRelaunchLog.finest("Ending transform of %s (%s) Start Length: %d", name, transformedName, (basicClass == null ? 0 : basicClass.length));
|
||||
}
|
||||
else
|
||||
{
|
||||
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 [email protected]
|
||||
* 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;
|
||||
|
||||
}
|
||||
+44
-41
@@ -1,73 +1,76 @@
|
||||
#Main FML Access Transformer configuration file
|
||||
# TileEntity addMapping
|
||||
public aqp.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 bgf.g #FD:RenderEngine/field_78366_k #texturePack
|
||||
#public bge.g #FD:RenderEngine/field_78366_k #texturePack # -- MISSING MAPPING
|
||||
# RenderManager
|
||||
public bgz.q #FD:RenderManager/field_78729_o #renderers
|
||||
public bfx.q #FD:RenderManager/field_78729_o #renderers
|
||||
# RenderBlocks - everything
|
||||
public bgg.* #FD:RenderBlocks/*
|
||||
public bgg.*() #MD:RenderBlocks/*
|
||||
public bfd.* #FD:RenderBlocks/*
|
||||
public bfd.*() #MD:RenderBlocks/*
|
||||
#RenderPlayer
|
||||
public-f bhu.h #FD:RenderPlayer/field_77110_j #armorlist
|
||||
#public-f bht.h #FD:RenderPlayer/field_77110_j #armorlist # -- MISSING MAPPING
|
||||
#RenderBiped
|
||||
public-f bhh.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 bje.m #FD:TileEntityRenderer/field_76966_m
|
||||
public bip.m #FD:TileEntityRenderer/field_76966_m
|
||||
# CraftingManager - make the add recipe methods public
|
||||
public yk.a(Lwm;[Ljava/lang/Object;)Lyn; #MD:CraftingManager/func_92103_a
|
||||
public yk.b(Lwm;[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 oo #CL:EntityAITaskEntry
|
||||
public pq #CL:EntityAITaskEntry
|
||||
# EntityAITasks
|
||||
public on.a #FD:EntityAITasks/field_75782_a #taskList
|
||||
public pp.a #FD:EntityAITasks/field_75782_a #taskList
|
||||
# BlockChest
|
||||
public aln.m(Laab;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 pa.a(Laab;III)Z #MD:EntityAIOcelotSit/func_75398_a #nearestSittableBlock
|
||||
protected pa.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 qh.d #FD:EntityAnimal/field_70881_d #inLove
|
||||
public rl.bp #FD:EntityAnimal/field_70881_d #inLove
|
||||
# WorldType
|
||||
public aal.<init>(ILjava/lang/String;)V #MD:WorldType/<init>(ILjava/lang/String;)
|
||||
public aal.<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 ahp #CL:ComponentVillage
|
||||
public aje #CL:ComponentVillage
|
||||
# EntityVillager - minmax lists
|
||||
public sm.a(Lzr;ILjava/util/Random;F)V #MD:EntityVillager/func_70948_a #addBuy
|
||||
public sm.b(Lzr;ILjava/util/Random;F)V #MD:EntityVillager/func_70949_b #addSell
|
||||
public sm.bP #FD:EntityVillager/field_70958_bB
|
||||
public sm.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 azi #CL:GuiButtonMerchant
|
||||
public axn #CL:GuiButtonMerchant
|
||||
|
||||
protected awk.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
|
||||
sq 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
|
||||
apa 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
|
||||
wk 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.44",
|
||||
"mcversion": "1.5.1",
|
||||
"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
|
||||
|
||||
+166
-51
@@ -1,6 +1,11 @@
|
||||
searge,name,side,desc
|
||||
field_100000_e,spawnChances,2,Chances for slimes to spawn in swamps for every moon phase.
|
||||
field_100001_o,doneBtn,2,"""Done"" button for the GUI."
|
||||
field_100002_d,cancelBtn,2,
|
||||
field_100003_c,doneBtn,2,
|
||||
field_100010_b,iconArray,2,
|
||||
field_70009_b,chatBuffer,2,
|
||||
field_100013_f,isPotionDurationMax,2,"True if potion effect duration is at maximum, false otherwise."
|
||||
field_70009_b,buffer,2,RCon string buffer for log.
|
||||
field_70010_a,consoleBuffer,2,only ever used by MinecraftServer.executeCommand
|
||||
field_70116_cv,serverPosZ,2,
|
||||
field_70117_cu,serverPosY,2,
|
||||
@@ -137,6 +142,7 @@ field_70272_f,boatZ,2,
|
||||
field_70273_g,boatYaw,2,
|
||||
field_70274_d,boatX,2,
|
||||
field_70275_e,boatY,2,
|
||||
field_70276_b,speedMultiplier,2,
|
||||
field_70277_c,boatPosRotationIncrements,2,
|
||||
field_70278_an,velocityZ,2,
|
||||
field_70280_j,velocityY,2,
|
||||
@@ -257,7 +263,7 @@ field_70546_d,particleAge,2,
|
||||
field_70547_e,particleMaxAge,2,
|
||||
field_70548_b,particleTextureJitterX,2,
|
||||
field_70549_c,particleTextureJitterY,2,
|
||||
field_70550_a,particleTextureIndex,2,
|
||||
field_70550_a,particleIcon,2,The icon field from which the given particle pulls its texture.
|
||||
field_70551_j,particleBlue,2,"The blue amount of color. Used as a percentage, 1.0 = 255 and 0.0 = 0."
|
||||
field_70552_h,particleRed,2,"The red amount of color. Used as a percentage, 1.0 = 255 and 0.0 = 0."
|
||||
field_70553_i,particleGreen,2,"The green amount of color. Used as a percentage, 1.0 = 255 and 0.0 = 0."
|
||||
@@ -340,7 +346,7 @@ field_70749_g,lookHelper,2,
|
||||
field_70750_az,texture,2,the path for the texture of this entityLiving
|
||||
field_70751_d,lastAttackingEntity,2,
|
||||
field_70752_e,potionsNeedUpdate,2,Whether the DataWatcher needs to be updated with the active potions
|
||||
field_70754_ba,limbSwing,2,Only relevant when legYaw is not 0(the entity is moving). Influences where in its swing legs and arms currently are.
|
||||
field_70754_ba,limbSwing,2,Only relevant when limbYaw is not 0(the entity is moving). Influences where in its swing legs and arms currently are.
|
||||
field_70755_b,entityLivingToAttack,2,"is only being set, has no uses as of MC 1.1"
|
||||
field_70756_c,revengeTimer,2,
|
||||
field_70757_a,livingSoundTime,2,Number of ticks since this EntityLiving last produced its sound
|
||||
@@ -383,8 +389,12 @@ field_70855_f,attackTimer,2,
|
||||
field_70856_g,holdRoseTick,2,
|
||||
field_70857_d,villageObj,2,
|
||||
field_70858_e,homeCheckTimer,2,"deincrements, and a distance-to-home check is done at 0"
|
||||
field_70859_f,squidYaw,2,
|
||||
field_70860_g,prevSquidYaw,2,
|
||||
field_70861_d,squidPitch,2,
|
||||
field_70862_e,prevSquidPitch,2,
|
||||
field_70863_bz,randomMotionSpeed,2,
|
||||
field_70865_by,lastTentacleAngle,2,the last calculated angle of the tentacles in radians
|
||||
field_70865_by,prevTentacleAngle,2,the last calculated angle of the tentacles in radians
|
||||
field_70866_j,tentacleAngle,2,angle of the tentacles in radians
|
||||
field_70869_bD,randomMotionVecY,2,
|
||||
field_70870_bE,randomMotionVecZ,2,
|
||||
@@ -659,17 +669,18 @@ field_71572_b,posY,2,the y coordinate
|
||||
field_71573_c,posZ,2,the z coordinate
|
||||
field_71574_a,posX,2,
|
||||
field_71576_a,theReportedExceptionCrashReport,2,Instance of CrashReport.
|
||||
field_71577_f,enderEyeMetaToDirection,2,
|
||||
field_71579_d,vineGrowth,2,
|
||||
field_71580_e,footInvisibleFaceRemap,2,
|
||||
field_71577_f,rotateRight,2,Maps a direction to that to the right of it.
|
||||
field_71578_g,rotateLeft,2,Maps a direction to that to the left of it.
|
||||
field_71579_d,facingToDirection,2,Maps a Facing value (3D) to a Direction value (2D).
|
||||
field_71580_e,rotateOpposite,2,Maps a direction to that opposite of it.
|
||||
field_71581_b,offsetZ,2,
|
||||
field_71582_c,headInvisibleFace,2,
|
||||
field_71582_c,directionToFacing,2,Maps a Direction value (2D) to a Facing value (3D).
|
||||
field_71583_a,offsetX,2,
|
||||
field_71584_h,bedDirection,2,
|
||||
field_71585_d,offsetsZForSide,2,gives the offset required for this axis to get the block at that side.
|
||||
field_71586_b,offsetsXForSide,2,gives the offset required for this axis to get the block at that side.
|
||||
field_71587_c,offsetsYForSide,2,gives the offset required for this axis to get the block at that side.
|
||||
field_71588_a,faceToSide,2,Converts a face to a side.
|
||||
field_71588_a,oppositeSide,2,Converts a side to the opposite side. This is the same as XOR'ing it with 1.
|
||||
field_71589_f,bc_pbe_sha512,2,
|
||||
field_71590_g,bc_pbe_sha224,2,
|
||||
field_71591_d,bc_pbe_sha256,2,
|
||||
@@ -976,7 +987,7 @@ field_72041_aW,blockClay,2,
|
||||
field_72042_aI,signWall,2,
|
||||
field_72043_aJ,lever,2,
|
||||
field_72044_aK,pressurePlateStone,2,
|
||||
field_72045_aL,doorSteel,2,
|
||||
field_72045_aL,doorIron,2,
|
||||
field_72046_aM,pressurePlatePlanks,2,
|
||||
field_72047_aN,oreRedstone,2,
|
||||
field_72048_aO,oreRedstoneGlowing,2,
|
||||
@@ -1013,7 +1024,7 @@ field_72079_ak,stoneSingleSlab,2,stoneSingleSlab
|
||||
field_72080_bM,redstoneLampActive,2,
|
||||
field_72081_al,brick,2,
|
||||
field_72082_bJ,whiteStone,2,The rock found in The End.
|
||||
field_72083_ai,blockSteel,2,
|
||||
field_72083_ai,blockIron,2,
|
||||
field_72084_bK,dragonEgg,2,
|
||||
field_72085_aj,stoneDoubleSlab,2,stoneDoubleSlab
|
||||
field_72086_bP,cocoaPlant,2,
|
||||
@@ -1175,7 +1186,7 @@ field_72588_q,lastPosZ,2,The last known z position for this connection.
|
||||
field_72589_p,lastPosY,2,The last known y position for this connection.
|
||||
field_72590_a,loginHandler,2,The login handler that spawned this thread.
|
||||
field_72595_f,requestIdAsString,2,The request ID stored as a String
|
||||
field_72596_d,requestId,2,A client-provided request ID associated with this query
|
||||
field_72596_d,requestId,2,A client-provided request ID associated with this query.
|
||||
field_72597_e,challengeValue,2,A unique string of bytes used to verify client auth
|
||||
field_72598_b,timestamp,2,The creation timestamp for this auth
|
||||
field_72599_c,randomChallenge,2,A random challenge
|
||||
@@ -1270,7 +1281,7 @@ field_72781_x,glSkyList2,2,OpenGL sky list 2
|
||||
field_72782_b,theWorldServer,2,The WorldServer object.
|
||||
field_72783_a,mcServer,2,Reference to the MinecraftServer object.
|
||||
field_72792_d,entityViewDistance,2,
|
||||
field_72793_b,trackedEntities,2,
|
||||
field_72793_b,trackedEntities,2,"List of tracked entities, used for iteration operations on tracked entities."
|
||||
field_72794_c,trackedEntityIDs,2,
|
||||
field_72795_a,theWorld,2,
|
||||
field_72814_d,hasExtendedLevels,2,set by !chunk.getAreLevelsEmpty
|
||||
@@ -1454,7 +1465,7 @@ field_73261_d,locationOfBlockChange,2,
|
||||
field_73262_e,numberOfTilesToUpdate,2,
|
||||
field_73263_b,playersInChunk,2,
|
||||
field_73264_c,chunkLocation,2,note: this is final
|
||||
field_73265_a,myManager,2,
|
||||
field_73265_a,thePlayerManager,2,
|
||||
field_73286_b,clientPacketIdList,2,List of the client's packet IDs.
|
||||
field_73287_r,isChunkDataPacket,2,"Only true for Packet51MapChunk, Packet52MultiBlockChange, Packet53BlockChange and Packet59ComplexEntity. Used to separate them into a different send queue."
|
||||
field_73288_c,serverPacketIdList,2,List of the server's packet IDs.
|
||||
@@ -1632,6 +1643,7 @@ field_73513_e,zPosition,2,The player's Z position.
|
||||
field_73514_b,name,2,The player's name.
|
||||
field_73515_c,xPosition,2,The player's X position.
|
||||
field_73516_a,entityId,2,"The entity ID, in this case it's the player ID."
|
||||
field_73517_j,metadataWatchableObjects,2,
|
||||
field_73518_h,currentItem,2,The current item the player is holding.
|
||||
field_73519_i,metadata,2,
|
||||
field_73520_f,speedY,2,Not sent if the thrower entity ID is 0. The speed of this fireball along the Y axis.
|
||||
@@ -1706,11 +1718,14 @@ field_73603_i,temp,2,A temporary storage for the compressed chunk data byte arra
|
||||
field_73604_b,targetEntity,2,The entity the player is interacting with
|
||||
field_73605_c,isLeftClick,2,Seems to be true when the player is pointing at an entity and left-clicking and false when right-clicking.
|
||||
field_73606_a,playerEntityId,2,The entity of the player (ignored by the server)
|
||||
field_73610_f,playerVelocityX,2,X velocity of the player being pushed by the explosion
|
||||
field_73611_g,playerVelocityY,2,Y velocity of the player being pushed by the explosion
|
||||
field_73612_d,explosionSize,2,
|
||||
field_73613_e,chunkPositionRecords,2,
|
||||
field_73614_b,explosionY,2,
|
||||
field_73615_c,explosionZ,2,
|
||||
field_73616_a,explosionX,2,
|
||||
field_73617_h,playerVelocityZ,2,Z velocity of the player being pushed by the explosion
|
||||
field_73618_b,eventType,2,"0: Invalid bed, 1: Rain starts, 2: Rain stops, 3: Game mode changed."
|
||||
field_73619_c,gameMode,2,"When reason==3, the game mode to set. See EnumGameType for a list of values."
|
||||
field_73620_a,clientMessage,2,The client prints clientMessage[eventType] to chat when this packet is received.
|
||||
@@ -2874,6 +2889,7 @@ field_76168_c,capacity,2,the maximum amount of elements in the hash (probably 3/
|
||||
field_76169_a,hashArray,2,the array of all elements in the hash
|
||||
field_76171_a,texturePacks,2,
|
||||
field_76172_a,parent,2,
|
||||
field_76173_f,maxFileSize,2,
|
||||
field_76174_d,destinationFile,2,
|
||||
field_76175_e,downloadSuccess,2,
|
||||
field_76176_b,sourceURL,2,
|
||||
@@ -3292,7 +3308,6 @@ field_77022_g,itemRenderBlocks,2,
|
||||
field_77023_b,zLevel,2,Defines the zLevel of rendering of item on GUI.
|
||||
field_77024_a,renderWithColor,2,
|
||||
field_77025_h,random,2,The RNG used in RenderItem (for bobbing itemstacks on the ground)
|
||||
field_77027_a,itemIconIndex,2,"Have the icon index (in items.png) that will be used to render the image. Currently, eggs and snowballs uses this classes."
|
||||
field_77045_g,mainModel,2,
|
||||
field_77046_h,renderPassModel,2,The model to be used during the render passes.
|
||||
field_77050_a,ironGolemModel,2,Iron Golem's Model.
|
||||
@@ -3532,14 +3547,14 @@ field_77685_T,wheat,2,
|
||||
field_77686_W,plateLeather,2,
|
||||
field_77687_V,helmetLeather,2,
|
||||
field_77688_Q,hoeDiamond,2,
|
||||
field_77689_P,hoeSteel,2,
|
||||
field_77689_P,hoeIron,2,
|
||||
field_77690_S,seeds,2,
|
||||
field_77691_R,hoeGold,2,
|
||||
field_77692_Y,bootsLeather,2,
|
||||
field_77693_X,legsLeather,2,
|
||||
field_77694_Z,helmetChain,2,
|
||||
field_77695_f,shovelSteel,2,
|
||||
field_77696_g,pickaxeSteel,2,
|
||||
field_77695_f,shovelIron,2,
|
||||
field_77696_g,pickaxeIron,2,
|
||||
field_77697_d,itemRand,2,The RNG used by the Item subclasses.
|
||||
field_77698_e,itemsList,2,A 32000 elements Item array.
|
||||
field_77699_b,maxDamage,2,Maximum damage an item can handle.
|
||||
@@ -3551,7 +3566,7 @@ field_77704_l,arrow,2,
|
||||
field_77705_m,coal,2,
|
||||
field_77706_j,appleRed,2,
|
||||
field_77707_k,bow,2,
|
||||
field_77708_h,axeSteel,2,
|
||||
field_77708_h,axeIron,2,
|
||||
field_77709_i,flintAndSteel,2,
|
||||
field_77710_w,shovelStone,2,
|
||||
field_77711_v,swordStone,2,
|
||||
@@ -3559,7 +3574,7 @@ field_77712_u,axeWood,2,
|
||||
field_77713_t,pickaxeWood,2,
|
||||
field_77714_s,shovelWood,2,
|
||||
field_77715_r,swordWood,2,
|
||||
field_77716_q,swordSteel,2,
|
||||
field_77716_q,swordIron,2,
|
||||
field_77717_p,ingotGold,2,
|
||||
field_77718_z,swordDiamond,2,
|
||||
field_77719_y,axeStone,2,
|
||||
@@ -3609,7 +3624,7 @@ field_77762_aN,minecartCrate,2,
|
||||
field_77763_aO,minecartPowered,2,
|
||||
field_77764_aP,egg,2,
|
||||
field_77765_aA,saddle,2,
|
||||
field_77766_aB,doorSteel,2,
|
||||
field_77766_aB,doorIron,2,
|
||||
field_77767_aC,redstone,2,
|
||||
field_77768_aD,snowball,2,
|
||||
field_77769_aE,boat,2,
|
||||
@@ -3634,7 +3649,7 @@ field_77787_bX,hasSubtypes,2,"Some items (like dyes) have multiple subtypes on s
|
||||
field_77788_aw,bucketEmpty,2,
|
||||
field_77789_bW,bFull3D,2,"If true, render the object in full 3D, like weapons and tools."
|
||||
field_77790_av,doorWood,2,
|
||||
field_77791_bV,iconIndex,2,Icon index in the icons table.
|
||||
field_77791_bV,itemIcon,2,Icon index in the icons table.
|
||||
field_77792_au,sign,2,
|
||||
field_77793_bL,recordChirp,2,
|
||||
field_77794_ak,bootsDiamond,2,
|
||||
@@ -3655,19 +3670,19 @@ field_77808_an,legsGold,2,
|
||||
field_77809_bD,expBottle,2,Bottle o' Enchanting. Drops between 1 and 3 experience orbs when thrown.
|
||||
field_77810_ac,bootsChain,2,
|
||||
field_77811_bE,fireballCharge,2,Fire Charge. When used in a dispenser it fires a fireball similiar to a Ghast's.
|
||||
field_77812_ad,helmetSteel,2,
|
||||
field_77812_ad,helmetIron,2,
|
||||
field_77813_bB,speckledMelon,2,
|
||||
field_77814_aa,plateChain,2,
|
||||
field_77815_bC,monsterPlacer,2,
|
||||
field_77816_ab,legsChain,2,
|
||||
field_77817_bH,emerald,2,
|
||||
field_77818_ag,bootsSteel,2,
|
||||
field_77818_ag,bootsIron,2,
|
||||
field_77819_bI,record13,2,
|
||||
field_77820_ah,helmetDiamond,2,
|
||||
field_77821_bF,writableBook,2,
|
||||
field_77822_ae,plateSteel,2,
|
||||
field_77822_ae,plateIron,2,
|
||||
field_77823_bG,writtenBook,2,
|
||||
field_77824_af,legsSteel,2,
|
||||
field_77824_af,legsIron,2,
|
||||
field_77826_b,toolMaterial,2,
|
||||
field_77827_a,weaponDamage,2,
|
||||
field_77830_a,spawnID,2,The ID of the block the reed will spawn when used from inventory bar.
|
||||
@@ -4097,28 +4112,16 @@ field_78634_H,aoLightValueScratchXYPP,2,Used as a scratch variable for ambient o
|
||||
field_78635_I,aoLightValueScratchYZPP,2,Used as a scratch variable for ambient occlusion between the top face and the west face.
|
||||
field_78636_J,aoLightValueScratchXYZPPP,2,Used as a scratch variable for ambient occlusion on the south/top/west corner.
|
||||
field_78637_K,aoLightValueScratchXZNN,2,Used as a scratch variable for ambient occlusion between the north face and the east face.
|
||||
field_78638_aI,aoGrassXYZPCP,2,"Grass flag for ambient occlusion on Positive X, Center Y, and Positive Z"
|
||||
field_78639_U,aoBrightnessXYZNNP,2,Ambient occlusion brightness XYZNNP
|
||||
field_78640_aJ,aoGrassXYZNCP,2,"Grass flag for ambient occlusion on Negative X, Center Y, and Positive Z"
|
||||
field_78641_T,aoBrightnessXYNN,2,Ambient occlusion brightness XYNN
|
||||
field_78642_aK,aoGrassXYZPCN,2,"Grass flag for ambient occlusion on Positive X, Center Y, and Negative Z"
|
||||
field_78643_W,aoBrightnessYZNP,2,Ambient occlusion brightness YZNP
|
||||
field_78644_aL,aoGrassXYZCNN,2,"Grass flag for ambient occlusion on Center X, Negative Y, and Negative Z"
|
||||
field_78645_V,aoBrightnessYZNN,2,Ambient occlusion brightness YZNN
|
||||
field_78646_aM,aoGrassXYZPNC,2,"Grass flag for ambient occlusion on Positive X, Negative Y, and Center Z"
|
||||
field_78647_aN,aoGrassXYZNNC,2,"Grass flag for ambient occlusion on Negative X, Negative Y, and center Z"
|
||||
field_78648_aO,aoGrassXYZCNP,2,"Grass flag for ambient occlusion on Center X, Negative Y, and Positive Z"
|
||||
field_78649_S,aoBrightnessXYZNNN,2,Ambient occlusion brightness XYZNNN
|
||||
field_78650_aA,colorBlueBottomLeft,2,Blue color value for the bottom left corner
|
||||
field_78651_aB,colorBlueBottomRight,2,Blue color value for the bottom right corner
|
||||
field_78652_aC,colorBlueTopRight,2,Blue color value for the top right corner
|
||||
field_78653_aD,aoGrassXYZCPN,2,"Grass flag for ambient occlusion on Center X, Positive Y, and Negative Z"
|
||||
field_78654_aE,aoGrassXYZPPC,2,"Grass flag for ambient occlusion on Positive X, Positive Y, and Center Z"
|
||||
field_78655_Y,aoBrightnessXYPN,2,Ambient occlusion brightness XYPN
|
||||
field_78656_aF,aoGrassXYZNPC,2,"Grass flag for ambient occlusion on Negative X, Positive Y, and Center Z"
|
||||
field_78657_X,aoBrightnessXYZPNN,2,Ambient occlusion brightness XYZPNN
|
||||
field_78658_aG,aoGrassXYZCPP,2,"Grass flag for ambient occlusion on Center X, Positive Y, and Positive Z"
|
||||
field_78659_aH,aoGrassXYZNCN,2,"Grass flag for ambient occlusion on Negative X, Center Y, and Negative Z"
|
||||
field_78660_Z,aoBrightnessXYZPNP,2,Ambient occlusion brightness XYZPNP
|
||||
field_78661_f,renderAllFaces,2,"If true, renders all faces on all blocks rather than using the logic in Block.shouldSideBeRendered. Unused."
|
||||
field_78662_g,uvRotateEast,2,
|
||||
@@ -4130,9 +4133,7 @@ field_78667_b,fancyGrass,2,Fancy grass side matching biome
|
||||
field_78668_c,useInventoryTint,2,
|
||||
field_78669_a,blockAccess,2,The IBlockAccess used by this instance of RenderBlocks
|
||||
field_78670_at,colorRedBottomRight,2,Red color value for the bottom right corner
|
||||
field_78671_n,lightValueOwn,2,Light value of the block itself
|
||||
field_78672_as,colorRedBottomLeft,2,Red color value for the bottom left corner
|
||||
field_78673_o,aoLightValueXNeg,2,Light value one block less in x axis
|
||||
field_78674_ar,colorRedTopLeft,2,Red color value for the top left corner
|
||||
field_78675_l,uvRotateBottom,2,
|
||||
field_78676_aq,brightnessTopRight,2,Brightness top right
|
||||
@@ -4152,15 +4153,9 @@ field_78689_v,aoLightValueScratchXYNN,2,Used as a scratch variable for ambient o
|
||||
field_78690_ai,aoBrightnessXZNN,2,Ambient occlusion brightness XZNN
|
||||
field_78691_u,aoLightValueScratchXYZNNN,2,Used as a scratch variable for ambient occlusion on the north/bottom/east corner.
|
||||
field_78692_aj,aoBrightnessXZPN,2,Ambient occlusion brightness XZPN
|
||||
field_78693_t,aoLightValueZPos,2,Light value one block more in z axis
|
||||
field_78694_ao,brightnessBottomLeft,2,Brightness bottom left
|
||||
field_78695_s,aoLightValueYPos,2,Light value one block more in y axis
|
||||
field_78696_ap,brightnessBottomRight,2,Brightness bottom right
|
||||
field_78697_r,aoLightValueXPos,2,Light value one block more in x axis
|
||||
field_78698_am,aoType,2,"Ambient occlusion type (0=simple, 1=complex)"
|
||||
field_78699_q,aoLightValueZNeg,2,Light value one block more in z axis
|
||||
field_78700_an,brightnessTopLeft,2,Brightness top left
|
||||
field_78701_p,aoLightValueYNeg,2,Light value one block more in y axis
|
||||
field_78702_ac,aoBrightnessXYZNPP,2,Ambient occlusion brightness XYZNPP
|
||||
field_78703_ad,aoBrightnessYZPN,2,Ambient occlusion brightness YZPN
|
||||
field_78704_aa,aoBrightnessXYZNPN,2,Ambient occlusion brightness XYZNPN
|
||||
@@ -4316,6 +4311,8 @@ field_82135_d,isBeaconActive,2,
|
||||
field_82136_e,levels,2,Level of this beacon's pyramid.
|
||||
field_82139_a,effectsList,2,List of effects that Beacon can apply
|
||||
field_82140_h,payment,2,Item given to this beacon as payment.
|
||||
field_82151_R,distanceWalkedOnStepModified,2,
|
||||
field_82152_aq,teleportDirection,2,
|
||||
field_82153_h,timeInPortal,2,
|
||||
field_82155_f,isAnvil,2,
|
||||
field_82156_g,fallHurtMax,2,Maximum amount of damage dealt to entities hit by falling block
|
||||
@@ -4329,6 +4326,7 @@ field_82176_d,armorProbability,2,Probability to get armor
|
||||
field_82177_b,enchantmentProbability,2,An array of probabilities that determines whether a random enchantment should be added to the held item. Indexed by difficulty.
|
||||
field_82178_c,armorEnchantmentProbability,2,Probability to get enchanted armor
|
||||
field_82179_bU,persistenceRequired,2,Whether this entity should NOT despawn.
|
||||
field_82180_bT,previousEquipment,2,"The equipment this mob was previously wearing, used for syncing."
|
||||
field_82181_as,pickUpLootProability,2,Probability to pick up loot
|
||||
field_82182_bS,equipment,2,Equipment (armor and held item) for this entity.
|
||||
field_82184_d,aiControlledByPlayer,2,AI task for player control.
|
||||
@@ -4424,6 +4422,9 @@ field_82527_a,dispenseBehaviorRegistry,2,Registry for all dispense behaviors.
|
||||
field_82537_a,sensible,2,"Whether this button is sensible to arrows, used by wooden buttons."
|
||||
field_82539_a,types,2,The types of the wall.
|
||||
field_82548_a,theChunkCoordinates,2,
|
||||
field_82559_a,readSuccessfully,2,"Always 1, unless readByte threw an exception."
|
||||
field_82561_f,disableRelativeVolume,2,
|
||||
field_82562_a,worldAge,2,World age in ticks.
|
||||
field_82564_f,showCape,2,
|
||||
field_82575_g,totalTime,2,Total time for this world.
|
||||
field_82576_c,generatorOptions,2,
|
||||
@@ -4512,6 +4513,7 @@ field_82807_a,skullTypes,2,
|
||||
field_82808_b,cropId,2,Block ID of the crop this seed food should place.
|
||||
field_82809_c,soilId,2,Block ID of the soil this seed food should be planted on.
|
||||
field_82811_a,hangingEntityClass,2,
|
||||
field_82818_l,goldenCarrotEffect,2,
|
||||
field_82822_g,gameVersion,2,Game version for this server.
|
||||
field_82823_k,hideAddress,2,Whether to hide the IP address for this server.
|
||||
field_82826_b,statusBarLength,2,
|
||||
@@ -4580,6 +4582,8 @@ field_85080_a,blockID,2,
|
||||
field_85082_a,theSuspiciousClasses,2,
|
||||
field_85084_a,theCrashReport,2,
|
||||
field_85086_a,theCrashReport,2,
|
||||
field_85087_d,lastUpdateTime,2,The worldtime at which this PortalPosition was last verified
|
||||
field_85088_e,teleporterInstance,2,The teleporter to which this PortalPosition applies
|
||||
field_85098_d,globalRenderer,2,
|
||||
field_85109_a,worldInfoInstance,2,
|
||||
field_85111_a,worldInfoInstance,2,
|
||||
@@ -4598,6 +4602,8 @@ field_85168_c,theMapStructureGenerator,2,
|
||||
field_85171_a,theDedicatedServer,2,
|
||||
field_85180_cf,recordWait,2,
|
||||
field_85185_A,touchscreen,2,
|
||||
field_85190_d,destinationCoordinateKeys,2,A list of valid keys for the destinationCoordainteCache. These are based on the X & Z of the players initial location.
|
||||
field_85191_c,destinationCoordinateCache,2,Stores successful portal placement locations for rapid lookup.
|
||||
field_85192_a,worldServerInstance,2,
|
||||
field_90017_e,isMacOs,2,
|
||||
field_90018_r,isRightMouseClick,2,Used when touchscreen is enabled
|
||||
@@ -4612,10 +4618,15 @@ field_90051_a,theMinecraft,2,
|
||||
field_90053_a,theMinecraft,2,
|
||||
field_90055_a,theMinecraft,2,
|
||||
field_92014_j,explosionStrength,2,The explosion radius of spawned fireballs.
|
||||
field_92016_l,highlightingItemStack,2,The ItemStack that is currently being highlighted
|
||||
field_92017_k,remainingHighlightTicks,2,Remaining ticks the item highlight should be visible
|
||||
field_92039_az,fireworkExplosions,2,
|
||||
field_92055_b,lifetime,2,The lifetime of the firework in ticks. When the age reaches the lifetime the firework explodes.
|
||||
field_92056_a,fireworkAge,2,The age of the firework in ticks.
|
||||
field_92061_d,isChristmas,2,"If true, chests will be rendered with the Christmas present textures."
|
||||
field_92076_h,skyLightSent,2,"Whether or not the chunk data contains a light nibble array. This is true in the main world, false in the end + nether."
|
||||
field_92077_h,pitch,2,The pitch in steps of 2p/256
|
||||
field_92078_i,yaw,2,The yaw in steps of 2p/256
|
||||
field_92086_a,isBlank,2,When isBlank is true the DataWatcher is not watching any objects
|
||||
field_92091_k,thorns,2,
|
||||
field_92104_bU,firework,2,
|
||||
@@ -4624,12 +4635,19 @@ field_92106_bV,fireworkCharge,2,
|
||||
field_92117_D,heldItemTooltips,2,
|
||||
field_92118_B,overrideWidth,2,
|
||||
field_92119_C,overrideHeight,2,
|
||||
field_94050_c,customName,2,
|
||||
field_94054_b,particleTextureIndexX,2,
|
||||
field_94055_c,particleTextureIndexY,2,
|
||||
field_94084_b,tntPlacedBy,2,
|
||||
field_94102_c,entityName,2,
|
||||
field_94106_a,minecartTNTFuse,2,
|
||||
field_94109_b,pushZ,2,
|
||||
field_94110_c,fuel,2,
|
||||
field_94111_a,pushX,2,
|
||||
field_94112_b,dropContentsWhenDead,2,"When set to true, the minecart will drop all items when setDead() is called. When false (such as when travelling dimensions) it preserves its contents."
|
||||
field_94113_a,minecartContainerItems,2,
|
||||
field_94123_d,inventoryName,2,The name that is displayed if the hopper was renamed
|
||||
field_94124_b,hopperItemStacks,2,
|
||||
field_94141_F,destroyBlockIcons,2,
|
||||
field_94153_n,boundTexture,2,
|
||||
field_94154_l,textureMapBlocks,2,
|
||||
@@ -4699,8 +4717,8 @@ field_94299_k,textureWrap,2,
|
||||
field_94300_h,textureTarget,2,
|
||||
field_94301_i,textureMinFilter,2,
|
||||
field_94302_r,textureData,2,
|
||||
field_94303_q,textureCreated,2,
|
||||
field_94304_p,autoCreate,2,
|
||||
field_94303_q,textureNotModified,2,False if the texture has been modified since it was last uploaded to the GPU.
|
||||
field_94304_p,autoCreate,2,"Uninitialized boolean. If true, the texture is re-uploaded every time it's modified. If false, every tick after it's been modified at least once in that tick."
|
||||
field_94313_f,maxHeight,2,
|
||||
field_94314_g,forcePowerOf2,2,
|
||||
field_94315_d,currentHeight,2,
|
||||
@@ -4713,7 +4731,7 @@ field_94322_k,atlasTexture,2,
|
||||
field_94323_h,maxTileDimension,2,Max size (width or height) of a single tile
|
||||
field_94336_cN,blockIcon,2,
|
||||
field_94337_cv,railActivator,2,
|
||||
field_94338_cu,stairCompactNetherQuartz,2,
|
||||
field_94338_cu,stairsNetherQuartz,2,
|
||||
field_94339_ct,blockNetherQuartz,2,
|
||||
field_94340_cs,hopperBlock,2,
|
||||
field_94341_cq,blockRedstone,2,
|
||||
@@ -4725,6 +4743,8 @@ field_94346_cn,redstoneComparatorIdle,2,
|
||||
field_94347_ck,chestTrapped,2,
|
||||
field_94348_cl,pressurePlateGold,2,
|
||||
field_94349_a,iconArray,2,
|
||||
field_94356_a,pressurePlateIconName,2,
|
||||
field_94357_a,maxItemsWeighted,2,The maximum number of items the plate weights.
|
||||
field_94359_b,theIcon,2,
|
||||
field_94362_b,theIcon,2,
|
||||
field_94363_a,iconArray,2,
|
||||
@@ -4733,7 +4753,16 @@ field_94365_a,iconArray,2,
|
||||
field_94366_b,iconArray,2,
|
||||
field_94367_a,grassTypes,2,
|
||||
field_94369_b,theIcon,2,
|
||||
field_94371_c,saplingIcon,2,
|
||||
field_94372_b,iconArray,2,
|
||||
field_94376_b,cauldronTopIcon,2,
|
||||
field_94377_c,cauldronBottomIcon,2,
|
||||
field_94379_b,cactusBottomIcon,2,
|
||||
field_94380_a,cactusTopIcon,2,
|
||||
field_94381_b,cakeBottomIcon,2,
|
||||
field_94383_a,cakeTopIcon,2,
|
||||
field_94384_b,workbenchIconFront,2,
|
||||
field_94385_a,workbenchIconTop,2,
|
||||
field_94386_b,woodTextureTypes,2,
|
||||
field_94387_c,iconArray,2,
|
||||
field_94388_cO,tree_top,2,
|
||||
@@ -4751,19 +4780,49 @@ field_94420_a,quartzBlockTypes,2,
|
||||
field_94423_a,theIcon,2,
|
||||
field_94425_a,theIcon,2,
|
||||
field_94428_c,iconArray,2,
|
||||
field_94430_b,breakableBlockIcon,2,
|
||||
field_94431_cO,anvilIconNames,2,
|
||||
field_94432_cP,iconArray,2,
|
||||
field_94433_b,theIcon,2,
|
||||
field_94435_b,iconSnowSide,2,
|
||||
field_94436_c,iconGrassSideOverlay,2,
|
||||
field_94437_a,iconGrassTop,2,
|
||||
field_94439_c,iconArray,2,
|
||||
field_94443_a,isTrapped,2,Determines whether of not the chest is trapped.
|
||||
field_94445_a,iconArray,2,
|
||||
field_94447_a,theIcon,2,
|
||||
field_94449_b,theIcon,2,
|
||||
field_94450_a,theIcon,2,
|
||||
field_94454_cO,hopperInsideIcon,2,
|
||||
field_94455_b,hopperIcon,2,
|
||||
field_94456_c,hopperTopIcon,2,
|
||||
field_94458_cO,furnaceIconTop,2,
|
||||
field_94459_cP,furnaceIconFront,2,
|
||||
field_94462_cO,furnaceFrontIcon,2,
|
||||
field_94463_c,furnaceTopIcon,2,
|
||||
field_94465_b,doorTypeForIcon,2,Used for pointing at icon names.
|
||||
field_94466_c,iconArray,2,
|
||||
field_94467_a,doorIconNames,2,
|
||||
field_94469_b,iconArray,2,
|
||||
field_94582_cb,tntMinecart,2,
|
||||
field_94470_a,cocoaIcons,2,
|
||||
field_94471_cO,bedTopIcons,2,
|
||||
field_94473_c,bedSideIcons,2,
|
||||
field_94497_cO,topIcon,2,Top icon of piston depends on (either sticky or normal)
|
||||
field_94498_b,innerTopIcon,2,Only visible when piston is extended
|
||||
field_94499_c,bottomIcon,2,Bottom side texture
|
||||
field_94500_e,useProvidedWindowTitle,2,"If false, the client will look up a string like ""window.minecart"". If true, the client uses what the server provides."
|
||||
field_94512_f,isStraightRail,2,
|
||||
field_94513_g,railChunkPosition,2,The chunk position the rail is at.
|
||||
field_94514_d,railY,2,
|
||||
field_94515_e,railZ,2,
|
||||
field_94516_b,logicWorld,2,
|
||||
field_94517_c,railX,2,
|
||||
field_94518_a,theRail,2,
|
||||
field_94557_a,selectAnything,2,
|
||||
field_94582_cb,minecartTnt,2,
|
||||
field_94583_ca,netherQuartz,2,
|
||||
field_94584_bZ,netherrackBrick,2,
|
||||
field_94585_bY,comparator,2,
|
||||
field_94593_a,theIcon,2,
|
||||
field_94596_a,theIcon,2,
|
||||
field_94598_a,theIcon,2,
|
||||
@@ -4772,6 +4831,9 @@ field_94601_a,bowPullIconNameArray,2,
|
||||
field_94610_a,theTileEntity,2,
|
||||
field_94612_a,theTileEntity,2,
|
||||
field_96093_i,entityUniqueID,2,
|
||||
field_96105_c,commandSenderName,2,"The name of command sender (usually username, but possibly ""Rcon"")"
|
||||
field_96106_a,succesCount,2,
|
||||
field_96113_a,isBlocked,2,Whether this hopper minecart is being blocked by an activator rail.
|
||||
field_96291_i,pointedEntityLiving,2,
|
||||
field_96442_D,worldScoreboard,2,
|
||||
field_96452_b,flipU,2,
|
||||
@@ -4784,29 +4846,82 @@ field_96462_b,potionItemStack,2,
|
||||
field_96463_c,dispenserPotionBehavior,2,
|
||||
field_96464_b,defaultDispenserItemBehavior,2,
|
||||
field_96469_cy,dropper,2,
|
||||
field_96474_cR,dropperDefaultBehaviour,2,
|
||||
field_96480_b,scoreName,2,The unique name for the scoreboard to be displayed.
|
||||
field_96481_a,scoreboardPosition,2,"The position of the scoreboard. 0 = list, 1 = sidebar, 2 = belowName."
|
||||
field_96482_b,objectiveDisplayName,2,
|
||||
field_96483_c,change,2,"0 to create scoreboard, 1 to remove scoreboard, 2 to update display text."
|
||||
field_96484_a,objectiveName,2,
|
||||
field_96485_d,updateOrRemove,2,0 to create/update an item. 1 to remove an item.
|
||||
field_96486_b,scoreName,2,The unique name for the scoreboard to be updated. Only sent when updateOrRemove does not equal 1.
|
||||
field_96487_c,value,2,The score to be displayed next to the entry. Only sent when Update/Remove does not equal 1.
|
||||
field_96488_a,itemName,2,An unique name to be displayed in the list.
|
||||
field_96489_f,mode,2,If 0 then the team is created. If 1 then the team is removed. If 2 the team team information is updated. If 3 then new players are added to the team. If 4 then players are removed from the team.
|
||||
field_96491_d,teamSuffix,2,Only if mode = 0 or 2. Displayed after the players' name that are part of this team.
|
||||
field_96492_e,playerNames,2,Only if mode = 0 or 3 or 4. Players to be added/remove from the team.
|
||||
field_96493_b,teamDisplayName,2,Only if mode = 0 or 2.
|
||||
field_96494_c,teamPrefix,2,Only if mode = 0 or 2. Displayed before the players' name that are part of this team.
|
||||
field_96495_a,teamName,2,A unique name for the team.
|
||||
field_96540_f,teamMemberships,2,Map of usernames to ScorePlayerTeam objects.
|
||||
field_96545_a,scoreObjectives,2,Map of objective names to ScoreObjective objects.
|
||||
field_96564_a,theEntity,2,
|
||||
field_96566_b,selectInventories,2,
|
||||
field_96569_b,theEntityTracker,2,
|
||||
field_96600_cc,hopperMinecart,2,
|
||||
field_96600_cc,minecartHopper,2,
|
||||
field_96601_a,theBlock,2,
|
||||
field_96602_b,dispenserMinecartBehavior,2,
|
||||
field_96633_b,playerInventory,2,
|
||||
field_96634_a,theItemStack,2,
|
||||
field_96656_b,theScoreboard,2,
|
||||
field_96676_c,membershipSet,2,A set of all team member usernames.
|
||||
field_96677_a,theScoreboard,2,
|
||||
field_96683_d,displayName,2,
|
||||
field_96684_b,name,2,
|
||||
field_96685_c,objectiveCriteria,2,The ScoreObjectiveCriteria for this objetive
|
||||
field_96686_a,theScoreboard,2,
|
||||
field_96691_E,chatScale,2,
|
||||
field_96692_F,chatWidth,2,
|
||||
field_96693_G,chatHeightUnfocused,2,
|
||||
field_96694_H,chatHeightFocused,2,
|
||||
field_98040_a,mobSpawnerLogic,2,Mob spawner logic for this spawner minecart.
|
||||
field_98044_b,transferTicker,2,
|
||||
field_98048_c,transferCooldown,2,
|
||||
field_98051_e,fallingBlockTileEntityData,2,
|
||||
field_98130_m,serverLogAgent,2,
|
||||
field_98151_a,theTexture,2,
|
||||
field_98181_L,worldLogAgent,2,The log agent for this world.
|
||||
field_98189_n,partialRenderBounds,2,
|
||||
field_98203_f,offsetY,2,This is added to the Y position after being multiplied by random.nextGaussian()
|
||||
field_98204_g,offsetZ,2,This is added to the Z position after being multiplied by random.nextGaussian()
|
||||
field_98205_d,posZ,2,Z position of the particle.
|
||||
field_98206_e,offsetX,2,This is added to the X position after being multiplied by random.nextGaussian()
|
||||
field_98207_b,posX,2,X position of the particle.
|
||||
field_98208_c,posY,2,Y position of the particle.
|
||||
field_98209_a,particleName,2,The name of the particle to create. A list can be found at https://gist.github.com/thinkofdeath/5110835
|
||||
field_98210_h,speed,2,The speed of each particle.
|
||||
field_98211_i,quantity,2,The number of particles to create.
|
||||
field_98212_g,friendlyFire,2,Only if mode = 0 or 2.
|
||||
field_98219_c,entityAvoiderAI,2,
|
||||
field_98223_c,minecartName,2,
|
||||
field_98226_b,theNetServerHandler,2,
|
||||
field_98227_a,thePacket,2,
|
||||
field_98239_d,loggerPrefix,2,
|
||||
field_98240_b,logFile,2,
|
||||
field_98241_c,loggerName,2,
|
||||
field_98242_a,serverLogger,2,
|
||||
field_98244_b,theNetServerHandler,2,
|
||||
field_98245_a,thePacket,2,
|
||||
field_98282_f,randomMinecart,2,
|
||||
field_98283_g,minSpawnDelay,2,
|
||||
field_98285_e,minecartToSpawn,2,List of minecart to spawn.
|
||||
field_98286_b,spawnDelay,2,The delay to spawn.
|
||||
field_98288_a,mobID,2,
|
||||
field_98289_l,activatingRangeFromPlayer,2,The distance from which a player activates the spawner.
|
||||
field_98290_m,spawnRange,2,The range coefficient for spawning entities around.
|
||||
field_98292_k,maxNearbyEntities,2,
|
||||
field_98293_h,maxSpawnDelay,2,
|
||||
field_98294_i,spawnCount,2,A counter for spawn tries.
|
||||
field_98295_a,mobSpawnerEntity,2,The mob spawner we deal with
|
||||
field_98296_a,spawnerMinecart,2,The spawner minecart using this mob spawner logic.
|
||||
field_98303_au,AMBIENT_OCCLUSIONS,2,
|
||||
field_98307_f,fontTextureName,2,
|
||||
|
+60
-46
@@ -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_
|
||||
@@ -867,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_
|
||||
@@ -3874,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_
|
||||
@@ -4025,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_
|
||||
@@ -4036,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_
|
||||
@@ -4149,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_
|
||||
@@ -4186,18 +4199,27 @@ 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_101000_n(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_101000_0_
|
||||
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_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_101003_a(Lnet/minecraft/src/GuiScreenOnlineServers;IIII)V=|p_101003_0_,p_101003_1_,p_101003_2_,p_101003_3_,p_101003_4_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101004_o(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_101004_0_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_101005_j(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_101005_0_
|
||||
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_101011_a(Lnet/minecraft/src/GuiScreenOnlineServers;Ljava/lang/String;)Ljava/lang/String;=|p_101011_0_,p_101011_1_
|
||||
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_
|
||||
@@ -4207,19 +4229,17 @@ net/minecraft/src/GuiScreenOnlineServers.func_96165_a(Ljava/lang/String;II)V=|p_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96174_a(Lnet/minecraft/src/McoServer;)V=java/io/IOException|p_96174_1_
|
||||
net/minecraft/src/GuiScreenOnlineServers.func_96177_a(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/client/Minecraft;=|p_96177_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_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_98084_i(Lnet/minecraft/src/GuiScreenOnlineServers;)Lnet/minecraft/src/FontRenderer;=|p_98084_0_
|
||||
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_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_
|
||||
@@ -4227,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_
|
||||
@@ -4297,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_
|
||||
@@ -4436,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|
|
||||
@@ -4936,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_
|
||||
@@ -5059,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|
|
||||
@@ -5067,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_
|
||||
@@ -6594,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_
|
||||
@@ -6604,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_
|
||||
@@ -6705,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_
|
||||
@@ -7074,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_
|
||||
@@ -7122,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_
|
||||
@@ -7181,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_
|
||||
@@ -7541,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_
|
||||
@@ -7600,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_
|
||||
|
||||
+3160
-3105
File diff suppressed because it is too large.
Load diff
+17
-11
@@ -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 = 5c1219d869b87d233de3033688ec7567
|
||||
MD5Server = 9d31b969c3f197a1d40381d5620717ea
|
||||
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 = 102000
|
||||
ParamIndex = 22000
|
||||
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 -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
|
||||
+203
-26
@@ -1,5 +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.
|
||||
@@ -447,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."
|
||||
@@ -629,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.
|
||||
@@ -792,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,
|
||||
@@ -832,7 +840,7 @@ 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"
|
||||
@@ -1353,10 +1361,10 @@ func_72825_h,getTopSolidOrLiquidBlock,2,"Finds the highest block on the x, z coo
|
||||
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,setBlock,2,"Sets the block ID and metadata at a given location. Args: X, Y, Z, new block ID, new metadata, flags. Flag 0x02 will trigger a block update both on server and on client, flag 0x04, if used with 0x02, will prevent a block update on client worlds. Flag 0x01 will pass the original block ID when notifying adjacent blocks, otherwise it will pass 0."
|
||||
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
|
||||
@@ -1364,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
|
||||
@@ -1379,7 +1387,7 @@ 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
|
||||
@@ -1436,7 +1444,7 @@ 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,
|
||||
@@ -1502,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
|
||||
@@ -1647,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,
|
||||
@@ -1657,7 +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_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.
|
||||
@@ -1788,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.
|
||||
@@ -2456,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,
|
||||
@@ -2500,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
|
||||
@@ -2553,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.
|
||||
@@ -2643,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,
|
||||
@@ -3348,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
|
||||
@@ -3584,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
|
||||
@@ -3616,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,
|
||||
@@ -3765,11 +3783,12 @@ 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.
|
||||
@@ -3812,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,
|
||||
@@ -3840,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.
|
||||
@@ -3873,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.
|
||||
@@ -3882,6 +3904,7 @@ 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_82524_c,isRedstoneRepeaterBlockID,2,
|
||||
@@ -3895,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,
|
||||
@@ -4029,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
|
||||
@@ -4058,6 +4084,7 @@ func_85057_a,makeCategoryDepth,2,Creates a CrashReportCategory for the given sta
|
||||
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"
|
||||
@@ -4096,6 +4123,8 @@ 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,
|
||||
@@ -4103,8 +4132,10 @@ func_85173_a,playSoundToNearExcept,2,Plays sound to all near players except the
|
||||
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
|
||||
@@ -4128,16 +4159,47 @@ 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_94127_c,getStartInventorySide,2,Get the start of the side inventory.
|
||||
func_94128_d,getSizeInventorySide,2,Get the size of the side inventory.
|
||||
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_94148_a,renderItemStack,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,
|
||||
@@ -4208,7 +4270,7 @@ func_94280_f,getTextureName,2,
|
||||
func_94281_a,copyFrom,2,
|
||||
func_94282_c,getGlTextureId,2,
|
||||
func_94284_b,getTextureId,2,
|
||||
func_94285_g,createTexture,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
|
||||
@@ -4216,13 +4278,37 @@ 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,
|
||||
@@ -4231,13 +4317,53 @@ 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,updateIcons,2,
|
||||
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,
|
||||
@@ -4247,33 +4373,84 @@ 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
-69
@@ -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,30 +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
|
||||
TimerTaskMcoServerListUpdateComparator,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
|
||||
@@ -320,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
|
||||
@@ -354,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
|
||||
@@ -394,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
|
||||
@@ -413,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
|
||||
@@ -473,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
|
||||
@@ -497,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
|
||||
@@ -547,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
|
||||
@@ -645,12 +702,6 @@ EnchantmentUntouching,net/minecraft/enchantment
|
||||
EnchantmentWaterWorker,net/minecraft/enchantment
|
||||
EnumEnchantmentType,net/minecraft/enchantment
|
||||
IEnchantmentModifier,net/minecraft/enchantment
|
||||
CallableEffectAmplifier,net/minecraft/entity
|
||||
CallableEffectDuration,net/minecraft/entity
|
||||
CallableEffectID,net/minecraft/entity
|
||||
CallableEffectIsAmbient,net/minecraft/entity
|
||||
CallableEffectIsSplash,net/minecraft/entity
|
||||
CallableEffectName,net/minecraft/entity
|
||||
CallableEntityName,net/minecraft/entity
|
||||
CallableEntityTracker,net/minecraft/entity
|
||||
CallableEntityType,net/minecraft/entity
|
||||
@@ -662,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
|
||||
@@ -677,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
|
||||
@@ -705,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
|
||||
@@ -715,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
|
||||
@@ -734,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
|
||||
@@ -788,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
|
||||
@@ -825,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
|
||||
@@ -836,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
|
||||
@@ -847,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
|
||||
@@ -890,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
|
||||
@@ -897,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
|
||||
@@ -938,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
|
||||
@@ -956,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
|
||||
@@ -1016,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
|
||||
@@ -1032,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
|
||||
@@ -1067,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
|
||||
@@ -1102,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
|
||||
@@ -1135,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
|
||||
@@ -1171,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
|
||||
@@ -1188,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
|
||||
@@ -1198,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
|
||||
@@ -1210,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
|
||||
|
||||
|
+119
-60
@@ -10,15 +10,6 @@ p_101001_1_,par1,2
|
||||
p_101001_2_,par2,2
|
||||
p_101001_3_,par3,2
|
||||
p_101001_4_,par4,2
|
||||
p_101002_0_,par0GuiScreenOnlineServers,2
|
||||
p_101002_1_,par1McoServer,2
|
||||
p_101003_0_,par0GuiScreenOnlineServers,2
|
||||
p_101003_1_,par1,2
|
||||
p_101003_2_,par2,2
|
||||
p_101003_3_,par3,2
|
||||
p_101003_4_,par4,2
|
||||
p_101004_0_,par0GuiScreenOnlineServers,2
|
||||
p_101005_0_,par0GuiScreenOnlineServers,2
|
||||
p_101006_1_,par1,2
|
||||
p_101006_2_,par2,2
|
||||
p_101006_3_,par3,2
|
||||
@@ -32,8 +23,6 @@ p_101009_1_,par1,2
|
||||
p_101009_2_,par2,2
|
||||
p_101009_3_,par3,2
|
||||
p_101009_4_,par4,2
|
||||
p_101011_0_,par0GuiScreenOnlineServers,2
|
||||
p_101011_1_,par1Str,2
|
||||
p_101012_0_,par0GuiScreenOnlineServers,2
|
||||
p_101012_1_,par1,2
|
||||
p_101012_2_,par2,2
|
||||
@@ -78,6 +67,96 @@ 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
|
||||
@@ -7661,20 +7740,7 @@ p_96174_1_,par1McoServer,2
|
||||
p_96177_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
|
||||
@@ -7763,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
|
||||
@@ -7772,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
|
||||
@@ -7961,43 +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_98072_0_,par0GuiScreenOnlineServers,2
|
||||
p_98074_0_,par0GuiScreenOnlineServers,2
|
||||
p_98075_0_,par0GuiScreenOnlineServers,2
|
||||
p_98076_0_,par0GuiScreenOnlineServers,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_98084_0_,par0GuiScreenOnlineServers,2
|
||||
p_98086_1_,par1,2
|
||||
p_98087_0_,par0GuiScreenOnlineServers,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
|
||||
@@ -8025,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
|
||||
@@ -8125,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
|
||||
@@ -8139,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
|
||||
@@ -8152,10 +8196,6 @@ p_i10013_2_,par2GuiScreen,2
|
||||
p_i10013_3_,par3McoServer,2
|
||||
p_i10014_1_,par1GuiScreen,2
|
||||
p_i10014_2_,par2McoServer,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
|
||||
@@ -8257,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
|
||||
@@ -8417,6 +8456,29 @@ 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
|
||||
@@ -8622,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
|
||||
|
||||
|
+84
-49
@@ -5,75 +5,110 @@ import java.lang.reflect.Field;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Arrays;
|
||||
|
||||
import joptsimple.ArgumentAcceptingOptionSpec;
|
||||
import joptsimple.OptionParser;
|
||||
import joptsimple.OptionSet;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.main.Main;
|
||||
|
||||
public class Start
|
||||
{
|
||||
public static void main(String[] args)
|
||||
public static void main(String[] args) throws Exception
|
||||
{
|
||||
int userIndex = -1;
|
||||
int passIndex = -1;
|
||||
int sessIndex = -1;
|
||||
int versIndex = -1;
|
||||
|
||||
for( int x = 0; x < args.length; x++)
|
||||
{
|
||||
if (args[x].equals("--username")) userIndex = x + 1;
|
||||
else if (args[x].equals("--password")) passIndex = x + 1;
|
||||
else if (args[x].equals("--session")) sessIndex = x + 1;
|
||||
else if (args[x].equals("--version")) versIndex = x + 1;
|
||||
}
|
||||
|
||||
if (userIndex != 0-1 && passIndex != -1 && sessIndex == -1)
|
||||
{
|
||||
String[] session = getSession(args[userIndex], args[passIndex]);
|
||||
if (session != null)
|
||||
{
|
||||
args[userIndex] = session[0];
|
||||
args = concat(args, new String[]{"--session", session[1]});
|
||||
}
|
||||
}
|
||||
|
||||
//Kill the password if its there so it isn't printed to the console.
|
||||
if (passIndex != -1)
|
||||
{
|
||||
args[passIndex-1] = "no_password_for_joo";
|
||||
args[passIndex] = "no_password_for_joo";
|
||||
}
|
||||
|
||||
if (versIndex == -1)
|
||||
{
|
||||
args = concat(args, new String[]{ "--version", "fml_mcp" });
|
||||
}
|
||||
|
||||
Main.main(args);
|
||||
}
|
||||
|
||||
private static String[] getSession(String username, String password) throws UnsupportedEncodingException
|
||||
{
|
||||
String parameters = "http://login.minecraft.net/?user=" + URLEncoder.encode(username, "UTF-8") +
|
||||
"&password=" + URLEncoder.encode(password, "UTF-8") +
|
||||
"&version=" + 13;
|
||||
String result = openUrl(parameters);
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
System.out.println("Can't connect to minecraft.net");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!result.contains(":"))
|
||||
{
|
||||
System.out.println("Login Failed: " + result);
|
||||
return null;
|
||||
}
|
||||
String[] values = result.split(":");
|
||||
return new String[]{ values[2].trim(), values[3].trim() };
|
||||
}
|
||||
|
||||
private static String openUrl(String addr)
|
||||
{
|
||||
try
|
||||
{
|
||||
Field f = Minecraft.class.getDeclaredField("field_71463_am");
|
||||
Field.setAccessible(new Field[] { f }, true);
|
||||
f.set(null, new File("."));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
if (args.length != 2)
|
||||
{
|
||||
Minecraft.main(args);
|
||||
}
|
||||
else
|
||||
{
|
||||
try {
|
||||
String parameters = "http://login.minecraft.net/?user=" + URLEncoder.encode(args[0], "UTF-8") +
|
||||
"&password=" + URLEncoder.encode(args[1], "UTF-8") +
|
||||
"&version=" + 13;
|
||||
String result = openUrl(parameters);
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
System.out.println("Can't connect to minecraft.net");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!result.contains(":"))
|
||||
{
|
||||
System.out.println("Login Failed: " + result);
|
||||
return;
|
||||
}
|
||||
//latestVersion, downloadTicket, userName, sessionId
|
||||
String[] values = result.split(":");
|
||||
Minecraft.main(new String[]{values[2].trim(), values[3].trim()});
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String openUrl(String addr)
|
||||
{
|
||||
try {
|
||||
URL url = new URL(addr);
|
||||
java.io.InputStream is;
|
||||
is = url.openConnection().getInputStream();
|
||||
|
||||
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(is));
|
||||
String buf = "";
|
||||
String line = null;
|
||||
while((line = reader.readLine() ) != null)
|
||||
|
||||
while ((line = reader.readLine()) != null)
|
||||
{
|
||||
buf += "\n" + line;
|
||||
buf += "\n" + line;
|
||||
}
|
||||
|
||||
reader.close();
|
||||
return buf;
|
||||
} catch (IOException e) {
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static <T> T[] concat(T[] first, T[] second)
|
||||
{
|
||||
T[] result = Arrays.copyOf(first, first.length + second.length);
|
||||
System.arraycopy(second, 0, result, first.length, second.length);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
diff -r -U 3 minecraft\net\minecraft\client\Minecraft.java minecraft_patched\net\minecraft\client\Minecraft.java
|
||||
--- minecraft\net\minecraft\client\Minecraft.java Tue Mar 19 21:24:34 2013
|
||||
+++ minecraft_patched\net\minecraft\client\Minecraft.java Tue Mar 19 21:26:27 2013
|
||||
@@ -531,9 +531,8 @@
|
||||
--- minecraft\net\minecraft\client\Minecraft.java Sat Apr 27 01:53:03 2013
|
||||
+++ minecraft_patched\net\minecraft\client\Minecraft.java Sat Apr 27 01:55:19 2013
|
||||
@@ -532,9 +532,8 @@
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ diff -r -U 3 minecraft\net\minecraft\client\Minecraft.java minecraft_patched\net
|
||||
if(this.field_71434_R && this.field_71433_S != null) {
|
||||
this.func_71377_b(this.field_71433_S);
|
||||
return;
|
||||
@@ -551,7 +550,6 @@
|
||||
@@ -552,7 +551,6 @@
|
||||
this.func_71373_a(new GuiMemoryErrorScreen());
|
||||
System.gc();
|
||||
}
|
||||
@@ -20,7 +20,7 @@ diff -r -U 3 minecraft\net\minecraft\client\Minecraft.java minecraft_patched\net
|
||||
}
|
||||
} catch (MinecraftError var12) {
|
||||
;
|
||||
@@ -569,8 +567,6 @@
|
||||
@@ -570,8 +568,6 @@
|
||||
this.func_71405_e();
|
||||
}
|
||||
|
||||
@@ -30,8 +30,8 @@ diff -r -U 3 minecraft\net\minecraft\client\Minecraft.java minecraft_patched\net
|
||||
|
||||
private void func_71411_J() {
|
||||
diff -r -U 3 minecraft\net\minecraft\src\CallableSuspiciousClasses.java minecraft_patched\net\minecraft\src\CallableSuspiciousClasses.java
|
||||
--- minecraft\net\minecraft\src\CallableSuspiciousClasses.java Tue Mar 19 21:24:35 2013
|
||||
+++ minecraft_patched\net\minecraft\src\CallableSuspiciousClasses.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\CallableSuspiciousClasses.java Sat Apr 27 01:53:04 2013
|
||||
+++ minecraft_patched\net\minecraft\src\CallableSuspiciousClasses.java Sat Apr 27 01:55:19 2013
|
||||
@@ -21,9 +21,14 @@
|
||||
|
||||
public String func_85085_a() {
|
||||
@@ -51,8 +51,8 @@ diff -r -U 3 minecraft\net\minecraft\src\CallableSuspiciousClasses.java minecraf
|
||||
boolean var5 = !CrashReport.class.getCanonicalName().equals("net.minecraft.CrashReport");
|
||||
HashMap var6 = new HashMap();
|
||||
diff -r -U 3 minecraft\net\minecraft\src\CodecMus.java minecraft_patched\net\minecraft\src\CodecMus.java
|
||||
--- minecraft\net\minecraft\src\CodecMus.java Tue Mar 19 21:24:35 2013
|
||||
+++ minecraft_patched\net\minecraft\src\CodecMus.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\CodecMus.java Sat Apr 27 01:53:04 2013
|
||||
+++ minecraft_patched\net\minecraft\src\CodecMus.java Sat Apr 27 01:55:19 2013
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.minecraft.src;
|
||||
|
||||
@@ -73,8 +73,8 @@ diff -r -U 3 minecraft\net\minecraft\src\CodecMus.java minecraft_patched\net\min
|
||||
}
|
||||
}
|
||||
diff -r -U 3 minecraft\net\minecraft\src\ComponentStrongholdRightTurn.java minecraft_patched\net\minecraft\src\ComponentStrongholdRightTurn.java
|
||||
--- minecraft\net\minecraft\src\ComponentStrongholdRightTurn.java Tue Mar 19 21:24:35 2013
|
||||
+++ minecraft_patched\net\minecraft\src\ComponentStrongholdRightTurn.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\ComponentStrongholdRightTurn.java Sat Apr 27 01:53:04 2013
|
||||
+++ minecraft_patched\net\minecraft\src\ComponentStrongholdRightTurn.java Sat Apr 27 01:55:19 2013
|
||||
@@ -11,6 +11,10 @@
|
||||
|
||||
public class ComponentStrongholdRightTurn extends ComponentStrongholdLeftTurn {
|
||||
@@ -87,9 +87,9 @@ diff -r -U 3 minecraft\net\minecraft\src\ComponentStrongholdRightTurn.java minec
|
||||
if(this.field_74885_f != 2 && this.field_74885_f != 3) {
|
||||
this.func_74989_b((ComponentStrongholdStairs2)p_74861_1_, p_74861_2_, p_74861_3_, 1, 1);
|
||||
diff -r -U 3 minecraft\net\minecraft\src\DedicatedServer.java minecraft_patched\net\minecraft\src\DedicatedServer.java
|
||||
--- minecraft\net\minecraft\src\DedicatedServer.java Tue Mar 19 21:24:35 2013
|
||||
+++ minecraft_patched\net\minecraft\src\DedicatedServer.java Tue Mar 19 21:26:27 2013
|
||||
@@ -206,7 +206,7 @@
|
||||
--- minecraft\net\minecraft\src\DedicatedServer.java Sat Apr 27 01:53:04 2013
|
||||
+++ minecraft_patched\net\minecraft\src\DedicatedServer.java Sat Apr 27 01:55:19 2013
|
||||
@@ -207,7 +207,7 @@
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
@@ -99,8 +99,8 @@ diff -r -U 3 minecraft\net\minecraft\src\DedicatedServer.java minecraft_patched\
|
||||
this.func_71333_ah();
|
||||
}
|
||||
diff -r -U 3 minecraft\net\minecraft\src\EnumChatFormatting.java minecraft_patched\net\minecraft\src\EnumChatFormatting.java
|
||||
--- minecraft\net\minecraft\src\EnumChatFormatting.java Tue Mar 19 21:24:36 2013
|
||||
+++ minecraft_patched\net\minecraft\src\EnumChatFormatting.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\EnumChatFormatting.java Sat Apr 27 01:53:05 2013
|
||||
+++ minecraft_patched\net\minecraft\src\EnumChatFormatting.java Sat Apr 27 01:55:19 2013
|
||||
@@ -38,7 +38,7 @@
|
||||
private final String field_96304_B;
|
||||
|
||||
@@ -111,8 +111,8 @@ diff -r -U 3 minecraft\net\minecraft\src\EnumChatFormatting.java minecraft_patch
|
||||
|
||||
private EnumChatFormatting(char p_i10001_3_, boolean p_i10001_4_) {
|
||||
diff -r -U 3 minecraft\net\minecraft\src\FontRenderer.java minecraft_patched\net\minecraft\src\FontRenderer.java
|
||||
--- minecraft\net\minecraft\src\FontRenderer.java Tue Mar 19 21:24:36 2013
|
||||
+++ minecraft_patched\net\minecraft\src\FontRenderer.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\FontRenderer.java Sat Apr 27 01:53:05 2013
|
||||
+++ minecraft_patched\net\minecraft\src\FontRenderer.java Sat Apr 27 01:55:19 2013
|
||||
@@ -621,8 +621,6 @@
|
||||
case 10:
|
||||
--var5;
|
||||
@@ -132,8 +132,8 @@ diff -r -U 3 minecraft\net\minecraft\src\FontRenderer.java minecraft_patched\net
|
||||
var4 += this.func_78263_a(var8);
|
||||
if(var7) {
|
||||
diff -r -U 3 minecraft\net\minecraft\src\IntegratedServer.java minecraft_patched\net\minecraft\src\IntegratedServer.java
|
||||
--- minecraft\net\minecraft\src\IntegratedServer.java Tue Mar 19 21:24:37 2013
|
||||
+++ minecraft_patched\net\minecraft\src\IntegratedServer.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\IntegratedServer.java Sat Apr 27 01:53:05 2013
|
||||
+++ minecraft_patched\net\minecraft\src\IntegratedServer.java Sat Apr 27 01:55:19 2013
|
||||
@@ -101,7 +101,7 @@
|
||||
return true;
|
||||
}
|
||||
@@ -144,8 +144,8 @@ diff -r -U 3 minecraft\net\minecraft\src\IntegratedServer.java minecraft_patched
|
||||
this.field_71348_o = this.field_71347_n.func_71752_f();
|
||||
if(!var1 && this.field_71348_o) {
|
||||
diff -r -U 3 minecraft\net\minecraft\src\RConThreadClient.java minecraft_patched\net\minecraft\src\RConThreadClient.java
|
||||
--- minecraft\net\minecraft\src\RConThreadClient.java Tue Mar 19 21:24:38 2013
|
||||
+++ minecraft_patched\net\minecraft\src\RConThreadClient.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\RConThreadClient.java Sat Apr 27 01:53:07 2013
|
||||
+++ minecraft_patched\net\minecraft\src\RConThreadClient.java Sat Apr 27 01:55:19 2013
|
||||
@@ -32,8 +32,8 @@
|
||||
}
|
||||
|
||||
@@ -186,8 +186,8 @@ diff -r -U 3 minecraft\net\minecraft\src\RConThreadClient.java minecraft_patched
|
||||
|
||||
private void func_72654_a(int p_72654_1_, int p_72654_2_, String p_72654_3_) throws IOException {
|
||||
diff -r -U 3 minecraft\net\minecraft\src\RenderBlocks.java minecraft_patched\net\minecraft\src\RenderBlocks.java
|
||||
--- minecraft\net\minecraft\src\RenderBlocks.java Tue Mar 19 21:24:38 2013
|
||||
+++ minecraft_patched\net\minecraft\src\RenderBlocks.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\RenderBlocks.java Sat Apr 27 01:53:07 2013
|
||||
+++ minecraft_patched\net\minecraft\src\RenderBlocks.java Sat Apr 27 01:55:19 2013
|
||||
@@ -1951,16 +1951,16 @@
|
||||
float var25 = (float)(p_78589_2_ + 1);
|
||||
float var26 = (float)(p_78589_4_ + 0);
|
||||
@@ -219,8 +219,8 @@ diff -r -U 3 minecraft\net\minecraft\src\RenderBlocks.java minecraft_patched\net
|
||||
var5.func_78374_a((double)var25, (double)p_78589_3_ + 0.015625D, (double)var26, (double)var8.func_94212_f(), (double)var8.func_94206_g());
|
||||
var5.func_78374_a((double)var24, (double)p_78589_3_ + 0.015625D, (double)var26, (double)var8.func_94209_e(), (double)var8.func_94206_g());
|
||||
diff -r -U 3 minecraft\net\minecraft\src\RenderGlobal.java minecraft_patched\net\minecraft\src\RenderGlobal.java
|
||||
--- minecraft\net\minecraft\src\RenderGlobal.java Tue Mar 19 21:24:38 2013
|
||||
+++ minecraft_patched\net\minecraft\src\RenderGlobal.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\RenderGlobal.java Sat Apr 27 01:53:07 2013
|
||||
+++ minecraft_patched\net\minecraft\src\RenderGlobal.java Sat Apr 27 01:55:19 2013
|
||||
@@ -1449,7 +1449,7 @@
|
||||
double var15 = this.field_72777_q.field_71451_h.field_70165_t - p_72726_2_;
|
||||
double var17 = this.field_72777_q.field_71451_h.field_70163_u - p_72726_4_;
|
||||
@@ -231,8 +231,8 @@ diff -r -U 3 minecraft\net\minecraft\src\RenderGlobal.java minecraft_patched\net
|
||||
this.field_72777_q.field_71452_i.func_78873_a(var21 = new EntityHugeExplodeFX(this.field_72769_h, p_72726_2_, p_72726_4_, p_72726_6_, p_72726_8_, p_72726_10_, p_72726_12_));
|
||||
} else if(p_72726_1_.equals("largeexplode")) {
|
||||
diff -r -U 3 minecraft\net\minecraft\src\TcpMasterThread.java minecraft_patched\net\minecraft\src\TcpMasterThread.java
|
||||
--- minecraft\net\minecraft\src\TcpMasterThread.java Tue Mar 19 21:24:38 2013
|
||||
+++ minecraft_patched\net\minecraft\src\TcpMasterThread.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\TcpMasterThread.java Sat Apr 27 01:53:07 2013
|
||||
+++ minecraft_patched\net\minecraft\src\TcpMasterThread.java Sat Apr 27 01:55:19 2013
|
||||
@@ -11,6 +11,7 @@
|
||||
this.field_74504_a = p_i3285_1_;
|
||||
}
|
||||
@@ -242,8 +242,8 @@ diff -r -U 3 minecraft\net\minecraft\src\TcpMasterThread.java minecraft_patched\
|
||||
try {
|
||||
Thread.sleep(5000L);
|
||||
diff -r -U 3 minecraft\net\minecraft\src\ThreadedFileIOBase.java minecraft_patched\net\minecraft\src\ThreadedFileIOBase.java
|
||||
--- minecraft\net\minecraft\src\ThreadedFileIOBase.java Tue Mar 19 21:24:39 2013
|
||||
+++ minecraft_patched\net\minecraft\src\ThreadedFileIOBase.java Tue Mar 19 21:26:27 2013
|
||||
--- minecraft\net\minecraft\src\ThreadedFileIOBase.java Sat Apr 27 01:53:07 2013
|
||||
+++ minecraft_patched\net\minecraft\src\ThreadedFileIOBase.java Sat Apr 27 01:55:19 2013
|
||||
@@ -20,7 +20,8 @@
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
diff -r -U 3 minecraft_server\net\minecraft\src\CallableSuspiciousClasses.java minecraft_server_patched\net\minecraft\src\CallableSuspiciousClasses.java
|
||||
--- minecraft_server\net\minecraft\src\CallableSuspiciousClasses.java Tue Mar 19 21:25:52 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\CallableSuspiciousClasses.java Tue Mar 19 21:26:37 2013
|
||||
--- minecraft_server\net\minecraft\src\CallableSuspiciousClasses.java Sat Apr 27 01:54:18 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\CallableSuspiciousClasses.java Sat Apr 27 01:56:15 2013
|
||||
@@ -21,9 +21,14 @@
|
||||
|
||||
public String func_85085_a() {
|
||||
@@ -20,8 +20,8 @@ diff -r -U 3 minecraft_server\net\minecraft\src\CallableSuspiciousClasses.java m
|
||||
boolean var5 = !CrashReport.class.getCanonicalName().equals("net.minecraft.CrashReport");
|
||||
HashMap var6 = new HashMap();
|
||||
diff -r -U 3 minecraft_server\net\minecraft\src\ComponentStrongholdRightTurn.java minecraft_server_patched\net\minecraft\src\ComponentStrongholdRightTurn.java
|
||||
--- minecraft_server\net\minecraft\src\ComponentStrongholdRightTurn.java Tue Mar 19 21:25:52 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\ComponentStrongholdRightTurn.java Tue Mar 19 21:26:37 2013
|
||||
--- minecraft_server\net\minecraft\src\ComponentStrongholdRightTurn.java Sat Apr 27 01:54:19 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\ComponentStrongholdRightTurn.java Sat Apr 27 01:56:15 2013
|
||||
@@ -11,6 +11,10 @@
|
||||
|
||||
public class ComponentStrongholdRightTurn extends ComponentStrongholdLeftTurn {
|
||||
@@ -34,9 +34,9 @@ diff -r -U 3 minecraft_server\net\minecraft\src\ComponentStrongholdRightTurn.jav
|
||||
if(this.field_74885_f != 2 && this.field_74885_f != 3) {
|
||||
this.func_74989_b((ComponentStrongholdStairs2)p_74861_1_, p_74861_2_, p_74861_3_, 1, 1);
|
||||
diff -r -U 3 minecraft_server\net\minecraft\src\DedicatedServer.java minecraft_server_patched\net\minecraft\src\DedicatedServer.java
|
||||
--- minecraft_server\net\minecraft\src\DedicatedServer.java Tue Mar 19 21:25:53 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\DedicatedServer.java Tue Mar 19 21:26:37 2013
|
||||
@@ -207,7 +207,7 @@
|
||||
--- minecraft_server\net\minecraft\src\DedicatedServer.java Sat Apr 27 01:54:19 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\DedicatedServer.java Sat Apr 27 01:56:15 2013
|
||||
@@ -208,7 +208,7 @@
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
@@ -46,8 +46,8 @@ diff -r -U 3 minecraft_server\net\minecraft\src\DedicatedServer.java minecraft_s
|
||||
this.func_71333_ah();
|
||||
}
|
||||
diff -r -U 3 minecraft_server\net\minecraft\src\EnumChatFormatting.java minecraft_server_patched\net\minecraft\src\EnumChatFormatting.java
|
||||
--- minecraft_server\net\minecraft\src\EnumChatFormatting.java Tue Mar 19 21:25:53 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\EnumChatFormatting.java Tue Mar 19 21:26:37 2013
|
||||
--- minecraft_server\net\minecraft\src\EnumChatFormatting.java Sat Apr 27 01:54:20 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\EnumChatFormatting.java Sat Apr 27 01:56:15 2013
|
||||
@@ -38,7 +38,7 @@
|
||||
private final String field_96304_B;
|
||||
|
||||
@@ -58,8 +58,8 @@ diff -r -U 3 minecraft_server\net\minecraft\src\EnumChatFormatting.java minecraf
|
||||
|
||||
private EnumChatFormatting(char p_i10001_3_, boolean p_i10001_4_) {
|
||||
diff -r -U 3 minecraft_server\net\minecraft\src\MemoryConnection.java minecraft_server_patched\net\minecraft\src\MemoryConnection.java
|
||||
--- minecraft_server\net\minecraft\src\MemoryConnection.java Tue Mar 19 21:25:54 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\MemoryConnection.java Tue Mar 19 21:26:37 2013
|
||||
--- minecraft_server\net\minecraft\src\MemoryConnection.java Sat Apr 27 01:54:20 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\MemoryConnection.java Sat Apr 27 01:56:15 2013
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
@@ -91,8 +91,8 @@ diff -r -U 3 minecraft_server\net\minecraft\src\MemoryConnection.java minecraft_
|
||||
this.field_74440_d = p_74425_1_;
|
||||
}
|
||||
diff -r -U 3 minecraft_server\net\minecraft\src\RConThreadClient.java minecraft_server_patched\net\minecraft\src\RConThreadClient.java
|
||||
--- minecraft_server\net\minecraft\src\RConThreadClient.java Tue Mar 19 21:25:54 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\RConThreadClient.java Tue Mar 19 21:26:37 2013
|
||||
--- minecraft_server\net\minecraft\src\RConThreadClient.java Sat Apr 27 01:54:20 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\RConThreadClient.java Sat Apr 27 01:56:15 2013
|
||||
@@ -32,8 +32,8 @@
|
||||
}
|
||||
|
||||
@@ -133,8 +133,8 @@ diff -r -U 3 minecraft_server\net\minecraft\src\RConThreadClient.java minecraft_
|
||||
|
||||
private void func_72654_a(int p_72654_1_, int p_72654_2_, String p_72654_3_) throws IOException {
|
||||
diff -r -U 3 minecraft_server\net\minecraft\src\TcpMasterThread.java minecraft_server_patched\net\minecraft\src\TcpMasterThread.java
|
||||
--- minecraft_server\net\minecraft\src\TcpMasterThread.java Tue Mar 19 21:25:54 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\TcpMasterThread.java Tue Mar 19 21:26:37 2013
|
||||
--- minecraft_server\net\minecraft\src\TcpMasterThread.java Sat Apr 27 01:54:21 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\TcpMasterThread.java Sat Apr 27 01:56:15 2013
|
||||
@@ -11,6 +11,7 @@
|
||||
this.field_74504_a = p_i3285_1_;
|
||||
}
|
||||
@@ -144,8 +144,8 @@ diff -r -U 3 minecraft_server\net\minecraft\src\TcpMasterThread.java minecraft_s
|
||||
try {
|
||||
Thread.sleep(5000L);
|
||||
diff -r -U 3 minecraft_server\net\minecraft\src\ThreadedFileIOBase.java minecraft_server_patched\net\minecraft\src\ThreadedFileIOBase.java
|
||||
--- minecraft_server\net\minecraft\src\ThreadedFileIOBase.java Tue Mar 19 21:25:54 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\ThreadedFileIOBase.java Tue Mar 19 21:26:37 2013
|
||||
--- minecraft_server\net\minecraft\src\ThreadedFileIOBase.java Sat Apr 27 01:54:21 2013
|
||||
+++ minecraft_server_patched\net\minecraft\src\ThreadedFileIOBase.java Sat Apr 27 01:56:15 2013
|
||||
@@ -20,7 +20,8 @@
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
[VERSION]
|
||||
MCPVersion = 7.44
|
||||
ClientVersion = 1.5.1
|
||||
ServerVersion = 1.5.1
|
||||
MCPVersion = 7.51
|
||||
ClientVersion = 1.5.2
|
||||
ServerVersion = 1.5.2
|
||||
+14
-10
@@ -2,19 +2,23 @@ import urllib
|
||||
import zipfile
|
||||
import sys
|
||||
import os
|
||||
from optparse import OptionParser
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if not len(sys.argv) >= 3:
|
||||
print 'Invalid arguments, must supply mcp folder and fml folder: decompile.py <MCPFolder> <FMLFolder>'
|
||||
parser = OptionParser()
|
||||
parser.add_option('-g', '--gen-conf', action="store_true", dest='gen_conf', help='Generate merged MCP conf folder', default=False)
|
||||
parser.add_option('-m', '--mcp-dir', action='store', dest='mcp_dir', help='Path to download/extract MCP to', default=None )
|
||||
parser.add_option('-f', '--fml-dir', action='store', dest='fml_dir', help='Path to FML install folder', default=None )
|
||||
options, _ = parser.parse_args()
|
||||
|
||||
if options.fml_dir is None or options.mcp_dir is None:
|
||||
print 'Invalid arguments, must supply mcp folder and fml folder: decompile.py --mcp-dir <MCPFolder> --fml-dir <FMLFolder>'
|
||||
else:
|
||||
mcp_dir = os.path.abspath(sys.argv[1])
|
||||
fml_dir = os.path.abspath(sys.argv[2])
|
||||
dont_gen_conf = '-no_gen_conf' in sys.argv
|
||||
sys.path.append(os.path.join(options.fml_dir, 'install'))
|
||||
|
||||
sys.path.append(os.path.join(fml_dir, 'install'))
|
||||
from fml import decompile_minecraft, setup_mcp, download_mcp
|
||||
|
||||
from fml import setup_fml, setup_mcp
|
||||
|
||||
setup_mcp(fml_dir, mcp_dir, dont_gen_conf)
|
||||
setup_fml(fml_dir, mcp_dir)
|
||||
download_mcp(fml_dir=options.fml_dir, mcp_dir=options.mcp_dir)
|
||||
setup_mcp(options.fml_dir, options.mcp_dir, gen_conf=options.gen_conf)
|
||||
decompile_minecraft(options.fml_dir, options.mcp_dir)
|
||||
Loaded 100 of 157 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user