filePool = new HashMap();
+
+ public static final void install(byte[] pkg) throws IOException {
+ ByteArrayInputStream in2 = new ByteArrayInputStream(pkg);
+ DataInputStream in = new DataInputStream(in2);
+ byte[] header = new byte[8];
+ in.read(header);
+ if (!"EAGPKG!!".equals(new String(header, Charset.forName("UTF-8"))))
+ throw new IOException("invalid epk file");
+ in.readUTF();
+ in = new DataInputStream(new InflaterInputStream(in2));
+ String s = null;
+ SHA1Digest dg = new SHA1Digest();
+ while ("".equals(s = in.readUTF())) {
+ String path = in.readUTF();
+ byte[] digest = new byte[20];
+ byte[] digest2 = new byte[20];
+ in.read(digest);
+ int len = in.readInt();
+ byte[] file = new byte[len];
+ in.read(file);
+ if (filePool.containsKey(path))
+ continue;
+ dg.update(file, 0, len);
+ dg.doFinal(digest2, 0);
+ if (!Arrays.equals(digest, digest2))
+ throw new IOException("invalid file hash for " + path);
+ filePool.put(path, file);
+ if (!"".equals(in.readUTF()))
+ throw new IOException("invalid epk file");
+ }
+ if (in.available() > 0 || !" end".equals(s))
+ throw new IOException("invalid epk file");
+ }
+
+ public static final byte[] getResource(String path) {
+ if (path.startsWith("/"))
+ path = path.substring(1);
+ return filePool.get(path);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/lax1dude/eaglercraft/Base64.java b/src/main/java/net/lax1dude/eaglercraft/Base64.java
new file mode 100644
index 0000000..c8b3f69
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/Base64.java
@@ -0,0 +1,857 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.lax1dude.eaglercraft;
+
+import java.math.BigInteger;
+import java.nio.charset.Charset;
+
+/**
+ * Provides Base64 encoding and decoding as defined by
+ * RFC 2045.
+ *
+ *
+ * This class implements section 6.8. Base64
+ * Content-Transfer-Encoding from RFC 2045 Multipurpose Internet
+ * Mail Extensions (MIME) Part One: Format of Internet Message Bodies by
+ * Freed and Borenstein.
+ *
+ *
+ * The class can be parameterized in the following manner with various
+ * constructors:
+ *
+ *
+ * - URL-safe mode: Default off.
+ * - Line length: Default 76. Line length that aren't multiples of 4 will
+ * still essentially end up being multiples of 4 in the encoded data.
+ *
- Line separator: Default is CRLF ("\r\n")
+ *
+ *
+ * The URL-safe parameter is only applied to encode operations. Decoding
+ * seamlessly handles both modes.
+ *
+ *
+ * Since this class operates directly on byte streams, and not character
+ * streams, it is hard-coded to only encode/decode character encodings which are
+ * compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8,
+ * etc).
+ *
+ *
+ * This class is thread-safe.
+ *
+ *
+ * @see RFC 2045
+ * @since 1.0
+ */
+public class Base64 extends BaseNCodec {
+
+ /**
+ * BASE32 characters are 6 bits in length. They are formed by taking a block of
+ * 3 octets to form a 24-bit string, which is converted into 4 BASE64
+ * characters.
+ */
+ private static final int BITS_PER_ENCODED_BYTE = 6;
+ private static final int BYTES_PER_UNENCODED_BLOCK = 3;
+ private static final int BYTES_PER_ENCODED_BLOCK = 4;
+
+ /**
+ * This array is a lookup table that translates 6-bit positive integer index
+ * values into their "Base64 Alphabet" equivalents as specified in Table 1 of
+ * RFC 2045.
+ *
+ * Thanks to "commons" project in ws.apache.org for this code.
+ * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
+ */
+ private static final byte[] STANDARD_ENCODE_TABLE = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
+ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
+ '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
+
+ /**
+ * This is a copy of the STANDARD_ENCODE_TABLE above, but with + and / changed
+ * to - and _ to make the encoded Base64 results more URL-SAFE. This table is
+ * only used when the Base64's mode is set to URL-SAFE.
+ */
+ private static final byte[] URL_SAFE_ENCODE_TABLE = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
+ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1',
+ '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' };
+
+ /**
+ * This array is a lookup table that translates Unicode characters drawn from
+ * the "Base64 Alphabet" (as specified in Table 1 of RFC 2045) into their 6-bit
+ * positive integer equivalents. Characters that are not in the Base64 alphabet
+ * but fall within the bounds of the array are translated to -1.
+ *
+ * Note: '+' and '-' both decode to 62. '/' and '_' both decode to 63. This
+ * means decoder seamlessly handles both URL_SAFE and STANDARD base64. (The
+ * encoder, on the other hand, needs to know ahead of time what to emit).
+ *
+ * Thanks to "commons" project in ws.apache.org for this code.
+ * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
+ */
+ private static final byte[] DECODE_TABLE = {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 00-0f
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 10-1f
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, // 20-2f + - /
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, // 30-3f 0-9
+ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 40-4f A-O
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, // 50-5f P-Z _
+ -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 60-6f a-o
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 // 70-7a p-z
+ };
+
+ /**
+ * Base64 uses 6-bit fields.
+ */
+ /** Mask used to extract 6 bits, used when encoding */
+ private static final int MASK_6BITS = 0x3f;
+ /** Mask used to extract 4 bits, used when decoding final trailing character. */
+ private static final int MASK_4BITS = 0xf;
+ /** Mask used to extract 2 bits, used when decoding final trailing character. */
+ private static final int MASK_2BITS = 0x3;
+
+ // The static final fields above are used for the original static byte[] methods
+ // on Base64.
+ // The private member fields below are used with the new streaming approach,
+ // which requires
+ // some state be preserved between calls of encode() and decode().
+
+ /**
+ * Decodes Base64 data into octets.
+ *
+ * Note: this method seamlessly handles data encoded in URL-safe or
+ * normal mode.
+ *
+ *
+ * @param base64Data Byte array containing Base64 data
+ * @return Array containing decoded data.
+ */
+ public static byte[] decodeBase64(final byte[] base64Data) {
+ return new Base64().decode(base64Data);
+ }
+
+ /**
+ * Decodes a Base64 String into octets.
+ *
+ * Note: this method seamlessly handles data encoded in URL-safe or
+ * normal mode.
+ *
+ *
+ * @param base64String String containing Base64 data
+ * @return Array containing decoded data.
+ * @since 1.4
+ */
+ public static byte[] decodeBase64(final String base64String) {
+ return new Base64().decode(base64String);
+ }
+
+ // Implementation of integer encoding used for crypto
+ /**
+ * Decodes a byte64-encoded integer according to crypto standards such as W3C's
+ * XML-Signature.
+ *
+ * @param pArray a byte array containing base64 character data
+ * @return A BigInteger
+ * @since 1.4
+ */
+ public static BigInteger decodeInteger(final byte[] pArray) {
+ return new BigInteger(1, decodeBase64(pArray));
+ }
+
+ /**
+ * Encodes binary data using the base64 algorithm but does not chunk the output.
+ *
+ * @param binaryData binary data to encode
+ * @return byte[] containing Base64 characters in their UTF-8 representation.
+ */
+ public static byte[] encodeBase64(final byte[] binaryData) {
+ return encodeBase64(binaryData, false);
+ }
+
+ /**
+ * Encodes binary data using the base64 algorithm, optionally chunking the
+ * output into 76 character blocks.
+ *
+ * @param binaryData Array containing binary data to encode.
+ * @param isChunked if {@code true} this encoder will chunk the base64 output
+ * into 76 character blocks
+ * @return Base64-encoded data.
+ * @throws IllegalArgumentException Thrown when the input array needs an output
+ * array bigger than {@link Integer#MAX_VALUE}
+ */
+ public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked) {
+ return encodeBase64(binaryData, isChunked, false);
+ }
+
+ /**
+ * Encodes binary data using the base64 algorithm, optionally chunking the
+ * output into 76 character blocks.
+ *
+ * @param binaryData Array containing binary data to encode.
+ * @param isChunked if {@code true} this encoder will chunk the base64 output
+ * into 76 character blocks
+ * @param urlSafe if {@code true} this encoder will emit - and _ instead of
+ * the usual + and / characters. Note: no padding is added
+ * when encoding using the URL-safe alphabet.
+ * @return Base64-encoded data.
+ * @throws IllegalArgumentException Thrown when the input array needs an output
+ * array bigger than {@link Integer#MAX_VALUE}
+ * @since 1.4
+ */
+ public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked, final boolean urlSafe) {
+ return encodeBase64(binaryData, isChunked, urlSafe, Integer.MAX_VALUE);
+ }
+
+ /**
+ * Encodes binary data using the base64 algorithm, optionally chunking the
+ * output into 76 character blocks.
+ *
+ * @param binaryData Array containing binary data to encode.
+ * @param isChunked if {@code true} this encoder will chunk the base64
+ * output into 76 character blocks
+ * @param urlSafe if {@code true} this encoder will emit - and _ instead
+ * of the usual + and / characters. Note: no padding is
+ * added when encoding using the URL-safe alphabet.
+ * @param maxResultSize The maximum result size to accept.
+ * @return Base64-encoded data.
+ * @throws IllegalArgumentException Thrown when the input array needs an output
+ * array bigger than maxResultSize
+ * @since 1.4
+ */
+ public static byte[] encodeBase64(final byte[] binaryData, final boolean isChunked, final boolean urlSafe,
+ final int maxResultSize) {
+ if (binaryData == null || binaryData.length == 0) {
+ return binaryData;
+ }
+
+ // Create this so can use the super-class method
+ // Also ensures that the same roundings are performed by the ctor and the code
+ final Base64 b64 = isChunked ? new Base64(urlSafe) : new Base64(0, CHUNK_SEPARATOR, urlSafe);
+ final long len = b64.getEncodedLength(binaryData);
+ if (len > maxResultSize) {
+ throw new IllegalArgumentException("Input array too big, the output array would be bigger (" + len
+ + ") than the specified maximum size of " + maxResultSize);
+ }
+
+ return b64.encode(binaryData);
+ }
+
+ /**
+ * Encodes binary data using the base64 algorithm and chunks the encoded output
+ * into 76 character blocks
+ *
+ * @param binaryData binary data to encode
+ * @return Base64 characters chunked in 76 character blocks
+ */
+ public static byte[] encodeBase64Chunked(final byte[] binaryData) {
+ return encodeBase64(binaryData, true);
+ }
+
+ /**
+ * Encodes binary data using the base64 algorithm but does not chunk the output.
+ *
+ * NOTE: We changed the behavior of this method from multi-line chunking
+ * (commons-codec-1.4) to single-line non-chunking (commons-codec-1.5).
+ *
+ * @param binaryData binary data to encode
+ * @return String containing Base64 characters.
+ * @since 1.4 (NOTE: 1.4 chunked the output, whereas 1.5 does not).
+ */
+ public static String encodeBase64String(final byte[] binaryData) {
+ return new String(encodeBase64(binaryData, false), Charset.forName("UTF-8"));
+ }
+
+ /**
+ * Encodes binary data using a URL-safe variation of the base64 algorithm but
+ * does not chunk the output. The url-safe variation emits - and _ instead of +
+ * and / characters. Note: no padding is added.
+ *
+ * @param binaryData binary data to encode
+ * @return byte[] containing Base64 characters in their UTF-8 representation.
+ * @since 1.4
+ */
+ public static byte[] encodeBase64URLSafe(final byte[] binaryData) {
+ return encodeBase64(binaryData, false, true);
+ }
+
+ /**
+ * Encodes binary data using a URL-safe variation of the base64 algorithm but
+ * does not chunk the output. The url-safe variation emits - and _ instead of +
+ * and / characters. Note: no padding is added.
+ *
+ * @param binaryData binary data to encode
+ * @return String containing Base64 characters
+ * @since 1.4
+ */
+ public static String encodeBase64URLSafeString(final byte[] binaryData) {
+ return new String(encodeBase64(binaryData, false, true), Charset.forName("UTF-8"));
+ }
+
+ /**
+ * Encodes to a byte64-encoded integer according to crypto standards such as
+ * W3C's XML-Signature.
+ *
+ * @param bigInteger a BigInteger
+ * @return A byte array containing base64 character data
+ * @throws NullPointerException if null is passed in
+ * @since 1.4
+ */
+ public static byte[] encodeInteger(final BigInteger bigInteger) {
+ return encodeBase64(toIntegerBytes(bigInteger), false);
+ }
+
+ /**
+ * Tests a given byte array to see if it contains only valid characters within
+ * the Base64 alphabet. Currently the method treats whitespace as valid.
+ *
+ * @param arrayOctet byte array to test
+ * @return {@code true} if all bytes are valid characters in the Base64 alphabet
+ * or if the byte array is empty; {@code false}, otherwise
+ * @deprecated 1.5 Use {@link #isBase64(byte[])}, will be removed in 2.0.
+ */
+ @Deprecated
+ public static boolean isArrayByteBase64(final byte[] arrayOctet) {
+ return isBase64(arrayOctet);
+ }
+
+ /**
+ * Returns whether or not the {@code octet} is in the base 64 alphabet.
+ *
+ * @param octet The value to test
+ * @return {@code true} if the value is defined in the the base 64 alphabet,
+ * {@code false} otherwise.
+ * @since 1.4
+ */
+ public static boolean isBase64(final byte octet) {
+ return octet == PAD_DEFAULT || (octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1);
+ }
+
+ /**
+ * Tests a given byte array to see if it contains only valid characters within
+ * the Base64 alphabet. Currently the method treats whitespace as valid.
+ *
+ * @param arrayOctet byte array to test
+ * @return {@code true} if all bytes are valid characters in the Base64 alphabet
+ * or if the byte array is empty; {@code false}, otherwise
+ * @since 1.5
+ */
+ public static boolean isBase64(final byte[] arrayOctet) {
+ for (int i = 0; i < arrayOctet.length; i++) {
+ if (!isBase64(arrayOctet[i]) && !isWhiteSpace(arrayOctet[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Tests a given String to see if it contains only valid characters within the
+ * Base64 alphabet. Currently the method treats whitespace as valid.
+ *
+ * @param base64 String to test
+ * @return {@code true} if all characters in the String are valid characters in
+ * the Base64 alphabet or if the String is empty; {@code false},
+ * otherwise
+ * @since 1.5
+ */
+ public static boolean isBase64(final String base64) {
+ return isBase64(base64.getBytes(Charset.forName("UTF-8")));
+ }
+
+ /**
+ * Returns a byte-array representation of a {@code BigInteger} without sign bit.
+ *
+ * @param bigInt {@code BigInteger} to be converted
+ * @return a byte array representation of the BigInteger parameter
+ */
+ static byte[] toIntegerBytes(final BigInteger bigInt) {
+ int bitlen = bigInt.bitLength();
+ // round bitlen
+ bitlen = ((bitlen + 7) >> 3) << 3;
+ final byte[] bigBytes = bigInt.toByteArray();
+
+ if (((bigInt.bitLength() % 8) != 0) && (((bigInt.bitLength() / 8) + 1) == (bitlen / 8))) {
+ return bigBytes;
+ }
+ // set up params for copying everything but sign bit
+ int startSrc = 0;
+ int len = bigBytes.length;
+
+ // if bigInt is exactly byte-aligned, just skip signbit in copy
+ if ((bigInt.bitLength() % 8) == 0) {
+ startSrc = 1;
+ len--;
+ }
+ final int startDst = bitlen / 8 - len; // to pad w/ nulls as per spec
+ final byte[] resizedBytes = new byte[bitlen / 8];
+ System.arraycopy(bigBytes, startSrc, resizedBytes, startDst, len);
+ return resizedBytes;
+ }
+
+ /**
+ * Encode table to use: either STANDARD or URL_SAFE. Note: the DECODE_TABLE
+ * above remains static because it is able to decode both STANDARD and URL_SAFE
+ * streams, but the encodeTable must be a member variable so we can switch
+ * between the two modes.
+ */
+ private final byte[] encodeTable;
+
+ // Only one decode table currently; keep for consistency with Base32 code
+ private final byte[] decodeTable = DECODE_TABLE;
+
+ /**
+ * Line separator for encoding. Not used when decoding. Only used if lineLength
+ * > 0.
+ */
+ private final byte[] lineSeparator;
+
+ /**
+ * Convenience variable to help us determine when our buffer is going to run out
+ * of room and needs resizing. {@code decodeSize = 3 + lineSeparator.length;}
+ */
+ private final int decodeSize;
+
+ /**
+ * Convenience variable to help us determine when our buffer is going to run out
+ * of room and needs resizing. {@code encodeSize = 4 + lineSeparator.length;}
+ */
+ private final int encodeSize;
+
+ /**
+ * Creates a Base64 codec used for decoding (all modes) and encoding in
+ * URL-unsafe mode.
+ *
+ * When encoding the line length is 0 (no chunking), and the encoding table is
+ * STANDARD_ENCODE_TABLE.
+ *
+ *
+ *
+ * When decoding all variants are supported.
+ *
+ */
+ public Base64() {
+ this(0);
+ }
+
+ /**
+ * Creates a Base64 codec used for decoding (all modes) and encoding in the
+ * given URL-safe mode.
+ *
+ * When encoding the line length is 76, the line separator is CRLF, and the
+ * encoding table is STANDARD_ENCODE_TABLE.
+ *
+ *
+ *
+ * When decoding all variants are supported.
+ *
+ *
+ * @param urlSafe if {@code true}, URL-safe encoding is used. In most cases this
+ * should be set to {@code false}.
+ * @since 1.4
+ */
+ public Base64(final boolean urlSafe) {
+ this(MIME_CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe);
+ }
+
+ /**
+ * Creates a Base64 codec used for decoding (all modes) and encoding in
+ * URL-unsafe mode.
+ *
+ * When encoding the line length is given in the constructor, the line separator
+ * is CRLF, and the encoding table is STANDARD_ENCODE_TABLE.
+ *
+ *
+ * Line lengths that aren't multiples of 4 will still essentially end up being
+ * multiples of 4 in the encoded data.
+ *
+ *
+ * When decoding all variants are supported.
+ *
+ *
+ * @param lineLength Each line of encoded data will be at most of the given
+ * length (rounded down to nearest multiple of 4). If
+ * lineLength <= 0, then the output will not be divided
+ * into lines (chunks). Ignored when decoding.
+ * @since 1.4
+ */
+ public Base64(final int lineLength) {
+ this(lineLength, CHUNK_SEPARATOR);
+ }
+
+ /**
+ * Creates a Base64 codec used for decoding (all modes) and encoding in
+ * URL-unsafe mode.
+ *
+ * When encoding the line length and line separator are given in the
+ * constructor, and the encoding table is STANDARD_ENCODE_TABLE.
+ *
+ *
+ * Line lengths that aren't multiples of 4 will still essentially end up being
+ * multiples of 4 in the encoded data.
+ *
+ *
+ * When decoding all variants are supported.
+ *
+ *
+ * @param lineLength Each line of encoded data will be at most of the given
+ * length (rounded down to nearest multiple of 4). If
+ * lineLength <= 0, then the output will not be divided
+ * into lines (chunks). Ignored when decoding.
+ * @param lineSeparator Each line of encoded data will end with this sequence of
+ * bytes.
+ * @throws IllegalArgumentException Thrown when the provided lineSeparator
+ * included some base64 characters.
+ * @since 1.4
+ */
+ public Base64(final int lineLength, final byte[] lineSeparator) {
+ this(lineLength, lineSeparator, false);
+ }
+
+ /**
+ * Creates a Base64 codec used for decoding (all modes) and encoding in
+ * URL-unsafe mode.
+ *
+ * When encoding the line length and line separator are given in the
+ * constructor, and the encoding table is STANDARD_ENCODE_TABLE.
+ *
+ *
+ * Line lengths that aren't multiples of 4 will still essentially end up being
+ * multiples of 4 in the encoded data.
+ *
+ *
+ * When decoding all variants are supported.
+ *
+ *
+ * @param lineLength Each line of encoded data will be at most of the given
+ * length (rounded down to nearest multiple of 4). If
+ * lineLength <= 0, then the output will not be divided
+ * into lines (chunks). Ignored when decoding.
+ * @param lineSeparator Each line of encoded data will end with this sequence of
+ * bytes.
+ * @param urlSafe Instead of emitting '+' and '/' we emit '-' and '_'
+ * respectively. urlSafe is only applied to encode
+ * operations. Decoding seamlessly handles both modes.
+ * Note: no padding is added when using the URL-safe
+ * alphabet.
+ * @throws IllegalArgumentException Thrown when the {@code lineSeparator}
+ * contains Base64 characters.
+ * @since 1.4
+ */
+ public Base64(final int lineLength, final byte[] lineSeparator, final boolean urlSafe) {
+ this(lineLength, lineSeparator, urlSafe, CodecPolicy.LENIANT);
+ }
+
+ /**
+ * Creates a Base64 codec used for decoding (all modes) and encoding in
+ * URL-unsafe mode.
+ *
+ * When encoding the line length and line separator are given in the
+ * constructor, and the encoding table is STANDARD_ENCODE_TABLE.
+ *
+ *
+ * Line lengths that aren't multiples of 4 will still essentially end up being
+ * multiples of 4 in the encoded data.
+ *
+ *
+ * When decoding all variants are supported.
+ *
+ *
+ * @param lineLength Each line of encoded data will be at most of the given
+ * length (rounded down to nearest multiple of 4). If
+ * lineLength <= 0, then the output will not be divided
+ * into lines (chunks). Ignored when decoding.
+ * @param lineSeparator Each line of encoded data will end with this sequence
+ * of bytes.
+ * @param urlSafe Instead of emitting '+' and '/' we emit '-' and '_'
+ * respectively. urlSafe is only applied to encode
+ * operations. Decoding seamlessly handles both modes.
+ * Note: no padding is added when using the URL-safe
+ * alphabet.
+ * @param decodingPolicy The decoding policy.
+ * @throws IllegalArgumentException Thrown when the {@code lineSeparator}
+ * contains Base64 characters.
+ * @since 1.15
+ */
+ public Base64(final int lineLength, final byte[] lineSeparator, final boolean urlSafe,
+ final CodecPolicy decodingPolicy) {
+ super(BYTES_PER_UNENCODED_BLOCK, BYTES_PER_ENCODED_BLOCK, lineLength,
+ lineSeparator == null ? 0 : lineSeparator.length, PAD_DEFAULT, decodingPolicy);
+ // TODO could be simplified if there is no requirement to reject invalid line
+ // sep when length <=0
+ // @see test case Base64Test.testConstructors()
+ if (lineSeparator != null) {
+ if (containsAlphabetOrPad(lineSeparator)) {
+ final String sep = new String(lineSeparator, Charset.forName("UTF-8"));
+ throw new IllegalArgumentException("lineSeparator must not contain base64 characters: [" + sep + "]");
+ }
+ if (lineLength > 0) { // null line-sep forces no chunking rather than throwing IAE
+ this.encodeSize = BYTES_PER_ENCODED_BLOCK + lineSeparator.length;
+ this.lineSeparator = new byte[lineSeparator.length];
+ System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length);
+ } else {
+ this.encodeSize = BYTES_PER_ENCODED_BLOCK;
+ this.lineSeparator = null;
+ }
+ } else {
+ this.encodeSize = BYTES_PER_ENCODED_BLOCK;
+ this.lineSeparator = null;
+ }
+ this.decodeSize = this.encodeSize - 1;
+ this.encodeTable = urlSafe ? URL_SAFE_ENCODE_TABLE : STANDARD_ENCODE_TABLE;
+ }
+
+ // Implementation of the Encoder Interface
+
+ /**
+ *
+ * Decodes all of the provided data, starting at inPos, for inAvail bytes.
+ * Should be called at least twice: once with the data to decode, and once with
+ * inAvail set to "-1" to alert decoder that EOF has been reached. The "-1" call
+ * is not necessary when decoding, but it doesn't hurt, either.
+ *
+ *
+ * Ignores all non-base64 characters. This is how chunked (e.g. 76 character)
+ * data is handled, since CR and LF are silently ignored, but has implications
+ * for other bytes, too. This method subscribes to the garbage-in, garbage-out
+ * philosophy: it will not check the provided data for validity.
+ *
+ *
+ * Thanks to "commons" project in ws.apache.org for the bitwise operations, and
+ * general approach.
+ * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
+ *
+ *
+ * @param in byte[] array of ascii data to base64 decode.
+ * @param inPos Position to start reading data from.
+ * @param inAvail Amount of bytes available from input for decoding.
+ * @param context the context to be used
+ */
+ @Override
+ void decode(final byte[] in, int inPos, final int inAvail, final Context context) {
+ if (context.eof) {
+ return;
+ }
+ if (inAvail < 0) {
+ context.eof = true;
+ }
+ for (int i = 0; i < inAvail; i++) {
+ final byte[] buffer = ensureBufferSize(decodeSize, context);
+ final byte b = in[inPos++];
+ if (b == pad) {
+ // We're done.
+ context.eof = true;
+ break;
+ }
+ if (b >= 0 && b < DECODE_TABLE.length) {
+ final int result = DECODE_TABLE[b];
+ if (result >= 0) {
+ context.modulus = (context.modulus + 1) % BYTES_PER_ENCODED_BLOCK;
+ context.ibitWorkArea = (context.ibitWorkArea << BITS_PER_ENCODED_BYTE) + result;
+ if (context.modulus == 0) {
+ buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 16) & MASK_8BITS);
+ buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 8) & MASK_8BITS);
+ buffer[context.pos++] = (byte) (context.ibitWorkArea & MASK_8BITS);
+ }
+ }
+ }
+ }
+
+ // Two forms of EOF as far as base64 decoder is concerned: actual
+ // EOF (-1) and first time '=' character is encountered in stream.
+ // This approach makes the '=' padding characters completely optional.
+ if (context.eof && context.modulus != 0) {
+ final byte[] buffer = ensureBufferSize(decodeSize, context);
+
+ // We have some spare bits remaining
+ // Output all whole multiples of 8 bits and ignore the rest
+ switch (context.modulus) {
+// case 0 : // impossible, as excluded above
+ case 1: // 6 bits - either ignore entirely, or raise an exception
+ validateTrailingCharacter();
+ break;
+ case 2: // 12 bits = 8 + 4
+ validateCharacter(MASK_4BITS, context);
+ context.ibitWorkArea = context.ibitWorkArea >> 4; // dump the extra 4 bits
+ buffer[context.pos++] = (byte) ((context.ibitWorkArea) & MASK_8BITS);
+ break;
+ case 3: // 18 bits = 8 + 8 + 2
+ validateCharacter(MASK_2BITS, context);
+ context.ibitWorkArea = context.ibitWorkArea >> 2; // dump 2 bits
+ buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 8) & MASK_8BITS);
+ buffer[context.pos++] = (byte) ((context.ibitWorkArea) & MASK_8BITS);
+ break;
+ default:
+ throw new IllegalStateException("Impossible modulus " + context.modulus);
+ }
+ }
+ }
+
+ /**
+ *
+ * Encodes all of the provided data, starting at inPos, for inAvail bytes. Must
+ * be called at least twice: once with the data to encode, and once with inAvail
+ * set to "-1" to alert encoder that EOF has been reached, to flush last
+ * remaining bytes (if not multiple of 3).
+ *
+ *
+ * Note: no padding is added when encoding using the URL-safe alphabet.
+ *
+ *
+ * Thanks to "commons" project in ws.apache.org for the bitwise operations, and
+ * general approach.
+ * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
+ *
+ *
+ * @param in byte[] array of binary data to base64 encode.
+ * @param inPos Position to start reading data from.
+ * @param inAvail Amount of bytes available from input for encoding.
+ * @param context the context to be used
+ */
+ @Override
+ void encode(final byte[] in, int inPos, final int inAvail, final Context context) {
+ if (context.eof) {
+ return;
+ }
+ // inAvail < 0 is how we're informed of EOF in the underlying data we're
+ // encoding.
+ if (inAvail < 0) {
+ context.eof = true;
+ if (0 == context.modulus && lineLength == 0) {
+ return; // no leftovers to process and not using chunking
+ }
+ final byte[] buffer = ensureBufferSize(encodeSize, context);
+ final int savedPos = context.pos;
+ switch (context.modulus) { // 0-2
+ case 0: // nothing to do here
+ break;
+ case 1: // 8 bits = 6 + 2
+ // top 6 bits:
+ buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 2) & MASK_6BITS];
+ // remaining 2:
+ buffer[context.pos++] = encodeTable[(context.ibitWorkArea << 4) & MASK_6BITS];
+ // URL-SAFE skips the padding to further reduce size.
+ if (encodeTable == STANDARD_ENCODE_TABLE) {
+ buffer[context.pos++] = pad;
+ buffer[context.pos++] = pad;
+ }
+ break;
+
+ case 2: // 16 bits = 6 + 6 + 4
+ buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 10) & MASK_6BITS];
+ buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 4) & MASK_6BITS];
+ buffer[context.pos++] = encodeTable[(context.ibitWorkArea << 2) & MASK_6BITS];
+ // URL-SAFE skips the padding to further reduce size.
+ if (encodeTable == STANDARD_ENCODE_TABLE) {
+ buffer[context.pos++] = pad;
+ }
+ break;
+ default:
+ throw new IllegalStateException("Impossible modulus " + context.modulus);
+ }
+ context.currentLinePos += context.pos - savedPos; // keep track of current line position
+ // if currentPos == 0 we are at the start of a line, so don't add CRLF
+ if (lineLength > 0 && context.currentLinePos > 0) {
+ System.arraycopy(lineSeparator, 0, buffer, context.pos, lineSeparator.length);
+ context.pos += lineSeparator.length;
+ }
+ } else {
+ for (int i = 0; i < inAvail; i++) {
+ final byte[] buffer = ensureBufferSize(encodeSize, context);
+ context.modulus = (context.modulus + 1) % BYTES_PER_UNENCODED_BLOCK;
+ int b = in[inPos++];
+ if (b < 0) {
+ b += 256;
+ }
+ context.ibitWorkArea = (context.ibitWorkArea << 8) + b; // BITS_PER_BYTE
+ if (0 == context.modulus) { // 3 bytes = 24 bits = 4 * 6 bits to extract
+ buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 18) & MASK_6BITS];
+ buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 12) & MASK_6BITS];
+ buffer[context.pos++] = encodeTable[(context.ibitWorkArea >> 6) & MASK_6BITS];
+ buffer[context.pos++] = encodeTable[context.ibitWorkArea & MASK_6BITS];
+ context.currentLinePos += BYTES_PER_ENCODED_BLOCK;
+ if (lineLength > 0 && lineLength <= context.currentLinePos) {
+ System.arraycopy(lineSeparator, 0, buffer, context.pos, lineSeparator.length);
+ context.pos += lineSeparator.length;
+ context.currentLinePos = 0;
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns whether or not the {@code octet} is in the Base64 alphabet.
+ *
+ * @param octet The value to test
+ * @return {@code true} if the value is defined in the the Base64 alphabet
+ * {@code false} otherwise.
+ */
+ @Override
+ protected boolean isInAlphabet(final byte octet) {
+ return octet >= 0 && octet < decodeTable.length && decodeTable[octet] != -1;
+ }
+
+ /**
+ * Returns our current encode mode. True if we're URL-SAFE, false otherwise.
+ *
+ * @return true if we're in URL-SAFE mode, false otherwise.
+ * @since 1.4
+ */
+ public boolean isUrlSafe() {
+ return this.encodeTable == URL_SAFE_ENCODE_TABLE;
+ }
+
+ /**
+ * Validates whether decoding the final trailing character is possible in the
+ * context of the set of possible base 64 values.
+ *
+ *
+ * The character is valid if the lower bits within the provided mask are zero.
+ * This is used to test the final trailing base-64 digit is zero in the bits
+ * that will be discarded.
+ *
+ * @param emptyBitsMask The mask of the lower bits that should be empty
+ * @param context the context to be used
+ *
+ * @throws IllegalArgumentException if the bits being checked contain any
+ * non-zero value
+ */
+ private void validateCharacter(final int emptyBitsMask, final Context context) {
+ if (isStrictDecoding() && (context.ibitWorkArea & emptyBitsMask) != 0) {
+ throw new IllegalArgumentException(
+ "Strict decoding: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible encoding. "
+ + "Expected the discarded bits from the character to be zero.");
+ }
+ }
+
+ /**
+ * Validates whether decoding allows an entire final trailing character that
+ * cannot be used for a complete byte.
+ *
+ * @throws IllegalArgumentException if strict decoding is enabled
+ */
+ private void validateTrailingCharacter() {
+ if (isStrictDecoding()) {
+ throw new IllegalArgumentException(
+ "Strict decoding: Last encoded character (before the paddings if any) is a valid base 64 alphabet but not a possible encoding. "
+ + "Decoding requires at least two trailing 6-bit characters to create bytes.");
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java b/src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java
new file mode 100644
index 0000000..9ab019c
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/BaseNCodec.java
@@ -0,0 +1,694 @@
+package net.lax1dude.eaglercraft;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+import net.lax1dude.eaglercraft.BaseNCodec.CodecPolicy;
+
+public abstract class BaseNCodec {
+
+ static enum CodecPolicy {
+ STRICT, LENIANT;
+ }
+
+ /**
+ * Holds thread context so classes can be thread-safe.
+ *
+ * This class is not itself thread-safe; each thread must allocate its own copy.
+ *
+ * @since 1.7
+ */
+ static class Context {
+
+ /**
+ * Place holder for the bytes we're dealing with for our based logic. Bitwise
+ * operations store and extract the encoding or decoding from this variable.
+ */
+ int ibitWorkArea;
+
+ /**
+ * Place holder for the bytes we're dealing with for our based logic. Bitwise
+ * operations store and extract the encoding or decoding from this variable.
+ */
+ long lbitWorkArea;
+
+ /**
+ * Buffer for streaming.
+ */
+ byte[] buffer;
+
+ /**
+ * Position where next character should be written in the buffer.
+ */
+ int pos;
+
+ /**
+ * Position where next character should be read from the buffer.
+ */
+ int readPos;
+
+ /**
+ * Boolean flag to indicate the EOF has been reached. Once EOF has been reached,
+ * this object becomes useless, and must be thrown away.
+ */
+ boolean eof;
+
+ /**
+ * Variable tracks how many characters have been written to the current line.
+ * Only used when encoding. We use it to make sure each encoded line never goes
+ * beyond lineLength (if lineLength > 0).
+ */
+ int currentLinePos;
+
+ /**
+ * Writes to the buffer only occur after every 3/5 reads when encoding, and
+ * every 4/8 reads when decoding. This variable helps track that.
+ */
+ int modulus;
+
+ Context() {
+ }
+
+ /**
+ * Returns a String useful for debugging (especially within a debugger.)
+ *
+ * @return a String useful for debugging.
+ */
+ @SuppressWarnings("boxing") // OK to ignore boxing here
+ @Override
+ public String toString() {
+ return String.format(
+ "%s[buffer=%s, currentLinePos=%s, eof=%s, ibitWorkArea=%s, lbitWorkArea=%s, "
+ + "modulus=%s, pos=%s, readPos=%s]",
+ this.getClass().getSimpleName(), Arrays.toString(buffer), currentLinePos, eof, ibitWorkArea,
+ lbitWorkArea, modulus, pos, readPos);
+ }
+ }
+
+ /**
+ * EOF
+ *
+ * @since 1.7
+ */
+ static final int EOF = -1;
+
+ /**
+ * MIME chunk size per RFC 2045 section 6.8.
+ *
+ *
+ * The {@value} character limit does not count the trailing CRLF, but counts all
+ * other characters, including any equal signs.
+ *
+ *
+ * @see RFC 2045 section 6.8
+ */
+ public static final int MIME_CHUNK_SIZE = 76;
+
+ /**
+ * PEM chunk size per RFC 1421 section 4.3.2.4.
+ *
+ *
+ * The {@value} character limit does not count the trailing CRLF, but counts all
+ * other characters, including any equal signs.
+ *
+ *
+ * @see RFC 1421 section
+ * 4.3.2.4
+ */
+ public static final int PEM_CHUNK_SIZE = 64;
+
+ private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2;
+
+ /**
+ * Defines the default buffer size - currently {@value} - must be large enough
+ * for at least one encoded block+separator
+ */
+ private static final int DEFAULT_BUFFER_SIZE = 8192;
+
+ /**
+ * The maximum size buffer to allocate.
+ *
+ *
+ * This is set to the same size used in the JDK {@code java.util.ArrayList}:
+ *
+ * Some VMs reserve some header words in an array. Attempts to
+ * allocate larger arrays may result in OutOfMemoryError: Requested array size
+ * exceeds VM limit.
+ */
+ private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;
+
+ /** Mask used to extract 8 bits, used in decoding bytes */
+ protected static final int MASK_8BITS = 0xff;
+
+ /**
+ * Byte used to pad output.
+ */
+ protected static final byte PAD_DEFAULT = '='; // Allow static access to default
+
+ /**
+ * Chunk separator per RFC 2045 section 2.1.
+ *
+ * @see RFC 2045 section 2.1
+ */
+ static final byte[] CHUNK_SEPARATOR = { '\r', '\n' };
+
+ /**
+ * Compares two {@code int} values numerically treating the values as unsigned.
+ * Taken from JDK 1.8.
+ *
+ *
+ * TODO: Replace with JDK 1.8 Integer::compareUnsigned(int, int).
+ *
+ *
+ * @param x the first {@code int} to compare
+ * @param y the second {@code int} to compare
+ * @return the value {@code 0} if {@code x == y}; a value less than {@code 0} if
+ * {@code x < y} as unsigned values; and a value greater than {@code 0}
+ * if {@code x > y} as unsigned values
+ */
+ private static int compareUnsigned(final int xx, final int yy) {
+ int x = xx + Integer.MIN_VALUE;
+ int y = yy + Integer.MIN_VALUE;
+ return (x < y) ? -1 : ((x == y) ? 0 : 1);
+ }
+
+ /**
+ * Create a positive capacity at least as large the minimum required capacity.
+ * If the minimum capacity is negative then this throws an OutOfMemoryError as
+ * no array can be allocated.
+ *
+ * @param minCapacity the minimum capacity
+ * @return the capacity
+ * @throws OutOfMemoryError if the {@code minCapacity} is negative
+ */
+ private static int createPositiveCapacity(final int minCapacity) {
+ if (minCapacity < 0) {
+ // overflow
+ throw new OutOfMemoryError("Unable to allocate array size: " + (minCapacity & 0xffffffffL));
+ }
+ // This is called when we require buffer expansion to a very big array.
+ // Use the conservative maximum buffer size if possible, otherwise the biggest
+ // required.
+ //
+ // Note: In this situation JDK 1.8 java.util.ArrayList returns
+ // Integer.MAX_VALUE.
+ // This excludes some VMs that can exceed MAX_BUFFER_SIZE but not allocate a
+ // full
+ // Integer.MAX_VALUE length array.
+ // The result is that we may have to allocate an array of this size more than
+ // once if
+ // the capacity must be expanded again.
+ return (minCapacity > MAX_BUFFER_SIZE) ? minCapacity : MAX_BUFFER_SIZE;
+ }
+
+ /**
+ * Gets a copy of the chunk separator per RFC 2045 section 2.1.
+ *
+ * @return the chunk separator
+ * @see RFC 2045 section 2.1
+ * @since 1.15
+ */
+ public static byte[] getChunkSeparator() {
+ return CHUNK_SEPARATOR.clone();
+ }
+
+ /**
+ * Checks if a byte value is whitespace or not. Whitespace is taken to mean:
+ * space, tab, CR, LF
+ *
+ * @param byteToCheck the byte to check
+ * @return true if byte is whitespace, false otherwise
+ */
+ protected static boolean isWhiteSpace(final byte byteToCheck) {
+ switch (byteToCheck) {
+ case ' ':
+ case '\n':
+ case '\r':
+ case '\t':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Increases our buffer by the {@link #DEFAULT_BUFFER_RESIZE_FACTOR}.
+ *
+ * @param context the context to be used
+ * @param minCapacity the minimum required capacity
+ * @return the resized byte[] buffer
+ * @throws OutOfMemoryError if the {@code minCapacity} is negative
+ */
+ private static byte[] resizeBuffer(final Context context, final int minCapacity) {
+ // Overflow-conscious code treats the min and new capacity as unsigned.
+ final int oldCapacity = context.buffer.length;
+ int newCapacity = oldCapacity * DEFAULT_BUFFER_RESIZE_FACTOR;
+ if (compareUnsigned(newCapacity, minCapacity) < 0) {
+ newCapacity = minCapacity;
+ }
+ if (compareUnsigned(newCapacity, MAX_BUFFER_SIZE) > 0) {
+ newCapacity = createPositiveCapacity(minCapacity);
+ }
+
+ final byte[] b = new byte[newCapacity];
+ System.arraycopy(context.buffer, 0, b, 0, context.buffer.length);
+ context.buffer = b;
+ return b;
+ }
+
+ /**
+ * @deprecated Use {@link #pad}. Will be removed in 2.0.
+ */
+ @Deprecated
+ protected final byte PAD = PAD_DEFAULT; // instance variable just in case it needs to vary later
+
+ protected final byte pad; // instance variable just in case it needs to vary later
+
+ /**
+ * Number of bytes in each full block of unencoded data, e.g. 4 for Base64 and 5
+ * for Base32
+ */
+ private final int unencodedBlockSize;
+
+ /**
+ * Number of bytes in each full block of encoded data, e.g. 3 for Base64 and 8
+ * for Base32
+ */
+ private final int encodedBlockSize;
+
+ /**
+ * Chunksize for encoding. Not used when decoding. A value of zero or less
+ * implies no chunking of the encoded data. Rounded down to nearest multiple of
+ * encodedBlockSize.
+ */
+ protected final int lineLength;
+
+ /**
+ * Size of chunk separator. Not used unless {@link #lineLength} > 0.
+ */
+ private final int chunkSeparatorLength;
+
+ /**
+ * Defines the decoding behavior when the input bytes contain leftover trailing
+ * bits that cannot be created by a valid encoding. These can be bits that are
+ * unused from the final character or entire characters. The default mode is
+ * lenient decoding. Set this to {@code true} to enable strict decoding.
+ *
+ * - Lenient: Any trailing bits are composed into 8-bit bytes where possible.
+ * The remainder are discarded.
+ *
- Strict: The decoding will raise an {@link IllegalArgumentException} if
+ * trailing bits are not part of a valid encoding. Any unused bits from the
+ * final character must be zero. Impossible counts of entire final characters
+ * are not allowed.
+ *
+ *
+ *
+ * When strict decoding is enabled it is expected that the decoded bytes will be
+ * re-encoded to a byte array that matches the original, i.e. no changes occur
+ * on the final character. This requires that the input bytes use the same
+ * padding and alphabet as the encoder.
+ */
+ private final CodecPolicy decodingPolicy;
+
+ /**
+ * Note {@code lineLength} is rounded down to the nearest multiple of the
+ * encoded block size. If {@code chunkSeparatorLength} is zero, then chunking is
+ * disabled.
+ *
+ * @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3)
+ * @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4)
+ * @param lineLength if > 0, use chunking with a length
+ * {@code lineLength}
+ * @param chunkSeparatorLength the chunk separator length, if relevant
+ */
+ protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength,
+ final int chunkSeparatorLength) {
+ this(unencodedBlockSize, encodedBlockSize, lineLength, chunkSeparatorLength, PAD_DEFAULT);
+ }
+
+ /**
+ * Note {@code lineLength} is rounded down to the nearest multiple of the
+ * encoded block size. If {@code chunkSeparatorLength} is zero, then chunking is
+ * disabled.
+ *
+ * @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3)
+ * @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4)
+ * @param lineLength if > 0, use chunking with a length
+ * {@code lineLength}
+ * @param chunkSeparatorLength the chunk separator length, if relevant
+ * @param pad byte used as padding byte.
+ */
+ protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength,
+ final int chunkSeparatorLength, final byte pad) {
+ this(unencodedBlockSize, encodedBlockSize, lineLength, chunkSeparatorLength, pad, CodecPolicy.LENIANT);
+ }
+
+ /**
+ * Note {@code lineLength} is rounded down to the nearest multiple of the
+ * encoded block size. If {@code chunkSeparatorLength} is zero, then chunking is
+ * disabled.
+ *
+ * @param unencodedBlockSize the size of an unencoded block (e.g. Base64 = 3)
+ * @param encodedBlockSize the size of an encoded block (e.g. Base64 = 4)
+ * @param lineLength if > 0, use chunking with a length
+ * {@code lineLength}
+ * @param chunkSeparatorLength the chunk separator length, if relevant
+ * @param pad byte used as padding byte.
+ * @param decodingPolicy Decoding policy.
+ * @since 1.15
+ */
+ protected BaseNCodec(final int unencodedBlockSize, final int encodedBlockSize, final int lineLength,
+ final int chunkSeparatorLength, final byte pad, final CodecPolicy decodingPolicy) {
+ this.unencodedBlockSize = unencodedBlockSize;
+ this.encodedBlockSize = encodedBlockSize;
+ final boolean useChunking = lineLength > 0 && chunkSeparatorLength > 0;
+ this.lineLength = useChunking ? (lineLength / encodedBlockSize) * encodedBlockSize : 0;
+ this.chunkSeparatorLength = chunkSeparatorLength;
+ this.pad = pad;
+ this.decodingPolicy = decodingPolicy;
+ }
+
+ /**
+ * Returns the amount of buffered data available for reading.
+ *
+ * @param context the context to be used
+ * @return The amount of buffered data available for reading.
+ */
+ int available(final Context context) { // package protected for access from I/O streams
+ return context.buffer != null ? context.pos - context.readPos : 0;
+ }
+
+ /**
+ * Tests a given byte array to see if it contains any characters within the
+ * alphabet or PAD.
+ *
+ * Intended for use in checking line-ending arrays
+ *
+ * @param arrayOctet byte array to test
+ * @return {@code true} if any byte is a valid character in the alphabet or PAD;
+ * {@code false} otherwise
+ */
+ protected boolean containsAlphabetOrPad(final byte[] arrayOctet) {
+ if (arrayOctet == null) {
+ return false;
+ }
+ for (final byte element : arrayOctet) {
+ if (pad == element || isInAlphabet(element)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Decodes a byte[] containing characters in the Base-N alphabet.
+ *
+ * @param pArray A byte array containing Base-N character data
+ * @return a byte array containing binary data
+ */
+ public byte[] decode(final byte[] pArray) {
+ if (pArray == null || pArray.length == 0) {
+ return pArray;
+ }
+ final Context context = new Context();
+ decode(pArray, 0, pArray.length, context);
+ decode(pArray, 0, EOF, context); // Notify decoder of EOF.
+ final byte[] result = new byte[context.pos];
+ readResults(result, 0, result.length, context);
+ return result;
+ }
+
+ // package protected for access from I/O streams
+ abstract void decode(byte[] pArray, int i, int length, Context context);
+
+ /**
+ * Decodes an Object using the Base-N algorithm. This method is provided in
+ * order to satisfy the requirements of the Decoder interface, and will throw a
+ * DecoderException if the supplied object is not of type byte[] or String.
+ *
+ * @param obj Object to decode
+ * @return An object (of type byte[]) containing the binary data which
+ * corresponds to the byte[] or String supplied.
+ * @throws DecoderException if the parameter supplied is not of type byte[]
+ */
+ public Object decode(final Object obj) {
+ if (obj instanceof byte[]) {
+ return decode((byte[]) obj);
+ } else if (obj instanceof String) {
+ return decode((String) obj);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Decodes a String containing characters in the Base-N alphabet.
+ *
+ * @param pArray A String containing Base-N character data
+ * @return a byte array containing binary data
+ */
+ public byte[] decode(final String pArray) {
+ return decode(pArray.getBytes(Charset.forName("UTF-8")));
+ }
+
+ /**
+ * Encodes a byte[] containing binary data, into a byte[] containing characters
+ * in the alphabet.
+ *
+ * @param pArray a byte array containing binary data
+ * @return A byte array containing only the base N alphabetic character data
+ */
+ public byte[] encode(final byte[] pArray) {
+ if (pArray == null || pArray.length == 0) {
+ return pArray;
+ }
+ return encode(pArray, 0, pArray.length);
+ }
+
+ /**
+ * Encodes a byte[] containing binary data, into a byte[] containing characters
+ * in the alphabet.
+ *
+ * @param pArray a byte array containing binary data
+ * @param offset initial offset of the subarray.
+ * @param length length of the subarray.
+ * @return A byte array containing only the base N alphabetic character data
+ * @since 1.11
+ */
+ public byte[] encode(final byte[] pArray, final int offset, final int length) {
+ if (pArray == null || pArray.length == 0) {
+ return pArray;
+ }
+ final Context context = new Context();
+ encode(pArray, offset, length, context);
+ encode(pArray, offset, EOF, context); // Notify encoder of EOF.
+ final byte[] buf = new byte[context.pos - context.readPos];
+ readResults(buf, 0, buf.length, context);
+ return buf;
+ }
+
+ // package protected for access from I/O streams
+ abstract void encode(byte[] pArray, int i, int length, Context context);
+
+ /**
+ * Encodes an Object using the Base-N algorithm. This method is provided in
+ * order to satisfy the requirements of the Encoder interface, and will throw an
+ * EncoderException if the supplied object is not of type byte[].
+ *
+ * @param obj Object to encode
+ * @return An object (of type byte[]) containing the Base-N encoded data which
+ * corresponds to the byte[] supplied.
+ * @throws EncoderException if the parameter supplied is not of type byte[]
+ */
+ public Object encode(final Object obj) {
+ return encode((byte[]) obj);
+ }
+
+ /**
+ * Encodes a byte[] containing binary data, into a String containing characters
+ * in the appropriate alphabet. Uses UTF8 encoding.
+ *
+ * @param pArray a byte array containing binary data
+ * @return String containing only character data in the appropriate alphabet.
+ * @since 1.5 This is a duplicate of {@link #encodeToString(byte[])}; it was
+ * merged during refactoring.
+ */
+ public String encodeAsString(final byte[] pArray) {
+ return new String(encode(pArray), Charset.forName("UTF-8"));
+ }
+
+ /**
+ * Encodes a byte[] containing binary data, into a String containing characters
+ * in the Base-N alphabet. Uses UTF8 encoding.
+ *
+ * @param pArray a byte array containing binary data
+ * @return A String containing only Base-N character data
+ */
+ public String encodeToString(final byte[] pArray) {
+ return new String(encode(pArray), Charset.forName("UTF-8"));
+ }
+
+ /**
+ * Ensure that the buffer has room for {@code size} bytes
+ *
+ * @param size minimum spare space required
+ * @param context the context to be used
+ * @return the buffer
+ */
+ protected byte[] ensureBufferSize(final int size, final Context context) {
+ if (context.buffer == null) {
+ context.buffer = new byte[Math.max(size, getDefaultBufferSize())];
+ context.pos = 0;
+ context.readPos = 0;
+
+ // Overflow-conscious:
+ // x + y > z == x + y - z > 0
+ } else if (context.pos + size - context.buffer.length > 0) {
+ return resizeBuffer(context, context.pos + size);
+ }
+ return context.buffer;
+ }
+
+ /**
+ * Returns the decoding behavior policy.
+ *
+ *
+ * The default is lenient. If the decoding policy is strict, then decoding will
+ * raise an {@link IllegalArgumentException} if trailing bits are not part of a
+ * valid encoding. Decoding will compose trailing bits into 8-bit bytes and
+ * discard the remainder.
+ *
+ *
+ * @return true if using strict decoding
+ * @since 1.15
+ */
+ public CodecPolicy getCodecPolicy() {
+ return decodingPolicy;
+ }
+
+ /**
+ * Get the default buffer size. Can be overridden.
+ *
+ * @return the default buffer size.
+ */
+ protected int getDefaultBufferSize() {
+ return DEFAULT_BUFFER_SIZE;
+ }
+
+ /**
+ * Calculates the amount of space needed to encode the supplied array.
+ *
+ * @param pArray byte[] array which will later be encoded
+ *
+ * @return amount of space needed to encoded the supplied array. Returns a long
+ * since a max-len array will require > Integer.MAX_VALUE
+ */
+ public long getEncodedLength(final byte[] pArray) {
+ // Calculate non-chunked size - rounded up to allow for padding
+ // cast to long is needed to avoid possibility of overflow
+ long len = ((pArray.length + unencodedBlockSize - 1) / unencodedBlockSize) * (long) encodedBlockSize;
+ if (lineLength > 0) { // We're using chunking
+ // Round up to nearest multiple
+ len += ((len + lineLength - 1) / lineLength) * chunkSeparatorLength;
+ }
+ return len;
+ }
+
+ /**
+ * Returns true if this object has buffered data for reading.
+ *
+ * @param context the context to be used
+ * @return true if there is data still available for reading.
+ */
+ boolean hasData(final Context context) { // package protected for access from I/O streams
+ return context.buffer != null;
+ }
+
+ /**
+ * Returns whether or not the {@code octet} is in the current alphabet. Does not
+ * allow whitespace or pad.
+ *
+ * @param value The value to test
+ *
+ * @return {@code true} if the value is defined in the current alphabet,
+ * {@code false} otherwise.
+ */
+ protected abstract boolean isInAlphabet(byte value);
+
+ /**
+ * Tests a given byte array to see if it contains only valid characters within
+ * the alphabet. The method optionally treats whitespace and pad as valid.
+ *
+ * @param arrayOctet byte array to test
+ * @param allowWSPad if {@code true}, then whitespace and PAD are also allowed
+ *
+ * @return {@code true} if all bytes are valid characters in the alphabet or if
+ * the byte array is empty; {@code false}, otherwise
+ */
+ public boolean isInAlphabet(final byte[] arrayOctet, final boolean allowWSPad) {
+ for (final byte octet : arrayOctet) {
+ if (!isInAlphabet(octet) && (!allowWSPad || (octet != pad) && !isWhiteSpace(octet))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Tests a given String to see if it contains only valid characters within the
+ * alphabet. The method treats whitespace and PAD as valid.
+ *
+ * @param basen String to test
+ * @return {@code true} if all characters in the String are valid characters in
+ * the alphabet or if the String is empty; {@code false}, otherwise
+ * @see #isInAlphabet(byte[], boolean)
+ */
+ public boolean isInAlphabet(final String basen) {
+ return isInAlphabet(basen.getBytes(Charset.forName("UTF-8")), true);
+ }
+
+ /**
+ * Returns true if decoding behavior is strict. Decoding will raise an
+ * {@link IllegalArgumentException} if trailing bits are not part of a valid
+ * encoding.
+ *
+ *
+ * The default is false for lenient decoding. Decoding will compose trailing
+ * bits into 8-bit bytes and discard the remainder.
+ *
+ *
+ * @return true if using strict decoding
+ * @since 1.15
+ */
+ public boolean isStrictDecoding() {
+ return decodingPolicy == CodecPolicy.STRICT;
+ }
+
+ /**
+ * Extracts buffered data into the provided byte[] array, starting at position
+ * bPos, up to a maximum of bAvail bytes. Returns how many bytes were actually
+ * extracted.
+ *
+ * Package protected for access from I/O streams.
+ *
+ * @param b byte[] array to extract the buffered data into.
+ * @param bPos position in byte[] array to start extraction at.
+ * @param bAvail amount of bytes we're allowed to extract. We may extract fewer
+ * (if fewer are available).
+ * @param context the context to be used
+ * @return The number of bytes successfully extracted into the provided byte[]
+ * array.
+ */
+ int readResults(final byte[] b, final int bPos, final int bAvail, final Context context) {
+ if (context.buffer != null) {
+ final int len = Math.min(available(context), bAvail);
+ System.arraycopy(context.buffer, context.readPos, b, bPos, len);
+ context.readPos += len;
+ if (context.readPos >= context.pos) {
+ context.buffer = null; // so hasData() will return false, and this method can return -1
+ }
+ return len;
+ }
+ return context.eof ? EOF : 0;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/lax1dude/eaglercraft/Client.java b/src/main/java/net/lax1dude/eaglercraft/Client.java
new file mode 100644
index 0000000..01defbb
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/Client.java
@@ -0,0 +1,137 @@
+package net.lax1dude.eaglercraft;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.lwjgl.opengl.GL11;
+import org.teavm.jso.JSBody;
+import org.teavm.jso.browser.Window;
+import org.teavm.jso.core.JSError;
+import org.teavm.jso.dom.html.HTMLDocument;
+import org.teavm.jso.dom.html.HTMLElement;
+
+import net.PeytonPlayz585.storage.LocalStorageManager;
+import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2;
+import net.minecraft.client.Minecraft;
+import net.minecraft.src.Session;
+
+public class Client {
+ private static final String crashImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATEAAABxCAYAAAC9SpSwAAAQtnpUWHRSYXcgcHJvZmlsZSB0eXBlIGV4aWYAAHjarZlrkly7jYT/cxVeAt8gl0OAZMTsYJY/H1jdsqQrh+2Y2yXV4/QpPoBEZoIdzv/+zw3/4KemFkNtMvrsPfJTZ5158WbEz896zynW9/x+Svp6l369HuTrTcxcKn7n5+Pon9f0ff37vq/XtHjXfhpo2Ncv9NdfzPo1/vhtoPLTyjJv9tdA82ugkj+/SF8DrM+2Yp9Dft6Cns/r1/c/YeB/8Kcib+wfg/z+uQrR242LJedTUok851I/Cyj+P4eyeJN45hfZ39V35fM8v1ZCQP4Up/jTqsLvWfnx7restPPnpJT+uSNw4ddg9h+vf7wOZP4Y/PBC/DNO7Otd/vX6rfH8vp3v//fuEe49n92t2glp/9rU9xbfO25UQl7e1zoP4X/jvbzH5DEC6DWys6NF5WFppkxabqppp5VuOu/VkrHEmk8WXnO2XN61USTPbCWGlyce6WYps+wyyJ+R3sLV/GMt6c0733SWBhPvxJ05MVj6pD//PY9/OdC9DvmUPJikPr38pOxAZRmeOX/mLhKS7jeO2gvw9+P3H89rIYPthXmwwRX1M4S29IUtx1F5iS7c2Hj9lEWS/TUAIWLuxmJSIQOxp9JST1FylpSI4yA/i4GG14aSgtRa3qwy11I6yRnZ5+Y7kt69ueXPZTiLRLTSi5CaWRa5qhAb+JE6wNBqpdXWWm/SRptt9dJrb7136U5+S4pUadJFZMiUNcqoo40+ZIww5lgzzwI5ttmnzDHnXItJFyMvvr24YS3NWrRq066iQ6cuAz5WrVk3sRFs2tp5lw1P7L5ljz33OukApVNPO/3IGWeedYHaLbfedvuVO+6860fWUvik9S+P/zxr6Ttr+WXKb5QfWeOrIt9DJKeT5jkjYxnFIGOeAQCdPWdxpFpz8NR5zuLMVEXLrLJ5cnbyjJHBelJuN/3I3T8z90veQq3/r7zl78wFT93fkbngqfsXmftr3v6Qte1qY7GElyEvQw9qLJQfN608+Icm/eev4b/9wt8/0In35Clj53MtbQbay3TJha/Pkal9UOin9o2snXLdVJzrX8x6El9Up6p2YeDZ7wV5Y/ZWZzDrsVZAxUREcEtXINlSba6zTUo7DqNNZZ7E0GlIa3OfMnNv2cYao2mOEnZWMnx6MUFcO2kfd3QoZ7IO65tFgligM06VYamjx10GGcZxALBZbupiJbS1j5a+V9tDt/GvGR/r3nEymiW+cplN17qzsLtxyazNKjvJParJP+8Y0tKjru0vjl+vc9j299JPInSpnbbXGwBy3FFMWMZI5Uw7N5pqa6FLzXXavN2aLGB6zMbTnLuwLg3RomLPiV3HgUku87QbJ/vPsqlllauVYKcDOZfiTyyjorvMlm2f3G+8RnHU26nhpTqhsBk7QSEPiSKACKic+QARYJfY662kSbJyz20y4WC4mxqDTLRvdiqn4XOONR0EhnG4or7ZVKSV3SRYHcXIcdzjpK7spLVzqLEac1lnJ7T3trXSAgEbJb917dLbbgUs5cy+0mgiQa2kju+LR8HSIRLpggxyCUvEO5hWkQyq/UJFkMvIOmO9ZkIOtggga2opgLhVd2LLrZ6LMPGFTTjGXQBFsi8/GtWg+xxlaYQtH4WpABhgjToaKW0BWEBqZ7Y9xSprJzQ4EBIz9EBImNHdT7FThzuVx8CT7d25bm06r5Y7TGu4MJT0wm74vCZBJPbp4jZI7ny5A1NsEWq8x86u0RbOxjTLOXgVIZTNDfssWH8lcOSOaDIXN5OAWiFCpBuA4hObzbQJ2jLbnaKdN1H96XZFoVm6BGh3b2Pxslg5TpdBdNiNwEFbnxTSYvEwY1WBMoou0quCj2erCyAMT/EM5c4tk7ITRwOpJb98gV0Il6/gw4jLnqSA/MbVxAVtuan02dhz39d6C8uBxw0yG4qguQ8tE9Jm3Y1NqxiqA4OkzSC7rmOJSQ0FA6+TYqSCZM4bjl1+2TcoQAQQiWK9wts5euIHQkcNIQwogqJEiaVFG6cpl7rXy6vIuAP1VJ0J7yC3G7Xy3XXwnNGTm/CratGOxFJ8InCPUc3crSdDUCmfyZ1XQ+sehTxAakljQkbCHUTrIcSUhXU2v+m72mUcWwqiL5AZaA52YBaWoTnI7dBKVmOjR0gmpWJOfqwuFp8ecJTuAiaiS/ds2PPqVhqkZmQZ+WaTgUZIWTLEjKceUE2bxicDi9PrCi43qCEDowuMjkcOXrnQQKJEIK6tCoeFTmhZy4QzjTXCgQDTOerenNAaalzHI4ziLMR64mnMRN8KDUKviZqL47hkAzKzBUHYxXAcah6yVw88vlPGrWUkoRYzvgP/Oy+sQ8sCA+anbvRz17B+SM51PQdXw43GKZBNupUqE+e2jQRUihD2jXclhnCpS9QJXFkzHQN0SLAHqM6Z5oAqhb1ZdzN3FUtBdFEh+g1CgvNJ+GoQBby22qMXaoqw5IbDD/V5N5g68zUS2+eN+0IxOKFxk+3nahRGavBX1kwG8c3XnRD5Rwevl9IIWg60XPMS7FWOw5BK7W8+34HrNGFs6AKiuTtQRS4vrdHqUrQn6BI1GiVQ29QxSrQoLFKEgG7WfZR9fqSvbnG12rhGw+wutwG7Yc4obQqqysLVUWvMCTq8PduHQAHBtSfM53L44Hv6E3Hg4ClgEmpTLh1lX5fpG8WzzgxbcocKWyeLKH1TYuOKEtn8rAXD3fZW58hbKmZPF/fiRvGJ+EDA5/3xXCeQdAHTdKLU4llYinQGxd8Nwpm44WTUlYzM0BiBYy5q1SGZ4fiizmbQggZEkU2fgzftJR13OLaEeihuGy8a1yCjBjZc24kRECWrCZuCYaaqWK5SO2FNInPp7SbaQSdKr4XngTInYZuQhPL+uvt+RiY197sHtYRmV4Z+J6leOYcN7hy2hdmJ3HCa2Smz45pWgc2nIuUT6UTz6HmxEr65thqqTn43ecYfWJB6pvusxL1EcbVJvdaCaaCCqLlqVBob2cTVzf+HOROZ6PkSnYc4nDdbW1R5r3WjZvKYHi5sh8LGasG7/QMFGGS5HyMh4/g01IU12spNOMlQKLSOJBsNeZhRDBq2Ca6wS+3rvhvwIWp1RAhK6CeQlLMbdxUnvUFoFSCEjq5hHYSFetT4Fc0nOXJeZ6x2n/oPNL9UrJnrMqNHdzlVend/tolGDriXJWAYm+RcstiIk8XO6xL3jmO79BNwILKp0H0GynCHw2Gft4erFLqFg+JUcrEhNDaxoPl89vCTMfxCLwvYu7Ok/vVQDKVgYeFT/Dfliu/FqhYBR3i1ZUxQKoveQhAVycoHW00NemeHVzF5fvVO2ATGplIaUKLrmS6IlNXIwXPhEQJLhtPyksOctOc7PVeveGFurBNcBXkPLJnLMI3SPngyJEqIBlmrhYLYyzuJPPBr0BtWZMC3eCqaUQiFNvJiHRIG5Sz6OfqHXeVspDaxKN9bwONqMTfVbAUVceMH8zZc3jVwCaxhLLKeGMNPG/B9mD6bznYXT4xIYPopEYp8u1+l9pTmoj92nJAQVUuJbLzTQCUIO9saYB2rh33FUdOcQnnUo1dkeF0IvhSM2RCMEp4P37SIK87IDtx4rpNjceB2DCCQEDwm8xwcNrwPZ5F+BlbvZ+iUKGndCyCYpYVwUpYlOp2s6oLGXgZb78N5Zafup1V1Is6VPuu1WVRDnt3GhtwEIcN2swl3R03rwr3jOTdNG6R1n5O9NPzg0/ud5ITrDBeIuLnpXMC+Og/Q7R8luPA1C4sbQdw7pwhJ4liQABaNYRKmBwZ0/4YvXjmgG7sBb8xlN0jQCwmvTHjhw4yPw0ZGsEchK734RqoWcVsULPn1rlAJ69ru2FwNuHczIXJeux54qcA2NHrY0lxeR6Bkb7P749pB0XunMyr1pd614vx1jF3gmOLOFWX1GhOY/uM09wD43swqRZxrtuOIoorpNWlmMNMVZJPHAPXofVEyPfgAmOMg+AkePn7wiF+ODmt7ZYuPw3YDnF1KBUg0Xi6PuOWAn8gdssLzOjTbddueqHPtiDhMTysJVTvNA1bnDYonejAj6fEAgsYlNTDngDDZRaK5modo0JRdvvIQHmH/V76NFt2dAyWApSHTNMjcKJWVOSWFpuiMa1k3P2RB2jAqQ2DlgssUsASTYRZ3Nu/wsBxEFV+DVLUBj2IP8Z5lhEML/XBh8fXPM2HDvH1GN+4krwRoAdbsfPZO2WkycKDChN40J9wiYk0LwRLhgyOVBG9kBmntrMzQtVgRlaW9REcw5YO2YAc+PZxC4cttFyigJwh4KGI9xTkKDp6XIeGSwjS5K5bfT7kSfQglvDZ9pzCsxgqQysRl5EnJE2eK1k0QqtH+DSMeVJE0Z0KcjsdiFUV01TsinsN0MmeWnDo4XN7HDe8NvUEin+4QsFKUA02X293xBIuUj5Kun3O/1n1D/gN+IH6wJyPSqy7NsE3OTn14xNYoqwZ+/ESBRtAgEqz+PYOdT6KKGPspRUD8Bshj0bTMluEwgtGxl158e08/KLm0ITgFmhTgMG+rNICG7uNvsQk4MmoeHOHCqhFm2hBGY4HtyEe/5dElQJfh6MOtdAoMLLjppIvGmyJLfr78VkQzd8gpJVCQNkoP64jBwznSiqsfeOIX8B74EUQeaoFIWTEstV4vTDOGHQh92XQS8aaXqhx+lKXkkShCYpimC5N6t3fBGETtWe3s3Q8mqF2ak4NFKjN4Xlitx571mru5Nb271cL4F5iyYD8qEidIKAqFhsgu6k4m0BznhqkW8Jcld6GIbHnVwjjdMD5IS8EBDRejTmvvUMM/k0L2Qsil9kd2uI0Kn/Xg1cDOlcjSs0PHNRr0QKzxiGPhI1FJPx6dyc2EL2awLcKOTPixghGwjYdEDUQxA6Wiu62MMUgVvouX1q8f1A03jEx6HCUIip8OY/KgrARQAVrbADc4wg6qh8yiQXCyHyusipfJljJU54koJTZfG7J1SCqmFRkg+Xt6tSeKd2G0WCXRYmgWMhD8RABpAJ2GQJQSDoLdhe5Y+/BjSHx4MUgCZqKxYXr3RQFCzB+yYe90qd3PEJEhP/zFmFLyaCnvWuJuqET84A+6O9WJaNDcQ1l9WsDLGGaGrn/7qWAmngb7l4+N1te44P38EBk/SI/FvntzlgL04qfJpIAbQ8emODPjRtJEjpA0erPKenW8v86hJ6D8xzmt/w2odn/ClBI6NoT1ySmgy7dxlzcEP91ObRjLJrXIEf4yAZtJC71sNbgAoHdcVHdf1RcdxA1YL2/DIC7aBqrAOnLrR/XJkQi1OpfNzDfdjoEQPN3BCezs1AsY/IQVyQmV9orsT8yf/3HU/BO9Y4I9GIwGiYL2Y2B6H/WWEUR5awuPszBvaYr/daJL8NOHCQrdHuF6EadM9yfU2hp0hKy60KdTfMSK1g+w4QUajQkyDWpaxt3glWfAkk0ylLxeBw4isbTkHRI9ZYMxZcJg6SMJ5gaT5tvTNegyS+0oPxaymQZECg+qa0HX9dI6M/Eq8C0+kWD4oYafVHrcticUeio06LAhyMOLXBjX5SewUOQLeMRBHw/Nt/SOX18Oc0yuNRmX43iPBam3TosB1vG96acj9PDjLP23V8OwMW4rER1BD+iK4vKDk11fK1l68WOfsRs6ktd6f6YvxGxi4djsB3OsxTHy3/w9IfwNf8n440BILET+f7LnjZBrgBfeAAABhGlDQ1BJQ0MgcHJvZmlsZQAAeJx9kT1Iw1AUhU9TRZGKg0GKOGSoThZERRylikWwUNoKrTqYvPQPmjQkKS6OgmvBwZ/FqoOLs64OroIg+APi6OSk6CIl3pcUWsR44fE+zrvn8N59gNCoMM3qmgA03TZT8ZiUza1KPa8IIIwhCBBlZhmJ9GIGvvV1T91Ud1Ge5d/3Z/WreYsBAYl4jhmmTbxBPLNpG5z3iUVWklXic+Jxky5I/Mh1xeM3zkWXBZ4pmpnUPLFILBU7WOlgVjI14mniiKrplC9kPVY5b3HWKjXWuid/YSivr6S5TmsEcSwhgSQkKKihjApsRGnXSbGQovOYj3/Y9SfJpZCrDEaOBVShQXb94H/we7ZWYWrSSwrFgO4Xx/kYBXp2gWbdcb6PHad5AgSfgSu97a82gNlP0uttLXIEDGwDF9dtTdkDLneA8JMhm7IrBWkJhQLwfkbflAMGb4G+NW9urXOcPgAZmtXyDXBwCIwVKXvd5929nXP7t6c1vx8743KRRjbQVgAADfdpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4wLUV4aXYyIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOkdJTVA9Imh0dHA6Ly93d3cuZ2ltcC5vcmcveG1wLyIKICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICB4bXBNTTpEb2N1bWVudElEPSJnaW1wOmRvY2lkOmdpbXA6NDJlMTU3MGEtNmMyZS00Y2E1LWI3ZTMtOGI4ODI1MmMwZDMwIgogICB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU1NGY3N2UwLTc4NmEtNGFlZS1iYjhmLWNhYTBiZGNiYzE3MSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmNmMWYyMjUxLWIwY2QtNDE1NS1hMjAyLTExNGI0ZGM2MmFhNSIKICAgZGM6Rm9ybWF0PSJpbWFnZS9wbmciCiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09IldpbmRvd3MiCiAgIEdJTVA6VGltZVN0YW1wPSIxNjQzMDYxODUwNDk0OTc0IgogICBHSU1QOlZlcnNpb249IjIuMTAuMjQiCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9vbD0iR0lNUCAyLjEwIj4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODUyMGQ4YTMtMWRhZC00ZjIwLWFjOTktODg4OTJkZDExNDQ0IgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKFdpbmRvd3MpIgogICAgICBzdEV2dDp3aGVuPSIyMDIxLTEyLTE3VDE3OjIyOjQ4Ii8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAgICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJkY2U5N2M4LTBkZjItNGQzNi1iMzE1LWE0YjdmMmUyMjJiNSIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iR2ltcCAyLjEwIChXaW5kb3dzKSIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMi0wMS0yNFQxNDowNDoxMCIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3JpcHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz61xwk6AAAABmJLR0QAnQCdAJ2roJyEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5gEYFgQKOBb3JwAAIABJREFUeNrtvXl0lFWePv7UvlelKvu+koSQRQiyBJGISEB0hFYZwW1sp4/2csaZ1jlz5sz80cc5c7rnaI8zju2o09qiIrKowEGURXYI+5IASQjZl0plT2rff3/073O/byVVlUQSRPs+5+QkkMpbb9333ud+lufzuaJgMBgEBwcHxw8UYj4EHBwcnMQ4ODg4OIlxcHBwcBLj4ODgJMbBwcHBSYyDg4ODkxgHBwcHJzEODg5OYhwcHBycxDg4ODg4iXFw/GWAqgHHfv+ufyv8+q7XvVMh4rWTHBwc3BLj4ODg4CTGwcHBwUmMg4ODkxgHBwcHJzEODg4OTmIcHBwcnMQ4ODg4iXFwcHBwEuPg4ODgJMbBwcHBSYyDg+NHBCkfAo6/ZAiLov1+P3w+H/x+P/x+P4LBIDQaDWQyGR+oSYyjSCSK+G9OYhwctwiHw4Guri44HA54vV74fD72FQgE4Pf74Xa74XA44Ha74Xa7EQgEsGrVKqSnp9+2BTlT5EJETT+PJZxgMAixWMx+FwgEIBb/2VGjn4W/o78P9/qxPSXo2pFez0mMg2MSC7mrqwt/+MMfYDabYbfb4XQ64XQ64XA42HeHw4HBwUFIJBJIJBLExMRg4cKFSEtL+0GSmJAwxsLn80EqlSIQCIRYomKxGD6fD2KxGH6/n31un88HiUQCv98fcm26Pr2H0LIlkhLeg/B3RIbCa30XS46TGMePHn6/HxaLBVu2bIFcLg9ZXLRQpFIpDAYDDAYDW0RyufwHRV7ChU9kQeQhtHyInLxeL7OwyFoS/o7caCI1+k7XlEgkjIiEJOXz+SASiSCVStl9SKX/j2pEIhH8fj8kEkmI1Sa0Gqcy7pzEOH708Hq9GBoagtPphEaj+dF+zrEEJvw/oTtHxCMWi0NcTaG7SeQmvMZYt3Ts/wnJSPh9rLUVjqTGur1TITKeneT40UMsFsNoNGLjxo3IyMiAyWSCSqX6wca5JrLGxhIDEVYwGGRJC7vdDofDAb/fz6wocifJQqPfjf0/YZdYkUjEXHOKMXo8HhZ39Hq9zJqj1wvd1bEu6Fi3M1yMjVtiHBEhjJ0Id9ofOuRyORYsWIDS0lIMDw+js7MTp0+fxs6dO9HZ2fmjs8aE1pbQPZRIJBCLxXC5XLDb7VAoFFAoFAgEArDZbJBKpZBKpZDL5XA4HFCpVAAAp9MJhUIBh8MBpVIJt9sNsVgMmUwGt9vNMroej4f9rFarYbVaEQwG4fF4EB8fz0hOrVZDJBJBIpEwciNSI8KUyWRRkxGcxDjC7uCtra1wOByQy+WQy+VQqVRQKBSQyWSQy+U/WKmBSCRin0mn0yEtLQ2JiYmoq6tDR0fHj4KoiQCECz8QCDCioCwsEQK9zuVyQSwWQ61Ww+PxIBgMwmazQavVMotJqVTC6XSy10gkEuam03vp9Xq4XC4olUq4XC60trbCaDQiEAjAaDTC4XBAo9EwCzgQCITE5AKBAKRSKSMwipmNjedxEuOIGjf69NNP8dVXXyEQCLAFn5SUhOTkZGzYsAGzZ89mE+uHbKmIRCLIZLJpS/HfCRAG2YWkRmRAlo3L5YLNZoPNZoPX62UWkVwuZ1aWVqsNIUWynnw+HxQKBQvc0/WlUincbjdkMhmGhoZw9uxZdHR0YMmSJYiJicHQ0BBMJhMkEgm8Xi/kcjl8Ph/kcjl7HyI2IjBKBIyVfnAS44iIwcFBNDU1obe3NyQGUVdXB6/Xi6qqKvAzZe5sSzpcZpJcSrK+Tp06hT179qCvrw9xcXFITExEQUEBli1bhmAwiJGRESQlJUGpVIaQIhGX8FokrSC5RktLC7Zt24a6ujrIZDLcuHEDOp0OFRUVyM3NRUZGBrO2iGjpGmKxeFycLFoigJMYxzh0dnZiYGAgLFGFy0Bx3FkEJnw+JN4F/ixtcDqdzLru7u7GoUOHUF9fz17/wgsvID4+HkajEXFxcbBarRCLxZDL5ex6ZIUR6dB7+nw+RnLDw8N47bXXYLfb2bWfeeYZmM1maLVaJCcnM6kGWY6kVRNaaGQhC63+aCTGs5McCAaDqK+vR19fHx+MH+jzE36nBU9EQe4aiXiFmi0AuH79OrZv346+vj7o9XrI5XLY7fYQl1Emk41T7stkMhYzHR4eRjAYhFqtDiGejz76CDt27EBHRwcjV6HmjK5D90rvMzZ2F20T5STGAafTiaamJgwNDfHB+AGCLBdhjI8sHKlUCoVCAY1Gg2AwCLvdDrfbHfL3x48fx7vvvgsA0Ov10Gq1UKvVLFutUqmYJRYMBiGVShlRKhQKuFwuZrWNJdf09HRcvHgRVqsVEomEXUutVjO5BxEaxcjofYhEJ7LEuDvJgf7+fpjNZrjd7h+ldurHDmHsi6wbl8vFYkqk16LAvtVqDXsdt9vNpBcej4dlo+12O5RKJex2O1QqFcto0u9IIxYMBjE8PBxyzRUrViA7OxuLFi2CWCyGw+GAQqHA6Ogo9Ho9vF4vI1uPxwOpVAqXy8Vc12AwOGFWnFtiHOjo6EBvby8fiB8ohPWLfr8fLpcLHo+H/dvn8zEiWLx4Mf7t3/4NTz31FHP9qqqq8PrrryMpKQlutxsjIyNQqVRMsCqXy2G1WqFQKOB0OhEMBuH1elmxvMPhgM1mg16vx5tvvomKigoAwEsvvYSqqirce++9MJlMTIM2OjrKZBvkMlJG0uVyQSqVMtd3Mtnw226JCdW+Xq+X7RCUSpXJZCHp7+myDMYqgClYSfqZkEH5/0V/QrP5dlkowvEh8SDttDQJ6MFOxz35/X40NTVNSi8108F9YVaN5gZ9duHnp39zqzHUpaR5LRS2isViRkgqlQoZGRkQi8W4dOkSMjMz4XA4UF5ejtWrV0Or1SIYDEKv18Pj8UClUjHrTavVwuv1QqlUMq2YRCJh1lMgEEBMTAzmzJmDhx56CK2trbhx4waqqqqQn58Po9HI6i71ej3cbjc0Gk1I9pNcSYrZTfYZS2/XwvT5fLBarejs7ERrayva2trQ3d2N0dFRlnKVy+XQ6/VIS0tDRkYGcnNzkZycDK1WC4lEMqVJS+weCATgcDhgtVrR29uL/v5+DAwMoL+/H729vcwcFha1qtVqGI1GpKWlIT09HZmZmYiPj4dWq2Xm+nSPj9/vh81mg9lsRlNTE9rb29HZ2YnR0VF4PB6IxWLodDqkp6cjLy8Ps2bNgk6nm9S9KJVK6PV6iEQiuN3uEJPfZrOhoaEB/f39Ya9FAdaBgQFYLJawpn0wGIRKpYJOp5uy9oo+u9VqhdlsRktLC9ra2tDV1YWRkRF4PB42N7RaLVJTU5GZmYmsrCykpaVBr9dPeW7MVFzRZrOF7RgRzYIyGAxQKBTTcg80DiqVKkS2QBuzSCRCXFwcVCoVXn75ZfzTP/0Ts9JiYmJY0F8mk4Vs3nR/dH2aAySEjY2NZdcvLi5GRkYGHnvsMUgkEuj1eqhUqhBSJbIiMa5YLGbF4uRC3jEF4MFgEG63G11dXaiursaRI0fQ0tLC2p643W6mO6EBk0gkUCqVUKvV0Gg0mDVrFh544AFUVFSwwZoIPp8PnZ2duHz5Murr69HY2Aiz2Qyn0wmPxxPyJawdE04GqVQKpVIJlUoFrVaL/Px8LF++HAsWLEB8fHyIlXYr4+P1emGxWHD27FkcOnQIjY2NsNlscDgccLlcIeNDY6PRaFizvonuQSKRYN26dXjqqacgkUjQ2tqKX//61+z3Xq8XPT09Ua8jl8vx+uuvw2AwhCUpr9eLDRs24LHHHoNOp5vSZ+/u7mafvampidX0UTnL2LmhUCjY3MjOzsaKFSuwZMkSJCYmfq8VBWfPnsWHH34Ii8Uy6XlhMpnw8ssvo6ys7Jbm0tisJFmzwp+pjQ4RhE6ng9FoZNYuWfc0p+RyOUsAiMViuN1uqNVqZnAIu1PQ60ltTxsmCWz9fj+TUIhEIng8HiaspcQDbZZkRd4RJObz+dDb24vDhw9j69ataGpqYo3mxj4A4Q1TDdbo6CgAoLW1FdXV1ViyZAmeeeYZlJWVTbhz2Ww27Nu3D6+99hqkUmlYlzHaJCCT3Ol0soxdU1MTDh8+jAULFuDJJ5/E/PnzJ20JRQrGjoyM4OzZs9iyZQsuXLjASCva33i93oiB2bAPWCrFtWvX2HX7+vpw7tw5aLXaKd1vT08Penp6wv7OarVi+fLlcDgckyIxv9+P/v5+HDt2DDt27EB9fT0rRp7M3KDPT3OjoqICzzzzDObNmxeS4r+dMJvNqK2txeDg4KT/JjU1FT09PSgrK5uWuBiRFMXCKGBOJCSXy5kRoNfrWaAeADweD7Rabch4kzrfarVCrVbD6XRCLpezwL5IJGKB+pGRESiVypCMIs1ZymxSfE4ikaCnpwcqlQoejwcKhYLdR7iNmdZuJCt/RkjM7XajoaEBmzdvxvbt28e5lWRO6nQ6xvjDw8Ms7jF2wo+MjOCrr77CwMAAfv7zn2PRokVhU7pj/25wcBAxMTFhCdbn8zGrhlK65HaSeTv2ena7HYcOHcKVK1fw8ssvo6qqCkajccpEFggEYDabsWfPHrz33nsYHBwc1xDO4/Ew91oqlcJms8Fut7NJGe1zU5yRHnxnZyfbcbu7u9nPt1J2I4zd+f1+9PX1hYgcI8Hj8aCpqQnbt2/Htm3b4HA4QtxKCiTrdDooFAoWaCZCHjuODocD+/btQ0dHB1555RVUVFSwBXG7QELPwcHBkJq/icbPZrOho6Pjlls5U2BfSGD0M4HKeajO0eFwsPIichnJQhq7CWq1WvZ6ioGRYaBSqRhxk1VGsS8iOoqjUf1qY2Mj+vv72fpXq9VQKpVQKBSw2WxQq9WQy+Uhsetohsu0k5jH48GFCxfwhz/8AceOHWMmvt/vh16vx4IFC5CdnY2EhAQWz/B4POjp6cGFCxdQXV0dNmgtEolw7NgxGAwGmEwmzJkz5zs9eLlcjmXLlqGoqAgmkwlqtZotDqfTiZ6eHly+fBnnzp1jpRZj72NgYACvvvoq5HI5Vq9ePaXdPxgMwmKxYOvWrXjjjTfGuaUikQgZGRm47777kJyczMbIbrejra0Np06dQkNDQ1gC8vv9qKioQGFhYUjDOZ1Ox3ZAuVzOAq83b95kE3EiQvN4PHC5XGx3T0lJQXx8PEwmE2JiYpCWljapuVFbW4sPPvgAX375ZciCoU4T+fn5iI+Ph8FggEwmg8fjQV9fH86fP4+zZ8/C4/GMeyYSiQRXr17F//7v/yIuLg5z5syZVNhhOud8TEwMVqxYgYGBARYSiER4LpcLGRkZKCwsDGkcOB3upNPpZIXVtFELyUcikbD6SHL/iPjGEhhtFB6PBxqNBl6vl20sJFAlN9PpdLKYl7BUiLKQSqUSwWAQPT09sNls2LNnD27cuIGnn34aS5cuZfer0+ngcDhYsoAqDW5b7aTf70dtbS3eeOMNnD17lhFYIBBAXl4enn76acybNw9JSUkwGAzMRw4EArBarViyZAnS0tKwa9cu5nsLoVAosHPnTpSVlSE1NRVGo3HK9xgXF4eNGzdi/vz50Gq1ISRCVl9TUxP27t2L7du3M0thLJG5XC689957yMvLQ0lJyaStGrvdjgMHDuDNN98MG8NRqVRYv3491q5di9jYWDZGPp8P/f39KC8vx8cff4xz586FHf/09HSsXr0a6enpIVlMcn0XL16MrKws9PX1wWKxoKmpCUeOHEFra2vESRIIBLBy5UoUFxdDq9VCo9EgJiaGiSI1Gg0MBgNiY2Ojzo3Gxkb86U9/wrZt20LcTqPRiBdffBHl5eVITU1lwW5aDDabDUuWLMHu3buxa9eusO60TCbDiRMnsGfPHqSnp8NkMt02ElMqlVi+fDlKS0vR0dGBd955B7W1teNCGHa7HZWVlbj33nuRnZ2NxMREVoozXa6kRCKB1WrFwMAA7HY71Go1tFotDAYDtFoti3+5XC5mnZEVR9YSuY+0YYjFYthsNvY+9DyFbit5KqOjo1CpVEzN73a7YbPZWNueEydOsHlG4tbOzk5kZ2dDo9GwzCfFy4RdYG+LJdbW1oZNmzbh0qVLIW/qcDiwdOlSrFq1CklJSWHTwwaDAQsWLIBUKkVvby++/fbbsItcJpPh4MGDWLx4MWJiYqZkjYlEIqSkpKCkpCQsAUokEphMJhiNRphMJvT29mL//v1h41QikQhNTU346quvkJeXN6mOoX6/H3V1dfjwww8j3ndMTAzuvfdeJCcnh7xGKpUiKSkJK1asgFQqhdVqDal/o7E5fPgw4uPjsX79emRkZIx7n8TERCQmJgL4cxuW5uZm9Pf3o6mpKaL14vP5sGbNGtxzzz3M1J9K62ayPrdv347t27eHEJhIJMLs2bPxyCOPICEhIew463Q6FoNsaWlBdXV12BinWq3Gl19+iVWrVsFgMNy2jhtisRgJCQlQKBS4efMm3G73OEmP0+nE+vXrsX79ehQXF0957k40vmKxmJGO1WrF5cuXUVNTA5lMhlmzZiEvL4/Fk4WCVgrIk6SChKs2mw0ajQYSiQROp5PNF51Ox1r2kOXX2dkJsVgMhUKBffv2oaSkhM0zkUiEoaEhRq4XLlzAJ598AovFgueee471FqPNklxI8iSEh4zMOImRiXjkyJFxE8xms6GgoGDCYLJYLEZRUREWL16M8+fPh7WCZDIZjh07hps3byI/P39KrpxMJkNZWVnYONnYhZOZmYm1a9fi9OnTEctxAoEAjh49iscffxx5eXkTTkqn04mvv/4abW1tEeUMubm5SElJiXgtpVKJiooKXL58GZ2dnSFui0gkQl9fH9566y1IpVI8/fTTiIuLi2pBxMbGsh060gIRiUSIj4+fdHY43Oc+fPgwtmzZMo7sRSIRSktLodfrJ7xOTk4OVq5ciWvXro1ThhMGBgZw9uxZFBUV3dbYWE9PD7755ht89NFHaG1tDZkjCoUCf/u3f4t169YhLy9vwnjudwUFxWNjY1FQUID29nacPHkS/f39OH/+PG7cuAGFQoGenh4kJSXBbrcjMzMTZrOZlQRZLBYYDAZYLBYkJiYyAjEYDMydbG5uZhsZSZcozLB161ZUVFQgISEBCQkJEIlEIZZYbW0tW082m41ZhGKxmMkthPKQ20pily9fxsGDB8fFAoLBIDObJ6OHUavVyM/PR3Z2Nq5evRpxsdfV1WHp0qVTIjGFQoHy8vJJpeIlEgnKysqQm5uL8+fPR3zd0NAQGhsbkZubG5XEgsEgzGYzTp48GTEGIhKJMGvWrAk/k06nw4IFC/Dtt9+OG2+aBJ988gkKCwtx3333hY11jI2nTDbu8l2ysG1tbdiyZUvYeJZYLGYxvMlkWufOnQuj0RiRxCh2+vjjj7Ns2UyCmknu2rUL27ZtQ3d3d8hRZ2lpaXj22Wfx4IMPIikpaUasw7EF1S6XC7GxsdDpdKitrcX+/fvDzu8lS5agtLQUPp8PhYWF2LRpE44ePRryOoPBgLVr18JoNGLu3Lk4efIk/uu//ivq/dy8eXNS9221WiGVShETE8NE3BSnE3azELYECvv5p2MQR0ZGcPToUTQ1NYWdxDk5OTAajZPW8aSlpSElJSXiwlEqlbhy5cqUpAYUe5mIbISLQavVYt68eVFf73Q60djYGFUaQePQ2NiIgYGBqO85a9asCXceshQjWS9isZi5wpPJGM4k3G43Dh48iIaGhrDjKJPJkJKSMqm4EIUD4uPjoz6T5uZm9PX1zXiFgd/vx7Vr1/D+++/j448/htlsDinGLisrwyuvvIL169cjJSVlxtxbqpkk6UNsbCzcbjeSkpKwcePGca/XaDRYs2YNli1bhr6+PqSkpOD06dOoq6sb91qXy4UzZ87g5MmT2L17N06dOsWe22R0ipGeIwAUFRUhMzOTGTdUckRZeMq0C09YmjFLrKGhAbW1tcx3HhtPyc3NnZIuyWAwQKfTRZyElI0aGRmJKBWgwyFInxIMBpmvPtlAqlQqRU5OTtR+Wh6PB52dnaxdSTQSu3HjBlwuV9SHGxsbO6mJodFoorolMpkMx48fx9DQECv5uN0g6/Obb76JSPJGo3HSn5kSH/QMI13T7XbDYrEgPz9/RjOSNTU1+NOf/oTDhw/D6XSyz6BUKrF48WI8//zzmDdvXlRLeLosMdKBUb1jeno6nE4nrFYrMjIyYLfbYbVaWZaS2udUVlbigw8+QGNjY1jr1ufzYXBwkMWq4uPjsWLFCmRkZMDn8+HcuXNhyQ8A4uPjmdRJiOTkZDz++ONYu3Yt5HI5qwTRarWw2WxQqVSsnz+pF6KNoXS6dqOxQWbhw05PT5+S26dSqaKeRiMSiTA4OAibzcZ2obELuLCwEC+99BKGh4cxOjoKt9uNysrKKZV4kKYm2gILBAKw2+0T7vper5fptSZyeSezoCl+MJGFbLPZvreGhoFAADU1NRFFshRq0Ov1kyZZsVg8IYmRmHamPrfdbseZM2fw7rvv4tKlSyFSnNjYWNx///147rnnkJubO+NSDyIXuVzOOk9IpVIMDw8jNzcXPp8PjzzyCLxeL86fP4/z588jIyMDP/nJT6DX6zEyMoLKykrY7fawJJaZmYmHH34YMTExuP/+++F2uzE4OIji4mKIxWK89dZbaGhoCGspPf7443C5XPjggw9C/j8rKwv33HMP8vLyWMyQEg2kSaNWQH6/H3K5PKqu8ZZHeGBgAG1tbSwDEY7E9Hr9lEpCpFIpS9NGmqik3BZW6AutlHvvvRf33HMPGwiqkp9qUHUiUiGR5kQLxufzYWRkZEK3cybqMr8vkGYwkksbDAaRkpIypYUuEokQExMzoeC3v79/SnWMkx3L0dFRHDt2DK+//jo6OztDmvbl5ORg3bp1eOyxx5CQkHBbrF+huFTYl56ErPHx8cjNzcX169cZ2RYVFTFLTKlUwmAwRDz1aXh4GPX19UhNTUVnZyckEklI4XZycjKKiopQV1c3bm673e5xvcsAsMy2xWIJCe8I+4mRrEJ4DuaMWWIWiyXkYYabyFMtcpXJZNDpdKyHUaQJZbfbI05UYfHrrU6S6dwxp4t0hMfPT7QhfF8YHh5GXV0dK+IO9xmmGisSi8UwmUxRn20gEGCdRqfTquzv78fXX3+N//mf/wlxkQKBAIqLi/HMM89g1apVt1SOdqtxMap6IBJJSkrCgw8+CLlcjtraWqxduxaJiYnYvHkzBgcHsXz5clRXV0OtVrNSPyEGBwdx/PhxFBYWQqFQQK/Xo729HVlZWcjKyoJUKmWHgIwlsUhr0Ol0wu/3Iykpid0r9Q3zer0sHkZdLMJ5W9NOYi0tLREnokajgcPhgMViCTtIkR5IJMWzcHGSOzmTu9x075iTcVUms/ioTU80mEymcfVwtzMe1t3dPWHyheJmkw03UC1ftDGiutTpssT8fj+6urqwY8cOvP/+++OsC4/Hg4ULF+L++++flFRkpghMqMonz4i6n6SmpqK8vByZmZnYtm0bE0srlUqUl5fDbDZHdPtJMaBWq9HS0oL8/Hx4PB44HA50dHSgr68v7Dr8v//7v4gxy/7+fvT39yMmJoa13yGBq9PphF6vZ4F9KiSfEcU+mdfRerNrtVrs2rULNTU1k7YKvF4vrl+/HlYnNlOuElXQU00Y7WjTFVOSyWRsx4q0uCiDWVlZOaH7bbVaw5rqwok9b96879QeZ7rQ398fNZEhlUrx9ddfo729fdJzIxAIoK6uLupnp9dNx5yw2Wy4fv06tm3bhh07doSNacpkMly5cgVms5m1tLmdoK6oSqWSzV+j0cjKjiQSCXQ6HfLz80MIDAAOHDiAAwcOTPgcP/vss7C/e/XVV5GZmYmWlhbEx8ejoKBgnEwjnGGjVqvR29uLlJQUphOjMyspRjr2WLgZscSoOHd0dDTiQhGLxWhoaMDVq1envOhnavEFAgGMjo6yoL/NZmP9oOx2O2vIR6Uy07EgZDIZCgoKoFAoIgb3g8EgTpw4gXXr1iE1NTWqBdXV1RXVWnU4HFiyZMn31tWBVPrhMtZCdHR0oLm5+Y6ZG0LL2e/348CBA2htbcXJkycjWr4SiYSdKJ6cnAyTyXTbrV+hKyaRSFhwnCyZtLQ0WCwWFBQU4ObNmxGtru8SMqAOJElJSSgvL5+QxEZHR9Hc3AyxWMzKr6ioXFjHS7WTwkNKZoTErFYrq3CPFseYrsZvtxrTaG9vR0dHBzo7O9HV1YXOzk40NTVheHgYIyMjzA0hf5yaut0qxGIxysvLERsbG5F8gsEg6urqcPDgQaxfvz4iARG5RqokoELw8vLyGU/vTzTeE1lMd8LciEbEb7/9NjsBPRrkcjm2b9+O0tJSrFq1asZU+dHcbOFp39Q0gIqzVSoViouLUV9fH3G88/PzsXTpUjQ1NSE2NhaXL18Oq/0UgpoUxMTEID09HR6PBw899BD27NkT1Yvw+/0oLCxkB4bQGNIp4sJ4Gp1rOSOWGPmsE1kq4RoP3iomK+KkAtMLFy7g6tWrqKurQ01NDfr7+1nLHcqCKJXKGVv0YrEYubm5ePDBB/Huu+9GHA+73Y4tW7ZAr9dj+fLlYUukLBYLrl+/HjXGuGHDBqSnp39vriRJTyaK283E3LjV1jZjXZ/Jwmq1YuvWrSgoKEB+fv5ttcaEqn06kIMaD9L/0XFskZ7Jxo0bsXr1aly6dIklzp5//nl88MEHmDdvHlJTU/HGG2+E/M25c+fQ1tYGuVyOnJwcLFmyBCUlJSgpKUFvby/ef//9ce8TExODnJwcpKSkMK+HLDFhQwbhwbpR3enpILFoD0skEuHv//7vcffdd09L2xEhkpKSolpJIyMjqK6uxsGDB3HmzBm0t7ezBx5ucgp7t48dyOmAWq3GI488gpqaGpw8eTLiAmxqasI777yDxsZGVFRUIC0tjYn+LBYLTp48iYsXL4aKXQI8AAAa20lEQVS9L5/Ph1/96ldYunTplBbgTIA690azHv7u7/4OCxYsmNaurGRBT6c1JJVKkZaWBrvdHjUGfOnSJezcuRO/+MUvJt3ldjpAGzF5EdQfn8IXMTEx8Pl8KCsrw7p16zAwMACTyQSVSoWenh588sknKCkpQUFBAbq6unD+/HlYLBZcvHgRQ0NDaG5uDqsj27ZtGwAgNzcX2dnZWLJkCbv2119/HfZedTodEhMTWRss6pFHWUmKi1M9JT3TGSGxiYLrtCPm5+dj/vz5005iwg859n17e3uxe/dubN++HS0tLczEHvvgVSoV1Go1a9eblpaGzMxMFhBvaGjAtm3bpuW+KQbw61//GsFgEGfPng27KwYCAdy8eZPVWpLi3ufzYXR0FO3t7eOsMCqT2rBhA9avXz+uC8b34YpNJAPx+/3Izc1lqvbpmhu0CU1XgF2n0+Ghhx7Cxo0bcfXqVbz66qsRY31utxsHDhxAaWkpqqqqbqslLNyAybIRlkHJZDIYjUYkJSXB6/XCYDBArVbD4XCw1ljkOlutVla4L5VK0d7ejosXL0YleWqbPjg4iMHBQXY9av1DaGhowI4dO+D3+7Fo0SIYDIaQeUNERvN3onlxW0REVOZwO7I2dKjF559/jj/+8Y8YGhoad2qKTCZDeno6CgsLUV5ejtmzZyM5OZk9SLpPn8+H6upqNuDTFYAtLi7GP//zP2PLli04dOhQxBS13W6fMCFCu25eXh7Wrl2L1atXs+4Bdzqo/xWpzO9EJCUl4cknn8Sjjz6KuLg4xMXF4cKFC9i+fXvYMQ4Gg2hvb8euXbuQn5+P3Nzc2zaW1KyQOkdoNBrY7XbIZDLWMTU1NRULFy6E3+9nPeHcbjdMJhN8Ph88Hg8yMzPxwAMPsBbWcXFxsNls+N3vfhfVy6D+dzqdDpWVlUhMTIRGo0FNTU1IBpQO66FzKmUyGVQqFSudstlsrOyQRLwzqtifjMs5WWHmdMDhcODIkSN4++232VHsY62vefPm4Ze//CVKSkqYjirc8VBk4k43IchkMhQVFeEf/uEfMHv2bLz33ntoa2tjD2misQoGg1AqlTCZTMjIyEBZWRmqqqpQVFQ06bKl22kdRPvd7Zwb3yVY/vOf/xwPP/wwDAYDRCIRTCYT1q9fj0uXLqGxsTHswqKawr179+KnP/3pbXHricBIGkT1h3q9HqOjo8ytpP+z2+3YvHkzAoEAnE4nurq6WFdY8kyo46rL5cLly5cBABkZGVAqlWhvb2cH9GZnZyM9PR3JyckIBoOIj4/H4OAgSktLAfw5A11UVMRO7woEAtizZw/uuusuLFy4kAll1Wo1bDYbvF4vC/BTsiJauOGWSSyauUwN2sIdEDJTweSuri68//77YQkM+PMBCVVVVVi8ePFt1/OMJSJSKdN9BINBZGdnIysrC06nk53ORONMrYb1ej0rJ7nrrruQlZUVtdb0+yKviU6toflxJ5JYMBiEWq1GaWlpiAKfpDJPPvkkfvvb34ZtLwT8Wel++PBhlJSUYOnSpTM616hUhwLj1BlVp9OxVtSUoTQYDKyffV9fX0iGm7KGVLhN9adUOSMWi7Fq1SqkpaXhyJEjOHToEKRSKe655x6UlpZCq9WyInS9Xg+fz4fKykpIpVLU19djx44dOH36NHs/m80Gi8XCjt6jBph00hg9BwpDzYjYlVrQTrRDDA8PM1NxJuHxeHDq1Clcv3494qTR6/VTaic9U2Tb09OD3bt346233mIq/bKyMjz11FMoKSkJObqM3C6qc4uNjYVer//eNGCTJTFq/x1JZiEWi9Hd3T2jVRe3SmThLHStVovKykpcuXIFW7duDZvRFolEuHjxIvbt24ecnBxkZGTM2H1S7aRwM6QgOWUjqU+9yWRCa2srhoaGxukV6YxX6oOWkZHBsswAsHnzZqSlpaGoqAg9PT04dOgQOzuTevvRe1O1gM/nw3333QeTyYRvv/025P1u3ryJq1evsvbmUqk0pO+/MCY2Y2VHcrkcGo0maoZQLpeju7sbdrt9xrM1drsdR48ejbrraTQa1p75+1oYPT09+Pzzz/Haa6+xNrw5OTl4/vnn8cADD9z203pmAhKJBHFxcawdcqTXXLt2jVkLPxRQX7NHHnmEdXAJF9MTiUQ4ePAgiouLsXbt2hlzK4VF6PSdPB+hy07F1FqtFgkJCeP0ij6fj204QguIDJDOzk52buyRI0eY4ZCbm4v4+HjWA1AYIqCDRgKBAObPn4/6+nq0tLQA+LPUQq1WsxPQ6LRxiuvROp7Iir0lc0SlUiE2NhZGozGiS6BWq3Ht2rWIwszptG6Gh4ejBsJFIhEj3e+rnnB4eBi7d+/Gf/7nf7KHI5fL8Td/8zdYtmzZHUtgUx0vkUiE9PT0qAtXJBKhvr6etTf+IUEul6OkpARr166NGK8RiUQwm83Yu3cvrl+/flvqfMlyJOtF+J2ylmq1GiaTCb/5zW8wb968cZ4VdZOgmDAdqfbiiy8iLi4OZrOZkd1zzz3HTpgXKu3pO1ljfr8fxcXFIWdbkLXmdrsZ0dHf0f1OJk4svtWBS0xMRE5OTsQ3kUqlOH36NBobGycsQZkOgphIIS7MPk73wp0IXq8Xp06dYoWxdBry8uXLsXTp0u+leHgyY0CC5qnErujouYmsj6GhIVRXV0/YZ+1OhMlkwrJly1BVVRWxRlQul+PIkSM4cOAALBbLjLmTwu90IjcRk1gshlwuZ7/XaDSoqqrCo48+iqysrJC1Si296QAPoQi8srISKpUKmzZtQlNTE1avXo17770XarWabb4k5aDvZPmlp6dDoVDgvvvuY6di9fb2MheXOsUS8Qld0onW4i0HhjIyMjBr1qyIOymdiLJ//35YLJYZDeJOpljb7XZPesH4fD60t7dPWzGx2WzG1q1bmeyD3iMxMfF76zZBuqBoMYeRkRE4nc4pj0NKSgpmzZoVVT4RCASwd+9etLe337FZymhEnZeXh6qqKhQUFEQcH5lMhi+++AIXLlyYkY1c6CqO7S9G+kiKmZFoOjs7e9wBMeROKpVKFpui11NHFOE8IT2Y3++Hy+UKEdxSTI6ObVOpVNDpdEhOTkZhYSF+//vf45e//CWKiorYGaOUmKBeYpM97eiWSSwpKQnFxcVR40wKhQIHDx7EwYMH2WnOM2XiT9TA0Gq1YnR0dMIF4/F4cPz4cezatWtaSCwQCODcuXPj3F2lUomzZ89i3759uHLlCpqamtDS0hL1q62tDd3d3RgcHBx3PNhUoVAoJnWgxuDgYMS+YJGgVqtx//33R42FBoNBXL9+HV988cW4NsY/BCgUCixevBgPPPBARLdSLBbDbDZjx44daG1tnXbXWajUp5gUWdB0+AZZ/R6PBwqFAhaLBWq1OsT6l0ql7BRumUwGp9PJ4mHDw8MsAE84c+YME5zTKd/UeJHOj3Q6nawmUiaTMX1YbGwsiouLkZCQwN6L3G3KtAqPcIuGW5ZYyGQyLFy4ECdPnsTBgwfDLiiRSAS3242PPvoIcrkcf/VXfzWllsQ02SnIaLfbodVqQ7JCpOGZSDQ5NDSEq1evIjs7O6JY0Wq14uDBg/j000+ZPmYy9zaRBXj+/PlxQW6JRIKGhgb88Y9/RHJy8qTidTRxaHeLiYlBVlYWcnJykJ6eztrBTMayk8lk0Gg0bPcNB6PRiPPnz6OysjIiIYVLgUskEixcuBDz5s3D4cOHI05Gl8uFnTt3Qq1W44knnkBcXNyUrFIaf6/Xi8HBQSa6jBYEp0Uymc1H2BAgHOLj47Fy5UrU1dVFLCdTKBQ4duwYysrKkJCQAKPRGPWaU7XEhEedAWDta8iqoV5jIpEIIyMjiImJQWtrK1QqFf71X/8VmzdvZjoylUrFBKfAn7tOkOBVuOao+zL19ouNjUUgEGDWHx3xNjIywjRlCxYsgF6vR05ODtOVCYP31KaaVA+T2aAlv/nNb35zq4NIRcpNTU0RA/gikQijo6O4ceMG+vv7Q8xTYVaFvmjyeL1e2Gw2NDc34+TJk/jss8/Q3NyMnJyccQvK7/fj9OnTMJvNUcnE5/Nhzpw5bBei9/N6vWhubsZHH32ELVu24MaNG+wE5WhugF6vR2lpaQgBjZ2gTqcTu3fvRnNzc9gHMzo6iq6uLrS1taG1tTXqV0tLC5qbm9HY2Ii6ujrU1tbi8uXLqK6uRnV1NQYGBmAwGNjhp9EWikQiQXd3N65duxaxoFwikaCjowMlJSWsnbTwOXk8HvT19cHj8YTIPiieEh8fjwsXLkS1wh0OB27evIne3l7o9fpxm9zYuSHs99bW1obTp09j27ZtOHr0KMrLy0MOZaVSFqvVis7OTly+fBn79u3DqVOnInYUoVY8wsNiqcaPel0JXxsbGwu73Y6GhoaoLZJaW1vhdrvhdDpZtcJkzkuYbFB/rHVGandhyZ9SqYTT6YROp0NnZycOHTqErKwsVFZWIicnh/UhE76exmJ0dBRbtmwB8Oce+gsXLkRpaSmSk5PZ+5IrSC4iWX50Xujdd9+N7Oxs6PV6Nj8phiZssy3sZDGjtZNkhi5fvhxmsxmbN29Gd3d3RAbt7u7G1q1bceLECZSUlGDBggXIzMwMaSbn8XgwMDCA7u5utLS0oLa2Fr29vRgdHUVvby+efvrpcbsoFf2uXLkSly9fjpgJ8vl8OHHiBABg7dq1yM7OBgD09fXhwoULOH78OBoaGuByuZCRkYHVq1dDq9Xit7/9bVgrLxgM4tq1a3j55ZeRlpaG0tJSFBYWYu7cuezBksUTFxcXto3vrbioRL52ux1dXV2oq6vDxYsXsXv3bqxfvx4rVqxAfHx8xGQG1bZmZ2ejo6Mj4mvsdjt+//vfo6OjA/Pnz2diRrPZjIsXL+LatWv4xS9+wYK2wrlx11134YUXXsDbb7+Njo6OiBZwX18fvvzyS1RXV6OsrAzz589HdnY2jEYjG3uPx4ORkRF0dHSgvb0dtbW1MJvNsFqtGB4eRmlp6bi54Xa7UV1djU2bNsFsNsNms2F0dHTCppsikQifffYZvvrqK1a0vHLlSjz22GPjtGEKhQIrV67ElStX8PXXX4d1velw448//hhffvklYmJiUFJSgmeffRZFRUXT4laOXXdj5RfCnylbT38XyYsS1qLSPFq2bBkyMjJQWlrKqhmEmdGx7ynUylHGU/j7sXNiKhbqtJUd6XQ6PPHEExCLxdi1axeuX78e8WacTidu3ryJlpYW7Nu3D3K5fFwLDuqySt9pB3Y4HBGb4lH24+jRozh+/HjEhet0OnHo0CFUV1ezyUilDm63GyKRCCUlJXj00Ufx8MMPo6enB1u2bEF7e3vY9yULrrW1FdXV1dDpdHjttdeQlJQUcgjCkiVLcOTIEXR3d89YEJ9aM4+OjuJ3v/sdamtr8cILLyArKyvibp+bm4u7774bNTU1UQ+lbW1txZtvvgmVSsV2W4/HA6fTieTk5IjkrNFosHr1aohEInz66aeora2NqMB2uVxobW1FR0cH9u/fz+aGMH0vnBderzfEchc21RMuWpvNhp07d8JkMk1pPO12O+x2O3p6etDV1YWCgoKIzy4pKQnr1q3DjRs3UF9fH3Ejt9lssNls6OnpYY0LpyuwL5wH5NKR4JhixnRASG9vLxITEzF//nxs2bKFNTiUy+UsZENWslwux+joKPx+PxYuXIif/vSnjMD0ej1cLhcjJgrQe71eVgsplG5QDFZ4yA49Q7FYzP6O/l+YtJhREiO38sknn0R6ejoz1zs7OxnpjL0Jv98Ph8MRcUekD+nz+WAwGJCfn4/Zs2dj0aJFYWMzYrEY6enp+NnPfsa6pAr97bHvTZNJSJxpaWksbV5RUQGVSgW/349Vq1bhv//7v6NKBugamZmZISfC0L0tWrQIP/nJT/D555+zHkwzRWbBYBAOhwM7d+6ERCLBSy+9FDH5olKpsHr1anR1deGLL75grk6k+BXJCYTuZGFhYdT6NoPBgIceegiJiYnYu3cvqqur2dkMkeYGlV5NNDc0Gg3mzJmDwsJCLFq0KMSVpJ3fYDBEbQ0+GahUKqSkpESMt4nFYtx9991Ys2YN2traJjwngor3w/WM+y4WmPA7PQuKLQndfJPJhJ6eHhiNRoyMjGD//v1sPqrValitVtaskO7RarUyly8jIwPp6elIS0uDwWCAw+GARqNhr6dsN1nPRHLkPpOrTqRFMUciMGEs77acdhRu1125ciXy8/NRUVGBK1euoKamBteuXcPAwADkcjn7kMKJRjupx+OB2+2GXq9Heno6Zs2ahZycHGRnZyMnJwd5eXlITEyMuMgUCgUWLlwIpVKJgoICnDhxAjU1Ncw3F/4dpYZlMhnmzJmDefPmYf78+Vi0aFFIQ0GtVov58+ezBAUtILIG6IGQWLCgoGDcxBSJRDAajXj66aeRkZGB6upqnD17Fl1dXSHjMJnj3+h64RZ/OCtx//79KC4uxuOPPx6RaLKzs/Hss88iPj4e3377Lc6fP88Cs8K4GhE1dT4oLS3FvHnzMHfuXKSnp084N5YuXYrs7GwsXrwYV65cwaVLl1BfX4+enh4m9xgbxxO6zW63G2q1GhkZGcjJycGsWbOQmZmJ3NxczJo1C0lJSePcfqlUCqPRiIULF2J0dPQ7bxwmkykkRBAOSqUSa9aswfXr13HlypUJn2FiYmKIAHQ642LRXpuQkIDu7m4AwD/+4z/i+vXr0Gq18Hg8rOaSepK53W4YDAbY7XZoNBrk5uYiLS0NRqMRXq+XxQ0VCgWzlMcSvVKpZLFM6psv1IURWVFgn/5+MhILUXAGxTlerxc9PT3o7OxEd3c3LBYL+vr60NPTw4SpVBeoVqthNBpZ5sZkMrHWJwkJCYiNjZ1SG2OqT2xsbERLSwtrRd3f38+yJwkJCUhPT0dqairS09ORlZWF1NTUcQ8gGAyiubkZb7/9Ngua63Q66PV6KJVKRswkFkxJSUFJSUlIOnrsuNTX1+Ozzz7DRx99xIjF4/GgqKhoQoGo3+9np1zX19dDIpHAaDRGtRCWLl2Kf//3f0dKSkrUa/f397PSEBozCtpTd9DU1FQkJSUhKSkJqampyMjIYH3SJwufz4fe3l50dHSwk3b6+/thNpuZW0P3Tqn9sXMjNjYWSUlJrLnfRFlpOnvxu0IikbCOpBN9tvr6egwMDEx4Ta1Wi7vuuuu2NyMgGQXV5w4NDSE2NhaxsbHs1CEhKZJO8OzZs/jwww/xyiuvoLi4OMRlFc63scQj7G1GRDbWDSZyGyvenYicZ5TExi5cii84HA54PJ6Q5mcSiQQKhYKpf1Uq1bT0Xqc2u1arlXXUoMFTKpWMjCaSNjidTnR3d7NdQi6Xs6OmKOBJX8IYTjhYrVacOXMGX3zxBfbs2cNOq/nZz36GqqqqCQu7yRK02WwYGRlBV1cXzpw5g8OHD497+IT8/Hz8y7/8C5YuXTqpcXM4HGzMXC4XM/lJkqHVaqHRaKalqN/n87G5Ybfbw84NcnWEc+OH0DPt+4BwSRMpENFQmQ+51XSoCB1yTfOTxpsSI7QG2tvbcenSJSxbtgy5ublMviEs2g43/8jVJIuaYqrCLP7Y7OodR2Ic/69h4969e7F161ZcvHiRNYP767/+a7z44ovIy8ubdLqdTHdqmVxdXY133nkHZrN53DUSExPxq1/9Chs3buSL/0c6t4TPVZhtHKt1E/6brB/aNAKBANvoqbsxhUwoQUAaMq1WO2kLkkiMAv/kgQl1YtG6Vsy4xIJjcpNscHAQn332GZOhUNKgvLwcGzZsQE5OzpT0QlQTJ5fLERMTA6PRCI/Hg1dffXXcdUjIyPHjRDSJArl3RBjCwDllMYWlSkJyoUA9NSaUyWQsuzjZzVBocQm7U9A9CX8vJLDJXl/MH//tgd1ux44dO/DJJ5/AYrGwB+n3+/HEE0+gsLDwllo0i0QixMfHo6ysDLNnzx4nd5gudTjHD88yo+9EZmRVkUsplDdQkJ2sNLKcqGssvWYqAl3hXAynVxMmqKZKYJzEbhMCgQBOnjyJL7/8MuSkHK/Xi6VLl6KsrGzaeq3pdDqkpaWNIzGlUomYmBhOZH9BltlYIiOrhzRcwsaDwt+PJRXhwbzkFk7GjSQCFFqBdF3hKUZj7yGcaDcauDt5G9DX14e9e/eOKzlyOp2YO3cu4uLippUwSbArRExMDKtO4PjLcjHHumnkQgoJayzJjH09ySfIgpvobE+y7sIduUbXFXaiDXfPnMTuINTX1+PmzZvj0vukXp7Ok37sdvu4wL5EIkF6evqMtkjm+GEQmpBEwv0uHMZ2WJ2MFRbNWruVEiPuTn5P6OjoCNtmRqVS4caNG+jr65uWXlpOpxOdnZ24ceNGyAQymUyszzkHx48N3BK7DYh05qZCocA333yD2bNnQywWIzExESqVakKdmdCS83g8cLlcsNvtaG1txbFjx0LiYSKRCA8++CAqKyu/19OdODg4if2AQQcpUJmHkGD8fj/+4z/+AzU1NVi0aBGSkpKg0+mYkFTYOYDiB1SsTp0bzGYz6urqcPr0aSbdoKDqk08+iQ0bNkxr3I2D445ylbnYdeZhtVqxadMmvPPOO7DZbGGtLLfbjdHRUbhcLqSlpSE3NxdGo3Fc5UIgEIDVakV3dzfq6upYsa5arWYF5S6XC4mJiXj22WexZs2aKQloOTg4iXGERVdXF/bs2YNNmzahpaUFCoUiIrEIW8uE6/MUTqdDWUmVSoU1a9ZgzZo1mDt3LhISErisgoOTGMf0YHBwEE1NTTh+/Di+/fZb1NTUAAgtuZgM4QibzpHyurCwEPfccw8qKiqQl5eHhISEsIe6cnBwEuO4JVCt48jICLq7u9HW1oabN29iYGAAFosFPT09zK0cK8mQyWRQqVSse0RcXBzrypqamsoOI53pk9Y5ODiJcYQ09aN+ZG63m50BQL2XhK+nDhl0QpGwa4awMy4HBycxju+N2ML9HPLAvoOimYODkxgHBwfHHQqed+fg4OAkxsHBwcFJjIODg4OTGAcHBycxDg4ODk5iHBwcHJzEODg4ODiJcXBwcBLj4ODg4CTGwcHBwUmMg4ODg5MYBwcHJzEODg4OTmIcHBwcnMQ4ODg4iXFwcHBwEuPg4ODgJMbBwcHBSYyDg+MvCv8foPuErXNuO3cAAAAASUVORK5CYII=";
+
+ public static class AbortedLaunchException extends RuntimeException {
+ // yee
+ }
+
+ public static HTMLElement rootElement = null;
+ public static Minecraft instance = null;
+ public static void main(String[] args) {
+ registerErrorHandler();
+ String[] e = getOpts();
+ try {
+ try {
+ EaglerAdapterImpl2.initializeContext(rootElement = Window.current().getDocument().getElementById(e[0]), e[1]);
+ }catch(AbortedLaunchException ex) {
+ return;
+ }
+ }catch(Throwable ex2) {
+ StringWriter s = new StringWriter();
+ ex2.printStackTrace(new PrintWriter(s));
+ return;
+ }
+ run0();
+ }
+
+ private static void run0() {
+ System.out.println(" -------- starting minecraft -------- ");
+ instance = new Minecraft();
+ instance.field_6320_i = new Session("Player");
+ LocalStorageManager.loadStorage();
+ run1();
+ }
+
+ private static void run1() {
+ GL11.canvas.focus();
+ GL11.canvasBack.focus();
+ instance.run();
+ }
+
+ @JSBody(params = { }, script = "return window.classicConfig;")
+ public static native String[] getOpts();
+
+ @JSBody(params = { }, script = "window.minecraftError = null; window.onerror = function(message, file, line, column, errorObj) { if(errorObj) { window.minecraftError = errorObj; window.minecraftErrorL = \"\"+line+\":\"+column; javaMethods.get(\"net.lax1dude.eaglercraft.Client.handleNativeError()V\").invoke(); } else { alert(\"a native browser exception was thrown but your browser does not support fith argument in onerror\"); } };")
+ public static native void registerErrorHandler();
+
+ @JSBody(params = { }, script = "return window.minecraftError;")
+ public static native JSError getWindowError();
+
+ @JSBody(params = { }, script = "return window.minecraftErrorL;")
+ public static native String getWindowErrorL();
+
+ public static void handleNativeError() {
+ JSError e = getWindowError();
+ StringBuilder str = new StringBuilder();
+ str.append("Native Browser Exception\n");
+ str.append("----------------------------------\n");
+ str.append(" Line: ").append(getWindowErrorL()).append('\n');
+ str.append(" Type: ").append(e.getName()).append('\n');
+ str.append(" Message: ").append(e.getMessage()).append('\n');
+ str.append("----------------------------------\n\n");
+ str.append(e.getStack()).append('\n');
+ }
+
+ private static boolean isCrashed = false;
+
+ public static void showDatabaseLockedScreen(String msg) {
+ String s = rootElement.getAttribute("style");
+ rootElement.setAttribute("style", (s == null ? "" : s) + "position:relative;");
+ HTMLDocument doc = Window.current().getDocument();
+ HTMLElement img = doc.createElement("img");
+ HTMLElement div = doc.createElement("div");
+ img.setAttribute("style", "z-index:100;position:absolute;top:10px;left:calc(50% - 151px);");
+ img.setAttribute("src", crashImage);
+ div.setAttribute("style", "z-index:100;position:absolute;top:135px;left:10%;right:10%;bottom:30px;background-color:white;border:1px solid #cccccc;overflow-x:hidden;overflow-y:scroll;overflow-wrap:break-word;white-space:pre-wrap;font: 24px sans-serif;padding:10px;");
+ rootElement.appendChild(img);
+ rootElement.appendChild(div);
+ div.appendChild(doc.createTextNode(msg));
+ }
+
+ @JSBody(params = { "v" }, script = "try { return \"\"+window[v]; } catch(e) { return \"\"; }")
+ private static native String getString(String var);
+
+ @JSBody(params = { "v" }, script = "try { return \"\"+window.navigator[v]; } catch(e) { return \"\"; }")
+ private static native String getStringNav(String var);
+
+ @JSBody(params = { "v" }, script = "try { return \"\"+window.screen[v]; } catch(e) { return \"\"; }")
+ private static native String getStringScreen(String var);
+
+ @JSBody(params = { "v" }, script = "try { return \"\"+window.location[v]; } catch(e) { return \"\"; }")
+ private static native String getStringLocation(String var);
+
+ @JSBody(params = { }, script = "for(var i = 0; i < window.minecraftOpts.length; ++i) { if(window.minecraftOpts[i].length > 2048) window.minecraftOpts[i] = \"[\" + Math.floor(window.minecraftOpts[i].length * 0.001) + \"k characters]\"; }")
+ private static native void shortenMinecraftOpts();
+
+ private static void addDebug(StringBuilder str, String var) {
+ str.append("window.").append(var).append(" = ").append(getString(var)).append('\n');
+ }
+
+ private static void addDebugNav(StringBuilder str, String var) {
+ str.append("window.navigator.").append(var).append(" = ").append(getStringNav(var)).append('\n');
+ }
+
+ private static void addDebugScreen(StringBuilder str, String var) {
+ str.append("window.screen.").append(var).append(" = ").append(getStringScreen(var)).append('\n');
+ }
+
+ private static void addDebugLocation(StringBuilder str, String var) {
+ str.append("window.location.").append(var).append(" = ").append(getStringLocation(var)).append('\n');
+ }
+
+ private static void addArray(StringBuilder str, String var) {
+ str.append("window.").append(var).append(" = ").append(getArray(var)).append('\n');
+ }
+
+ @JSBody(params = { "v" }, script = "try { return (typeof window[v] !== \"undefined\") ? JSON.stringify(window[v]) : \"[\\\"\\\"]\"; } catch(e) { return \"[\\\"\\\"]\"; }")
+ private static native String getArray(String var);
+
+}
diff --git a/src/main/java/net/lax1dude/eaglercraft/EaglerImage.java b/src/main/java/net/lax1dude/eaglercraft/EaglerImage.java
new file mode 100644
index 0000000..a96c393
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/EaglerImage.java
@@ -0,0 +1,43 @@
+package net.lax1dude.eaglercraft;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+public class EaglerImage {
+
+ public final int[] data;
+ public final int w;
+ public final int h;
+ public final boolean alpha;
+
+ public EaglerImage(int pw, int ph, boolean palpha) {
+ this.w = pw;
+ this.h = ph;
+ this.alpha = palpha;
+ this.data = new int[pw * ph];
+ }
+
+ public EaglerImage(int[] pdata, int pw, int ph, boolean palpha) {
+ if (pdata.length != pw * ph) {
+ throw new IllegalArgumentException("array size does not equal image size");
+ }
+ this.w = pw;
+ this.h = ph;
+ this.alpha = palpha;
+ if (!palpha) {
+ for (int i = 0; i < pdata.length; ++i) {
+ pdata[i] = pdata[i] | 0xFF000000;
+ }
+ }
+ this.data = pdata;
+ }
+
+ public EaglerImage getSubImage(int x, int y, int pw, int ph) {
+ int[] img = new int[pw * ph];
+ for (int i = 0; i < ph; ++i) {
+ System.arraycopy(data, (i + y) * this.w + x, img, i * pw, pw);
+ }
+ return new EaglerImage(img, pw, ph, alpha);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/lax1dude/eaglercraft/GLAllocation.java b/src/main/java/net/lax1dude/eaglercraft/GLAllocation.java
new file mode 100644
index 0000000..0352944
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/GLAllocation.java
@@ -0,0 +1,60 @@
+package net.lax1dude.eaglercraft;
+
+import java.nio.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lwjgl.opengl.GL11;
+
+public class GLAllocation {
+
+ public GLAllocation() {
+ }
+
+ public static synchronized int generateDisplayLists(int i) {
+ int j = GL11.glGenLists(i);
+ displayLists.add(Integer.valueOf(j));
+ displayLists.add(Integer.valueOf(i));
+ return j;
+ }
+
+ public static synchronized void generateTextureNames(IntBuffer intbuffer) {
+
+ for (int i = intbuffer.position(); i < intbuffer.limit(); i++) {
+ int tx = GL11.glGenTextures();
+ intbuffer.put(i, tx);
+ textureNames.add(Integer.valueOf(tx));
+ }
+
+ }
+
+ public static synchronized void deleteTexturesAndDisplayLists() {
+ for (int i = 0; i < displayLists.size(); i += 2) {
+ GL11.glDeleteLists(((Integer) displayLists.get(i)).intValue(),
+ ((Integer) displayLists.get(i + 1)).intValue());
+ }
+
+ for (int j = 0; j < textureNames.size(); j++) {
+ GL11.glDeleteTextures(((Integer) textureNames.get(j)).intValue());
+ }
+
+ displayLists.clear();
+ textureNames.clear();
+ }
+
+ public static ByteBuffer createDirectByteBuffer(int par0) {
+ return GL11.isWebGL ? ByteBuffer.wrap(new byte[par0]).order(ByteOrder.nativeOrder()) : ByteBuffer.allocateDirect(par0).order(ByteOrder.nativeOrder());
+ }
+
+ public static IntBuffer createDirectIntBuffer(int par0) {
+ return GL11.isWebGL ? IntBuffer.wrap(new int[par0]) : createDirectByteBuffer(par0 << 2).asIntBuffer();
+ }
+
+ public static FloatBuffer createDirectFloatBuffer(int par0) {
+ return GL11.isWebGL ? FloatBuffer.wrap(new float[par0]) : createDirectByteBuffer(par0 << 2).asFloatBuffer();
+ }
+
+ private static List displayLists = new ArrayList();
+ private static List textureNames = new ArrayList();
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java b/src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java
new file mode 100644
index 0000000..079352d
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/GeneralDigest.java
@@ -0,0 +1,108 @@
+package net.lax1dude.eaglercraft;
+
+/**
+ * base implementation of MD4 family style digest as outlined in "Handbook of
+ * Applied Cryptography", pages 344 - 347.
+ */
+public abstract class GeneralDigest {
+ private byte[] xBuf;
+ private int xBufOff;
+
+ private long byteCount;
+
+ /**
+ * Standard constructor
+ */
+ protected GeneralDigest() {
+ xBuf = new byte[4];
+ xBufOff = 0;
+ }
+
+ /**
+ * Copy constructor. We are using copy constructors in place of the
+ * Object.clone() interface as this interface is not supported by J2ME.
+ */
+ protected GeneralDigest(GeneralDigest t) {
+ xBuf = new byte[t.xBuf.length];
+ System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length);
+
+ xBufOff = t.xBufOff;
+ byteCount = t.byteCount;
+ }
+
+ public void update(byte in) {
+ xBuf[xBufOff++] = in;
+
+ if (xBufOff == xBuf.length) {
+ processWord(xBuf, 0);
+ xBufOff = 0;
+ }
+
+ byteCount++;
+ }
+
+ public void update(byte[] in, int inOff, int len) {
+ //
+ // fill the current word
+ //
+ while ((xBufOff != 0) && (len > 0)) {
+ update(in[inOff]);
+
+ inOff++;
+ len--;
+ }
+
+ //
+ // process whole words.
+ //
+ while (len > xBuf.length) {
+ processWord(in, inOff);
+
+ inOff += xBuf.length;
+ len -= xBuf.length;
+ byteCount += xBuf.length;
+ }
+
+ //
+ // load in the remainder.
+ //
+ while (len > 0) {
+ update(in[inOff]);
+
+ inOff++;
+ len--;
+ }
+ }
+
+ public void finish() {
+ long bitLength = (byteCount << 3);
+
+ //
+ // add the pad bytes.
+ //
+ update((byte) 128);
+
+ while (xBufOff != 0) {
+ update((byte) 0);
+ }
+
+ processLength(bitLength);
+
+ processBlock();
+ }
+
+ public void reset() {
+ byteCount = 0;
+
+ xBufOff = 0;
+ for (int i = 0; i < xBuf.length; i++) {
+ xBuf[i] = 0;
+ }
+ }
+
+ protected abstract void processWord(byte[] in, int inOff);
+
+ protected abstract void processLength(long bitLength);
+
+ protected abstract void processBlock();
+}
\ No newline at end of file
diff --git a/src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java b/src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java
new file mode 100644
index 0000000..9ba1d4d
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/SHA1Digest.java
@@ -0,0 +1,213 @@
+package net.lax1dude.eaglercraft;
+
+/**
+ * implementation of SHA-1 as outlined in "Handbook of Applied Cryptography",
+ * pages 346 - 349.
+ *
+ * It is interesting to ponder why the, apart from the extra IV, the other
+ * difference here from MD5 is the "endienness" of the word processing!
+ */
+public class SHA1Digest extends GeneralDigest {
+ private static final int DIGEST_LENGTH = 20;
+
+ private int H1, H2, H3, H4, H5;
+
+ private int[] X = new int[80];
+ private int xOff;
+
+ /**
+ * Standard constructor
+ */
+ public SHA1Digest() {
+ reset();
+ }
+
+ /**
+ * Copy constructor. This will copy the state of the provided message digest.
+ */
+ public SHA1Digest(SHA1Digest t) {
+ super(t);
+
+ H1 = t.H1;
+ H2 = t.H2;
+ H3 = t.H3;
+ H4 = t.H4;
+ H5 = t.H5;
+
+ System.arraycopy(t.X, 0, X, 0, t.X.length);
+ xOff = t.xOff;
+ }
+
+ public String getAlgorithmName() {
+ return "SHA-1";
+ }
+
+ public int getDigestSize() {
+ return DIGEST_LENGTH;
+ }
+
+ protected void processWord(byte[] in, int inOff) {
+ X[xOff++] = ((in[inOff] & 0xff) << 24) | ((in[inOff + 1] & 0xff) << 16) | ((in[inOff + 2] & 0xff) << 8)
+ | ((in[inOff + 3] & 0xff));
+
+ if (xOff == 16) {
+ processBlock();
+ }
+ }
+
+ private void unpackWord(int word, byte[] out, int outOff) {
+ out[outOff] = (byte) (word >>> 24);
+ out[outOff + 1] = (byte) (word >>> 16);
+ out[outOff + 2] = (byte) (word >>> 8);
+ out[outOff + 3] = (byte) word;
+ }
+
+ protected void processLength(long bitLength) {
+ if (xOff > 14) {
+ processBlock();
+ }
+
+ X[14] = (int) (bitLength >>> 32);
+ X[15] = (int) (bitLength & 0xffffffff);
+ }
+
+ public int doFinal(byte[] out, int outOff) {
+ finish();
+
+ unpackWord(H1, out, outOff);
+ unpackWord(H2, out, outOff + 4);
+ unpackWord(H3, out, outOff + 8);
+ unpackWord(H4, out, outOff + 12);
+ unpackWord(H5, out, outOff + 16);
+
+ reset();
+
+ return DIGEST_LENGTH;
+ }
+
+ /**
+ * reset the chaining variables
+ */
+ public void reset() {
+ super.reset();
+
+ H1 = 0x67452301;
+ H2 = 0xefcdab89;
+ H3 = 0x98badcfe;
+ H4 = 0x10325476;
+ H5 = 0xc3d2e1f0;
+
+ xOff = 0;
+ for (int i = 0; i != X.length; i++) {
+ X[i] = 0;
+ }
+ }
+
+ //
+ // Additive constants
+ //
+ private static final int Y1 = 0x5a827999;
+ private static final int Y2 = 0x6ed9eba1;
+ private static final int Y3 = 0x8f1bbcdc;
+ private static final int Y4 = 0xca62c1d6;
+
+ private int f(int u, int v, int w) {
+ return ((u & v) | ((~u) & w));
+ }
+
+ private int h(int u, int v, int w) {
+ return (u ^ v ^ w);
+ }
+
+ private int g(int u, int v, int w) {
+ return ((u & v) | (u & w) | (v & w));
+ }
+
+ private int rotateLeft(int x, int n) {
+ return (x << n) | (x >>> (32 - n));
+ }
+
+ protected void processBlock() {
+ //
+ // expand 16 word block into 80 word block.
+ //
+ for (int i = 16; i <= 79; i++) {
+ X[i] = rotateLeft((X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16]), 1);
+ }
+
+ //
+ // set up working variables.
+ //
+ int A = H1;
+ int B = H2;
+ int C = H3;
+ int D = H4;
+ int E = H5;
+
+ //
+ // round 1
+ //
+ for (int j = 0; j <= 19; j++) {
+ int t = rotateLeft(A, 5) + f(B, C, D) + E + X[j] + Y1;
+
+ E = D;
+ D = C;
+ C = rotateLeft(B, 30);
+ B = A;
+ A = t;
+ }
+
+ //
+ // round 2
+ //
+ for (int j = 20; j <= 39; j++) {
+ int t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y2;
+
+ E = D;
+ D = C;
+ C = rotateLeft(B, 30);
+ B = A;
+ A = t;
+ }
+
+ //
+ // round 3
+ //
+ for (int j = 40; j <= 59; j++) {
+ int t = rotateLeft(A, 5) + g(B, C, D) + E + X[j] + Y3;
+
+ E = D;
+ D = C;
+ C = rotateLeft(B, 30);
+ B = A;
+ A = t;
+ }
+
+ //
+ // round 4
+ //
+ for (int j = 60; j <= 79; j++) {
+ int t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y4;
+
+ E = D;
+ D = C;
+ C = rotateLeft(B, 30);
+ B = A;
+ A = t;
+ }
+
+ H1 += A;
+ H2 += B;
+ H3 += C;
+ H4 += D;
+ H5 += E;
+
+ //
+ // reset the offset and clean out the word buffer.
+ //
+ xOff = 0;
+ for (int i = 0; i != X.length; i++) {
+ X[i] = 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java b/src/main/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java
new file mode 100644
index 0000000..4da020c
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java
@@ -0,0 +1,1843 @@
+package net.lax1dude.eaglercraft.adapter;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+import java.nio.charset.Charset;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Set;
+
+import org.teavm.interop.Async;
+import org.teavm.interop.AsyncCallback;
+import org.teavm.jso.JSBody;
+import org.teavm.jso.JSFunctor;
+import org.teavm.jso.JSObject;
+import org.teavm.jso.ajax.ReadyStateChangeHandler;
+import org.teavm.jso.ajax.XMLHttpRequest;
+import org.teavm.jso.browser.TimerHandler;
+import org.teavm.jso.browser.Window;
+import org.teavm.jso.canvas.CanvasRenderingContext2D;
+import org.teavm.jso.canvas.ImageData;
+import org.teavm.jso.dom.events.Event;
+import org.teavm.jso.dom.events.EventListener;
+import org.teavm.jso.dom.events.KeyboardEvent;
+import org.teavm.jso.dom.events.MessageEvent;
+import org.teavm.jso.dom.events.MouseEvent;
+import org.teavm.jso.dom.events.WheelEvent;
+import org.teavm.jso.dom.html.HTMLCanvasElement;
+import org.teavm.jso.dom.html.HTMLDocument;
+import org.teavm.jso.dom.html.HTMLElement;
+import org.teavm.jso.dom.html.HTMLImageElement;
+import org.teavm.jso.typedarrays.ArrayBuffer;
+import org.teavm.jso.typedarrays.Float32Array;
+import org.teavm.jso.typedarrays.Int32Array;
+import org.teavm.jso.typedarrays.Uint8Array;
+import org.teavm.jso.typedarrays.Uint8ClampedArray;
+import org.teavm.jso.webaudio.AudioBuffer;
+import org.teavm.jso.webaudio.AudioBufferSourceNode;
+import org.teavm.jso.webaudio.AudioContext;
+import org.teavm.jso.webaudio.AudioListener;
+import org.teavm.jso.webaudio.DecodeErrorCallback;
+import org.teavm.jso.webaudio.DecodeSuccessCallback;
+import org.teavm.jso.webaudio.GainNode;
+import org.teavm.jso.webaudio.MediaEvent;
+import org.teavm.jso.webaudio.PannerNode;
+import org.teavm.jso.webgl.WebGLBuffer;
+import org.teavm.jso.webgl.WebGLFramebuffer;
+import org.teavm.jso.webgl.WebGLProgram;
+import org.teavm.jso.webgl.WebGLRenderbuffer;
+import org.teavm.jso.webgl.WebGLShader;
+import org.teavm.jso.webgl.WebGLTexture;
+import org.teavm.jso.webgl.WebGLUniformLocation;
+import org.teavm.jso.websocket.CloseEvent;
+import org.teavm.jso.websocket.WebSocket;
+
+import net.lax1dude.eaglercraft.adapter.teavm.WebGLQuery;
+import net.lax1dude.eaglercraft.adapter.teavm.WebGLVertexArray;
+import net.PeytonPlayz585.math.MathHelper;
+import net.PeytonPlayz585.storage.LocalStorageManager;
+import net.lax1dude.eaglercraft.AssetRepository;
+import net.lax1dude.eaglercraft.Base64;
+import net.lax1dude.eaglercraft.Client;
+import net.lax1dude.eaglercraft.EaglerImage;
+import net.lax1dude.eaglercraft.adapter.teavm.IndexedDBFilesystem;
+import net.lax1dude.eaglercraft.adapter.teavm.IndexedDBFilesystem.OpenState;
+import net.lax1dude.eaglercraft.adapter.teavm.WebGL2RenderingContext;
+import static net.lax1dude.eaglercraft.adapter.teavm.WebGL2RenderingContext.*;
+
+public class EaglerAdapterImpl2 {
+
+ public static final boolean _wisWebGL() {
+ return true;
+ }
+ private static boolean isAnisotropicPatched = false;
+ public static final boolean _wisAnisotropicPatched() {
+ return isAnisotropicPatched;
+ }
+ public static final String _wgetShaderHeader() {
+ return "#version 300 es";
+ }
+
+ @JSBody(params = { }, script = "return window.location.href;")
+ private static native String getLocationString();
+
+ public static final boolean isSSLPage() {
+ return getLocationString().startsWith("https");
+ }
+
+ public static final InputStream loadResource(String path) {
+ byte[] file = loadResourceBytes(path);
+ if (file != null) {
+ return new ByteArrayInputStream(file);
+ } else {
+ return null;
+ }
+ }
+
+ public static final byte[] loadResourceBytes(String path) {
+ return AssetRepository.getResource(path);
+ }
+
+ public static final String fileContents(String path) {
+ byte[] contents = loadResourceBytes(path);
+ if(contents == null) {
+ return null;
+ }else {
+ return new String(contents, Charset.forName("UTF-8"));
+ }
+ }
+
+ public static void onWindowUnload() {
+ LocalStorageManager.saveStorageG();
+ LocalStorageManager.saveStorageP();
+ }
+
+ @JSBody(params = { }, script = "window.onbeforeunload = function(){javaMethods.get('net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.onWindowUnload()V').invoke();return false;};")
+ private static native void onBeforeCloseRegister();
+
+ public static final String[] fileContentsLines(String path) {
+ String contents = fileContents(path);
+ if(contents == null) {
+ return null;
+ }else {
+ return contents.replace("\r\n", "\n").split("[\r\n]");
+ }
+ }
+
+ @Async
+ public static native String downloadAssetPack(String assetPackageURI);
+
+ private static void downloadAssetPack(String assetPackageURI, final AsyncCallback cb) {
+ final XMLHttpRequest request = XMLHttpRequest.create();
+ request.setResponseType("arraybuffer");
+ request.open("GET", assetPackageURI, true);
+ request.setOnReadyStateChange(new ReadyStateChangeHandler() {
+ public void stateChanged() {
+ if(request.getReadyState() == XMLHttpRequest.DONE) {
+ Uint8Array bl = Uint8Array.create((ArrayBuffer)request.getResponse());
+ loadedPackage = new byte[bl.getByteLength()];
+ for(int i = 0; i < loadedPackage.length; ++i) {
+ loadedPackage[i] = (byte) bl.get(i);
+ }
+ cb.complete("yee");
+ }
+ }
+ });
+ request.send();
+ }
+
+ @JSBody(params = { "obj" }, script = "window.currentContext = obj;")
+ private static native int setContextVar(JSObject obj);
+
+ @JSBody(params = { "v", "s" }, script = "window[v] = s;")
+ public static native void setDebugVar(String v, String s);
+
+ @JSBody(params = { }, script = "if(window.navigator.userActivation){return window.navigator.userActivation.hasBeenActive;}else{return false;}")
+ public static native boolean hasBeenActive();
+
+ public static HTMLDocument doc = null;
+ public static HTMLElement parent = null;
+ public static HTMLCanvasElement canvas = null;
+ public static CanvasRenderingContext2D canvasContext = null;
+ public static HTMLCanvasElement canvasBack = null;
+ public static WebGL2RenderingContext webgl = null;
+ public static Window win = null;
+ private static byte[] loadedPackage = null;
+ private static EventListener contextmenu = null;
+ private static EventListener mousedown = null;
+ private static EventListener mouseup = null;
+ private static EventListener mousemove = null;
+ private static EventListener keydown = null;
+ private static EventListener keyup = null;
+ private static EventListener keypress = null;
+ private static EventListener wheel = null;
+ private static String[] identifier = new String[0];
+
+ public static final String[] getIdentifier() {
+ return identifier;
+ }
+
+ @JSBody(params = { }, script = "return window.navigator.userAgent;")
+ private static native String getUA();
+
+ @JSBody(params = { }, script = "return window.navigator.platform;")
+ private static native String getPlaf();
+
+ @JSBody(params = { "m" }, script = "return m.offsetX;")
+ private static native int getOffsetX(MouseEvent m);
+
+ @JSBody(params = { "m" }, script = "return m.offsetY;")
+ private static native int getOffsetY(MouseEvent m);
+
+ @JSBody(params = { "e" }, script = "return e.which;")
+ private static native int getWhich(KeyboardEvent e);
+
+ public static final void initializeContext(HTMLElement rootElement, String assetPackageURI) {
+ parent = rootElement;
+ String s = parent.getAttribute("style");
+ parent.setAttribute("style", (s == null ? "" : s)+"overflow-x:hidden;overflow-y:hidden;");
+ win = Window.current();
+ doc = win.getDocument();
+ canvas = (HTMLCanvasElement)doc.createElement("canvas");
+ width = rootElement.getClientWidth();
+ height = rootElement.getClientHeight();
+ canvas.setWidth(width);
+ canvas.setHeight(height);
+ canvasContext = (CanvasRenderingContext2D) canvas.getContext("2d");
+ canvas.setAttribute("id", "deevis589723589");
+ rootElement.appendChild(canvas);
+ canvasBack = (HTMLCanvasElement)doc.createElement("canvas");
+ canvasBack.setWidth(width);
+ canvasBack.setHeight(height);
+ webgl = (WebGL2RenderingContext) canvasBack.getContext("webgl2", youEagler());
+ if(webgl == null) {
+ throw new RuntimeException("WebGL 2.0 is not supported in your browser ("+getUA()+")");
+ }
+ setContextVar(webgl);
+
+ webgl.getExtension("EXT_texture_filter_anisotropic");
+
+ win.addEventListener("contextmenu", contextmenu = new EventListener() {
+ public void handleEvent(MouseEvent evt) {
+ evt.preventDefault();
+ evt.stopPropagation();
+ }
+ });
+ canvas.addEventListener("mousedown", mousedown = new EventListener() {
+ public void handleEvent(MouseEvent evt) {
+ int b = evt.getButton();
+ buttonStates[b == 1 ? 2 : (b == 2 ? 1 : b)] = true;
+ mouseEvents.add(evt);
+ evt.preventDefault();
+ evt.stopPropagation();
+ forceMouseGrabbed();
+ }
+ });
+ canvas.addEventListener("mouseup", mouseup = new EventListener() {
+ public void handleEvent(MouseEvent evt) {
+ int b = evt.getButton();
+ buttonStates[b == 1 ? 2 : (b == 2 ? 1 : b)] = false;
+ mouseEvents.add(evt);
+ evt.preventDefault();
+ evt.stopPropagation();
+ }
+ });
+ canvas.addEventListener("mousemove", mousemove = new EventListener() {
+ public void handleEvent(MouseEvent evt) {
+ mouseX = getOffsetX(evt);
+ mouseY = canvas.getClientHeight() - getOffsetY(evt);
+ mouseDX += evt.getMovementX();
+ mouseDY += -evt.getMovementY();
+ evt.preventDefault();
+ evt.stopPropagation();
+ }
+ });
+ win.addEventListener("keydown", keydown = new EventListener() {
+ public void handleEvent(KeyboardEvent evt) {
+ //keyStates[remapKey(evt.getKeyCode())] = true;
+ keyStates[remapKey(getWhich(evt))] = true;
+ keyEvents.add(evt);
+ evt.preventDefault();
+ evt.stopPropagation();
+ forceMouseGrabbed();
+ }
+ });
+ win.addEventListener("keyup", keyup = new EventListener() {
+ public void handleEvent(KeyboardEvent evt) {
+ //keyStates[remapKey(evt.getKeyCode())] = false;
+ keyStates[remapKey(getWhich(evt))] = false;
+ keyEvents.add(evt);
+ evt.preventDefault();
+ evt.stopPropagation();
+ }
+ });
+ win.addEventListener("keypress", keypress = new EventListener() {
+ public void handleEvent(KeyboardEvent evt) {
+ if(enableRepeatEvents && evt.isRepeat()) keyEvents.add(evt);
+ evt.preventDefault();
+ evt.stopPropagation();
+ }
+ });
+ canvas.addEventListener("wheel", wheel = new EventListener() {
+ public void handleEvent(WheelEvent evt) {
+ mouseEvents.add(evt);
+ evt.preventDefault();
+ evt.stopPropagation();
+ }
+ });
+ win.addEventListener("blur", new EventListener() {
+ public void handleEvent(WheelEvent evt) {
+ isWindowFocused = false;
+ }
+ });
+ win.addEventListener("focus", new EventListener() {
+ public void handleEvent(WheelEvent evt) {
+ isWindowFocused = true;
+ forceMouseGrabbed();
+ }
+ });
+ onBeforeCloseRegister();
+ initFileChooser();
+
+ OpenState st = IndexedDBFilesystem.initialize();
+ if(st != OpenState.OPENED) {
+ if(st == OpenState.LOCKED) {
+ Client.showDatabaseLockedScreen("\nError: World folder is locked!\n\nYou are already playing Eaglercraft in a different tab.\nClose all other Eaglercraft tabs and reload");
+ }else {
+ Client.showDatabaseLockedScreen("\nError: World folder could not be loaded!\n\n" + IndexedDBFilesystem.errorDetail());
+ }
+ throw new Client.AbortedLaunchException();
+ }
+
+ downloadAssetPack(assetPackageURI);
+
+ try {
+ AssetRepository.install(loadedPackage);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ audioctx = AudioContext.create();
+
+ mouseEvents.clear();
+ keyEvents.clear();
+ }
+
+ @JSBody(params = { }, script =
+ "window.eagsFileChooser = {\r\n" +
+ "inputElement: null,\r\n" +
+ "openFileChooser: function(ext, mime){\r\n" +
+ "var el = window.eagsFileChooser.inputElement = document.createElement(\"input\");\r\n" +
+ "el.type = \"file\";\r\n" +
+ "el.multiple = false;\r\n" +
+ "el.addEventListener(\"change\", function(evt){\r\n" +
+ "var f = window.eagsFileChooser.inputElement.files;\r\n" +
+ "if(f.length == 0){\r\n" +
+ "window.eagsFileChooser.getFileChooserResult = null;\r\n" +
+ "}else{\r\n" +
+ "(async function(){\r\n" +
+ "window.eagsFileChooser.getFileChooserResult = await f[0].arrayBuffer();\r\n" +
+ "window.eagsFileChooser.getFileChooserResultName = f[0].name;\r\n" +
+ "})();\r\n" +
+ "}\r\n" +
+ "});\r\n" +
+ "window.eagsFileChooser.getFileChooserResult = null;\r\n" +
+ "window.eagsFileChooser.getFileChooserResultName = null;\r\n" +
+ "el.accept = mime;\r\n" +
+ "el.click();\r\n" +
+ "},\r\n" +
+ "getFileChooserResult: null,\r\n" +
+ "getFileChooserResultName: null\r\n" +
+ "};")
+ private static native void initFileChooser();
+
+ public static final void destroyContext() {
+
+ }
+
+ public static final void removeEventHandlers() {
+ win.removeEventListener("contextmenu", contextmenu);
+ win.removeEventListener("mousedown", mousedown);
+ win.removeEventListener("mouseup", mouseup);
+ win.removeEventListener("mousemove", mousemove);
+ win.removeEventListener("keydown", keydown);
+ win.removeEventListener("keyup", keyup);
+ win.removeEventListener("keypress", keypress);
+ win.removeEventListener("wheel", wheel);
+ }
+
+ private static LinkedList mouseEvents = new LinkedList();
+ private static LinkedList keyEvents = new LinkedList();
+
+ private static int mouseX = 0;
+ private static int mouseY = 0;
+ private static double mouseDX = 0.0D;
+ private static double mouseDY = 0.0D;
+ private static int width = 0;
+ private static int height = 0;
+ private static boolean enableRepeatEvents = false;
+ private static boolean isWindowFocused = true;
+
+ @JSBody(params = { }, script = "return {antialias: false, depth: true, powerPreference: \"high-performance\", desynchronized: false, preserveDrawingBuffer: false, premultipliedAlpha: false, alpha: false};")
+ public static native JSObject youEagler();
+
+ public static final int _wGL_TEXTURE_2D = TEXTURE_2D;
+ public static final int _wGL_DEPTH_TEST = DEPTH_TEST;
+ public static final int _wGL_LEQUAL = LEQUAL;
+ public static final int _wGL_GEQUAL = GEQUAL;
+ public static final int _wGL_GREATER = GREATER;
+ public static final int _wGL_LESS = LESS;
+ public static final int _wGL_BACK = BACK;
+ public static final int _wGL_FRONT = FRONT;
+ public static final int _wGL_FRONT_AND_BACK = FRONT_AND_BACK;
+ public static final int _wGL_COLOR_BUFFER_BIT = COLOR_BUFFER_BIT;
+ public static final int _wGL_DEPTH_BUFFER_BIT = DEPTH_BUFFER_BIT;
+ public static final int _wGL_BLEND = BLEND;
+ public static final int _wGL_RGBA = RGBA;
+ public static final int _wGL_RGB = RGB;
+ public static final int _wGL_RGB8 = RGB8;
+ public static final int _wGL_RGBA8 = RGBA8;
+ public static final int _wGL_UNSIGNED_BYTE = UNSIGNED_BYTE;
+ public static final int _wGL_UNSIGNED_SHORT = UNSIGNED_SHORT;
+ public static final int _wGL_SRC_ALPHA = SRC_ALPHA;
+ public static final int _wGL_ONE_MINUS_SRC_ALPHA = ONE_MINUS_SRC_ALPHA;
+ public static final int _wGL_ONE_MINUS_DST_COLOR = ONE_MINUS_DST_COLOR;
+ public static final int _wGL_ONE_MINUS_SRC_COLOR = ONE_MINUS_SRC_COLOR;
+ public static final int _wGL_ZERO = ZERO;
+ public static final int _wGL_CULL_FACE = CULL_FACE;
+ public static final int _wGL_TEXTURE_MIN_FILTER = TEXTURE_MIN_FILTER;
+ public static final int _wGL_TEXTURE_MAG_FILTER = TEXTURE_MAG_FILTER;
+ public static final int _wGL_LINEAR = LINEAR;
+ public static final int _wGL_EQUAL = EQUAL;
+ public static final int _wGL_SRC_COLOR = SRC_COLOR;
+ public static final int _wGL_ONE = ONE;
+ public static final int _wGL_NEAREST = NEAREST;
+ public static final int _wGL_CLAMP = CLAMP_TO_EDGE;
+ public static final int _wGL_TEXTURE_WRAP_S = TEXTURE_WRAP_S;
+ public static final int _wGL_TEXTURE_WRAP_T = TEXTURE_WRAP_T;
+ public static final int _wGL_REPEAT = REPEAT;
+ public static final int _wGL_DST_COLOR = DST_COLOR;
+ public static final int _wGL_DST_ALPHA = DST_ALPHA;
+ public static final int _wGL_FLOAT = FLOAT;
+ public static final int _wGL_SHORT = SHORT;
+ public static final int _wGL_TRIANGLES = TRIANGLES;
+ public static final int _wGL_TRIANGLE_STRIP = TRIANGLE_STRIP;
+ public static final int _wGL_TRIANGLE_FAN = TRIANGLE_FAN;
+ public static final int _wGL_LINE_STRIP = LINE_STRIP;
+ public static final int _wGL_LINES = LINES;
+ public static final int _wGL_PACK_ALIGNMENT = PACK_ALIGNMENT;
+ public static final int _wGL_UNPACK_ALIGNMENT = UNPACK_ALIGNMENT;
+ public static final int _wGL_TEXTURE0 = TEXTURE0;
+ public static final int _wGL_TEXTURE1 = TEXTURE1;
+ public static final int _wGL_TEXTURE2 = TEXTURE2;
+ public static final int _wGL_TEXTURE3 = TEXTURE3;
+ public static final int _wGL_VIEWPORT = VIEWPORT;
+ public static final int _wGL_VERTEX_SHADER = VERTEX_SHADER;
+ public static final int _wGL_FRAGMENT_SHADER = FRAGMENT_SHADER;
+ public static final int _wGL_ARRAY_BUFFER = ARRAY_BUFFER;
+ public static final int _wGL_ELEMENT_ARRAY_BUFFER = ELEMENT_ARRAY_BUFFER;
+ public static final int _wGL_STATIC_DRAW = STATIC_DRAW;
+ public static final int _wGL_DYNAMIC_DRAW = DYNAMIC_DRAW;
+ public static final int _wGL_INVALID_ENUM = INVALID_ENUM;
+ public static final int _wGL_INVALID_VALUE= INVALID_VALUE;
+ public static final int _wGL_INVALID_OPERATION = INVALID_OPERATION;
+ public static final int _wGL_OUT_OF_MEMORY = OUT_OF_MEMORY;
+ public static final int _wGL_CONTEXT_LOST_WEBGL = CONTEXT_LOST_WEBGL;
+ public static final int _wGL_FRAMEBUFFER_COMPLETE = FRAMEBUFFER_COMPLETE;
+ public static final int _wGL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+ public static final int _wGL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
+ public static final int _wGL_COLOR_ATTACHMENT0 = COLOR_ATTACHMENT0;
+ public static final int _wGL_DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCIL_ATTACHMENT;
+ public static final int _wGL_DEPTH_STENCIL = DEPTH_STENCIL;
+ public static final int _wGL_NEAREST_MIPMAP_LINEAR = NEAREST_MIPMAP_LINEAR;
+ public static final int _wGL_LINEAR_MIPMAP_LINEAR = LINEAR_MIPMAP_LINEAR;
+ public static final int _wGL_LINEAR_MIPMAP_NEAREST = LINEAR_MIPMAP_NEAREST;
+ public static final int _wGL_NEAREST_MIPMAP_NEAREST = NEAREST_MIPMAP_NEAREST;
+ public static final int _wGL_TEXTURE_MAX_LEVEL = TEXTURE_MAX_LEVEL;
+ public static final int _wGL_UNSIGNED_INT_24_8 = UNSIGNED_INT_24_8;
+ public static final int _wGL_UNSIGNED_INT = UNSIGNED_INT;
+ public static final int _wGL_ANY_SAMPLES_PASSED = ANY_SAMPLES_PASSED;
+ public static final int _wGL_QUERY_RESULT = QUERY_RESULT;
+ public static final int _wGL_QUERY_RESULT_AVAILABLE = QUERY_RESULT_AVAILABLE;
+ public static final int _wGL_TEXTURE_MAX_ANISOTROPY = TEXTURE_MAX_ANISOTROPY_EXT;
+ public static final int _wGL_DEPTH24_STENCIL8 = DEPTH24_STENCIL8;
+ public static final int _wGL_DEPTH_COMPONENT32F = DEPTH_COMPONENT32F;
+ public static final int _wGL_DEPTH_ATTACHMENT = DEPTH_ATTACHMENT;
+ public static final int _wGL_MULTISAMPLE = -1;
+ public static final int _wGL_LINE_SMOOTH = -1;
+ public static final int _wGL_READ_FRAMEBUFFER = READ_FRAMEBUFFER;
+ public static final int _wGL_DRAW_FRAMEBUFFER = DRAW_FRAMEBUFFER;
+ public static final int _wGL_FRAMEBUFFER = FRAMEBUFFER;
+ public static final int _wGL_POLYGON_OFFSET_FILL = POLYGON_OFFSET_FILL;
+
+ public static final class TextureGL {
+ protected final WebGLTexture obj;
+ public int w = -1;
+ public int h = -1;
+ public boolean nearest = true;
+ public boolean anisotropic = false;
+ protected TextureGL(WebGLTexture obj) {
+ this.obj = obj;
+ }
+ }
+ public static final class BufferGL {
+ protected final WebGLBuffer obj;
+ protected BufferGL(WebGLBuffer obj) {
+ this.obj = obj;
+ }
+ }
+ public static final class ShaderGL {
+ protected final WebGLShader obj;
+ protected ShaderGL(WebGLShader obj) {
+ this.obj = obj;
+ }
+ }
+ private static int progId = 0;
+ public static final class ProgramGL {
+ protected final WebGLProgram obj;
+ protected final int hashcode;
+ protected ProgramGL(WebGLProgram obj) {
+ this.obj = obj;
+ this.hashcode = ++progId;
+ }
+ }
+ public static final class UniformGL {
+ protected final WebGLUniformLocation obj;
+ protected UniformGL(WebGLUniformLocation obj) {
+ this.obj = obj;
+ }
+ }
+ public static final class BufferArrayGL {
+ protected final WebGLVertexArray obj;
+ public boolean isQuadBufferBound;
+ protected BufferArrayGL(WebGLVertexArray obj) {
+ this.obj = obj;
+ this.isQuadBufferBound = false;
+ }
+ }
+ public static final class FramebufferGL {
+ protected final WebGLFramebuffer obj;
+ protected FramebufferGL(WebGLFramebuffer obj) {
+ this.obj = obj;
+ }
+ }
+ public static final class RenderbufferGL {
+ protected final WebGLRenderbuffer obj;
+ protected RenderbufferGL(WebGLRenderbuffer obj) {
+ this.obj = obj;
+ }
+ }
+ public static final class QueryGL {
+ protected final WebGLQuery obj;
+ protected QueryGL(WebGLQuery obj) {
+ this.obj = obj;
+ }
+ }
+
+ public static final void _wglEnable(int p1) {
+ webgl.enable(p1);
+ }
+ public static final void _wglClearDepth(float p1) {
+ webgl.clearDepth(p1);
+ }
+ public static final void _wglDepthFunc(int p1) {
+ webgl.depthFunc(p1);
+ }
+ public static final void _wglCullFace(int p1) {
+ webgl.cullFace(p1);
+ }
+ private static int[] viewportCache = new int[4];
+ public static final void _wglViewport(int p1, int p2, int p3, int p4) {
+ viewportCache[0] = p1; viewportCache[1] = p2;
+ viewportCache[2] = p3; viewportCache[3] = p4;
+ webgl.viewport(p1, p2, p3, p4);
+ }
+ public static final void _wglClear(int p1) {
+ webgl.clear(p1);
+ }
+ public static final void _wglClearColor(float p1, float p2, float p3, float p4) {
+ webgl.clearColor(p1, p2, p3, p4);
+ }
+ public static final void _wglDisable(int p1) {
+ webgl.disable(p1);
+ }
+ public static final int _wglGetError() {
+ return webgl.getError();
+ }
+ public static final void _wglFlush() {
+ //webgl.flush();
+ }
+ private static Uint8Array uploadBuffer = Uint8Array.create(ArrayBuffer.create(4 * 1024 * 1024));
+ public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) {
+ if(p9 == null) {
+ webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, null);
+ }else {
+ int len = p9.remaining();
+ Uint8Array uploadBuffer1 = uploadBuffer;
+ for(int i = 0; i < len; ++i) {
+ uploadBuffer1.set(i, (short) ((int)p9.get() & 0xff));
+ }
+ Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len);
+ webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data);
+ }
+ }
+ public static final void _wglBlendFunc(int p1, int p2) {
+ webgl.blendFunc(p1, p2);
+ }
+ public static final void _wglBlendFuncSeparate(int p1, int p2, int p3, int p4) {
+ webgl.blendFuncSeparate(p1, p2, p3, p4);
+ }
+ public static final void _wglDepthMask(boolean p1) {
+ webgl.depthMask(p1);
+ }
+ public static final void _wglColorMask(boolean p1, boolean p2, boolean p3, boolean p4) {
+ webgl.colorMask(p1, p2, p3, p4);
+ }
+ public static final void _wglBindTexture(int p1, TextureGL p2) {
+ webgl.bindTexture(p1, p2 == null ? null : p2.obj);
+ }
+ public static final void _wglCopyTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {
+ webgl.copyTexSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8);
+ }
+ public static final void _wglTexParameteri(int p1, int p2, int p3) {
+ webgl.texParameteri(p1, p2, p3);
+ }
+ public static final void _wglTexParameterf(int p1, int p2, float p3) {
+ webgl.texParameterf(p1, p2, p3);
+ }
+ public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) {
+ int len = p9.remaining();
+ Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer());
+ for(int i = 0; i < len; ++i) {
+ deevis.set(i, p9.get());
+ }
+ Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4);
+ webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data);
+ }
+ public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) {
+ int len = p9.remaining();
+ Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer());
+ for(int i = 0; i < len; ++i) {
+ deevis.set(i, p9.get());
+ }
+ Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4);
+ webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data);
+ }
+ public static final void _wglDeleteTextures(TextureGL p1) {
+ webgl.deleteTexture(p1.obj);
+ }
+ public static final void _wglDrawArrays(int p1, int p2, int p3) {
+ webgl.drawArrays(p1, p2, p3);
+ }
+ public static final void _wglDrawElements(int p1, int p2, int p3, int p4) {
+ webgl.drawElements(p1, p2, p3, p4);
+ }
+ public static final TextureGL _wglGenTextures() {
+ return new TextureGL(webgl.createTexture());
+ }
+ public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) {
+ int len = p9.remaining();
+ for(int i = 0; i < len; ++i) {
+ uploadBuffer.set(i, (short) ((int)p9.get() & 0xff));
+ }
+ Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len);
+ webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data);
+ }
+ public static final void _wglActiveTexture(int p1) {
+ webgl.activeTexture(p1);
+ }
+ public static final ProgramGL _wglCreateProgram() {
+ return new ProgramGL(webgl.createProgram());
+ }
+ public static final ShaderGL _wglCreateShader(int p1) {
+ return new ShaderGL(webgl.createShader(p1));
+ }
+ public static final void _wglAttachShader(ProgramGL p1, ShaderGL p2) {
+ webgl.attachShader(p1.obj, p2.obj);
+ }
+ public static final void _wglDetachShader(ProgramGL p1, ShaderGL p2) {
+ webgl.detachShader(p1.obj, p2.obj);
+ }
+ public static final void _wglCompileShader(ShaderGL p1) {
+ webgl.compileShader(p1.obj);
+ }
+ public static final void _wglLinkProgram(ProgramGL p1) {
+ webgl.linkProgram(p1.obj);
+ }
+ public static final void _wglShaderSource(ShaderGL p1, String p2) {
+ webgl.shaderSource(p1.obj, p2);
+ }
+ public static final String _wglGetShaderInfoLog(ShaderGL p1) {
+ return webgl.getShaderInfoLog(p1.obj);
+ }
+ public static final String _wglGetProgramInfoLog(ProgramGL p1) {
+ return webgl.getProgramInfoLog(p1.obj);
+ }
+ public static final boolean _wglGetShaderCompiled(ShaderGL p1) {
+ return webgl.getShaderParameteri(p1.obj, COMPILE_STATUS) == 1;
+ }
+ public static final boolean _wglGetProgramLinked(ProgramGL p1) {
+ return webgl.getProgramParameteri(p1.obj, LINK_STATUS) == 1;
+ }
+ public static final void _wglDeleteShader(ShaderGL p1) {
+ webgl.deleteShader(p1.obj);
+ }
+ public static final void _wglDeleteProgram(ProgramGL p1) {
+ webgl.deleteProgram(p1.obj);
+ }
+ public static final BufferGL _wglCreateBuffer() {
+ return new BufferGL(webgl.createBuffer());
+ }
+ public static final void _wglDeleteBuffer(BufferGL p1) {
+ webgl.deleteBuffer(p1.obj);
+ }
+ public static final void _wglBindBuffer(int p1, BufferGL p2) {
+ webgl.bindBuffer(p1, p2 == null ? null : p2.obj);
+ }
+ public static final void _wglBufferData0(int p1, IntBuffer p2, int p3) {
+ int len = p2.remaining();
+ Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer());
+ for(int i = 0; i < len; ++i) {
+ deevis.set(i, p2.get());
+ }
+ Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4);
+ webgl.bufferData(p1, data, p3);
+ }
+ public static final void _wglBufferSubData0(int p1, int p2, IntBuffer p3) {
+ int len = p3.remaining();
+ Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer());
+ for(int i = 0; i < len; ++i) {
+ deevis.set(i, p3.get());
+ }
+ Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4);
+ webgl.bufferSubData(p1, p2, data);
+ }
+ public static final void _wglBufferData(int p1, Object p2, int p3) {
+ webgl.bufferData(p1, (Int32Array)p2, p3);
+ }
+ public static final void _wglBufferSubData(int p1, int p2, Object p3) {
+ webgl.bufferSubData(p1, p2, (Int32Array)p3);
+ }
+ public static final void _wglBindAttribLocation(ProgramGL p1, int p2, String p3) {
+ webgl.bindAttribLocation(p1.obj, p2, p3);
+ }
+ public static final void _wglEnableVertexAttribArray(int p1) {
+ webgl.enableVertexAttribArray(p1);
+ }
+ public static final void _wglDisableVertexAttribArray(int p1) {
+ webgl.disableVertexAttribArray(p1);
+ }
+ public static final UniformGL _wglGetUniformLocation(ProgramGL p1, String p2) {
+ WebGLUniformLocation u = webgl.getUniformLocation(p1.obj, p2);
+ return u == null ? null : new UniformGL(u);
+ }
+ public static final void _wglBindAttributeLocation(ProgramGL p1, int p2, String p3) {
+ webgl.bindAttribLocation(p1.obj, p2, p3);
+ }
+ public static final void _wglUniform1f(UniformGL p1, float p2) {
+ if(p1 != null) webgl.uniform1f(p1.obj, p2);
+ }
+ public static final void _wglUniform2f(UniformGL p1, float p2, float p3) {
+ if(p1 != null) webgl.uniform2f(p1.obj, p2, p3);
+ }
+ public static final void _wglUniform3f(UniformGL p1, float p2, float p3, float p4) {
+ if(p1 != null) webgl.uniform3f(p1.obj, p2, p3, p4);
+ }
+ public static final void _wglUniform4f(UniformGL p1, float p2, float p3, float p4, float p5) {
+ if(p1 != null) webgl.uniform4f(p1.obj, p2, p3, p4, p5);
+ }
+ public static final void _wglUniform1i(UniformGL p1, int p2) {
+ if(p1 != null) webgl.uniform1i(p1.obj, p2);
+ }
+ public static final void _wglUniform2i(UniformGL p1, int p2, int p3) {
+ if(p1 != null) webgl.uniform2i(p1.obj, p2, p3);
+ }
+ public static final void _wglUniform3i(UniformGL p1, int p2, int p3, int p4) {
+ if(p1 != null) webgl.uniform3i(p1.obj, p2, p3, p4);
+ }
+ public static final void _wglUniform4i(UniformGL p1, int p2, int p3, int p4, int p5) {
+ if(p1 != null) webgl.uniform4i(p1.obj, p2, p3, p4, p5);
+ }
+ private static Float32Array mat2 = Float32Array.create(4);
+ private static Float32Array mat3 = Float32Array.create(9);
+ private static Float32Array mat4 = Float32Array.create(16);
+ public static final void _wglUniformMat2fv(UniformGL p1, float[] mat) {
+ mat2.set(mat);
+ if(p1 != null) webgl.uniformMatrix2fv(p1.obj, false, mat2);
+ }
+ public static final void _wglUniformMat3fv(UniformGL p1, float[] mat) {
+ mat3.set(mat);
+ if(p1 != null) webgl.uniformMatrix3fv(p1.obj, false, mat3);
+ }
+ public static final void _wglUniformMat4fv(UniformGL p1, float[] mat) {
+ mat4.set(mat);
+ if(p1 != null) webgl.uniformMatrix4fv(p1.obj, false, mat4);
+ }
+ private static int currentProgram = -1;
+ public static final void _wglUseProgram(ProgramGL p1) {
+ if(p1 != null && currentProgram != p1.hashcode) {
+ currentProgram = p1.hashcode;
+ webgl.useProgram(p1.obj);
+ }
+ }
+ public static final void _wglGetParameter(int p1, int size, int[] ret) {
+ if(p1 == _wGL_VIEWPORT) {
+ ret[0] = viewportCache[0];
+ ret[1] = viewportCache[1];
+ ret[2] = viewportCache[2];
+ ret[3] = viewportCache[3];
+ }
+ }
+ public static final void _wglPolygonOffset(float p1, float p2) {
+ webgl.polygonOffset(p1, p2);
+ }
+ public static final void _wglVertexAttribPointer(int p1, int p2, int p3, boolean p4, int p5, int p6) {
+ webgl.vertexAttribPointer(p1, p2, p3, p4, p5, p6);
+ }
+ public static final void _wglBindFramebuffer(int p1, FramebufferGL p2) {
+ webgl.bindFramebuffer(p1, p2 == null ? null : p2.obj);
+ }
+ public static final FramebufferGL _wglCreateFramebuffer() {
+ return new FramebufferGL(webgl.createFramebuffer());
+ }
+ public static final void _wglDeleteFramebuffer(FramebufferGL p1) {
+ webgl.deleteFramebuffer(p1.obj);
+ }
+ public static final void _wglFramebufferTexture2D(int p1, TextureGL p2) {
+ webgl.framebufferTexture2D(FRAMEBUFFER, p1, TEXTURE_2D, p2 == null ? null : p2.obj, 0);
+ }
+ public static final QueryGL _wglCreateQuery() {
+ return new QueryGL(webgl.createQuery());
+ }
+ public static final void _wglBeginQuery(int p1, QueryGL p2) {
+ webgl.beginQuery(p1, p2.obj);
+ }
+ public static final void _wglEndQuery(int p1) {
+ webgl.endQuery(p1);
+ }
+ public static final void _wglDeleteQuery(QueryGL p1) {
+ webgl.deleteQuery(p1.obj);
+ }
+ public static final int _wglGetQueryObjecti(QueryGL p1, int p2) {
+ return webgl.getQueryParameter(p1.obj, p2);
+ }
+ public static final BufferArrayGL _wglCreateVertexArray() {
+ return new BufferArrayGL(webgl.createVertexArray());
+ }
+ public static final void _wglDeleteVertexArray(BufferArrayGL p1) {
+ webgl.deleteVertexArray(p1.obj);
+ }
+ public static final void _wglBindVertexArray(BufferArrayGL p1) {
+ webgl.bindVertexArray(p1 == null ? null : p1.obj);
+ }
+ public static final void _wglDrawBuffer(int p1) {
+ webgl.drawBuffers(new int[] { p1 });
+ }
+ public static final RenderbufferGL _wglCreateRenderBuffer() {
+ return new RenderbufferGL(webgl.createRenderbuffer());
+ }
+ public static final void _wglBindRenderbuffer(RenderbufferGL p1) {
+ webgl.bindRenderbuffer(RENDERBUFFER, p1 == null ? null : p1.obj);
+ }
+ public static final void _wglRenderbufferStorage(int p1, int p2, int p3) {
+ webgl.renderbufferStorage(RENDERBUFFER, p1, p2, p3);
+ }
+ public static final void _wglFramebufferRenderbuffer(int p1, RenderbufferGL p2) {
+ webgl.framebufferRenderbuffer(FRAMEBUFFER, p1, RENDERBUFFER, p2 == null ? null : p2.obj);
+ }
+ public static final void _wglDeleteRenderbuffer(RenderbufferGL p1) {
+ webgl.deleteRenderbuffer(p1.obj);
+ }
+ public static final void _wglRenderbufferStorageMultisample(int p1, int p2, int p3, int p4) {
+ webgl.renderbufferStorageMultisample(RENDERBUFFER, p1, p2, p3, p4);
+ }
+ public static final void _wglBlitFramebuffer(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10) {
+ webgl.blitFramebuffer(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
+ }
+ public static final int _wglGetAttribLocation(ProgramGL p1, String p2) {
+ return webgl.getAttribLocation(p1.obj, p2);
+ }
+
+ @JSBody(params = { "ctx", "p" }, script = "return ctx.getTexParameter(0x0DE1, p) | 0;")
+ private static final native int __wglGetTexParameteri(WebGL2RenderingContext ctx, int p);
+ public static final int _wglGetTexParameteri(int p1) {
+ return __wglGetTexParameteri(webgl, p1);
+ }
+ @JSBody(params = { "ctx", "p" }, script = "return (0.0 + ctx.getTexParameter(0x0DE1, p));")
+ private static final native float __wglGetTexParameterf(WebGL2RenderingContext ctx, int p);
+ public static final float _wglGetTexParameterf(int p1) {
+ return __wglGetTexParameterf(webgl, p1);
+ }
+ public static final boolean isWindows() {
+ return getPlaf().toLowerCase().contains("win");
+ }
+ private static HTMLCanvasElement imageLoadCanvas = null;
+ private static CanvasRenderingContext2D imageLoadContext = null;
+
+ @JSBody(params = { "buf", "mime" }, script = "return URL.createObjectURL(new Blob([buf], {type: mime}));")
+ private static native String getDataURL(ArrayBuffer buf, String mime);
+
+ @JSBody(params = { "url" }, script = "URL.revokeObjectURL(url);")
+ private static native void freeDataURL(String url);
+
+ public static final EaglerImage loadPNG(byte[] data) {
+ ArrayBuffer arr = ArrayBuffer.create(data.length);
+ Uint8Array.create(arr).set(data);
+ return loadPNG0(arr);
+ }
+
+ @Async
+ private static native EaglerImage loadPNG0(ArrayBuffer data);
+
+ private static void loadPNG0(ArrayBuffer data, final AsyncCallback ret) {
+ final HTMLImageElement toLoad = (HTMLImageElement) doc.createElement("img");
+ toLoad.addEventListener("load", new EventListener() {
+ public void handleEvent(Event evt) {
+ if(imageLoadCanvas == null) {
+ imageLoadCanvas = (HTMLCanvasElement) doc.createElement("canvas");
+ }
+ if(imageLoadCanvas.getWidth() < toLoad.getWidth()) {
+ imageLoadCanvas.setWidth(toLoad.getWidth());
+ }
+ if(imageLoadCanvas.getHeight() < toLoad.getHeight()) {
+ imageLoadCanvas.setHeight(toLoad.getHeight());
+ }
+ if(imageLoadContext == null) {
+ imageLoadContext = (CanvasRenderingContext2D) imageLoadCanvas.getContext("2d");
+ }
+ imageLoadContext.clearRect(0, 0, toLoad.getWidth(), toLoad.getHeight());
+ imageLoadContext.drawImage(toLoad, 0, 0, toLoad.getWidth(), toLoad.getHeight());
+ ImageData pxlsDat = imageLoadContext.getImageData(0, 0, toLoad.getWidth(), toLoad.getHeight());
+ Uint8ClampedArray pxls = pxlsDat.getData();
+ int totalPixels = pxlsDat.getWidth() * pxlsDat.getHeight();
+ freeDataURL(toLoad.getSrc());
+ if(pxls.getByteLength() < totalPixels * 4) {
+ ret.complete(null);
+ return;
+ }
+ int[] pixels = new int[totalPixels];
+ for(int i = 0; i < pixels.length; ++i) {
+ pixels[i] = (pxls.get(i * 4) << 16) | (pxls.get(i * 4 + 1) << 8) | pxls.get(i * 4 + 2) | (pxls.get(i * 4 + 3) << 24);
+ }
+ ret.complete(new EaglerImage(pixels, pxlsDat.getWidth(), pxlsDat.getHeight(), true));
+ }
+ });
+ toLoad.addEventListener("error", new EventListener() {
+ public void handleEvent(Event evt) {
+ freeDataURL(toLoad.getSrc());
+ ret.complete(null);
+ }
+ });
+ String src = getDataURL(data, "image/png");
+ if(src == null) {
+ ret.complete(null);
+ }else {
+ toLoad.setSrc(src);
+ }
+ }
+
+ private static MouseEvent currentEvent = null;
+ private static KeyboardEvent currentEventK = null;
+ private static boolean[] buttonStates = new boolean[8];
+ private static boolean[] keyStates = new boolean[256];
+ public static final boolean mouseNext() {
+ currentEvent = null;
+ return !mouseEvents.isEmpty() && (currentEvent = mouseEvents.remove(0)) != null;
+ }
+ public static final int mouseGetEventButton() {
+ if(currentEvent == null) return -1;
+ int b = currentEvent.getButton();
+ return b == 1 ? 2 : (b == 2 ? 1 : b);
+ }
+ public static final boolean mouseGetEventButtonState() {
+ return currentEvent == null ? false : currentEvent.getType().equals(MouseEvent.MOUSEDOWN);
+ }
+ public static final boolean mouseIsButtonDown(int p1) {
+ return buttonStates[p1];
+ }
+ public static final int mouseGetEventDWheel() {
+ return ("wheel".equals(currentEvent.getType())) ? (((WheelEvent)currentEvent).getDeltaY() == 0.0D ? 0 : (((WheelEvent)currentEvent).getDeltaY() > 0.0D ? -1 : 1)) : 0;
+ }
+ public static final void mouseSetCursorPosition(int x, int y) {
+
+ }
+ private static long mouseUngrabTimer = 0l;
+ private static int mouseUngrabTimeout = 0;
+ private static boolean needsPointerLock = false;
+ public static final void mouseSetGrabbed(boolean grabbed) {
+ needsPointerLock = grabbed;
+ if(grabbed) {
+ mouseDX = 0.0D;
+ mouseDY = 0.0D;
+ Window.setTimeout(new TimerHandler() {
+ public void onTimer() {
+ canvas.requestPointerLock();
+ long t = System.currentTimeMillis();
+ if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout);
+ mouseUngrabTimeout = 0;
+ if(t - mouseUngrabTimer < 3000l) {
+ mouseUngrabTimeout = Window.setTimeout(new TimerHandler() {
+ public void onTimer() {
+ canvas.requestPointerLock();
+ mouseUngrabTimeout = 0;
+ }
+ }, 3000 - (int)(t - mouseUngrabTimer));
+ }
+ }
+ }, 200);
+ }else {
+ mouseUngrabTimer = System.currentTimeMillis();
+ if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout);
+ mouseUngrabTimeout = 0;
+ doc.exitPointerLock();
+ }
+ }
+ private static void forceMouseGrabbed() {
+ long t = System.currentTimeMillis();
+ if(t - mouseUngrabTimer > 3000l) {
+ if(needsPointerLock && !isPointerLocked()) {
+ canvas.requestPointerLock();
+ if(isPointerLocked()) {
+ needsPointerLock = false;
+ }
+ }
+ }
+ }
+ public static final int mouseGetDX() {
+ double dx = mouseDX;
+ mouseDX = 0.0D;
+ return (int)dx;
+ }
+ public static final int mouseGetDY() {
+ double dy = mouseDY;
+ mouseDY = 0.0D;
+ return (int)dy;
+ }
+ public static final int mouseGetX() {
+ return mouseX;
+ }
+ public static final int mouseGetY() {
+ return mouseY;
+ }
+ public static final int mouseGetEventX() {
+ return currentEvent == null ? -1 : currentEvent.getClientX();
+ }
+ public static final int mouseGetEventY() {
+ return currentEvent == null ? -1 : canvas.getClientHeight() - currentEvent.getClientY();
+ }
+ public static final boolean keysNext() {
+ if(unpressCTRL) { //un-press ctrl after copy/paste permission
+ keyEvents.clear();
+ currentEventK = null;
+ keyStates[29] = false;
+ keyStates[157] = false;
+ keyStates[28] = false;
+ keyStates[219] = false;
+ keyStates[220] = false;
+ unpressCTRL = false;
+ return false;
+ }
+ currentEventK = null;
+ return !keyEvents.isEmpty() && (currentEventK = keyEvents.remove(0)) != null;
+ }
+ public static final int getEventKey() {
+ return currentEventK == null ? -1 : remapKey(getWhich(currentEventK));
+ }
+ public static final char getEventChar() {
+ if(currentEventK == null) return '\0';
+ String s = currentEventK.getKey();
+ return currentEventK == null ? ' ' : (char) (s.length() > 1 ? '\0' : s.charAt(0));
+ }
+ public static final boolean getEventKeyState() {
+ return currentEventK == null? false : !currentEventK.getType().equals("keyup");
+ }
+ public static final boolean isKeyDown(int p1) {
+ if(unpressCTRL) { //un-press ctrl after copy/paste permission
+ keyStates[28] = false;
+ keyStates[29] = false;
+ keyStates[157] = false;
+ keyStates[219] = false;
+ keyStates[220] = false;
+ }
+ return keyStates[p1];
+ }
+ public static final String getKeyName(int p1) {
+ return (p1 >= 0 && p1 < 256) ? LWJGLKeyNames[p1] : "null";
+ }
+ public static final void setFullscreen(boolean p1) {
+ if(p1) {
+ fullscreen();
+ } else {
+ exitFullscreen();
+ }
+ }
+
+ @JSBody(script = "if(!document.fullscreenElement){document.documentElement.requestFullscreen();}")
+ public static final native void fullscreen();
+
+ @JSBody(script = "if(document.fullscreenElement){document.exitFullscreen();}")
+ public static final native void exitFullscreen();
+
+ public static final boolean shouldShutdown() {
+ return false;
+ }
+ public static final boolean isFunctionKeyDown(boolean mod, int p1) {
+ return mod && p1 >= 59 && p1 <= 67 && getEventKey() == (2 + (p1 - 59));
+ }
+ public static final boolean isFunctionKeyDown(int mod, int p1) {
+ return isKeyDown(mod) && p1 >= 59 && p1 <= 67 & getEventKey() == (2 + (p1 - 59));
+ }
+ public static final boolean isFunctionKeyHeldDown(int mod, int p1) {
+ return isKeyDown(mod) && p1 >= 59 && p1 <= 67 & isKeyDown(2 + (p1 - 59));
+ }
+
+ @JSBody(params = { "obj" }, script = "if(obj.commit) obj.commit();")
+ private static native int commitContext(JSObject obj);
+
+ public static final void updateDisplay() {
+ commitContext(webgl);
+ canvasContext.drawImage(canvasBack, 0d, 0d, canvas.getWidth(), canvas.getHeight());
+
+ int ww = canvas.getClientWidth();
+ int hh = canvas.getClientHeight();
+ if(ww != width || hh != height) {
+ width = ww;
+ height = hh;
+ canvasBack.setWidth(ww);
+ canvasBack.setHeight(hh);
+ }
+
+ try {
+ Thread.sleep(1l);
+ } catch (InterruptedException e) {
+ ;
+ }
+ }
+ public static final void setVSyncEnabled(boolean p1) {
+
+ }
+ public static final void enableRepeatEvents(boolean b) {
+ enableRepeatEvents = b;
+ }
+
+ public static boolean isPointerLocked2() {
+ return mouseUngrabTimeout != 0 || isPointerLocked();
+ }
+
+ @JSBody(params = { }, script = "return document.pointerLockElement != null;")
+ public static native boolean isPointerLocked();
+
+ private static boolean pointerLockFlag = false;
+
+ public static final boolean isFocused() {
+ boolean yee = isPointerLocked();
+ boolean dee = pointerLockFlag;
+ pointerLockFlag = yee;
+ if(!dee && yee) {
+ mouseDX = 0.0D;
+ mouseDY = 0.0D;
+ }
+ return isWindowFocused && !(dee && !yee);
+ }
+ public static final int getScreenWidth() {
+ return win.getScreen().getAvailWidth();
+ }
+ public static final int getScreenHeight() {
+ return win.getScreen().getAvailHeight();
+ }
+ public static final int getCanvasWidth() {
+ int w = parent.getClientWidth();
+ if(w != width) {
+ canvas.setWidth(w);
+ canvasBack.setWidth(w);
+ width = w;
+ }
+ return w;
+ }
+ public static final int getCanvasHeight() {
+ int h = parent.getClientHeight();
+ if(h != height) {
+ canvas.setHeight(h);
+ canvasBack.setHeight(h);
+ height = h;
+ }
+ return h;
+ }
+ public static final void setDisplaySize(int x, int y) {
+
+ }
+ public static final void syncDisplay(int performanceToFps) {
+
+ }
+
+ private static final DateFormat dateFormatSS = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
+ public static final void saveScreenshot() {
+ saveScreenshot("screenshot_" + dateFormatSS.format(new Date()).toString() + ".png", canvas);
+ }
+
+ @JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=cvs.toDataURL(\"image/png\");a.download=name;a.click();")
+ private static native void saveScreenshot(String name, HTMLCanvasElement cvs);
+
+ public static final byte[] loadLocalStorage(String key) {
+ String s = win.getLocalStorage().getItem("_eaglercraft_beta."+key);
+ if(s != null) {
+ return Base64.decodeBase64(s);
+ }else {
+ return null;
+ }
+ }
+ public static final void saveLocalStorage(String key, byte[] data) {
+ win.getLocalStorage().setItem("_eaglercraft_beta."+key, Base64.encodeBase64String(data));
+ }
+ public static final void openLink(String url) {
+ win.open(url, "_blank");
+ }
+ public static final void redirectTo(String url) {
+ Window.current().getLocation().setFullURL(url);
+ }
+
+ @JSBody(params = { "ext", "mime" }, script = "window.eagsFileChooser.openFileChooser(ext, mime);")
+ public static native void openFileChooser(String ext, String mime);
+
+ public static final byte[] getFileChooserResult() {
+ ArrayBuffer b = getFileChooserResult0();
+ if(b == null) return null;
+ Uint8Array array = Uint8Array.create(b);
+ byte[] ret = new byte[array.getByteLength()];
+ for(int i = 0; i < ret.length; ++i) {
+ ret[i] = (byte) array.get(i);
+ }
+ return ret;
+ }
+
+ @JSBody(params = { }, script = "var ret = window.eagsFileChooser.getFileChooserResult; window.eagsFileChooser.getFileChooserResult = null; return ret;")
+ private static native ArrayBuffer getFileChooserResult0();
+
+ @JSBody(params = { }, script = "var ret = window.eagsFileChooser.getFileChooserResultName; window.eagsFileChooser.getFileChooserResultName = null; return ret;")
+ public static native String getFileChooserResultName();
+
+ public static final void setListenerPos(float x, float y, float z, float vx, float vy, float vz, float pitch, float yaw) {
+ float var2 = MathHelper.cos(-yaw * 0.017453292F);
+ float var3 = MathHelper.sin(-yaw * 0.017453292F);
+ float var4 = -MathHelper.cos(pitch * 0.017453292F);
+ float var5 = MathHelper.sin(pitch * 0.017453292F);
+ AudioListener l = audioctx.getListener();
+ l.setPosition(x, y, z);
+ l.setOrientation(-var3 * var4, -var5, -var2 * var4, 0.0f, 1.0f, 0.0f);
+ }
+
+ private static int playbackId = 0;
+ private static final HashMap loadedSoundFiles = new HashMap();
+ private static AudioContext audioctx = null;
+ private static float playbackOffsetDelay = 0.03f;
+
+ public static final void setPlaybackOffsetDelay(float f) {
+ playbackOffsetDelay = f;
+ }
+
+ @Async
+ public static native AudioBuffer decodeAudioAsync(ArrayBuffer buffer);
+
+ private static void decodeAudioAsync(ArrayBuffer buffer, final AsyncCallback cb) {
+ audioctx.decodeAudioData(buffer, new DecodeSuccessCallback() {
+ public void onSuccess(AudioBuffer decodedData) {
+ cb.complete(decodedData);
+ }
+ }, new DecodeErrorCallback() {
+ public void onError(JSObject error) {
+ cb.complete(null);
+ }
+ });
+ }
+
+ private static final HashMap activeSoundEffects = new HashMap();
+
+ private static class AudioBufferX {
+ private final AudioBuffer buffer;
+ private AudioBufferX(AudioBuffer buffer) {
+ this.buffer = buffer;
+ }
+ }
+
+ private static class AudioBufferSourceNodeX {
+ private final AudioBufferSourceNode source;
+ private final PannerNode panner;
+ private final GainNode gain;
+ private AudioBufferSourceNodeX(AudioBufferSourceNode source, PannerNode panner, GainNode gain) {
+ this.source = source;
+ this.panner = panner;
+ this.gain = gain;
+ }
+ }
+
+ private static final AudioBuffer getBufferFor(String fileName) {
+ AudioBufferX ret = loadedSoundFiles.get(fileName);
+ if(ret == null) {
+ byte[] file = loadResourceBytes(fileName);
+ if(file == null) return null;
+ Uint8Array buf = Uint8Array.create(file.length);
+ buf.set(file);
+ ret = new AudioBufferX(decodeAudioAsync(buf.getBuffer()));
+ loadedSoundFiles.put(fileName, ret);
+ }
+ return ret.buffer;
+ }
+
+ public static int beginPlayback(String fileName) {
+ AudioBuffer b = getBufferFor(fileName);
+ if(b == null) return -1;
+ AudioBufferSourceNode s = audioctx.createBufferSource();
+ s.setBuffer(b);
+ PannerNode p = audioctx.createPanner();
+ GainNode g = audioctx.createGain();
+ g.getGain().setValue(1.0f);
+ s.connect(g);
+ g.connect(p);
+ p.connect(audioctx.getDestination());
+ s.start(0.0d, playbackOffsetDelay);
+ final int theId = ++playbackId;
+ activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, p, g));
+ s.setOnEnded(new EventListener() {
+
+ public void handleEvent(MediaEvent evt) {
+ activeSoundEffects.remove(theId);
+ }
+
+ });
+ return theId;
+ }
+ public static void beginPlayback(String fileName, float volume) {
+ AudioBuffer b = getBufferFor(fileName);
+ if(b == null) return;
+ AudioBufferSourceNode s = audioctx.createBufferSource();
+ s.setBuffer(b);
+ PannerNode p = audioctx.createPanner();
+ GainNode g = audioctx.createGain();
+ g.getGain().setValue(volume > 1.0f ? 1.0f : volume);
+ s.connect(g);
+ g.connect(p);
+ p.connect(audioctx.getDestination());
+ s.start(0.0d, playbackOffsetDelay);
+ }
+ public static final int beginPlayback(String fileName, float x, float y, float z, float volume) {
+ AudioBuffer b = getBufferFor(fileName);
+ if(b == null) return -1;
+ AudioBufferSourceNode s = audioctx.createBufferSource();
+ s.setBuffer(b);
+ //s.getPlaybackRate().setValue(pitch);
+ PannerNode p = audioctx.createPanner();
+ p.setPosition(x, y, z);
+ p.setMaxDistance(volume * 16f + 0.1f);
+ p.setRolloffFactor(1f);
+ //p.setVelocity(0f, 0f, 0f);
+ p.setDistanceModel("linear");
+ p.setPanningModel("HRTF");
+ p.setConeInnerAngle(360f);
+ p.setConeOuterAngle(0f);
+ p.setConeOuterGain(0f);
+ p.setOrientation(0f, 1f, 0f);
+ GainNode g = audioctx.createGain();
+ g.getGain().setValue(volume > 1.0f ? 1.0f : volume);
+ s.connect(g);
+ g.connect(p);
+ p.connect(audioctx.getDestination());
+ s.start(0.0d, playbackOffsetDelay);
+ final int theId = ++playbackId;
+ activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, p, g));
+ s.setOnEnded(new EventListener() {
+
+ public void handleEvent(MediaEvent evt) {
+ activeSoundEffects.remove(theId);
+ }
+
+ });
+ return theId;
+ }
+ public static final int beginPlaybackStatic(String fileName, float volume, float pitch) {
+ AudioBuffer b = getBufferFor(fileName);
+ if(b == null) return -1;
+ AudioBufferSourceNode s = audioctx.createBufferSource();
+ s.setBuffer(b);
+ s.getPlaybackRate().setValue(pitch);
+ GainNode g = audioctx.createGain();
+ g.getGain().setValue(volume > 1.0f ? 1.0f : volume);
+ s.connect(g);
+ g.connect(audioctx.getDestination());
+ s.start(0.0d, playbackOffsetDelay);
+ final int theId = ++playbackId;
+ activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, null, g));
+ s.setOnEnded(new EventListener() {
+ public void handleEvent(MediaEvent evt) {
+ activeSoundEffects.remove(theId);
+ }
+
+ });
+ return playbackId;
+ }
+ public static final void setPitch(int id, float pitch) {
+ AudioBufferSourceNodeX b = activeSoundEffects.get(id);
+ if(b != null) {
+ b.source.getPlaybackRate().setValue(pitch);
+ }
+ }
+ public static final void setVolume(int id, float volume) {
+ AudioBufferSourceNodeX b = activeSoundEffects.get(id);
+ if(b != null) {
+ b.gain.getGain().setValue(volume > 1.0f ? 1.0f : volume);
+ if(b.panner != null) b.panner.setMaxDistance(volume * 16f + 0.1f);
+ }
+ }
+ public static final void moveSound(int id, float x, float y, float z, float vx, float vy, float vz) {
+ AudioBufferSourceNodeX b = activeSoundEffects.get(id);
+ if(b != null && b.panner != null) {
+ b.panner.setPosition(x, y, z);
+ //b.panner.setVelocity(vx, vy, vz);
+ }
+ }
+ public static final void endSound(int id) {
+ AudioBufferSourceNodeX b = activeSoundEffects.get(id);
+ if(b != null) {
+ b.source.stop();
+ activeSoundEffects.remove(id);
+ }
+ }
+ public static final boolean isPlaying(int id) {
+ return activeSoundEffects.containsKey(id);
+ }
+ public static final void openConsole() {
+
+ }
+ private static boolean connected = false;
+ public static final void voiceConnect(String channel) {
+ win.alert("voice channels are not implemented yet");
+ connected = true;
+ }
+ public static final void voiceVolume(float volume) {
+
+ }
+ public static final boolean voiceActive() {
+ return connected;
+ }
+ public static final boolean voiceRelayed() {
+ return connected;
+ }
+ public static final String[] voiceUsers() {
+ return new String[0];
+ }
+ public static final String[] voiceUsersTalking() {
+ return new String[0];
+ }
+ public static final void voiceEnd() {
+ connected = false;
+ }
+ public static final void doJavascriptCoroutines() {
+
+ }
+ public static final long maxMemory() {
+ return 1024*1024*1024;
+ }
+ public static final long totalMemory() {
+ return 1024*1024*1024;
+ }
+ public static final long freeMemory() {
+ return 0l;
+ }
+ public static final void exit() {
+
+ }
+
+ @JSBody(params = { }, script = "return window.navigator.userAgent;")
+ public static native String getUserAgent();
+
+ private static String[] LWJGLKeyNames = new String[] {"NONE", "ESCAPE", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "MINUS", "EQUALS", "BACK", "TAB", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "LBRACKET", "RBRACKET", "RETURN", "LCONTROL", "A", "S", "D", "F", "G", "H", "J", "K", "L", "SEMICOLON", "APOSTROPHE", "GRAVE", "LSHIFT", "BACKSLASH", "Z", "X", "C", "V", "B", "N", "M", "COMMA", "PERIOD", "SLASH", "RSHIFT", "MULTIPLY", "LMENU", "SPACE", "CAPITAL", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "NUMLOCK", "SCROLL", "NUMPAD7", "NUMPAD8", "NUMPAD9", "SUBTRACT", "NUMPAD4", "NUMPAD5", "NUMPAD6", "ADD", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD0", "DECIMAL", "null", "null", "null", "F11", "F12", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "F13", "F14", "F15", "F16", "F17", "F18", "null", "null", "null", "null", "null", "null", "KANA", "F19", "null", "null", "null", "null", "null", "null", "null", "CONVERT", "null", "NOCONVERT", "null", "YEN", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "NUMPADEQUALS", "null", "null", "CIRCUMFLEX", "AT", "COLON", "UNDERLINE", "KANJI", "STOP", "AX", "UNLABELED", "null", "null", "null", "null", "NUMPADENTER", "RCONTROL", "null", "null", "null", "null", "null", "null", "null", "null", "null", "SECTION", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "NUMPADCOMMA", "null", "DIVIDE", "null", "SYSRQ", "RMENU", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "FUNCTION", "PAUSE", "null", "HOME", "UP", "PRIOR", "null", "LEFT", "null", "RIGHT", "null", "END", "DOWN", "NEXT", "INSERT", "DELETE", "null", "null", "null", "null", "null", "null", "CLEAR", "LMETA", "RMETA", "APPS", "POWER", "SLEEP", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null"};
+
+ private static int[] LWJGLKeyCodes = new int[] {
+ /* 0 */ -1,
+ /* 1 */ -1,
+ /* 2 */ -1,
+ /* 3 */ -1,
+ /* 4 */ -1,
+ /* 5 */ -1,
+ /* 6 */ -1,
+ /* 7 */ -1,
+ /* 8 */ 14,
+ /* 9 */ 15,
+ /* 10 */ -1,
+ /* 11 */ -1,
+ /* 12 */ -1,
+ /* 13 */ 28,
+ /* 14 */ -1,
+ /* 15 */ -1,
+ /* 16 */ 42,
+ /* 17 */ 29,
+ /* 18 */ 56,
+ /* 19 */ -1,
+ /* 20 */ -1,
+ /* 21 */ -1,
+ /* 22 */ -1,
+ /* 23 */ -1,
+ /* 24 */ -1,
+ /* 25 */ -1,
+ /* 26 */ -1,
+ /* 27 */ 1,
+ /* 28 */ -1,
+ /* 29 */ -1,
+ /* 30 */ -1,
+ /* 31 */ -1,
+ /* 32 */ 57,
+ /* 33 */ 210,
+ /* 34 */ 201,
+ /* 35 */ 207,
+ /* 36 */ 199,
+ /* 37 */ 203,
+ /* 38 */ 200,
+ /* 39 */ 205,
+ /* 40 */ 208,
+ /* 41 */ 205,
+ /* 42 */ 208,
+ /* 43 */ -1,
+ /* 44 */ -1,
+ /* 45 */ 210,
+ /* 46 */ 211,
+ /* 47 */ 211,
+ /* 48 */ 11,
+ /* 49 */ 2,
+ /* 50 */ 3,
+ /* 51 */ 4,
+ /* 52 */ 5,
+ /* 53 */ 6,
+ /* 54 */ 7,
+ /* 55 */ 8,
+ /* 56 */ 9,
+ /* 57 */ 10,
+ /* 58 */ -1,
+ /* 59 */ -1,
+ /* 60 */ -1,
+ /* 61 */ -1,
+ /* 62 */ -1,
+ /* 63 */ -1,
+ /* 64 */ -1,
+ /* 65 */ 30,
+ /* 66 */ 48,
+ /* 67 */ 46,
+ /* 68 */ 32,
+ /* 69 */ 18,
+ /* 70 */ 33,
+ /* 71 */ 34,
+ /* 72 */ 35,
+ /* 73 */ 23,
+ /* 74 */ 36,
+ /* 75 */ 37,
+ /* 76 */ 38,
+ /* 77 */ 50,
+ /* 78 */ 49,
+ /* 79 */ 24,
+ /* 80 */ 25,
+ /* 81 */ 16,
+ /* 82 */ 19,
+ /* 83 */ 31,
+ /* 84 */ 20,
+ /* 85 */ 22,
+ /* 86 */ 47,
+ /* 87 */ 17,
+ /* 88 */ 45,
+ /* 89 */ 21,
+ /* 90 */ 44,
+ /* 91 */ -1,
+ /* 92 */ -1,
+ /* 93 */ -1,
+ /* 94 */ -1,
+ /* 95 */ -1,
+ /* 96 */ -1,
+ /* 97 */ -1,
+ /* 98 */ -1,
+ /* 99 */ -1,
+ /* 100 */ -1,
+ /* 101 */ -1,
+ /* 102 */ -1,
+ /* 103 */ -1,
+ /* 104 */ -1,
+ /* 105 */ -1,
+ /* 106 */ -1,
+ /* 107 */ -1,
+ /* 108 */ -1,
+ /* 109 */ 12,
+ /* 110 */ 52,
+ /* 111 */ 53,
+ /* 112 */ -1,
+ /* 113 */ -1,
+ /* 114 */ -1,
+ /* 115 */ -1,
+ /* 116 */ -1,
+ /* 117 */ -1,
+ /* 118 */ -1,
+ /* 119 */ -1,
+ /* 120 */ -1,
+ /* 121 */ -1,
+ /* 122 */ -1,
+ /* 123 */ -1,
+ /* 124 */ -1,
+ /* 125 */ -1,
+ /* 126 */ -1,
+ /* 127 */ -1,
+ /* 128 */ -1,
+ /* 129 */ -1,
+ /* 130 */ -1,
+ /* 131 */ -1,
+ /* 132 */ -1,
+ /* 133 */ -1,
+ /* 134 */ -1,
+ /* 135 */ -1,
+ /* 136 */ -1,
+ /* 137 */ -1,
+ /* 138 */ -1,
+ /* 139 */ -1,
+ /* 140 */ -1,
+ /* 141 */ -1,
+ /* 142 */ -1,
+ /* 143 */ -1,
+ /* 144 */ -1,
+ /* 145 */ -1,
+ /* 146 */ -1,
+ /* 147 */ -1,
+ /* 148 */ -1,
+ /* 149 */ -1,
+ /* 150 */ -1,
+ /* 151 */ -1,
+ /* 152 */ -1,
+ /* 153 */ -1,
+ /* 154 */ -1,
+ /* 155 */ -1,
+ /* 156 */ -1,
+ /* 157 */ -1,
+ /* 158 */ -1,
+ /* 159 */ -1,
+ /* 160 */ -1,
+ /* 161 */ -1,
+ /* 162 */ -1,
+ /* 163 */ -1,
+ /* 164 */ -1,
+ /* 165 */ -1,
+ /* 166 */ -1,
+ /* 167 */ -1,
+ /* 168 */ -1,
+ /* 169 */ -1,
+ /* 170 */ -1,
+ /* 171 */ -1,
+ /* 172 */ -1,
+ /* 173 */ -1,
+ /* 174 */ -1,
+ /* 175 */ -1,
+ /* 176 */ -1,
+ /* 177 */ -1,
+ /* 178 */ -1,
+ /* 179 */ -1,
+ /* 180 */ -1,
+ /* 181 */ -1,
+ /* 182 */ -1,
+ /* 183 */ -1,
+ /* 184 */ -1,
+ /* 185 */ -1,
+ /* 186 */ 39,
+ /* 187 */ 13,
+ /* 188 */ 51,
+ /* 189 */ 12,
+ /* 190 */ 52,
+ /* 191 */ 53,
+ /* 192 */ -1,
+ /* 193 */ -1,
+ /* 194 */ -1,
+ /* 195 */ -1,
+ /* 196 */ -1,
+ /* 197 */ -1,
+ /* 198 */ -1,
+ /* 199 */ -1,
+ /* 200 */ -1,
+ /* 200 */ -1,
+ /* 201 */ -1,
+ /* 202 */ -1,
+ /* 203 */ -1,
+ /* 204 */ -1,
+ /* 205 */ -1,
+ /* 206 */ -1,
+ /* 207 */ -1,
+ /* 208 */ -1,
+ /* 209 */ -1,
+ /* 210 */ -1,
+ /* 211 */ -1,
+ /* 212 */ -1,
+ /* 213 */ -1,
+ /* 214 */ -1,
+ /* 215 */ -1,
+ /* 216 */ -1,
+ /* 217 */ -1,
+ /* 218 */ -1,
+ /* 219 */ 26,
+ /* 220 */ 43,
+ /* 221 */ 27,
+ /* 222 */ 40
+ };
+
+ public static final int _wArrayByteLength(Object obj) {
+ return ((Int32Array)obj).getByteLength();
+ }
+
+ public static final Object _wCreateLowLevelIntBuffer(int len) {
+ return Int32Array.create(len);
+ }
+
+ private static int appendbufferindex = 0;
+ private static Int32Array appendbuffer = Int32Array.create(ArrayBuffer.create(525000*4));
+
+ public static final void _wAppendLowLevelBuffer(Object arr) {
+ Int32Array a = ((Int32Array)arr);
+ if(appendbufferindex + a.getLength() < appendbuffer.getLength()) {
+ appendbuffer.set(a, appendbufferindex);
+ appendbufferindex += a.getLength();
+ }
+ }
+
+ public static final Object _wGetLowLevelBuffersAppended() {
+ Int32Array ret = Int32Array.create(appendbuffer.getBuffer(), 0, appendbufferindex);
+ appendbufferindex = 0;
+ return ret;
+ }
+
+ private static int remapKey(int k) {
+ return (k > LWJGLKeyCodes.length || k < 0) ? -1 : LWJGLKeyCodes[k];
+ }
+
+ @JSFunctor
+ private static interface StupidFunctionResolveString extends JSObject {
+ void resolveStr(String s);
+ }
+
+ private static boolean unpressCTRL = false;
+
+ @Async
+ public static native String getClipboard();
+
+ private static void getClipboard(final AsyncCallback cb) {
+ final long start = System.currentTimeMillis();
+ getClipboard0(new StupidFunctionResolveString() {
+ public void resolveStr(String s) {
+ if(System.currentTimeMillis() - start > 500l) {
+ unpressCTRL = true;
+ }
+ cb.complete(s);
+ }
+ });
+ }
+
+ @JSBody(params = { "cb" }, script = "if(!window.navigator.clipboard) cb(null); else window.navigator.clipboard.readText().then(function(s) { cb(s); }, function(s) { cb(null); });")
+ private static native void getClipboard0(StupidFunctionResolveString cb);
+
+ @JSBody(params = { "str" }, script = "if(window.navigator.clipboard) window.navigator.clipboard.writeText(str);")
+ public static native void setClipboard(String str);
+
+ @JSBody(params = { "obj" }, script = "return typeof obj === \"string\";")
+ private static native boolean isString(JSObject obj);
+
+ public static final boolean fileExists(String path) {
+ return IndexedDBFilesystem.fileExists(path);
+ }
+
+ public static final boolean directoryExists(String path) {
+ return IndexedDBFilesystem.directoryExists(path);
+ }
+
+ public static final boolean pathExists(String path) {
+ return IndexedDBFilesystem.pathExists(path);
+ }
+
+ public static final void writeFile(String path, byte[] data) {
+ IndexedDBFilesystem.writeFile(path, data);
+ }
+
+ public static final byte[] readFile(String path) {
+ return IndexedDBFilesystem.readFile(path);
+ }
+
+ public static final long getLastModified(String path) {
+ return IndexedDBFilesystem.getLastModified(path);
+ }
+
+ public static final int getFileSize(String path) {
+ return IndexedDBFilesystem.getFileSize(path);
+ }
+
+ public static final void renameFile(String oldPath, String newPath) {
+ IndexedDBFilesystem.renameFile(oldPath, newPath);
+ }
+
+ public static final void copyFile(String oldPath, String newPath) {
+ IndexedDBFilesystem.copyFile(oldPath, newPath);
+ }
+
+ public static final void deleteFile(String path) {
+ IndexedDBFilesystem.deleteFile(path);
+ }
+
+ public static final Collection listFiles(String path, boolean listDirs, boolean recursiveDirs) {
+ return IndexedDBFilesystem.listFiles(path, listDirs, recursiveDirs);
+ }
+
+ public static final Collection listFilesAndDirectories(String path) {
+ return listFiles(path, true, false);
+ }
+
+ public static final Collection listFilesRecursive(String path) {
+ return listFiles(path, false, true);
+ }
+
+ public static class FileEntry {
+
+ public final String path;
+ public final boolean isDirectory;
+ public final long lastModified;
+
+ public FileEntry(String path, boolean isDirectory, long lastModified) {
+ this.path = path;
+ this.isDirectory = isDirectory;
+ this.lastModified = lastModified;
+ }
+
+ public String getName() {
+ int i = path.indexOf('/');
+ if(i >= 0) {
+ return path.substring(i + 1);
+ }else {
+ return path;
+ }
+ }
+
+ }
+
+ private static String stripPath(String str) {
+ if(str.startsWith("/")) {
+ str = str.substring(1);
+ }
+ if(str.endsWith("/")) {
+ str = str.substring(0, str.length() - 1);
+ }
+ return str;
+ }
+
+ @JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=URL.createObjectURL(new Blob([cvs],{type:\"application/octet-stream\"}));a.download=name;a.click();URL.revokeObjectURL(a.href);")
+ private static native void downloadFile0(String name, ArrayBuffer cvs);
+
+ public static final void downloadFile(String filename, byte[] data) {
+ Uint8Array b = Uint8Array.create(data.length);
+ b.set(data);
+ downloadFile0(filename, b.getBuffer());
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java b/src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java
new file mode 100644
index 0000000..d061bfd
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/adapter/Tessellator.java
@@ -0,0 +1,339 @@
+package net.lax1dude.eaglercraft.adapter;
+
+import org.lwjgl.opengl.GL11;
+import org.teavm.jso.typedarrays.ArrayBuffer;
+import org.teavm.jso.typedarrays.Float32Array;
+import org.teavm.jso.typedarrays.Int32Array;
+
+public class Tessellator {
+
+ /** The byte buffer used for GL allocation. */
+ private Int32Array intBuffer;
+ private Float32Array floatBuffer;
+
+ /**
+ * The number of vertices to be drawn in the next draw call. Reset to 0 between
+ * draw calls.
+ */
+ private int vertexCount = 0;
+
+ /** The first coordinate to be used for the texture. */
+ private float textureU;
+
+ /** The second coordinate to be used for the texture. */
+ private float textureV;
+
+ /** The color (RGBA) value to be used for the following draw call. */
+ private int color;
+
+ /**
+ * Whether the current draw object for this tessellator has color values.
+ */
+ private boolean hasColor = false;
+
+ /**
+ * Whether the current draw object for this tessellator has texture coordinates.
+ */
+ private boolean hasTexture = false;
+
+ /**
+ * Whether the current draw object for this tessellator has normal values.
+ */
+ private boolean hasNormals = false;
+
+ /** The index into the raw buffer to be used for the next data. */
+ private int rawBufferIndex = 0;
+
+ /**
+ * The number of vertices manually added to the given draw call. This differs
+ * from vertexCount because it adds extra vertices when converting quads to
+ * triangles.
+ */
+ private int addedVertices = 0;
+
+ /** Disables all color information for the following draw call. */
+ private boolean isColorDisabled = false;
+
+ /**
+ * An offset to be applied along the x-axis for all vertices in this draw call.
+ */
+ private double xOffset;
+
+ /**
+ * An offset to be applied along the y-axis for all vertices in this draw call.
+ */
+ private double yOffset;
+
+ /**
+ * An offset to be applied along the z-axis for all vertices in this draw call.
+ */
+ private double zOffset;
+
+ /** The normal to be applied to the face being drawn. */
+ private int normal;
+
+ /** The static instance of the Tessellator. */
+ public static final Tessellator instance = new Tessellator(525000);
+
+ /** Whether this tessellator is currently in draw mode. */
+ private boolean isDrawing = false;
+
+ /** Whether we are currently using VBO or not. */
+ private boolean useVBO = false;
+
+ /** The size of the buffers used (in integers). */
+ private int bufferSize;
+
+ private int drawMode;
+
+ private Tessellator(int par1) {
+ this.bufferSize = par1;
+ ArrayBuffer a = ArrayBuffer.create(par1 * 4);
+ this.intBuffer = Int32Array.create(a);
+ this.floatBuffer = Float32Array.create(a);
+ }
+
+ /**
+ * Draws the data set up in this tessellator and resets the state to prepare for
+ * new drawing.
+ */
+ public int draw() {
+ if (!this.isDrawing) {
+ return 0;
+ } else {
+ this.isDrawing = false;
+
+ if (this.vertexCount > 0) {
+
+ if (this.hasTexture) {
+ GL11.glEnableVertexAttrib(GL11.GL_TEXTURE_COORD_ARRAY);
+ }
+
+ if (this.hasColor) {
+ GL11.glEnableVertexAttrib(GL11.GL_COLOR_ARRAY);
+ }
+
+ if (this.hasNormals) {
+ GL11.glEnableVertexAttrib(GL11.GL_NORMAL_ARRAY);
+ }
+
+ GL11.glDrawArrays(drawMode, 0, this.vertexCount, Int32Array.create(intBuffer.getBuffer(), 0, this.vertexCount * 7));
+
+ if (this.hasTexture) {
+ GL11.glDisableVertexAttrib(GL11.GL_TEXTURE_COORD_ARRAY);
+ }
+
+ if (this.hasColor) {
+ GL11.glDisableVertexAttrib(GL11.GL_COLOR_ARRAY);
+ }
+
+ if (this.hasNormals) {
+ GL11.glDisableVertexAttrib(GL11.GL_NORMAL_ARRAY);
+ }
+ }
+
+ int var1 = this.rawBufferIndex * 4;
+ this.reset();
+ return var1;
+ }
+ }
+
+ /**
+ * Clears the tessellator state in preparation for new drawing.
+ */
+ private void reset() {
+ this.vertexCount = 0;
+ //this.byteBuffer.clear();
+ this.rawBufferIndex = 0;
+ this.addedVertices = 0;
+ }
+
+ /**
+ * Resets tessellator state and prepares for drawing (with the specified draw
+ * mode).
+ */
+ public void startDrawing(int drawMode) {
+ this.drawMode = drawMode;
+ this.isDrawing = true;
+ this.reset();
+ this.hasNormals = false;
+ this.hasColor = false;
+ this.hasTexture = false;
+ this.isColorDisabled = false;
+ }
+
+ /**
+ * Sets the texture coordinates.
+ */
+ public void setTextureUV(double par1, double par3) {
+ this.hasTexture = true;
+ this.textureU = (float) par1;
+ this.textureV = (float) par3;
+ }
+
+ /**
+ * Sets the RGB values as specified, converting from floats between 0 and 1 to
+ * integers from 0-255.
+ */
+ public void setColorOpaque_F(float par1, float par2, float par3) {
+ this.setColorOpaque((int) (par1 * 255.0F), (int) (par2 * 255.0F), (int) (par3 * 255.0F));
+ }
+
+ /**
+ * Sets the RGBA values for the color, converting from floats between 0 and 1 to
+ * integers from 0-255.
+ */
+ public void setColorRGBA_F(float par1, float par2, float par3, float par4) {
+ this.setColorRGBA((int) (par1 * 255.0F), (int) (par2 * 255.0F), (int) (par3 * 255.0F), (int) (par4 * 255.0F));
+ }
+
+ /**
+ * Sets the RGB values as specified, and sets alpha to opaque.
+ */
+ public void setColorOpaque(int par1, int par2, int par3) {
+ this.setColorRGBA(par1, par2, par3, 255);
+ }
+
+ /**
+ * Sets the RGBA values for the color. Also clamps them to 0-255.
+ */
+ public void setColorRGBA(int par1, int par2, int par3, int par4) {
+ if (!this.isColorDisabled) {
+ if (par1 > 255) {
+ par1 = 255;
+ }
+
+ if (par2 > 255) {
+ par2 = 255;
+ }
+
+ if (par3 > 255) {
+ par3 = 255;
+ }
+
+ if (par4 > 255) {
+ par4 = 255;
+ }
+
+ if (par1 < 0) {
+ par1 = 0;
+ }
+
+ if (par2 < 0) {
+ par2 = 0;
+ }
+
+ if (par3 < 0) {
+ par3 = 0;
+ }
+
+ if (par4 < 0) {
+ par4 = 0;
+ }
+
+ this.hasColor = true;
+ this.color = par4 << 24 | par3 << 16 | par2 << 8 | par1;
+ }
+ }
+
+ /**
+ * Adds a vertex specifying both x,y,z and the texture u,v for it.
+ */
+ public void addVertexWithUV(double par1, double par3, double par5, double par7, double par9) {
+ this.setTextureUV(par7, par9);
+ this.addVertex(par1, par3, par5);
+ }
+
+ /**
+ * Adds a vertex with the specified x,y,z to the current draw call. It will
+ * trigger a draw() if the buffer gets full.
+ */
+ public void addVertex(double par1, double par3, double par5) {
+ if(this.addedVertices > 65534) return;
+ ++this.addedVertices;
+ ++this.vertexCount;
+
+ int bufferIndex = this.rawBufferIndex;
+ Int32Array intBuffer0 = intBuffer;
+ Float32Array floatBuffer0 = floatBuffer;
+
+ floatBuffer0.set(bufferIndex + 0, (float) (par1 + this.xOffset));
+ floatBuffer0.set(bufferIndex + 1, (float) (par3 + this.yOffset));
+ floatBuffer0.set(bufferIndex + 2, (float) (par5 + this.zOffset));
+
+ if (this.hasTexture) {
+ floatBuffer0.set(bufferIndex + 3, this.textureU);
+ floatBuffer0.set(bufferIndex + 4, this.textureV);
+ }
+
+ if (this.hasColor) {
+ intBuffer0.set(bufferIndex + 5, this.color);
+ }
+
+ if (this.hasNormals) {
+ intBuffer0.set(bufferIndex + 6, this.normal);
+ }
+
+ this.rawBufferIndex += 7;
+ }
+
+ /**
+ * Sets the color to the given opaque value (stored as byte values packed in an
+ * integer).
+ */
+ public void setColorOpaque_I(int par1) {
+ int var2 = par1 >> 16 & 255;
+ int var3 = par1 >> 8 & 255;
+ int var4 = par1 & 255;
+ this.setColorOpaque(var2, var3, var4);
+ }
+
+ /**
+ * Sets the color to the given color (packed as bytes in integer) and alpha
+ * values.
+ */
+ public void setColorRGBA_I(int par1, int par2) {
+ int var3 = par1 >> 16 & 255;
+ int var4 = par1 >> 8 & 255;
+ int var5 = par1 & 255;
+ this.setColorRGBA(var3, var4, var5, par2);
+ }
+
+ /**
+ * Disables colors for the current draw call.
+ */
+ public void disableColor() {
+ this.isColorDisabled = true;
+ }
+
+ /**
+ * Sets the normal for the current draw call.
+ */
+ public void setNormal(float par1, float par2, float par3) {
+ this.hasNormals = true;
+ float len = (float) Math.sqrt(par1 * par1 + par2 * par2 + par3 * par3);
+ int var4 = (int)((par1 / len) * 125.0F) + 125;
+ int var5 = (int)((par2 / len) * 125.0F) + 125;
+ int var6 = (int)((par3 / len) * 125.0F) + 125;
+ this.normal = var4 & 255 | (var5 & 255) << 8 | (var6 & 255) << 16;
+ GL11.glNormal3f(par1, par2, par3);
+ }
+
+ /**
+ * Sets the translation for all vertices in the current draw call.
+ */
+ public void setTranslationD(double par1, double par3, double par5) {
+ this.xOffset = par1;
+ this.yOffset = par3;
+ this.zOffset = par5;
+ }
+
+ /**
+ * Offsets the translation for all vertices in the current draw call.
+ */
+ public void setTranslationF(float par1, float par2, float par3) {
+ this.xOffset += (float) par1;
+ this.yOffset += (float) par2;
+ this.zOffset += (float) par3;
+ }
+}
diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/BufferConverter.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/BufferConverter.java
new file mode 100644
index 0000000..6125bc7
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/BufferConverter.java
@@ -0,0 +1,34 @@
+package net.lax1dude.eaglercraft.adapter.teavm;
+
+import java.nio.ByteBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.ShortBuffer;
+
+public class BufferConverter {
+
+ public static final byte[] convertByteBuffer(ByteBuffer b) {
+ byte[] ret = new byte[b.limit() - b.position()];
+ b.get(ret);
+ return ret;
+ }
+
+ public static final short[] convertShortBuffer(ShortBuffer b) {
+ short[] ret = new short[b.limit() - b.position()];
+ b.get(ret);
+ return ret;
+ }
+
+ public static final int[] convertIntBuffer(IntBuffer b) {
+ int[] ret = new int[b.limit() - b.position()];
+ b.get(ret);
+ return ret;
+ }
+
+ public static final float[] convertFloatBuffer(FloatBuffer b) {
+ float[] ret = new float[b.limit() - b.position()];
+ b.get(ret);
+ return ret;
+ }
+
+}
diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStorePatched.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStorePatched.java
new file mode 100644
index 0000000..963ee3a
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IDBObjectStorePatched.java
@@ -0,0 +1,79 @@
+package net.lax1dude.eaglercraft.adapter.teavm;
+
+import org.teavm.jso.JSBody;
+import org.teavm.jso.JSObject;
+import org.teavm.jso.JSProperty;
+import org.teavm.jso.core.JSString;
+import org.teavm.jso.indexeddb.IDBCountRequest;
+import org.teavm.jso.indexeddb.IDBCursorRequest;
+import org.teavm.jso.indexeddb.IDBCursorSource;
+import org.teavm.jso.indexeddb.IDBDatabase;
+import org.teavm.jso.indexeddb.IDBGetRequest;
+import org.teavm.jso.indexeddb.IDBIndex;
+import org.teavm.jso.indexeddb.IDBKeyRange;
+import org.teavm.jso.indexeddb.IDBObjectStoreParameters;
+import org.teavm.jso.indexeddb.IDBRequest;
+import org.teavm.jso.indexeddb.IDBTransaction;
+
+public abstract class IDBObjectStorePatched implements JSObject, IDBCursorSource {
+
+ @JSBody(params = { "db", "name", "optionalParameters" }, script = "return db.createObjectStore(name, optionalParameters);")
+ public static native IDBObjectStorePatched createObjectStorePatch(IDBDatabase db, String name, IDBObjectStoreParameters optionalParameters);
+
+ @JSBody(params = { "tx", "name" }, script = "return tx.objectStore(name);")
+ public static native IDBObjectStorePatched objectStorePatch(IDBTransaction tx, String name);
+
+ @JSProperty
+ public abstract String getName();
+
+ @JSProperty("keyPath")
+ abstract JSObject getKeyPathImpl();
+
+ public final String[] getKeyPath() {
+ JSObject result = getKeyPathImpl();
+ if (JSString.isInstance(result)) {
+ return new String[] { result.cast().stringValue() };
+ } else {
+ return unwrapStringArray(result);
+ }
+ }
+
+ @JSBody(params = { "obj" }, script = "return this;")
+ private static native String[] unwrapStringArray(JSObject obj);
+
+ @JSProperty
+ public abstract String[] getIndexNames();
+
+ @JSProperty
+ public abstract boolean isAutoIncrement();
+
+ public abstract IDBRequest put(JSObject value, JSObject key);
+
+ public abstract IDBRequest put(JSObject value);
+
+ public abstract IDBRequest add(JSObject value, JSObject key);
+
+ public abstract IDBRequest add(JSObject value);
+
+ public abstract IDBRequest delete(JSObject key);
+
+ public abstract IDBGetRequest get(JSObject key);
+
+ public abstract IDBRequest clear();
+
+ public abstract IDBCursorRequest openCursor();
+
+ public abstract IDBCursorRequest openCursor(IDBKeyRange range);
+
+ public abstract IDBIndex createIndex(String name, String key);
+
+ public abstract IDBIndex createIndex(String name, String[] keys);
+
+ public abstract IDBIndex index(String name);
+
+ public abstract void deleteIndex(String name);
+
+ public abstract IDBCountRequest count();
+
+ public abstract IDBCountRequest count(JSObject key);
+}
diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IndexedDBFilesystem.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IndexedDBFilesystem.java
new file mode 100644
index 0000000..8818206
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/IndexedDBFilesystem.java
@@ -0,0 +1,407 @@
+package net.lax1dude.eaglercraft.adapter.teavm;
+
+import java.util.Collection;
+import java.util.LinkedList;
+
+import org.teavm.interop.Async;
+import org.teavm.interop.AsyncCallback;
+import org.teavm.jso.JSBody;
+import org.teavm.jso.JSObject;
+import org.teavm.jso.dom.events.EventListener;
+import org.teavm.jso.indexeddb.EventHandler;
+import org.teavm.jso.indexeddb.IDBCountRequest;
+import org.teavm.jso.indexeddb.IDBCursor;
+import org.teavm.jso.indexeddb.IDBCursorRequest;
+import org.teavm.jso.indexeddb.IDBDatabase;
+import org.teavm.jso.indexeddb.IDBFactory;
+import org.teavm.jso.indexeddb.IDBGetRequest;
+import org.teavm.jso.indexeddb.IDBObjectStoreParameters;
+import org.teavm.jso.indexeddb.IDBOpenDBRequest;
+import org.teavm.jso.indexeddb.IDBRequest;
+import org.teavm.jso.indexeddb.IDBTransaction;
+import org.teavm.jso.indexeddb.IDBVersionChangeEvent;
+import org.teavm.jso.typedarrays.ArrayBuffer;
+import org.teavm.jso.typedarrays.Uint8Array;
+
+import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2;
+import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.FileEntry;
+
+public class IndexedDBFilesystem {
+
+ public static enum OpenState {
+ OPENED, LOCKED, ERROR
+ }
+
+ private static String err = "";
+ private static IDBDatabase db = null;
+
+ public static final OpenState initialize() {
+ DatabaseOpen dbo = AsyncHandlers.openDB("_net_PeytonPlayz585_ClassicCraft_IndexedDBFilesystem_1_3");
+ if(dbo == null) {
+ err = "Unknown Error";
+ return OpenState.ERROR;
+ }
+ if(dbo.failedLocked) {
+ return OpenState.LOCKED;
+ }
+ if(dbo.failedInit || dbo.database == null) {
+ err = dbo.failedError == null ? "Initialization Failed" : dbo.failedError;
+ return OpenState.ERROR;
+ }
+ db = dbo.database;
+ return OpenState.OPENED;
+ }
+
+ public static final String errorDetail() {
+ return err;
+ }
+
+ public static final boolean fileExists(String path) {
+ return AsyncHandlers.fileGetType(db, path) == FileExists.FILE;
+ }
+
+ public static final boolean directoryExists(String path) {
+ return AsyncHandlers.fileGetType(db, path) == FileExists.DIRECTORY;
+ }
+
+ public static final boolean pathExists(String path) {
+ return AsyncHandlers.fileExists(db, path).bool;
+ }
+
+ private static final void mkdir(String dir) {
+ if(directoryExists(dir)) {
+ return;
+ }
+ int i = dir.lastIndexOf('/');
+ if(i > 0) {
+ mkdir(dir.substring(0, i));
+ }
+ AsyncHandlers.writeWholeFile(db, dir, true, ArrayBuffer.create(0));
+ }
+
+ public static final void writeFile(String path, byte[] data) {
+ int i = path.lastIndexOf('/');
+ if(i > 0) {
+ mkdir(path.substring(0, i));
+ }
+ Uint8Array arr = Uint8Array.create(data.length);
+ arr.set(data);
+ AsyncHandlers.writeWholeFile(db, path, false, arr.getBuffer());
+ }
+
+ public static final byte[] readFile(String path) {
+ ArrayBuffer arr = AsyncHandlers.readWholeFile(db, path);
+ if(arr == null) {
+ return null;
+ }
+ byte[] data = new byte[arr.getByteLength()];
+ Uint8Array arrr = Uint8Array.create(arr);
+ for(int i = 0; i < data.length; ++i) {
+ data[i] = (byte) arrr.get(i);
+ }
+ return data;
+ }
+
+ public static final long getLastModified(String path) {
+ int lm = AsyncHandlers.fileGetLastModified(db, path);
+ return lm == -1 ? -1l : AsyncHandlers.eaglercraftEpoch + lm;
+ }
+
+ public static final int getFileSize(String path) {
+ ArrayBuffer arr = AsyncHandlers.readWholeFile(db, path);
+ if(arr == null) {
+ return -1;
+ }else {
+ return arr.getByteLength();
+ }
+ }
+
+ public static final void renameFile(String oldPath, String newPath) {
+ copyFile(oldPath, newPath);
+ AsyncHandlers.deleteFile(db, oldPath);
+ }
+
+ public static final void copyFile(String oldPath, String newPath) {
+ ArrayBuffer arr = AsyncHandlers.readWholeFile(db, oldPath);
+ int i = newPath.lastIndexOf('/');
+ if(i > 0) {
+ mkdir(newPath.substring(0, i));
+ }
+ AsyncHandlers.writeWholeFile(db, newPath, false, arr);
+ }
+
+ public static final void deleteFile(String path) {
+ AsyncHandlers.deleteFile(db, path);
+ }
+
+ public static final Collection listFiles(String path, boolean listDirs, boolean recursiveDirs) {
+ LinkedList lst = new LinkedList();
+ AsyncHandlers.iterateFiles(db, path, listDirs, recursiveDirs, lst);
+ return lst;
+ }
+
+ protected static class BooleanResult {
+
+ protected static final BooleanResult TRUE = new BooleanResult(true);
+ protected static final BooleanResult FALSE = new BooleanResult(false);
+
+ protected final boolean bool;
+
+ private BooleanResult(boolean b) {
+ bool = b;
+ }
+
+ protected static BooleanResult _new(boolean b) {
+ return b ? TRUE : FALSE;
+ }
+
+ }
+
+ protected static class DatabaseOpen {
+
+ protected final boolean failedInit;
+ protected final boolean failedLocked;
+ protected final String failedError;
+
+ protected final IDBDatabase database;
+
+ protected DatabaseOpen(boolean init, boolean locked, String error, IDBDatabase db) {
+ failedInit = init;
+ failedLocked = locked;
+ failedError = error;
+ database = db;
+ }
+
+ }
+
+ protected static enum FileExists {
+ FILE, DIRECTORY, FALSE
+ }
+
+ @JSBody(script = "return ((typeof indexedDB) !== 'undefined') ? indexedDB : null;")
+ protected static native IDBFactory createIDBFactory();
+
+ protected static class AsyncHandlers {
+
+ protected static final long eaglercraftEpoch = 1645568542000l;
+
+ @Async
+ protected static native DatabaseOpen openDB(String name);
+
+ private static void openDB(String name, final AsyncCallback cb) {
+ IDBFactory i = createIDBFactory();
+ if(i == null) {
+ cb.complete(new DatabaseOpen(false, false, "window.indexedDB was null or undefined", null));
+ return;
+ }
+ final IDBOpenDBRequest f = i.open(name, 1);
+ f.setOnBlocked(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(new DatabaseOpen(false, true, null, null));
+ }
+ });
+ f.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(new DatabaseOpen(false, false, null, f.getResult()));
+ }
+ });
+ f.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(new DatabaseOpen(true, false, "open error", null));
+ }
+ });
+ f.setOnUpgradeNeeded(new EventListener() {
+ public void handleEvent(IDBVersionChangeEvent evt) {
+ IDBObjectStorePatched.createObjectStorePatch(f.getResult(), "filesystem", IDBObjectStoreParameters.create().keyPath("path"));
+ }
+ });
+ }
+
+ @Async
+ protected static native BooleanResult deleteFile(IDBDatabase db, String name);
+
+ private static void deleteFile(IDBDatabase db, String name, final AsyncCallback cb) {
+ IDBTransaction tx = db.transaction("filesystem", "readwrite");
+ final IDBRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").delete(makeTheFuckingKeyWork(name));
+
+ r.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(BooleanResult._new(true));
+ }
+ });
+ r.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(BooleanResult._new(false));
+ }
+ });
+ }
+
+ @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? null : ((typeof obj.data === 'undefined') ? null : obj.data);")
+ protected static native ArrayBuffer readRow(JSObject obj);
+
+ @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? false : ((typeof obj.directory === 'undefined') ? false : obj.directory);")
+ protected static native boolean isRowDirectory(JSObject obj);
+
+ @JSBody(params = { "obj" }, script = "return (typeof obj === 'undefined') ? -1 : ((typeof obj.lastModified === 'undefined') ? -1 : obj.lastModified);")
+ protected static native int readLastModified(JSObject obj);
+
+ @JSBody(params = { "obj" }, script = "return [obj];")
+ private static native JSObject makeTheFuckingKeyWork(String k);
+
+ @Async
+ protected static native ArrayBuffer readWholeFile(IDBDatabase db, String name);
+
+ private static void readWholeFile(IDBDatabase db, String name, final AsyncCallback cb) {
+ IDBTransaction tx = db.transaction("filesystem", "readonly");
+ final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name));
+ r.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(isRowDirectory(r.getResult()) ? null : readRow(r.getResult()));
+ }
+ });
+ r.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(null);
+ }
+ });
+
+ }
+
+ @Async
+ protected static native Integer readLastModified(IDBDatabase db, String name);
+
+ private static void readLastModified(IDBDatabase db, String name, final AsyncCallback cb) {
+ IDBTransaction tx = db.transaction("filesystem", "readonly");
+ final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name));
+ r.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(readLastModified(r.getResult()));
+ }
+ });
+ r.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(-1);
+ }
+ });
+
+ }
+
+ @JSBody(params = { "k" }, script = "return ((typeof k) === \"string\") ? k : (((typeof k) === \"undefined\") ? null : (((typeof k[0]) === \"string\") ? k[0] : null));")
+ private static native String readKey(JSObject k);
+
+ @Async
+ protected static native Integer iterateFiles(IDBDatabase db, final String prefix, final boolean listDirs, final boolean recursiveDirs, final Collection lst);
+
+ private static void iterateFiles(IDBDatabase db, final String prefix, final boolean listDirs, final boolean recursiveDirs, final Collection lst, final AsyncCallback cb) {
+ IDBTransaction tx = db.transaction("filesystem", "readonly");
+ final IDBCursorRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").openCursor();
+ final int[] res = new int[1];
+ r.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ IDBCursor c = r.getResult();
+ if(c == null || c.getKey() == null || c.getValue() == null) {
+ cb.complete(res[0]);
+ return;
+ }
+ String k = readKey(c.getKey());
+ if(k != null) {
+ if(k.startsWith(prefix)) {
+ if(recursiveDirs || k.indexOf('/', prefix.length() + 1) == -1) {
+ boolean dir = isRowDirectory(c.getValue());
+ if(dir) {
+ if(listDirs) {
+ lst.add(new EaglerAdapterImpl2.FileEntry(k, true, -1));
+ }
+ }else {
+ lst.add(new EaglerAdapterImpl2.FileEntry(k, false, eaglercraftEpoch + readLastModified(c.getValue())));
+ }
+ }
+ }
+ }
+ c.doContinue();
+ }
+ });
+ r.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(res[0] > 0 ? res[0] : -1);
+ }
+ });
+ }
+
+ @Async
+ protected static native BooleanResult fileExists(IDBDatabase db, String name);
+
+ private static void fileExists(IDBDatabase db, String name, final AsyncCallback cb) {
+ IDBTransaction tx = db.transaction("filesystem", "readonly");
+ final IDBCountRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").count(makeTheFuckingKeyWork(name));
+ r.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(BooleanResult._new(r.getResult() > 0));
+ }
+ });
+ r.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(BooleanResult._new(false));
+ }
+ });
+ }
+
+ @Async
+ protected static native Integer fileGetLastModified(IDBDatabase db, String name);
+
+ private static void fileGetLastModified(IDBDatabase db, String name, final AsyncCallback cb) {
+ IDBTransaction tx = db.transaction("filesystem", "readonly");
+ final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name));
+ r.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(readLastModified(r.getResult()));
+ }
+ });
+ r.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(-1);
+ }
+ });
+ }
+
+ @Async
+ protected static native FileExists fileGetType(IDBDatabase db, String name);
+
+ private static void fileGetType(IDBDatabase db, String name, final AsyncCallback cb) {
+ IDBTransaction tx = db.transaction("filesystem", "readonly");
+ final IDBGetRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").get(makeTheFuckingKeyWork(name));
+ r.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(r.getResult() == null ? FileExists.FALSE : (isRowDirectory(r.getResult()) ? FileExists.DIRECTORY : FileExists.FILE));
+ }
+ });
+ r.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(FileExists.FALSE);
+ }
+ });
+ }
+
+ @JSBody(params = { "pat", "dir", "lm", "dat" }, script = "return { path: pat, directory: dir, lastModified: lm, data: dat };")
+ protected static native JSObject writeRow(String name, boolean directory, int lm, ArrayBuffer data);
+
+ @Async
+ protected static native BooleanResult writeWholeFile(IDBDatabase db, String name, boolean directory, ArrayBuffer data);
+
+ private static void writeWholeFile(IDBDatabase db, String name, boolean directory, ArrayBuffer data, final AsyncCallback cb) {
+ IDBTransaction tx = db.transaction("filesystem", "readwrite");
+ final IDBRequest r = IDBObjectStorePatched.objectStorePatch(tx, "filesystem").put(writeRow(name, directory, (int)(System.currentTimeMillis() - eaglercraftEpoch), data));
+ r.setOnSuccess(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(BooleanResult._new(true));
+ }
+ });
+ r.setOnError(new EventHandler() {
+ public void handleEvent() {
+ cb.complete(BooleanResult._new(false));
+ }
+ });
+ }
+ }
+
+}
diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGL2RenderingContext.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGL2RenderingContext.java
new file mode 100644
index 0000000..91c0487
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGL2RenderingContext.java
@@ -0,0 +1,42 @@
+package net.lax1dude.eaglercraft.adapter.teavm;
+
+import org.teavm.jso.webgl.WebGLRenderingContext;
+
+public interface WebGL2RenderingContext extends WebGLRenderingContext {
+
+ int TEXTURE_MAX_LEVEL = 0x0000813D;
+ int TEXTURE_MAX_ANISOTROPY_EXT = 0x000084FE;
+ int UNSIGNED_INT_24_8 = 0x000084FA;
+ int ANY_SAMPLES_PASSED = 0x00008D6A;
+ int QUERY_RESULT = 0x00008866;
+ int QUERY_RESULT_AVAILABLE = 0x00008867;
+ int DEPTH24_STENCIL8 = 0x000088F0;
+ int DEPTH_COMPONENT32F = 0x00008CAC;
+ int READ_FRAMEBUFFER = 0x00008CA8;
+ int DRAW_FRAMEBUFFER = 0x00008CA9;
+ int RGB8 = 0x00008051;
+ int RGBA8 = 0x00008058;
+
+ WebGLQuery createQuery();
+
+ void beginQuery(int p1, WebGLQuery obj);
+
+ void endQuery(int p1);
+
+ void deleteQuery(WebGLQuery obj);
+
+ int getQueryParameter(WebGLQuery obj, int p2);
+
+ WebGLVertexArray createVertexArray();
+
+ void deleteVertexArray(WebGLVertexArray obj);
+
+ void bindVertexArray(WebGLVertexArray obj);
+
+ void renderbufferStorageMultisample(int p1, int p2, int p3, int p4, int p5);
+
+ void blitFramebuffer(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10);
+
+ void drawBuffers(int[] p1);
+
+}
diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLQuery.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLQuery.java
new file mode 100644
index 0000000..40c65c0
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLQuery.java
@@ -0,0 +1,6 @@
+package net.lax1dude.eaglercraft.adapter.teavm;
+
+import org.teavm.jso.JSObject;
+
+public interface WebGLQuery extends JSObject {
+}
diff --git a/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLVertexArray.java b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLVertexArray.java
new file mode 100644
index 0000000..34d1c5f
--- /dev/null
+++ b/src/main/java/net/lax1dude/eaglercraft/adapter/teavm/WebGLVertexArray.java
@@ -0,0 +1,6 @@
+package net.lax1dude.eaglercraft.adapter.teavm;
+
+import org.teavm.jso.JSObject;
+
+public interface WebGLVertexArray extends JSObject {
+}
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
new file mode 100644
index 0000000..3410599
--- /dev/null
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -0,0 +1,952 @@
+package net.minecraft.client;
+
+import java.io.File;
+import net.minecraft.src.AxisAlignedBB;
+import net.minecraft.src.Block;
+import net.minecraft.src.EffectRenderer;
+import net.minecraft.src.EntityPlayer;
+import net.minecraft.src.EntityPlayerSP;
+import net.minecraft.src.EntityRenderer;
+import net.minecraft.src.FontRenderer;
+import net.minecraft.src.GLAllocation;
+import net.minecraft.src.GameSettings;
+import net.minecraft.src.GameWindowListener;
+import net.minecraft.src.GuiChat;
+import net.minecraft.src.GuiConflictWarning;
+import net.minecraft.src.GuiGameOver;
+import net.minecraft.src.GuiIngame;
+import net.minecraft.src.GuiIngameMenu;
+import net.minecraft.src.GuiInventory;
+import net.minecraft.src.GuiMainMenu;
+import net.minecraft.src.GuiScreen;
+import net.minecraft.src.GuiUnused;
+import net.minecraft.src.ItemRenderer;
+import net.minecraft.src.ItemStack;
+import net.minecraft.src.LoadingScreenRenderer;
+import net.minecraft.src.MathHelper;
+import net.minecraft.src.MinecraftError;
+import net.minecraft.src.MinecraftException;
+import net.minecraft.src.ModelBiped;
+import net.minecraft.src.MouseHelper;
+import net.minecraft.src.MovementInputFromOptions;
+import net.minecraft.src.MovingObjectPosition;
+import net.minecraft.src.PlayerController;
+import net.minecraft.src.PlayerControllerTest;
+import net.minecraft.src.RenderEngine;
+import net.minecraft.src.RenderGlobal;
+import net.minecraft.src.RenderManager;
+import net.minecraft.src.ScaledResolution;
+import net.minecraft.src.Session;
+import net.minecraft.src.Teleporter;
+import net.minecraft.src.Tessellator;
+import net.minecraft.src.TextureCompassFX;
+import net.minecraft.src.TextureFlamesFX;
+import net.minecraft.src.TextureLavaFX;
+import net.minecraft.src.TextureLavaFlowFX;
+import net.minecraft.src.TexturePortalFX;
+import net.minecraft.src.TextureWatchFX;
+import net.minecraft.src.TextureWaterFX;
+import net.minecraft.src.TexureWaterFlowFX;
+import net.minecraft.src.ThreadSleepForever;
+import net.minecraft.src.Timer;
+import net.minecraft.src.UnexpectedThrowable;
+import net.minecraft.src.Vec3D;
+import net.minecraft.src.World;
+import net.minecraft.src.WorldProvider;
+import net.minecraft.src.WorldProviderHell;
+import net.minecraft.src.WorldRenderer;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.util.glu.GLU;
+
+public class Minecraft implements Runnable {
+ public PlayerController field_6327_b;
+ public int displayWidth;
+ public int displayHeight;
+ private Timer timer = new Timer(20.0F);
+ public World theWorld;
+ public RenderGlobal field_6323_f;
+ public EntityPlayerSP thePlayer;
+ public EffectRenderer field_6321_h;
+ public Session field_6320_i = null;
+ public String field_6319_j;
+ public boolean field_6317_l = true;
+ public volatile boolean field_6316_m = false;
+ public RenderEngine renderEngine;
+ public FontRenderer fontRenderer;
+ public GuiScreen currentScreen = null;
+ public LoadingScreenRenderer loadingScreen = new LoadingScreenRenderer(this);
+ public EntityRenderer field_9243_r = new EntityRenderer(this);
+ private int ticksRan = 0;
+ private int field_6282_S = 0;
+ private int field_9236_T;
+ private int field_9235_U;
+ public String field_6310_s = null;
+ public int field_6309_t = 0;
+ public GuiIngame ingameGUI;
+ public boolean field_6307_v = false;
+ public ModelBiped field_9242_w = new ModelBiped(0.0F);
+ public MovingObjectPosition objectMouseOver = null;
+ public GameSettings gameSettings;
+ public MouseHelper mouseHelper;
+ public File field_6297_D;
+ public static long[] field_9240_E = new long[512];
+ public static long[] field_9239_F = new long[512];
+ public static int field_9238_G = 0;
+ private String field_9234_V;
+ private int field_9233_W;
+ private TextureWaterFX field_9232_X = new TextureWaterFX();
+ private TextureLavaFX field_9231_Y = new TextureLavaFX();
+ private static File minecraftDir = null;
+ public volatile boolean running = true;
+ public String field_6292_I = "";
+ boolean field_6291_J = false;
+ long field_6290_K = -1L;
+ public boolean field_6289_L = false;
+ private int field_6302_aa = 0;
+ public boolean field_6288_M = false;
+ long field_6287_N = System.currentTimeMillis();
+ private int field_6300_ab = 0;
+
+ public Minecraft() {
+ this.field_9236_T = GL11.getCanvasWidth();
+ this.field_9235_U = GL11.getCanvasHeight();
+ new ThreadSleepForever(this, "Timer hack thread");
+ this.displayWidth = GL11.getCanvasWidth();
+ this.displayHeight = GL11.getCanvasHeight();
+ }
+
+ public void func_6258_a(String var1, int var2) {
+ this.field_9234_V = var1;
+ this.field_9233_W = var2;
+ }
+
+ public void startGame() {
+
+ RenderManager.instance.field_4236_f = new ItemRenderer(this);
+ this.field_6297_D = getMinecraftDir();
+ this.gameSettings = new GameSettings(this, this.field_6297_D);
+ this.renderEngine = new RenderEngine(this.gameSettings);
+ this.fontRenderer = new FontRenderer(this.gameSettings, "/font/default.png", this.renderEngine);
+ this.loadScreen();
+ this.mouseHelper = new MouseHelper();
+
+ this.checkGLError("Pre startup");
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ GL11.glShadeModel(GL11.GL_SMOOTH);
+ GL11.glClearDepth(1.0F);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL11.glDepthFunc(GL11.GL_LEQUAL);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ GL11.glCullFace(GL11.GL_BACK);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glLoadIdentity();
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ this.checkGLError("Startup");
+ this.renderEngine.registerTextureFX(this.field_9231_Y);
+ this.renderEngine.registerTextureFX(this.field_9232_X);
+ this.renderEngine.registerTextureFX(new TexturePortalFX());
+ this.renderEngine.registerTextureFX(new TextureCompassFX(this));
+ this.renderEngine.registerTextureFX(new TextureWatchFX(this));
+ this.renderEngine.registerTextureFX(new TexureWaterFlowFX());
+ this.renderEngine.registerTextureFX(new TextureLavaFlowFX());
+ this.renderEngine.registerTextureFX(new TextureFlamesFX(0));
+ this.renderEngine.registerTextureFX(new TextureFlamesFX(1));
+ this.field_6323_f = new RenderGlobal(this, this.renderEngine);
+ GL11.glViewport(0, 0, this.displayWidth, this.displayHeight);
+ this.field_6321_h = new EffectRenderer(this.theWorld, this.renderEngine);
+
+ this.checkGLError("Post startup");
+ this.ingameGUI = new GuiIngame(this);
+ this.displayGuiScreen(new GuiMainMenu());
+ }
+
+ private void loadScreen() {
+ ScaledResolution var1 = new ScaledResolution(this.displayWidth, this.displayHeight);
+ int var2 = var1.getScaledWidth();
+ int var3 = var1.getScaledHeight();
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glLoadIdentity();
+ GL11.glOrtho(0.0D, (double)var2, (double)var3, 0.0D, 1000.0D, 3000.0D);
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glLoadIdentity();
+ GL11.glTranslatef(0.0F, 0.0F, -2000.0F);
+ GL11.glViewport(0, 0, this.displayWidth, this.displayHeight);
+ GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
+ Tessellator var4 = Tessellator.instance;
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ GL11.glDisable(GL11.GL_FOG);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/title/mojang.png"));
+ var4.startDrawingQuads();
+ var4.setColorOpaque_I(16777215);
+ var4.addVertexWithUV(0.0D, (double)this.displayHeight, 0.0D, 0.0D, 0.0D);
+ var4.addVertexWithUV((double)this.displayWidth, (double)this.displayHeight, 0.0D, 0.0D, 0.0D);
+ var4.addVertexWithUV((double)this.displayWidth, 0.0D, 0.0D, 0.0D, 0.0D);
+ var4.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
+ var4.draw();
+ short var5 = 256;
+ short var6 = 256;
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ var4.setColorOpaque_I(16777215);
+ this.func_6274_a((this.displayWidth / 2 - var5) / 2, (this.displayHeight / 2 - var6) / 2, 0, 0, var5, var6);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_FOG);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
+ }
+
+ public void func_6274_a(int var1, int var2, int var3, int var4, int var5, int var6) {
+ float var7 = 0.00390625F;
+ float var8 = 0.00390625F;
+ Tessellator var9 = Tessellator.instance;
+ var9.startDrawingQuads();
+ var9.addVertexWithUV((double)(var1 + 0), (double)(var2 + var6), 0.0D, (double)((float)(var3 + 0) * var7), (double)((float)(var4 + var6) * var8));
+ var9.addVertexWithUV((double)(var1 + var5), (double)(var2 + var6), 0.0D, (double)((float)(var3 + var5) * var7), (double)((float)(var4 + var6) * var8));
+ var9.addVertexWithUV((double)(var1 + var5), (double)(var2 + 0), 0.0D, (double)((float)(var3 + var5) * var7), (double)((float)(var4 + 0) * var8));
+ var9.addVertexWithUV((double)(var1 + 0), (double)(var2 + 0), 0.0D, (double)((float)(var3 + 0) * var7), (double)((float)(var4 + 0) * var8));
+ var9.draw();
+ }
+
+ public static File getMinecraftDir() {
+ if(minecraftDir == null) {
+ minecraftDir = new File("minecraft");
+ }
+
+ return minecraftDir;
+ }
+
+ public void displayGuiScreen(GuiScreen var1) {
+ if(!(this.currentScreen instanceof GuiUnused)) {
+ if(this.currentScreen != null) {
+ this.currentScreen.onGuiClosed();
+ }
+
+ if(var1 == null && this.theWorld == null) {
+ var1 = new GuiMainMenu();
+ } else if(var1 == null && this.thePlayer.health <= 0) {
+ var1 = new GuiGameOver();
+ }
+
+ this.currentScreen = (GuiScreen)var1;
+ if(var1 != null) {
+ this.func_6273_f();
+ ScaledResolution var2 = new ScaledResolution(this.displayWidth, this.displayHeight);
+ int var3 = var2.getScaledWidth();
+ int var4 = var2.getScaledHeight();
+ ((GuiScreen)var1).setWorldAndResolution(this, var3, var4);
+ this.field_6307_v = false;
+ } else {
+ this.func_6259_e();
+ }
+
+ }
+ }
+
+ private void checkGLError(String var1) {
+ int var2 = GL11.glGetError();
+ if(var2 != 0) {
+ String var3 = GLU.gluErrorString(var2);
+ System.out.println("########## GL ERROR ##########");
+ System.out.println("@ " + var1);
+ System.out.println(var2 + ": " + var3);
+ System.exit(0);
+ }
+
+ }
+
+ public void func_6266_c() {
+ System.out.println("Stopping!");
+ this.func_6261_a((World)null);
+ GLAllocation.deleteTexturesAndDisplayLists();
+ System.gc();
+ }
+
+ public void run() {
+ this.running = true;
+
+ try {
+ this.startGame();
+ } catch (Exception var15) {
+ var15.printStackTrace();
+ new UnexpectedThrowable("Failed to start game", var15);
+ return;
+ }
+
+ try {
+ try {
+ long var1 = System.currentTimeMillis();
+ int var3 = 0;
+
+ while(this.running) {
+ AxisAlignedBB.clearBoundingBoxPool();
+ Vec3D.initialize();
+
+ if(this.field_6316_m && this.theWorld != null) {
+ float var4 = this.timer.renderPartialTicks;
+ this.timer.updateTimer();
+ this.timer.renderPartialTicks = var4;
+ } else {
+ this.timer.updateTimer();
+ }
+
+ long var19 = System.nanoTime();
+
+ for(int var6 = 0; var6 < this.timer.elapsedTicks; ++var6) {
+ ++this.ticksRan;
+
+ try {
+ this.runTick();
+ } catch (MinecraftException var14) {
+ this.theWorld = null;
+ this.func_6261_a((World)null);
+ this.displayGuiScreen(new GuiConflictWarning());
+ }
+ }
+
+ long var20 = System.nanoTime() - var19;
+ this.checkGLError("Pre render");
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ if(this.theWorld != null) {
+ while(this.theWorld.func_6465_g()) {
+ }
+ }
+
+ if(this.gameSettings.limitFramerate) {
+ Thread.sleep(5L);
+ }
+
+ if(!this.field_6307_v) {
+ if(this.field_6327_b != null) {
+ this.field_6327_b.func_6467_a(this.timer.renderPartialTicks);
+ }
+
+ this.field_9243_r.func_4136_b(this.timer.renderPartialTicks);
+ }
+
+ if(!GL11.isFocused()) {
+ Thread.sleep(10L);
+ }
+
+ if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(4)) {
+ this.func_6238_a(var20);
+ } else {
+ this.field_6290_K = System.nanoTime();
+ }
+
+ Thread.yield();
+ if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(8)) {
+ GL11.updateDisplay();
+ }
+
+ if((GL11.getCanvasWidth() != this.displayWidth || GL11.getCanvasHeight() != this.displayHeight)) {
+ this.displayWidth = GL11.getCanvasWidth();
+ this.displayHeight = GL11.getCanvasHeight();
+ if(this.displayWidth <= 0) {
+ this.displayWidth = 1;
+ }
+
+ if(this.displayHeight <= 0) {
+ this.displayHeight = 1;
+ }
+
+ this.resize(this.displayWidth, this.displayHeight);
+ }
+
+ this.checkGLError("Post render");
+ ++var3;
+
+ for(this.field_6316_m = true && this.currentScreen != null && this.currentScreen.doesGuiPauseGame(); System.currentTimeMillis() >= var1 + 1000L; var3 = 0) {
+ this.field_6292_I = var3 + " fps, " + WorldRenderer.field_1762_b + " chunk updates";
+ WorldRenderer.field_1762_b = 0;
+ var1 += 1000L;
+ }
+ }
+ } catch (MinecraftError var16) {
+ } catch (Throwable var17) {
+ this.theWorld = null;
+ var17.printStackTrace();
+ new UnexpectedThrowable("Unexpected error", var17);
+ }
+
+ } finally {
+ }
+ }
+
+ private void func_6238_a(long var1) {
+ long var3 = 16666666L;
+ if(this.field_6290_K == -1L) {
+ this.field_6290_K = System.nanoTime();
+ }
+
+ long var5 = System.nanoTime();
+ field_9239_F[field_9238_G & field_9240_E.length - 1] = var1;
+ field_9240_E[field_9238_G++ & field_9240_E.length - 1] = var5 - this.field_6290_K;
+ this.field_6290_K = var5;
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glLoadIdentity();
+ GL11.glOrtho(0.0D, (double)this.displayWidth, (double)this.displayHeight, 0.0D, 1000.0D, 3000.0D);
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glLoadIdentity();
+ GL11.glTranslatef(0.0F, 0.0F, -2000.0F);
+ GL11.glLineWidth(1.0F);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ Tessellator var7 = Tessellator.instance;
+ var7.startDrawing(7);
+ int var8 = (int)(var3 / 200000L);
+ var7.setColorOpaque_I(536870912);
+ var7.addVertex(0.0D, (double)(this.displayHeight - var8), 0.0D);
+ var7.addVertex(0.0D, (double)this.displayHeight, 0.0D);
+ var7.addVertex((double)field_9240_E.length, (double)this.displayHeight, 0.0D);
+ var7.addVertex((double)field_9240_E.length, (double)(this.displayHeight - var8), 0.0D);
+ var7.setColorOpaque_I(538968064);
+ var7.addVertex(0.0D, (double)(this.displayHeight - var8 * 2), 0.0D);
+ var7.addVertex(0.0D, (double)(this.displayHeight - var8), 0.0D);
+ var7.addVertex((double)field_9240_E.length, (double)(this.displayHeight - var8), 0.0D);
+ var7.addVertex((double)field_9240_E.length, (double)(this.displayHeight - var8 * 2), 0.0D);
+ var7.draw();
+ long var9 = 0L;
+
+ int var11;
+ for(var11 = 0; var11 < field_9240_E.length; ++var11) {
+ var9 += field_9240_E[var11];
+ }
+
+ var11 = (int)(var9 / 200000L / (long)field_9240_E.length);
+ var7.startDrawing(7);
+ var7.setColorOpaque_I(541065216);
+ var7.addVertex(0.0D, (double)(this.displayHeight - var11), 0.0D);
+ var7.addVertex(0.0D, (double)this.displayHeight, 0.0D);
+ var7.addVertex((double)field_9240_E.length, (double)this.displayHeight, 0.0D);
+ var7.addVertex((double)field_9240_E.length, (double)(this.displayHeight - var11), 0.0D);
+ var7.draw();
+ var7.startDrawing(1);
+
+ for(int var12 = 0; var12 < field_9240_E.length; ++var12) {
+ int var13 = (var12 - field_9238_G & field_9240_E.length - 1) * 255 / field_9240_E.length;
+ int var14 = var13 * var13 / 255;
+ var14 = var14 * var14 / 255;
+ int var15 = var14 * var14 / 255;
+ var15 = var15 * var15 / 255;
+ if(field_9240_E[var12] > var3) {
+ var7.setColorOpaque_I(-16777216 + var14 * 65536);
+ } else {
+ var7.setColorOpaque_I(-16777216 + var14 * 256);
+ }
+
+ long var16 = field_9240_E[var12] / 200000L;
+ long var18 = field_9239_F[var12] / 200000L;
+ var7.addVertex((double)((float)var12 + 0.5F), (double)((float)((long)this.displayHeight - var16) + 0.5F), 0.0D);
+ var7.addVertex((double)((float)var12 + 0.5F), (double)((float)this.displayHeight + 0.5F), 0.0D);
+ var7.setColorOpaque_I(-16777216 + var14 * 65536 + var14 * 256 + var14 * 1);
+ var7.addVertex((double)((float)var12 + 0.5F), (double)((float)((long)this.displayHeight - var16) + 0.5F), 0.0D);
+ var7.addVertex((double)((float)var12 + 0.5F), (double)((float)((long)this.displayHeight - (var16 - var18)) + 0.5F), 0.0D);
+ }
+
+ var7.draw();
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ public void shutdown() {
+ this.running = false;
+ }
+
+ public void func_6259_e() {
+ if(GL11.isFocused()) {
+ if(!this.field_6289_L) {
+ this.field_6289_L = true;
+ this.mouseHelper.func_774_a();
+ this.displayGuiScreen((GuiScreen)null);
+ this.field_6302_aa = this.ticksRan + 10000;
+ }
+ }
+ }
+
+ public void func_6273_f() {
+ if(this.field_6289_L) {
+ if(this.thePlayer != null) {
+ this.thePlayer.func_458_k();
+ }
+
+ this.field_6289_L = false;
+ this.mouseHelper.func_773_b();
+ }
+ }
+
+ public void func_6252_g() {
+ if(this.currentScreen == null) {
+ this.displayGuiScreen(new GuiIngameMenu());
+ }
+ }
+
+ private void func_6254_a(int var1, boolean var2) {
+ if(!this.field_6327_b.field_1064_b) {
+ if(var1 != 0 || this.field_6282_S <= 0) {
+ if(var2 && this.objectMouseOver != null && this.objectMouseOver.typeOfHit == 0 && var1 == 0) {
+ int var3 = this.objectMouseOver.blockX;
+ int var4 = this.objectMouseOver.blockY;
+ int var5 = this.objectMouseOver.blockZ;
+ this.field_6327_b.sendBlockRemoving(var3, var4, var5, this.objectMouseOver.sideHit);
+ this.field_6321_h.func_1191_a(var3, var4, var5, this.objectMouseOver.sideHit);
+ } else {
+ this.field_6327_b.func_6468_a();
+ }
+
+ }
+ }
+ }
+
+ private void clickMouse(int var1) {
+ if(var1 != 0 || this.field_6282_S <= 0) {
+ if(var1 == 0) {
+ this.thePlayer.func_457_w();
+ }
+
+ boolean var2 = true;
+ if(this.objectMouseOver == null) {
+ if(var1 == 0 && !(this.field_6327_b instanceof PlayerControllerTest)) {
+ this.field_6282_S = 10;
+ }
+ } else if(this.objectMouseOver.typeOfHit == 1) {
+ if(var1 == 0) {
+ this.field_6327_b.func_6472_b(this.thePlayer, this.objectMouseOver.entityHit);
+ }
+
+ if(var1 == 1) {
+ this.field_6327_b.func_6475_a(this.thePlayer, this.objectMouseOver.entityHit);
+ }
+ } else if(this.objectMouseOver.typeOfHit == 0) {
+ int var3 = this.objectMouseOver.blockX;
+ int var4 = this.objectMouseOver.blockY;
+ int var5 = this.objectMouseOver.blockZ;
+ int var6 = this.objectMouseOver.sideHit;
+ Block var7 = Block.blocksList[this.theWorld.getBlockId(var3, var4, var5)];
+ if(var1 == 0) {
+ this.theWorld.onBlockHit(var3, var4, var5, this.objectMouseOver.sideHit);
+ if(var7 != Block.bedrock || this.thePlayer.field_9371_f >= 100) {
+ this.field_6327_b.clickBlock(var3, var4, var5, this.objectMouseOver.sideHit);
+ }
+ } else {
+ ItemStack var8 = this.thePlayer.inventory.getCurrentItem();
+ int var9 = var8 != null ? var8.stackSize : 0;
+ if(this.field_6327_b.sendPlaceBlock(this.thePlayer, this.theWorld, var8, var3, var4, var5, var6)) {
+ var2 = false;
+ this.thePlayer.func_457_w();
+ }
+
+ if(var8 == null) {
+ return;
+ }
+
+ if(var8.stackSize == 0) {
+ this.thePlayer.inventory.mainInventory[this.thePlayer.inventory.currentItem] = null;
+ } else if(var8.stackSize != var9) {
+ this.field_9243_r.field_1395_a.func_9449_b();
+ }
+ }
+ }
+
+ if(var2 && var1 == 1) {
+ ItemStack var10 = this.thePlayer.inventory.getCurrentItem();
+ if(var10 != null && this.field_6327_b.sendUseItem(this.thePlayer, this.theWorld, var10)) {
+ this.field_9243_r.field_1395_a.func_9450_c();
+ }
+ }
+
+ }
+ }
+
+ private void resize(int var1, int var2) {
+ if(var1 <= 0) {
+ var1 = 1;
+ }
+
+ if(var2 <= 0) {
+ var2 = 1;
+ }
+
+ this.displayWidth = var1;
+ this.displayHeight = var2;
+ if(this.currentScreen != null) {
+ ScaledResolution var3 = new ScaledResolution(var1, var2);
+ int var4 = var3.getScaledWidth();
+ int var5 = var3.getScaledHeight();
+ this.currentScreen.setWorldAndResolution(this, var4, var5);
+ }
+
+ }
+
+ private void clickMiddleMouseButton() {
+ if(this.objectMouseOver != null) {
+ int var1 = this.theWorld.getBlockId(this.objectMouseOver.blockX, this.objectMouseOver.blockY, this.objectMouseOver.blockZ);
+ if(var1 == Block.grass.blockID) {
+ var1 = Block.dirt.blockID;
+ }
+
+ if(var1 == Block.stairDouble.blockID) {
+ var1 = Block.stairSingle.blockID;
+ }
+
+ if(var1 == Block.bedrock.blockID) {
+ var1 = Block.stone.blockID;
+ }
+
+ this.thePlayer.inventory.setCurrentItem(var1, this.field_6327_b instanceof PlayerControllerTest);
+ }
+
+ }
+
+ public void runTick() {
+ this.ingameGUI.func_555_a();
+ this.field_9243_r.func_910_a(1.0F);
+ if(this.thePlayer != null) {
+ this.thePlayer.func_6420_o();
+ }
+
+ if(!this.field_6316_m && this.theWorld != null) {
+ this.field_6327_b.func_6474_c();
+ }
+
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain.png"));
+// if(!this.field_6316_m) {
+// this.renderEngine.func_1067_a();
+// }
+
+ if(this.currentScreen == null && this.thePlayer != null && this.thePlayer.health <= 0) {
+ this.displayGuiScreen((GuiScreen)null);
+ }
+
+ if(this.currentScreen != null) {
+ this.field_6302_aa = this.ticksRan + 10000;
+ }
+
+ if(this.currentScreen != null) {
+ this.currentScreen.handleInput();
+ if(this.currentScreen != null) {
+ this.currentScreen.updateScreen();
+ }
+ }
+
+ if(this.currentScreen == null || this.currentScreen.field_948_f) {
+ label238:
+ while(true) {
+ while(true) {
+ while(true) {
+ long var1;
+ do {
+ if(!Mouse.next()) {
+ if(this.field_6282_S > 0) {
+ --this.field_6282_S;
+ }
+
+ while(true) {
+ while(true) {
+ do {
+ if(!Keyboard.next()) {
+ if(this.currentScreen == null) {
+ if(Mouse.isButtonDown(0) && (float)(this.ticksRan - this.field_6302_aa) >= this.timer.ticksPerSecond / 4.0F && this.field_6289_L) {
+ this.clickMouse(0);
+ this.field_6302_aa = this.ticksRan;
+ }
+
+ if(Mouse.isButtonDown(1) && (float)(this.ticksRan - this.field_6302_aa) >= this.timer.ticksPerSecond / 4.0F && this.field_6289_L) {
+ this.clickMouse(1);
+ this.field_6302_aa = this.ticksRan;
+ }
+ }
+
+ this.func_6254_a(0, this.currentScreen == null && Mouse.isButtonDown(0) && this.field_6289_L);
+ break label238;
+ }
+
+ this.thePlayer.func_460_a(Keyboard.getEventKey(), Keyboard.getEventKeyState());
+ } while(!Keyboard.getEventKeyState());
+
+ if(this.currentScreen != null) {
+ this.currentScreen.handleKeyboardInput();
+ } else {
+ if(Keyboard.getEventKey() == 1) {
+ this.func_6252_g();
+ }
+
+ if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(6)) {
+ this.gameSettings.thirdPersonView = !this.gameSettings.thirdPersonView;
+ }
+
+ if(Keyboard.getEventKey() == this.gameSettings.keyBindInventory.keyCode) {
+ this.displayGuiScreen(new GuiInventory(this.thePlayer.inventory, this.thePlayer.inventory.craftingInventory));
+ }
+
+ if(Keyboard.getEventKey() == this.gameSettings.keyBindDrop.keyCode) {
+ this.thePlayer.dropPlayerItemWithRandomChoice(this.thePlayer.inventory.decrStackSize(this.thePlayer.inventory.currentItem, 1), false);
+ }
+ }
+
+ for(int var4 = 0; var4 < 9; ++var4) {
+ if(Keyboard.getEventKey() == 2 + var4) {
+ this.thePlayer.inventory.currentItem = var4;
+ }
+ }
+
+ if(Keyboard.getEventKey() == this.gameSettings.keyBindToggleFog.keyCode) {
+ this.gameSettings.setOptionValue(4, !Keyboard.isKeyDown(42) && !Keyboard.isKeyDown(54) ? 1 : -1);
+ }
+ }
+ }
+ }
+
+ var1 = System.currentTimeMillis() - this.field_6287_N;
+ } while(var1 > 200L);
+
+ int var3 = Mouse.getEventDWheel();
+ if(var3 != 0) {
+ this.thePlayer.inventory.changeCurrentItem(var3);
+ }
+
+ if(this.currentScreen == null) {
+ if(!this.field_6289_L && Mouse.getEventButtonState()) {
+ this.func_6259_e();
+ } else {
+ if(Mouse.getEventButton() == 0 && Mouse.getEventButtonState()) {
+ this.clickMouse(0);
+ this.field_6302_aa = this.ticksRan;
+ }
+
+ if(Mouse.getEventButton() == 1 && Mouse.getEventButtonState()) {
+ this.clickMouse(1);
+ this.field_6302_aa = this.ticksRan;
+ }
+
+ if(Mouse.getEventButton() == 2 && Mouse.getEventButtonState()) {
+ this.clickMiddleMouseButton();
+ }
+ }
+ } else if(this.currentScreen != null) {
+ this.currentScreen.handleMouseInput();
+ }
+ }
+ }
+ }
+ }
+
+ if(this.theWorld != null) {
+ if(this.thePlayer != null) {
+ ++this.field_6300_ab;
+ if(this.field_6300_ab == 30) {
+ this.field_6300_ab = 0;
+ this.theWorld.func_705_f(this.thePlayer);
+ }
+ }
+
+ this.theWorld.difficultySetting = this.gameSettings.difficulty;
+
+ if(!this.field_6316_m) {
+ this.field_9243_r.func_911_a();
+ }
+
+ if(!this.field_6316_m) {
+ this.field_6323_f.func_945_d();
+ }
+
+ if(!this.field_6316_m) {
+ this.theWorld.func_633_c();
+ }
+
+ if(!this.field_6316_m) {
+ this.theWorld.tick();
+ }
+
+ if(!this.field_6316_m && this.theWorld != null) {
+ this.theWorld.randomDisplayUpdates(MathHelper.floor_double(this.thePlayer.posX), MathHelper.floor_double(this.thePlayer.posY), MathHelper.floor_double(this.thePlayer.posZ));
+ }
+
+ if(!this.field_6316_m) {
+ this.field_6321_h.func_1193_a();
+ }
+ }
+
+ this.field_6287_N = System.currentTimeMillis();
+ }
+
+ public void func_6247_b(String var1) {
+ this.func_6261_a((World)null);
+ System.gc();
+ World var2 = new World(new File(getMinecraftDir(), "saves"), var1);
+ if(var2.field_1033_r) {
+ this.func_6263_a(var2, "Generating level");
+ } else {
+ this.func_6263_a(var2, "Loading level");
+ }
+
+ }
+
+ public void func_6237_k() {
+ if(this.thePlayer.dimension == -1) {
+ this.thePlayer.dimension = 0;
+ } else {
+ this.thePlayer.dimension = -1;
+ }
+
+ this.theWorld.setEntityDead(this.thePlayer);
+ this.thePlayer.isDead = false;
+ double var1 = this.thePlayer.posX;
+ double var3 = this.thePlayer.posZ;
+ double var5 = 8.0D;
+ World var7;
+ if(this.thePlayer.dimension == -1) {
+ var1 /= var5;
+ var3 /= var5;
+ this.thePlayer.setLocationAndAngles(var1, this.thePlayer.posY, var3, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch);
+ this.theWorld.func_4084_a(this.thePlayer, false);
+ var7 = new World(this.theWorld, new WorldProviderHell());
+ this.func_6256_a(var7, "Entering the Nether", this.thePlayer);
+ } else {
+ var1 *= var5;
+ var3 *= var5;
+ this.thePlayer.setLocationAndAngles(var1, this.thePlayer.posY, var3, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch);
+ this.theWorld.func_4084_a(this.thePlayer, false);
+ var7 = new World(this.theWorld, new WorldProvider());
+ this.func_6256_a(var7, "Leaving the Nether", this.thePlayer);
+ }
+
+ this.thePlayer.worldObj = this.theWorld;
+ this.thePlayer.setLocationAndAngles(var1, this.thePlayer.posY, var3, this.thePlayer.rotationYaw, this.thePlayer.rotationPitch);
+ this.theWorld.func_4084_a(this.thePlayer, false);
+ (new Teleporter()).func_4107_a(this.theWorld, this.thePlayer);
+ }
+
+ public void func_6261_a(World var1) {
+ this.func_6263_a(var1, "");
+ }
+
+ public void func_6263_a(World var1, String var2) {
+ this.func_6256_a(var1, var2, (EntityPlayer)null);
+ }
+
+ public void func_6256_a(World var1, String var2, EntityPlayer var3) {
+ this.loadingScreen.func_596_a(var2);
+ this.loadingScreen.displayLoadingString("");
+ if(this.theWorld != null) {
+ this.theWorld.func_651_a(this.loadingScreen);
+ }
+
+ this.theWorld = var1;
+ System.out.println("Player is " + this.thePlayer);
+ if(var1 != null) {
+ this.field_6327_b.func_717_a(var1);
+ //if(!this.isMultiplayerWorld()) {
+ if(var3 == null) {
+ this.thePlayer = (EntityPlayerSP)var1.func_4085_a(EntityPlayerSP.class);
+ }
+ //}
+
+ //if(!var1.multiplayerWorld) {
+ this.func_6255_d(var2);
+ //}
+
+ System.out.println("Player is now " + this.thePlayer);
+ if(this.thePlayer == null) {
+ this.thePlayer = (EntityPlayerSP)this.field_6327_b.func_4087_b(var1);
+ this.thePlayer.preparePlayerToSpawn();
+ this.field_6327_b.flipPlayer(this.thePlayer);
+ }
+
+ this.thePlayer.field_787_a = new MovementInputFromOptions(this.gameSettings);
+ if(this.field_6323_f != null) {
+ this.field_6323_f.func_946_a(var1);
+ }
+
+ if(this.field_6321_h != null) {
+ this.field_6321_h.func_1188_a(var1);
+ }
+
+ this.field_6327_b.func_6473_b(this.thePlayer);
+ if(var3 != null) {
+ var1.func_6464_c();
+ }
+
+ var1.func_608_a(this.thePlayer);
+ if(var1.field_1033_r) {
+ var1.func_651_a(this.loadingScreen);
+ }
+ } else {
+ this.thePlayer = null;
+ }
+
+ System.gc();
+ this.field_6287_N = 0L;
+ }
+
+ private void func_6255_d(String var1) {
+ this.loadingScreen.func_596_a(var1);
+ this.loadingScreen.displayLoadingString("Building terrain");
+ short var2 = 128;
+ int var3 = 0;
+ int var4 = var2 * 2 / 16 + 1;
+ var4 *= var4;
+
+ for(int var5 = -var2; var5 <= var2; var5 += 16) {
+ int var6 = this.theWorld.spawnX;
+ int var7 = this.theWorld.spawnZ;
+ if(this.thePlayer != null) {
+ var6 = (int)this.thePlayer.posX;
+ var7 = (int)this.thePlayer.posZ;
+ }
+
+ for(int var8 = -var2; var8 <= var2; var8 += 16) {
+ this.loadingScreen.setLoadingProgress(var3++ * 100 / var4);
+ this.theWorld.getBlockId(var6 + var5, 64, var7 + var8);
+
+ while(this.theWorld.func_6465_g()) {
+ }
+ }
+ }
+
+ this.loadingScreen.displayLoadingString("Simulating world for a bit");
+ boolean var9 = true;
+ this.theWorld.func_656_j();
+ }
+
+ public String func_6241_m() {
+ return this.field_6323_f.func_953_b();
+ }
+
+ public String func_6262_n() {
+ return this.field_6323_f.func_957_c();
+ }
+
+ public String func_6245_o() {
+ return "P: " + this.field_6321_h.func_1190_b() + ". T: " + this.theWorld.func_687_d();
+ }
+
+ public void respawn() {
+ if(!this.theWorld.worldProvider.func_6477_d()) {
+ this.func_6237_k();
+ }
+
+ this.theWorld.func_4076_b();
+ this.theWorld.func_9424_o();
+ int var1 = 0;
+ if(this.thePlayer != null) {
+ var1 = this.thePlayer.field_620_ab;
+ this.theWorld.setEntityDead(this.thePlayer);
+ }
+
+ this.thePlayer = (EntityPlayerSP)this.field_6327_b.func_4087_b(this.theWorld);
+ this.thePlayer.preparePlayerToSpawn();
+ this.field_6327_b.flipPlayer(this.thePlayer);
+ this.theWorld.func_608_a(this.thePlayer);
+ this.thePlayer.field_787_a = new MovementInputFromOptions(this.gameSettings);
+ this.thePlayer.field_620_ab = var1;
+ this.field_6327_b.func_6473_b(this.thePlayer);
+ this.func_6255_d("Respawning");
+ if(this.currentScreen instanceof GuiGameOver) {
+ this.displayGuiScreen((GuiScreen)null);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/AxisAlignedBB.java b/src/main/java/net/minecraft/src/AxisAlignedBB.java
new file mode 100644
index 0000000..5112e40
--- /dev/null
+++ b/src/main/java/net/minecraft/src/AxisAlignedBB.java
@@ -0,0 +1,317 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AxisAlignedBB {
+ private static List boundingBoxes = new ArrayList();
+ private static int numBoundingBoxesInUse = 0;
+ public double minX;
+ public double minY;
+ public double minZ;
+ public double maxX;
+ public double maxY;
+ public double maxZ;
+
+ public static AxisAlignedBB getBoundingBox(double var0, double var2, double var4, double var6, double var8, double var10) {
+ return new AxisAlignedBB(var0, var2, var4, var6, var8, var10);
+ }
+
+ public static void clearBoundingBoxPool() {
+ numBoundingBoxesInUse = 0;
+ }
+
+ public static AxisAlignedBB getBoundingBoxFromPool(double var0, double var2, double var4, double var6, double var8, double var10) {
+ if(numBoundingBoxesInUse >= boundingBoxes.size()) {
+ boundingBoxes.add(getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D));
+ }
+
+ return ((AxisAlignedBB)boundingBoxes.get(numBoundingBoxesInUse++)).setBounds(var0, var2, var4, var6, var8, var10);
+ }
+
+ private AxisAlignedBB(double var1, double var3, double var5, double var7, double var9, double var11) {
+ this.minX = var1;
+ this.minY = var3;
+ this.minZ = var5;
+ this.maxX = var7;
+ this.maxY = var9;
+ this.maxZ = var11;
+ }
+
+ public AxisAlignedBB setBounds(double var1, double var3, double var5, double var7, double var9, double var11) {
+ this.minX = var1;
+ this.minY = var3;
+ this.minZ = var5;
+ this.maxX = var7;
+ this.maxY = var9;
+ this.maxZ = var11;
+ return this;
+ }
+
+ public AxisAlignedBB addCoord(double var1, double var3, double var5) {
+ double var7 = this.minX;
+ double var9 = this.minY;
+ double var11 = this.minZ;
+ double var13 = this.maxX;
+ double var15 = this.maxY;
+ double var17 = this.maxZ;
+ if(var1 < 0.0D) {
+ var7 += var1;
+ }
+
+ if(var1 > 0.0D) {
+ var13 += var1;
+ }
+
+ if(var3 < 0.0D) {
+ var9 += var3;
+ }
+
+ if(var3 > 0.0D) {
+ var15 += var3;
+ }
+
+ if(var5 < 0.0D) {
+ var11 += var5;
+ }
+
+ if(var5 > 0.0D) {
+ var17 += var5;
+ }
+
+ return getBoundingBoxFromPool(var7, var9, var11, var13, var15, var17);
+ }
+
+ public AxisAlignedBB expands(double var1, double var3, double var5) {
+ double var7 = this.minX - var1;
+ double var9 = this.minY - var3;
+ double var11 = this.minZ - var5;
+ double var13 = this.maxX + var1;
+ double var15 = this.maxY + var3;
+ double var17 = this.maxZ + var5;
+ return getBoundingBoxFromPool(var7, var9, var11, var13, var15, var17);
+ }
+
+ public AxisAlignedBB getOffsetBoundingBox(double var1, double var3, double var5) {
+ return getBoundingBoxFromPool(this.minX + var1, this.minY + var3, this.minZ + var5, this.maxX + var1, this.maxY + var3, this.maxZ + var5);
+ }
+
+ public double func_1163_a(AxisAlignedBB var1, double var2) {
+ if(var1.maxY > this.minY && var1.minY < this.maxY) {
+ if(var1.maxZ > this.minZ && var1.minZ < this.maxZ) {
+ double var4;
+ if(var2 > 0.0D && var1.maxX <= this.minX) {
+ var4 = this.minX - var1.maxX;
+ if(var4 < var2) {
+ var2 = var4;
+ }
+ }
+
+ if(var2 < 0.0D && var1.minX >= this.maxX) {
+ var4 = this.maxX - var1.minX;
+ if(var4 > var2) {
+ var2 = var4;
+ }
+ }
+
+ return var2;
+ } else {
+ return var2;
+ }
+ } else {
+ return var2;
+ }
+ }
+
+ public double func_1172_b(AxisAlignedBB var1, double var2) {
+ if(var1.maxX > this.minX && var1.minX < this.maxX) {
+ if(var1.maxZ > this.minZ && var1.minZ < this.maxZ) {
+ double var4;
+ if(var2 > 0.0D && var1.maxY <= this.minY) {
+ var4 = this.minY - var1.maxY;
+ if(var4 < var2) {
+ var2 = var4;
+ }
+ }
+
+ if(var2 < 0.0D && var1.minY >= this.maxY) {
+ var4 = this.maxY - var1.minY;
+ if(var4 > var2) {
+ var2 = var4;
+ }
+ }
+
+ return var2;
+ } else {
+ return var2;
+ }
+ } else {
+ return var2;
+ }
+ }
+
+ public double func_1162_c(AxisAlignedBB var1, double var2) {
+ if(var1.maxX > this.minX && var1.minX < this.maxX) {
+ if(var1.maxY > this.minY && var1.minY < this.maxY) {
+ double var4;
+ if(var2 > 0.0D && var1.maxZ <= this.minZ) {
+ var4 = this.minZ - var1.maxZ;
+ if(var4 < var2) {
+ var2 = var4;
+ }
+ }
+
+ if(var2 < 0.0D && var1.minZ >= this.maxZ) {
+ var4 = this.maxZ - var1.minZ;
+ if(var4 > var2) {
+ var2 = var4;
+ }
+ }
+
+ return var2;
+ } else {
+ return var2;
+ }
+ } else {
+ return var2;
+ }
+ }
+
+ public boolean intersectsWith(AxisAlignedBB var1) {
+ return var1.maxX > this.minX && var1.minX < this.maxX ? (var1.maxY > this.minY && var1.minY < this.maxY ? var1.maxZ > this.minZ && var1.minZ < this.maxZ : false) : false;
+ }
+
+ public AxisAlignedBB offset(double var1, double var3, double var5) {
+ this.minX += var1;
+ this.minY += var3;
+ this.minZ += var5;
+ this.maxX += var1;
+ this.maxY += var3;
+ this.maxZ += var5;
+ return this;
+ }
+
+ public boolean isVecInside(Vec3D var1) {
+ return var1.xCoord > this.minX && var1.xCoord < this.maxX ? (var1.yCoord > this.minY && var1.yCoord < this.maxY ? var1.zCoord > this.minZ && var1.zCoord < this.maxZ : false) : false;
+ }
+
+ public double getAverageEdgeLength() {
+ double var1 = this.maxX - this.minX;
+ double var3 = this.maxY - this.minY;
+ double var5 = this.maxZ - this.minZ;
+ return (var1 + var3 + var5) / 3.0D;
+ }
+
+ public AxisAlignedBB copy() {
+ return getBoundingBoxFromPool(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ);
+ }
+
+ public MovingObjectPosition func_1169_a(Vec3D var1, Vec3D var2) {
+ Vec3D var3 = var1.getIntermediateWithXValue(var2, this.minX);
+ Vec3D var4 = var1.getIntermediateWithXValue(var2, this.maxX);
+ Vec3D var5 = var1.getIntermediateWithYValue(var2, this.minY);
+ Vec3D var6 = var1.getIntermediateWithYValue(var2, this.maxY);
+ Vec3D var7 = var1.getIntermediateWithZValue(var2, this.minZ);
+ Vec3D var8 = var1.getIntermediateWithZValue(var2, this.maxZ);
+ if(!this.isVecInYZ(var3)) {
+ var3 = null;
+ }
+
+ if(!this.isVecInYZ(var4)) {
+ var4 = null;
+ }
+
+ if(!this.isVecInXZ(var5)) {
+ var5 = null;
+ }
+
+ if(!this.isVecInXZ(var6)) {
+ var6 = null;
+ }
+
+ if(!this.isVecInXY(var7)) {
+ var7 = null;
+ }
+
+ if(!this.isVecInXY(var8)) {
+ var8 = null;
+ }
+
+ Vec3D var9 = null;
+ if(var3 != null && (var9 == null || var1.squareDistanceTo(var3) < var1.squareDistanceTo(var9))) {
+ var9 = var3;
+ }
+
+ if(var4 != null && (var9 == null || var1.squareDistanceTo(var4) < var1.squareDistanceTo(var9))) {
+ var9 = var4;
+ }
+
+ if(var5 != null && (var9 == null || var1.squareDistanceTo(var5) < var1.squareDistanceTo(var9))) {
+ var9 = var5;
+ }
+
+ if(var6 != null && (var9 == null || var1.squareDistanceTo(var6) < var1.squareDistanceTo(var9))) {
+ var9 = var6;
+ }
+
+ if(var7 != null && (var9 == null || var1.squareDistanceTo(var7) < var1.squareDistanceTo(var9))) {
+ var9 = var7;
+ }
+
+ if(var8 != null && (var9 == null || var1.squareDistanceTo(var8) < var1.squareDistanceTo(var9))) {
+ var9 = var8;
+ }
+
+ if(var9 == null) {
+ return null;
+ } else {
+ byte var10 = -1;
+ if(var9 == var3) {
+ var10 = 4;
+ }
+
+ if(var9 == var4) {
+ var10 = 5;
+ }
+
+ if(var9 == var5) {
+ var10 = 0;
+ }
+
+ if(var9 == var6) {
+ var10 = 1;
+ }
+
+ if(var9 == var7) {
+ var10 = 2;
+ }
+
+ if(var9 == var8) {
+ var10 = 3;
+ }
+
+ return new MovingObjectPosition(0, 0, 0, var10, var9);
+ }
+ }
+
+ private boolean isVecInYZ(Vec3D var1) {
+ return var1 == null ? false : var1.yCoord >= this.minY && var1.yCoord <= this.maxY && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ;
+ }
+
+ private boolean isVecInXZ(Vec3D var1) {
+ return var1 == null ? false : var1.xCoord >= this.minX && var1.xCoord <= this.maxX && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ;
+ }
+
+ private boolean isVecInXY(Vec3D var1) {
+ return var1 == null ? false : var1.xCoord >= this.minX && var1.xCoord <= this.maxX && var1.yCoord >= this.minY && var1.yCoord <= this.maxY;
+ }
+
+ public void setBB(AxisAlignedBB var1) {
+ this.minX = var1.minX;
+ this.minY = var1.minY;
+ this.minZ = var1.minZ;
+ this.maxX = var1.maxX;
+ this.maxY = var1.maxY;
+ this.maxZ = var1.maxZ;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Block.java b/src/main/java/net/minecraft/src/Block.java
new file mode 100644
index 0000000..51908e0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Block.java
@@ -0,0 +1,493 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+public class Block {
+ public static final StepSound soundPowderFootstep = new StepSound("stone", 1.0F, 1.0F);
+ public static final StepSound soundWoodFootstep = new StepSound("wood", 1.0F, 1.0F);
+ public static final StepSound soundGravelFootstep = new StepSound("gravel", 1.0F, 1.0F);
+ public static final StepSound soundGrassFootstep = new StepSound("grass", 1.0F, 1.0F);
+ public static final StepSound soundStoneFootstep = new StepSound("stone", 1.0F, 1.0F);
+ public static final StepSound soundMetalFootstep = new StepSound("stone", 1.0F, 1.5F);
+ public static final StepSound soundGlassFootstep = new StepSoundStone("stone", 1.0F, 1.0F);
+ public static final StepSound soundClothFootstep = new StepSound("cloth", 1.0F, 1.0F);
+ public static final StepSound soundSandFootstep = new StepSoundSand("sand", 1.0F, 1.0F);
+ public static final Block[] blocksList = new Block[256];
+ public static final boolean[] tickOnLoad = new boolean[256];
+ public static final boolean[] opaqueCubeLookup = new boolean[256];
+ public static final boolean[] isBlockContainer = new boolean[256];
+ public static final int[] lightOpacity = new int[256];
+ public static final boolean[] field_340_s = new boolean[256];
+ public static final int[] lightValue = new int[256];
+ public static final Block stone = (new BlockStone(1, 1)).setHardness(1.5F).setResistance(10.0F).setStepSound(soundStoneFootstep);
+ public static final BlockGrass grass = (BlockGrass)(new BlockGrass(2)).setHardness(0.6F).setStepSound(soundGrassFootstep);
+ public static final Block dirt = (new BlockDirt(3, 2)).setHardness(0.5F).setStepSound(soundGravelFootstep);
+ public static final Block cobblestone = (new Block(4, 16, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep);
+ public static final Block planks = (new Block(5, 4, Material.wood)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundWoodFootstep);
+ public static final Block sapling = (new BlockSapling(6, 15)).setHardness(0.0F).setStepSound(soundGrassFootstep);
+ public static final Block bedrock = (new Block(7, 17, Material.rock)).setHardness(-1.0F).setResistance(6000000.0F).setStepSound(soundStoneFootstep);
+ public static final Block waterStill = (new BlockFlowing(8, Material.water)).setHardness(100.0F).setLightOpacity(3);
+ public static final Block waterMoving = (new BlockStationary(9, Material.water)).setHardness(100.0F).setLightOpacity(3);
+ public static final Block lavaStill = (new BlockFlowing(10, Material.lava)).setHardness(0.0F).setLightValue(1.0F).setLightOpacity(255);
+ public static final Block lavaMoving = (new BlockStationary(11, Material.lava)).setHardness(100.0F).setLightValue(1.0F).setLightOpacity(255);
+ public static final Block sand = (new BlockSand(12, 18)).setHardness(0.5F).setStepSound(soundSandFootstep);
+ public static final Block gravel = (new BlockGravel(13, 19)).setHardness(0.6F).setStepSound(soundGravelFootstep);
+ public static final Block oreGold = (new BlockOre(14, 32)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep);
+ public static final Block oreIron = (new BlockOre(15, 33)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep);
+ public static final Block oreCoal = (new BlockOre(16, 34)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep);
+ public static final Block wood = (new BlockLog(17)).setHardness(2.0F).setStepSound(soundWoodFootstep);
+ public static final BlockLeaves leaves = (BlockLeaves)(new BlockLeaves(18, 52)).setHardness(0.2F).setLightOpacity(1).setStepSound(soundGrassFootstep);
+ public static final Block sponge = (new BlockSponge(19)).setHardness(0.6F).setStepSound(soundGrassFootstep);
+ public static final Block glass = (new BlockGlass(20, 49, Material.glass, false)).setHardness(0.3F).setStepSound(soundGlassFootstep);
+ public static final Block field_9267_N = null;
+ public static final Block field_9266_O = null;
+ public static final Block field_9265_P = null;
+ public static final Block field_9264_Q = null;
+ public static final Block field_9263_R = null;
+ public static final Block field_9262_S = null;
+ public static final Block field_9261_T = null;
+ public static final Block field_9260_U = null;
+ public static final Block field_9259_V = null;
+ public static final Block field_9258_W = null;
+ public static final Block field_9257_X = null;
+ public static final Block field_9256_Y = null;
+ public static final Block field_9255_Z = null;
+ public static final Block field_9269_aa = null;
+ public static final Block cloth = (new Block(35, 64, Material.cloth)).setHardness(0.8F).setStepSound(soundClothFootstep);
+ public static final Block field_9268_ac = null;
+ public static final BlockFlower plantYellow = (BlockFlower)(new BlockFlower(37, 13)).setHardness(0.0F).setStepSound(soundGrassFootstep);
+ public static final BlockFlower plantRed = (BlockFlower)(new BlockFlower(38, 12)).setHardness(0.0F).setStepSound(soundGrassFootstep);
+ public static final BlockFlower mushroomBrown = (BlockFlower)(new BlockMushroom(39, 29)).setHardness(0.0F).setStepSound(soundGrassFootstep).setLightValue(2.0F / 16.0F);
+ public static final BlockFlower mushroomRed = (BlockFlower)(new BlockMushroom(40, 28)).setHardness(0.0F).setStepSound(soundGrassFootstep);
+ public static final Block blockGold = (new BlockOreBlock(41, 39)).setHardness(3.0F).setResistance(10.0F).setStepSound(soundMetalFootstep);
+ public static final Block blockSteel = (new BlockOreBlock(42, 38)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundMetalFootstep);
+ public static final Block stairDouble = (new BlockStep(43, true)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep);
+ public static final Block stairSingle = (new BlockStep(44, false)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep);
+ public static final Block brick = (new Block(45, 7, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep);
+ public static final Block tnt = (new BlockTNT(46, 8)).setHardness(0.0F).setStepSound(soundGrassFootstep);
+ public static final Block bookShelf = (new BlockBookshelf(47, 35)).setHardness(1.5F).setStepSound(soundWoodFootstep);
+ public static final Block cobblestoneMossy = (new Block(48, 36, Material.rock)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep);
+ public static final Block obsidian = (new BlockObsidian(49, 37)).setHardness(10.0F).setResistance(2000.0F).setStepSound(soundStoneFootstep);
+ public static final Block torchWood = (new BlockTorch(50, 80)).setHardness(0.0F).setLightValue(15.0F / 16.0F).setStepSound(soundWoodFootstep);
+ public static final BlockFire fire = (BlockFire)((BlockFire)(new BlockFire(51, 31)).setHardness(0.0F).setLightValue(1.0F).setStepSound(soundWoodFootstep));
+ public static final Block mobSpawner = (new BlockMobSpawner(52, 65)).setHardness(5.0F).setStepSound(soundMetalFootstep);
+ public static final Block stairCompactPlanks = new BlockStairs(53, planks);
+ public static final Block crate = (new BlockChest(54)).setHardness(2.5F).setStepSound(soundWoodFootstep);
+ public static final Block redstoneWire = (new BlockRedstoneWire(55, 84)).setHardness(0.0F).setStepSound(soundPowderFootstep);
+ public static final Block oreDiamond = (new BlockOre(56, 50)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep);
+ public static final Block blockDiamond = (new BlockOreBlock(57, 40)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundMetalFootstep);
+ public static final Block workbench = (new BlockWorkbench(58)).setHardness(2.5F).setStepSound(soundWoodFootstep);
+ public static final Block crops = (new BlockCrops(59, 88)).setHardness(0.0F).setStepSound(soundGrassFootstep);
+ public static final Block tilledField = (new BlockSoil(60)).setHardness(0.6F).setStepSound(soundGravelFootstep);
+ public static final Block stoneOvenIdle = (new BlockFurnace(61, false)).setHardness(3.5F).setStepSound(soundStoneFootstep);
+ public static final Block stoneOvenActive = (new BlockFurnace(62, true)).setHardness(3.5F).setStepSound(soundStoneFootstep).setLightValue(14.0F / 16.0F);
+ public static final Block signPost = (new BlockSign(63, TileEntitySign.class, true)).setHardness(1.0F).setStepSound(soundWoodFootstep);
+ public static final Block doorWood = (new BlockDoor(64, Material.wood)).setHardness(3.0F).setStepSound(soundWoodFootstep);
+ public static final Block ladder = (new BlockLadder(65, 83)).setHardness(0.4F).setStepSound(soundWoodFootstep);
+ public static final Block minecartTrack = (new BlockMinecartTrack(66, 128)).setHardness(0.7F).setStepSound(soundMetalFootstep);
+ public static final Block stairCompactCobblestone = new BlockStairs(67, cobblestone);
+ public static final Block signWall = (new BlockSign(68, TileEntitySign.class, false)).setHardness(1.0F).setStepSound(soundWoodFootstep);
+ public static final Block lever = (new BlockLever(69, 96)).setHardness(0.5F).setStepSound(soundWoodFootstep);
+ public static final Block pressurePlateStone = (new BlockPressurePlate(70, stone.blockIndexInTexture, EnumMobType.mobs)).setHardness(0.5F).setStepSound(soundStoneFootstep);
+ public static final Block doorSteel = (new BlockDoor(71, Material.iron)).setHardness(5.0F).setStepSound(soundMetalFootstep);
+ public static final Block pressurePlatePlanks = (new BlockPressurePlate(72, planks.blockIndexInTexture, EnumMobType.everything)).setHardness(0.5F).setStepSound(soundWoodFootstep);
+ public static final Block oreRedstone = (new BlockRedstoneOre(73, 51, false)).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep);
+ public static final Block oreRedstoneGlowing = (new BlockRedstoneOre(74, 51, true)).setLightValue(10.0F / 16.0F).setHardness(3.0F).setResistance(5.0F).setStepSound(soundStoneFootstep);
+ public static final Block torchRedstoneIdle = (new BlockRedstoneTorch(75, 115, false)).setHardness(0.0F).setStepSound(soundWoodFootstep);
+ public static final Block torchRedstoneActive = (new BlockRedstoneTorch(76, 99, true)).setHardness(0.0F).setLightValue(0.5F).setStepSound(soundWoodFootstep);
+ public static final Block button = (new BlockButton(77, stone.blockIndexInTexture)).setHardness(0.5F).setStepSound(soundStoneFootstep);
+ public static final Block snow = (new BlockSnow(78, 66)).setHardness(0.1F).setStepSound(soundClothFootstep);
+ public static final Block blockIce = (new BlockIce(79, 67)).setHardness(0.5F).setLightOpacity(3).setStepSound(soundGlassFootstep);
+ public static final Block blockSnow = (new BlockSnowBlock(80, 66)).setHardness(0.2F).setStepSound(soundClothFootstep);
+ public static final Block cactus = (new BlockCactus(81, 70)).setHardness(0.4F).setStepSound(soundClothFootstep);
+ public static final Block blockClay = (new BlockClay(82, 72)).setHardness(0.6F).setStepSound(soundGravelFootstep);
+ public static final Block reed = (new BlockReed(83, 73)).setHardness(0.0F).setStepSound(soundGrassFootstep);
+ public static final Block jukebox = (new BlockJukeBox(84, 74)).setHardness(2.0F).setResistance(10.0F).setStepSound(soundStoneFootstep);
+ public static final Block fence = (new BlockFence(85, 4)).setHardness(2.0F).setResistance(5.0F).setStepSound(soundWoodFootstep);
+ public static final Block pumpkin = (new BlockPumpkin(86, 102, false)).setHardness(1.0F).setStepSound(soundWoodFootstep);
+ public static final Block bloodStone = (new BlockBloodStone(87, 103)).setHardness(0.4F).setStepSound(soundStoneFootstep);
+ public static final Block slowSand = (new BlockSlowSand(88, 104)).setHardness(0.5F).setStepSound(soundSandFootstep);
+ public static final Block lightStone = (new BlockLightStone(89, 105, Material.glass)).setHardness(0.3F).setStepSound(soundGlassFootstep).setLightValue(1.0F);
+ public static final BlockPortal portal = (BlockPortal)((BlockPortal)(new BlockPortal(90, 14)).setHardness(-1.0F).setStepSound(soundGlassFootstep).setLightValue(12.0F / 16.0F));
+ public static final Block pumpkinLantern = (new BlockPumpkin(91, 102, true)).setHardness(1.0F).setStepSound(soundWoodFootstep).setLightValue(1.0F);
+ public int blockIndexInTexture;
+ public final int blockID;
+ protected float blockHardness;
+ protected float blockResistance;
+ public double field_370_bf;
+ public double minY;
+ public double minZ;
+ public double maxX;
+ public double maxY;
+ public double maxZ;
+ public StepSound stepSound;
+ public float field_357_bm;
+ public final Material blockMaterial;
+ public float slipperiness;
+
+ protected Block(int var1, Material var2) {
+ this.stepSound = soundPowderFootstep;
+ this.field_357_bm = 1.0F;
+ this.slipperiness = 0.6F;
+ if(blocksList[var1] != null) {
+ throw new IllegalArgumentException("Slot " + var1 + " is already occupied by " + blocksList[var1] + " when adding " + this);
+ } else {
+ this.blockMaterial = var2;
+ blocksList[var1] = this;
+ this.blockID = var1;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ opaqueCubeLookup[var1] = this.isOpaqueCube();
+ lightOpacity[var1] = this.isOpaqueCube() ? 255 : 0;
+ field_340_s[var1] = this.unusedMethod();
+ isBlockContainer[var1] = false;
+ }
+ }
+
+ protected Block(int var1, int var2, Material var3) {
+ this(var1, var3);
+ this.blockIndexInTexture = var2;
+ }
+
+ protected Block setStepSound(StepSound var1) {
+ this.stepSound = var1;
+ return this;
+ }
+
+ protected Block setLightOpacity(int var1) {
+ lightOpacity[this.blockID] = var1;
+ return this;
+ }
+
+ protected Block setLightValue(float var1) {
+ lightValue[this.blockID] = (int)(15.0F * var1);
+ return this;
+ }
+
+ protected Block setResistance(float var1) {
+ this.blockResistance = var1 * 3.0F;
+ return this;
+ }
+
+ private boolean unusedMethod() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return true;
+ }
+
+ public int getRenderType() {
+ return 0;
+ }
+
+ protected Block setHardness(float var1) {
+ this.blockHardness = var1;
+ if(this.blockResistance < var1 * 5.0F) {
+ this.blockResistance = var1 * 5.0F;
+ }
+
+ return this;
+ }
+
+ protected void setTickOnLoad(boolean var1) {
+ tickOnLoad[this.blockID] = var1;
+ }
+
+ public void setBlockBounds(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.field_370_bf = (double)var1;
+ this.minY = (double)var2;
+ this.minZ = (double)var3;
+ this.maxX = (double)var4;
+ this.maxY = (double)var5;
+ this.maxZ = (double)var6;
+ }
+
+ public float getBlockBrightness(IBlockAccess var1, int var2, int var3, int var4) {
+ return var1.getLightBrightness(var2, var3, var4);
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return var5 == 0 && this.minY > 0.0D ? true : (var5 == 1 && this.maxY < 1.0D ? true : (var5 == 2 && this.minZ > 0.0D ? true : (var5 == 3 && this.maxZ < 1.0D ? true : (var5 == 4 && this.field_370_bf > 0.0D ? true : (var5 == 5 && this.maxX < 1.0D ? true : !var1.isBlockOpaqueCube(var2, var3, var4))))));
+ }
+
+ public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return this.getBlockTextureFromSideAndMetadata(var5, var1.getBlockMetadata(var2, var3, var4));
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return this.getBlockTextureFromSide(var1);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.blockIndexInTexture;
+ }
+
+ public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return AxisAlignedBB.getBoundingBoxFromPool((double)var2 + this.field_370_bf, (double)var3 + this.minY, (double)var4 + this.minZ, (double)var2 + this.maxX, (double)var3 + this.maxY, (double)var4 + this.maxZ);
+ }
+
+ public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) {
+ AxisAlignedBB var7 = this.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ if(var7 != null && var5.intersectsWith(var7)) {
+ var6.add(var7);
+ }
+
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return AxisAlignedBB.getBoundingBoxFromPool((double)var2 + this.field_370_bf, (double)var3 + this.minY, (double)var4 + this.minZ, (double)var2 + this.maxX, (double)var3 + this.maxY, (double)var4 + this.maxZ);
+ }
+
+ public boolean isOpaqueCube() {
+ return true;
+ }
+
+ public boolean canCollideCheck(int var1, boolean var2) {
+ return this.isCollidable();
+ }
+
+ public boolean isCollidable() {
+ return true;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ }
+
+ public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) {
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ }
+
+ public int tickRate() {
+ return 10;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return this.blockID;
+ }
+
+ public float func_225_a(EntityPlayer var1) {
+ return this.blockHardness < 0.0F ? 0.0F : (!var1.canHarvestBlock(this) ? 1.0F / this.blockHardness / 100.0F : var1.getCurrentPlayerStrVsBlock(this) / this.blockHardness / 30.0F);
+ }
+
+ public void dropBlockAsItem(World var1, int var2, int var3, int var4, int var5) {
+ this.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, 1.0F);
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ //if(!var1.multiplayerWorld) {
+ int var7 = this.quantityDropped(var1.rand);
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ if(var1.rand.nextFloat() <= var6) {
+ int var9 = this.idDropped(var5, var1.rand);
+ if(var9 > 0) {
+ float var10 = 0.7F;
+ double var11 = (double)(var1.rand.nextFloat() * var10) + (double)(1.0F - var10) * 0.5D;
+ double var13 = (double)(var1.rand.nextFloat() * var10) + (double)(1.0F - var10) * 0.5D;
+ double var15 = (double)(var1.rand.nextFloat() * var10) + (double)(1.0F - var10) * 0.5D;
+ EntityItem var17 = new EntityItem(var1, (double)var2 + var11, (double)var3 + var13, (double)var4 + var15, new ItemStack(var9));
+ var17.field_805_c = 10;
+ var1.entityJoinedWorld(var17);
+ }
+ }
+ }
+
+ //}
+ }
+
+ public float func_227_a(Entity var1) {
+ return this.blockResistance / 5.0F;
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ var5 = var5.addVector((double)(-var2), (double)(-var3), (double)(-var4));
+ var6 = var6.addVector((double)(-var2), (double)(-var3), (double)(-var4));
+ Vec3D var7 = var5.getIntermediateWithXValue(var6, this.field_370_bf);
+ Vec3D var8 = var5.getIntermediateWithXValue(var6, this.maxX);
+ Vec3D var9 = var5.getIntermediateWithYValue(var6, this.minY);
+ Vec3D var10 = var5.getIntermediateWithYValue(var6, this.maxY);
+ Vec3D var11 = var5.getIntermediateWithZValue(var6, this.minZ);
+ Vec3D var12 = var5.getIntermediateWithZValue(var6, this.maxZ);
+ if(!this.isVecInsideYZBounds(var7)) {
+ var7 = null;
+ }
+
+ if(!this.isVecInsideYZBounds(var8)) {
+ var8 = null;
+ }
+
+ if(!this.isVecInsideXZBounds(var9)) {
+ var9 = null;
+ }
+
+ if(!this.isVecInsideXZBounds(var10)) {
+ var10 = null;
+ }
+
+ if(!this.isVecInsideXYBounds(var11)) {
+ var11 = null;
+ }
+
+ if(!this.isVecInsideXYBounds(var12)) {
+ var12 = null;
+ }
+
+ Vec3D var13 = null;
+ if(var7 != null && (var13 == null || var5.distanceTo(var7) < var5.distanceTo(var13))) {
+ var13 = var7;
+ }
+
+ if(var8 != null && (var13 == null || var5.distanceTo(var8) < var5.distanceTo(var13))) {
+ var13 = var8;
+ }
+
+ if(var9 != null && (var13 == null || var5.distanceTo(var9) < var5.distanceTo(var13))) {
+ var13 = var9;
+ }
+
+ if(var10 != null && (var13 == null || var5.distanceTo(var10) < var5.distanceTo(var13))) {
+ var13 = var10;
+ }
+
+ if(var11 != null && (var13 == null || var5.distanceTo(var11) < var5.distanceTo(var13))) {
+ var13 = var11;
+ }
+
+ if(var12 != null && (var13 == null || var5.distanceTo(var12) < var5.distanceTo(var13))) {
+ var13 = var12;
+ }
+
+ if(var13 == null) {
+ return null;
+ } else {
+ byte var14 = -1;
+ if(var13 == var7) {
+ var14 = 4;
+ }
+
+ if(var13 == var8) {
+ var14 = 5;
+ }
+
+ if(var13 == var9) {
+ var14 = 0;
+ }
+
+ if(var13 == var10) {
+ var14 = 1;
+ }
+
+ if(var13 == var11) {
+ var14 = 2;
+ }
+
+ if(var13 == var12) {
+ var14 = 3;
+ }
+
+ return new MovingObjectPosition(var2, var3, var4, var14, var13.addVector((double)var2, (double)var3, (double)var4));
+ }
+ }
+
+ private boolean isVecInsideYZBounds(Vec3D var1) {
+ return var1 == null ? false : var1.yCoord >= this.minY && var1.yCoord <= this.maxY && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ;
+ }
+
+ private boolean isVecInsideXZBounds(Vec3D var1) {
+ return var1 == null ? false : var1.xCoord >= this.field_370_bf && var1.xCoord <= this.maxX && var1.zCoord >= this.minZ && var1.zCoord <= this.maxZ;
+ }
+
+ private boolean isVecInsideXYBounds(Vec3D var1) {
+ return var1 == null ? false : var1.xCoord >= this.field_370_bf && var1.xCoord <= this.maxX && var1.yCoord >= this.minY && var1.yCoord <= this.maxY;
+ }
+
+ public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) {
+ }
+
+ public int func_234_g() {
+ return 0;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3, var4);
+ return var5 == 0 || blocksList[var5].blockMaterial.getIsLiquid();
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ return false;
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ }
+
+ public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) {
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ }
+
+ public int colorMultiplier(IBlockAccess var1, int var2, int var3, int var4) {
+ return 16777215;
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return false;
+ }
+
+ public boolean canProvidePower() {
+ return false;
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return false;
+ }
+
+ public void func_237_e() {
+ }
+
+ public void harvestBlock(World var1, int var2, int var3, int var4, int var5) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var5);
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return true;
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ }
+
+ static {
+ for(int var0 = 0; var0 < 256; ++var0) {
+ if(blocksList[var0] != null) {
+ Item.itemsList[var0] = new ItemBlock(var0 - 256);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockBloodStone.java b/src/main/java/net/minecraft/src/BlockBloodStone.java
new file mode 100644
index 0000000..5e05c8b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockBloodStone.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public class BlockBloodStone extends Block {
+ public BlockBloodStone(int var1, int var2) {
+ super(var1, var2, Material.rock);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockBookshelf.java b/src/main/java/net/minecraft/src/BlockBookshelf.java
new file mode 100644
index 0000000..e91f8a9
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockBookshelf.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockBookshelf extends Block {
+ public BlockBookshelf(int var1, int var2) {
+ super(var1, var2, Material.wood);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 <= 1 ? 4 : this.blockIndexInTexture;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockBreakable.java b/src/main/java/net/minecraft/src/BlockBreakable.java
new file mode 100644
index 0000000..a395108
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockBreakable.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class BlockBreakable extends Block {
+ private boolean field_6363_a;
+
+ protected BlockBreakable(int var1, int var2, Material var3, boolean var4) {
+ super(var1, var2, var3);
+ this.field_6363_a = var4;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockId(var2, var3, var4);
+ return !this.field_6363_a && var6 == this.blockID ? false : super.shouldSideBeRendered(var1, var2, var3, var4, var5);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockButton.java b/src/main/java/net/minecraft/src/BlockButton.java
new file mode 100644
index 0000000..0e6320e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockButton.java
@@ -0,0 +1,236 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockButton extends Block {
+ protected BlockButton(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ this.setTickOnLoad(true);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public int tickRate() {
+ return 20;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockOpaqueCube(var2 - 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2 + 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 - 1) ? true : var1.isBlockOpaqueCube(var2, var3, var4 + 1)));
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6 & 8;
+ var6 &= 7;
+ if(var5 == 2 && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var6 = 4;
+ }
+
+ if(var5 == 3 && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var6 = 3;
+ }
+
+ if(var5 == 4 && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var6 = 2;
+ }
+
+ if(var5 == 5 && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var6 = 1;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 + var7);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ } else if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ } else if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ } else if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 4);
+ }
+
+ this.func_305_h(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(this.func_305_h(var1, var2, var3, var4)) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ boolean var7 = false;
+ if(!var1.isBlockOpaqueCube(var2 - 1, var3, var4) && var6 == 1) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2 + 1, var3, var4) && var6 == 2) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3, var4 - 1) && var6 == 3) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3, var4 + 1) && var6 == 4) {
+ var7 = true;
+ }
+
+ if(var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ }
+
+ private boolean func_305_h(World var1, int var2, int var3, int var4) {
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ int var6 = var5 & 7;
+ boolean var7 = (var5 & 8) > 0;
+ float var8 = 6.0F / 16.0F;
+ float var9 = 10.0F / 16.0F;
+ float var10 = 3.0F / 16.0F;
+ float var11 = 2.0F / 16.0F;
+ if(var7) {
+ var11 = 1.0F / 16.0F;
+ }
+
+ if(var6 == 1) {
+ this.setBlockBounds(0.0F, var8, 0.5F - var10, var11, var9, 0.5F + var10);
+ } else if(var6 == 2) {
+ this.setBlockBounds(1.0F - var11, var8, 0.5F - var10, 1.0F, var9, 0.5F + var10);
+ } else if(var6 == 3) {
+ this.setBlockBounds(0.5F - var10, var8, 0.0F, 0.5F + var10, var9, var11);
+ } else if(var6 == 4) {
+ this.setBlockBounds(0.5F - var10, var8, 1.0F - var11, 0.5F + var10, var9, 1.0F);
+ }
+
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ //if(var1.multiplayerWorld) {
+ //return true;
+ //} else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6 & 7;
+ int var8 = 8 - (var6 & 8);
+ if(var8 == 0) {
+ return true;
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + var8);
+ var1.func_701_b(var2, var3, var4, var2, var3, var4);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, 0.6F);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ if(var7 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var7 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var7 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var7 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ return true;
+ }
+ //}
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if((var5 & 8) > 0) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ int var6 = var5 & 7;
+ if(var6 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var6 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var6 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var6 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return (var1.getBlockMetadata(var2, var3, var4) & 8) > 0;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) == 0) {
+ return false;
+ } else {
+ int var7 = var6 & 7;
+ return var7 == 5 && var5 == 1 ? true : (var7 == 4 && var5 == 2 ? true : (var7 == 3 && var5 == 3 ? true : (var7 == 2 && var5 == 4 ? true : var7 == 1 && var5 == 5)));
+ }
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ //if(!var1.multiplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 & 7);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ int var7 = var6 & 7;
+ if(var7 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var7 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var7 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var7 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, 0.5F);
+ var1.func_701_b(var2, var3, var4, var2, var3, var4);
+ }
+ //}
+ }
+
+ public void func_237_e() {
+ float var1 = 3.0F / 16.0F;
+ float var2 = 2.0F / 16.0F;
+ float var3 = 2.0F / 16.0F;
+ this.setBlockBounds(0.5F - var1, 0.5F - var2, 0.5F - var3, 0.5F + var1, 0.5F + var2, 0.5F + var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockCactus.java b/src/main/java/net/minecraft/src/BlockCactus.java
new file mode 100644
index 0000000..3aa84cf
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockCactus.java
@@ -0,0 +1,86 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockCactus extends Block {
+ protected BlockCactus(int var1, int var2) {
+ super(var1, var2, Material.cactus);
+ this.setTickOnLoad(true);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getBlockId(var2, var3 + 1, var4) == 0) {
+ int var6;
+ for(var6 = 1; var1.getBlockId(var2, var3 - var6, var4) == this.blockID; ++var6) {
+ }
+
+ if(var6 < 3) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 == 15) {
+ var1.setBlockWithNotify(var2, var3 + 1, var4, this.blockID);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + 1);
+ }
+ }
+ }
+
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ float var5 = 1.0F / 16.0F;
+ return AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var5), (double)var3, (double)((float)var4 + var5), (double)((float)(var2 + 1) - var5), (double)((float)(var3 + 1) - var5), (double)((float)(var4 + 1) - var5));
+ }
+
+ public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ float var5 = 1.0F / 16.0F;
+ return AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var5), (double)var3, (double)((float)var4 + var5), (double)((float)(var2 + 1) - var5), (double)(var3 + 1), (double)((float)(var4 + 1) - var5));
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture - 1 : (var1 == 0 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture);
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 13;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return !super.canPlaceBlockAt(var1, var2, var3, var4) ? false : this.canBlockStay(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!this.canBlockStay(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockMaterial(var2 - 1, var3, var4).func_878_a()) {
+ return false;
+ } else if(var1.getBlockMaterial(var2 + 1, var3, var4).func_878_a()) {
+ return false;
+ } else if(var1.getBlockMaterial(var2, var3, var4 - 1).func_878_a()) {
+ return false;
+ } else if(var1.getBlockMaterial(var2, var3, var4 + 1).func_878_a()) {
+ return false;
+ } else {
+ int var5 = var1.getBlockId(var2, var3 - 1, var4);
+ return var5 == Block.cactus.blockID || var5 == Block.sand.blockID;
+ }
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ var5.canAttackEntity((Entity)null, 1);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockChest.java b/src/main/java/net/minecraft/src/BlockChest.java
new file mode 100644
index 0000000..5700c28
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockChest.java
@@ -0,0 +1,196 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockChest extends BlockContainer {
+ private Random field_457_a = new Random();
+
+ protected BlockChest(int var1) {
+ super(var1, Material.wood);
+ this.blockIndexInTexture = 26;
+ }
+
+ public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(var5 == 1) {
+ return this.blockIndexInTexture - 1;
+ } else if(var5 == 0) {
+ return this.blockIndexInTexture - 1;
+ } else {
+ int var6 = var1.getBlockId(var2, var3, var4 - 1);
+ int var7 = var1.getBlockId(var2, var3, var4 + 1);
+ int var8 = var1.getBlockId(var2 - 1, var3, var4);
+ int var9 = var1.getBlockId(var2 + 1, var3, var4);
+ int var10;
+ int var11;
+ int var12;
+ byte var13;
+ if(var6 != this.blockID && var7 != this.blockID) {
+ if(var8 != this.blockID && var9 != this.blockID) {
+ byte var14 = 3;
+ if(Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var7]) {
+ var14 = 3;
+ }
+
+ if(Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var6]) {
+ var14 = 2;
+ }
+
+ if(Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var9]) {
+ var14 = 5;
+ }
+
+ if(Block.opaqueCubeLookup[var9] && !Block.opaqueCubeLookup[var8]) {
+ var14 = 4;
+ }
+
+ return var5 == var14 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture;
+ } else if(var5 != 4 && var5 != 5) {
+ var10 = 0;
+ if(var8 == this.blockID) {
+ var10 = -1;
+ }
+
+ var11 = var1.getBlockId(var8 == this.blockID ? var2 - 1 : var2 + 1, var3, var4 - 1);
+ var12 = var1.getBlockId(var8 == this.blockID ? var2 - 1 : var2 + 1, var3, var4 + 1);
+ if(var5 == 3) {
+ var10 = -1 - var10;
+ }
+
+ var13 = 3;
+ if((Block.opaqueCubeLookup[var6] || Block.opaqueCubeLookup[var11]) && !Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var12]) {
+ var13 = 3;
+ }
+
+ if((Block.opaqueCubeLookup[var7] || Block.opaqueCubeLookup[var12]) && !Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var11]) {
+ var13 = 2;
+ }
+
+ return (var5 == var13 ? this.blockIndexInTexture + 16 : this.blockIndexInTexture + 32) + var10;
+ } else {
+ return this.blockIndexInTexture;
+ }
+ } else if(var5 != 2 && var5 != 3) {
+ var10 = 0;
+ if(var6 == this.blockID) {
+ var10 = -1;
+ }
+
+ var11 = var1.getBlockId(var2 - 1, var3, var6 == this.blockID ? var4 - 1 : var4 + 1);
+ var12 = var1.getBlockId(var2 + 1, var3, var6 == this.blockID ? var4 - 1 : var4 + 1);
+ if(var5 == 4) {
+ var10 = -1 - var10;
+ }
+
+ var13 = 5;
+ if((Block.opaqueCubeLookup[var8] || Block.opaqueCubeLookup[var11]) && !Block.opaqueCubeLookup[var9] && !Block.opaqueCubeLookup[var12]) {
+ var13 = 5;
+ }
+
+ if((Block.opaqueCubeLookup[var9] || Block.opaqueCubeLookup[var12]) && !Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var11]) {
+ var13 = 4;
+ }
+
+ return (var5 == var13 ? this.blockIndexInTexture + 16 : this.blockIndexInTexture + 32) + var10;
+ } else {
+ return this.blockIndexInTexture;
+ }
+ }
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture - 1 : (var1 == 0 ? this.blockIndexInTexture - 1 : (var1 == 3 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture));
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = 0;
+ if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID) {
+ ++var5;
+ }
+
+ if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID) {
+ ++var5;
+ }
+
+ if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID) {
+ ++var5;
+ }
+
+ if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID) {
+ ++var5;
+ }
+
+ return var5 > 1 ? false : (this.isThereANeighborChest(var1, var2 - 1, var3, var4) ? false : (this.isThereANeighborChest(var1, var2 + 1, var3, var4) ? false : (this.isThereANeighborChest(var1, var2, var3, var4 - 1) ? false : !this.isThereANeighborChest(var1, var2, var3, var4 + 1))));
+ }
+
+ private boolean isThereANeighborChest(World var1, int var2, int var3, int var4) {
+ return var1.getBlockId(var2, var3, var4) != this.blockID ? false : (var1.getBlockId(var2 - 1, var3, var4) == this.blockID ? true : (var1.getBlockId(var2 + 1, var3, var4) == this.blockID ? true : (var1.getBlockId(var2, var3, var4 - 1) == this.blockID ? true : var1.getBlockId(var2, var3, var4 + 1) == this.blockID)));
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ TileEntityChest var5 = (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4);
+
+ for(int var6 = 0; var6 < var5.getSizeInventory(); ++var6) {
+ ItemStack var7 = var5.getStackInSlot(var6);
+ if(var7 != null) {
+ float var8 = this.field_457_a.nextFloat() * 0.8F + 0.1F;
+ float var9 = this.field_457_a.nextFloat() * 0.8F + 0.1F;
+ float var10 = this.field_457_a.nextFloat() * 0.8F + 0.1F;
+
+ while(var7.stackSize > 0) {
+ int var11 = this.field_457_a.nextInt(21) + 10;
+ if(var11 > var7.stackSize) {
+ var11 = var7.stackSize;
+ }
+
+ var7.stackSize -= var11;
+ EntityItem var12 = new EntityItem(var1, (double)((float)var2 + var8), (double)((float)var3 + var9), (double)((float)var4 + var10), new ItemStack(var7.itemID, var11, var7.itemDamage));
+ float var13 = 0.05F;
+ var12.motionX = (double)((float)this.field_457_a.nextGaussian() * var13);
+ var12.motionY = (double)((float)this.field_457_a.nextGaussian() * var13 + 0.2F);
+ var12.motionZ = (double)((float)this.field_457_a.nextGaussian() * var13);
+ var1.entityJoinedWorld(var12);
+ }
+ }
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ Object var6 = (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4);
+ if(var1.isBlockOpaqueCube(var2, var3 + 1, var4)) {
+ return true;
+ } else if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID && var1.isBlockOpaqueCube(var2 - 1, var3 + 1, var4)) {
+ return true;
+ } else if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID && var1.isBlockOpaqueCube(var2 + 1, var3 + 1, var4)) {
+ return true;
+ } else if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID && var1.isBlockOpaqueCube(var2, var3 + 1, var4 - 1)) {
+ return true;
+ } else if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID && var1.isBlockOpaqueCube(var2, var3 + 1, var4 + 1)) {
+ return true;
+ } else {
+ if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID) {
+ var6 = new InventoryLargeChest("Large chest", (TileEntityChest)var1.getBlockTileEntity(var2 - 1, var3, var4), (IInventory)var6);
+ }
+
+ if(var1.getBlockId(var2 + 1, var3, var4) == this.blockID) {
+ var6 = new InventoryLargeChest("Large chest", (IInventory)var6, (TileEntityChest)var1.getBlockTileEntity(var2 + 1, var3, var4));
+ }
+
+ if(var1.getBlockId(var2, var3, var4 - 1) == this.blockID) {
+ var6 = new InventoryLargeChest("Large chest", (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4 - 1), (IInventory)var6);
+ }
+
+ if(var1.getBlockId(var2, var3, var4 + 1) == this.blockID) {
+ var6 = new InventoryLargeChest("Large chest", (IInventory)var6, (TileEntityChest)var1.getBlockTileEntity(var2, var3, var4 + 1));
+ }
+
+ var5.displayGUIChest((IInventory)var6);
+ return true;
+ }
+ }
+
+ protected TileEntity SetBlockEntity() {
+ return new TileEntityChest();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockClay.java b/src/main/java/net/minecraft/src/BlockClay.java
new file mode 100644
index 0000000..89b79b7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockClay.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockClay extends Block {
+ public BlockClay(int var1, int var2) {
+ super(var1, var2, Material.clay);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.clay.shiftedIndex;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 4;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockContainer.java b/src/main/java/net/minecraft/src/BlockContainer.java
new file mode 100644
index 0000000..1172af6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockContainer.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+public abstract class BlockContainer extends Block {
+ protected BlockContainer(int var1, Material var2) {
+ super(var1, var2);
+ isBlockContainer[var1] = true;
+ }
+
+ protected BlockContainer(int var1, int var2, Material var3) {
+ super(var1, var2, var3);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ var1.setBlockTileEntity(var2, var3, var4, this.SetBlockEntity());
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ super.onBlockRemoval(var1, var2, var3, var4);
+ var1.removeBlockTileEntity(var2, var3, var4);
+ }
+
+ protected abstract TileEntity SetBlockEntity();
+}
diff --git a/src/main/java/net/minecraft/src/BlockCrops.java b/src/main/java/net/minecraft/src/BlockCrops.java
new file mode 100644
index 0000000..0f1d3ea
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockCrops.java
@@ -0,0 +1,110 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockCrops extends BlockFlower {
+ protected BlockCrops(int var1, int var2) {
+ super(var1, var2);
+ this.blockIndexInTexture = var2;
+ this.setTickOnLoad(true);
+ float var3 = 0.5F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.25F, 0.5F + var3);
+ }
+
+ protected boolean canThisPlantGrowOnThisBlockID(int var1) {
+ return var1 == Block.tilledField.blockID;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ super.updateTick(var1, var2, var3, var4, var5);
+ if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 < 7) {
+ float var7 = this.getGrowthRate(var1, var2, var3, var4);
+ if(var5.nextInt((int)(100.0F / var7)) == 0) {
+ ++var6;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+ }
+ }
+
+ }
+
+ private float getGrowthRate(World var1, int var2, int var3, int var4) {
+ float var5 = 1.0F;
+ int var6 = var1.getBlockId(var2, var3, var4 - 1);
+ int var7 = var1.getBlockId(var2, var3, var4 + 1);
+ int var8 = var1.getBlockId(var2 - 1, var3, var4);
+ int var9 = var1.getBlockId(var2 + 1, var3, var4);
+ int var10 = var1.getBlockId(var2 - 1, var3, var4 - 1);
+ int var11 = var1.getBlockId(var2 + 1, var3, var4 - 1);
+ int var12 = var1.getBlockId(var2 + 1, var3, var4 + 1);
+ int var13 = var1.getBlockId(var2 - 1, var3, var4 + 1);
+ boolean var14 = var8 == this.blockID || var9 == this.blockID;
+ boolean var15 = var6 == this.blockID || var7 == this.blockID;
+ boolean var16 = var10 == this.blockID || var11 == this.blockID || var12 == this.blockID || var13 == this.blockID;
+
+ for(int var17 = var2 - 1; var17 <= var2 + 1; ++var17) {
+ for(int var18 = var4 - 1; var18 <= var4 + 1; ++var18) {
+ int var19 = var1.getBlockId(var17, var3 - 1, var18);
+ float var20 = 0.0F;
+ if(var19 == Block.tilledField.blockID) {
+ var20 = 1.0F;
+ if(var1.getBlockMetadata(var17, var3 - 1, var18) > 0) {
+ var20 = 3.0F;
+ }
+ }
+
+ if(var17 != var2 || var18 != var4) {
+ var20 /= 4.0F;
+ }
+
+ var5 += var20;
+ }
+ }
+
+ if(var16 || var14 && var15) {
+ var5 /= 2.0F;
+ }
+
+ return var5;
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(var2 < 0) {
+ var2 = 7;
+ }
+
+ return this.blockIndexInTexture + var2;
+ }
+
+ public int getRenderType() {
+ return 6;
+ }
+
+ public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) {
+ super.onBlockDestroyedByPlayer(var1, var2, var3, var4, var5);
+ //if(!var1.multiplayerWorld) {
+ for(int var6 = 0; var6 < 3; ++var6) {
+ if(var1.rand.nextInt(15) <= var5) {
+ float var7 = 0.7F;
+ float var8 = var1.rand.nextFloat() * var7 + (1.0F - var7) * 0.5F;
+ float var9 = var1.rand.nextFloat() * var7 + (1.0F - var7) * 0.5F;
+ float var10 = var1.rand.nextFloat() * var7 + (1.0F - var7) * 0.5F;
+ EntityItem var11 = new EntityItem(var1, (double)((float)var2 + var8), (double)((float)var3 + var9), (double)((float)var4 + var10), new ItemStack(Item.seeds));
+ var11.field_805_c = 10;
+ var1.entityJoinedWorld(var11);
+ }
+ }
+ //}
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return var1 == 7 ? Item.wheat.shiftedIndex : -1;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockDirt.java b/src/main/java/net/minecraft/src/BlockDirt.java
new file mode 100644
index 0000000..d3b8a7a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockDirt.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public class BlockDirt extends Block {
+ protected BlockDirt(int var1, int var2) {
+ super(var1, var2, Material.ground);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockDoor.java b/src/main/java/net/minecraft/src/BlockDoor.java
new file mode 100644
index 0000000..2d356cd
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockDoor.java
@@ -0,0 +1,195 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockDoor extends Block {
+ protected BlockDoor(int var1, Material var2) {
+ super(var1, var2);
+ this.blockIndexInTexture = 97;
+ if(var2 == Material.iron) {
+ ++this.blockIndexInTexture;
+ }
+
+ float var3 = 0.5F;
+ float var4 = 1.0F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var4, 0.5F + var3);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(var1 != 0 && var1 != 1) {
+ int var3 = this.func_312_c(var2);
+ if((var3 == 0 || var3 == 2) ^ var1 <= 3) {
+ return this.blockIndexInTexture;
+ } else {
+ int var4 = var3 / 2 + (var1 & 1 ^ var3);
+ var4 += (var2 & 4) / 4;
+ int var5 = this.blockIndexInTexture - (var2 & 8) * 2;
+ if((var4 & 1) != 0) {
+ var5 = -var5;
+ }
+
+ return var5;
+ }
+ } else {
+ return this.blockIndexInTexture;
+ }
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 7;
+ }
+
+ public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.getSelectedBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ this.func_313_b(this.func_312_c(var1.getBlockMetadata(var2, var3, var4)));
+ }
+
+ public void func_313_b(int var1) {
+ float var2 = 3.0F / 16.0F;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
+ if(var1 == 0) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var2);
+ }
+
+ if(var1 == 1) {
+ this.setBlockBounds(1.0F - var2, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var1 == 2) {
+ this.setBlockBounds(0.0F, 0.0F, 1.0F - var2, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var1 == 3) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, var2, 1.0F, 1.0F);
+ }
+
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ if(this.blockMaterial == Material.iron) {
+ return true;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ if(var1.getBlockId(var2, var3 - 1, var4) == this.blockID) {
+ this.blockActivated(var1, var2, var3 - 1, var4, var5);
+ }
+
+ return true;
+ } else {
+ if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) {
+ var1.setBlockMetadataWithNotify(var2, var3 + 1, var4, (var6 ^ 4) + 8);
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 ^ 4);
+ var1.func_701_b(var2, var3 - 1, var4, var2, var3, var4);
+ if(Math.random() < 0.5D) {
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.door_open", 1.0F, var1.rand.nextFloat() * 0.1F + 0.9F);
+ } else {
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.door_close", 1.0F, var1.rand.nextFloat() * 0.1F + 0.9F);
+ }
+
+ return true;
+ }
+ }
+ }
+
+ public void func_311_a(World var1, int var2, int var3, int var4, boolean var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ if(var1.getBlockId(var2, var3 - 1, var4) == this.blockID) {
+ this.func_311_a(var1, var2, var3 - 1, var4, var5);
+ }
+
+ } else {
+ boolean var7 = (var1.getBlockMetadata(var2, var3, var4) & 4) > 0;
+ if(var7 != var5) {
+ if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) {
+ var1.setBlockMetadataWithNotify(var2, var3 + 1, var4, (var6 ^ 4) + 8);
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 ^ 4);
+ var1.func_701_b(var2, var3 - 1, var4, var2, var3, var4);
+ if(Math.random() < 0.5D) {
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.door_open", 1.0F, var1.rand.nextFloat() * 0.1F + 0.9F);
+ } else {
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.door_close", 1.0F, var1.rand.nextFloat() * 0.1F + 0.9F);
+ }
+
+ }
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) != 0) {
+ if(var1.getBlockId(var2, var3 - 1, var4) != this.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ if(var5 > 0 && Block.blocksList[var5].canProvidePower()) {
+ this.onNeighborBlockChange(var1, var2, var3 - 1, var4, var5);
+ }
+ } else {
+ boolean var7 = false;
+ if(var1.getBlockId(var2, var3 + 1, var4) != this.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ var7 = true;
+ if(var1.getBlockId(var2, var3 + 1, var4) == this.blockID) {
+ var1.setBlockWithNotify(var2, var3 + 1, var4, 0);
+ }
+ }
+
+ if(var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var6);
+ } else if(var5 > 0 && Block.blocksList[var5].canProvidePower()) {
+ boolean var8 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4) || var1.isBlockIndirectlyGettingPowered(var2, var3 + 1, var4);
+ this.func_311_a(var1, var2, var3, var4, var8);
+ }
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return (var1 & 8) != 0 ? 0 : (this.blockMaterial == Material.iron ? Item.doorSteel.shiftedIndex : Item.doorWood.shiftedIndex);
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.collisionRayTrace(var1, var2, var3, var4, var5, var6);
+ }
+
+ public int func_312_c(int var1) {
+ return (var1 & 4) == 0 ? var1 - 1 & 3 : var1 & 3;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var3 >= 127 ? false : var1.isBlockOpaqueCube(var2, var3 - 1, var4) && super.canPlaceBlockAt(var1, var2, var3, var4) && super.canPlaceBlockAt(var1, var2, var3 + 1, var4);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockFence.java b/src/main/java/net/minecraft/src/BlockFence.java
new file mode 100644
index 0000000..d2c2e60
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockFence.java
@@ -0,0 +1,29 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+
+public class BlockFence extends Block {
+ public BlockFence(int var1, int var2) {
+ super(var1, var2, Material.wood);
+ }
+
+ public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) {
+ var6.add(AxisAlignedBB.getBoundingBoxFromPool((double)var2, (double)var3, (double)var4, (double)(var2 + 1), (double)var3 + 1.5D, (double)(var4 + 1)));
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.getBlockId(var2, var3 - 1, var4) == this.blockID ? false : (!var1.getBlockMaterial(var2, var3 - 1, var4).func_878_a() ? false : super.canPlaceBlockAt(var1, var2, var3, var4));
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 11;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockFire.java b/src/main/java/net/minecraft/src/BlockFire.java
new file mode 100644
index 0000000..b217a04
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockFire.java
@@ -0,0 +1,228 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFire extends Block {
+ private int[] chanceToEncourageFire = new int[256];
+ private int[] abilityToCatchFire = new int[256];
+
+ protected BlockFire(int var1, int var2) {
+ super(var1, var2, Material.fire);
+ this.setBurnRate(Block.planks.blockID, 5, 20);
+ this.setBurnRate(Block.wood.blockID, 5, 5);
+ this.setBurnRate(Block.leaves.blockID, 30, 60);
+ this.setBurnRate(Block.bookShelf.blockID, 30, 20);
+ this.setBurnRate(Block.tnt.blockID, 15, 100);
+ this.setBurnRate(Block.cloth.blockID, 30, 60);
+ this.setTickOnLoad(true);
+ }
+
+ private void setBurnRate(int var1, int var2, int var3) {
+ this.chanceToEncourageFire[var1] = var2;
+ this.abilityToCatchFire[var1] = var3;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 3;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public int tickRate() {
+ return 10;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ boolean var6 = var1.getBlockId(var2, var3 - 1, var4) == Block.bloodStone.blockID;
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 < 15) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + 1);
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ }
+
+ if(!var6 && !this.func_263_h(var1, var2, var3, var4)) {
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) || var7 > 3) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ } else if(!var6 && !this.canBlockCatchFire(var1, var2, var3 - 1, var4) && var7 == 15 && var5.nextInt(4) == 0) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ if(var7 % 2 == 0 && var7 > 2) {
+ this.tryToCatchBlockOnFire(var1, var2 + 1, var3, var4, 300, var5);
+ this.tryToCatchBlockOnFire(var1, var2 - 1, var3, var4, 300, var5);
+ this.tryToCatchBlockOnFire(var1, var2, var3 - 1, var4, 250, var5);
+ this.tryToCatchBlockOnFire(var1, var2, var3 + 1, var4, 250, var5);
+ this.tryToCatchBlockOnFire(var1, var2, var3, var4 - 1, 300, var5);
+ this.tryToCatchBlockOnFire(var1, var2, var3, var4 + 1, 300, var5);
+
+ for(int var8 = var2 - 1; var8 <= var2 + 1; ++var8) {
+ for(int var9 = var4 - 1; var9 <= var4 + 1; ++var9) {
+ for(int var10 = var3 - 1; var10 <= var3 + 4; ++var10) {
+ if(var8 != var2 || var10 != var3 || var9 != var4) {
+ int var11 = 100;
+ if(var10 > var3 + 1) {
+ var11 += (var10 - (var3 + 1)) * 100;
+ }
+
+ int var12 = this.getChanceOfNeighborsEncouragingFire(var1, var8, var10, var9);
+ if(var12 > 0 && var5.nextInt(var11) <= var12) {
+ var1.setBlockWithNotify(var8, var10, var9, this.blockID);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ }
+
+ private void tryToCatchBlockOnFire(World var1, int var2, int var3, int var4, int var5, Random var6) {
+ int var7 = this.abilityToCatchFire[var1.getBlockId(var2, var3, var4)];
+ if(var6.nextInt(var5) < var7) {
+ boolean var8 = var1.getBlockId(var2, var3, var4) == Block.tnt.blockID;
+ if(var6.nextInt(2) == 0) {
+ var1.setBlockWithNotify(var2, var3, var4, this.blockID);
+ } else {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ if(var8) {
+ Block.tnt.onBlockDestroyedByPlayer(var1, var2, var3, var4, 0);
+ }
+ }
+
+ }
+
+ private boolean func_263_h(World var1, int var2, int var3, int var4) {
+ return this.canBlockCatchFire(var1, var2 + 1, var3, var4) ? true : (this.canBlockCatchFire(var1, var2 - 1, var3, var4) ? true : (this.canBlockCatchFire(var1, var2, var3 - 1, var4) ? true : (this.canBlockCatchFire(var1, var2, var3 + 1, var4) ? true : (this.canBlockCatchFire(var1, var2, var3, var4 - 1) ? true : this.canBlockCatchFire(var1, var2, var3, var4 + 1)))));
+ }
+
+ private int getChanceOfNeighborsEncouragingFire(World var1, int var2, int var3, int var4) {
+ byte var5 = 0;
+ if(var1.getBlockId(var2, var3, var4) != 0) {
+ return 0;
+ } else {
+ int var6 = this.getChanceToEncourageFire(var1, var2 + 1, var3, var4, var5);
+ var6 = this.getChanceToEncourageFire(var1, var2 - 1, var3, var4, var6);
+ var6 = this.getChanceToEncourageFire(var1, var2, var3 - 1, var4, var6);
+ var6 = this.getChanceToEncourageFire(var1, var2, var3 + 1, var4, var6);
+ var6 = this.getChanceToEncourageFire(var1, var2, var3, var4 - 1, var6);
+ var6 = this.getChanceToEncourageFire(var1, var2, var3, var4 + 1, var6);
+ return var6;
+ }
+ }
+
+ public boolean isCollidable() {
+ return false;
+ }
+
+ public boolean canBlockCatchFire(IBlockAccess var1, int var2, int var3, int var4) {
+ return this.chanceToEncourageFire[var1.getBlockId(var2, var3, var4)] > 0;
+ }
+
+ public int getChanceToEncourageFire(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = this.chanceToEncourageFire[var1.getBlockId(var2, var3, var4)];
+ return var6 > var5 ? var6 : var5;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockOpaqueCube(var2, var3 - 1, var4) || this.func_263_h(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && !this.func_263_h(var1, var2, var3, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockId(var2, var3 - 1, var4) != Block.obsidian.blockID || !Block.portal.tryToCreatePortal(var1, var2, var3, var4)) {
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && !this.func_263_h(var1, var2, var3, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ }
+ }
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var5.nextInt(24) == 0) {
+ var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "fire.fire", 1.0F + var5.nextFloat(), var5.nextFloat() * 0.7F + 0.3F);
+ }
+
+ int var6;
+ float var7;
+ float var8;
+ float var9;
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && !Block.fire.canBlockCatchFire(var1, var2, var3 - 1, var4)) {
+ if(Block.fire.canBlockCatchFire(var1, var2 - 1, var3, var4)) {
+ for(var6 = 0; var6 < 2; ++var6) {
+ var7 = (float)var2 + var5.nextFloat() * 0.1F;
+ var8 = (float)var3 + var5.nextFloat();
+ var9 = (float)var4 + var5.nextFloat();
+ var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if(Block.fire.canBlockCatchFire(var1, var2 + 1, var3, var4)) {
+ for(var6 = 0; var6 < 2; ++var6) {
+ var7 = (float)(var2 + 1) - var5.nextFloat() * 0.1F;
+ var8 = (float)var3 + var5.nextFloat();
+ var9 = (float)var4 + var5.nextFloat();
+ var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if(Block.fire.canBlockCatchFire(var1, var2, var3, var4 - 1)) {
+ for(var6 = 0; var6 < 2; ++var6) {
+ var7 = (float)var2 + var5.nextFloat();
+ var8 = (float)var3 + var5.nextFloat();
+ var9 = (float)var4 + var5.nextFloat() * 0.1F;
+ var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if(Block.fire.canBlockCatchFire(var1, var2, var3, var4 + 1)) {
+ for(var6 = 0; var6 < 2; ++var6) {
+ var7 = (float)var2 + var5.nextFloat();
+ var8 = (float)var3 + var5.nextFloat();
+ var9 = (float)(var4 + 1) - var5.nextFloat() * 0.1F;
+ var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ if(Block.fire.canBlockCatchFire(var1, var2, var3 + 1, var4)) {
+ for(var6 = 0; var6 < 2; ++var6) {
+ var7 = (float)var2 + var5.nextFloat();
+ var8 = (float)(var3 + 1) - var5.nextFloat() * 0.1F;
+ var9 = (float)var4 + var5.nextFloat();
+ var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D);
+ }
+ }
+ } else {
+ for(var6 = 0; var6 < 3; ++var6) {
+ var7 = (float)var2 + var5.nextFloat();
+ var8 = (float)var3 + var5.nextFloat() * 0.5F + 0.5F;
+ var9 = (float)var4 + var5.nextFloat();
+ var1.spawnParticle("largesmoke", (double)var7, (double)var8, (double)var9, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockFlower.java b/src/main/java/net/minecraft/src/BlockFlower.java
new file mode 100644
index 0000000..5fa5127
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockFlower.java
@@ -0,0 +1,58 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFlower extends Block {
+ protected BlockFlower(int var1, int var2) {
+ super(var1, Material.plants);
+ this.blockIndexInTexture = var2;
+ this.setTickOnLoad(true);
+ float var3 = 0.2F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 3.0F, 0.5F + var3);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4));
+ }
+
+ protected boolean canThisPlantGrowOnThisBlockID(int var1) {
+ return var1 == Block.grass.blockID || var1 == Block.dirt.blockID || var1 == Block.tilledField.blockID;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ this.func_268_h(var1, var2, var3, var4);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ this.func_268_h(var1, var2, var3, var4);
+ }
+
+ protected final void func_268_h(World var1, int var2, int var3, int var4) {
+ if(!this.canBlockStay(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return (var1.getBlockLightValue(var2, var3, var4) >= 8 || var1.canBlockSeeTheSky(var2, var3, var4)) && this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4));
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockFlowing.java b/src/main/java/net/minecraft/src/BlockFlowing.java
new file mode 100644
index 0000000..a067f7a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockFlowing.java
@@ -0,0 +1,263 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFlowing extends BlockFluids {
+ int field_460_a = 0;
+ boolean[] field_459_b = new boolean[4];
+ int[] field_461_c = new int[4];
+
+ protected BlockFlowing(int var1, Material var2) {
+ super(var1, var2);
+ }
+
+ private void func_15233_j(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ var1.setBlockAndMetadata(var2, var3, var4, this.blockID + 1, var5);
+ var1.func_701_b(var2, var3, var4, var2, var3, var4);
+ var1.func_665_h(var2, var3, var4);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ int var6 = this.func_290_h(var1, var2, var3, var4);
+ byte var7 = 1;
+ if(this.blockMaterial == Material.lava && !var1.worldProvider.field_6479_d) {
+ var7 = 2;
+ }
+
+ boolean var8 = true;
+ int var10;
+ if(var6 > 0) {
+ byte var9 = -100;
+ this.field_460_a = 0;
+ int var12 = this.func_296_f(var1, var2 - 1, var3, var4, var9);
+ var12 = this.func_296_f(var1, var2 + 1, var3, var4, var12);
+ var12 = this.func_296_f(var1, var2, var3, var4 - 1, var12);
+ var12 = this.func_296_f(var1, var2, var3, var4 + 1, var12);
+ var10 = var12 + var7;
+ if(var10 >= 8 || var12 < 0) {
+ var10 = -1;
+ }
+
+ if(this.func_290_h(var1, var2, var3 + 1, var4) >= 0) {
+ int var11 = this.func_290_h(var1, var2, var3 + 1, var4);
+ if(var11 >= 8) {
+ var10 = var11;
+ } else {
+ var10 = var11 + 8;
+ }
+ }
+
+ if(this.field_460_a >= 2 && this.blockMaterial == Material.water) {
+ if(var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var10 = 0;
+ } else if(var1.getBlockMaterial(var2, var3 - 1, var4) == this.blockMaterial && var1.getBlockMetadata(var2, var3, var4) == 0) {
+ var10 = 0;
+ }
+ }
+
+ if(this.blockMaterial == Material.lava && var6 < 8 && var10 < 8 && var10 > var6 && var5.nextInt(4) != 0) {
+ var10 = var6;
+ var8 = false;
+ }
+
+ if(var10 != var6) {
+ var6 = var10;
+ if(var10 < 0) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var10);
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ }
+ } else if(var8) {
+ this.func_15233_j(var1, var2, var3, var4);
+ }
+ } else {
+ this.func_15233_j(var1, var2, var3, var4);
+ }
+
+ if(this.func_298_m(var1, var2, var3 - 1, var4)) {
+ if(var6 >= 8) {
+ var1.setBlockAndMetadataWithNotify(var2, var3 - 1, var4, this.blockID, var6);
+ } else {
+ var1.setBlockAndMetadataWithNotify(var2, var3 - 1, var4, this.blockID, var6 + 8);
+ }
+ } else if(var6 >= 0 && (var6 == 0 || this.func_295_l(var1, var2, var3 - 1, var4))) {
+ boolean[] var13 = this.func_297_k(var1, var2, var3, var4);
+ var10 = var6 + var7;
+ if(var6 >= 8) {
+ var10 = 1;
+ }
+
+ if(var10 >= 8) {
+ return;
+ }
+
+ if(var13[0]) {
+ this.func_299_g(var1, var2 - 1, var3, var4, var10);
+ }
+
+ if(var13[1]) {
+ this.func_299_g(var1, var2 + 1, var3, var4, var10);
+ }
+
+ if(var13[2]) {
+ this.func_299_g(var1, var2, var3, var4 - 1, var10);
+ }
+
+ if(var13[3]) {
+ this.func_299_g(var1, var2, var3, var4 + 1, var10);
+ }
+ }
+
+ }
+
+ private void func_299_g(World var1, int var2, int var3, int var4, int var5) {
+ if(this.func_298_m(var1, var2, var3, var4)) {
+ int var6 = var1.getBlockId(var2, var3, var4);
+ if(var6 > 0) {
+ if(this.blockMaterial == Material.lava) {
+ this.func_292_i(var1, var2, var3, var4);
+ } else {
+ Block.blocksList[var6].dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ }
+ }
+
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, this.blockID, var5);
+ }
+
+ }
+
+ private int func_300_a(World var1, int var2, int var3, int var4, int var5, int var6) {
+ int var7 = 1000;
+
+ for(int var8 = 0; var8 < 4; ++var8) {
+ if((var8 != 0 || var6 != 1) && (var8 != 1 || var6 != 0) && (var8 != 2 || var6 != 3) && (var8 != 3 || var6 != 2)) {
+ int var9 = var2;
+ int var11 = var4;
+ if(var8 == 0) {
+ var9 = var2 - 1;
+ }
+
+ if(var8 == 1) {
+ ++var9;
+ }
+
+ if(var8 == 2) {
+ var11 = var4 - 1;
+ }
+
+ if(var8 == 3) {
+ ++var11;
+ }
+
+ if(!this.func_295_l(var1, var9, var3, var11) && (var1.getBlockMaterial(var9, var3, var11) != this.blockMaterial || var1.getBlockMetadata(var9, var3, var11) != 0)) {
+ if(!this.func_295_l(var1, var9, var3 - 1, var11)) {
+ return var5;
+ }
+
+ if(var5 < 4) {
+ int var12 = this.func_300_a(var1, var9, var3, var11, var5 + 1, var8);
+ if(var12 < var7) {
+ var7 = var12;
+ }
+ }
+ }
+ }
+ }
+
+ return var7;
+ }
+
+ private boolean[] func_297_k(World var1, int var2, int var3, int var4) {
+ int var5;
+ int var6;
+ for(var5 = 0; var5 < 4; ++var5) {
+ this.field_461_c[var5] = 1000;
+ var6 = var2;
+ int var8 = var4;
+ if(var5 == 0) {
+ var6 = var2 - 1;
+ }
+
+ if(var5 == 1) {
+ ++var6;
+ }
+
+ if(var5 == 2) {
+ var8 = var4 - 1;
+ }
+
+ if(var5 == 3) {
+ ++var8;
+ }
+
+ if(!this.func_295_l(var1, var6, var3, var8) && (var1.getBlockMaterial(var6, var3, var8) != this.blockMaterial || var1.getBlockMetadata(var6, var3, var8) != 0)) {
+ if(!this.func_295_l(var1, var6, var3 - 1, var8)) {
+ this.field_461_c[var5] = 0;
+ } else {
+ this.field_461_c[var5] = this.func_300_a(var1, var6, var3, var8, 1, var5);
+ }
+ }
+ }
+
+ var5 = this.field_461_c[0];
+
+ for(var6 = 1; var6 < 4; ++var6) {
+ if(this.field_461_c[var6] < var5) {
+ var5 = this.field_461_c[var6];
+ }
+ }
+
+ for(var6 = 0; var6 < 4; ++var6) {
+ this.field_459_b[var6] = this.field_461_c[var6] == var5;
+ }
+
+ return this.field_459_b;
+ }
+
+ private boolean func_295_l(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3, var4);
+ if(var5 != Block.doorWood.blockID && var5 != Block.doorSteel.blockID && var5 != Block.signPost.blockID && var5 != Block.ladder.blockID && var5 != Block.reed.blockID) {
+ if(var5 == 0) {
+ return false;
+ } else {
+ Material var6 = Block.blocksList[var5].blockMaterial;
+ return var6.func_878_a();
+ }
+ } else {
+ return true;
+ }
+ }
+
+ protected int func_296_f(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = this.func_290_h(var1, var2, var3, var4);
+ if(var6 < 0) {
+ return var5;
+ } else {
+ if(var6 == 0) {
+ ++this.field_460_a;
+ }
+
+ if(var6 >= 8) {
+ var6 = 0;
+ }
+
+ return var5 >= 0 && var6 >= var5 ? var5 : var6;
+ }
+ }
+
+ private boolean func_298_m(World var1, int var2, int var3, int var4) {
+ Material var5 = var1.getBlockMaterial(var2, var3, var4);
+ return var5 == this.blockMaterial ? false : (var5 == Material.lava ? false : !this.func_295_l(var1, var2, var3, var4));
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockFluids.java b/src/main/java/net/minecraft/src/BlockFluids.java
new file mode 100644
index 0000000..0d96a5f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockFluids.java
@@ -0,0 +1,269 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public abstract class BlockFluids extends Block {
+ protected BlockFluids(int var1, Material var2) {
+ super(var1, (var2 == Material.lava ? 14 : 12) * 16 + 13, var2);
+ float var3 = 0.0F;
+ float var4 = 0.0F;
+ this.setBlockBounds(0.0F + var4, 0.0F + var3, 0.0F + var4, 1.0F + var4, 1.0F + var3, 1.0F + var4);
+ this.setTickOnLoad(true);
+ }
+
+ public static float func_288_b(int var0) {
+ if(var0 >= 8) {
+ var0 = 0;
+ }
+
+ float var1 = (float)(var0 + 1) / 9.0F;
+ return var1;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 != 0 && var1 != 1 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture;
+ }
+
+ protected int func_290_h(World var1, int var2, int var3, int var4) {
+ return var1.getBlockMaterial(var2, var3, var4) != this.blockMaterial ? -1 : var1.getBlockMetadata(var2, var3, var4);
+ }
+
+ protected int func_289_b(IBlockAccess var1, int var2, int var3, int var4) {
+ if(var1.getBlockMaterial(var2, var3, var4) != this.blockMaterial) {
+ return -1;
+ } else {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if(var5 >= 8) {
+ var5 = 0;
+ }
+
+ return var5;
+ }
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean canCollideCheck(int var1, boolean var2) {
+ return var2 && var1 == 0;
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ Material var6 = var1.getBlockMaterial(var2, var3, var4);
+ return var6 == this.blockMaterial ? false : (var6 == Material.ice ? false : (var5 == 1 ? true : super.shouldSideBeRendered(var1, var2, var3, var4, var5)));
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public int getRenderType() {
+ return 4;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return 0;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ private Vec3D func_291_e(IBlockAccess var1, int var2, int var3, int var4) {
+ Vec3D var5 = Vec3D.createVector(0.0D, 0.0D, 0.0D);
+ int var6 = this.func_289_b(var1, var2, var3, var4);
+
+ for(int var7 = 0; var7 < 4; ++var7) {
+ int var8 = var2;
+ int var10 = var4;
+ if(var7 == 0) {
+ var8 = var2 - 1;
+ }
+
+ if(var7 == 1) {
+ var10 = var4 - 1;
+ }
+
+ if(var7 == 2) {
+ ++var8;
+ }
+
+ if(var7 == 3) {
+ ++var10;
+ }
+
+ int var11 = this.func_289_b(var1, var8, var3, var10);
+ int var12;
+ if(var11 < 0) {
+ if(!var1.getBlockMaterial(var8, var3, var10).func_880_c()) {
+ var11 = this.func_289_b(var1, var8, var3 - 1, var10);
+ if(var11 >= 0) {
+ var12 = var11 - (var6 - 8);
+ var5 = var5.addVector((double)((var8 - var2) * var12), (double)((var3 - var3) * var12), (double)((var10 - var4) * var12));
+ }
+ }
+ } else if(var11 >= 0) {
+ var12 = var11 - var6;
+ var5 = var5.addVector((double)((var8 - var2) * var12), (double)((var3 - var3) * var12), (double)((var10 - var4) * var12));
+ }
+ }
+
+ if(var1.getBlockMetadata(var2, var3, var4) >= 8) {
+ boolean var13 = false;
+ if(var13 || this.shouldSideBeRendered(var1, var2, var3, var4 - 1, 2)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2, var3, var4 + 1, 3)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2 - 1, var3, var4, 4)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2 + 1, var3, var4, 5)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2, var3 + 1, var4 - 1, 2)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2, var3 + 1, var4 + 1, 3)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2 - 1, var3 + 1, var4, 4)) {
+ var13 = true;
+ }
+
+ if(var13 || this.shouldSideBeRendered(var1, var2 + 1, var3 + 1, var4, 5)) {
+ var13 = true;
+ }
+
+ if(var13) {
+ var5 = var5.normalize().addVector(0.0D, -6.0D, 0.0D);
+ }
+ }
+
+ var5 = var5.normalize();
+ return var5;
+ }
+
+ public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) {
+ Vec3D var7 = this.func_291_e(var1, var2, var3, var4);
+ var6.xCoord += var7.xCoord;
+ var6.yCoord += var7.yCoord;
+ var6.zCoord += var7.zCoord;
+ }
+
+ public int tickRate() {
+ return this.blockMaterial == Material.water ? 5 : (this.blockMaterial == Material.lava ? 30 : 0);
+ }
+
+ public float getBlockBrightness(IBlockAccess var1, int var2, int var3, int var4) {
+ float var5 = var1.getLightBrightness(var2, var3, var4);
+ float var6 = var1.getLightBrightness(var2, var3 + 1, var4);
+ return var5 > var6 ? var5 : var6;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ super.updateTick(var1, var2, var3, var4, var5);
+ }
+
+ public int func_234_g() {
+ return this.blockMaterial == Material.water ? 1 : 0;
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this.blockMaterial == Material.water && var5.nextInt(64) == 0) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 > 0 && var6 < 8) {
+ var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "liquid.water", var5.nextFloat() * 0.25F + 12.0F / 16.0F, var5.nextFloat() * 1.0F + 0.5F);
+ }
+ }
+
+ if(this.blockMaterial == Material.lava && var1.getBlockMaterial(var2, var3 + 1, var4) == Material.air && !var1.isBlockOpaqueCube(var2, var3 + 1, var4) && var5.nextInt(100) == 0) {
+ double var12 = (double)((float)var2 + var5.nextFloat());
+ double var8 = (double)var3 + this.maxY;
+ double var10 = (double)((float)var4 + var5.nextFloat());
+ var1.spawnParticle("lava", var12, var8, var10, 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+
+ public static double func_293_a(IBlockAccess var0, int var1, int var2, int var3, Material var4) {
+ Vec3D var5 = null;
+ if(var4 == Material.water) {
+ var5 = ((BlockFluids)Block.waterStill).func_291_e(var0, var1, var2, var3);
+ }
+
+ if(var4 == Material.lava) {
+ var5 = ((BlockFluids)Block.lavaStill).func_291_e(var0, var1, var2, var3);
+ }
+
+ return var5.xCoord == 0.0D && var5.zCoord == 0.0D ? -1000.0D : Math.atan2(var5.zCoord, var5.xCoord) - Math.PI * 0.5D;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ this.checkForHarden(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ this.checkForHarden(var1, var2, var3, var4);
+ }
+
+ private void checkForHarden(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ if(this.blockMaterial == Material.lava) {
+ boolean var5 = false;
+ if(var5 || var1.getBlockMaterial(var2, var3, var4 - 1) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5 || var1.getBlockMaterial(var2, var3, var4 + 1) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5 || var1.getBlockMaterial(var2 - 1, var3, var4) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5 || var1.getBlockMaterial(var2 + 1, var3, var4) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5 || var1.getBlockMaterial(var2, var3 + 1, var4) == Material.water) {
+ var5 = true;
+ }
+
+ if(var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 == 0) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.obsidian.blockID);
+ } else if(var6 <= 4) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.cobblestone.blockID);
+ }
+
+ this.func_292_i(var1, var2, var3, var4);
+ }
+ }
+
+ }
+ }
+
+ protected void func_292_i(World var1, int var2, int var3, int var4) {
+ var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "random.fizz", 0.5F, 2.6F + (var1.rand.nextFloat() - var1.rand.nextFloat()) * 0.8F);
+
+ for(int var5 = 0; var5 < 8; ++var5) {
+ var1.spawnParticle("largesmoke", (double)var2 + Math.random(), (double)var3 + 1.2D, (double)var4 + Math.random(), 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockFurnace.java b/src/main/java/net/minecraft/src/BlockFurnace.java
new file mode 100644
index 0000000..4bc3d78
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockFurnace.java
@@ -0,0 +1,130 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockFurnace extends BlockContainer {
+ private final boolean isActive;
+
+ protected BlockFurnace(int var1, boolean var2) {
+ super(var1, Material.rock);
+ this.isActive = var2;
+ this.blockIndexInTexture = 45;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.stoneOvenIdle.blockID;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ this.func_284_h(var1, var2, var3, var4);
+ }
+
+ private void func_284_h(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3, var4 - 1);
+ int var6 = var1.getBlockId(var2, var3, var4 + 1);
+ int var7 = var1.getBlockId(var2 - 1, var3, var4);
+ int var8 = var1.getBlockId(var2 + 1, var3, var4);
+ byte var9 = 3;
+ if(Block.opaqueCubeLookup[var5] && !Block.opaqueCubeLookup[var6]) {
+ var9 = 3;
+ }
+
+ if(Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var5]) {
+ var9 = 2;
+ }
+
+ if(Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var8]) {
+ var9 = 5;
+ }
+
+ if(Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var7]) {
+ var9 = 4;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var9);
+ }
+
+ public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(var5 == 1) {
+ return Block.stone.blockIndexInTexture;
+ } else if(var5 == 0) {
+ return Block.stone.blockIndexInTexture;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ return var5 != var6 ? this.blockIndexInTexture : (this.isActive ? this.blockIndexInTexture + 16 : this.blockIndexInTexture - 1);
+ }
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this.isActive) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ float var7 = (float)var2 + 0.5F;
+ float var8 = (float)var3 + 0.0F + var5.nextFloat() * 6.0F / 16.0F;
+ float var9 = (float)var4 + 0.5F;
+ float var10 = 0.52F;
+ float var11 = var5.nextFloat() * 0.6F - 0.3F;
+ if(var6 == 4) {
+ var1.spawnParticle("smoke", (double)(var7 - var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", (double)(var7 - var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 5) {
+ var1.spawnParticle("smoke", (double)(var7 + var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", (double)(var7 + var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 2) {
+ var1.spawnParticle("smoke", (double)(var7 + var11), (double)var8, (double)(var9 - var10), 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", (double)(var7 + var11), (double)var8, (double)(var9 - var10), 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 3) {
+ var1.spawnParticle("smoke", (double)(var7 + var11), (double)var8, (double)(var9 + var10), 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", (double)(var7 + var11), (double)var8, (double)(var9 + var10), 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? Block.stone.blockID : (var1 == 0 ? Block.stone.blockID : (var1 == 3 ? this.blockIndexInTexture - 1 : this.blockIndexInTexture));
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ TileEntityFurnace var6 = (TileEntityFurnace)var1.getBlockTileEntity(var2, var3, var4);
+ var5.displayGUIFurnace(var6);
+ return true;
+ }
+
+ public static void updateFurnaceBlockState(boolean var0, World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ TileEntity var6 = var1.getBlockTileEntity(var2, var3, var4);
+ if(var0) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.stoneOvenActive.blockID);
+ } else {
+ var1.setBlockWithNotify(var2, var3, var4, Block.stoneOvenIdle.blockID);
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var5);
+ var1.setBlockTileEntity(var2, var3, var4, var6);
+ }
+
+ protected TileEntity SetBlockEntity() {
+ return new TileEntityFurnace();
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+ if(var6 == 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ }
+
+ if(var6 == 1) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 5);
+ }
+
+ if(var6 == 2) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ }
+
+ if(var6 == 3) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 4);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockGlass.java b/src/main/java/net/minecraft/src/BlockGlass.java
new file mode 100644
index 0000000..c2672d1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockGlass.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockGlass extends BlockBreakable {
+ public BlockGlass(int var1, int var2, Material var3, boolean var4) {
+ super(var1, var2, var3, var4);
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockGrass.java b/src/main/java/net/minecraft/src/BlockGrass.java
new file mode 100644
index 0000000..637bf79
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockGrass.java
@@ -0,0 +1,51 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockGrass extends Block {
+ protected BlockGrass(int var1) {
+ super(var1, Material.ground);
+ this.blockIndexInTexture = 3;
+ this.setTickOnLoad(true);
+ }
+
+ public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(var5 == 1) {
+ return 0;
+ } else if(var5 == 0) {
+ return 2;
+ } else {
+ Material var6 = var1.getBlockMaterial(var2, var3 + 1, var4);
+ return var6 != Material.snow && var6 != Material.builtSnow ? 3 : 68;
+ }
+ }
+
+ public int colorMultiplier(IBlockAccess var1, int var2, int var3, int var4) {
+ var1.func_4075_a().func_4069_a(var2, var4, 1, 1);
+ double var5 = var1.func_4075_a().temperature[0];
+ double var7 = var1.func_4075_a().humidity[0];
+ return ColorizerGrass.func_4147_a(var5, var7);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getBlockLightValue(var2, var3 + 1, var4) < 4 && var1.getBlockMaterial(var2, var3 + 1, var4).getCanBlockGrass()) {
+ if(var5.nextInt(4) != 0) {
+ return;
+ }
+
+ var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID);
+ } else if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9) {
+ int var6 = var2 + var5.nextInt(3) - 1;
+ int var7 = var3 + var5.nextInt(5) - 3;
+ int var8 = var4 + var5.nextInt(3) - 1;
+ if(var1.getBlockId(var6, var7, var8) == Block.dirt.blockID && var1.getBlockLightValue(var6, var7 + 1, var8) >= 4 && !var1.getBlockMaterial(var6, var7 + 1, var8).getCanBlockGrass()) {
+ var1.setBlockWithNotify(var6, var7, var8, Block.grass.blockID);
+ }
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.dirt.idDropped(0, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockGravel.java b/src/main/java/net/minecraft/src/BlockGravel.java
new file mode 100644
index 0000000..c0fd641
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockGravel.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockGravel extends BlockSand {
+ public BlockGravel(int var1, int var2) {
+ super(var1, var2);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return var2.nextInt(10) == 0 ? Item.flint.shiftedIndex : this.blockID;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockIce.java b/src/main/java/net/minecraft/src/BlockIce.java
new file mode 100644
index 0000000..f32f78f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockIce.java
@@ -0,0 +1,39 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockIce extends BlockBreakable {
+ public BlockIce(int var1, int var2) {
+ super(var1, var2, Material.ice, false);
+ this.slipperiness = 0.98F;
+ this.setTickOnLoad(true);
+ }
+
+ public int func_234_g() {
+ return 1;
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return super.shouldSideBeRendered(var1, var2, var3, var4, 1 - var5);
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ Material var5 = var1.getBlockMaterial(var2, var3 - 1, var4);
+ if(var5.func_880_c() || var5.getIsLiquid()) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.waterStill.blockID);
+ }
+
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11 - Block.lightOpacity[this.blockID]) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, Block.waterMoving.blockID);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockJukeBox.java b/src/main/java/net/minecraft/src/BlockJukeBox.java
new file mode 100644
index 0000000..06781b1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockJukeBox.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+public class BlockJukeBox extends Block {
+ protected BlockJukeBox(int var1, int var2) {
+ super(var1, var2, Material.wood);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.blockIndexInTexture + (var1 == 1 ? 1 : 0);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 > 0) {
+ this.ejectRecord(var1, var2, var3, var4, var6);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void ejectRecord(World var1, int var2, int var3, int var4, int var5) {
+ var1.playRecord((String)null, var2, var3, var4);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ int var6 = Item.record13.shiftedIndex + var5 - 1;
+ float var7 = 0.7F;
+ double var8 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D;
+ double var10 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.2D + 0.6D;
+ double var12 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D;
+ EntityItem var14 = new EntityItem(var1, (double)var2 + var8, (double)var3 + var10, (double)var4 + var12, new ItemStack(var6));
+ var14.field_805_c = 10;
+ var1.entityJoinedWorld(var14);
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ //if(!var1.multiplayerWorld) {
+ if(var5 > 0) {
+ this.ejectRecord(var1, var2, var3, var4, var5);
+ }
+
+ super.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6);
+ //}
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockLadder.java b/src/main/java/net/minecraft/src/BlockLadder.java
new file mode 100644
index 0000000..678f29e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockLadder.java
@@ -0,0 +1,121 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockLadder extends Block {
+ protected BlockLadder(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ float var6 = 2.0F / 16.0F;
+ if(var5 == 2) {
+ this.setBlockBounds(0.0F, 0.0F, 1.0F - var6, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var5 == 3) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var6);
+ }
+
+ if(var5 == 4) {
+ this.setBlockBounds(1.0F - var6, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var5 == 5) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, var6, 1.0F, 1.0F);
+ }
+
+ return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ float var6 = 2.0F / 16.0F;
+ if(var5 == 2) {
+ this.setBlockBounds(0.0F, 0.0F, 1.0F - var6, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var5 == 3) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, var6);
+ }
+
+ if(var5 == 4) {
+ this.setBlockBounds(1.0F - var6, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ if(var5 == 5) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, var6, 1.0F, 1.0F);
+ }
+
+ return super.getSelectedBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 8;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockOpaqueCube(var2 - 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2 + 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 - 1) ? true : var1.isBlockOpaqueCube(var2, var3, var4 + 1)));
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 == 0 || var5 == 2) && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var6 = 2;
+ }
+
+ if((var6 == 0 || var5 == 3) && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var6 = 3;
+ }
+
+ if((var6 == 0 || var5 == 4) && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var6 = 4;
+ }
+
+ if((var6 == 0 || var5 == 5) && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var6 = 5;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = false;
+ if(var6 == 2 && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var7 = true;
+ }
+
+ if(var6 == 3 && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var7 = true;
+ }
+
+ if(var6 == 4 && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var7 = true;
+ }
+
+ if(var6 == 5 && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var7 = true;
+ }
+
+ if(!var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var6);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockLeaves.java b/src/main/java/net/minecraft/src/BlockLeaves.java
new file mode 100644
index 0000000..edb9bc7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockLeaves.java
@@ -0,0 +1,128 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockLeaves extends BlockLeavesBase {
+ private int baseIndexInPNG;
+ private int field_464_c = 0;
+
+ protected BlockLeaves(int var1, int var2) {
+ super(var1, var2, Material.leaves, false);
+ this.baseIndexInPNG = var2;
+ }
+
+ public int colorMultiplier(IBlockAccess var1, int var2, int var3, int var4) {
+ var1.func_4075_a().func_4069_a(var2, var4, 1, 1);
+ double var5 = var1.func_4075_a().temperature[0];
+ double var7 = var1.func_4075_a().humidity[0];
+ return ColorizerFoliage.func_4146_a(var5, var7);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(this == null) {
+ this.field_464_c = 0;
+ this.func_308_h(var1, var2, var3, var4);
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ }
+ }
+
+ public void func_6361_f(World var1, int var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 != 0 && var6 == var5 - 1) {
+ this.func_308_h(var1, var2, var3, var4);
+ }
+ }
+ }
+
+ public void func_308_h(World var1, int var2, int var3, int var4) {
+ if(this == null) {
+ if(this.field_464_c++ < 100) {
+ int var5 = var1.getBlockMaterial(var2, var3 - 1, var4).func_878_a() ? 16 : 0;
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 == 0) {
+ var6 = 1;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ }
+
+ var5 = this.func_6362_g(var1, var2, var3 - 1, var4, var5);
+ var5 = this.func_6362_g(var1, var2, var3, var4 - 1, var5);
+ var5 = this.func_6362_g(var1, var2, var3, var4 + 1, var5);
+ var5 = this.func_6362_g(var1, var2 - 1, var3, var4, var5);
+ var5 = this.func_6362_g(var1, var2 + 1, var3, var4, var5);
+ int var7 = var5 - 1;
+ if(var7 < 10) {
+ var7 = 1;
+ }
+
+ if(var7 != var6) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7);
+ this.func_6361_f(var1, var2, var3 - 1, var4, var6);
+ this.func_6361_f(var1, var2, var3 + 1, var4, var6);
+ this.func_6361_f(var1, var2, var3, var4 - 1, var6);
+ this.func_6361_f(var1, var2, var3, var4 + 1, var6);
+ this.func_6361_f(var1, var2 - 1, var3, var4, var6);
+ this.func_6361_f(var1, var2 + 1, var3, var4, var6);
+ }
+
+ }
+ }
+ }
+
+ private int func_6362_g(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockId(var2, var3, var4);
+ if(var6 == Block.wood.blockID) {
+ return 16;
+ } else {
+ if(var6 == this.blockID) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 != 0 && var7 > var5) {
+ return var7;
+ }
+ }
+
+ return var5;
+ }
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this == null) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 == 0) {
+ this.field_464_c = 0;
+ this.func_308_h(var1, var2, var3, var4);
+ } else if(var6 == 1) {
+ this.func_6360_i(var1, var2, var3, var4);
+ } else if(var5.nextInt(10) == 0) {
+ this.func_308_h(var1, var2, var3, var4);
+ }
+
+ }
+ }
+
+ private void func_6360_i(World var1, int var2, int var3, int var4) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ public int quantityDropped(Random var1) {
+ return var1.nextInt(20) == 0 ? 1 : 0;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.sapling.blockID;
+ }
+
+ public boolean isOpaqueCube() {
+ return !this.graphicsLevel;
+ }
+
+ public void setGraphicsLevel(boolean var1) {
+ this.graphicsLevel = var1;
+ this.blockIndexInTexture = this.baseIndexInPNG + (var1 ? 0 : 1);
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ super.onEntityWalking(var1, var2, var3, var4, var5);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockLeavesBase.java b/src/main/java/net/minecraft/src/BlockLeavesBase.java
new file mode 100644
index 0000000..c719d88
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockLeavesBase.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class BlockLeavesBase extends Block {
+ protected boolean graphicsLevel;
+
+ protected BlockLeavesBase(int var1, int var2, Material var3, boolean var4) {
+ super(var1, var2, var3);
+ this.graphicsLevel = var4;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockId(var2, var3, var4);
+ return !this.graphicsLevel && var6 == this.blockID ? false : super.shouldSideBeRendered(var1, var2, var3, var4, var5);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockLever.java b/src/main/java/net/minecraft/src/BlockLever.java
new file mode 100644
index 0000000..ed23dbc
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockLever.java
@@ -0,0 +1,200 @@
+package net.minecraft.src;
+
+public class BlockLever extends Block {
+ protected BlockLever(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 12;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockOpaqueCube(var2 - 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2 + 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 - 1) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 + 1) ? true : var1.isBlockOpaqueCube(var2, var3 - 1, var4))));
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6 & 8;
+ var6 &= 7;
+ if(var5 == 1 && var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var6 = 5 + var1.rand.nextInt(2);
+ }
+
+ if(var5 == 2 && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var6 = 4;
+ }
+
+ if(var5 == 3 && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var6 = 3;
+ }
+
+ if(var5 == 4 && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var6 = 2;
+ }
+
+ if(var5 == 5 && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var6 = 1;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 + var7);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ } else if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ } else if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ } else if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 4);
+ } else if(var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 5 + var1.rand.nextInt(2));
+ }
+
+ this.checkIfAttachedToBlock(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(this.checkIfAttachedToBlock(var1, var2, var3, var4)) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ boolean var7 = false;
+ if(!var1.isBlockOpaqueCube(var2 - 1, var3, var4) && var6 == 1) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2 + 1, var3, var4) && var6 == 2) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3, var4 - 1) && var6 == 3) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3, var4 + 1) && var6 == 4) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && var6 == 5) {
+ var7 = true;
+ }
+
+ if(var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ }
+
+ private boolean checkIfAttachedToBlock(World var1, int var2, int var3, int var4) {
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ float var6 = 3.0F / 16.0F;
+ if(var5 == 1) {
+ this.setBlockBounds(0.0F, 0.2F, 0.5F - var6, var6 * 2.0F, 0.8F, 0.5F + var6);
+ } else if(var5 == 2) {
+ this.setBlockBounds(1.0F - var6 * 2.0F, 0.2F, 0.5F - var6, 1.0F, 0.8F, 0.5F + var6);
+ } else if(var5 == 3) {
+ this.setBlockBounds(0.5F - var6, 0.2F, 0.0F, 0.5F + var6, 0.8F, var6 * 2.0F);
+ } else if(var5 == 4) {
+ this.setBlockBounds(0.5F - var6, 0.2F, 1.0F - var6 * 2.0F, 0.5F + var6, 0.8F, 1.0F);
+ } else {
+ var6 = 0.25F;
+ this.setBlockBounds(0.5F - var6, 0.0F, 0.5F - var6, 0.5F + var6, 0.6F, 0.5F + var6);
+ }
+
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ //if(var1.multiplayerWorld) {
+ //return true;
+ //} else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ int var7 = var6 & 7;
+ int var8 = 8 - (var6 & 8);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + var8);
+ var1.func_701_b(var2, var3, var4, var2, var3, var4);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "random.click", 0.3F, var8 > 0 ? 0.6F : 0.5F);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ if(var7 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var7 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var7 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var7 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+
+ return true;
+ //}
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if((var5 & 8) > 0) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ int var6 = var5 & 7;
+ if(var6 == 1) {
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ } else if(var6 == 2) {
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ } else if(var6 == 3) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ } else if(var6 == 4) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ } else {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return (var1.getBlockMetadata(var2, var3, var4) & 8) > 0;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if((var6 & 8) == 0) {
+ return false;
+ } else {
+ int var7 = var6 & 7;
+ return var7 == 5 && var5 == 1 ? true : (var7 == 4 && var5 == 2 ? true : (var7 == 3 && var5 == 3 ? true : (var7 == 2 && var5 == 4 ? true : var7 == 1 && var5 == 5)));
+ }
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockLightStone.java b/src/main/java/net/minecraft/src/BlockLightStone.java
new file mode 100644
index 0000000..3bd1e61
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockLightStone.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockLightStone extends Block {
+ public BlockLightStone(int var1, int var2, Material var3) {
+ super(var1, var2, var3);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.lightStoneDust.shiftedIndex;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockLog.java b/src/main/java/net/minecraft/src/BlockLog.java
new file mode 100644
index 0000000..357e5a0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockLog.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockLog extends Block {
+ protected BlockLog(int var1) {
+ super(var1, Material.wood);
+ this.blockIndexInTexture = 20;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.wood.blockID;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? 21 : (var1 == 0 ? 21 : 20);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockMinecartTrack.java b/src/main/java/net/minecraft/src/BlockMinecartTrack.java
new file mode 100644
index 0000000..707effb
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockMinecartTrack.java
@@ -0,0 +1,101 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockMinecartTrack extends Block {
+ protected BlockMinecartTrack(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.collisionRayTrace(var1, var2, var3, var4, var5, var6);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if(var5 >= 2 && var5 <= 5) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 10.0F / 16.0F, 1.0F);
+ } else {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F);
+ }
+
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var2 >= 6 ? this.blockIndexInTexture - 16 : this.blockIndexInTexture;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 9;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockOpaqueCube(var2, var3 - 1, var4);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ //if(!var1.multiplayerWorld) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 15);
+ this.func_4031_h(var1, var2, var3, var4);
+ //}
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ //if(!var1.multiplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = false;
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var7 = true;
+ }
+
+ if(var6 == 2 && !var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var7 = true;
+ }
+
+ if(var6 == 3 && !var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var7 = true;
+ }
+
+ if(var6 == 4 && !var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var7 = true;
+ }
+
+ if(var6 == 5 && !var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var7 = true;
+ }
+
+ if(var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else if(var5 > 0 && Block.blocksList[var5].canProvidePower() && MinecartTrackLogic.func_791_a(new MinecartTrackLogic(this, var1, var2, var3, var4)) == 3) {
+ this.func_4031_h(var1, var2, var3, var4);
+ }
+
+ //}
+ }
+
+ private void func_4031_h(World var1, int var2, int var3, int var4) {
+ //if(!var1.multiplayerWorld) {
+ (new MinecartTrackLogic(this, var1, var2, var3, var4)).func_792_a(var1.isBlockIndirectlyGettingPowered(var2, var3, var4));
+ //}
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockMobSpawner.java b/src/main/java/net/minecraft/src/BlockMobSpawner.java
new file mode 100644
index 0000000..909aaa6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockMobSpawner.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockMobSpawner extends BlockContainer {
+ protected BlockMobSpawner(int var1, int var2) {
+ super(var1, var2, Material.rock);
+ }
+
+ protected TileEntity SetBlockEntity() {
+ return new TileEntityMobSpawner();
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return 0;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockMushroom.java b/src/main/java/net/minecraft/src/BlockMushroom.java
new file mode 100644
index 0000000..f129b7b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockMushroom.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class BlockMushroom extends BlockFlower {
+ protected BlockMushroom(int var1, int var2) {
+ super(var1, var2);
+ float var3 = 0.2F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3);
+ }
+
+ protected boolean canThisPlantGrowOnThisBlockID(int var1) {
+ return Block.opaqueCubeLookup[var1];
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return var1.getBlockLightValue(var2, var3, var4) <= 13 && this.canThisPlantGrowOnThisBlockID(var1.getBlockId(var2, var3 - 1, var4));
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockObsidian.java b/src/main/java/net/minecraft/src/BlockObsidian.java
new file mode 100644
index 0000000..c75b227
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockObsidian.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockObsidian extends BlockStone {
+ public BlockObsidian(int var1, int var2) {
+ super(var1, var2);
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.obsidian.blockID;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockOre.java b/src/main/java/net/minecraft/src/BlockOre.java
new file mode 100644
index 0000000..a66fd91
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockOre.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockOre extends Block {
+ public BlockOre(int var1, int var2) {
+ super(var1, var2, Material.rock);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return this.blockID == Block.oreCoal.blockID ? Item.coal.shiftedIndex : (this.blockID == Block.oreDiamond.blockID ? Item.diamond.shiftedIndex : this.blockID);
+ }
+
+ public int quantityDropped(Random var1) {
+ return 1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockOreBlock.java b/src/main/java/net/minecraft/src/BlockOreBlock.java
new file mode 100644
index 0000000..cf05675
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockOreBlock.java
@@ -0,0 +1,12 @@
+package net.minecraft.src;
+
+public class BlockOreBlock extends Block {
+ public BlockOreBlock(int var1, int var2) {
+ super(var1, Material.iron);
+ this.blockIndexInTexture = var2;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.blockIndexInTexture - 16;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockPortal.java b/src/main/java/net/minecraft/src/BlockPortal.java
new file mode 100644
index 0000000..e84d1b6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockPortal.java
@@ -0,0 +1,167 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockPortal extends BlockBreakable {
+ public BlockPortal(int var1, int var2) {
+ super(var1, var2, Material.field_4260_x, false);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ float var5;
+ float var6;
+ if(var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID) {
+ var5 = 2.0F / 16.0F;
+ var6 = 0.5F;
+ this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6);
+ } else {
+ var5 = 0.5F;
+ var6 = 2.0F / 16.0F;
+ this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6);
+ }
+
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public boolean tryToCreatePortal(World var1, int var2, int var3, int var4) {
+ byte var5 = 0;
+ byte var6 = 0;
+ if(var1.getBlockId(var2 - 1, var3, var4) == Block.obsidian.blockID || var1.getBlockId(var2 + 1, var3, var4) == Block.obsidian.blockID) {
+ var5 = 1;
+ }
+
+ if(var1.getBlockId(var2, var3, var4 - 1) == Block.obsidian.blockID || var1.getBlockId(var2, var3, var4 + 1) == Block.obsidian.blockID) {
+ var6 = 1;
+ }
+
+ System.out.println(var5 + ", " + var6);
+ if(var5 == var6) {
+ return false;
+ } else {
+ if(var1.getBlockId(var2 - var5, var3, var4 - var6) == 0) {
+ var2 -= var5;
+ var4 -= var6;
+ }
+
+ int var7;
+ int var8;
+ for(var7 = -1; var7 <= 2; ++var7) {
+ for(var8 = -1; var8 <= 3; ++var8) {
+ boolean var9 = var7 == -1 || var7 == 2 || var8 == -1 || var8 == 3;
+ if(var7 != -1 && var7 != 2 || var8 != -1 && var8 != 3) {
+ int var10 = var1.getBlockId(var2 + var5 * var7, var3 + var8, var4 + var6 * var7);
+ if(var9) {
+ if(var10 != Block.obsidian.blockID) {
+ return false;
+ }
+ } else if(var10 != 0 && var10 != Block.fire.blockID) {
+ return false;
+ }
+ }
+ }
+ }
+
+ var1.field_1043_h = true;
+
+ for(var7 = 0; var7 < 2; ++var7) {
+ for(var8 = 0; var8 < 3; ++var8) {
+ var1.setBlockWithNotify(var2 + var5 * var7, var3 + var8, var4 + var6 * var7, Block.portal.blockID);
+ }
+ }
+
+ var1.field_1043_h = false;
+ return true;
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ byte var6 = 0;
+ byte var7 = 1;
+ if(var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID) {
+ var6 = 1;
+ var7 = 0;
+ }
+
+ int var8;
+ for(var8 = var3; var1.getBlockId(var2, var8 - 1, var4) == this.blockID; --var8) {
+ }
+
+ if(var1.getBlockId(var2, var8 - 1, var4) != Block.obsidian.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ int var9;
+ for(var9 = 1; var9 < 4 && var1.getBlockId(var2, var8 + var9, var4) == this.blockID; ++var9) {
+ }
+
+ if(var9 == 3 && var1.getBlockId(var2, var8 + var9, var4) == Block.obsidian.blockID) {
+ boolean var10 = var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID;
+ boolean var11 = var1.getBlockId(var2, var3, var4 - 1) == this.blockID || var1.getBlockId(var2, var3, var4 + 1) == this.blockID;
+ if(var10 && var11) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else if((var1.getBlockId(var2 + var6, var3, var4 + var7) != Block.obsidian.blockID || var1.getBlockId(var2 - var6, var3, var4 - var7) != this.blockID) && (var1.getBlockId(var2 - var6, var3, var4 - var7) != Block.obsidian.blockID || var1.getBlockId(var2 + var6, var3, var4 + var7) != this.blockID)) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ } else {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return true;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public int func_234_g() {
+ return 1;
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ //if(!var1.multiplayerWorld) {
+ var5.func_4039_q();
+ //}
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var5.nextInt(100) == 0) {
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "portal.portal", 1.0F, var5.nextFloat() * 0.4F + 0.8F);
+ }
+
+ for(int var6 = 0; var6 < 4; ++var6) {
+ double var7 = (double)((float)var2 + var5.nextFloat());
+ double var9 = (double)((float)var3 + var5.nextFloat());
+ double var11 = (double)((float)var4 + var5.nextFloat());
+ double var13 = 0.0D;
+ double var15 = 0.0D;
+ double var17 = 0.0D;
+ int var19 = var5.nextInt(2) * 2 - 1;
+ var13 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
+ var15 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
+ var17 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
+ if(var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID) {
+ var7 = (double)var2 + 0.5D + 0.25D * (double)var19;
+ var13 = (double)(var5.nextFloat() * 2.0F * (float)var19);
+ } else {
+ var11 = (double)var4 + 0.5D + 0.25D * (double)var19;
+ var17 = (double)(var5.nextFloat() * 2.0F * (float)var19);
+ }
+
+ var1.spawnParticle("portal", var7, var9, var11, var13, var15, var17);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockPressurePlate.java b/src/main/java/net/minecraft/src/BlockPressurePlate.java
new file mode 100644
index 0000000..583e62f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockPressurePlate.java
@@ -0,0 +1,151 @@
+package net.minecraft.src;
+
+import java.util.List;
+import java.util.Random;
+
+public class BlockPressurePlate extends Block {
+ private EnumMobType triggerMobType;
+
+ protected BlockPressurePlate(int var1, int var2, EnumMobType var3) {
+ super(var1, var2, Material.rock);
+ this.triggerMobType = var3;
+ this.setTickOnLoad(true);
+ float var4 = 1.0F / 16.0F;
+ this.setBlockBounds(var4, 0.0F, var4, 1.0F - var4, 0.03125F, 1.0F - var4);
+ }
+
+ public int tickRate() {
+ return 20;
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockOpaqueCube(var2, var3 - 1, var4);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ boolean var6 = false;
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var6 = true;
+ }
+
+ if(var6) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ //if(!var1.multiplayerWorld) {
+ if(var1.getBlockMetadata(var2, var3, var4) != 0) {
+ this.setStateIfMobInteractsWithPlate(var1, var2, var3, var4);
+ }
+ //}
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ //if(!var1.multiplayerWorld) {
+ if(var1.getBlockMetadata(var2, var3, var4) != 1) {
+ this.setStateIfMobInteractsWithPlate(var1, var2, var3, var4);
+ }
+ //}
+ }
+
+ private void setStateIfMobInteractsWithPlate(World var1, int var2, int var3, int var4) {
+ boolean var5 = var1.getBlockMetadata(var2, var3, var4) == 1;
+ boolean var6 = false;
+ float var7 = 2.0F / 16.0F;
+ List var8 = null;
+ if(this.triggerMobType == EnumMobType.everything) {
+ var8 = var1.getEntitiesWithinAABBExcludingEntity((Entity)null, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7)));
+ }
+
+ if(this.triggerMobType == EnumMobType.mobs) {
+ var8 = var1.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7)));
+ }
+
+ if(this.triggerMobType == EnumMobType.players) {
+ var8 = var1.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBoxFromPool((double)((float)var2 + var7), (double)var3, (double)((float)var4 + var7), (double)((float)(var2 + 1) - var7), (double)var3 + 0.25D, (double)((float)(var4 + 1) - var7)));
+ }
+
+ if(var8.size() > 0) {
+ var6 = true;
+ }
+
+ if(var6 && !var5) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.func_701_b(var2, var3, var4, var2, var3, var4);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.1D, (double)var4 + 0.5D, "random.click", 0.3F, 0.6F);
+ }
+
+ if(!var6 && var5) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.func_701_b(var2, var3, var4, var2, var3, var4);
+ var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.1D, (double)var4 + 0.5D, "random.click", 0.3F, 0.5F);
+ }
+
+ if(var6) {
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ }
+
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ if(var5 > 0) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ }
+
+ super.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ boolean var5 = var1.getBlockMetadata(var2, var3, var4) == 1;
+ float var6 = 1.0F / 16.0F;
+ if(var5) {
+ this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 0.03125F, 1.0F - var6);
+ } else {
+ this.setBlockBounds(var6, 0.0F, var6, 1.0F - var6, 1.0F / 16.0F, 1.0F - var6);
+ }
+
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return var1.getBlockMetadata(var2, var3, var4) > 0;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return var1.getBlockMetadata(var2, var3, var4) == 0 ? false : var5 == 1;
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+
+ public void func_237_e() {
+ float var1 = 0.5F;
+ float var2 = 2.0F / 16.0F;
+ float var3 = 0.5F;
+ this.setBlockBounds(0.5F - var1, 0.5F - var2, 0.5F - var3, 0.5F + var1, 0.5F + var2, 0.5F + var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockPumpkin.java b/src/main/java/net/minecraft/src/BlockPumpkin.java
new file mode 100644
index 0000000..c2557f3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockPumpkin.java
@@ -0,0 +1,45 @@
+package net.minecraft.src;
+
+public class BlockPumpkin extends Block {
+ private boolean field_4072_a;
+
+ protected BlockPumpkin(int var1, int var2, boolean var3) {
+ super(var1, Material.pumpkin);
+ this.blockIndexInTexture = var2;
+ this.setTickOnLoad(true);
+ this.field_4072_a = var3;
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ if(var1 == 1) {
+ return this.blockIndexInTexture;
+ } else if(var1 == 0) {
+ return this.blockIndexInTexture;
+ } else {
+ int var3 = this.blockIndexInTexture + 1 + 16;
+ if(this.field_4072_a) {
+ ++var3;
+ }
+
+ return var2 == 0 && var1 == 2 ? var3 : (var2 == 1 && var1 == 5 ? var3 : (var2 == 2 && var1 == 3 ? var3 : (var2 == 3 && var1 == 4 ? var3 : this.blockIndexInTexture + 16)));
+ }
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture : (var1 == 0 ? this.blockIndexInTexture : (var1 == 3 ? this.blockIndexInTexture + 1 + 16 : this.blockIndexInTexture + 16));
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3, var4);
+ return (var5 == 0 || Block.blocksList[var5].blockMaterial.getIsLiquid()) && var1.isBlockOpaqueCube(var2, var3 - 1, var4);
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockRedstoneOre.java b/src/main/java/net/minecraft/src/BlockRedstoneOre.java
new file mode 100644
index 0000000..a37f8f7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockRedstoneOre.java
@@ -0,0 +1,104 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockRedstoneOre extends Block {
+ private boolean field_468_a;
+
+ public BlockRedstoneOre(int var1, int var2, boolean var3) {
+ super(var1, var2, Material.rock);
+ if(var3) {
+ this.setTickOnLoad(true);
+ }
+
+ this.field_468_a = var3;
+ }
+
+ public int tickRate() {
+ return 30;
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.func_320_h(var1, var2, var3, var4);
+ super.onBlockClicked(var1, var2, var3, var4, var5);
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ this.func_320_h(var1, var2, var3, var4);
+ super.onEntityWalking(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.func_320_h(var1, var2, var3, var4);
+ return super.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ private void func_320_h(World var1, int var2, int var3, int var4) {
+ this.func_319_i(var1, var2, var3, var4);
+ if(this.blockID == Block.oreRedstone.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.oreRedstoneGlowing.blockID);
+ }
+
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this.blockID == Block.oreRedstoneGlowing.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.oreRedstone.blockID);
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.redstone.shiftedIndex;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 4 + var1.nextInt(2);
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this.field_468_a) {
+ this.func_319_i(var1, var2, var3, var4);
+ }
+
+ }
+
+ private void func_319_i(World var1, int var2, int var3, int var4) {
+ Random var5 = var1.rand;
+ double var6 = 1.0D / 16.0D;
+
+ for(int var8 = 0; var8 < 6; ++var8) {
+ double var9 = (double)((float)var2 + var5.nextFloat());
+ double var11 = (double)((float)var3 + var5.nextFloat());
+ double var13 = (double)((float)var4 + var5.nextFloat());
+ if(var8 == 0 && !var1.isBlockOpaqueCube(var2, var3 + 1, var4)) {
+ var11 = (double)(var3 + 1) + var6;
+ }
+
+ if(var8 == 1 && !var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var11 = (double)(var3 + 0) - var6;
+ }
+
+ if(var8 == 2 && !var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var13 = (double)(var4 + 1) + var6;
+ }
+
+ if(var8 == 3 && !var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var13 = (double)(var4 + 0) - var6;
+ }
+
+ if(var8 == 4 && !var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var9 = (double)(var2 + 1) + var6;
+ }
+
+ if(var8 == 5 && !var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var9 = (double)(var2 + 0) - var6;
+ }
+
+ if(var9 < (double)var2 || var9 > (double)(var2 + 1) || var11 < 0.0D || var11 > (double)(var3 + 1) || var13 < (double)var4 || var13 > (double)(var4 + 1)) {
+ var1.spawnParticle("reddust", var9, var11, var13, 0.0D, 0.0D, 0.0D);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockRedstoneTorch.java b/src/main/java/net/minecraft/src/BlockRedstoneTorch.java
new file mode 100644
index 0000000..8c120f3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockRedstoneTorch.java
@@ -0,0 +1,153 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class BlockRedstoneTorch extends BlockTorch {
+ private boolean torchActive = false;
+ private static List torchUpdates = new ArrayList();
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var1 == 1 ? Block.redstoneWire.getBlockTextureFromSideAndMetadata(var1, var2) : super.getBlockTextureFromSideAndMetadata(var1, var2);
+ }
+
+ private boolean checkForBurnout(World var1, int var2, int var3, int var4, boolean var5) {
+ if(var5) {
+ torchUpdates.add(new RedstoneUpdateInfo(var2, var3, var4, var1.worldTime));
+ }
+
+ int var6 = 0;
+
+ for(int var7 = 0; var7 < torchUpdates.size(); ++var7) {
+ RedstoneUpdateInfo var8 = (RedstoneUpdateInfo)torchUpdates.get(var7);
+ if(var8.x == var2 && var8.y == var3 && var8.z == var4) {
+ ++var6;
+ if(var6 >= 8) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ protected BlockRedstoneTorch(int var1, int var2, boolean var3) {
+ super(var1, var2);
+ this.torchActive = var3;
+ this.setTickOnLoad(true);
+ }
+
+ public int tickRate() {
+ return 2;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockMetadata(var2, var3, var4) == 0) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ if(this.torchActive) {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ }
+
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ if(this.torchActive) {
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ }
+
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(!this.torchActive) {
+ return false;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ return var6 == 5 && var5 == 1 ? false : (var6 == 3 && var5 == 3 ? false : (var6 == 4 && var5 == 2 ? false : (var6 == 1 && var5 == 5 ? false : var6 != 2 || var5 != 4)));
+ }
+ }
+
+ private boolean func_15232_h(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ return var5 == 5 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3 - 1, var4, 0) ? true : (var5 == 3 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 - 1, 2) ? true : (var5 == 4 && var1.isBlockIndirectlyProvidingPowerTo(var2, var3, var4 + 1, 3) ? true : (var5 == 1 && var1.isBlockIndirectlyProvidingPowerTo(var2 - 1, var3, var4, 4) ? true : var5 == 2 && var1.isBlockIndirectlyProvidingPowerTo(var2 + 1, var3, var4, 5))));
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ boolean var6 = this.func_15232_h(var1, var2, var3, var4);
+
+ while(torchUpdates.size() > 0 && var1.worldTime - ((RedstoneUpdateInfo)torchUpdates.get(0)).updateTime > 100L) {
+ torchUpdates.remove(0);
+ }
+
+ if(this.torchActive) {
+ if(var6) {
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, Block.torchRedstoneIdle.blockID, var1.getBlockMetadata(var2, var3, var4));
+ if(this.checkForBurnout(var1, var2, var3, var4, true)) {
+ var1.playSoundEffect((double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), "random.fizz", 0.5F, 2.6F + (var1.rand.nextFloat() - var1.rand.nextFloat()) * 0.8F);
+
+ for(int var7 = 0; var7 < 5; ++var7) {
+ double var8 = (double)var2 + var5.nextDouble() * 0.6D + 0.2D;
+ double var10 = (double)var3 + var5.nextDouble() * 0.6D + 0.2D;
+ double var12 = (double)var4 + var5.nextDouble() * 0.6D + 0.2D;
+ var1.spawnParticle("smoke", var8, var10, var12, 0.0D, 0.0D, 0.0D);
+ }
+ }
+ }
+ } else if(!var6 && !this.checkForBurnout(var1, var2, var3, var4, false)) {
+ var1.setBlockAndMetadataWithNotify(var2, var3, var4, Block.torchRedstoneActive.blockID, var1.getBlockMetadata(var2, var3, var4));
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return var5 == 0 ? this.isPoweringTo(var1, var2, var3, var4, var5) : false;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.torchRedstoneActive.blockID;
+ }
+
+ public boolean canProvidePower() {
+ return true;
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this.torchActive) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ double var7 = (double)((float)var2 + 0.5F) + (double)(var5.nextFloat() - 0.5F) * 0.2D;
+ double var9 = (double)((float)var3 + 0.7F) + (double)(var5.nextFloat() - 0.5F) * 0.2D;
+ double var11 = (double)((float)var4 + 0.5F) + (double)(var5.nextFloat() - 0.5F) * 0.2D;
+ double var13 = (double)0.22F;
+ double var15 = (double)0.27F;
+ if(var6 == 1) {
+ var1.spawnParticle("reddust", var7 - var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 2) {
+ var1.spawnParticle("reddust", var7 + var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 3) {
+ var1.spawnParticle("reddust", var7, var9 + var13, var11 - var15, 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 4) {
+ var1.spawnParticle("reddust", var7, var9 + var13, var11 + var15, 0.0D, 0.0D, 0.0D);
+ } else {
+ var1.spawnParticle("reddust", var7, var9, var11, 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockRedstoneWire.java b/src/main/java/net/minecraft/src/BlockRedstoneWire.java
new file mode 100644
index 0000000..56d7da7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockRedstoneWire.java
@@ -0,0 +1,308 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockRedstoneWire extends Block {
+ private boolean wiresProvidePower = true;
+
+ public BlockRedstoneWire(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F / 16.0F, 1.0F);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return this.blockIndexInTexture + (var2 > 0 ? 16 : 0);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 5;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockOpaqueCube(var2, var3 - 1, var4);
+ }
+
+ private void updateAndPropagateCurrentStrength(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ int var6 = 0;
+ this.wiresProvidePower = false;
+ boolean var7 = var1.isBlockIndirectlyGettingPowered(var2, var3, var4);
+ this.wiresProvidePower = true;
+ int var8;
+ int var9;
+ int var10;
+ if(var7) {
+ var6 = 15;
+ } else {
+ for(var8 = 0; var8 < 4; ++var8) {
+ var9 = var2;
+ var10 = var4;
+ if(var8 == 0) {
+ var9 = var2 - 1;
+ }
+
+ if(var8 == 1) {
+ ++var9;
+ }
+
+ if(var8 == 2) {
+ var10 = var4 - 1;
+ }
+
+ if(var8 == 3) {
+ ++var10;
+ }
+
+ var6 = this.getMaxCurrentStrength(var1, var9, var3, var10, var6);
+ if(var1.isBlockOpaqueCube(var9, var3, var10) && !var1.isBlockOpaqueCube(var2, var3 + 1, var4)) {
+ var6 = this.getMaxCurrentStrength(var1, var9, var3 + 1, var10, var6);
+ } else if(!var1.isBlockOpaqueCube(var9, var3, var10)) {
+ var6 = this.getMaxCurrentStrength(var1, var9, var3 - 1, var10, var6);
+ }
+ }
+
+ if(var6 > 0) {
+ --var6;
+ } else {
+ var6 = 0;
+ }
+ }
+
+ if(var5 != var6) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ var1.func_701_b(var2, var3, var4, var2, var3, var4);
+ if(var6 > 0) {
+ --var6;
+ }
+
+ for(var8 = 0; var8 < 4; ++var8) {
+ var9 = var2;
+ var10 = var4;
+ int var11 = var3 - 1;
+ if(var8 == 0) {
+ var9 = var2 - 1;
+ }
+
+ if(var8 == 1) {
+ ++var9;
+ }
+
+ if(var8 == 2) {
+ var10 = var4 - 1;
+ }
+
+ if(var8 == 3) {
+ ++var10;
+ }
+
+ if(var1.isBlockOpaqueCube(var9, var3, var10)) {
+ var11 += 2;
+ }
+
+ int var12 = this.getMaxCurrentStrength(var1, var9, var3, var10, -1);
+ if(var12 >= 0 && var12 != var6) {
+ this.updateAndPropagateCurrentStrength(var1, var9, var3, var10);
+ }
+
+ var12 = this.getMaxCurrentStrength(var1, var9, var11, var10, -1);
+ if(var12 >= 0 && var12 != var6) {
+ this.updateAndPropagateCurrentStrength(var1, var9, var11, var10);
+ }
+ }
+
+ if(var5 == 0 || var6 == 0) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ }
+ }
+
+ }
+
+ private void notifyWireNeighborsOfNeighborChange(World var1, int var2, int var3, int var4) {
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 - 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2 + 1, var3, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 - 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3, var4 + 1, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ }
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ //if(!var1.multiplayerWorld) {
+ this.updateAndPropagateCurrentStrength(var1, var2, var3, var4);
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 - 1);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 + 1);
+ if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 + 1, var4);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 - 1, var4);
+ }
+
+ if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 + 1, var4);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 - 1, var4);
+ }
+
+ if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 - 1);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 - 1);
+ }
+
+ if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 + 1);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 + 1);
+ }
+
+ //}
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ super.onBlockRemoval(var1, var2, var3, var4);
+ //if(!var1.multiplayerWorld) {
+ var1.notifyBlocksOfNeighborChange(var2, var3 + 1, var4, this.blockID);
+ var1.notifyBlocksOfNeighborChange(var2, var3 - 1, var4, this.blockID);
+ this.updateAndPropagateCurrentStrength(var1, var2, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3, var4);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 - 1);
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3, var4 + 1);
+ if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 + 1, var4);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 - 1, var3 - 1, var4);
+ }
+
+ if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 + 1, var4);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2 + 1, var3 - 1, var4);
+ }
+
+ if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 - 1);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 - 1);
+ }
+
+ if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 + 1, var4 + 1);
+ } else {
+ this.notifyWireNeighborsOfNeighborChange(var1, var2, var3 - 1, var4 + 1);
+ }
+
+ //}
+ }
+
+ private int getMaxCurrentStrength(World var1, int var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var2, var3, var4) != this.blockID) {
+ return var5;
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ return var6 > var5 ? var6 : var5;
+ }
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ //if(!var1.multiplayerWorld) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = this.canPlaceBlockAt(var1, var2, var3, var4);
+ if(!var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var6);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ } else {
+ this.updateAndPropagateCurrentStrength(var1, var2, var3, var4);
+ }
+
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ //}
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.redstone.shiftedIndex;
+ }
+
+ public boolean isIndirectlyPoweringTo(World var1, int var2, int var3, int var4, int var5) {
+ return !this.wiresProvidePower ? false : this.isPoweringTo(var1, var2, var3, var4, var5);
+ }
+
+ public boolean isPoweringTo(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(!this.wiresProvidePower) {
+ return false;
+ } else if(var1.getBlockMetadata(var2, var3, var4) == 0) {
+ return false;
+ } else if(var5 == 1) {
+ return true;
+ } else {
+ boolean var6 = isPowerProviderOrWire(var1, var2 - 1, var3, var4) || !var1.isBlockOpaqueCube(var2 - 1, var3, var4) && isPowerProviderOrWire(var1, var2 - 1, var3 - 1, var4);
+ boolean var7 = isPowerProviderOrWire(var1, var2 + 1, var3, var4) || !var1.isBlockOpaqueCube(var2 + 1, var3, var4) && isPowerProviderOrWire(var1, var2 + 1, var3 - 1, var4);
+ boolean var8 = isPowerProviderOrWire(var1, var2, var3, var4 - 1) || !var1.isBlockOpaqueCube(var2, var3, var4 - 1) && isPowerProviderOrWire(var1, var2, var3 - 1, var4 - 1);
+ boolean var9 = isPowerProviderOrWire(var1, var2, var3, var4 + 1) || !var1.isBlockOpaqueCube(var2, var3, var4 + 1) && isPowerProviderOrWire(var1, var2, var3 - 1, var4 + 1);
+ if(!var1.isBlockOpaqueCube(var2, var3 + 1, var4)) {
+ if(var1.isBlockOpaqueCube(var2 - 1, var3, var4) && isPowerProviderOrWire(var1, var2 - 1, var3 + 1, var4)) {
+ var6 = true;
+ }
+
+ if(var1.isBlockOpaqueCube(var2 + 1, var3, var4) && isPowerProviderOrWire(var1, var2 + 1, var3 + 1, var4)) {
+ var7 = true;
+ }
+
+ if(var1.isBlockOpaqueCube(var2, var3, var4 - 1) && isPowerProviderOrWire(var1, var2, var3 + 1, var4 - 1)) {
+ var8 = true;
+ }
+
+ if(var1.isBlockOpaqueCube(var2, var3, var4 + 1) && isPowerProviderOrWire(var1, var2, var3 + 1, var4 + 1)) {
+ var9 = true;
+ }
+ }
+
+ return !var8 && !var7 && !var6 && !var9 && var5 >= 2 && var5 <= 5 ? true : (var5 == 2 && var8 && !var6 && !var7 ? true : (var5 == 3 && var9 && !var6 && !var7 ? true : (var5 == 4 && var6 && !var8 && !var9 ? true : var5 == 5 && var7 && !var8 && !var9)));
+ }
+ }
+
+ public boolean canProvidePower() {
+ return this.wiresProvidePower;
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getBlockMetadata(var2, var3, var4) > 0) {
+ double var6 = (double)var2 + 0.5D + ((double)var5.nextFloat() - 0.5D) * 0.2D;
+ double var8 = (double)((float)var3 + 1.0F / 16.0F);
+ double var10 = (double)var4 + 0.5D + ((double)var5.nextFloat() - 0.5D) * 0.2D;
+ var1.spawnParticle("reddust", var6, var8, var10, 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+
+ public static boolean isPowerProviderOrWire(IBlockAccess var0, int var1, int var2, int var3) {
+ int var4 = var0.getBlockId(var1, var2, var3);
+ return var4 == Block.redstoneWire.blockID ? true : (var4 == 0 ? false : Block.blocksList[var4].canProvidePower());
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockReed.java b/src/main/java/net/minecraft/src/BlockReed.java
new file mode 100644
index 0000000..faec2cf
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockReed.java
@@ -0,0 +1,73 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockReed extends Block {
+ protected BlockReed(int var1, int var2) {
+ super(var1, Material.plants);
+ this.blockIndexInTexture = var2;
+ float var3 = 6.0F / 16.0F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 1.0F, 0.5F + var3);
+ this.setTickOnLoad(true);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getBlockId(var2, var3 + 1, var4) == 0) {
+ int var6;
+ for(var6 = 1; var1.getBlockId(var2, var3 - var6, var4) == this.blockID; ++var6) {
+ }
+
+ if(var6 < 3) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 == 15) {
+ var1.setBlockWithNotify(var2, var3 + 1, var4, this.blockID);
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ } else {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var7 + 1);
+ }
+ }
+ }
+
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3 - 1, var4);
+ return var5 == this.blockID ? true : (var5 != Block.grass.blockID && var5 != Block.dirt.blockID ? false : (var1.getBlockMaterial(var2 - 1, var3 - 1, var4) == Material.water ? true : (var1.getBlockMaterial(var2 + 1, var3 - 1, var4) == Material.water ? true : (var1.getBlockMaterial(var2, var3 - 1, var4 - 1) == Material.water ? true : var1.getBlockMaterial(var2, var3 - 1, var4 + 1) == Material.water))));
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ this.checkBlockCoordValid(var1, var2, var3, var4);
+ }
+
+ protected final void checkBlockCoordValid(World var1, int var2, int var3, int var4) {
+ if(!this.canBlockStay(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public boolean canBlockStay(World var1, int var2, int var3, int var4) {
+ return this.canPlaceBlockAt(var1, var2, var3, var4);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.reed.shiftedIndex;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockSand.java b/src/main/java/net/minecraft/src/BlockSand.java
new file mode 100644
index 0000000..753f010
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockSand.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSand extends Block {
+ public static boolean fallInstantly = false;
+
+ public BlockSand(int var1, int var2) {
+ super(var1, var2, Material.sand);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ this.tryToFall(var1, var2, var3, var4);
+ }
+
+ private void tryToFall(World var1, int var2, int var3, int var4) {
+ if(canFallBelow(var1, var2, var3 - 1, var4) && var3 >= 0) {
+ EntityFallingSand var8 = new EntityFallingSand(var1, (float)var2 + 0.5F, (float)var3 + 0.5F, (float)var4 + 0.5F, this.blockID);
+ if(fallInstantly) {
+ while(!var8.isDead) {
+ var8.onUpdate();
+ }
+ } else {
+ var1.entityJoinedWorld(var8);
+ }
+ }
+
+ }
+
+ public int tickRate() {
+ return 3;
+ }
+
+ public static boolean canFallBelow(World var0, int var1, int var2, int var3) {
+ int var4 = var0.getBlockId(var1, var2, var3);
+ if(var4 == 0) {
+ return true;
+ } else if(var4 == Block.fire.blockID) {
+ return true;
+ } else {
+ Material var5 = Block.blocksList[var4].blockMaterial;
+ return var5 == Material.water ? true : var5 == Material.lava;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockSapling.java b/src/main/java/net/minecraft/src/BlockSapling.java
new file mode 100644
index 0000000..41458e0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockSapling.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSapling extends BlockFlower {
+ protected BlockSapling(int var1, int var2) {
+ super(var1, var2);
+ float var3 = 0.4F;
+ this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, var3 * 2.0F, 0.5F + var3);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ super.updateTick(var1, var2, var3, var4, var5);
+ if(var1.getBlockLightValue(var2, var3 + 1, var4) >= 9 && var5.nextInt(5) == 0) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 < 15) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 + 1);
+ } else {
+ var1.setBlock(var2, var3, var4, 0);
+ Object var7 = new WorldGenTrees();
+ if(var5.nextInt(10) == 0) {
+ var7 = new WorldGenBigTree();
+ }
+
+ if(!((WorldGenerator)var7).generate(var1, var5, var2, var3, var4)) {
+ var1.setBlock(var2, var3, var4, this.blockID);
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockSign.java b/src/main/java/net/minecraft/src/BlockSign.java
new file mode 100644
index 0000000..e8297dc
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockSign.java
@@ -0,0 +1,113 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSign extends BlockContainer {
+ private Class signEntityClass;
+ private boolean isFreestanding;
+
+ protected BlockSign(int var1, Class var2, boolean var3) {
+ super(var1, Material.wood);
+ this.isFreestanding = var3;
+ this.blockIndexInTexture = 4;
+ this.signEntityClass = var2;
+ float var4 = 0.25F;
+ float var5 = 1.0F;
+ this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var5, 0.5F + var4);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ this.setBlockBoundsBasedOnState(var1, var2, var3, var4);
+ return super.getSelectedBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ if(!this.isFreestanding) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ float var6 = 9.0F / 32.0F;
+ float var7 = 25.0F / 32.0F;
+ float var8 = 0.0F;
+ float var9 = 1.0F;
+ float var10 = 2.0F / 16.0F;
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ if(var5 == 2) {
+ this.setBlockBounds(var8, var6, 1.0F - var10, var9, var7, 1.0F);
+ }
+
+ if(var5 == 3) {
+ this.setBlockBounds(var8, var6, 0.0F, var9, var7, var10);
+ }
+
+ if(var5 == 4) {
+ this.setBlockBounds(1.0F - var10, var6, var8, 1.0F, var7, var9);
+ }
+
+ if(var5 == 5) {
+ this.setBlockBounds(0.0F, var6, var8, var10, var7, var9);
+ }
+
+ }
+ }
+
+ public int getRenderType() {
+ return -1;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ protected TileEntity SetBlockEntity() {
+ try {
+ return (TileEntity)this.signEntityClass.newInstance();
+ } catch (Exception var2) {
+ throw new RuntimeException(var2);
+ }
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.sign.shiftedIndex;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ boolean var6 = false;
+ if(this.isFreestanding) {
+ if(!var1.getBlockMaterial(var2, var3 - 1, var4).func_878_a()) {
+ var6 = true;
+ }
+ } else {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ var6 = true;
+ if(var7 == 2 && var1.getBlockMaterial(var2, var3, var4 + 1).func_878_a()) {
+ var6 = false;
+ }
+
+ if(var7 == 3 && var1.getBlockMaterial(var2, var3, var4 - 1).func_878_a()) {
+ var6 = false;
+ }
+
+ if(var7 == 4 && var1.getBlockMaterial(var2 + 1, var3, var4).func_878_a()) {
+ var6 = false;
+ }
+
+ if(var7 == 5 && var1.getBlockMaterial(var2 - 1, var3, var4).func_878_a()) {
+ var6 = false;
+ }
+ }
+
+ if(var6) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockSlowSand.java b/src/main/java/net/minecraft/src/BlockSlowSand.java
new file mode 100644
index 0000000..2db3ad3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockSlowSand.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class BlockSlowSand extends Block {
+ public BlockSlowSand(int var1, int var2) {
+ super(var1, var2, Material.sand);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ float var5 = 2.0F / 16.0F;
+ return AxisAlignedBB.getBoundingBoxFromPool((double)var2, (double)var3, (double)var4, (double)(var2 + 1), (double)((float)(var3 + 1) - var5), (double)(var4 + 1));
+ }
+
+ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) {
+ var5.motionX *= 0.4D;
+ var5.motionZ *= 0.4D;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockSnow.java b/src/main/java/net/minecraft/src/BlockSnow.java
new file mode 100644
index 0000000..5018a3b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockSnow.java
@@ -0,0 +1,75 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSnow extends Block {
+ protected BlockSnow(int var1, int var2) {
+ super(var1, var2, Material.snow);
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 2.0F / 16.0F, 1.0F);
+ this.setTickOnLoad(true);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockId(var2, var3 - 1, var4);
+ return var5 != 0 && Block.blocksList[var5].isOpaqueCube() ? var1.getBlockMaterial(var2, var3 - 1, var4).func_880_c() : false;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ this.func_314_h(var1, var2, var3, var4);
+ }
+
+ private boolean func_314_h(World var1, int var2, int var3, int var4) {
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public void harvestBlock(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = Item.snowball.shiftedIndex;
+ float var7 = 0.7F;
+ double var8 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D;
+ double var10 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D;
+ double var12 = (double)(var1.rand.nextFloat() * var7) + (double)(1.0F - var7) * 0.5D;
+ EntityItem var14 = new EntityItem(var1, (double)var2 + var8, (double)var3 + var10, (double)var4 + var12, new ItemStack(var6));
+ var14.field_805_c = 10;
+ var1.entityJoinedWorld(var14);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.snowball.shiftedIndex;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ Material var6 = var1.getBlockMaterial(var2, var3, var4);
+ return var5 == 1 ? true : (var6 == this.blockMaterial ? false : super.shouldSideBeRendered(var1, var2, var3, var4, var5));
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockSnowBlock.java b/src/main/java/net/minecraft/src/BlockSnowBlock.java
new file mode 100644
index 0000000..0e1275b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockSnowBlock.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSnowBlock extends Block {
+ protected BlockSnowBlock(int var1, int var2) {
+ super(var1, var2, Material.builtSnow);
+ this.setTickOnLoad(true);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Item.snowball.shiftedIndex;
+ }
+
+ public int quantityDropped(Random var1) {
+ return 4;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var1.getSavedLightValue(EnumSkyBlock.Block, var2, var3, var4) > 11) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockSoil.java b/src/main/java/net/minecraft/src/BlockSoil.java
new file mode 100644
index 0000000..71e869e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockSoil.java
@@ -0,0 +1,93 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockSoil extends Block {
+ protected BlockSoil(int var1) {
+ super(var1, Material.ground);
+ this.blockIndexInTexture = 87;
+ this.setTickOnLoad(true);
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 15.0F / 16.0F, 1.0F);
+ this.setLightOpacity(255);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return AxisAlignedBB.getBoundingBoxFromPool((double)(var2 + 0), (double)(var3 + 0), (double)(var4 + 0), (double)(var2 + 1), (double)(var3 + 1), (double)(var4 + 1));
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return var1 == 1 && var2 > 0 ? this.blockIndexInTexture - 1 : (var1 == 1 ? this.blockIndexInTexture : 2);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(var5.nextInt(5) == 0) {
+ if(this.func_274_i(var1, var2, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 7);
+ } else {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var6 > 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6 - 1);
+ } else if(!this.func_275_h(var1, var2, var3, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID);
+ }
+ }
+ }
+
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ if(var1.rand.nextInt(4) == 0) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID);
+ }
+
+ }
+
+ private boolean func_275_h(World var1, int var2, int var3, int var4) {
+ byte var5 = 0;
+
+ for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) {
+ for(int var7 = var4 - var5; var7 <= var4 + var5; ++var7) {
+ if(var1.getBlockId(var6, var3 + 1, var7) == Block.crops.blockID) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private boolean func_274_i(World var1, int var2, int var3, int var4) {
+ for(int var5 = var2 - 4; var5 <= var2 + 4; ++var5) {
+ for(int var6 = var3; var6 <= var3 + 1; ++var6) {
+ for(int var7 = var4 - 4; var7 <= var4 + 4; ++var7) {
+ if(var1.getBlockMaterial(var5, var6, var7) == Material.water) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ Material var6 = var1.getBlockMaterial(var2, var3 + 1, var4);
+ if(var6.func_878_a()) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.dirt.blockID);
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.dirt.idDropped(0, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockSponge.java b/src/main/java/net/minecraft/src/BlockSponge.java
new file mode 100644
index 0000000..d8a441d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockSponge.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+public class BlockSponge extends Block {
+ protected BlockSponge(int var1) {
+ super(var1, Material.sponge);
+ this.blockIndexInTexture = 48;
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ byte var5 = 2;
+
+ for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) {
+ for(int var7 = var3 - var5; var7 <= var3 + var5; ++var7) {
+ for(int var8 = var4 - var5; var8 <= var4 + var5; ++var8) {
+ if(var1.getBlockMaterial(var6, var7, var8) == Material.water) {
+ }
+ }
+ }
+ }
+
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ byte var5 = 2;
+
+ for(int var6 = var2 - var5; var6 <= var2 + var5; ++var6) {
+ for(int var7 = var3 - var5; var7 <= var3 + var5; ++var7) {
+ for(int var8 = var4 - var5; var8 <= var4 + var5; ++var8) {
+ var1.notifyBlocksOfNeighborChange(var6, var7, var8, var1.getBlockId(var6, var7, var8));
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockStairs.java b/src/main/java/net/minecraft/src/BlockStairs.java
new file mode 100644
index 0000000..05e2709
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockStairs.java
@@ -0,0 +1,188 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+public class BlockStairs extends Block {
+ private Block modelBlock;
+
+ protected BlockStairs(int var1, Block var2) {
+ super(var1, var2.blockIndexInTexture, var2.blockMaterial);
+ this.modelBlock = var2;
+ this.setHardness(var2.blockHardness);
+ this.setResistance(var2.blockResistance / 3.0F);
+ this.setStepSound(var2.stepSound);
+ }
+
+ public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return super.getCollisionBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 10;
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return super.shouldSideBeRendered(var1, var2, var3, var4, var5);
+ }
+
+ public void getCollidingBoundingBoxes(World var1, int var2, int var3, int var4, AxisAlignedBB var5, ArrayList var6) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4);
+ if(var7 == 0) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 0.5F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ } else if(var7 == 1) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ } else if(var7 == 2) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 0.5F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 1.0F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ } else if(var7 == 3) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ this.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 0.5F, 1.0F);
+ super.getCollidingBoundingBoxes(var1, var2, var3, var4, var5, var6);
+ }
+
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ this.modelBlock.randomDisplayTick(var1, var2, var3, var4, var5);
+ }
+
+ public void onBlockClicked(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ this.modelBlock.onBlockClicked(var1, var2, var3, var4, var5);
+ }
+
+ public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) {
+ this.modelBlock.onBlockDestroyedByPlayer(var1, var2, var3, var4, var5);
+ }
+
+ public float getBlockBrightness(IBlockAccess var1, int var2, int var3, int var4) {
+ return this.modelBlock.getBlockBrightness(var1, var2, var3, var4);
+ }
+
+ public float func_227_a(Entity var1) {
+ return this.modelBlock.func_227_a(var1);
+ }
+
+ public int func_234_g() {
+ return this.modelBlock.func_234_g();
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return this.modelBlock.idDropped(var1, var2);
+ }
+
+ public int quantityDropped(Random var1) {
+ return this.modelBlock.quantityDropped(var1);
+ }
+
+ public int getBlockTextureFromSideAndMetadata(int var1, int var2) {
+ return this.modelBlock.getBlockTextureFromSideAndMetadata(var1, var2);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return this.modelBlock.getBlockTextureFromSide(var1);
+ }
+
+ public int getBlockTexture(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ return this.modelBlock.getBlockTexture(var1, var2, var3, var4, var5);
+ }
+
+ public int tickRate() {
+ return this.modelBlock.tickRate();
+ }
+
+ public AxisAlignedBB getSelectedBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return this.modelBlock.getSelectedBoundingBoxFromPool(var1, var2, var3, var4);
+ }
+
+ public void velocityToAddToEntity(World var1, int var2, int var3, int var4, Entity var5, Vec3D var6) {
+ this.modelBlock.velocityToAddToEntity(var1, var2, var3, var4, var5, var6);
+ }
+
+ public boolean isCollidable() {
+ return this.modelBlock.isCollidable();
+ }
+
+ public boolean canCollideCheck(int var1, boolean var2) {
+ return this.modelBlock.canCollideCheck(var1, var2);
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return this.modelBlock.canPlaceBlockAt(var1, var2, var3, var4);
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ this.onNeighborBlockChange(var1, var2, var3, var4, 0);
+ this.modelBlock.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ public void onBlockRemoval(World var1, int var2, int var3, int var4) {
+ this.modelBlock.onBlockRemoval(var1, var2, var3, var4);
+ }
+
+ public void dropBlockAsItemWithChance(World var1, int var2, int var3, int var4, int var5, float var6) {
+ this.modelBlock.dropBlockAsItemWithChance(var1, var2, var3, var4, var5, var6);
+ }
+
+ public void dropBlockAsItem(World var1, int var2, int var3, int var4, int var5) {
+ this.modelBlock.dropBlockAsItem(var1, var2, var3, var4, var5);
+ }
+
+ public void onEntityWalking(World var1, int var2, int var3, int var4, Entity var5) {
+ this.modelBlock.onEntityWalking(var1, var2, var3, var4, var5);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ this.modelBlock.updateTick(var1, var2, var3, var4, var5);
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ return this.modelBlock.blockActivated(var1, var2, var3, var4, var5);
+ }
+
+ public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) {
+ this.modelBlock.onBlockDestroyedByExplosion(var1, var2, var3, var4);
+ }
+
+ public void onBlockPlacedBy(World var1, int var2, int var3, int var4, EntityLiving var5) {
+ int var6 = MathHelper.floor_double((double)(var5.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+ if(var6 == 0) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ }
+
+ if(var6 == 1) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ }
+
+ if(var6 == 2) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ }
+
+ if(var6 == 3) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockStationary.java b/src/main/java/net/minecraft/src/BlockStationary.java
new file mode 100644
index 0000000..8241ab5
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockStationary.java
@@ -0,0 +1,57 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockStationary extends BlockFluids {
+ protected BlockStationary(int var1, Material var2) {
+ super(var1, var2);
+ this.setTickOnLoad(false);
+ if(var2 == Material.lava) {
+ this.setTickOnLoad(true);
+ }
+
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ super.onNeighborBlockChange(var1, var2, var3, var4, var5);
+ if(var1.getBlockId(var2, var3, var4) == this.blockID) {
+ this.func_15234_j(var1, var2, var3, var4);
+ }
+
+ }
+
+ private void func_15234_j(World var1, int var2, int var3, int var4) {
+ int var5 = var1.getBlockMetadata(var2, var3, var4);
+ var1.field_1043_h = true;
+ var1.setBlockAndMetadata(var2, var3, var4, this.blockID - 1, var5);
+ var1.func_701_b(var2, var3, var4, var2, var3, var4);
+ var1.scheduleBlockUpdate(var2, var3, var4, this.blockID - 1);
+ var1.field_1043_h = false;
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ if(this.blockMaterial == Material.lava) {
+ int var6 = var5.nextInt(3);
+
+ for(int var7 = 0; var7 < var6; ++var7) {
+ var2 += var5.nextInt(3) - 1;
+ ++var3;
+ var4 += var5.nextInt(3) - 1;
+ int var8 = var1.getBlockId(var2, var3, var4);
+ if(var8 == 0) {
+ if(this.func_301_k(var1, var2 - 1, var3, var4) || this.func_301_k(var1, var2 + 1, var3, var4) || this.func_301_k(var1, var2, var3, var4 - 1) || this.func_301_k(var1, var2, var3, var4 + 1) || this.func_301_k(var1, var2, var3 - 1, var4) || this.func_301_k(var1, var2, var3 + 1, var4)) {
+ var1.setBlockWithNotify(var2, var3, var4, Block.fire.blockID);
+ return;
+ }
+ } else if(Block.blocksList[var8].blockMaterial.func_880_c()) {
+ return;
+ }
+ }
+ }
+
+ }
+
+ private boolean func_301_k(World var1, int var2, int var3, int var4) {
+ return var1.getBlockMaterial(var2, var3, var4).getBurning();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockStep.java b/src/main/java/net/minecraft/src/BlockStep.java
new file mode 100644
index 0000000..b446197
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockStep.java
@@ -0,0 +1,59 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockStep extends Block {
+ private boolean field_469_a;
+
+ public BlockStep(int var1, boolean var2) {
+ super(var1, 6, Material.rock);
+ this.field_469_a = var2;
+ if(!var2) {
+ this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
+ }
+
+ this.setLightOpacity(255);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 <= 1 ? 6 : 5;
+ }
+
+ public boolean isOpaqueCube() {
+ return this.field_469_a;
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(this == Block.stairSingle) {
+ }
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(this != Block.stairSingle) {
+ super.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ int var5 = var1.getBlockId(var2, var3 - 1, var4);
+ if(var5 == stairSingle.blockID) {
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ var1.setBlockWithNotify(var2, var3 - 1, var4, Block.stairDouble.blockID);
+ }
+
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.stairSingle.blockID;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return this.field_469_a;
+ }
+
+ public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5) {
+ if(this != Block.stairSingle) {
+ super.shouldSideBeRendered(var1, var2, var3, var4, var5);
+ }
+
+ return var5 == 1 ? true : (!super.shouldSideBeRendered(var1, var2, var3, var4, var5) ? false : (var5 == 0 ? true : var1.getBlockId(var2, var3, var4) != this.blockID));
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockStone.java b/src/main/java/net/minecraft/src/BlockStone.java
new file mode 100644
index 0000000..eae4ecd
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockStone.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockStone extends Block {
+ public BlockStone(int var1, int var2) {
+ super(var1, var2, Material.rock);
+ }
+
+ public int idDropped(int var1, Random var2) {
+ return Block.cobblestone.blockID;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockTNT.java b/src/main/java/net/minecraft/src/BlockTNT.java
new file mode 100644
index 0000000..e297b06
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockTNT.java
@@ -0,0 +1,39 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockTNT extends Block {
+ public BlockTNT(int var1, int var2) {
+ super(var1, var2, Material.tnt);
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 0 ? this.blockIndexInTexture + 2 : (var1 == 1 ? this.blockIndexInTexture + 1 : this.blockIndexInTexture);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(var5 > 0 && Block.blocksList[var5].canProvidePower() && var1.isBlockIndirectlyGettingPowered(var2, var3, var4)) {
+ this.onBlockDestroyedByPlayer(var1, var2, var3, var4, 0);
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+
+ }
+
+ public int quantityDropped(Random var1) {
+ return 0;
+ }
+
+ public void onBlockDestroyedByExplosion(World var1, int var2, int var3, int var4) {
+ EntityTNTPrimed var5 = new EntityTNTPrimed(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F));
+ var5.fuse = var1.rand.nextInt(var5.fuse / 4) + var5.fuse / 8;
+ var1.entityJoinedWorld(var5);
+ }
+
+ public void onBlockDestroyedByPlayer(World var1, int var2, int var3, int var4, int var5) {
+ //if(!var1.multiplayerWorld) {
+ EntityTNTPrimed var6 = new EntityTNTPrimed(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F));
+ var1.entityJoinedWorld(var6);
+ var1.playSoundAtEntity(var6, "random.fuse", 1.0F, 1.0F);
+ //}
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockTorch.java b/src/main/java/net/minecraft/src/BlockTorch.java
new file mode 100644
index 0000000..98712f6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockTorch.java
@@ -0,0 +1,166 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class BlockTorch extends Block {
+ protected BlockTorch(int var1, int var2) {
+ super(var1, var2, Material.circuits);
+ this.setTickOnLoad(true);
+ }
+
+ public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4) {
+ return null;
+ }
+
+ public boolean isOpaqueCube() {
+ return false;
+ }
+
+ public boolean renderAsNormalBlock() {
+ return false;
+ }
+
+ public int getRenderType() {
+ return 2;
+ }
+
+ public boolean canPlaceBlockAt(World var1, int var2, int var3, int var4) {
+ return var1.isBlockOpaqueCube(var2 - 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2 + 1, var3, var4) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 - 1) ? true : (var1.isBlockOpaqueCube(var2, var3, var4 + 1) ? true : var1.isBlockOpaqueCube(var2, var3 - 1, var4))));
+ }
+
+ public void onBlockPlaced(World var1, int var2, int var3, int var4, int var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ if(var5 == 1 && var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var6 = 5;
+ }
+
+ if(var5 == 2 && var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var6 = 4;
+ }
+
+ if(var5 == 3 && var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var6 = 3;
+ }
+
+ if(var5 == 4 && var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var6 = 2;
+ }
+
+ if(var5 == 5 && var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var6 = 1;
+ }
+
+ var1.setBlockMetadataWithNotify(var2, var3, var4, var6);
+ }
+
+ public void updateTick(World var1, int var2, int var3, int var4, Random var5) {
+ super.updateTick(var1, var2, var3, var4, var5);
+ if(var1.getBlockMetadata(var2, var3, var4) == 0) {
+ this.onBlockAdded(var1, var2, var3, var4);
+ }
+
+ }
+
+ public void onBlockAdded(World var1, int var2, int var3, int var4) {
+ if(var1.isBlockOpaqueCube(var2 - 1, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 1);
+ } else if(var1.isBlockOpaqueCube(var2 + 1, var3, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 2);
+ } else if(var1.isBlockOpaqueCube(var2, var3, var4 - 1)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 3);
+ } else if(var1.isBlockOpaqueCube(var2, var3, var4 + 1)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 4);
+ } else if(var1.isBlockOpaqueCube(var2, var3 - 1, var4)) {
+ var1.setBlockMetadataWithNotify(var2, var3, var4, 5);
+ }
+
+ this.func_271_h(var1, var2, var3, var4);
+ }
+
+ public void onNeighborBlockChange(World var1, int var2, int var3, int var4, int var5) {
+ if(this.func_271_h(var1, var2, var3, var4)) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ boolean var7 = false;
+ if(!var1.isBlockOpaqueCube(var2 - 1, var3, var4) && var6 == 1) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2 + 1, var3, var4) && var6 == 2) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3, var4 - 1) && var6 == 3) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3, var4 + 1) && var6 == 4) {
+ var7 = true;
+ }
+
+ if(!var1.isBlockOpaqueCube(var2, var3 - 1, var4) && var6 == 5) {
+ var7 = true;
+ }
+
+ if(var7) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ }
+ }
+
+ }
+
+ private boolean func_271_h(World var1, int var2, int var3, int var4) {
+ if(!this.canPlaceBlockAt(var1, var2, var3, var4)) {
+ this.dropBlockAsItem(var1, var2, var3, var4, var1.getBlockMetadata(var2, var3, var4));
+ var1.setBlockWithNotify(var2, var3, var4, 0);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public MovingObjectPosition collisionRayTrace(World var1, int var2, int var3, int var4, Vec3D var5, Vec3D var6) {
+ int var7 = var1.getBlockMetadata(var2, var3, var4) & 7;
+ float var8 = 0.15F;
+ if(var7 == 1) {
+ this.setBlockBounds(0.0F, 0.2F, 0.5F - var8, var8 * 2.0F, 0.8F, 0.5F + var8);
+ } else if(var7 == 2) {
+ this.setBlockBounds(1.0F - var8 * 2.0F, 0.2F, 0.5F - var8, 1.0F, 0.8F, 0.5F + var8);
+ } else if(var7 == 3) {
+ this.setBlockBounds(0.5F - var8, 0.2F, 0.0F, 0.5F + var8, 0.8F, var8 * 2.0F);
+ } else if(var7 == 4) {
+ this.setBlockBounds(0.5F - var8, 0.2F, 1.0F - var8 * 2.0F, 0.5F + var8, 0.8F, 1.0F);
+ } else {
+ var8 = 0.1F;
+ this.setBlockBounds(0.5F - var8, 0.0F, 0.5F - var8, 0.5F + var8, 0.6F, 0.5F + var8);
+ }
+
+ return super.collisionRayTrace(var1, var2, var3, var4, var5, var6);
+ }
+
+ public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5) {
+ int var6 = var1.getBlockMetadata(var2, var3, var4);
+ double var7 = (double)((float)var2 + 0.5F);
+ double var9 = (double)((float)var3 + 0.7F);
+ double var11 = (double)((float)var4 + 0.5F);
+ double var13 = (double)0.22F;
+ double var15 = (double)0.27F;
+ if(var6 == 1) {
+ var1.spawnParticle("smoke", var7 - var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", var7 - var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 2) {
+ var1.spawnParticle("smoke", var7 + var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", var7 + var15, var9 + var13, var11, 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 3) {
+ var1.spawnParticle("smoke", var7, var9 + var13, var11 - var15, 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", var7, var9 + var13, var11 - var15, 0.0D, 0.0D, 0.0D);
+ } else if(var6 == 4) {
+ var1.spawnParticle("smoke", var7, var9 + var13, var11 + var15, 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", var7, var9 + var13, var11 + var15, 0.0D, 0.0D, 0.0D);
+ } else {
+ var1.spawnParticle("smoke", var7, var9, var11, 0.0D, 0.0D, 0.0D);
+ var1.spawnParticle("flame", var7, var9, var11, 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/BlockWorkbench.java b/src/main/java/net/minecraft/src/BlockWorkbench.java
new file mode 100644
index 0000000..8b02c5f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/BlockWorkbench.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class BlockWorkbench extends Block {
+ protected BlockWorkbench(int var1) {
+ super(var1, Material.wood);
+ this.blockIndexInTexture = 59;
+ }
+
+ public int getBlockTextureFromSide(int var1) {
+ return var1 == 1 ? this.blockIndexInTexture - 16 : (var1 == 0 ? Block.planks.getBlockTextureFromSide(0) : (var1 != 2 && var1 != 4 ? this.blockIndexInTexture : this.blockIndexInTexture + 1));
+ }
+
+ public boolean blockActivated(World var1, int var2, int var3, int var4, EntityPlayer var5) {
+ var5.displayWorkbenchGUI();
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChatLine.java b/src/main/java/net/minecraft/src/ChatLine.java
new file mode 100644
index 0000000..98635da
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChatLine.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class ChatLine {
+ public String message;
+ public int updateCounter;
+
+ public ChatLine(String var1) {
+ this.message = var1;
+ this.updateCounter = 0;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Chunk.java b/src/main/java/net/minecraft/src/Chunk.java
new file mode 100644
index 0000000..0b653a9
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Chunk.java
@@ -0,0 +1,598 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+public class Chunk {
+ public static boolean field_1540_a;
+ public byte[] blocks;
+ public boolean isChunkLoaded;
+ public World worldObj;
+ public NibbleArray data;
+ public NibbleArray skylightMap;
+ public NibbleArray blocklightMap;
+ public byte[] heightMap;
+ public int field_1532_i;
+ public final int xPosition;
+ public final int zPosition;
+ public Map chunkTileEntityMap;
+ public List[] entities;
+ public boolean isTerrainPopulated;
+ public boolean isModified;
+ public boolean neverSave;
+ public boolean field_1524_q;
+ public boolean hasEntities;
+ public long lastSaveTime;
+
+ public Chunk(World var1, int var2, int var3) {
+ this.chunkTileEntityMap = new HashMap();
+ this.entities = new List[8];
+ this.isTerrainPopulated = false;
+ this.isModified = false;
+ this.field_1524_q = false;
+ this.hasEntities = false;
+ this.lastSaveTime = 0L;
+ this.worldObj = var1;
+ this.xPosition = var2;
+ this.zPosition = var3;
+ this.heightMap = new byte[256];
+
+ for(int var4 = 0; var4 < this.entities.length; ++var4) {
+ this.entities[var4] = new ArrayList();
+ }
+
+ }
+
+ public Chunk(World var1, byte[] var2, int var3, int var4) {
+ this(var1, var3, var4);
+ this.blocks = var2;
+ this.data = new NibbleArray(var2.length);
+ this.skylightMap = new NibbleArray(var2.length);
+ this.blocklightMap = new NibbleArray(var2.length);
+ }
+
+ public boolean isAtLocation(int var1, int var2) {
+ return var1 == this.xPosition && var2 == this.zPosition;
+ }
+
+ public int getHeightValue(int var1, int var2) {
+ return this.heightMap[var2 << 4 | var1] & 255;
+ }
+
+ public void func_1014_a() {
+ }
+
+ public void generateHeightMap() {
+ int var1 = 127;
+
+ for(int var2 = 0; var2 < 16; ++var2) {
+ for(int var3 = 0; var3 < 16; ++var3) {
+ int var4 = 127;
+
+ for(int var5 = var2 << 11 | var3 << 7; var4 > 0 && Block.lightOpacity[this.blocks[var5 + var4 - 1]] == 0; --var4) {
+ }
+
+ this.heightMap[var3 << 4 | var2] = (byte)var4;
+ if(var4 < var1) {
+ var1 = var4;
+ }
+ }
+ }
+
+ this.field_1532_i = var1;
+ this.isModified = true;
+ }
+
+ public void func_1024_c() {
+ int var1 = 127;
+
+ int var2;
+ int var3;
+ for(var2 = 0; var2 < 16; ++var2) {
+ for(var3 = 0; var3 < 16; ++var3) {
+ this.heightMap[var3 << 4 | var2] = -128;
+ this.func_1003_g(var2, 127, var3);
+ if((this.heightMap[var3 << 4 | var2] & 255) < var1) {
+ var1 = this.heightMap[var3 << 4 | var2] & 255;
+ }
+ }
+ }
+
+ this.field_1532_i = var1;
+
+ for(var2 = 0; var2 < 16; ++var2) {
+ for(var3 = 0; var3 < 16; ++var3) {
+ this.func_996_c(var2, var3);
+ }
+ }
+
+ this.isModified = true;
+ }
+
+ public void func_4143_d() {
+ byte var1 = 32;
+
+ for(int var2 = 0; var2 < 16; ++var2) {
+ for(int var3 = 0; var3 < 16; ++var3) {
+ int var4 = var2 << 11 | var3 << 7;
+
+ int var5;
+ int var6;
+ for(var5 = 0; var5 < 128; ++var5) {
+ var6 = Block.lightValue[this.blocks[var4 + var5]];
+ if(var6 > 0) {
+ this.blocklightMap.setNibble(var2, var5, var3, var6);
+ }
+ }
+
+ var5 = 15;
+
+ for(var6 = var1 - 2; var6 < 128 && var5 > 0; this.blocklightMap.setNibble(var2, var6, var3, var5)) {
+ ++var6;
+ byte var7 = this.blocks[var4 + var6];
+ int var8 = Block.lightOpacity[var7];
+ int var9 = Block.lightValue[var7];
+ if(var8 == 0) {
+ var8 = 1;
+ }
+
+ var5 -= var8;
+ if(var9 > var5) {
+ var5 = var9;
+ }
+
+ if(var5 < 0) {
+ var5 = 0;
+ }
+ }
+ }
+ }
+
+ this.worldObj.func_616_a(EnumSkyBlock.Block, this.xPosition * 16, var1 - 1, this.zPosition * 16, this.xPosition * 16 + 16, var1 + 1, this.zPosition * 16 + 16);
+ this.isModified = true;
+ }
+
+ private void func_996_c(int var1, int var2) {
+ int var3 = this.getHeightValue(var1, var2);
+ int var4 = this.xPosition * 16 + var1;
+ int var5 = this.zPosition * 16 + var2;
+ this.func_1020_f(var4 - 1, var5, var3);
+ this.func_1020_f(var4 + 1, var5, var3);
+ this.func_1020_f(var4, var5 - 1, var3);
+ this.func_1020_f(var4, var5 + 1, var3);
+ }
+
+ private void func_1020_f(int var1, int var2, int var3) {
+ int var4 = this.worldObj.getHeightValue(var1, var2);
+ if(var4 > var3) {
+ this.worldObj.func_616_a(EnumSkyBlock.Sky, var1, var3, var2, var1, var4, var2);
+ } else if(var4 < var3) {
+ this.worldObj.func_616_a(EnumSkyBlock.Sky, var1, var4, var2, var1, var3, var2);
+ }
+
+ this.isModified = true;
+ }
+
+ private void func_1003_g(int var1, int var2, int var3) {
+ int var4 = this.heightMap[var3 << 4 | var1] & 255;
+ int var5 = var4;
+ if(var2 > var4) {
+ var5 = var2;
+ }
+
+ for(int var6 = var1 << 11 | var3 << 7; var5 > 0 && Block.lightOpacity[this.blocks[var6 + var5 - 1]] == 0; --var5) {
+ }
+
+ if(var5 != var4) {
+ this.worldObj.func_680_f(var1, var3, var5, var4);
+ this.heightMap[var3 << 4 | var1] = (byte)var5;
+ int var7;
+ int var8;
+ int var9;
+ if(var5 < this.field_1532_i) {
+ this.field_1532_i = var5;
+ } else {
+ var7 = 127;
+
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var9 = 0; var9 < 16; ++var9) {
+ if((this.heightMap[var9 << 4 | var8] & 255) < var7) {
+ var7 = this.heightMap[var9 << 4 | var8] & 255;
+ }
+ }
+ }
+
+ this.field_1532_i = var7;
+ }
+
+ var7 = this.xPosition * 16 + var1;
+ var8 = this.zPosition * 16 + var3;
+ if(var5 < var4) {
+ for(var9 = var5; var9 < var4; ++var9) {
+ this.skylightMap.setNibble(var1, var9, var3, 15);
+ }
+ } else {
+ this.worldObj.func_616_a(EnumSkyBlock.Sky, var7, var4, var8, var7, var5, var8);
+
+ for(var9 = var4; var9 < var5; ++var9) {
+ this.skylightMap.setNibble(var1, var9, var3, 0);
+ }
+ }
+
+ var9 = 15;
+
+ int var10;
+ for(var10 = var5; var5 > 0 && var9 > 0; this.skylightMap.setNibble(var1, var5, var3, var9)) {
+ --var5;
+ int var11 = Block.lightOpacity[this.getBlockID(var1, var5, var3)];
+ if(var11 == 0) {
+ var11 = 1;
+ }
+
+ var9 -= var11;
+ if(var9 < 0) {
+ var9 = 0;
+ }
+ }
+
+ while(var5 > 0 && Block.lightOpacity[this.getBlockID(var1, var5 - 1, var3)] == 0) {
+ --var5;
+ }
+
+ if(var5 != var10) {
+ this.worldObj.func_616_a(EnumSkyBlock.Sky, var7 - 1, var5, var8 - 1, var7 + 1, var10, var8 + 1);
+ }
+
+ this.isModified = true;
+ }
+ }
+
+ public int getBlockID(int var1, int var2, int var3) {
+ return this.blocks[var1 << 11 | var3 << 7 | var2];
+ }
+
+ public boolean setBlockIDWithMetadata(int var1, int var2, int var3, int var4, int var5) {
+ byte var6 = (byte)var4;
+ int var7 = this.heightMap[var3 << 4 | var1] & 255;
+ int var8 = this.blocks[var1 << 11 | var3 << 7 | var2] & 255;
+ if(var8 == var4 && this.data.getNibble(var1, var2, var3) == var5) {
+ return false;
+ } else {
+ int var9 = this.xPosition * 16 + var1;
+ int var10 = this.zPosition * 16 + var3;
+ this.blocks[var1 << 11 | var3 << 7 | var2] = var6;
+ if(var8 != 0) {
+ Block.blocksList[var8].onBlockRemoval(this.worldObj, var9, var2, var10);
+ }
+
+ this.data.setNibble(var1, var2, var3, var5);
+ if(!this.worldObj.worldProvider.field_6478_e) {
+ if(Block.lightOpacity[var6] != 0) {
+ if(var2 >= var7) {
+ this.func_1003_g(var1, var2 + 1, var3);
+ }
+ } else if(var2 == var7 - 1) {
+ this.func_1003_g(var1, var2, var3);
+ }
+
+ this.worldObj.func_616_a(EnumSkyBlock.Sky, var9, var2, var10, var9, var2, var10);
+ }
+
+ this.worldObj.func_616_a(EnumSkyBlock.Block, var9, var2, var10, var9, var2, var10);
+ this.func_996_c(var1, var3);
+ if(var4 != 0) {
+ Block.blocksList[var4].onBlockAdded(this.worldObj, var9, var2, var10);
+ }
+
+ this.data.setNibble(var1, var2, var3, var5);
+ this.isModified = true;
+ return true;
+ }
+ }
+
+ public boolean setBlockID(int var1, int var2, int var3, int var4) {
+ byte var5 = (byte)var4;
+ int var6 = this.heightMap[var3 << 4 | var1] & 255;
+ int var7 = this.blocks[var1 << 11 | var3 << 7 | var2] & 255;
+ if(var7 == var4) {
+ return false;
+ } else {
+ int var8 = this.xPosition * 16 + var1;
+ int var9 = this.zPosition * 16 + var3;
+ this.blocks[var1 << 11 | var3 << 7 | var2] = var5;
+ if(var7 != 0) {
+ Block.blocksList[var7].onBlockRemoval(this.worldObj, var8, var2, var9);
+ }
+
+ this.data.setNibble(var1, var2, var3, 0);
+ if(Block.lightOpacity[var5] != 0) {
+ if(var2 >= var6) {
+ this.func_1003_g(var1, var2 + 1, var3);
+ }
+ } else if(var2 == var6 - 1) {
+ this.func_1003_g(var1, var2, var3);
+ }
+
+ this.worldObj.func_616_a(EnumSkyBlock.Sky, var8, var2, var9, var8, var2, var9);
+ this.worldObj.func_616_a(EnumSkyBlock.Block, var8, var2, var9, var8, var2, var9);
+ this.func_996_c(var1, var3);
+ if(var4 != 0) {
+ Block.blocksList[var4].onBlockAdded(this.worldObj, var8, var2, var9);
+ }
+
+ this.isModified = true;
+ return true;
+ }
+ }
+
+ public int getBlockMetadata(int var1, int var2, int var3) {
+ return this.data.getNibble(var1, var2, var3);
+ }
+
+ public void setBlockMetadata(int var1, int var2, int var3, int var4) {
+ this.isModified = true;
+ this.data.setNibble(var1, var2, var3, var4);
+ }
+
+ public int getSavedLightValue(EnumSkyBlock var1, int var2, int var3, int var4) {
+ return var1 == EnumSkyBlock.Sky ? this.skylightMap.getNibble(var2, var3, var4) : (var1 == EnumSkyBlock.Block ? this.blocklightMap.getNibble(var2, var3, var4) : 0);
+ }
+
+ public void setLightValue(EnumSkyBlock var1, int var2, int var3, int var4, int var5) {
+ this.isModified = true;
+ if(var1 == EnumSkyBlock.Sky) {
+ this.skylightMap.setNibble(var2, var3, var4, var5);
+ } else {
+ if(var1 != EnumSkyBlock.Block) {
+ return;
+ }
+
+ this.blocklightMap.setNibble(var2, var3, var4, var5);
+ }
+
+ }
+
+ public int getBlockLightValue(int var1, int var2, int var3, int var4) {
+ int var5 = this.skylightMap.getNibble(var1, var2, var3);
+ if(var5 > 0) {
+ field_1540_a = true;
+ }
+
+ var5 -= var4;
+ int var6 = this.blocklightMap.getNibble(var1, var2, var3);
+ if(var6 > var5) {
+ var5 = var6;
+ }
+
+ return var5;
+ }
+
+ public void addEntity(Entity var1) {
+ if(!this.field_1524_q) {
+ this.hasEntities = true;
+ int var2 = MathHelper.floor_double(var1.posX / 16.0D);
+ int var3 = MathHelper.floor_double(var1.posZ / 16.0D);
+ if(var2 != this.xPosition || var3 != this.zPosition) {
+ System.out.println("Wrong location! " + var1);
+ Thread.dumpStack();
+ }
+
+ int var4 = MathHelper.floor_double(var1.posY / 16.0D);
+ if(var4 < 0) {
+ var4 = 0;
+ }
+
+ if(var4 >= this.entities.length) {
+ var4 = this.entities.length - 1;
+ }
+
+ var1.field_621_aZ = true;
+ var1.field_657_ba = this.xPosition;
+ var1.field_656_bb = var4;
+ var1.field_654_bc = this.zPosition;
+ this.entities[var4].add(var1);
+ }
+ }
+
+ public void func_1015_b(Entity var1) {
+ this.func_1016_a(var1, var1.field_656_bb);
+ }
+
+ public void func_1016_a(Entity var1, int var2) {
+ if(var2 < 0) {
+ var2 = 0;
+ }
+
+ if(var2 >= this.entities.length) {
+ var2 = this.entities.length - 1;
+ }
+
+ this.entities[var2].remove(var1);
+ }
+
+ public boolean canBlockSeeTheSky(int var1, int var2, int var3) {
+ return var2 >= (this.heightMap[var3 << 4 | var1] & 255);
+ }
+
+ public TileEntity getChunkBlockTileEntity(int var1, int var2, int var3) {
+ ChunkPosition var4 = new ChunkPosition(var1, var2, var3);
+ TileEntity var5 = (TileEntity)this.chunkTileEntityMap.get(var4);
+ if(var5 == null) {
+ int var6 = this.getBlockID(var1, var2, var3);
+ if(!Block.isBlockContainer[var6]) {
+ return null;
+ }
+
+ BlockContainer var7 = (BlockContainer)Block.blocksList[var6];
+ var7.onBlockAdded(this.worldObj, this.xPosition * 16 + var1, var2, this.zPosition * 16 + var3);
+ var5 = (TileEntity)this.chunkTileEntityMap.get(var4);
+ }
+
+ return var5;
+ }
+
+ public void func_1001_a(TileEntity var1) {
+ int var2 = var1.xCoord - this.xPosition * 16;
+ int var3 = var1.yCoord;
+ int var4 = var1.zCoord - this.zPosition * 16;
+ this.setChunkBlockTileEntity(var2, var3, var4, var1);
+ }
+
+ public void setChunkBlockTileEntity(int var1, int var2, int var3, TileEntity var4) {
+ ChunkPosition var5 = new ChunkPosition(var1, var2, var3);
+ var4.worldObj = this.worldObj;
+ var4.xCoord = this.xPosition * 16 + var1;
+ var4.yCoord = var2;
+ var4.zCoord = this.zPosition * 16 + var3;
+ if(this.getBlockID(var1, var2, var3) != 0 && Block.blocksList[this.getBlockID(var1, var2, var3)] instanceof BlockContainer) {
+ if(this.isChunkLoaded) {
+ if(this.chunkTileEntityMap.get(var5) != null) {
+ this.worldObj.loadedTileEntityList.remove(this.chunkTileEntityMap.get(var5));
+ }
+
+ this.worldObj.loadedTileEntityList.add(var4);
+ }
+
+ this.chunkTileEntityMap.put(var5, var4);
+ } else {
+ System.out.println("Attempted to place a tile entity where there was no entity tile!");
+ }
+ }
+
+ public void removeChunkBlockTileEntity(int var1, int var2, int var3) {
+ ChunkPosition var4 = new ChunkPosition(var1, var2, var3);
+ if(this.isChunkLoaded) {
+ this.worldObj.loadedTileEntityList.remove(this.chunkTileEntityMap.remove(var4));
+ }
+
+ }
+
+ public void onChunkLoad() {
+ this.isChunkLoaded = true;
+ this.worldObj.loadedTileEntityList.addAll(this.chunkTileEntityMap.values());
+
+ for(int var1 = 0; var1 < this.entities.length; ++var1) {
+ this.worldObj.func_636_a(this.entities[var1]);
+ }
+
+ }
+
+ public void onChunkUnload() {
+ this.isChunkLoaded = false;
+ this.worldObj.loadedTileEntityList.removeAll(this.chunkTileEntityMap.values());
+
+ for(int var1 = 0; var1 < this.entities.length; ++var1) {
+ this.worldObj.func_632_b(this.entities[var1]);
+ }
+
+ }
+
+ public void setChunkModified() {
+ this.isModified = true;
+ }
+
+ public void getEntitiesWithinAABBForEntity(Entity var1, AxisAlignedBB var2, List var3) {
+ int var4 = MathHelper.floor_double((var2.minY - 2.0D) / 16.0D);
+ int var5 = MathHelper.floor_double((var2.maxY + 2.0D) / 16.0D);
+ if(var4 < 0) {
+ var4 = 0;
+ }
+
+ if(var5 >= this.entities.length) {
+ var5 = this.entities.length - 1;
+ }
+
+ for(int var6 = var4; var6 <= var5; ++var6) {
+ List var7 = this.entities[var6];
+
+ for(int var8 = 0; var8 < var7.size(); ++var8) {
+ Entity var9 = (Entity)var7.get(var8);
+ if(var9 != var1 && var9.boundingBox.intersectsWith(var2)) {
+ var3.add(var9);
+ }
+ }
+ }
+
+ }
+
+ public void getEntitiesOfTypeWithinAAAB(Class var1, AxisAlignedBB var2, List var3) {
+ int var4 = MathHelper.floor_double((var2.minY - 2.0D) / 16.0D);
+ int var5 = MathHelper.floor_double((var2.maxY + 2.0D) / 16.0D);
+ if(var4 < 0) {
+ var4 = 0;
+ }
+
+ if(var5 >= this.entities.length) {
+ var5 = this.entities.length - 1;
+ }
+
+ for(int var6 = var4; var6 <= var5; ++var6) {
+ List var7 = this.entities[var6];
+
+ for(int var8 = 0; var8 < var7.size(); ++var8) {
+ Entity var9 = (Entity)var7.get(var8);
+ if(var1.isAssignableFrom(var9.getClass()) && var9.boundingBox.intersectsWith(var2)) {
+ var3.add(var9);
+ }
+ }
+ }
+
+ }
+
+ public boolean needsSaving(boolean var1) {
+ return this.neverSave ? false : (this.hasEntities && this.worldObj.worldTime != this.lastSaveTime ? true : this.isModified);
+ }
+
+ public int func_1004_a(byte[] var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8) {
+ int var9;
+ int var10;
+ int var11;
+ int var12;
+ for(var9 = var2; var9 < var5; ++var9) {
+ for(var10 = var4; var10 < var7; ++var10) {
+ var11 = var9 << 11 | var10 << 7 | var3;
+ var12 = var6 - var3;
+ System.arraycopy(var1, var8, this.blocks, var11, var12);
+ var8 += var12;
+ }
+ }
+
+ this.generateHeightMap();
+
+ for(var9 = var2; var9 < var5; ++var9) {
+ for(var10 = var4; var10 < var7; ++var10) {
+ var11 = (var9 << 11 | var10 << 7 | var3) >> 1;
+ var12 = (var6 - var3) / 2;
+ System.arraycopy(var1, var8, this.data.data, var11, var12);
+ var8 += var12;
+ }
+ }
+
+ for(var9 = var2; var9 < var5; ++var9) {
+ for(var10 = var4; var10 < var7; ++var10) {
+ var11 = (var9 << 11 | var10 << 7 | var3) >> 1;
+ var12 = (var6 - var3) / 2;
+ System.arraycopy(var1, var8, this.blocklightMap.data, var11, var12);
+ var8 += var12;
+ }
+ }
+
+ for(var9 = var2; var9 < var5; ++var9) {
+ for(var10 = var4; var10 < var7; ++var10) {
+ var11 = (var9 << 11 | var10 << 7 | var3) >> 1;
+ var12 = (var6 - var3) / 2;
+ System.arraycopy(var1, var8, this.skylightMap.data, var11, var12);
+ var8 += var12;
+ }
+ }
+
+ return var8;
+ }
+
+ public Random func_997_a(long var1) {
+ return new Random(this.worldObj.randomSeed + (long)(this.xPosition * this.xPosition * 4987142) + (long)(this.xPosition * 5947611) + (long)(this.zPosition * this.zPosition) * 4392871L + (long)(this.zPosition * 389711) ^ var1);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkCache.java b/src/main/java/net/minecraft/src/ChunkCache.java
new file mode 100644
index 0000000..55d28c2
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkCache.java
@@ -0,0 +1,127 @@
+package net.minecraft.src;
+
+public class ChunkCache implements IBlockAccess {
+ private int field_1060_a;
+ private int field_1059_b;
+ private Chunk[][] field_1062_c;
+ private World worldObj;
+
+ public ChunkCache(World var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ this.worldObj = var1;
+ this.field_1060_a = var2 >> 4;
+ this.field_1059_b = var4 >> 4;
+ int var8 = var5 >> 4;
+ int var9 = var7 >> 4;
+ this.field_1062_c = new Chunk[var8 - this.field_1060_a + 1][var9 - this.field_1059_b + 1];
+
+ for(int var10 = this.field_1060_a; var10 <= var8; ++var10) {
+ for(int var11 = this.field_1059_b; var11 <= var9; ++var11) {
+ this.field_1062_c[var10 - this.field_1060_a][var11 - this.field_1059_b] = var1.getChunkFromChunkCoords(var10, var11);
+ }
+ }
+
+ }
+
+ public int getBlockId(int var1, int var2, int var3) {
+ if(var2 < 0) {
+ return 0;
+ } else if(var2 >= 128) {
+ return 0;
+ } else {
+ int var4 = (var1 >> 4) - this.field_1060_a;
+ int var5 = (var3 >> 4) - this.field_1059_b;
+ return this.field_1062_c[var4][var5].getBlockID(var1 & 15, var2, var3 & 15);
+ }
+ }
+
+ public TileEntity getBlockTileEntity(int var1, int var2, int var3) {
+ int var4 = (var1 >> 4) - this.field_1060_a;
+ int var5 = (var3 >> 4) - this.field_1059_b;
+ return this.field_1062_c[var4][var5].getChunkBlockTileEntity(var1 & 15, var2, var3 & 15);
+ }
+
+ public float getLightBrightness(int var1, int var2, int var3) {
+ return this.worldObj.worldProvider.lightBrightnessTable[this.func_4086_d(var1, var2, var3)];
+ }
+
+ public int func_4086_d(int var1, int var2, int var3) {
+ return this.func_716_a(var1, var2, var3, true);
+ }
+
+ public int func_716_a(int var1, int var2, int var3, boolean var4) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ int var5;
+ int var6;
+ if(var4) {
+ var5 = this.getBlockId(var1, var2, var3);
+ if(var5 == Block.stairSingle.blockID || var5 == Block.tilledField.blockID) {
+ var6 = this.func_716_a(var1, var2 + 1, var3, false);
+ int var7 = this.func_716_a(var1 + 1, var2, var3, false);
+ int var8 = this.func_716_a(var1 - 1, var2, var3, false);
+ int var9 = this.func_716_a(var1, var2, var3 + 1, false);
+ int var10 = this.func_716_a(var1, var2, var3 - 1, false);
+ if(var7 > var6) {
+ var6 = var7;
+ }
+
+ if(var8 > var6) {
+ var6 = var8;
+ }
+
+ if(var9 > var6) {
+ var6 = var9;
+ }
+
+ if(var10 > var6) {
+ var6 = var10;
+ }
+
+ return var6;
+ }
+ }
+
+ if(var2 < 0) {
+ return 0;
+ } else if(var2 >= 128) {
+ var5 = 15 - this.worldObj.skylightSubtracted;
+ if(var5 < 0) {
+ var5 = 0;
+ }
+
+ return var5;
+ } else {
+ var5 = (var1 >> 4) - this.field_1060_a;
+ var6 = (var3 >> 4) - this.field_1059_b;
+ return this.field_1062_c[var5][var6].getBlockLightValue(var1 & 15, var2, var3 & 15, this.worldObj.skylightSubtracted);
+ }
+ } else {
+ return 15;
+ }
+ }
+
+ public int getBlockMetadata(int var1, int var2, int var3) {
+ if(var2 < 0) {
+ return 0;
+ } else if(var2 >= 128) {
+ return 0;
+ } else {
+ int var4 = (var1 >> 4) - this.field_1060_a;
+ int var5 = (var3 >> 4) - this.field_1059_b;
+ return this.field_1062_c[var4][var5].getBlockMetadata(var1 & 15, var2, var3 & 15);
+ }
+ }
+
+ public Material getBlockMaterial(int var1, int var2, int var3) {
+ int var4 = this.getBlockId(var1, var2, var3);
+ return var4 == 0 ? Material.air : Block.blocksList[var4].blockMaterial;
+ }
+
+ public boolean isBlockOpaqueCube(int var1, int var2, int var3) {
+ Block var4 = Block.blocksList[this.getBlockId(var1, var2, var3)];
+ return var4 == null ? false : var4.isOpaqueCube();
+ }
+
+ public WorldChunkManager func_4075_a() {
+ return this.worldObj.func_4075_a();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkCoordIntPair.java b/src/main/java/net/minecraft/src/ChunkCoordIntPair.java
new file mode 100644
index 0000000..694e1de
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkCoordIntPair.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+public class ChunkCoordIntPair {
+ public int chunkXPos;
+ public int chunkZPos;
+
+ public ChunkCoordIntPair(int var1, int var2) {
+ this.chunkXPos = var1;
+ this.chunkZPos = var2;
+ }
+
+ public int hashCode() {
+ return this.chunkXPos << 8 | this.chunkZPos;
+ }
+
+ public boolean equals(Object var1) {
+ ChunkCoordIntPair var2 = (ChunkCoordIntPair)var1;
+ return var2.chunkXPos == this.chunkXPos && var2.chunkZPos == this.chunkZPos;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkCoordinates.java b/src/main/java/net/minecraft/src/ChunkCoordinates.java
new file mode 100644
index 0000000..9ffaa35
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkCoordinates.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+final class ChunkCoordinates {
+ public final int field_1518_a;
+ public final int field_1517_b;
+
+ public ChunkCoordinates(int var1, int var2) {
+ this.field_1518_a = var1;
+ this.field_1517_b = var2;
+ }
+
+ public boolean equals(Object var1) {
+ if(!(var1 instanceof ChunkCoordinates)) {
+ return false;
+ } else {
+ ChunkCoordinates var2 = (ChunkCoordinates)var1;
+ return this.field_1518_a == var2.field_1518_a && this.field_1517_b == var2.field_1517_b;
+ }
+ }
+
+ public int hashCode() {
+ return this.field_1518_a << 16 ^ this.field_1517_b;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkLoader.java b/src/main/java/net/minecraft/src/ChunkLoader.java
new file mode 100644
index 0000000..f5bb61d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkLoader.java
@@ -0,0 +1,207 @@
+package net.minecraft.src;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+
+public class ChunkLoader implements IChunkLoader {
+ private File saveDir;
+ private boolean createIfNecessary;
+
+ public ChunkLoader(File var1, boolean var2) {
+ this.saveDir = var1;
+ this.createIfNecessary = var2;
+ }
+
+ private File chunkFileForXZ(int var1, int var2) {
+ String var3 = "c." + Integer.toString(var1, 36) + "." + Integer.toString(var2, 36) + ".dat";
+ String var4 = Integer.toString(var1 & 63, 36);
+ String var5 = Integer.toString(var2 & 63, 36);
+ File var6 = new File(this.saveDir, var4);
+ if(!var6.exists()) {
+ if(!this.createIfNecessary) {
+ return null;
+ }
+
+ var6.mkdir();
+ }
+
+ var6 = new File(var6, var5);
+ if(!var6.exists()) {
+ if(!this.createIfNecessary) {
+ return null;
+ }
+
+ var6.mkdir();
+ }
+
+ var6 = new File(var6, var3);
+ return !var6.exists() && !this.createIfNecessary ? null : var6;
+ }
+
+ public Chunk loadChunk(World var1, int var2, int var3) throws IOException {
+ File var4 = this.chunkFileForXZ(var2, var3);
+ if(var4 != null && var4.exists()) {
+ try {
+ FileInputStream var5 = new FileInputStream(var4);
+ NBTTagCompound var6 = CompressedStreamTools.func_1138_a(var5);
+ if(!var6.hasKey("Level")) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is missing level data, skipping");
+ return null;
+ }
+
+ if(!var6.getCompoundTag("Level").hasKey("Blocks")) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is missing block data, skipping");
+ return null;
+ }
+
+ Chunk var7 = loadChunkIntoWorldFromCompound(var1, var6.getCompoundTag("Level"));
+ if(!var7.isAtLocation(var2, var3)) {
+ System.out.println("Chunk file at " + var2 + "," + var3 + " is in the wrong location; relocating. (Expected " + var2 + ", " + var3 + ", got " + var7.xPosition + ", " + var7.zPosition + ")");
+ var6.setInteger("xPos", var2);
+ var6.setInteger("zPos", var3);
+ var7 = loadChunkIntoWorldFromCompound(var1, var6.getCompoundTag("Level"));
+ }
+
+ return var7;
+ } catch (Exception var8) {
+ var8.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+
+ public void saveChunk(World var1, Chunk var2) throws IOException {
+ var1.func_663_l();
+ File var3 = this.chunkFileForXZ(var2.xPosition, var2.zPosition);
+ if(var3.exists()) {
+ var1.sizeOnDisk -= var3.length();
+ }
+
+ try {
+ File var4 = new File(this.saveDir, "tmp_chunk.dat");
+ FileOutputStream var5 = new FileOutputStream(var4);
+ NBTTagCompound var6 = new NBTTagCompound();
+ NBTTagCompound var7 = new NBTTagCompound();
+ var6.setTag("Level", var7);
+ this.storeChunkInCompound(var2, var1, var7);
+ CompressedStreamTools.writeGzippedCompoundToOutputStream(var6, var5);
+ var5.close();
+ if(var3.exists()) {
+ var3.delete();
+ }
+
+ var4.renameTo(var3);
+ var1.sizeOnDisk += var3.length();
+ } catch (Exception var8) {
+ var8.printStackTrace();
+ }
+
+ }
+
+ public void storeChunkInCompound(Chunk var1, World var2, NBTTagCompound var3) {
+ var2.func_663_l();
+ var3.setInteger("xPos", var1.xPosition);
+ var3.setInteger("zPos", var1.zPosition);
+ var3.setLong("LastUpdate", var2.worldTime);
+ var3.setByteArray("Blocks", var1.blocks);
+ var3.setByteArray("Data", var1.data.data);
+ var3.setByteArray("SkyLight", var1.skylightMap.data);
+ var3.setByteArray("BlockLight", var1.blocklightMap.data);
+ var3.setByteArray("HeightMap", var1.heightMap);
+ var3.setBoolean("TerrainPopulated", var1.isTerrainPopulated);
+ var1.hasEntities = false;
+ NBTTagList var4 = new NBTTagList();
+
+ Iterator var6;
+ NBTTagCompound var8;
+ for(int var5 = 0; var5 < var1.entities.length; ++var5) {
+ var6 = var1.entities[var5].iterator();
+
+ while(var6.hasNext()) {
+ Entity var7 = (Entity)var6.next();
+ var1.hasEntities = true;
+ var8 = new NBTTagCompound();
+ if(var7.func_358_c(var8)) {
+ var4.setTag(var8);
+ }
+ }
+ }
+
+ var3.setTag("Entities", var4);
+ NBTTagList var9 = new NBTTagList();
+ var6 = var1.chunkTileEntityMap.values().iterator();
+
+ while(var6.hasNext()) {
+ TileEntity var10 = (TileEntity)var6.next();
+ var8 = new NBTTagCompound();
+ var10.writeToNBT(var8);
+ var9.setTag(var8);
+ }
+
+ var3.setTag("TileEntities", var9);
+ }
+
+ public static Chunk loadChunkIntoWorldFromCompound(World var0, NBTTagCompound var1) {
+ int var2 = var1.getInteger("xPos");
+ int var3 = var1.getInteger("zPos");
+ Chunk var4 = new Chunk(var0, var2, var3);
+ var4.blocks = var1.getByteArray("Blocks");
+ var4.data = new NibbleArray(var1.getByteArray("Data"));
+ var4.skylightMap = new NibbleArray(var1.getByteArray("SkyLight"));
+ var4.blocklightMap = new NibbleArray(var1.getByteArray("BlockLight"));
+ var4.heightMap = var1.getByteArray("HeightMap");
+ var4.isTerrainPopulated = var1.getBoolean("TerrainPopulated");
+ if(!var4.data.isValid()) {
+ var4.data = new NibbleArray(var4.blocks.length);
+ }
+
+ if(var4.heightMap == null || !var4.skylightMap.isValid()) {
+ var4.heightMap = new byte[256];
+ var4.skylightMap = new NibbleArray(var4.blocks.length);
+ var4.func_1024_c();
+ }
+
+ if(!var4.blocklightMap.isValid()) {
+ var4.blocklightMap = new NibbleArray(var4.blocks.length);
+ var4.func_1014_a();
+ }
+
+ NBTTagList var5 = var1.getTagList("Entities");
+ if(var5 != null) {
+ for(int var6 = 0; var6 < var5.tagCount(); ++var6) {
+ NBTTagCompound var7 = (NBTTagCompound)var5.tagAt(var6);
+ Entity var8 = EntityList.createEntityFromNBT(var7, var0);
+ var4.hasEntities = true;
+ if(var8 != null) {
+ var4.addEntity(var8);
+ }
+ }
+ }
+
+ NBTTagList var10 = var1.getTagList("TileEntities");
+ if(var10 != null) {
+ for(int var11 = 0; var11 < var10.tagCount(); ++var11) {
+ NBTTagCompound var12 = (NBTTagCompound)var10.tagAt(var11);
+ TileEntity var9 = TileEntity.createAndLoadEntity(var12);
+ if(var9 != null) {
+ var4.func_1001_a(var9);
+ }
+ }
+ }
+
+ return var4;
+ }
+
+ public void func_814_a() {
+ }
+
+ public void saveExtraData() {
+ }
+
+ public void saveExtraChunkData(World var1, Chunk var2) throws IOException {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkPosition.java b/src/main/java/net/minecraft/src/ChunkPosition.java
new file mode 100644
index 0000000..8b19854
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkPosition.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class ChunkPosition {
+ public final int x;
+ public final int y;
+ public final int z;
+
+ public ChunkPosition(int var1, int var2, int var3) {
+ this.x = var1;
+ this.y = var2;
+ this.z = var3;
+ }
+
+ public boolean equals(Object var1) {
+ if(!(var1 instanceof ChunkPosition)) {
+ return false;
+ } else {
+ ChunkPosition var2 = (ChunkPosition)var1;
+ return var2.x == this.x && var2.y == this.y && var2.z == this.z;
+ }
+ }
+
+ public int hashCode() {
+ return this.x * 8976890 + this.y * 981131 + this.z;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkProviderClient.java b/src/main/java/net/minecraft/src/ChunkProviderClient.java
new file mode 100644
index 0000000..491d7b2
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkProviderClient.java
@@ -0,0 +1,67 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ChunkProviderClient implements IChunkProvider {
+ private Chunk blankChunk;
+ private Map chunkMapping = new HashMap();
+ private List unusedChunkList = new ArrayList();
+ private World worldObj;
+
+ public ChunkProviderClient(World var1) {
+ this.blankChunk = new Chunk(var1, new byte[-Short.MIN_VALUE], 0, 0);
+ this.blankChunk.field_1524_q = true;
+ this.blankChunk.neverSave = true;
+ this.worldObj = var1;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ ChunkCoordinates var3 = new ChunkCoordinates(var1, var2);
+ return this.chunkMapping.containsKey(var3);
+ }
+
+ public void func_539_c(int var1, int var2) {
+ Chunk var3 = this.provideChunk(var1, var2);
+ if(!var3.field_1524_q) {
+ var3.onChunkUnload();
+ }
+
+ this.chunkMapping.remove(new ChunkCoordinates(var1, var2));
+ this.unusedChunkList.remove(var3);
+ }
+
+ public Chunk func_538_d(int var1, int var2) {
+ ChunkCoordinates var3 = new ChunkCoordinates(var1, var2);
+ byte[] var4 = new byte[-Short.MIN_VALUE];
+ Chunk var5 = new Chunk(this.worldObj, var4, var1, var2);
+ Arrays.fill(var5.skylightMap.data, (byte)-1);
+ this.chunkMapping.put(var3, var5);
+ var5.isChunkLoaded = true;
+ return var5;
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ ChunkCoordinates var3 = new ChunkCoordinates(var1, var2);
+ Chunk var4 = (Chunk)this.chunkMapping.get(var3);
+ return var4 == null ? this.blankChunk : var4;
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ return true;
+ }
+
+ public boolean func_532_a() {
+ return false;
+ }
+
+ public boolean func_536_b() {
+ return false;
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkProviderGenerate.java b/src/main/java/net/minecraft/src/ChunkProviderGenerate.java
new file mode 100644
index 0000000..2fd3056
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkProviderGenerate.java
@@ -0,0 +1,546 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class ChunkProviderGenerate implements IChunkProvider {
+ private Random rand;
+ private NoiseGeneratorOctaves field_912_k;
+ private NoiseGeneratorOctaves field_911_l;
+ private NoiseGeneratorOctaves field_910_m;
+ private NoiseGeneratorOctaves field_909_n;
+ private NoiseGeneratorOctaves field_908_o;
+ public NoiseGeneratorOctaves field_922_a;
+ public NoiseGeneratorOctaves field_921_b;
+ public NoiseGeneratorOctaves field_920_c;
+ private World worldObj;
+ private double[] field_4180_q;
+ private double[] field_905_r = new double[256];
+ private double[] field_904_s = new double[256];
+ private double[] field_903_t = new double[256];
+ private MapGenBase field_902_u = new MapGenCaves();
+ private MobSpawnerBase[] biomesForGeneration;
+ double[] field_4185_d;
+ double[] field_4184_e;
+ double[] field_4183_f;
+ double[] field_4182_g;
+ double[] field_4181_h;
+ int[][] field_914_i = new int[32][32];
+ private double[] field_4178_w;
+
+ public ChunkProviderGenerate(World var1, long var2) {
+ this.worldObj = var1;
+ this.rand = new Random(var2);
+ this.field_912_k = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_911_l = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_910_m = new NoiseGeneratorOctaves(this.rand, 8);
+ this.field_909_n = new NoiseGeneratorOctaves(this.rand, 4);
+ this.field_908_o = new NoiseGeneratorOctaves(this.rand, 4);
+ this.field_922_a = new NoiseGeneratorOctaves(this.rand, 10);
+ this.field_921_b = new NoiseGeneratorOctaves(this.rand, 16);
+ this.field_920_c = new NoiseGeneratorOctaves(this.rand, 8);
+ }
+
+ public void generateTerrain(int var1, int var2, byte[] var3, MobSpawnerBase[] var4, double[] var5) {
+ byte var6 = 4;
+ byte var7 = 64;
+ int var8 = var6 + 1;
+ byte var9 = 17;
+ int var10 = var6 + 1;
+ this.field_4180_q = this.func_4061_a(this.field_4180_q, var1 * var6, 0, var2 * var6, var8, var9, var10);
+
+ for(int var11 = 0; var11 < var6; ++var11) {
+ for(int var12 = 0; var12 < var6; ++var12) {
+ for(int var13 = 0; var13 < 16; ++var13) {
+ double var14 = 0.125D;
+ double var16 = this.field_4180_q[((var11 + 0) * var10 + var12 + 0) * var9 + var13 + 0];
+ double var18 = this.field_4180_q[((var11 + 0) * var10 + var12 + 1) * var9 + var13 + 0];
+ double var20 = this.field_4180_q[((var11 + 1) * var10 + var12 + 0) * var9 + var13 + 0];
+ double var22 = this.field_4180_q[((var11 + 1) * var10 + var12 + 1) * var9 + var13 + 0];
+ double var24 = (this.field_4180_q[((var11 + 0) * var10 + var12 + 0) * var9 + var13 + 1] - var16) * var14;
+ double var26 = (this.field_4180_q[((var11 + 0) * var10 + var12 + 1) * var9 + var13 + 1] - var18) * var14;
+ double var28 = (this.field_4180_q[((var11 + 1) * var10 + var12 + 0) * var9 + var13 + 1] - var20) * var14;
+ double var30 = (this.field_4180_q[((var11 + 1) * var10 + var12 + 1) * var9 + var13 + 1] - var22) * var14;
+
+ for(int var32 = 0; var32 < 8; ++var32) {
+ double var33 = 0.25D;
+ double var35 = var16;
+ double var37 = var18;
+ double var39 = (var20 - var16) * var33;
+ double var41 = (var22 - var18) * var33;
+
+ for(int var43 = 0; var43 < 4; ++var43) {
+ int var44 = var43 + var11 * 4 << 11 | 0 + var12 * 4 << 7 | var13 * 8 + var32;
+ short var45 = 128;
+ double var46 = 0.25D;
+ double var48 = var35;
+ double var50 = (var37 - var35) * var46;
+
+ for(int var52 = 0; var52 < 4; ++var52) {
+ double var53 = var5[(var11 * 4 + var43) * 16 + var12 * 4 + var52];
+ int var55 = 0;
+ if(var13 * 8 + var32 < var7) {
+ if(var53 < 0.5D && var13 * 8 + var32 >= var7 - 1) {
+ var55 = Block.blockIce.blockID;
+ } else {
+ var55 = Block.waterMoving.blockID;
+ }
+ }
+
+ if(var48 > 0.0D) {
+ var55 = Block.stone.blockID;
+ }
+
+ var3[var44] = (byte)var55;
+ var44 += var45;
+ var48 += var50;
+ }
+
+ var35 += var39;
+ var37 += var41;
+ }
+
+ var16 += var24;
+ var18 += var26;
+ var20 += var28;
+ var22 += var30;
+ }
+ }
+ }
+ }
+
+ }
+
+ public void replaceBlocksForBiome(int var1, int var2, byte[] var3, MobSpawnerBase[] var4) {
+ byte var5 = 64;
+ double var6 = 1.0D / 32.0D;
+ this.field_905_r = this.field_909_n.func_807_a(this.field_905_r, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var6, var6, 1.0D);
+ this.field_904_s = this.field_909_n.func_807_a(this.field_904_s, (double)(var2 * 16), 109.0134D, (double)(var1 * 16), 16, 1, 16, var6, 1.0D, var6);
+ this.field_903_t = this.field_908_o.func_807_a(this.field_903_t, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var6 * 2.0D, var6 * 2.0D, var6 * 2.0D);
+
+ for(int var8 = 0; var8 < 16; ++var8) {
+ for(int var9 = 0; var9 < 16; ++var9) {
+ MobSpawnerBase var10 = var4[var8 * 16 + var9];
+ boolean var11 = this.field_905_r[var8 + var9 * 16] + this.rand.nextDouble() * 0.2D > 0.0D;
+ boolean var12 = this.field_904_s[var8 + var9 * 16] + this.rand.nextDouble() * 0.2D > 3.0D;
+ int var13 = (int)(this.field_903_t[var8 + var9 * 16] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D);
+ int var14 = -1;
+ byte var15 = var10.topBlock;
+ byte var16 = var10.fillerBlock;
+
+ for(int var17 = 127; var17 >= 0; --var17) {
+ int var18 = (var8 * 16 + var9) * 128 + var17;
+ if(var17 <= 0 + this.rand.nextInt(5)) {
+ var3[var18] = (byte)Block.bedrock.blockID;
+ } else {
+ byte var19 = var3[var18];
+ if(var19 == 0) {
+ var14 = -1;
+ } else if(var19 == Block.stone.blockID) {
+ if(var14 == -1) {
+ if(var13 <= 0) {
+ var15 = 0;
+ var16 = (byte)Block.stone.blockID;
+ } else if(var17 >= var5 - 4 && var17 <= var5 + 1) {
+ var15 = var10.topBlock;
+ var16 = var10.fillerBlock;
+ if(var12) {
+ var15 = 0;
+ }
+
+ if(var12) {
+ var16 = (byte)Block.gravel.blockID;
+ }
+
+ if(var11) {
+ var15 = (byte)Block.sand.blockID;
+ }
+
+ if(var11) {
+ var16 = (byte)Block.sand.blockID;
+ }
+ }
+
+ if(var17 < var5 && var15 == 0) {
+ var15 = (byte)Block.waterMoving.blockID;
+ }
+
+ var14 = var13;
+ if(var17 >= var5 - 1) {
+ var3[var18] = var15;
+ } else {
+ var3[var18] = var16;
+ }
+ } else if(var14 > 0) {
+ --var14;
+ var3[var18] = var16;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ this.rand.setSeed((long)var1 * 341873128712L + (long)var2 * 132897987541L);
+ byte[] var3 = new byte[-Short.MIN_VALUE];
+ Chunk var4 = new Chunk(this.worldObj, var3, var1, var2);
+ this.biomesForGeneration = this.worldObj.func_4075_a().loadBlockGeneratorData(this.biomesForGeneration, var1 * 16, var2 * 16, 16, 16);
+ double[] var5 = this.worldObj.func_4075_a().temperature;
+ this.generateTerrain(var1, var2, var3, this.biomesForGeneration, var5);
+ this.replaceBlocksForBiome(var1, var2, var3, this.biomesForGeneration);
+ this.field_902_u.func_867_a(this, this.worldObj, var1, var2, var3);
+ var4.func_1024_c();
+ return var4;
+ }
+
+ private double[] func_4061_a(double[] var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ if(var1 == null) {
+ var1 = new double[var5 * var6 * var7];
+ }
+
+ double var8 = 684.412D;
+ double var10 = 684.412D;
+ double[] var12 = this.worldObj.func_4075_a().temperature;
+ double[] var13 = this.worldObj.func_4075_a().humidity;
+ this.field_4182_g = this.field_922_a.func_4109_a(this.field_4182_g, var2, var4, var5, var7, 1.121D, 1.121D, 0.5D);
+ this.field_4181_h = this.field_921_b.func_4109_a(this.field_4181_h, var2, var4, var5, var7, 200.0D, 200.0D, 0.5D);
+ this.field_4185_d = this.field_910_m.func_807_a(this.field_4185_d, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8 / 80.0D, var10 / 160.0D, var8 / 80.0D);
+ this.field_4184_e = this.field_912_k.func_807_a(this.field_4184_e, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ this.field_4183_f = this.field_911_l.func_807_a(this.field_4183_f, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ int var14 = 0;
+ int var15 = 0;
+ int var16 = 16 / var5;
+
+ for(int var17 = 0; var17 < var5; ++var17) {
+ int var18 = var17 * var16 + var16 / 2;
+
+ for(int var19 = 0; var19 < var7; ++var19) {
+ int var20 = var19 * var16 + var16 / 2;
+ double var21 = var12[var18 * 16 + var20];
+ double var23 = var13[var18 * 16 + var20] * var21;
+ double var25 = 1.0D - var23;
+ var25 *= var25;
+ var25 *= var25;
+ var25 = 1.0D - var25;
+ double var27 = (this.field_4182_g[var15] + 256.0D) / 512.0D;
+ var27 *= var25;
+ if(var27 > 1.0D) {
+ var27 = 1.0D;
+ }
+
+ double var29 = this.field_4181_h[var15] / 8000.0D;
+ if(var29 < 0.0D) {
+ var29 = -var29 * 0.3D;
+ }
+
+ var29 = var29 * 3.0D - 2.0D;
+ if(var29 < 0.0D) {
+ var29 /= 2.0D;
+ if(var29 < -1.0D) {
+ var29 = -1.0D;
+ }
+
+ var29 /= 1.4D;
+ var29 /= 2.0D;
+ var27 = 0.0D;
+ } else {
+ if(var29 > 1.0D) {
+ var29 = 1.0D;
+ }
+
+ var29 /= 8.0D;
+ }
+
+ if(var27 < 0.0D) {
+ var27 = 0.0D;
+ }
+
+ var27 += 0.5D;
+ var29 = var29 * (double)var6 / 16.0D;
+ double var31 = (double)var6 / 2.0D + var29 * 4.0D;
+ ++var15;
+
+ for(int var33 = 0; var33 < var6; ++var33) {
+ double var34 = 0.0D;
+ double var36 = ((double)var33 - var31) * 12.0D / var27;
+ if(var36 < 0.0D) {
+ var36 *= 4.0D;
+ }
+
+ double var38 = this.field_4184_e[var14] / 512.0D;
+ double var40 = this.field_4183_f[var14] / 512.0D;
+ double var42 = (this.field_4185_d[var14] / 10.0D + 1.0D) / 2.0D;
+ if(var42 < 0.0D) {
+ var34 = var38;
+ } else if(var42 > 1.0D) {
+ var34 = var40;
+ } else {
+ var34 = var38 + (var40 - var38) * var42;
+ }
+
+ var34 -= var36;
+ if(var33 > var6 - 4) {
+ double var44 = (double)((float)(var33 - (var6 - 4)) / 3.0F);
+ var34 = var34 * (1.0D - var44) + -10.0D * var44;
+ }
+
+ var1[var14] = var34;
+ ++var14;
+ }
+ }
+ }
+
+ return var1;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ return true;
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ BlockSand.fallInstantly = true;
+ int var4 = var2 * 16;
+ int var5 = var3 * 16;
+ MobSpawnerBase var6 = this.worldObj.func_4075_a().func_4073_a(var4 + 16, var5 + 16);
+ this.rand.setSeed(this.worldObj.randomSeed);
+ long var7 = this.rand.nextLong() / 2L * 2L + 1L;
+ long var9 = this.rand.nextLong() / 2L * 2L + 1L;
+ this.rand.setSeed((long)var2 * var7 + (long)var3 * var9 ^ this.worldObj.randomSeed);
+ double var11 = 0.25D;
+ int var13;
+ int var14;
+ int var15;
+ if(this.rand.nextInt(4) == 0) {
+ var13 = var4 + this.rand.nextInt(16) + 8;
+ var14 = this.rand.nextInt(128);
+ var15 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenLakes(Block.waterMoving.blockID)).generate(this.worldObj, this.rand, var13, var14, var15);
+ }
+
+ if(this.rand.nextInt(8) == 0) {
+ var13 = var4 + this.rand.nextInt(16) + 8;
+ var14 = this.rand.nextInt(this.rand.nextInt(120) + 8);
+ var15 = var5 + this.rand.nextInt(16) + 8;
+ if(var14 < 64 || this.rand.nextInt(10) == 0) {
+ (new WorldGenLakes(Block.lavaMoving.blockID)).generate(this.worldObj, this.rand, var13, var14, var15);
+ }
+ }
+
+ int var16;
+ for(var13 = 0; var13 < 8; ++var13) {
+ var14 = var4 + this.rand.nextInt(16) + 8;
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenDungeons()).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 10; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenClay(32)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.dirt.blockID, 32)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 10; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.gravel.blockID, 32)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(128);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreCoal.blockID, 16)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 20; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(64);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreIron.blockID, 8)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 2; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(32);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreGold.blockID, 8)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 8; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(16);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreRedstone.blockID, 7)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ for(var13 = 0; var13 < 1; ++var13) {
+ var14 = var4 + this.rand.nextInt(16);
+ var15 = this.rand.nextInt(16);
+ var16 = var5 + this.rand.nextInt(16);
+ (new WorldGenMinable(Block.oreDiamond.blockID, 7)).generate(this.worldObj, this.rand, var14, var15, var16);
+ }
+
+ var11 = 0.5D;
+ var13 = (int)((this.field_920_c.func_806_a((double)var4 * var11, (double)var5 * var11) / 8.0D + this.rand.nextDouble() * 4.0D + 4.0D) / 3.0D);
+ var14 = 0;
+ if(this.rand.nextInt(10) == 0) {
+ ++var14;
+ }
+
+ if(var6 == MobSpawnerBase.forest) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == MobSpawnerBase.rainforest) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == MobSpawnerBase.seasonalForest) {
+ var14 += var13 + 2;
+ }
+
+ if(var6 == MobSpawnerBase.taiga) {
+ var14 += var13 + 5;
+ }
+
+ if(var6 == MobSpawnerBase.desert) {
+ var14 -= 20;
+ }
+
+ if(var6 == MobSpawnerBase.tundra) {
+ var14 -= 20;
+ }
+
+ if(var6 == MobSpawnerBase.plains) {
+ var14 -= 20;
+ }
+
+ Object var24 = new WorldGenTrees();
+ if(this.rand.nextInt(10) == 0) {
+ var24 = new WorldGenBigTree();
+ }
+
+ if(var6 == MobSpawnerBase.rainforest && this.rand.nextInt(3) == 0) {
+ var24 = new WorldGenBigTree();
+ }
+
+ int var17;
+ int var18;
+ for(var16 = 0; var16 < var14; ++var16) {
+ var17 = var4 + this.rand.nextInt(16) + 8;
+ var18 = var5 + this.rand.nextInt(16) + 8;
+ ((WorldGenerator)var24).func_517_a(1.0D, 1.0D, 1.0D);
+ ((WorldGenerator)var24).generate(this.worldObj, this.rand, var17, this.worldObj.getHeightValue(var17, var18), var18);
+ }
+
+ int var19;
+ for(var16 = 0; var16 < 2; ++var16) {
+ var17 = var4 + this.rand.nextInt(16) + 8;
+ var18 = this.rand.nextInt(128);
+ var19 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.plantYellow.blockID)).generate(this.worldObj, this.rand, var17, var18, var19);
+ }
+
+ if(this.rand.nextInt(2) == 0) {
+ var16 = var4 + this.rand.nextInt(16) + 8;
+ var17 = this.rand.nextInt(128);
+ var18 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.plantRed.blockID)).generate(this.worldObj, this.rand, var16, var17, var18);
+ }
+
+ if(this.rand.nextInt(4) == 0) {
+ var16 = var4 + this.rand.nextInt(16) + 8;
+ var17 = this.rand.nextInt(128);
+ var18 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.worldObj, this.rand, var16, var17, var18);
+ }
+
+ if(this.rand.nextInt(8) == 0) {
+ var16 = var4 + this.rand.nextInt(16) + 8;
+ var17 = this.rand.nextInt(128);
+ var18 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.worldObj, this.rand, var16, var17, var18);
+ }
+
+ for(var16 = 0; var16 < 10; ++var16) {
+ var17 = var4 + this.rand.nextInt(16) + 8;
+ var18 = this.rand.nextInt(128);
+ var19 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenReed()).generate(this.worldObj, this.rand, var17, var18, var19);
+ }
+
+ if(this.rand.nextInt(32) == 0) {
+ var16 = var4 + this.rand.nextInt(16) + 8;
+ var17 = this.rand.nextInt(128);
+ var18 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenPumpkin()).generate(this.worldObj, this.rand, var16, var17, var18);
+ }
+
+ var16 = 0;
+ if(var6 == MobSpawnerBase.desert) {
+ var16 += 10;
+ }
+
+ int var20;
+ for(var17 = 0; var17 < var16; ++var17) {
+ var18 = var4 + this.rand.nextInt(16) + 8;
+ var19 = this.rand.nextInt(128);
+ var20 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenCactus()).generate(this.worldObj, this.rand, var18, var19, var20);
+ }
+
+ for(var17 = 0; var17 < 50; ++var17) {
+ var18 = var4 + this.rand.nextInt(16) + 8;
+ var19 = this.rand.nextInt(this.rand.nextInt(120) + 8);
+ var20 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenLiquids(Block.waterStill.blockID)).generate(this.worldObj, this.rand, var18, var19, var20);
+ }
+
+ for(var17 = 0; var17 < 20; ++var17) {
+ var18 = var4 + this.rand.nextInt(16) + 8;
+ var19 = this.rand.nextInt(this.rand.nextInt(this.rand.nextInt(112) + 8) + 8);
+ var20 = var5 + this.rand.nextInt(16) + 8;
+ (new WorldGenLiquids(Block.lavaStill.blockID)).generate(this.worldObj, this.rand, var18, var19, var20);
+ }
+
+ this.field_4178_w = this.worldObj.func_4075_a().getTemperatures(this.field_4178_w, var4 + 8, var5 + 8, 16, 16);
+
+ for(var17 = var4 + 8; var17 < var4 + 8 + 16; ++var17) {
+ for(var18 = var5 + 8; var18 < var5 + 8 + 16; ++var18) {
+ var19 = var17 - (var4 + 8);
+ var20 = var18 - (var5 + 8);
+ int var21 = this.worldObj.func_4083_e(var17, var18);
+ double var22 = this.field_4178_w[var19 * 16 + var20] - (double)(var21 - 64) / 64.0D * 0.3D;
+ if(var22 < 0.5D && var21 > 0 && var21 < 128 && this.worldObj.getBlockId(var17, var21, var18) == 0 && this.worldObj.getBlockMaterial(var17, var21 - 1, var18).func_880_c() && this.worldObj.getBlockMaterial(var17, var21 - 1, var18) != Material.ice) {
+ this.worldObj.setBlockWithNotify(var17, var21, var18, Block.snow.blockID);
+ }
+ }
+ }
+
+ BlockSand.fallInstantly = false;
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ return true;
+ }
+
+ public boolean func_532_a() {
+ return false;
+ }
+
+ public boolean func_536_b() {
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkProviderHell.java b/src/main/java/net/minecraft/src/ChunkProviderHell.java
new file mode 100644
index 0000000..cf1ac9a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkProviderHell.java
@@ -0,0 +1,370 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class ChunkProviderHell implements IChunkProvider {
+ private Random field_4170_h;
+ private NoiseGeneratorOctaves field_4169_i;
+ private NoiseGeneratorOctaves field_4168_j;
+ private NoiseGeneratorOctaves field_4167_k;
+ private NoiseGeneratorOctaves field_4166_l;
+ private NoiseGeneratorOctaves field_4165_m;
+ public NoiseGeneratorOctaves field_4177_a;
+ public NoiseGeneratorOctaves field_4176_b;
+ private World field_4164_n;
+ private double[] field_4163_o;
+ private double[] field_4162_p = new double[256];
+ private double[] field_4161_q = new double[256];
+ private double[] field_4160_r = new double[256];
+ private MapGenBase field_4159_s = new MapGenCavesHell();
+ double[] field_4175_c;
+ double[] field_4174_d;
+ double[] field_4173_e;
+ double[] field_4172_f;
+ double[] field_4171_g;
+
+ public ChunkProviderHell(World var1, long var2) {
+ this.field_4164_n = var1;
+ this.field_4170_h = new Random(var2);
+ this.field_4169_i = new NoiseGeneratorOctaves(this.field_4170_h, 16);
+ this.field_4168_j = new NoiseGeneratorOctaves(this.field_4170_h, 16);
+ this.field_4167_k = new NoiseGeneratorOctaves(this.field_4170_h, 8);
+ this.field_4166_l = new NoiseGeneratorOctaves(this.field_4170_h, 4);
+ this.field_4165_m = new NoiseGeneratorOctaves(this.field_4170_h, 4);
+ this.field_4177_a = new NoiseGeneratorOctaves(this.field_4170_h, 10);
+ this.field_4176_b = new NoiseGeneratorOctaves(this.field_4170_h, 16);
+ }
+
+ public void func_4059_a(int var1, int var2, byte[] var3) {
+ byte var4 = 4;
+ byte var5 = 32;
+ int var6 = var4 + 1;
+ byte var7 = 17;
+ int var8 = var4 + 1;
+ this.field_4163_o = this.func_4057_a(this.field_4163_o, var1 * var4, 0, var2 * var4, var6, var7, var8);
+
+ for(int var9 = 0; var9 < var4; ++var9) {
+ for(int var10 = 0; var10 < var4; ++var10) {
+ for(int var11 = 0; var11 < 16; ++var11) {
+ double var12 = 0.125D;
+ double var14 = this.field_4163_o[((var9 + 0) * var8 + var10 + 0) * var7 + var11 + 0];
+ double var16 = this.field_4163_o[((var9 + 0) * var8 + var10 + 1) * var7 + var11 + 0];
+ double var18 = this.field_4163_o[((var9 + 1) * var8 + var10 + 0) * var7 + var11 + 0];
+ double var20 = this.field_4163_o[((var9 + 1) * var8 + var10 + 1) * var7 + var11 + 0];
+ double var22 = (this.field_4163_o[((var9 + 0) * var8 + var10 + 0) * var7 + var11 + 1] - var14) * var12;
+ double var24 = (this.field_4163_o[((var9 + 0) * var8 + var10 + 1) * var7 + var11 + 1] - var16) * var12;
+ double var26 = (this.field_4163_o[((var9 + 1) * var8 + var10 + 0) * var7 + var11 + 1] - var18) * var12;
+ double var28 = (this.field_4163_o[((var9 + 1) * var8 + var10 + 1) * var7 + var11 + 1] - var20) * var12;
+
+ for(int var30 = 0; var30 < 8; ++var30) {
+ double var31 = 0.25D;
+ double var33 = var14;
+ double var35 = var16;
+ double var37 = (var18 - var14) * var31;
+ double var39 = (var20 - var16) * var31;
+
+ for(int var41 = 0; var41 < 4; ++var41) {
+ int var42 = var41 + var9 * 4 << 11 | 0 + var10 * 4 << 7 | var11 * 8 + var30;
+ short var43 = 128;
+ double var44 = 0.25D;
+ double var46 = var33;
+ double var48 = (var35 - var33) * var44;
+
+ for(int var50 = 0; var50 < 4; ++var50) {
+ int var51 = 0;
+ if(var11 * 8 + var30 < var5) {
+ var51 = Block.lavaMoving.blockID;
+ }
+
+ if(var46 > 0.0D) {
+ var51 = Block.bloodStone.blockID;
+ }
+
+ var3[var42] = (byte)var51;
+ var42 += var43;
+ var46 += var48;
+ }
+
+ var33 += var37;
+ var35 += var39;
+ }
+
+ var14 += var22;
+ var16 += var24;
+ var18 += var26;
+ var20 += var28;
+ }
+ }
+ }
+ }
+
+ }
+
+ public void func_4058_b(int var1, int var2, byte[] var3) {
+ byte var4 = 64;
+ double var5 = 1.0D / 32.0D;
+ this.field_4162_p = this.field_4166_l.func_807_a(this.field_4162_p, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var5, var5, 1.0D);
+ this.field_4161_q = this.field_4166_l.func_807_a(this.field_4161_q, (double)(var2 * 16), 109.0134D, (double)(var1 * 16), 16, 1, 16, var5, 1.0D, var5);
+ this.field_4160_r = this.field_4165_m.func_807_a(this.field_4160_r, (double)(var1 * 16), (double)(var2 * 16), 0.0D, 16, 16, 1, var5 * 2.0D, var5 * 2.0D, var5 * 2.0D);
+
+ for(int var7 = 0; var7 < 16; ++var7) {
+ for(int var8 = 0; var8 < 16; ++var8) {
+ boolean var9 = this.field_4162_p[var7 + var8 * 16] + this.field_4170_h.nextDouble() * 0.2D > 0.0D;
+ boolean var10 = this.field_4161_q[var7 + var8 * 16] + this.field_4170_h.nextDouble() * 0.2D > 0.0D;
+ int var11 = (int)(this.field_4160_r[var7 + var8 * 16] / 3.0D + 3.0D + this.field_4170_h.nextDouble() * 0.25D);
+ int var12 = -1;
+ byte var13 = (byte)Block.bloodStone.blockID;
+ byte var14 = (byte)Block.bloodStone.blockID;
+
+ for(int var15 = 127; var15 >= 0; --var15) {
+ int var16 = (var7 * 16 + var8) * 128 + var15;
+ if(var15 >= 127 - this.field_4170_h.nextInt(5)) {
+ var3[var16] = (byte)Block.bedrock.blockID;
+ } else if(var15 <= 0 + this.field_4170_h.nextInt(5)) {
+ var3[var16] = (byte)Block.bedrock.blockID;
+ } else {
+ byte var17 = var3[var16];
+ if(var17 == 0) {
+ var12 = -1;
+ } else if(var17 == Block.bloodStone.blockID) {
+ if(var12 == -1) {
+ if(var11 <= 0) {
+ var13 = 0;
+ var14 = (byte)Block.bloodStone.blockID;
+ } else if(var15 >= var4 - 4 && var15 <= var4 + 1) {
+ var13 = (byte)Block.bloodStone.blockID;
+ var14 = (byte)Block.bloodStone.blockID;
+ if(var10) {
+ var13 = (byte)Block.gravel.blockID;
+ }
+
+ if(var10) {
+ var14 = (byte)Block.bloodStone.blockID;
+ }
+
+ if(var9) {
+ var13 = (byte)Block.slowSand.blockID;
+ }
+
+ if(var9) {
+ var14 = (byte)Block.slowSand.blockID;
+ }
+ }
+
+ if(var15 < var4 && var13 == 0) {
+ var13 = (byte)Block.lavaMoving.blockID;
+ }
+
+ var12 = var11;
+ if(var15 >= var4 - 1) {
+ var3[var16] = var13;
+ } else {
+ var3[var16] = var14;
+ }
+ } else if(var12 > 0) {
+ --var12;
+ var3[var16] = var14;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ this.field_4170_h.setSeed((long)var1 * 341873128712L + (long)var2 * 132897987541L);
+ byte[] var3 = new byte[-Short.MIN_VALUE];
+ this.func_4059_a(var1, var2, var3);
+ this.func_4058_b(var1, var2, var3);
+ this.field_4159_s.func_867_a(this, this.field_4164_n, var1, var2, var3);
+ Chunk var4 = new Chunk(this.field_4164_n, var3, var1, var2);
+ var4.func_1024_c();
+ var4.func_4143_d();
+ return var4;
+ }
+
+ private double[] func_4057_a(double[] var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ if(var1 == null) {
+ var1 = new double[var5 * var6 * var7];
+ }
+
+ double var8 = 684.412D;
+ double var10 = 2053.236D;
+ this.field_4172_f = this.field_4177_a.func_807_a(this.field_4172_f, (double)var2, (double)var3, (double)var4, var5, 1, var7, 1.0D, 0.0D, 1.0D);
+ this.field_4171_g = this.field_4176_b.func_807_a(this.field_4171_g, (double)var2, (double)var3, (double)var4, var5, 1, var7, 100.0D, 0.0D, 100.0D);
+ this.field_4175_c = this.field_4167_k.func_807_a(this.field_4175_c, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8 / 80.0D, var10 / 60.0D, var8 / 80.0D);
+ this.field_4174_d = this.field_4169_i.func_807_a(this.field_4174_d, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ this.field_4173_e = this.field_4168_j.func_807_a(this.field_4173_e, (double)var2, (double)var3, (double)var4, var5, var6, var7, var8, var10, var8);
+ int var12 = 0;
+ int var13 = 0;
+ double[] var14 = new double[var6];
+
+ int var15;
+ for(var15 = 0; var15 < var6; ++var15) {
+ var14[var15] = Math.cos((double)var15 * Math.PI * 6.0D / (double)var6) * 2.0D;
+ double var16 = (double)var15;
+ if(var15 > var6 / 2) {
+ var16 = (double)(var6 - 1 - var15);
+ }
+
+ if(var16 < 4.0D) {
+ var16 = 4.0D - var16;
+ var14[var15] -= var16 * var16 * var16 * 10.0D;
+ }
+ }
+
+ for(var15 = 0; var15 < var5; ++var15) {
+ for(int var36 = 0; var36 < var7; ++var36) {
+ double var17 = (this.field_4172_f[var13] + 256.0D) / 512.0D;
+ if(var17 > 1.0D) {
+ var17 = 1.0D;
+ }
+
+ double var19 = 0.0D;
+ double var21 = this.field_4171_g[var13] / 8000.0D;
+ if(var21 < 0.0D) {
+ var21 = -var21;
+ }
+
+ var21 = var21 * 3.0D - 3.0D;
+ if(var21 < 0.0D) {
+ var21 /= 2.0D;
+ if(var21 < -1.0D) {
+ var21 = -1.0D;
+ }
+
+ var21 /= 1.4D;
+ var21 /= 2.0D;
+ var17 = 0.0D;
+ } else {
+ if(var21 > 1.0D) {
+ var21 = 1.0D;
+ }
+
+ var21 /= 6.0D;
+ }
+
+ var17 += 0.5D;
+ var21 = var21 * (double)var6 / 16.0D;
+ ++var13;
+
+ for(int var23 = 0; var23 < var6; ++var23) {
+ double var24 = 0.0D;
+ double var26 = var14[var23];
+ double var28 = this.field_4174_d[var12] / 512.0D;
+ double var30 = this.field_4173_e[var12] / 512.0D;
+ double var32 = (this.field_4175_c[var12] / 10.0D + 1.0D) / 2.0D;
+ if(var32 < 0.0D) {
+ var24 = var28;
+ } else if(var32 > 1.0D) {
+ var24 = var30;
+ } else {
+ var24 = var28 + (var30 - var28) * var32;
+ }
+
+ var24 -= var26;
+ double var34;
+ if(var23 > var6 - 4) {
+ var34 = (double)((float)(var23 - (var6 - 4)) / 3.0F);
+ var24 = var24 * (1.0D - var34) + -10.0D * var34;
+ }
+
+ if((double)var23 < var19) {
+ var34 = (var19 - (double)var23) / 4.0D;
+ if(var34 < 0.0D) {
+ var34 = 0.0D;
+ }
+
+ if(var34 > 1.0D) {
+ var34 = 1.0D;
+ }
+
+ var24 = var24 * (1.0D - var34) + -10.0D * var34;
+ }
+
+ var1[var12] = var24;
+ ++var12;
+ }
+ }
+ }
+
+ return var1;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ return true;
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ BlockSand.fallInstantly = true;
+ int var4 = var2 * 16;
+ int var5 = var3 * 16;
+
+ int var6;
+ int var7;
+ int var8;
+ int var9;
+ for(var6 = 0; var6 < 8; ++var6) {
+ var7 = var4 + this.field_4170_h.nextInt(16) + 8;
+ var8 = this.field_4170_h.nextInt(120) + 4;
+ var9 = var5 + this.field_4170_h.nextInt(16) + 8;
+ (new WorldGenHellLava(Block.lavaStill.blockID)).generate(this.field_4164_n, this.field_4170_h, var7, var8, var9);
+ }
+
+ var6 = this.field_4170_h.nextInt(this.field_4170_h.nextInt(10) + 1) + 1;
+
+ int var10;
+ for(var7 = 0; var7 < var6; ++var7) {
+ var8 = var4 + this.field_4170_h.nextInt(16) + 8;
+ var9 = this.field_4170_h.nextInt(120) + 4;
+ var10 = var5 + this.field_4170_h.nextInt(16) + 8;
+ (new WorldGenFire()).generate(this.field_4164_n, this.field_4170_h, var8, var9, var10);
+ }
+
+ var6 = this.field_4170_h.nextInt(this.field_4170_h.nextInt(10) + 1);
+
+ for(var7 = 0; var7 < var6; ++var7) {
+ var8 = var4 + this.field_4170_h.nextInt(16) + 8;
+ var9 = this.field_4170_h.nextInt(120) + 4;
+ var10 = var5 + this.field_4170_h.nextInt(16) + 8;
+ (new WorldGenLightStone1()).generate(this.field_4164_n, this.field_4170_h, var8, var9, var10);
+ }
+
+ for(var7 = 0; var7 < 10; ++var7) {
+ var8 = var4 + this.field_4170_h.nextInt(16) + 8;
+ var9 = this.field_4170_h.nextInt(128);
+ var10 = var5 + this.field_4170_h.nextInt(16) + 8;
+ (new WorldGenLightStone2()).generate(this.field_4164_n, this.field_4170_h, var8, var9, var10);
+ }
+
+ if(this.field_4170_h.nextInt(1) == 0) {
+ var7 = var4 + this.field_4170_h.nextInt(16) + 8;
+ var8 = this.field_4170_h.nextInt(128);
+ var9 = var5 + this.field_4170_h.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.field_4164_n, this.field_4170_h, var7, var8, var9);
+ }
+
+ if(this.field_4170_h.nextInt(1) == 0) {
+ var7 = var4 + this.field_4170_h.nextInt(16) + 8;
+ var8 = this.field_4170_h.nextInt(128);
+ var9 = var5 + this.field_4170_h.nextInt(16) + 8;
+ (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.field_4164_n, this.field_4170_h, var7, var8, var9);
+ }
+
+ BlockSand.fallInstantly = false;
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ return true;
+ }
+
+ public boolean func_532_a() {
+ return false;
+ }
+
+ public boolean func_536_b() {
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkProviderIso.java b/src/main/java/net/minecraft/src/ChunkProviderIso.java
new file mode 100644
index 0000000..76a51c5
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkProviderIso.java
@@ -0,0 +1,66 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+
+public class ChunkProviderIso implements IChunkProvider {
+ private Chunk[] chunks = new Chunk[256];
+ private World worldObj;
+ private IChunkLoader chunkLoader;
+ byte[] field_899_a = new byte[-Short.MIN_VALUE];
+
+ public ChunkProviderIso(World var1, IChunkLoader var2) {
+ this.worldObj = var1;
+ this.chunkLoader = var2;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ int var3 = var1 & 15 | (var2 & 15) * 16;
+ return this.chunks[var3] != null && this.chunks[var3].isAtLocation(var1, var2);
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ int var3 = var1 & 15 | (var2 & 15) * 16;
+
+ try {
+ if(!this.chunkExists(var1, var2)) {
+ Chunk var4 = this.func_543_c(var1, var2);
+ if(var4 == null) {
+ var4 = new Chunk(this.worldObj, this.field_899_a, var1, var2);
+ var4.field_1524_q = true;
+ var4.neverSave = true;
+ }
+
+ this.chunks[var3] = var4;
+ }
+
+ return this.chunks[var3];
+ } catch (Exception var5) {
+ var5.printStackTrace();
+ return null;
+ }
+ }
+
+ private synchronized Chunk func_543_c(int var1, int var2) {
+ try {
+ return this.chunkLoader.loadChunk(this.worldObj, var1, var2);
+ } catch (IOException var4) {
+ var4.printStackTrace();
+ return null;
+ }
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ return true;
+ }
+
+ public boolean func_532_a() {
+ return false;
+ }
+
+ public boolean func_536_b() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java b/src/main/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java
new file mode 100644
index 0000000..976c237
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ChunkProviderLoadOrGenerate.java
@@ -0,0 +1,201 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+
+public class ChunkProviderLoadOrGenerate implements IChunkProvider {
+ private Chunk blankChunk;
+ private IChunkProvider chunkProvider;
+ private IChunkLoader chunkLoader;
+ private Chunk[] chunks = new Chunk[1024];
+ private World worldObj;
+ int lastQueriedChunkXPos = -999999999;
+ int lastQueriedChunkZPos = -999999999;
+ private Chunk lastQueriedChunk;
+
+ public ChunkProviderLoadOrGenerate(World var1, IChunkLoader var2, IChunkProvider var3) {
+ this.blankChunk = new Chunk(var1, new byte[-Short.MIN_VALUE], 0, 0);
+ this.blankChunk.field_1524_q = true;
+ this.blankChunk.neverSave = true;
+ this.worldObj = var1;
+ this.chunkLoader = var2;
+ this.chunkProvider = var3;
+ }
+
+ public boolean chunkExists(int var1, int var2) {
+ if(var1 == this.lastQueriedChunkXPos && var2 == this.lastQueriedChunkZPos && this.lastQueriedChunk != null) {
+ return true;
+ } else {
+ int var3 = var1 & 31;
+ int var4 = var2 & 31;
+ int var5 = var3 + var4 * 32;
+ return this.chunks[var5] != null && (this.chunks[var5] == this.blankChunk || this.chunks[var5].isAtLocation(var1, var2));
+ }
+ }
+
+ public Chunk provideChunk(int var1, int var2) {
+ if(var1 == this.lastQueriedChunkXPos && var2 == this.lastQueriedChunkZPos && this.lastQueriedChunk != null) {
+ return this.lastQueriedChunk;
+ } else {
+ int var3 = var1 & 31;
+ int var4 = var2 & 31;
+ int var5 = var3 + var4 * 32;
+ if(!this.chunkExists(var1, var2)) {
+ if(this.chunks[var5] != null) {
+ this.chunks[var5].onChunkUnload();
+ this.saveChunk(this.chunks[var5]);
+ this.saveExtraChunkData(this.chunks[var5]);
+ }
+
+ Chunk var6 = this.func_542_c(var1, var2);
+ if(var6 == null) {
+ if(this.chunkProvider == null) {
+ var6 = this.blankChunk;
+ } else {
+ var6 = this.chunkProvider.provideChunk(var1, var2);
+ }
+ }
+
+ this.chunks[var5] = var6;
+ var6.func_4143_d();
+ if(this.chunks[var5] != null) {
+ this.chunks[var5].onChunkLoad();
+ }
+
+ if(!this.chunks[var5].isTerrainPopulated && this.chunkExists(var1 + 1, var2 + 1) && this.chunkExists(var1, var2 + 1) && this.chunkExists(var1 + 1, var2)) {
+ this.populate(this, var1, var2);
+ }
+
+ if(this.chunkExists(var1 - 1, var2) && !this.provideChunk(var1 - 1, var2).isTerrainPopulated && this.chunkExists(var1 - 1, var2 + 1) && this.chunkExists(var1, var2 + 1) && this.chunkExists(var1 - 1, var2)) {
+ this.populate(this, var1 - 1, var2);
+ }
+
+ if(this.chunkExists(var1, var2 - 1) && !this.provideChunk(var1, var2 - 1).isTerrainPopulated && this.chunkExists(var1 + 1, var2 - 1) && this.chunkExists(var1, var2 - 1) && this.chunkExists(var1 + 1, var2)) {
+ this.populate(this, var1, var2 - 1);
+ }
+
+ if(this.chunkExists(var1 - 1, var2 - 1) && !this.provideChunk(var1 - 1, var2 - 1).isTerrainPopulated && this.chunkExists(var1 - 1, var2 - 1) && this.chunkExists(var1, var2 - 1) && this.chunkExists(var1 - 1, var2)) {
+ this.populate(this, var1 - 1, var2 - 1);
+ }
+ }
+
+ this.lastQueriedChunkXPos = var1;
+ this.lastQueriedChunkZPos = var2;
+ this.lastQueriedChunk = this.chunks[var5];
+ return this.chunks[var5];
+ }
+ }
+
+ private Chunk func_542_c(int var1, int var2) {
+ if(this.chunkLoader == null) {
+ return null;
+ } else {
+ try {
+ Chunk var3 = this.chunkLoader.loadChunk(this.worldObj, var1, var2);
+ if(var3 != null) {
+ var3.lastSaveTime = this.worldObj.worldTime;
+ }
+
+ return var3;
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ return null;
+ }
+ }
+ }
+
+ private void saveExtraChunkData(Chunk var1) {
+ if(this.chunkLoader != null) {
+ try {
+ this.chunkLoader.saveExtraChunkData(this.worldObj, var1);
+ } catch (Exception var3) {
+ var3.printStackTrace();
+ }
+
+ }
+ }
+
+ private void saveChunk(Chunk var1) {
+ if(this.chunkLoader != null) {
+ try {
+ var1.lastSaveTime = this.worldObj.worldTime;
+ this.chunkLoader.saveChunk(this.worldObj, var1);
+ } catch (IOException var3) {
+ var3.printStackTrace();
+ }
+
+ }
+ }
+
+ public void populate(IChunkProvider var1, int var2, int var3) {
+ Chunk var4 = this.provideChunk(var2, var3);
+ if(!var4.isTerrainPopulated) {
+ var4.isTerrainPopulated = true;
+ if(this.chunkProvider != null) {
+ this.chunkProvider.populate(var1, var2, var3);
+ var4.setChunkModified();
+ }
+ }
+
+ }
+
+ public boolean saveChunks(boolean var1, IProgressUpdate var2) {
+ int var3 = 0;
+ int var4 = 0;
+ int var5;
+ if(var2 != null) {
+ for(var5 = 0; var5 < this.chunks.length; ++var5) {
+ if(this.chunks[var5] != null && this.chunks[var5].needsSaving(var1)) {
+ ++var4;
+ }
+ }
+ }
+
+ var5 = 0;
+
+ for(int var6 = 0; var6 < this.chunks.length; ++var6) {
+ if(this.chunks[var6] != null) {
+ if(var1 && !this.chunks[var6].neverSave) {
+ this.saveExtraChunkData(this.chunks[var6]);
+ }
+
+ if(this.chunks[var6].needsSaving(var1)) {
+ this.saveChunk(this.chunks[var6]);
+ this.chunks[var6].isModified = false;
+ ++var3;
+ if(var3 == 2 && !var1) {
+ return false;
+ }
+
+ if(var2 != null) {
+ ++var5;
+ if(var5 % 10 == 0) {
+ var2.setLoadingProgress(var5 * 100 / var4);
+ }
+ }
+ }
+ }
+ }
+
+ if(var1) {
+ if(this.chunkLoader == null) {
+ return true;
+ }
+
+ this.chunkLoader.saveExtraData();
+ }
+
+ return true;
+ }
+
+ public boolean func_532_a() {
+ if(this.chunkLoader != null) {
+ this.chunkLoader.func_814_a();
+ }
+
+ return this.chunkProvider.func_532_a();
+ }
+
+ public boolean func_536_b() {
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ClippingHelper.java b/src/main/java/net/minecraft/src/ClippingHelper.java
new file mode 100644
index 0000000..6940a40
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ClippingHelper.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class ClippingHelper {
+ public float[][] field_1688_a = new float[16][16];
+ public float[] field_1687_b = new float[16];
+ public float[] field_1690_c = new float[16];
+ public float[] field_1689_d = new float[16];
+
+ public boolean func_1152_a(double var1, double var3, double var5, double var7, double var9, double var11) {
+ for(int var13 = 0; var13 < 6; ++var13) {
+ if((double)this.field_1688_a[var13][0] * var1 + (double)this.field_1688_a[var13][1] * var3 + (double)this.field_1688_a[var13][2] * var5 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var7 + (double)this.field_1688_a[var13][1] * var3 + (double)this.field_1688_a[var13][2] * var5 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var1 + (double)this.field_1688_a[var13][1] * var9 + (double)this.field_1688_a[var13][2] * var5 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var7 + (double)this.field_1688_a[var13][1] * var9 + (double)this.field_1688_a[var13][2] * var5 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var1 + (double)this.field_1688_a[var13][1] * var3 + (double)this.field_1688_a[var13][2] * var11 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var7 + (double)this.field_1688_a[var13][1] * var3 + (double)this.field_1688_a[var13][2] * var11 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var1 + (double)this.field_1688_a[var13][1] * var9 + (double)this.field_1688_a[var13][2] * var11 + (double)this.field_1688_a[var13][3] <= 0.0D && (double)this.field_1688_a[var13][0] * var7 + (double)this.field_1688_a[var13][1] * var9 + (double)this.field_1688_a[var13][2] * var11 + (double)this.field_1688_a[var13][3] <= 0.0D) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ClippingHelperImplementation.java b/src/main/java/net/minecraft/src/ClippingHelperImplementation.java
new file mode 100644
index 0000000..d511d32
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ClippingHelperImplementation.java
@@ -0,0 +1,82 @@
+package net.minecraft.src;
+
+import java.nio.FloatBuffer;
+import org.lwjgl.opengl.GL11;
+
+public class ClippingHelperImplementation extends ClippingHelper {
+ private static ClippingHelperImplementation field_1694_e = new ClippingHelperImplementation();
+ private FloatBuffer field_1693_f = GLAllocation.createDirectFloatBuffer(16);
+ private FloatBuffer field_1692_g = GLAllocation.createDirectFloatBuffer(16);
+ private FloatBuffer field_1691_h = GLAllocation.createDirectFloatBuffer(16);
+
+ public static ClippingHelper func_1155_a() {
+ field_1694_e.func_1153_b();
+ return field_1694_e;
+ }
+
+ private void func_1154_a(float[][] var1, int var2) {
+ float var3 = MathHelper.sqrt_float(var1[var2][0] * var1[var2][0] + var1[var2][1] * var1[var2][1] + var1[var2][2] * var1[var2][2]);
+ var1[var2][0] /= var3;
+ var1[var2][1] /= var3;
+ var1[var2][2] /= var3;
+ var1[var2][3] /= var3;
+ }
+
+ private void func_1153_b() {
+ this.field_1693_f.clear();
+ this.field_1692_g.clear();
+ this.field_1691_h.clear();
+ GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, this.field_1693_f);
+ GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, this.field_1692_g);
+ this.field_1693_f.flip().limit(16);
+ this.field_1693_f.get(this.field_1687_b);
+ this.field_1692_g.flip().limit(16);
+ this.field_1692_g.get(this.field_1690_c);
+ this.field_1689_d[0] = this.field_1690_c[0] * this.field_1687_b[0] + this.field_1690_c[1] * this.field_1687_b[4] + this.field_1690_c[2] * this.field_1687_b[8] + this.field_1690_c[3] * this.field_1687_b[12];
+ this.field_1689_d[1] = this.field_1690_c[0] * this.field_1687_b[1] + this.field_1690_c[1] * this.field_1687_b[5] + this.field_1690_c[2] * this.field_1687_b[9] + this.field_1690_c[3] * this.field_1687_b[13];
+ this.field_1689_d[2] = this.field_1690_c[0] * this.field_1687_b[2] + this.field_1690_c[1] * this.field_1687_b[6] + this.field_1690_c[2] * this.field_1687_b[10] + this.field_1690_c[3] * this.field_1687_b[14];
+ this.field_1689_d[3] = this.field_1690_c[0] * this.field_1687_b[3] + this.field_1690_c[1] * this.field_1687_b[7] + this.field_1690_c[2] * this.field_1687_b[11] + this.field_1690_c[3] * this.field_1687_b[15];
+ this.field_1689_d[4] = this.field_1690_c[4] * this.field_1687_b[0] + this.field_1690_c[5] * this.field_1687_b[4] + this.field_1690_c[6] * this.field_1687_b[8] + this.field_1690_c[7] * this.field_1687_b[12];
+ this.field_1689_d[5] = this.field_1690_c[4] * this.field_1687_b[1] + this.field_1690_c[5] * this.field_1687_b[5] + this.field_1690_c[6] * this.field_1687_b[9] + this.field_1690_c[7] * this.field_1687_b[13];
+ this.field_1689_d[6] = this.field_1690_c[4] * this.field_1687_b[2] + this.field_1690_c[5] * this.field_1687_b[6] + this.field_1690_c[6] * this.field_1687_b[10] + this.field_1690_c[7] * this.field_1687_b[14];
+ this.field_1689_d[7] = this.field_1690_c[4] * this.field_1687_b[3] + this.field_1690_c[5] * this.field_1687_b[7] + this.field_1690_c[6] * this.field_1687_b[11] + this.field_1690_c[7] * this.field_1687_b[15];
+ this.field_1689_d[8] = this.field_1690_c[8] * this.field_1687_b[0] + this.field_1690_c[9] * this.field_1687_b[4] + this.field_1690_c[10] * this.field_1687_b[8] + this.field_1690_c[11] * this.field_1687_b[12];
+ this.field_1689_d[9] = this.field_1690_c[8] * this.field_1687_b[1] + this.field_1690_c[9] * this.field_1687_b[5] + this.field_1690_c[10] * this.field_1687_b[9] + this.field_1690_c[11] * this.field_1687_b[13];
+ this.field_1689_d[10] = this.field_1690_c[8] * this.field_1687_b[2] + this.field_1690_c[9] * this.field_1687_b[6] + this.field_1690_c[10] * this.field_1687_b[10] + this.field_1690_c[11] * this.field_1687_b[14];
+ this.field_1689_d[11] = this.field_1690_c[8] * this.field_1687_b[3] + this.field_1690_c[9] * this.field_1687_b[7] + this.field_1690_c[10] * this.field_1687_b[11] + this.field_1690_c[11] * this.field_1687_b[15];
+ this.field_1689_d[12] = this.field_1690_c[12] * this.field_1687_b[0] + this.field_1690_c[13] * this.field_1687_b[4] + this.field_1690_c[14] * this.field_1687_b[8] + this.field_1690_c[15] * this.field_1687_b[12];
+ this.field_1689_d[13] = this.field_1690_c[12] * this.field_1687_b[1] + this.field_1690_c[13] * this.field_1687_b[5] + this.field_1690_c[14] * this.field_1687_b[9] + this.field_1690_c[15] * this.field_1687_b[13];
+ this.field_1689_d[14] = this.field_1690_c[12] * this.field_1687_b[2] + this.field_1690_c[13] * this.field_1687_b[6] + this.field_1690_c[14] * this.field_1687_b[10] + this.field_1690_c[15] * this.field_1687_b[14];
+ this.field_1689_d[15] = this.field_1690_c[12] * this.field_1687_b[3] + this.field_1690_c[13] * this.field_1687_b[7] + this.field_1690_c[14] * this.field_1687_b[11] + this.field_1690_c[15] * this.field_1687_b[15];
+ this.field_1688_a[0][0] = this.field_1689_d[3] - this.field_1689_d[0];
+ this.field_1688_a[0][1] = this.field_1689_d[7] - this.field_1689_d[4];
+ this.field_1688_a[0][2] = this.field_1689_d[11] - this.field_1689_d[8];
+ this.field_1688_a[0][3] = this.field_1689_d[15] - this.field_1689_d[12];
+ this.func_1154_a(this.field_1688_a, 0);
+ this.field_1688_a[1][0] = this.field_1689_d[3] + this.field_1689_d[0];
+ this.field_1688_a[1][1] = this.field_1689_d[7] + this.field_1689_d[4];
+ this.field_1688_a[1][2] = this.field_1689_d[11] + this.field_1689_d[8];
+ this.field_1688_a[1][3] = this.field_1689_d[15] + this.field_1689_d[12];
+ this.func_1154_a(this.field_1688_a, 1);
+ this.field_1688_a[2][0] = this.field_1689_d[3] + this.field_1689_d[1];
+ this.field_1688_a[2][1] = this.field_1689_d[7] + this.field_1689_d[5];
+ this.field_1688_a[2][2] = this.field_1689_d[11] + this.field_1689_d[9];
+ this.field_1688_a[2][3] = this.field_1689_d[15] + this.field_1689_d[13];
+ this.func_1154_a(this.field_1688_a, 2);
+ this.field_1688_a[3][0] = this.field_1689_d[3] - this.field_1689_d[1];
+ this.field_1688_a[3][1] = this.field_1689_d[7] - this.field_1689_d[5];
+ this.field_1688_a[3][2] = this.field_1689_d[11] - this.field_1689_d[9];
+ this.field_1688_a[3][3] = this.field_1689_d[15] - this.field_1689_d[13];
+ this.func_1154_a(this.field_1688_a, 3);
+ this.field_1688_a[4][0] = this.field_1689_d[3] - this.field_1689_d[2];
+ this.field_1688_a[4][1] = this.field_1689_d[7] - this.field_1689_d[6];
+ this.field_1688_a[4][2] = this.field_1689_d[11] - this.field_1689_d[10];
+ this.field_1688_a[4][3] = this.field_1689_d[15] - this.field_1689_d[14];
+ this.func_1154_a(this.field_1688_a, 4);
+ this.field_1688_a[5][0] = this.field_1689_d[3] + this.field_1689_d[2];
+ this.field_1688_a[5][1] = this.field_1689_d[7] + this.field_1689_d[6];
+ this.field_1688_a[5][2] = this.field_1689_d[11] + this.field_1689_d[10];
+ this.field_1688_a[5][3] = this.field_1689_d[15] + this.field_1689_d[14];
+ this.func_1154_a(this.field_1688_a, 5);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ColorizerFoliage.java b/src/main/java/net/minecraft/src/ColorizerFoliage.java
new file mode 100644
index 0000000..0be3e69
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ColorizerFoliage.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+import java.awt.image.BufferedImage;
+import javax.imageio.ImageIO;
+
+public class ColorizerFoliage {
+ private static final int[] field_6529_a = new int[65536];
+
+ public static int func_4146_a(double var0, double var2) {
+ var2 *= var0;
+ int var4 = (int)((1.0D - var0) * 255.0D);
+ int var5 = (int)((1.0D - var2) * 255.0D);
+ return field_6529_a[var5 << 8 | var4];
+ }
+
+ static {
+ try {
+ BufferedImage var0 = ImageIO.read(ColorizerFoliage.class.getResource("/misc/foliagecolor.png"));
+ var0.getRGB(0, 0, 256, 256, field_6529_a, 0, 256);
+ } catch (Exception var1) {
+ var1.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ColorizerGrass.java b/src/main/java/net/minecraft/src/ColorizerGrass.java
new file mode 100644
index 0000000..7d4cedf
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ColorizerGrass.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+import java.awt.image.BufferedImage;
+import javax.imageio.ImageIO;
+
+public class ColorizerGrass {
+ private static final int[] field_6540_a = new int[65536];
+
+ public static int func_4147_a(double var0, double var2) {
+ var2 *= var0;
+ int var4 = (int)((1.0D - var0) * 255.0D);
+ int var5 = (int)((1.0D - var2) * 255.0D);
+ return field_6540_a[var5 << 8 | var4];
+ }
+
+ static {
+ try {
+ BufferedImage var0 = ImageIO.read(ColorizerFoliage.class.getResource("/misc/grasscolor.png"));
+ var0.getRGB(0, 0, 256, 256, field_6540_a, 0, 256);
+ } catch (Exception var1) {
+ var1.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/CompressedStreamTools.java b/src/main/java/net/minecraft/src/CompressedStreamTools.java
new file mode 100644
index 0000000..586637d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/CompressedStreamTools.java
@@ -0,0 +1,78 @@
+package net.minecraft.src;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInput;
+import java.io.DataInputStream;
+import java.io.DataOutput;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+public class CompressedStreamTools {
+ public static NBTTagCompound func_1138_a(InputStream var0) throws IOException {
+ DataInputStream var1 = new DataInputStream(new GZIPInputStream(var0));
+
+ NBTTagCompound var2;
+ try {
+ var2 = func_1141_a(var1);
+ } finally {
+ var1.close();
+ }
+
+ return var2;
+ }
+
+ public static void writeGzippedCompoundToOutputStream(NBTTagCompound var0, OutputStream var1) throws IOException {
+ DataOutputStream var2 = new DataOutputStream(new GZIPOutputStream(var1));
+
+ try {
+ func_1139_a(var0, var2);
+ } finally {
+ var2.close();
+ }
+
+ }
+
+ public static NBTTagCompound func_1140_a(byte[] var0) throws IOException {
+ DataInputStream var1 = new DataInputStream(new GZIPInputStream(new ByteArrayInputStream(var0)));
+
+ NBTTagCompound var2;
+ try {
+ var2 = func_1141_a(var1);
+ } finally {
+ var1.close();
+ }
+
+ return var2;
+ }
+
+ public static byte[] func_1142_a(NBTTagCompound var0) throws IOException {
+ ByteArrayOutputStream var1 = new ByteArrayOutputStream();
+ DataOutputStream var2 = new DataOutputStream(new GZIPOutputStream(var1));
+
+ try {
+ func_1139_a(var0, var2);
+ } finally {
+ var2.close();
+ }
+
+ return var1.toByteArray();
+ }
+
+ public static NBTTagCompound func_1141_a(DataInput var0) throws IOException {
+ NBTBase var1 = NBTBase.readTag(var0);
+ if(var1 instanceof NBTTagCompound) {
+ return (NBTTagCompound)var1;
+ } else {
+ throw new IOException("Root tag must be a named compound tag");
+ }
+ }
+
+ public static void func_1139_a(NBTTagCompound var0, DataOutput var1) throws IOException {
+ NBTBase.writeTag(var0, var1);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/CraftingInventoryCB.java b/src/main/java/net/minecraft/src/CraftingInventoryCB.java
new file mode 100644
index 0000000..d71c7a8
--- /dev/null
+++ b/src/main/java/net/minecraft/src/CraftingInventoryCB.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CraftingInventoryCB {
+ protected List unusedList = new ArrayList();
+
+ public void onCraftGuiClosed(EntityPlayer var1) {
+ InventoryPlayer var2 = var1.inventory;
+ if(var2.draggingItemStack != null) {
+ var1.dropPlayerItem(var2.draggingItemStack);
+ }
+
+ }
+
+ public void onCraftMatrixChanged(IInventory var1) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/CraftingInventoryPlayerCB.java b/src/main/java/net/minecraft/src/CraftingInventoryPlayerCB.java
new file mode 100644
index 0000000..9232b6d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/CraftingInventoryPlayerCB.java
@@ -0,0 +1,43 @@
+package net.minecraft.src;
+
+public class CraftingInventoryPlayerCB extends CraftingInventoryCB {
+ public InventoryCrafting craftMatrix;
+ public IInventory craftResult = new InventoryCraftResult();
+
+ public CraftingInventoryPlayerCB(ItemStack[] var1) {
+ this.craftMatrix = new InventoryCrafting(this, var1);
+ this.onCraftMatrixChanged(this.craftMatrix);
+ }
+
+ public void onCraftMatrixChanged(IInventory var1) {
+ int[] var2 = new int[9];
+
+ for(int var3 = 0; var3 < 3; ++var3) {
+ for(int var4 = 0; var4 < 3; ++var4) {
+ int var5 = -1;
+ if(var3 < 2 && var4 < 2) {
+ ItemStack var6 = this.craftMatrix.getStackInSlot(var3 + var4 * 2);
+ if(var6 != null) {
+ var5 = var6.itemID;
+ }
+ }
+
+ var2[var3 + var4 * 3] = var5;
+ }
+ }
+
+ this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().craft(var2));
+ }
+
+ public void onCraftGuiClosed(EntityPlayer var1) {
+ super.onCraftGuiClosed(var1);
+
+ for(int var2 = 0; var2 < 9; ++var2) {
+ ItemStack var3 = this.craftMatrix.getStackInSlot(var2);
+ if(var3 != null) {
+ var1.dropPlayerItem(var3);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java b/src/main/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java
new file mode 100644
index 0000000..56106a8
--- /dev/null
+++ b/src/main/java/net/minecraft/src/CraftingInventoryWorkbenchCB.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+public class CraftingInventoryWorkbenchCB extends CraftingInventoryCB {
+ public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
+ public IInventory craftResult = new InventoryCraftResult();
+
+ public void onCraftMatrixChanged(IInventory var1) {
+ int[] var2 = new int[9];
+
+ for(int var3 = 0; var3 < 3; ++var3) {
+ for(int var4 = 0; var4 < 3; ++var4) {
+ int var5 = var3 + var4 * 3;
+ ItemStack var6 = this.craftMatrix.getStackInSlot(var5);
+ if(var6 == null) {
+ var2[var5] = -1;
+ } else {
+ var2[var5] = var6.itemID;
+ }
+ }
+ }
+
+ this.craftResult.setInventorySlotContents(0, CraftingManager.getInstance().craft(var2));
+ }
+
+ public void onCraftGuiClosed(EntityPlayer var1) {
+ super.onCraftGuiClosed(var1);
+
+ for(int var2 = 0; var2 < 9; ++var2) {
+ ItemStack var3 = this.craftMatrix.getStackInSlot(var2);
+ if(var3 != null) {
+ var1.dropPlayerItem(var3);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/CraftingManager.java b/src/main/java/net/minecraft/src/CraftingManager.java
new file mode 100644
index 0000000..9b1f293
--- /dev/null
+++ b/src/main/java/net/minecraft/src/CraftingManager.java
@@ -0,0 +1,129 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+public class CraftingManager {
+ private static final CraftingManager instance = new CraftingManager();
+ private List recipes = new ArrayList();
+
+ public static final CraftingManager getInstance() {
+ return instance;
+ }
+
+ private CraftingManager() {
+ (new RecipesTools()).func_1122_a(this);
+ (new RecipesWeapons()).func_766_a(this);
+ (new RecipesIngots()).func_810_a(this);
+ (new RecipesFood()).func_976_a(this);
+ (new RecipesCrafting()).func_1051_a(this);
+ (new RecipesArmor()).func_1148_a(this);
+ this.addRecipe(new ItemStack(Item.paper, 3), new Object[]{"###", Character.valueOf('#'), Item.reed});
+ this.addRecipe(new ItemStack(Item.book, 1), new Object[]{"#", "#", "#", Character.valueOf('#'), Item.paper});
+ this.addRecipe(new ItemStack(Block.fence, 2), new Object[]{"###", "###", Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Block.jukebox, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.diamond});
+ this.addRecipe(new ItemStack(Block.bookShelf, 1), new Object[]{"###", "XXX", "###", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.book});
+ this.addRecipe(new ItemStack(Block.blockSnow, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.snowball});
+ this.addRecipe(new ItemStack(Block.blockClay, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.clay});
+ this.addRecipe(new ItemStack(Block.brick, 1), new Object[]{"##", "##", Character.valueOf('#'), Item.brick});
+ this.addRecipe(new ItemStack(Block.lightStone, 1), new Object[]{"###", "###", "###", Character.valueOf('#'), Item.lightStoneDust});
+ this.addRecipe(new ItemStack(Block.cloth, 1), new Object[]{"###", "###", "###", Character.valueOf('#'), Item.silk});
+ this.addRecipe(new ItemStack(Block.tnt, 1), new Object[]{"X#X", "#X#", "X#X", Character.valueOf('X'), Item.gunpowder, Character.valueOf('#'), Block.sand});
+ this.addRecipe(new ItemStack(Block.stairSingle, 3), new Object[]{"###", Character.valueOf('#'), Block.cobblestone});
+ this.addRecipe(new ItemStack(Block.ladder, 1), new Object[]{"# #", "###", "# #", Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Item.doorWood, 1), new Object[]{"##", "##", "##", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Item.doorSteel, 1), new Object[]{"##", "##", "##", Character.valueOf('#'), Item.ingotIron});
+ this.addRecipe(new ItemStack(Item.sign, 1), new Object[]{"###", "###", " X ", Character.valueOf('#'), Block.planks, Character.valueOf('X'), Item.stick});
+ this.addRecipe(new ItemStack(Block.planks, 4), new Object[]{"#", Character.valueOf('#'), Block.wood});
+ this.addRecipe(new ItemStack(Item.stick, 4), new Object[]{"#", "#", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Block.torchWood, 4), new Object[]{"X", "#", Character.valueOf('X'), Item.coal, Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Item.bowlEmpty, 4), new Object[]{"# #", " # ", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Block.minecartTrack, 16), new Object[]{"X X", "X#X", "X X", Character.valueOf('X'), Item.ingotIron, Character.valueOf('#'), Item.stick});
+ this.addRecipe(new ItemStack(Item.minecartEmpty, 1), new Object[]{"# #", "###", Character.valueOf('#'), Item.ingotIron});
+ this.addRecipe(new ItemStack(Block.pumpkinLantern, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.pumpkin, Character.valueOf('B'), Block.torchWood});
+ this.addRecipe(new ItemStack(Item.minecartCrate, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.crate, Character.valueOf('B'), Item.minecartEmpty});
+ this.addRecipe(new ItemStack(Item.minecartPowered, 1), new Object[]{"A", "B", Character.valueOf('A'), Block.stoneOvenIdle, Character.valueOf('B'), Item.minecartEmpty});
+ this.addRecipe(new ItemStack(Item.boat, 1), new Object[]{"# #", "###", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Item.bucketEmpty, 1), new Object[]{"# #", " # ", Character.valueOf('#'), Item.ingotIron});
+ this.addRecipe(new ItemStack(Item.flintAndSteel, 1), new Object[]{"A ", " B", Character.valueOf('A'), Item.ingotIron, Character.valueOf('B'), Item.flint});
+ this.addRecipe(new ItemStack(Item.bread, 1), new Object[]{"###", Character.valueOf('#'), Item.wheat});
+ this.addRecipe(new ItemStack(Block.stairCompactPlanks, 4), new Object[]{"# ", "## ", "###", Character.valueOf('#'), Block.planks});
+ this.addRecipe(new ItemStack(Item.fishingRod, 1), new Object[]{" #", " #X", "# X", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.silk});
+ this.addRecipe(new ItemStack(Block.stairCompactCobblestone, 4), new Object[]{"# ", "## ", "###", Character.valueOf('#'), Block.cobblestone});
+ this.addRecipe(new ItemStack(Item.painting, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Block.cloth});
+ this.addRecipe(new ItemStack(Item.appleGold, 1), new Object[]{"###", "#X#", "###", Character.valueOf('#'), Block.blockGold, Character.valueOf('X'), Item.appleRed});
+ this.addRecipe(new ItemStack(Block.lever, 1), new Object[]{"X", "#", Character.valueOf('#'), Block.cobblestone, Character.valueOf('X'), Item.stick});
+ this.addRecipe(new ItemStack(Block.torchRedstoneActive, 1), new Object[]{"X", "#", Character.valueOf('#'), Item.stick, Character.valueOf('X'), Item.redstone});
+ this.addRecipe(new ItemStack(Item.pocketSundial, 1), new Object[]{" # ", "#X#", " # ", Character.valueOf('#'), Item.ingotGold, Character.valueOf('X'), Item.redstone});
+ this.addRecipe(new ItemStack(Item.compass, 1), new Object[]{" # ", "#X#", " # ", Character.valueOf('#'), Item.ingotIron, Character.valueOf('X'), Item.redstone});
+ this.addRecipe(new ItemStack(Block.button, 1), new Object[]{"#", "#", Character.valueOf('#'), Block.stone});
+ this.addRecipe(new ItemStack(Block.pressurePlateStone, 1), new Object[]{"###", Character.valueOf('#'), Block.stone});
+ this.addRecipe(new ItemStack(Block.pressurePlatePlanks, 1), new Object[]{"###", Character.valueOf('#'), Block.planks});
+ Collections.sort(this.recipes, new RecipeSorter(this));
+ System.out.println(this.recipes.size() + " recipes");
+ }
+
+ void addRecipe(ItemStack var1, Object... var2) {
+ String var3 = "";
+ int var4 = 0;
+ int var5 = 0;
+ int var6 = 0;
+ if(var2[var4] instanceof String[]) {
+ String[] var11 = (String[])((String[])var2[var4++]);
+
+ for(int var8 = 0; var8 < var11.length; ++var8) {
+ String var9 = var11[var8];
+ ++var6;
+ var5 = var9.length();
+ var3 = var3 + var9;
+ }
+ } else {
+ while(var2[var4] instanceof String) {
+ String var7 = (String)var2[var4++];
+ ++var6;
+ var5 = var7.length();
+ var3 = var3 + var7;
+ }
+ }
+
+ HashMap var12;
+ int var15;
+ for(var12 = new HashMap(); var4 < var2.length; var4 += 2) {
+ Character var13 = (Character)var2[var4];
+ var15 = 0;
+ if(var2[var4 + 1] instanceof Item) {
+ var15 = ((Item)var2[var4 + 1]).shiftedIndex;
+ } else if(var2[var4 + 1] instanceof Block) {
+ var15 = ((Block)var2[var4 + 1]).blockID;
+ }
+
+ var12.put(var13, Integer.valueOf(var15));
+ }
+
+ int[] var14 = new int[var5 * var6];
+
+ for(var15 = 0; var15 < var5 * var6; ++var15) {
+ char var10 = var3.charAt(var15);
+ if(var12.containsKey(Character.valueOf(var10))) {
+ var14[var15] = ((Integer)var12.get(Character.valueOf(var10))).intValue();
+ } else {
+ var14[var15] = -1;
+ }
+ }
+
+ this.recipes.add(new CraftingRecipe(var5, var6, var14, var1));
+ }
+
+ public ItemStack craft(int[] var1) {
+ for(int var2 = 0; var2 < this.recipes.size(); ++var2) {
+ CraftingRecipe var3 = (CraftingRecipe)this.recipes.get(var2);
+ if(var3.matchRecipe(var1)) {
+ return var3.createResult(var1);
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/CraftingRecipe.java b/src/main/java/net/minecraft/src/CraftingRecipe.java
new file mode 100644
index 0000000..c124413
--- /dev/null
+++ b/src/main/java/net/minecraft/src/CraftingRecipe.java
@@ -0,0 +1,64 @@
+package net.minecraft.src;
+
+public class CraftingRecipe {
+ private int width;
+ private int height;
+ private int[] ingredientMap;
+ private ItemStack resultStack;
+ public final int resultId;
+
+ public CraftingRecipe(int var1, int var2, int[] var3, ItemStack var4) {
+ this.resultId = var4.itemID;
+ this.width = var1;
+ this.height = var2;
+ this.ingredientMap = var3;
+ this.resultStack = var4;
+ }
+
+ public boolean matchRecipe(int[] var1) {
+ for(int var2 = 0; var2 <= 3 - this.width; ++var2) {
+ for(int var3 = 0; var3 <= 3 - this.height; ++var3) {
+ if(this.matches(var1, var2, var3, true)) {
+ return true;
+ }
+
+ if(this.matches(var1, var2, var3, false)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ private boolean matches(int[] var1, int var2, int var3, boolean var4) {
+ for(int var5 = 0; var5 < 3; ++var5) {
+ for(int var6 = 0; var6 < 3; ++var6) {
+ int var7 = var5 - var2;
+ int var8 = var6 - var3;
+ int var9 = -1;
+ if(var7 >= 0 && var8 >= 0 && var7 < this.width && var8 < this.height) {
+ if(var4) {
+ var9 = this.ingredientMap[this.width - var7 - 1 + var8 * this.width];
+ } else {
+ var9 = this.ingredientMap[var7 + var8 * this.width];
+ }
+ }
+
+ if(var1[var5 + var6 * 3] != var9) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ public ItemStack createResult(int[] var1) {
+ return new ItemStack(this.resultStack.itemID, this.resultStack.stackSize);
+ }
+
+ public int getRecipeSize() {
+ return this.width * this.height;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EffectRenderer.java b/src/main/java/net/minecraft/src/EffectRenderer.java
new file mode 100644
index 0000000..80099f5
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EffectRenderer.java
@@ -0,0 +1,166 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import org.lwjgl.opengl.GL11;
+
+public class EffectRenderer {
+ protected World worldObj;
+ private List[] field_1728_b = new List[4];
+ private RenderEngine field_1731_c;
+ private Random rand = new Random();
+
+ public EffectRenderer(World var1, RenderEngine var2) {
+ if(var1 != null) {
+ this.worldObj = var1;
+ }
+
+ this.field_1731_c = var2;
+
+ for(int var3 = 0; var3 < 4; ++var3) {
+ this.field_1728_b[var3] = new ArrayList();
+ }
+
+ }
+
+ public void func_1192_a(EntityFX var1) {
+ int var2 = var1.func_404_c();
+ this.field_1728_b[var2].add(var1);
+ }
+
+ public void func_1193_a() {
+ for(int var1 = 0; var1 < 4; ++var1) {
+ for(int var2 = 0; var2 < this.field_1728_b[var1].size(); ++var2) {
+ EntityFX var3 = (EntityFX)this.field_1728_b[var1].get(var2);
+ var3.onUpdate();
+ if(var3.isDead) {
+ this.field_1728_b[var1].remove(var2--);
+ }
+ }
+ }
+
+ }
+
+ public void func_1189_a(Entity var1, float var2) {
+ float var3 = MathHelper.cos(var1.rotationYaw * (float)Math.PI / 180.0F);
+ float var4 = MathHelper.sin(var1.rotationYaw * (float)Math.PI / 180.0F);
+ float var5 = -var4 * MathHelper.sin(var1.rotationPitch * (float)Math.PI / 180.0F);
+ float var6 = var3 * MathHelper.sin(var1.rotationPitch * (float)Math.PI / 180.0F);
+ float var7 = MathHelper.cos(var1.rotationPitch * (float)Math.PI / 180.0F);
+ EntityFX.field_660_l = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var2;
+ EntityFX.field_659_m = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var2;
+ EntityFX.field_658_n = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var2;
+
+ for(int var8 = 0; var8 < 3; ++var8) {
+ if(this.field_1728_b[var8].size() != 0) {
+ int var9 = 0;
+ if(var8 == 0) {
+ var9 = this.field_1731_c.getTexture("/particles.png");
+ }
+
+ if(var8 == 1) {
+ var9 = this.field_1731_c.getTexture("/terrain.png");
+ }
+
+ if(var8 == 2) {
+ var9 = this.field_1731_c.getTexture("/gui/items.png");
+ }
+
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var9);
+ Tessellator var10 = Tessellator.instance;
+ var10.startDrawingQuads();
+
+ for(int var11 = 0; var11 < this.field_1728_b[var8].size(); ++var11) {
+ EntityFX var12 = (EntityFX)this.field_1728_b[var8].get(var11);
+ var12.func_406_a(var10, var2, var3, var7, var4, var5, var6);
+ }
+
+ var10.draw();
+ }
+ }
+
+ }
+
+ public void func_1187_b(Entity var1, float var2) {
+ byte var3 = 3;
+ if(this.field_1728_b[var3].size() != 0) {
+ Tessellator var4 = Tessellator.instance;
+
+ for(int var5 = 0; var5 < this.field_1728_b[var3].size(); ++var5) {
+ EntityFX var6 = (EntityFX)this.field_1728_b[var3].get(var5);
+ var6.func_406_a(var4, var2, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
+ }
+
+ }
+ }
+
+ public void func_1188_a(World var1) {
+ this.worldObj = var1;
+
+ for(int var2 = 0; var2 < 4; ++var2) {
+ this.field_1728_b[var2].clear();
+ }
+
+ }
+
+ public void func_1186_a(int var1, int var2, int var3) {
+ int var4 = this.worldObj.getBlockId(var1, var2, var3);
+ if(var4 != 0) {
+ Block var5 = Block.blocksList[var4];
+ byte var6 = 4;
+
+ for(int var7 = 0; var7 < var6; ++var7) {
+ for(int var8 = 0; var8 < var6; ++var8) {
+ for(int var9 = 0; var9 < var6; ++var9) {
+ double var10 = (double)var1 + ((double)var7 + 0.5D) / (double)var6;
+ double var12 = (double)var2 + ((double)var8 + 0.5D) / (double)var6;
+ double var14 = (double)var3 + ((double)var9 + 0.5D) / (double)var6;
+ this.func_1192_a((new EntityDiggingFX(this.worldObj, var10, var12, var14, var10 - (double)var1 - 0.5D, var12 - (double)var2 - 0.5D, var14 - (double)var3 - 0.5D, var5)).func_4041_a(var1, var2, var3));
+ }
+ }
+ }
+
+ }
+ }
+
+ public void func_1191_a(int var1, int var2, int var3, int var4) {
+ int var5 = this.worldObj.getBlockId(var1, var2, var3);
+ if(var5 != 0) {
+ Block var6 = Block.blocksList[var5];
+ float var7 = 0.1F;
+ double var8 = (double)var1 + this.rand.nextDouble() * (var6.maxX - var6.field_370_bf - (double)(var7 * 2.0F)) + (double)var7 + var6.field_370_bf;
+ double var10 = (double)var2 + this.rand.nextDouble() * (var6.maxY - var6.minY - (double)(var7 * 2.0F)) + (double)var7 + var6.minY;
+ double var12 = (double)var3 + this.rand.nextDouble() * (var6.maxZ - var6.minZ - (double)(var7 * 2.0F)) + (double)var7 + var6.minZ;
+ if(var4 == 0) {
+ var10 = (double)var2 + var6.minY - (double)var7;
+ }
+
+ if(var4 == 1) {
+ var10 = (double)var2 + var6.maxY + (double)var7;
+ }
+
+ if(var4 == 2) {
+ var12 = (double)var3 + var6.minZ - (double)var7;
+ }
+
+ if(var4 == 3) {
+ var12 = (double)var3 + var6.maxZ + (double)var7;
+ }
+
+ if(var4 == 4) {
+ var8 = (double)var1 + var6.field_370_bf - (double)var7;
+ }
+
+ if(var4 == 5) {
+ var8 = (double)var1 + var6.maxX + (double)var7;
+ }
+
+ this.func_1192_a((new EntityDiggingFX(this.worldObj, var8, var10, var12, 0.0D, 0.0D, 0.0D, var6)).func_4041_a(var1, var2, var3).func_407_b(0.2F).func_405_d(0.6F));
+ }
+ }
+
+ public String func_1190_b() {
+ return "" + (this.field_1728_b[0].size() + this.field_1728_b[1].size() + this.field_1728_b[2].size());
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Entity.java b/src/main/java/net/minecraft/src/Entity.java
new file mode 100644
index 0000000..c67ea1f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Entity.java
@@ -0,0 +1,901 @@
+package net.minecraft.src;
+
+import java.util.List;
+import java.util.Random;
+
+public abstract class Entity {
+ private static int field_864_a = 0;
+ public int field_620_ab = field_864_a++;
+ public double field_619_ac = 1.0D;
+ public boolean field_618_ad = false;
+ public Entity riddenByEntity;
+ public Entity ridingEntity;
+ public World worldObj;
+ public double prevPosX;
+ public double prevPosY;
+ public double prevPosZ;
+ public double posX;
+ public double posY;
+ public double posZ;
+ public double motionX;
+ public double motionY;
+ public double motionZ;
+ public float rotationYaw;
+ public float rotationPitch;
+ public float prevRotationYaw;
+ public float prevRotationPitch;
+ public final AxisAlignedBB boundingBox = AxisAlignedBB.getBoundingBox(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
+ public boolean onGround = false;
+ public boolean field_9297_aI;
+ public boolean field_9296_aJ;
+ public boolean field_9295_aK = false;
+ public boolean field_9294_aL = false;
+ public boolean field_9293_aM = true;
+ public boolean isDead = false;
+ public float yOffset = 0.0F;
+ public float width = 0.6F;
+ public float height = 1.8F;
+ public float field_9291_aR = 0.0F;
+ public float field_9290_aS = 0.0F;
+ protected boolean entityWalks = true;
+ protected float fallDistance = 0.0F;
+ private int field_863_b = 1;
+ public double lastTickPosX;
+ public double lastTickPosY;
+ public double lastTickPosZ;
+ public float field_9287_aY = 0.0F;
+ public float field_9286_aZ = 0.0F;
+ public boolean field_9314_ba = false;
+ public float field_632_aO = 0.0F;
+ public boolean field_9313_bc = false;
+ protected Random rand = new Random();
+ public int field_9311_be = 0;
+ public int field_9310_bf = 1;
+ public int fire = 0;
+ protected int field_9308_bh = 300;
+ protected boolean field_9307_bi = false;
+ public int field_9306_bj = 0;
+ public int air = 300;
+ private boolean field_862_c = true;
+ public String skinUrl;
+ protected boolean isImmuneToFire = false;
+ private double minecartType;
+ private double field_667_e;
+ public boolean field_621_aZ = false;
+ public int field_657_ba;
+ public int field_656_bb;
+ public int field_654_bc;
+ public int field_9303_br;
+ public int field_9302_bs;
+ public int field_9301_bt;
+ public boolean field_9300_bu;
+ public boolean field_9299_bv;
+ public boolean field_12240_bw;
+
+ public Entity(World var1) {
+ this.worldObj = var1;
+ this.setPosition(0.0D, 0.0D, 0.0D);
+ }
+
+ public boolean equals(Object var1) {
+ return var1 instanceof Entity ? ((Entity)var1).field_620_ab == this.field_620_ab : false;
+ }
+
+ public int hashCode() {
+ return this.field_620_ab;
+ }
+
+ protected void preparePlayerToSpawn() {
+ if(this.worldObj != null) {
+ while(this.posY > 0.0D) {
+ this.setPosition(this.posX, this.posY, this.posZ);
+ if(this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() == 0) {
+ break;
+ }
+
+ ++this.posY;
+ }
+
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+ this.rotationPitch = 0.0F;
+ }
+ }
+
+ public void setEntityDead() {
+ this.isDead = true;
+ }
+
+ protected void setSize(float var1, float var2) {
+ this.width = var1;
+ this.height = var2;
+ }
+
+ protected void setRotation(float var1, float var2) {
+ this.rotationYaw = var1;
+ this.rotationPitch = var2;
+ }
+
+ public void setPosition(double var1, double var3, double var5) {
+ this.posX = var1;
+ this.posY = var3;
+ this.posZ = var5;
+ float var7 = this.width / 2.0F;
+ float var8 = this.height;
+ this.boundingBox.setBounds(var1 - (double)var7, var3 - (double)this.yOffset + (double)this.field_9287_aY, var5 - (double)var7, var1 + (double)var7, var3 - (double)this.yOffset + (double)this.field_9287_aY + (double)var8, var5 + (double)var7);
+ }
+
+ public void func_346_d(float var1, float var2) {
+ float var3 = this.rotationPitch;
+ float var4 = this.rotationYaw;
+ this.rotationYaw = (float)((double)this.rotationYaw + (double)var1 * 0.15D);
+ this.rotationPitch = (float)((double)this.rotationPitch - (double)var2 * 0.15D);
+ if(this.rotationPitch < -90.0F) {
+ this.rotationPitch = -90.0F;
+ }
+
+ if(this.rotationPitch > 90.0F) {
+ this.rotationPitch = 90.0F;
+ }
+
+ this.prevRotationPitch += this.rotationPitch - var3;
+ this.prevRotationYaw += this.rotationYaw - var4;
+ }
+
+ public void onUpdate() {
+ this.func_391_y();
+ }
+
+ public void func_391_y() {
+ if(this.ridingEntity != null && this.ridingEntity.isDead) {
+ this.ridingEntity = null;
+ }
+
+ ++this.field_9311_be;
+ this.field_9291_aR = this.field_9290_aS;
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.prevRotationPitch = this.rotationPitch;
+ this.prevRotationYaw = this.rotationYaw;
+ if(this.handleWaterMovement()) {
+ if(!this.field_9307_bi && !this.field_862_c) {
+ float var1 = MathHelper.sqrt_double(this.motionX * this.motionX * (double)0.2F + this.motionY * this.motionY + this.motionZ * this.motionZ * (double)0.2F) * 0.2F;
+ if(var1 > 1.0F) {
+ var1 = 1.0F;
+ }
+
+ this.worldObj.playSoundAtEntity(this, "random.splash", var1, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
+ float var2 = (float)MathHelper.floor_double(this.boundingBox.minY);
+
+ int var3;
+ float var4;
+ float var5;
+ for(var3 = 0; (float)var3 < 1.0F + this.width * 20.0F; ++var3) {
+ var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle("bubble", this.posX + (double)var4, (double)(var2 + 1.0F), this.posZ + (double)var5, this.motionX, this.motionY - (double)(this.rand.nextFloat() * 0.2F), this.motionZ);
+ }
+
+ for(var3 = 0; (float)var3 < 1.0F + this.width * 20.0F; ++var3) {
+ var4 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ var5 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle("splash", this.posX + (double)var4, (double)(var2 + 1.0F), this.posZ + (double)var5, this.motionX, this.motionY, this.motionZ);
+ }
+ }
+
+ this.fallDistance = 0.0F;
+ this.field_9307_bi = true;
+ this.fire = 0;
+ } else {
+ this.field_9307_bi = false;
+ }
+
+ if(this.fire > 0) {
+ if(this.isImmuneToFire) {
+ this.fire -= 4;
+ if(this.fire < 0) {
+ this.fire = 0;
+ }
+ } else {
+ if(this.fire % 20 == 0) {
+ this.canAttackEntity((Entity)null, 1);
+ }
+
+ --this.fire;
+ }
+ }
+
+ if(this.handleLavaMovement()) {
+ this.func_4038_J();
+ }
+
+ if(this.posY < -64.0D) {
+ this.func_4034_G();
+ }
+
+ this.field_862_c = false;
+ }
+
+ protected void func_4038_J() {
+ if(!this.isImmuneToFire) {
+ this.canAttackEntity((Entity)null, 4);
+ this.fire = 600;
+ }
+
+ }
+
+ protected void func_4034_G() {
+ this.setEntityDead();
+ }
+
+ public boolean func_403_b(double var1, double var3, double var5) {
+ AxisAlignedBB var7 = this.boundingBox.getOffsetBoundingBox(var1, var3, var5);
+ List var8 = this.worldObj.getCollidingBoundingBoxes(this, var7);
+ return var8.size() > 0 ? false : !this.worldObj.getIsAnyLiquid(var7);
+ }
+
+ public void moveEntity(double var1, double var3, double var5) {
+ if(this.field_9314_ba) {
+ this.boundingBox.offset(var1, var3, var5);
+ this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0D;
+ this.posY = this.boundingBox.minY + (double)this.yOffset - (double)this.field_9287_aY;
+ this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0D;
+ } else {
+ double var7 = this.posX;
+ double var9 = this.posZ;
+ double var11 = var1;
+ double var13 = var3;
+ double var15 = var5;
+ AxisAlignedBB var17 = this.boundingBox.copy();
+ boolean var18 = this.onGround && this.func_381_o();
+ if(var18) {
+ double var19;
+ for(var19 = 0.05D; var1 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.getOffsetBoundingBox(var1, -1.0D, 0.0D)).size() == 0; var11 = var1) {
+ if(var1 < var19 && var1 >= -var19) {
+ var1 = 0.0D;
+ } else if(var1 > 0.0D) {
+ var1 -= var19;
+ } else {
+ var1 += var19;
+ }
+ }
+
+ for(; var5 != 0.0D && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.getOffsetBoundingBox(0.0D, -1.0D, var5)).size() == 0; var15 = var5) {
+ if(var5 < var19 && var5 >= -var19) {
+ var5 = 0.0D;
+ } else if(var5 > 0.0D) {
+ var5 -= var19;
+ } else {
+ var5 += var19;
+ }
+ }
+ }
+
+ List var35 = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(var1, var3, var5));
+
+ for(int var20 = 0; var20 < var35.size(); ++var20) {
+ var3 = ((AxisAlignedBB)var35.get(var20)).func_1172_b(this.boundingBox, var3);
+ }
+
+ this.boundingBox.offset(0.0D, var3, 0.0D);
+ if(!this.field_9293_aM && var13 != var3) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ boolean var36 = this.onGround || var13 != var3 && var13 < 0.0D;
+
+ int var21;
+ for(var21 = 0; var21 < var35.size(); ++var21) {
+ var1 = ((AxisAlignedBB)var35.get(var21)).func_1163_a(this.boundingBox, var1);
+ }
+
+ this.boundingBox.offset(var1, 0.0D, 0.0D);
+ if(!this.field_9293_aM && var11 != var1) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ for(var21 = 0; var21 < var35.size(); ++var21) {
+ var5 = ((AxisAlignedBB)var35.get(var21)).func_1162_c(this.boundingBox, var5);
+ }
+
+ this.boundingBox.offset(0.0D, 0.0D, var5);
+ if(!this.field_9293_aM && var15 != var5) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ double var23;
+ int var28;
+ double var37;
+ if(this.field_9286_aZ > 0.0F && var36 && this.field_9287_aY < 0.05F && (var11 != var1 || var15 != var5)) {
+ var37 = var1;
+ var23 = var3;
+ double var25 = var5;
+ var1 = var11;
+ var3 = (double)this.field_9286_aZ;
+ var5 = var15;
+ AxisAlignedBB var27 = this.boundingBox.copy();
+ this.boundingBox.setBB(var17);
+ var35 = this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox.addCoord(var11, var3, var15));
+
+ for(var28 = 0; var28 < var35.size(); ++var28) {
+ var3 = ((AxisAlignedBB)var35.get(var28)).func_1172_b(this.boundingBox, var3);
+ }
+
+ this.boundingBox.offset(0.0D, var3, 0.0D);
+ if(!this.field_9293_aM && var13 != var3) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ for(var28 = 0; var28 < var35.size(); ++var28) {
+ var1 = ((AxisAlignedBB)var35.get(var28)).func_1163_a(this.boundingBox, var1);
+ }
+
+ this.boundingBox.offset(var1, 0.0D, 0.0D);
+ if(!this.field_9293_aM && var11 != var1) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ for(var28 = 0; var28 < var35.size(); ++var28) {
+ var5 = ((AxisAlignedBB)var35.get(var28)).func_1162_c(this.boundingBox, var5);
+ }
+
+ this.boundingBox.offset(0.0D, 0.0D, var5);
+ if(!this.field_9293_aM && var15 != var5) {
+ var5 = 0.0D;
+ var3 = var5;
+ var1 = var5;
+ }
+
+ if(var37 * var37 + var25 * var25 >= var1 * var1 + var5 * var5) {
+ var1 = var37;
+ var3 = var23;
+ var5 = var25;
+ this.boundingBox.setBB(var27);
+ } else {
+ this.field_9287_aY = (float)((double)this.field_9287_aY + 0.5D);
+ }
+ }
+
+ this.posX = (this.boundingBox.minX + this.boundingBox.maxX) / 2.0D;
+ this.posY = this.boundingBox.minY + (double)this.yOffset - (double)this.field_9287_aY;
+ this.posZ = (this.boundingBox.minZ + this.boundingBox.maxZ) / 2.0D;
+ this.field_9297_aI = var11 != var1 || var15 != var5;
+ this.field_9296_aJ = var13 != var3;
+ this.onGround = var13 != var3 && var13 < 0.0D;
+ this.field_9295_aK = this.field_9297_aI || this.field_9296_aJ;
+ this.func_9279_a(var3, this.onGround);
+ if(var11 != var1) {
+ this.motionX = 0.0D;
+ }
+
+ if(var13 != var3) {
+ this.motionY = 0.0D;
+ }
+
+ if(var15 != var5) {
+ this.motionZ = 0.0D;
+ }
+
+ var37 = this.posX - var7;
+ var23 = this.posZ - var9;
+ int var26;
+ int var38;
+ int var40;
+ if(this.entityWalks && !var18) {
+ this.field_9290_aS = (float)((double)this.field_9290_aS + (double)MathHelper.sqrt_double(var37 * var37 + var23 * var23) * 0.6D);
+ var38 = MathHelper.floor_double(this.posX);
+ var26 = MathHelper.floor_double(this.posY - (double)0.2F - (double)this.yOffset);
+ var40 = MathHelper.floor_double(this.posZ);
+ var28 = this.worldObj.getBlockId(var38, var26, var40);
+ if(this.field_9290_aS > (float)this.field_863_b && var28 > 0) {
+ ++this.field_863_b;
+ StepSound var29 = Block.blocksList[var28].stepSound;
+ if(this.worldObj.getBlockId(var38, var26 + 1, var40) == Block.snow.blockID) {
+ var29 = Block.snow.stepSound;
+ this.worldObj.playSoundAtEntity(this, var29.func_1145_d(), var29.func_1147_b() * 0.15F, var29.func_1144_c());
+ } else if(!Block.blocksList[var28].blockMaterial.getIsLiquid()) {
+ this.worldObj.playSoundAtEntity(this, var29.func_1145_d(), var29.func_1147_b() * 0.15F, var29.func_1144_c());
+ }
+
+ Block.blocksList[var28].onEntityWalking(this.worldObj, var38, var26, var40, this);
+ }
+ }
+
+ var38 = MathHelper.floor_double(this.boundingBox.minX);
+ var26 = MathHelper.floor_double(this.boundingBox.minY);
+ var40 = MathHelper.floor_double(this.boundingBox.minZ);
+ var28 = MathHelper.floor_double(this.boundingBox.maxX);
+ int var41 = MathHelper.floor_double(this.boundingBox.maxY);
+ int var30 = MathHelper.floor_double(this.boundingBox.maxZ);
+
+ for(int var31 = var38; var31 <= var28; ++var31) {
+ for(int var32 = var26; var32 <= var41; ++var32) {
+ for(int var33 = var40; var33 <= var30; ++var33) {
+ int var34 = this.worldObj.getBlockId(var31, var32, var33);
+ if(var34 > 0) {
+ Block.blocksList[var34].onEntityCollidedWithBlock(this.worldObj, var31, var32, var33, this);
+ }
+ }
+ }
+ }
+
+ this.field_9287_aY *= 0.4F;
+ boolean var39 = this.handleWaterMovement();
+ if(this.worldObj.isBoundingBoxBurning(this.boundingBox)) {
+ this.func_355_a(1);
+ if(!var39) {
+ ++this.fire;
+ if(this.fire == 0) {
+ this.fire = 300;
+ }
+ }
+ } else if(this.fire <= 0) {
+ this.fire = -this.field_9310_bf;
+ }
+
+ if(var39 && this.fire > 0) {
+ this.worldObj.playSoundAtEntity(this, "random.fizz", 0.7F, 1.6F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
+ this.fire = -this.field_9310_bf;
+ }
+
+ }
+ }
+
+ protected void func_9279_a(double var1, boolean var3) {
+ if(var3) {
+ if(this.fallDistance > 0.0F) {
+ this.fall(this.fallDistance);
+ this.fallDistance = 0.0F;
+ }
+ } else if(var1 < 0.0D) {
+ this.fallDistance = (float)((double)this.fallDistance - var1);
+ }
+
+ }
+
+ public boolean func_381_o() {
+ return false;
+ }
+
+ public AxisAlignedBB func_372_f_() {
+ return null;
+ }
+
+ protected void func_355_a(int var1) {
+ if(!this.isImmuneToFire) {
+ this.canAttackEntity((Entity)null, var1);
+ }
+
+ }
+
+ protected void fall(float var1) {
+ }
+
+ public boolean handleWaterMovement() {
+ return this.worldObj.func_682_a(this.boundingBox.expands(0.0D, (double)-0.4F, 0.0D), Material.water, this);
+ }
+
+ public boolean isInsideOfMaterial(Material var1) {
+ double var2 = this.posY + (double)this.func_373_s();
+ int var4 = MathHelper.floor_double(this.posX);
+ int var5 = MathHelper.floor_float((float)MathHelper.floor_double(var2));
+ int var6 = MathHelper.floor_double(this.posZ);
+ int var7 = this.worldObj.getBlockId(var4, var5, var6);
+ if(var7 != 0 && Block.blocksList[var7].blockMaterial == var1) {
+ float var8 = BlockFluids.func_288_b(this.worldObj.getBlockMetadata(var4, var5, var6)) - 1.0F / 9.0F;
+ float var9 = (float)(var5 + 1) - var8;
+ return var2 < (double)var9;
+ } else {
+ return false;
+ }
+ }
+
+ public float func_373_s() {
+ return 0.0F;
+ }
+
+ public boolean handleLavaMovement() {
+ return this.worldObj.func_689_a(this.boundingBox.expands(0.0D, (double)-0.4F, 0.0D), Material.lava);
+ }
+
+ public void func_351_a(float var1, float var2, float var3) {
+ float var4 = MathHelper.sqrt_float(var1 * var1 + var2 * var2);
+ if(var4 >= 0.01F) {
+ if(var4 < 1.0F) {
+ var4 = 1.0F;
+ }
+
+ var4 = var3 / var4;
+ var1 *= var4;
+ var2 *= var4;
+ float var5 = MathHelper.sin(this.rotationYaw * (float)Math.PI / 180.0F);
+ float var6 = MathHelper.cos(this.rotationYaw * (float)Math.PI / 180.0F);
+ this.motionX += (double)(var1 * var6 - var2 * var5);
+ this.motionZ += (double)(var2 * var6 + var1 * var5);
+ }
+ }
+
+ public float getEntityBrightness(float var1) {
+ int var2 = MathHelper.floor_double(this.posX);
+ double var3 = (this.boundingBox.maxY - this.boundingBox.minY) * 0.66D;
+ int var5 = MathHelper.floor_double(this.posY - (double)this.yOffset + var3);
+ int var6 = MathHelper.floor_double(this.posZ);
+ return this.worldObj.getLightBrightness(var2, var5, var6);
+ }
+
+ public void setWorld(World var1) {
+ this.worldObj = var1;
+ }
+
+ public void setPositionAndRotation(double var1, double var3, double var5, float var7, float var8) {
+ this.prevPosX = this.posX = var1;
+ this.prevPosY = this.posY = var3;
+ this.prevPosZ = this.posZ = var5;
+ this.prevRotationYaw = this.rotationYaw = var7;
+ this.prevRotationPitch = this.rotationPitch = var8;
+ this.field_9287_aY = 0.0F;
+ double var9 = (double)(this.prevRotationYaw - var7);
+ if(var9 < -180.0D) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ if(var9 >= 180.0D) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.setRotation(var7, var8);
+ }
+
+ public void setLocationAndAngles(double var1, double var3, double var5, float var7, float var8) {
+ this.prevPosX = this.posX = var1;
+ this.prevPosY = this.posY = var3 + (double)this.yOffset;
+ this.prevPosZ = this.posZ = var5;
+ this.rotationYaw = var7;
+ this.rotationPitch = var8;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public float getDistanceToEntity(Entity var1) {
+ float var2 = (float)(this.posX - var1.posX);
+ float var3 = (float)(this.posY - var1.posY);
+ float var4 = (float)(this.posZ - var1.posZ);
+ return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4);
+ }
+
+ public double getDistanceSq(double var1, double var3, double var5) {
+ double var7 = this.posX - var1;
+ double var9 = this.posY - var3;
+ double var11 = this.posZ - var5;
+ return var7 * var7 + var9 * var9 + var11 * var11;
+ }
+
+ public double getDistance(double var1, double var3, double var5) {
+ double var7 = this.posX - var1;
+ double var9 = this.posY - var3;
+ double var11 = this.posZ - var5;
+ return (double)MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11);
+ }
+
+ public double getDistanceSqToEntity(Entity var1) {
+ double var2 = this.posX - var1.posX;
+ double var4 = this.posY - var1.posY;
+ double var6 = this.posZ - var1.posZ;
+ return var2 * var2 + var4 * var4 + var6 * var6;
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ }
+
+ public void applyEntityCollision(Entity var1) {
+ if(var1.riddenByEntity != this && var1.ridingEntity != this) {
+ double var2 = var1.posX - this.posX;
+ double var4 = var1.posZ - this.posZ;
+ double var6 = MathHelper.abs_max(var2, var4);
+ if(var6 >= (double)0.01F) {
+ var6 = (double)MathHelper.sqrt_double(var6);
+ var2 /= var6;
+ var4 /= var6;
+ double var8 = 1.0D / var6;
+ if(var8 > 1.0D) {
+ var8 = 1.0D;
+ }
+
+ var2 *= var8;
+ var4 *= var8;
+ var2 *= (double)0.05F;
+ var4 *= (double)0.05F;
+ var2 *= (double)(1.0F - this.field_632_aO);
+ var4 *= (double)(1.0F - this.field_632_aO);
+ this.addVelocity(-var2, 0.0D, -var4);
+ var1.addVelocity(var2, 0.0D, var4);
+ }
+
+ }
+ }
+
+ public void addVelocity(double var1, double var3, double var5) {
+ this.motionX += var1;
+ this.motionY += var3;
+ this.motionZ += var5;
+ }
+
+ protected void func_9281_M() {
+ this.field_9294_aL = true;
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ this.func_9281_M();
+ return false;
+ }
+
+ public boolean canBeCollidedWith() {
+ return false;
+ }
+
+ public boolean canBePushed() {
+ return false;
+ }
+
+ public void addToPlayerScore(Entity var1, int var2) {
+ }
+
+ public boolean func_390_a(Vec3D var1) {
+ double var2 = this.posX - var1.xCoord;
+ double var4 = this.posY - var1.yCoord;
+ double var6 = this.posZ - var1.zCoord;
+ double var8 = var2 * var2 + var4 * var4 + var6 * var6;
+ return this.func_384_a(var8);
+ }
+
+ public boolean func_384_a(double var1) {
+ double var3 = this.boundingBox.getAverageEdgeLength();
+ var3 *= 64.0D * this.field_619_ac;
+ return var1 < var3 * var3;
+ }
+
+ public String getEntityTexture() {
+ return null;
+ }
+
+ public boolean func_358_c(NBTTagCompound var1) {
+ String var2 = this.getEntityString();
+ if(!this.isDead && var2 != null) {
+ var1.setString("id", var2);
+ this.writeToNBT(var1);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ var1.setTag("Pos", this.func_375_a(new double[]{this.posX, this.posY, this.posZ}));
+ var1.setTag("Motion", this.func_375_a(new double[]{this.motionX, this.motionY, this.motionZ}));
+ var1.setTag("Rotation", this.func_377_a(new float[]{this.rotationYaw, this.rotationPitch}));
+ var1.setFloat("FallDistance", this.fallDistance);
+ var1.setShort("Fire", (short)this.fire);
+ var1.setShort("Air", (short)this.air);
+ var1.setBoolean("OnGround", this.onGround);
+ this.writeEntityToNBT(var1);
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ NBTTagList var2 = var1.getTagList("Pos");
+ NBTTagList var3 = var1.getTagList("Motion");
+ NBTTagList var4 = var1.getTagList("Rotation");
+ this.setPosition(0.0D, 0.0D, 0.0D);
+ this.motionX = ((NBTTagDouble)var3.tagAt(0)).doubleValue;
+ this.motionY = ((NBTTagDouble)var3.tagAt(1)).doubleValue;
+ this.motionZ = ((NBTTagDouble)var3.tagAt(2)).doubleValue;
+ this.prevPosX = this.lastTickPosX = this.posX = ((NBTTagDouble)var2.tagAt(0)).doubleValue;
+ this.prevPosY = this.lastTickPosY = this.posY = ((NBTTagDouble)var2.tagAt(1)).doubleValue;
+ this.prevPosZ = this.lastTickPosZ = this.posZ = ((NBTTagDouble)var2.tagAt(2)).doubleValue;
+ this.prevRotationYaw = this.rotationYaw = ((NBTTagFloat)var4.tagAt(0)).floatValue;
+ this.prevRotationPitch = this.rotationPitch = ((NBTTagFloat)var4.tagAt(1)).floatValue;
+ this.fallDistance = var1.getFloat("FallDistance");
+ this.fire = var1.getShort("Fire");
+ this.air = var1.getShort("Air");
+ this.onGround = var1.getBoolean("OnGround");
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.readEntityFromNBT(var1);
+ }
+
+ protected final String getEntityString() {
+ return EntityList.getEntityString(this);
+ }
+
+ protected abstract void readEntityFromNBT(NBTTagCompound var1);
+
+ protected abstract void writeEntityToNBT(NBTTagCompound var1);
+
+ protected NBTTagList func_375_a(double... var1) {
+ NBTTagList var2 = new NBTTagList();
+ double[] var3 = var1;
+ int var4 = var1.length;
+
+ for(int var5 = 0; var5 < var4; ++var5) {
+ double var6 = var3[var5];
+ var2.setTag(new NBTTagDouble(var6));
+ }
+
+ return var2;
+ }
+
+ protected NBTTagList func_377_a(float... var1) {
+ NBTTagList var2 = new NBTTagList();
+ float[] var3 = var1;
+ int var4 = var1.length;
+
+ for(int var5 = 0; var5 < var4; ++var5) {
+ float var6 = var3[var5];
+ var2.setTag(new NBTTagFloat(var6));
+ }
+
+ return var2;
+ }
+
+ public float func_392_h_() {
+ return this.height / 2.0F;
+ }
+
+ public EntityItem dropItem(int var1, int var2) {
+ return this.dropItemWithOffset(var1, var2, 0.0F);
+ }
+
+ public EntityItem dropItemWithOffset(int var1, int var2, float var3) {
+ EntityItem var4 = new EntityItem(this.worldObj, this.posX, this.posY + (double)var3, this.posZ, new ItemStack(var1, var2));
+ var4.field_805_c = 10;
+ this.worldObj.entityJoinedWorld(var4);
+ return var4;
+ }
+
+ public boolean isEntityAlive() {
+ return !this.isDead;
+ }
+
+ public boolean func_345_I() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.posY + (double)this.func_373_s());
+ int var3 = MathHelper.floor_double(this.posZ);
+ return this.worldObj.isBlockOpaqueCube(var1, var2, var3);
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ return false;
+ }
+
+ public AxisAlignedBB func_383_b_(Entity var1) {
+ return null;
+ }
+
+ public void func_350_p() {
+ if(this.ridingEntity.isDead) {
+ this.ridingEntity = null;
+ } else {
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ this.onUpdate();
+ this.ridingEntity.func_366_i_();
+ this.field_667_e += (double)(this.ridingEntity.rotationYaw - this.ridingEntity.prevRotationYaw);
+
+ for(this.minecartType += (double)(this.ridingEntity.rotationPitch - this.ridingEntity.prevRotationPitch); this.field_667_e >= 180.0D; this.field_667_e -= 360.0D) {
+ }
+
+ while(this.field_667_e < -180.0D) {
+ this.field_667_e += 360.0D;
+ }
+
+ while(this.minecartType >= 180.0D) {
+ this.minecartType -= 360.0D;
+ }
+
+ while(this.minecartType < -180.0D) {
+ this.minecartType += 360.0D;
+ }
+
+ double var1 = this.field_667_e * 0.5D;
+ double var3 = this.minecartType * 0.5D;
+ float var5 = 10.0F;
+ if(var1 > (double)var5) {
+ var1 = (double)var5;
+ }
+
+ if(var1 < (double)(-var5)) {
+ var1 = (double)(-var5);
+ }
+
+ if(var3 > (double)var5) {
+ var3 = (double)var5;
+ }
+
+ if(var3 < (double)(-var5)) {
+ var3 = (double)(-var5);
+ }
+
+ this.field_667_e -= var1;
+ this.minecartType -= var3;
+ this.rotationYaw = (float)((double)this.rotationYaw + var1);
+ this.rotationPitch = (float)((double)this.rotationPitch + var3);
+ }
+ }
+
+ public void func_366_i_() {
+ this.riddenByEntity.setPosition(this.posX, this.posY + this.func_402_h() + this.riddenByEntity.func_388_v(), this.posZ);
+ }
+
+ public double func_388_v() {
+ return (double)this.yOffset;
+ }
+
+ public double func_402_h() {
+ return (double)this.height * 0.75D;
+ }
+
+ public void mountEntity(Entity var1) {
+ this.minecartType = 0.0D;
+ this.field_667_e = 0.0D;
+ if(var1 == null) {
+ if(this.ridingEntity != null) {
+ this.setLocationAndAngles(this.ridingEntity.posX, this.ridingEntity.boundingBox.minY + (double)this.ridingEntity.height, this.ridingEntity.posZ, this.rotationYaw, this.rotationPitch);
+ this.ridingEntity.riddenByEntity = null;
+ }
+
+ this.ridingEntity = null;
+ } else if(this.ridingEntity == var1) {
+ this.ridingEntity.riddenByEntity = null;
+ this.ridingEntity = null;
+ this.setLocationAndAngles(var1.posX, var1.boundingBox.minY + (double)var1.height, var1.posZ, this.rotationYaw, this.rotationPitch);
+ } else {
+ if(this.ridingEntity != null) {
+ this.ridingEntity.riddenByEntity = null;
+ }
+
+ if(var1.riddenByEntity != null) {
+ var1.riddenByEntity.ridingEntity = null;
+ }
+
+ this.ridingEntity = var1;
+ var1.riddenByEntity = this;
+ }
+ }
+
+ public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) {
+ this.setPosition(var1, var3, var5);
+ this.setRotation(var7, var8);
+ }
+
+ public float func_4035_j_() {
+ return 0.1F;
+ }
+
+ public Vec3D func_4037_H() {
+ return null;
+ }
+
+ public void func_4039_q() {
+ }
+
+ public void setVelocity(double var1, double var3, double var5) {
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ }
+
+ public void func_9282_a(byte var1) {
+ }
+
+ public void func_9280_g() {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityAnimals.java b/src/main/java/net/minecraft/src/EntityAnimals.java
new file mode 100644
index 0000000..85e2824
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityAnimals.java
@@ -0,0 +1,30 @@
+package net.minecraft.src;
+
+public abstract class EntityAnimals extends EntityCreature {
+ public EntityAnimals(World var1) {
+ super(var1);
+ }
+
+ protected float func_439_a(int var1, int var2, int var3) {
+ return this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.grass.blockID ? 10.0F : this.worldObj.getLightBrightness(var1, var2, var3) - 0.5F;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ public boolean getCanSpawnHere() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.boundingBox.minY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ return this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.grass.blockID && this.worldObj.getBlockLightValue(var1, var2, var3) > 8 && super.getCanSpawnHere();
+ }
+
+ public int func_421_b() {
+ return 120;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityArrow.java b/src/main/java/net/minecraft/src/EntityArrow.java
new file mode 100644
index 0000000..e9e3aae
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityArrow.java
@@ -0,0 +1,248 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityArrow extends Entity {
+ private int xTile = -1;
+ private int yTile = -1;
+ private int zTile = -1;
+ private int inTile = 0;
+ private boolean inGround = false;
+ public int arrowShake = 0;
+ public EntityLiving field_682_g;
+ private int field_681_h;
+ private int field_680_i = 0;
+
+ public EntityArrow(World var1) {
+ super(var1);
+ this.setSize(0.5F, 0.5F);
+ }
+
+ public EntityArrow(World var1, double var2, double var4, double var6) {
+ super(var1);
+ this.setSize(0.5F, 0.5F);
+ this.setPosition(var2, var4, var6);
+ this.yOffset = 0.0F;
+ }
+
+ public EntityArrow(World var1, EntityLiving var2) {
+ super(var1);
+ this.field_682_g = var2;
+ this.setSize(0.5F, 0.5F);
+ this.setLocationAndAngles(var2.posX, var2.posY + (double)var2.func_373_s(), var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.posY -= (double)0.1F;
+ this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
+ this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI));
+ this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI));
+ this.func_408_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F);
+ }
+
+ public void func_408_a(double var1, double var3, double var5, float var7, float var8) {
+ float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ var1 /= (double)var9;
+ var3 /= (double)var9;
+ var5 /= (double)var9;
+ var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var1 *= (double)var7;
+ var3 *= (double)var7;
+ var5 *= (double)var7;
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI));
+ this.field_681_h = 0;
+ }
+
+ public void setVelocity(double var1, double var3, double var5) {
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ if(this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) {
+ float var7 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var7) * 180.0D / (double)((float)Math.PI));
+ }
+
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) {
+ float var1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var1) * 180.0D / (double)((float)Math.PI));
+ }
+
+ if(this.arrowShake > 0) {
+ --this.arrowShake;
+ }
+
+ if(this.inGround) {
+ int var15 = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
+ if(var15 == this.inTile) {
+ ++this.field_681_h;
+ if(this.field_681_h == 1200) {
+ this.setEntityDead();
+ }
+
+ return;
+ }
+
+ this.inGround = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.field_681_h = 0;
+ this.field_680_i = 0;
+ } else {
+ ++this.field_680_i;
+ }
+
+ Vec3D var16 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var16, var2);
+ var16 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expands(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ float var10;
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.field_682_g || this.field_680_i >= 5)) {
+ var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expands((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_1169_a(var16, var2);
+ if(var12 != null) {
+ double var13 = var16.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+
+ float var17;
+ if(var3 != null) {
+ if(var3.entityHit != null) {
+ if(var3.entityHit.canAttackEntity(this.field_682_g, 4)) {
+ this.worldObj.playSoundAtEntity(this, "random.drr", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
+ this.setEntityDead();
+ } else {
+ this.motionX *= (double)-0.1F;
+ this.motionY *= (double)-0.1F;
+ this.motionZ *= (double)-0.1F;
+ this.rotationYaw += 180.0F;
+ this.prevRotationYaw += 180.0F;
+ this.field_680_i = 0;
+ }
+ } else {
+ this.xTile = var3.blockX;
+ this.yTile = var3.blockY;
+ this.zTile = var3.blockZ;
+ this.inTile = this.worldObj.getBlockId(this.xTile, this.yTile, this.zTile);
+ this.motionX = (double)((float)(var3.hitVec.xCoord - this.posX));
+ this.motionY = (double)((float)(var3.hitVec.yCoord - this.posY));
+ this.motionZ = (double)((float)(var3.hitVec.zCoord - this.posZ));
+ var17 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
+ this.posX -= this.motionX / (double)var17 * (double)0.05F;
+ this.posY -= this.motionY / (double)var17 * (double)0.05F;
+ this.posZ -= this.motionZ / (double)var17 * (double)0.05F;
+ this.worldObj.playSoundAtEntity(this, "random.drr", 1.0F, 1.2F / (this.rand.nextFloat() * 0.2F + 0.9F));
+ this.inGround = true;
+ this.arrowShake = 7;
+ }
+ }
+
+ this.posX += this.motionX;
+ this.posY += this.motionY;
+ this.posZ += this.motionZ;
+ var17 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var17) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var18 = 0.99F;
+ var10 = 0.03F;
+ if(this.handleWaterMovement()) {
+ for(int var19 = 0; var19 < 4; ++var19) {
+ float var20 = 0.25F;
+ this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var20, this.posY - this.motionY * (double)var20, this.posZ - this.motionZ * (double)var20, this.motionX, this.motionY, this.motionZ);
+ }
+
+ var18 = 0.8F;
+ }
+
+ this.motionX *= (double)var18;
+ this.motionY *= (double)var18;
+ this.motionZ *= (double)var18;
+ this.motionY -= (double)var10;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.xTile);
+ var1.setShort("yTile", (short)this.yTile);
+ var1.setShort("zTile", (short)this.zTile);
+ var1.setByte("inTile", (byte)this.inTile);
+ var1.setByte("shake", (byte)this.arrowShake);
+ var1.setByte("inGround", (byte)(this.inGround ? 1 : 0));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.xTile = var1.getShort("xTile");
+ this.yTile = var1.getShort("yTile");
+ this.zTile = var1.getShort("zTile");
+ this.inTile = var1.getByte("inTile") & 255;
+ this.arrowShake = var1.getByte("shake") & 255;
+ this.inGround = var1.getByte("inGround") == 1;
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ //if(!this.worldObj.multiplayerWorld) {
+ if(this.inGround && this.field_682_g == var1 && this.arrowShake <= 0 && var1.inventory.addItemStackToInventory(new ItemStack(Item.arrow.shiftedIndex, 1))) {
+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+ var1.func_443_a_(this, 1);
+ this.setEntityDead();
+ }
+
+ //}
+ }
+
+ public float func_392_h_() {
+ return 0.0F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityBoat.java b/src/main/java/net/minecraft/src/EntityBoat.java
new file mode 100644
index 0000000..db99230
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityBoat.java
@@ -0,0 +1,319 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityBoat extends Entity {
+ public int field_807_a;
+ public int field_806_b;
+ public int field_808_c;
+ private int field_9394_d;
+ private double field_9393_e;
+ private double field_9392_f;
+ private double field_9391_g;
+ private double field_9390_h;
+ private double field_9389_i;
+ private double field_9388_j;
+ private double field_9387_k;
+ private double field_9386_l;
+
+ public EntityBoat(World var1) {
+ super(var1);
+ this.field_807_a = 0;
+ this.field_806_b = 0;
+ this.field_808_c = 1;
+ this.field_618_ad = true;
+ this.setSize(1.5F, 0.6F);
+ this.yOffset = this.height / 2.0F;
+ this.entityWalks = false;
+ }
+
+ public AxisAlignedBB func_383_b_(Entity var1) {
+ return var1.boundingBox;
+ }
+
+ public AxisAlignedBB func_372_f_() {
+ return this.boundingBox;
+ }
+
+ public boolean canBePushed() {
+ return true;
+ }
+
+ public EntityBoat(World var1, double var2, double var4, double var6) {
+ this(var1);
+ this.setPosition(var2, var4 + (double)this.yOffset, var6);
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ this.prevPosX = var2;
+ this.prevPosY = var4;
+ this.prevPosZ = var6;
+ }
+
+ public double func_402_h() {
+ return (double)this.height * 0.0D - (double)0.3F;
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ if(!this.isDead) {
+ this.field_808_c = -this.field_808_c;
+ this.field_806_b = 10;
+ this.field_807_a += var2 * 10;
+ this.func_9281_M();
+ if(this.field_807_a > 40) {
+ int var3;
+ for(var3 = 0; var3 < 3; ++var3) {
+ this.dropItemWithOffset(Block.planks.blockID, 1, 0.0F);
+ }
+
+ for(var3 = 0; var3 < 2; ++var3) {
+ this.dropItemWithOffset(Item.stick.shiftedIndex, 1, 0.0F);
+ }
+
+ this.setEntityDead();
+ }
+
+ return true;
+ } else {
+ return true;
+ }
+ }
+
+ public void func_9280_g() {
+ this.field_808_c = -this.field_808_c;
+ this.field_806_b = 10;
+ this.field_807_a += this.field_807_a * 10;
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) {
+ this.field_9393_e = var1;
+ this.field_9392_f = var3;
+ this.field_9391_g = var5;
+ this.field_9390_h = (double)var7;
+ this.field_9389_i = (double)var8;
+ this.field_9394_d = var9 + 4;
+ this.motionX = this.field_9388_j;
+ this.motionY = this.field_9387_k;
+ this.motionZ = this.field_9386_l;
+ }
+
+ public void setVelocity(double var1, double var3, double var5) {
+ this.field_9388_j = this.motionX = var1;
+ this.field_9387_k = this.motionY = var3;
+ this.field_9386_l = this.motionZ = var5;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.field_806_b > 0) {
+ --this.field_806_b;
+ }
+
+ if(this.field_807_a > 0) {
+ --this.field_807_a;
+ }
+
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ byte var1 = 5;
+ double var2 = 0.0D;
+
+ for(int var4 = 0; var4 < var1; ++var4) {
+ double var5 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var4 + 0) / (double)var1 - 0.125D;
+ double var7 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var4 + 1) / (double)var1 - 0.125D;
+ AxisAlignedBB var9 = AxisAlignedBB.getBoundingBoxFromPool(this.boundingBox.minX, var5, this.boundingBox.minZ, this.boundingBox.maxX, var7, this.boundingBox.maxZ);
+ if(this.worldObj.func_707_b(var9, Material.water)) {
+ var2 += 1.0D / (double)var1;
+ }
+ }
+
+ double var6;
+ double var8;
+ double var10;
+ double var23;
+ //if(this.worldObj.multiplayerWorld) {
+ //if(this.field_9394_d > 0) {
+ //var23 = this.posX + (this.field_9393_e - this.posX) / (double)this.field_9394_d;
+ //var6 = this.posY + (this.field_9392_f - this.posY) / (double)this.field_9394_d;
+ //var8 = this.posZ + (this.field_9391_g - this.posZ) / (double)this.field_9394_d;
+
+ //for(var10 = this.field_9390_h - (double)this.rotationYaw; var10 < -180.0D; var10 += 360.0D) {
+ //}
+
+ //while(var10 >= 180.0D) {
+ //var10 -= 360.0D;
+ //}
+
+ //this.rotationYaw = (float)((double)this.rotationYaw + var10 / (double)this.field_9394_d);
+ //this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9389_i - (double)this.rotationPitch) / (double)this.field_9394_d);
+ //--this.field_9394_d;
+ //this.setPosition(var23, var6, var8);
+ //this.setRotation(this.rotationYaw, this.rotationPitch);
+ //} else {
+ //var23 = this.posX + this.motionX;
+ //var6 = this.posY + this.motionY;
+ //var8 = this.posZ + this.motionZ;
+ //this.setPosition(var23, var6, var8);
+ //if(this.onGround) {
+ //this.motionX *= 0.5D;
+ //this.motionY *= 0.5D;
+ //this.motionZ *= 0.5D;
+ //}
+
+ //this.motionX *= (double)0.99F;
+ //this.motionY *= (double)0.95F;
+ //this.motionZ *= (double)0.99F;
+ //}
+
+ //} else {
+ var23 = var2 * 2.0D - 1.0D;
+ this.motionY += (double)0.04F * var23;
+ if(this.riddenByEntity != null) {
+ this.motionX += this.riddenByEntity.motionX * 0.2D;
+ this.motionZ += this.riddenByEntity.motionZ * 0.2D;
+ }
+
+ var6 = 0.4D;
+ if(this.motionX < -var6) {
+ this.motionX = -var6;
+ }
+
+ if(this.motionX > var6) {
+ this.motionX = var6;
+ }
+
+ if(this.motionZ < -var6) {
+ this.motionZ = -var6;
+ }
+
+ if(this.motionZ > var6) {
+ this.motionZ = var6;
+ }
+
+ if(this.onGround) {
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ var8 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ double var12;
+ if(var8 > 0.15D) {
+ var10 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D);
+ var12 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D);
+
+ for(int var14 = 0; (double)var14 < 1.0D + var8 * 60.0D; ++var14) {
+ double var15 = (double)(this.rand.nextFloat() * 2.0F - 1.0F);
+ double var17 = (double)(this.rand.nextInt(2) * 2 - 1) * 0.7D;
+ double var19;
+ double var21;
+ if(this.rand.nextBoolean()) {
+ var19 = this.posX - var10 * var15 * 0.8D + var12 * var17;
+ var21 = this.posZ - var12 * var15 * 0.8D - var10 * var17;
+ this.worldObj.spawnParticle("splash", var19, this.posY - 0.125D, var21, this.motionX, this.motionY, this.motionZ);
+ } else {
+ var19 = this.posX + var10 + var12 * var15 * 0.7D;
+ var21 = this.posZ + var12 - var10 * var15 * 0.7D;
+ this.worldObj.spawnParticle("splash", var19, this.posY - 0.125D, var21, this.motionX, this.motionY, this.motionZ);
+ }
+ }
+ }
+
+ if(this.field_9297_aI && var8 > 0.15D) {
+ //if(!this.worldObj.multiplayerWorld) {
+ this.setEntityDead();
+
+ int var24;
+ for(var24 = 0; var24 < 3; ++var24) {
+ this.dropItemWithOffset(Block.planks.blockID, 1, 0.0F);
+ }
+
+ for(var24 = 0; var24 < 2; ++var24) {
+ this.dropItemWithOffset(Item.stick.shiftedIndex, 1, 0.0F);
+ }
+ //}
+ } else {
+ this.motionX *= (double)0.99F;
+ this.motionY *= (double)0.95F;
+ this.motionZ *= (double)0.99F;
+ }
+
+ this.rotationPitch = 0.0F;
+ var10 = (double)this.rotationYaw;
+ var12 = this.prevPosX - this.posX;
+ double var25 = this.prevPosZ - this.posZ;
+ if(var12 * var12 + var25 * var25 > 0.001D) {
+ var10 = (double)((float)(Math.atan2(var25, var12) * 180.0D / Math.PI));
+ }
+
+ double var16;
+ for(var16 = var10 - (double)this.rotationYaw; var16 >= 180.0D; var16 -= 360.0D) {
+ }
+
+ while(var16 < -180.0D) {
+ var16 += 360.0D;
+ }
+
+ if(var16 > 20.0D) {
+ var16 = 20.0D;
+ }
+
+ if(var16 < -20.0D) {
+ var16 = -20.0D;
+ }
+
+ this.rotationYaw = (float)((double)this.rotationYaw + var16);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ List var18 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands((double)0.2F, 0.0D, (double)0.2F));
+ if(var18 != null && var18.size() > 0) {
+ for(int var26 = 0; var26 < var18.size(); ++var26) {
+ Entity var20 = (Entity)var18.get(var26);
+ if(var20 != this.riddenByEntity && var20.canBePushed() && var20 instanceof EntityBoat) {
+ var20.applyEntityCollision(this);
+ }
+ }
+ }
+
+ if(this.riddenByEntity != null && this.riddenByEntity.isDead) {
+ this.riddenByEntity = null;
+ }
+
+ //}
+ }
+
+ public void func_366_i_() {
+ if(this.riddenByEntity != null) {
+ double var1 = Math.cos((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D;
+ double var3 = Math.sin((double)this.rotationYaw * Math.PI / 180.0D) * 0.4D;
+ this.riddenByEntity.setPosition(this.posX + var1, this.posY + this.func_402_h() + this.riddenByEntity.func_388_v(), this.posZ + var3);
+ }
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ }
+
+ public float func_392_h_() {
+ return 0.0F;
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ if(this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != var1) {
+ return true;
+ } else {
+ //if(!this.worldObj.multiplayerWorld) {
+ var1.mountEntity(this);
+ //}
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityBubbleFX.java b/src/main/java/net/minecraft/src/EntityBubbleFX.java
new file mode 100644
index 0000000..65cc2b8
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityBubbleFX.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+public class EntityBubbleFX extends EntityFX {
+ public EntityBubbleFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ super(var1, var2, var4, var6, var8, var10, var12);
+ this.field_663_i = 1.0F;
+ this.field_662_j = 1.0F;
+ this.field_661_k = 1.0F;
+ this.field_670_b = 32;
+ this.setSize(0.02F, 0.02F);
+ this.field_665_g *= this.rand.nextFloat() * 0.6F + 0.2F;
+ this.motionX = var8 * (double)0.2F + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.02F);
+ this.motionY = var10 * (double)0.2F + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.02F);
+ this.motionZ = var12 * (double)0.2F + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.02F);
+ this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D));
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY += 0.002D;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.85F;
+ this.motionY *= (double)0.85F;
+ this.motionZ *= (double)0.85F;
+ if(this.worldObj.getBlockMaterial(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) != Material.water) {
+ this.setEntityDead();
+ }
+
+ if(this.field_666_f-- <= 0) {
+ this.setEntityDead();
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityChicken.java b/src/main/java/net/minecraft/src/EntityChicken.java
new file mode 100644
index 0000000..a7d2776
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityChicken.java
@@ -0,0 +1,77 @@
+package net.minecraft.src;
+
+public class EntityChicken extends EntityAnimals {
+ public boolean field_753_a = false;
+ public float field_752_b = 0.0F;
+ public float field_758_c = 0.0F;
+ public float field_757_d;
+ public float field_756_e;
+ public float field_755_h = 1.0F;
+ public int timeUntilNextEgg;
+
+ public EntityChicken(World var1) {
+ super(var1);
+ this.texture = "/mob/chicken.png";
+ this.setSize(0.3F, 0.4F);
+ this.health = 4;
+ this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000;
+ }
+
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+ this.field_756_e = this.field_752_b;
+ this.field_757_d = this.field_758_c;
+ this.field_758_c = (float)((double)this.field_758_c + (double)(this.onGround ? -1 : 4) * 0.3D);
+ if(this.field_758_c < 0.0F) {
+ this.field_758_c = 0.0F;
+ }
+
+ if(this.field_758_c > 1.0F) {
+ this.field_758_c = 1.0F;
+ }
+
+ if(!this.onGround && this.field_755_h < 1.0F) {
+ this.field_755_h = 1.0F;
+ }
+
+ this.field_755_h = (float)((double)this.field_755_h * 0.9D);
+ if(!this.onGround && this.motionY < 0.0D) {
+ this.motionY *= 0.6D;
+ }
+
+ this.field_752_b += this.field_755_h * 2.0F;
+ if(--this.timeUntilNextEgg <= 0) {
+ this.worldObj.playSoundAtEntity(this, "mob.chickenplop", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ this.dropItem(Item.egg.shiftedIndex, 1);
+ this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000;
+ }
+
+ }
+
+ protected void fall(float var1) {
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected String getLivingSound() {
+ return "mob.chicken";
+ }
+
+ protected String getHurtSound() {
+ return "mob.chickenhurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.chickenhurt";
+ }
+
+ protected int getDropItemId() {
+ return Item.feather.shiftedIndex;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityCow.java b/src/main/java/net/minecraft/src/EntityCow.java
new file mode 100644
index 0000000..2f63ca7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityCow.java
@@ -0,0 +1,49 @@
+package net.minecraft.src;
+
+public class EntityCow extends EntityAnimals {
+ public boolean unusedBoolean = false;
+
+ public EntityCow(World var1) {
+ super(var1);
+ this.texture = "/mob/cow.png";
+ this.setSize(0.9F, 1.3F);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected String getLivingSound() {
+ return "mob.cow";
+ }
+
+ protected String getHurtSound() {
+ return "mob.cowhurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.cowhurt";
+ }
+
+ protected float getSoundVolume() {
+ return 0.4F;
+ }
+
+ protected int getDropItemId() {
+ return Item.leather.shiftedIndex;
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ ItemStack var2 = var1.inventory.getCurrentItem();
+ if(var2 != null && var2.itemID == Item.bucketEmpty.shiftedIndex) {
+ var1.inventory.setInventorySlotContents(var1.inventory.currentItem, new ItemStack(Item.bucketMilk));
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityCreature.java b/src/main/java/net/minecraft/src/EntityCreature.java
new file mode 100644
index 0000000..ae54fb3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityCreature.java
@@ -0,0 +1,151 @@
+package net.minecraft.src;
+
+public class EntityCreature extends EntityLiving {
+ private PathEntity pathToEntity;
+ protected Entity playerToAttack;
+ protected boolean hasAttacked = false;
+
+ public EntityCreature(World var1) {
+ super(var1);
+ }
+
+ protected void func_418_b_() {
+ this.hasAttacked = false;
+ float var1 = 16.0F;
+ if(this.playerToAttack == null) {
+ this.playerToAttack = this.findPlayerToAttack();
+ if(this.playerToAttack != null) {
+ this.pathToEntity = this.worldObj.getPathToEntity(this, this.playerToAttack, var1);
+ }
+ } else if(!this.playerToAttack.isEntityAlive()) {
+ this.playerToAttack = null;
+ } else {
+ float var2 = this.playerToAttack.getDistanceToEntity(this);
+ if(this.canEntityBeSeen(this.playerToAttack)) {
+ this.attackEntity(this.playerToAttack, var2);
+ }
+ }
+
+ if(this.hasAttacked || this.playerToAttack == null || this.pathToEntity != null && this.rand.nextInt(20) != 0) {
+ if(this.pathToEntity == null && this.rand.nextInt(80) == 0 || this.rand.nextInt(80) == 0) {
+ boolean var21 = false;
+ int var3 = -1;
+ int var4 = -1;
+ int var5 = -1;
+ float var6 = -99999.0F;
+
+ for(int var7 = 0; var7 < 10; ++var7) {
+ int var8 = MathHelper.floor_double(this.posX + (double)this.rand.nextInt(13) - 6.0D);
+ int var9 = MathHelper.floor_double(this.posY + (double)this.rand.nextInt(7) - 3.0D);
+ int var10 = MathHelper.floor_double(this.posZ + (double)this.rand.nextInt(13) - 6.0D);
+ float var11 = this.func_439_a(var8, var9, var10);
+ if(var11 > var6) {
+ var6 = var11;
+ var3 = var8;
+ var4 = var9;
+ var5 = var10;
+ var21 = true;
+ }
+ }
+
+ if(var21) {
+ this.pathToEntity = this.worldObj.getEntityPathToXYZ(this, var3, var4, var5, 10.0F);
+ }
+ }
+ } else {
+ this.pathToEntity = this.worldObj.getPathToEntity(this, this.playerToAttack, var1);
+ }
+
+ int var22 = MathHelper.floor_double(this.boundingBox.minY);
+ boolean var23 = this.handleWaterMovement();
+ boolean var24 = this.handleLavaMovement();
+ this.rotationPitch = 0.0F;
+ if(this.pathToEntity != null && this.rand.nextInt(100) != 0) {
+ Vec3D var25 = this.pathToEntity.getPosition(this);
+ double var26 = (double)(this.width * 2.0F);
+
+ while(var25 != null && var25.squareDistanceTo(this.posX, var25.yCoord, this.posZ) < var26 * var26) {
+ this.pathToEntity.incrementPathIndex();
+ if(this.pathToEntity.isFinished()) {
+ var25 = null;
+ this.pathToEntity = null;
+ } else {
+ var25 = this.pathToEntity.getPosition(this);
+ }
+ }
+
+ this.isJumping = false;
+ if(var25 != null) {
+ double var27 = var25.xCoord - this.posX;
+ double var28 = var25.zCoord - this.posZ;
+ double var12 = var25.yCoord - (double)var22;
+ float var14 = (float)(Math.atan2(var28, var27) * 180.0D / (double)((float)Math.PI)) - 90.0F;
+ float var15 = var14 - this.rotationYaw;
+
+ for(this.field_9340_ai = this.field_9333_am; var15 < -180.0F; var15 += 360.0F) {
+ }
+
+ while(var15 >= 180.0F) {
+ var15 -= 360.0F;
+ }
+
+ if(var15 > 30.0F) {
+ var15 = 30.0F;
+ }
+
+ if(var15 < -30.0F) {
+ var15 = -30.0F;
+ }
+
+ this.rotationYaw += var15;
+ if(this.hasAttacked && this.playerToAttack != null) {
+ double var16 = this.playerToAttack.posX - this.posX;
+ double var18 = this.playerToAttack.posZ - this.posZ;
+ float var20 = this.rotationYaw;
+ this.rotationYaw = (float)(Math.atan2(var18, var16) * 180.0D / (double)((float)Math.PI)) - 90.0F;
+ var15 = (var20 - this.rotationYaw + 90.0F) * (float)Math.PI / 180.0F;
+ this.field_9342_ah = -MathHelper.sin(var15) * this.field_9340_ai * 1.0F;
+ this.field_9340_ai = MathHelper.cos(var15) * this.field_9340_ai * 1.0F;
+ }
+
+ if(var12 > 0.0D) {
+ this.isJumping = true;
+ }
+ }
+
+ if(this.playerToAttack != null) {
+ this.faceEntity(this.playerToAttack, 30.0F);
+ }
+
+ if(this.field_9297_aI) {
+ this.isJumping = true;
+ }
+
+ if(this.rand.nextFloat() < 0.8F && (var23 || var24)) {
+ this.isJumping = true;
+ }
+
+ } else {
+ super.func_418_b_();
+ this.pathToEntity = null;
+ }
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ }
+
+ protected float func_439_a(int var1, int var2, int var3) {
+ return 0.0F;
+ }
+
+ protected Entity findPlayerToAttack() {
+ return null;
+ }
+
+ public boolean getCanSpawnHere() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.boundingBox.minY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ return super.getCanSpawnHere() && this.func_439_a(var1, var2, var3) >= 0.0F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityCreeper.java b/src/main/java/net/minecraft/src/EntityCreeper.java
new file mode 100644
index 0000000..a43f99b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityCreeper.java
@@ -0,0 +1,126 @@
+package net.minecraft.src;
+
+public class EntityCreeper extends EntityMobs {
+ int timeSinceIgnited;
+ int lastActiveTime;
+ int fuseTime = 30;
+ int creeperState = -1;
+ int field_12241_e = -1;
+
+ public EntityCreeper(World var1) {
+ super(var1);
+ this.texture = "/mob/creeper.png";
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ public void func_9282_a(byte var1) {
+ super.func_9282_a(var1);
+ if(var1 == 4) {
+ if(this.timeSinceIgnited == 0) {
+ this.worldObj.playSoundAtEntity(this, "random.fuse", 1.0F, 0.5F);
+ }
+
+ this.creeperState = 1;
+ }
+
+ if(var1 == 5) {
+ this.creeperState = -1;
+ }
+
+ }
+
+ public void onUpdate() {
+ this.lastActiveTime = this.timeSinceIgnited;
+// if(this.worldObj.multiplayerWorld) {
+// this.timeSinceIgnited += this.creeperState;
+// if(this.timeSinceIgnited < 0) {
+// this.timeSinceIgnited = 0;
+// }
+//
+// if(this.timeSinceIgnited >= this.fuseTime) {
+// this.timeSinceIgnited = this.fuseTime;
+// }
+// }
+
+ super.onUpdate();
+ }
+
+ protected void func_418_b_() {
+ if(this.field_12241_e != this.creeperState) {
+ this.field_12241_e = this.creeperState;
+ if(this.creeperState > 0) {
+ this.worldObj.func_9425_a(this, (byte)4);
+ } else {
+ this.worldObj.func_9425_a(this, (byte)5);
+ }
+ }
+
+ this.lastActiveTime = this.timeSinceIgnited;
+ //if(this.worldObj.multiplayerWorld) {
+ //super.func_418_b_();
+ //} else {
+ if(this.timeSinceIgnited > 0 && this.creeperState < 0) {
+ --this.timeSinceIgnited;
+ }
+
+ if(this.creeperState >= 0) {
+ this.creeperState = 2;
+ }
+
+ super.func_418_b_();
+ if(this.creeperState != 1) {
+ this.creeperState = -1;
+ }
+ //}
+
+ }
+
+ protected String getHurtSound() {
+ return "mob.creeper";
+ }
+
+ protected String getDeathSound() {
+ return "mob.creeperdeath";
+ }
+
+ public void onDeath(Entity var1) {
+ super.onDeath(var1);
+ if(var1 instanceof EntitySkeleton) {
+ this.dropItem(Item.record13.shiftedIndex + this.rand.nextInt(2), 1);
+ }
+
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ if(this.creeperState <= 0 && var2 < 3.0F || this.creeperState > 0 && var2 < 7.0F) {
+ if(this.timeSinceIgnited == 0) {
+ this.worldObj.playSoundAtEntity(this, "random.fuse", 1.0F, 0.5F);
+ }
+
+ this.creeperState = 1;
+ ++this.timeSinceIgnited;
+ if(this.timeSinceIgnited == this.fuseTime) {
+ this.worldObj.func_12243_a(this, this.posX, this.posY, this.posZ, 3.0F);
+ this.setEntityDead();
+ }
+
+ this.hasAttacked = true;
+ }
+
+ }
+
+ public float func_440_b(float var1) {
+ return ((float)this.lastActiveTime + (float)(this.timeSinceIgnited - this.lastActiveTime) * var1) / (float)(this.fuseTime - 2);
+ }
+
+ protected int getDropItemId() {
+ return Item.gunpowder.shiftedIndex;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityDiggingFX.java b/src/main/java/net/minecraft/src/EntityDiggingFX.java
new file mode 100644
index 0000000..02dc04c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityDiggingFX.java
@@ -0,0 +1,47 @@
+package net.minecraft.src;
+
+public class EntityDiggingFX extends EntityFX {
+ private Block field_4082_a;
+
+ public EntityDiggingFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12, Block var14) {
+ super(var1, var2, var4, var6, var8, var10, var12);
+ this.field_4082_a = var14;
+ this.field_670_b = var14.blockIndexInTexture;
+ this.field_664_h = var14.field_357_bm;
+ this.field_663_i = this.field_662_j = this.field_661_k = 0.6F;
+ this.field_665_g /= 2.0F;
+ }
+
+ public EntityDiggingFX func_4041_a(int var1, int var2, int var3) {
+ if(this.field_4082_a == Block.grass) {
+ return this;
+ } else {
+ int var4 = this.field_4082_a.colorMultiplier(this.worldObj, var1, var2, var3);
+ this.field_663_i *= (float)(var4 >> 16 & 255) / 255.0F;
+ this.field_662_j *= (float)(var4 >> 8 & 255) / 255.0F;
+ this.field_661_k *= (float)(var4 & 255) / 255.0F;
+ return this;
+ }
+ }
+
+ public int func_404_c() {
+ return 1;
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = ((float)(this.field_670_b % 16) + this.field_669_c / 4.0F) / 16.0F;
+ float var9 = var8 + 0.999F / 64.0F;
+ float var10 = ((float)(this.field_670_b / 16) + this.field_668_d / 4.0F) / 16.0F;
+ float var11 = var10 + 0.999F / 64.0F;
+ float var12 = 0.1F * this.field_665_g;
+ float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)var2 - field_660_l);
+ float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)var2 - field_659_m);
+ float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)var2 - field_658_n);
+ float var16 = this.getEntityBrightness(var2);
+ var1.setColorOpaque_F(var16 * this.field_663_i, var16 * this.field_662_j, var16 * this.field_661_k);
+ var1.addVertexWithUV((double)(var13 - var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 - var5 * var12 - var7 * var12), (double)var8, (double)var11);
+ var1.addVertexWithUV((double)(var13 - var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 - var5 * var12 + var7 * var12), (double)var8, (double)var10);
+ var1.addVertexWithUV((double)(var13 + var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 + var5 * var12 + var7 * var12), (double)var9, (double)var10);
+ var1.addVertexWithUV((double)(var13 + var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 + var5 * var12 - var7 * var12), (double)var9, (double)var11);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityExplodeFX.java b/src/main/java/net/minecraft/src/EntityExplodeFX.java
new file mode 100644
index 0000000..26bee93
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityExplodeFX.java
@@ -0,0 +1,38 @@
+package net.minecraft.src;
+
+public class EntityExplodeFX extends EntityFX {
+ public EntityExplodeFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ super(var1, var2, var4, var6, var8, var10, var12);
+ this.motionX = var8 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.05F);
+ this.motionY = var10 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.05F);
+ this.motionZ = var12 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.05F);
+ this.field_663_i = this.field_662_j = this.field_661_k = this.rand.nextFloat() * 0.3F + 0.7F;
+ this.field_665_g = this.rand.nextFloat() * this.rand.nextFloat() * 6.0F + 1.0F;
+ this.field_666_f = (int)(16.0D / ((double)this.rand.nextFloat() * 0.8D + 0.2D)) + 2;
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ super.func_406_a(var1, var2, var3, var4, var5, var6, var7);
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ if(this.e++ >= this.field_666_f) {
+ this.setEntityDead();
+ }
+
+ this.field_670_b = 7 - this.e * 8 / this.field_666_f;
+ this.motionY += 0.004D;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.9F;
+ this.motionY *= (double)0.9F;
+ this.motionZ *= (double)0.9F;
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityFX.java b/src/main/java/net/minecraft/src/EntityFX.java
new file mode 100644
index 0000000..9e64ab9
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityFX.java
@@ -0,0 +1,99 @@
+package net.minecraft.src;
+
+public class EntityFX extends Entity {
+ protected int field_670_b;
+ protected float field_669_c;
+ protected float field_668_d;
+ protected int e = 0;
+ protected int field_666_f = 0;
+ protected float field_665_g;
+ protected float field_664_h;
+ protected float field_663_i;
+ protected float field_662_j;
+ protected float field_661_k;
+ public static double field_660_l;
+ public static double field_659_m;
+ public static double field_658_n;
+
+ public EntityFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ super(var1);
+ this.setSize(0.2F, 0.2F);
+ this.yOffset = this.height / 2.0F;
+ this.setPosition(var2, var4, var6);
+ this.field_663_i = this.field_662_j = this.field_661_k = 1.0F;
+ this.motionX = var8 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.4F);
+ this.motionY = var10 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.4F);
+ this.motionZ = var12 + (double)((float)(Math.random() * 2.0D - 1.0D) * 0.4F);
+ float var14 = (float)(Math.random() + Math.random() + 1.0D) * 0.15F;
+ float var15 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionY * this.motionY + this.motionZ * this.motionZ);
+ this.motionX = this.motionX / (double)var15 * (double)var14 * (double)0.4F;
+ this.motionY = this.motionY / (double)var15 * (double)var14 * (double)0.4F + (double)0.1F;
+ this.motionZ = this.motionZ / (double)var15 * (double)var14 * (double)0.4F;
+ this.field_669_c = this.rand.nextFloat() * 3.0F;
+ this.field_668_d = this.rand.nextFloat() * 3.0F;
+ this.field_665_g = (this.rand.nextFloat() * 0.5F + 0.5F) * 2.0F;
+ this.field_666_f = (int)(4.0F / (this.rand.nextFloat() * 0.9F + 0.1F));
+ this.e = 0;
+ this.entityWalks = false;
+ }
+
+ public EntityFX func_407_b(float var1) {
+ this.motionX *= (double)var1;
+ this.motionY = (this.motionY - (double)0.1F) * (double)var1 + (double)0.1F;
+ this.motionZ *= (double)var1;
+ return this;
+ }
+
+ public EntityFX func_405_d(float var1) {
+ this.setSize(0.2F * var1, 0.2F * var1);
+ this.field_665_g *= var1;
+ return this;
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ if(this.e++ >= this.field_666_f) {
+ this.setEntityDead();
+ }
+
+ this.motionY -= 0.04D * (double)this.field_664_h;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.98F;
+ this.motionY *= (double)0.98F;
+ this.motionZ *= (double)0.98F;
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ }
+
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = (float)(this.field_670_b % 16) / 16.0F;
+ float var9 = var8 + 0.999F / 16.0F;
+ float var10 = (float)(this.field_670_b / 16) / 16.0F;
+ float var11 = var10 + 0.999F / 16.0F;
+ float var12 = 0.1F * this.field_665_g;
+ float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)var2 - field_660_l);
+ float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)var2 - field_659_m);
+ float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)var2 - field_658_n);
+ float var16 = this.getEntityBrightness(var2);
+ var1.setColorOpaque_F(this.field_663_i * var16, this.field_662_j * var16, this.field_661_k * var16);
+ var1.addVertexWithUV((double)(var13 - var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 - var5 * var12 - var7 * var12), (double)var8, (double)var11);
+ var1.addVertexWithUV((double)(var13 - var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 - var5 * var12 + var7 * var12), (double)var8, (double)var10);
+ var1.addVertexWithUV((double)(var13 + var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 + var5 * var12 + var7 * var12), (double)var9, (double)var10);
+ var1.addVertexWithUV((double)(var13 + var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 + var5 * var12 - var7 * var12), (double)var9, (double)var11);
+ }
+
+ public int func_404_c() {
+ return 0;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityFallingSand.java b/src/main/java/net/minecraft/src/EntityFallingSand.java
new file mode 100644
index 0000000..c72839b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityFallingSand.java
@@ -0,0 +1,82 @@
+package net.minecraft.src;
+
+public class EntityFallingSand extends Entity {
+ public int field_799_a;
+ public int field_798_b = 0;
+
+ public EntityFallingSand(World var1) {
+ super(var1);
+ }
+
+ public EntityFallingSand(World var1, float var2, float var3, float var4, int var5) {
+ super(var1);
+ this.field_799_a = var5;
+ this.field_618_ad = true;
+ this.setSize(0.98F, 0.98F);
+ this.yOffset = this.height / 2.0F;
+ this.setPosition((double)var2, (double)var3, (double)var4);
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ this.entityWalks = false;
+ this.prevPosX = (double)var2;
+ this.prevPosY = (double)var3;
+ this.prevPosZ = (double)var4;
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public void onUpdate() {
+ if(this.field_799_a == 0) {
+ this.setEntityDead();
+ } else {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ ++this.field_798_b;
+ this.motionY -= (double)0.04F;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.98F;
+ this.motionY *= (double)0.98F;
+ this.motionZ *= (double)0.98F;
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.posY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ if(this.worldObj.getBlockId(var1, var2, var3) == this.field_799_a) {
+ this.worldObj.setBlockWithNotify(var1, var2, var3, 0);
+ }
+
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ this.motionY *= -0.5D;
+ this.setEntityDead();
+ if(!this.worldObj.canBlockBePlacedAt(this.field_799_a, var1, var2, var3, true) || !this.worldObj.setBlockWithNotify(var1, var2, var3, this.field_799_a)) {
+ this.dropItem(this.field_799_a, 1);
+ }
+ } else if(this.field_798_b > 100) {
+ this.dropItem(this.field_799_a, 1);
+ this.setEntityDead();
+ }
+
+ }
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setByte("Tile", (byte)this.field_799_a);
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ this.field_799_a = var1.getByte("Tile") & 255;
+ }
+
+ public float func_392_h_() {
+ return 0.0F;
+ }
+
+ public World func_465_i() {
+ return this.worldObj;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityFireball.java b/src/main/java/net/minecraft/src/EntityFireball.java
new file mode 100644
index 0000000..b912338
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityFireball.java
@@ -0,0 +1,207 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityFireball extends Entity {
+ private int field_9402_e = -1;
+ private int field_9401_f = -1;
+ private int field_9400_g = -1;
+ private int field_9399_h = 0;
+ private boolean field_9398_i = false;
+ public int field_9406_a = 0;
+ private EntityLiving field_9397_j;
+ private int field_9396_k;
+ private int field_9395_l = 0;
+ public double field_9405_b;
+ public double field_9404_c;
+ public double field_9403_d;
+
+ public EntityFireball(World var1) {
+ super(var1);
+ this.setSize(1.0F, 1.0F);
+ }
+
+ public boolean func_384_a(double var1) {
+ double var3 = this.boundingBox.getAverageEdgeLength() * 4.0D;
+ var3 *= 64.0D;
+ return var1 < var3 * var3;
+ }
+
+ public EntityFireball(World var1, EntityLiving var2, double var3, double var5, double var7) {
+ super(var1);
+ this.field_9397_j = var2;
+ this.setSize(1.0F, 1.0F);
+ this.setLocationAndAngles(var2.posX, var2.posY, var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ this.motionX = this.motionY = this.motionZ = 0.0D;
+ var3 += this.rand.nextGaussian() * 0.4D;
+ var5 += this.rand.nextGaussian() * 0.4D;
+ var7 += this.rand.nextGaussian() * 0.4D;
+ double var9 = (double)MathHelper.sqrt_double(var3 * var3 + var5 * var5 + var7 * var7);
+ this.field_9405_b = var3 / var9 * 0.1D;
+ this.field_9404_c = var5 / var9 * 0.1D;
+ this.field_9403_d = var7 / var9 * 0.1D;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ this.fire = 10;
+ if(this.field_9406_a > 0) {
+ --this.field_9406_a;
+ }
+
+ if(this.field_9398_i) {
+ int var1 = this.worldObj.getBlockId(this.field_9402_e, this.field_9401_f, this.field_9400_g);
+ if(var1 == this.field_9399_h) {
+ ++this.field_9396_k;
+ if(this.field_9396_k == 1200) {
+ this.setEntityDead();
+ }
+
+ return;
+ }
+
+ this.field_9398_i = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.field_9396_k = 0;
+ this.field_9395_l = 0;
+ } else {
+ ++this.field_9395_l;
+ }
+
+ Vec3D var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var15, var2);
+ var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expands(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.field_9397_j || this.field_9395_l >= 25)) {
+ float var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expands((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_1169_a(var15, var2);
+ if(var12 != null) {
+ double var13 = var15.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+
+ if(var3 != null) {
+ if(var3.entityHit != null && var3.entityHit.canAttackEntity(this.field_9397_j, 0)) {
+ }
+
+ this.worldObj.func_12244_a((Entity)null, this.posX, this.posY, this.posZ, 1.0F, true);
+ this.setEntityDead();
+ }
+
+ this.posX += this.motionX;
+ this.posY += this.motionY;
+ this.posZ += this.motionZ;
+ float var16 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var16) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var17 = 0.95F;
+ if(this.handleWaterMovement()) {
+ for(int var18 = 0; var18 < 4; ++var18) {
+ float var19 = 0.25F;
+ this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var19, this.posY - this.motionY * (double)var19, this.posZ - this.motionZ * (double)var19, this.motionX, this.motionY, this.motionZ);
+ }
+
+ var17 = 0.8F;
+ }
+
+ this.motionX += this.field_9405_b;
+ this.motionY += this.field_9404_c;
+ this.motionZ += this.field_9403_d;
+ this.motionX *= (double)var17;
+ this.motionY *= (double)var17;
+ this.motionZ *= (double)var17;
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.field_9402_e);
+ var1.setShort("yTile", (short)this.field_9401_f);
+ var1.setShort("zTile", (short)this.field_9400_g);
+ var1.setByte("inTile", (byte)this.field_9399_h);
+ var1.setByte("shake", (byte)this.field_9406_a);
+ var1.setByte("inGround", (byte)(this.field_9398_i ? 1 : 0));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.field_9402_e = var1.getShort("xTile");
+ this.field_9401_f = var1.getShort("yTile");
+ this.field_9400_g = var1.getShort("zTile");
+ this.field_9399_h = var1.getByte("inTile") & 255;
+ this.field_9406_a = var1.getByte("shake") & 255;
+ this.field_9398_i = var1.getByte("inGround") == 1;
+ }
+
+ public boolean canBeCollidedWith() {
+ return true;
+ }
+
+ public float func_4035_j_() {
+ return 1.0F;
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ this.func_9281_M();
+ if(var1 != null) {
+ Vec3D var3 = var1.func_4037_H();
+ if(var3 != null) {
+ this.motionX = var3.xCoord;
+ this.motionY = var3.yCoord;
+ this.motionZ = var3.zCoord;
+ this.field_9405_b = this.motionX * 0.1D;
+ this.field_9404_c = this.motionY * 0.1D;
+ this.field_9403_d = this.motionZ * 0.1D;
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public float func_392_h_() {
+ return 0.0F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityFish.java b/src/main/java/net/minecraft/src/EntityFish.java
new file mode 100644
index 0000000..f90b1d0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityFish.java
@@ -0,0 +1,367 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityFish extends Entity {
+ private int field_4095_d;
+ private int field_4094_e;
+ private int field_4093_f;
+ private int field_4092_g;
+ private boolean field_4091_h;
+ public int field_4098_a;
+ public EntityPlayer field_4097_b;
+ private int field_4090_i;
+ private int field_4089_j;
+ private int field_4088_k;
+ public Entity field_4096_c;
+ private int field_6388_l;
+ private double field_6387_m;
+ private double field_6386_n;
+ private double field_6385_o;
+ private double field_6384_p;
+ private double field_6383_q;
+ private double velocityX;
+ private double velocityY;
+ private double velocityZ;
+
+ public EntityFish(World var1) {
+ super(var1);
+ this.field_4095_d = -1;
+ this.field_4094_e = -1;
+ this.field_4093_f = -1;
+ this.field_4092_g = 0;
+ this.field_4091_h = false;
+ this.field_4098_a = 0;
+ this.field_4089_j = 0;
+ this.field_4088_k = 0;
+ this.field_4096_c = null;
+ this.setSize(0.25F, 0.25F);
+ }
+
+ public boolean func_384_a(double var1) {
+ double var3 = this.boundingBox.getAverageEdgeLength() * 4.0D;
+ var3 *= 64.0D;
+ return var1 < var3 * var3;
+ }
+
+ public EntityFish(World var1, double var2, double var4, double var6) {
+ this(var1);
+ this.setPosition(var2, var4, var6);
+ }
+
+ public EntityFish(World var1, EntityPlayer var2) {
+ super(var1);
+ this.field_4095_d = -1;
+ this.field_4094_e = -1;
+ this.field_4093_f = -1;
+ this.field_4092_g = 0;
+ this.field_4091_h = false;
+ this.field_4098_a = 0;
+ this.field_4089_j = 0;
+ this.field_4088_k = 0;
+ this.field_4096_c = null;
+ this.field_4097_b = var2;
+ this.field_4097_b.fishEntity = this;
+ this.setSize(0.25F, 0.25F);
+ this.setLocationAndAngles(var2.posX, var2.posY + 1.62D - (double)var2.yOffset, var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.posY -= (double)0.1F;
+ this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ float var3 = 0.4F;
+ this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.func_4042_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F);
+ }
+
+ public void func_4042_a(double var1, double var3, double var5, float var7, float var8) {
+ float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ var1 /= (double)var9;
+ var3 /= (double)var9;
+ var5 /= (double)var9;
+ var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var1 *= (double)var7;
+ var3 *= (double)var7;
+ var5 *= (double)var7;
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI));
+ this.field_4090_i = 0;
+ }
+
+ public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) {
+ this.field_6387_m = var1;
+ this.field_6386_n = var3;
+ this.field_6385_o = var5;
+ this.field_6384_p = (double)var7;
+ this.field_6383_q = (double)var8;
+ this.field_6388_l = var9;
+ this.motionX = this.velocityX;
+ this.motionY = this.velocityY;
+ this.motionZ = this.velocityZ;
+ }
+
+ public void setVelocity(double var1, double var3, double var5) {
+ this.velocityX = this.motionX = var1;
+ this.velocityY = this.motionY = var3;
+ this.velocityZ = this.motionZ = var5;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.field_6388_l > 0) {
+ double var21 = this.posX + (this.field_6387_m - this.posX) / (double)this.field_6388_l;
+ double var22 = this.posY + (this.field_6386_n - this.posY) / (double)this.field_6388_l;
+ double var23 = this.posZ + (this.field_6385_o - this.posZ) / (double)this.field_6388_l;
+
+ double var7;
+ for(var7 = this.field_6384_p - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) {
+ }
+
+ while(var7 >= 180.0D) {
+ var7 -= 360.0D;
+ }
+
+ this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_6388_l);
+ this.rotationPitch = (float)((double)this.rotationPitch + (this.field_6383_q - (double)this.rotationPitch) / (double)this.field_6388_l);
+ --this.field_6388_l;
+ this.setPosition(var21, var22, var23);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ } else {
+ //if(!this.worldObj.multiplayerWorld) {
+ ItemStack var1 = this.field_4097_b.getCurrentEquippedItem();
+ if(this.field_4097_b.isDead || !this.field_4097_b.isEntityAlive() || var1 == null || var1.getItem() != Item.fishingRod || this.getDistanceSqToEntity(this.field_4097_b) > 1024.0D) {
+ this.setEntityDead();
+ this.field_4097_b.fishEntity = null;
+ return;
+ }
+
+ if(this.field_4096_c != null) {
+ if(!this.field_4096_c.isDead) {
+ this.posX = this.field_4096_c.posX;
+ this.posY = this.field_4096_c.boundingBox.minY + (double)this.field_4096_c.height * 0.8D;
+ this.posZ = this.field_4096_c.posZ;
+ return;
+ }
+
+ this.field_4096_c = null;
+ }
+ //}
+
+ if(this.field_4098_a > 0) {
+ --this.field_4098_a;
+ }
+
+ if(this.field_4091_h) {
+ int var19 = this.worldObj.getBlockId(this.field_4095_d, this.field_4094_e, this.field_4093_f);
+ if(var19 == this.field_4092_g) {
+ ++this.field_4090_i;
+ if(this.field_4090_i == 1200) {
+ this.setEntityDead();
+ }
+
+ return;
+ }
+
+ this.field_4091_h = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.field_4090_i = 0;
+ this.field_4089_j = 0;
+ } else {
+ ++this.field_4089_j;
+ }
+
+ Vec3D var20 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var20, var2);
+ var20 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expands(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ double var13;
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.field_4097_b || this.field_4089_j >= 5)) {
+ float var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expands((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_1169_a(var20, var2);
+ if(var12 != null) {
+ var13 = var20.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+
+ if(var3 != null) {
+ if(var3.entityHit != null) {
+ if(var3.entityHit.canAttackEntity(this.field_4097_b, 0)) {
+ this.field_4096_c = var3.entityHit;
+ }
+ } else {
+ this.field_4091_h = true;
+ }
+ }
+
+ if(!this.field_4091_h) {
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ float var24 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var24) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var25 = 0.92F;
+ if(this.onGround || this.field_9297_aI) {
+ var25 = 0.5F;
+ }
+
+ byte var26 = 5;
+ double var27 = 0.0D;
+
+ for(int var28 = 0; var28 < var26; ++var28) {
+ double var14 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var28 + 0) / (double)var26 - 0.125D + 0.125D;
+ double var16 = this.boundingBox.minY + (this.boundingBox.maxY - this.boundingBox.minY) * (double)(var28 + 1) / (double)var26 - 0.125D + 0.125D;
+ AxisAlignedBB var18 = AxisAlignedBB.getBoundingBoxFromPool(this.boundingBox.minX, var14, this.boundingBox.minZ, this.boundingBox.maxX, var16, this.boundingBox.maxZ);
+ if(this.worldObj.func_707_b(var18, Material.water)) {
+ var27 += 1.0D / (double)var26;
+ }
+ }
+
+ if(var27 > 0.0D) {
+ if(this.field_4088_k > 0) {
+ --this.field_4088_k;
+ } else if(this.rand.nextInt(500) == 0) {
+ this.field_4088_k = this.rand.nextInt(30) + 10;
+ this.motionY -= (double)0.2F;
+ this.worldObj.playSoundAtEntity(this, "random.splash", 0.25F, 1.0F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.4F);
+ float var29 = (float)MathHelper.floor_double(this.boundingBox.minY);
+
+ float var15;
+ int var30;
+ float var31;
+ for(var30 = 0; (float)var30 < 1.0F + this.width * 20.0F; ++var30) {
+ var15 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ var31 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle("bubble", this.posX + (double)var15, (double)(var29 + 1.0F), this.posZ + (double)var31, this.motionX, this.motionY - (double)(this.rand.nextFloat() * 0.2F), this.motionZ);
+ }
+
+ for(var30 = 0; (float)var30 < 1.0F + this.width * 20.0F; ++var30) {
+ var15 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ var31 = (this.rand.nextFloat() * 2.0F - 1.0F) * this.width;
+ this.worldObj.spawnParticle("splash", this.posX + (double)var15, (double)(var29 + 1.0F), this.posZ + (double)var31, this.motionX, this.motionY, this.motionZ);
+ }
+ }
+ }
+
+ if(this.field_4088_k > 0) {
+ this.motionY -= (double)(this.rand.nextFloat() * this.rand.nextFloat() * this.rand.nextFloat()) * 0.2D;
+ }
+
+ var13 = var27 * 2.0D - 1.0D;
+ this.motionY += (double)0.04F * var13;
+ if(var27 > 0.0D) {
+ var25 = (float)((double)var25 * 0.9D);
+ this.motionY *= 0.8D;
+ }
+
+ this.motionX *= (double)var25;
+ this.motionY *= (double)var25;
+ this.motionZ *= (double)var25;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+ }
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.field_4095_d);
+ var1.setShort("yTile", (short)this.field_4094_e);
+ var1.setShort("zTile", (short)this.field_4093_f);
+ var1.setByte("inTile", (byte)this.field_4092_g);
+ var1.setByte("shake", (byte)this.field_4098_a);
+ var1.setByte("inGround", (byte)(this.field_4091_h ? 1 : 0));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.field_4095_d = var1.getShort("xTile");
+ this.field_4094_e = var1.getShort("yTile");
+ this.field_4093_f = var1.getShort("zTile");
+ this.field_4092_g = var1.getByte("inTile") & 255;
+ this.field_4098_a = var1.getByte("shake") & 255;
+ this.field_4091_h = var1.getByte("inGround") == 1;
+ }
+
+ public float func_392_h_() {
+ return 0.0F;
+ }
+
+ public int func_4043_i() {
+ byte var1 = 0;
+ if(this.field_4096_c != null) {
+ double var2 = this.field_4097_b.posX - this.posX;
+ double var4 = this.field_4097_b.posY - this.posY;
+ double var6 = this.field_4097_b.posZ - this.posZ;
+ double var8 = (double)MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6);
+ double var10 = 0.1D;
+ this.field_4096_c.motionX += var2 * var10;
+ this.field_4096_c.motionY += var4 * var10 + (double)MathHelper.sqrt_double(var8) * 0.08D;
+ this.field_4096_c.motionZ += var6 * var10;
+ var1 = 3;
+ } else if(this.field_4088_k > 0) {
+ EntityItem var13 = new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.fishRaw.shiftedIndex));
+ double var3 = this.field_4097_b.posX - this.posX;
+ double var5 = this.field_4097_b.posY - this.posY;
+ double var7 = this.field_4097_b.posZ - this.posZ;
+ double var9 = (double)MathHelper.sqrt_double(var3 * var3 + var5 * var5 + var7 * var7);
+ double var11 = 0.1D;
+ var13.motionX = var3 * var11;
+ var13.motionY = var5 * var11 + (double)MathHelper.sqrt_double(var9) * 0.08D;
+ var13.motionZ = var7 * var11;
+ this.worldObj.entityJoinedWorld(var13);
+ var1 = 1;
+ }
+
+ if(this.field_4091_h) {
+ var1 = 2;
+ }
+
+ this.setEntityDead();
+ this.field_4097_b.fishEntity = null;
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityFlameFX.java b/src/main/java/net/minecraft/src/EntityFlameFX.java
new file mode 100644
index 0000000..7c6e850
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityFlameFX.java
@@ -0,0 +1,59 @@
+package net.minecraft.src;
+
+public class EntityFlameFX extends EntityFX {
+ private float field_672_a;
+
+ public EntityFlameFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ super(var1, var2, var4, var6, var8, var10, var12);
+ this.motionX = this.motionX * (double)0.01F + var8;
+ this.motionY = this.motionY * (double)0.01F + var10;
+ this.motionZ = this.motionZ * (double)0.01F + var12;
+ double var10000 = var2 + (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.05F);
+ var10000 = var4 + (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.05F);
+ var10000 = var6 + (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.05F);
+ this.field_672_a = this.field_665_g;
+ this.field_663_i = this.field_662_j = this.field_661_k = 1.0F;
+ this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D)) + 4;
+ this.field_9314_ba = true;
+ this.field_670_b = 48;
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = ((float)this.e + var2) / (float)this.field_666_f;
+ this.field_665_g = this.field_672_a * (1.0F - var8 * var8 * 0.5F);
+ super.func_406_a(var1, var2, var3, var4, var5, var6, var7);
+ }
+
+ public float getEntityBrightness(float var1) {
+ float var2 = ((float)this.e + var1) / (float)this.field_666_f;
+ if(var2 < 0.0F) {
+ var2 = 0.0F;
+ }
+
+ if(var2 > 1.0F) {
+ var2 = 1.0F;
+ }
+
+ float var3 = super.getEntityBrightness(var1);
+ return var3 * var2 + (1.0F - var2);
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ if(this.e++ >= this.field_666_f) {
+ this.setEntityDead();
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.96F;
+ this.motionY *= (double)0.96F;
+ this.motionZ *= (double)0.96F;
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityFlying.java b/src/main/java/net/minecraft/src/EntityFlying.java
new file mode 100644
index 0000000..ea3b6ef
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityFlying.java
@@ -0,0 +1,66 @@
+package net.minecraft.src;
+
+public class EntityFlying extends EntityLiving {
+ public EntityFlying(World var1) {
+ super(var1);
+ }
+
+ protected void fall(float var1) {
+ }
+
+ public void func_435_b(float var1, float var2) {
+ if(this.handleWaterMovement()) {
+ this.func_351_a(var1, var2, 0.02F);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.8F;
+ this.motionY *= (double)0.8F;
+ this.motionZ *= (double)0.8F;
+ } else if(this.handleLavaMovement()) {
+ this.func_351_a(var1, var2, 0.02F);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ } else {
+ float var3 = 0.91F;
+ if(this.onGround) {
+ var3 = 546.0F * 0.1F * 0.1F * 0.1F;
+ int var4 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var4 > 0) {
+ var3 = Block.blocksList[var4].slipperiness * 0.91F;
+ }
+ }
+
+ float var8 = 0.16277136F / (var3 * var3 * var3);
+ this.func_351_a(var1, var2, this.onGround ? 0.1F * var8 : 0.02F);
+ var3 = 0.91F;
+ if(this.onGround) {
+ var3 = 546.0F * 0.1F * 0.1F * 0.1F;
+ int var5 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var5 > 0) {
+ var3 = Block.blocksList[var5].slipperiness * 0.91F;
+ }
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)var3;
+ this.motionY *= (double)var3;
+ this.motionZ *= (double)var3;
+ }
+
+ this.field_705_Q = this.field_704_R;
+ double var10 = this.posX - this.prevPosX;
+ double var9 = this.posZ - this.prevPosZ;
+ float var7 = MathHelper.sqrt_double(var10 * var10 + var9 * var9) * 4.0F;
+ if(var7 > 1.0F) {
+ var7 = 1.0F;
+ }
+
+ this.field_704_R += (var7 - this.field_704_R) * 0.4F;
+ this.field_703_S += this.field_704_R;
+ }
+
+ public boolean isOnLadder() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityGhast.java b/src/main/java/net/minecraft/src/EntityGhast.java
new file mode 100644
index 0000000..82c7ef1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityGhast.java
@@ -0,0 +1,139 @@
+package net.minecraft.src;
+
+public class EntityGhast extends EntityFlying implements IMobs {
+ public int field_4121_a = 0;
+ public double field_4120_b;
+ public double field_4127_c;
+ public double field_4126_d;
+ private Entity field_4123_g = null;
+ private int field_4122_h = 0;
+ public int field_4125_e = 0;
+ public int field_4124_f = 0;
+
+ public EntityGhast(World var1) {
+ super(var1);
+ this.texture = "/mob/ghast.png";
+ this.setSize(4.0F, 4.0F);
+ this.isImmuneToFire = true;
+ }
+
+ protected void func_418_b_() {
+ if(this.worldObj.difficultySetting == 0) {
+ this.setEntityDead();
+ }
+
+ this.field_4125_e = this.field_4124_f;
+ double var1 = this.field_4120_b - this.posX;
+ double var3 = this.field_4127_c - this.posY;
+ double var5 = this.field_4126_d - this.posZ;
+ double var7 = (double)MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ if(var7 < 1.0D || var7 > 60.0D) {
+ this.field_4120_b = this.posX + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
+ this.field_4127_c = this.posY + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
+ this.field_4126_d = this.posZ + (double)((this.rand.nextFloat() * 2.0F - 1.0F) * 16.0F);
+ }
+
+ if(this.field_4121_a-- <= 0) {
+ this.field_4121_a += this.rand.nextInt(5) + 2;
+ if(this.func_4050_a(this.field_4120_b, this.field_4127_c, this.field_4126_d, var7)) {
+ this.motionX += var1 / var7 * 0.1D;
+ this.motionY += var3 / var7 * 0.1D;
+ this.motionZ += var5 / var7 * 0.1D;
+ } else {
+ this.field_4120_b = this.posX;
+ this.field_4127_c = this.posY;
+ this.field_4126_d = this.posZ;
+ }
+ }
+
+ if(this.field_4123_g != null && this.field_4123_g.isDead) {
+ this.field_4123_g = null;
+ }
+
+ if(this.field_4123_g == null || this.field_4122_h-- <= 0) {
+ this.field_4123_g = this.worldObj.getClosestPlayerToEntity(this, 100.0D);
+ if(this.field_4123_g != null) {
+ this.field_4122_h = 20;
+ }
+ }
+
+ double var9 = 64.0D;
+ if(this.field_4123_g != null && this.field_4123_g.getDistanceSqToEntity(this) < var9 * var9) {
+ double var11 = this.field_4123_g.posX - this.posX;
+ double var13 = this.field_4123_g.boundingBox.minY + (double)(this.field_4123_g.height / 2.0F) - (this.posY + (double)(this.height / 2.0F));
+ double var15 = this.field_4123_g.posZ - this.posZ;
+ this.field_735_n = this.rotationYaw = -((float)Math.atan2(var11, var15)) * 180.0F / (float)Math.PI;
+ if(this.canEntityBeSeen(this.field_4123_g)) {
+ if(this.field_4124_f == 10) {
+ this.worldObj.playSoundAtEntity(this, "mob.ghast.charge", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ ++this.field_4124_f;
+ if(this.field_4124_f == 20) {
+ this.worldObj.playSoundAtEntity(this, "mob.ghast.fireball", this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ EntityFireball var17 = new EntityFireball(this.worldObj, this, var11, var13, var15);
+ double var18 = 4.0D;
+ Vec3D var20 = this.getLook(1.0F);
+ var17.posX = this.posX + var20.xCoord * var18;
+ var17.posY = this.posY + (double)(this.height / 2.0F) + 0.5D;
+ var17.posZ = this.posZ + var20.zCoord * var18;
+ this.worldObj.entityJoinedWorld(var17);
+ this.field_4124_f = -40;
+ }
+ } else if(this.field_4124_f > 0) {
+ --this.field_4124_f;
+ }
+ } else {
+ this.field_735_n = this.rotationYaw = -((float)Math.atan2(this.motionX, this.motionZ)) * 180.0F / (float)Math.PI;
+ if(this.field_4124_f > 0) {
+ --this.field_4124_f;
+ }
+ }
+
+ this.texture = this.field_4124_f > 10 ? "/mob/ghast_fire.png" : "/mob/ghast.png";
+ }
+
+ private boolean func_4050_a(double var1, double var3, double var5, double var7) {
+ double var9 = (this.field_4120_b - this.posX) / var7;
+ double var11 = (this.field_4127_c - this.posY) / var7;
+ double var13 = (this.field_4126_d - this.posZ) / var7;
+ AxisAlignedBB var15 = this.boundingBox.copy();
+
+ for(int var16 = 1; (double)var16 < var7; ++var16) {
+ var15.offset(var9, var11, var13);
+ if(this.worldObj.getCollidingBoundingBoxes(this, var15).size() > 0) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected String getLivingSound() {
+ return "mob.ghast.moan";
+ }
+
+ protected String getHurtSound() {
+ return "mob.ghast.scream";
+ }
+
+ protected String getDeathSound() {
+ return "mob.ghast.death";
+ }
+
+ protected int getDropItemId() {
+ return Item.gunpowder.shiftedIndex;
+ }
+
+ protected float getSoundVolume() {
+ return 10.0F;
+ }
+
+ public boolean getCanSpawnHere() {
+ return this.rand.nextInt(20) == 0 && super.getCanSpawnHere() && this.worldObj.difficultySetting > 0;
+ }
+
+ public int func_6391_i() {
+ return 1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityItem.java b/src/main/java/net/minecraft/src/EntityItem.java
new file mode 100644
index 0000000..d95a206
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityItem.java
@@ -0,0 +1,191 @@
+package net.minecraft.src;
+
+public class EntityItem extends Entity {
+ public ItemStack item;
+ private int field_803_e;
+ public int age = 0;
+ public int field_805_c;
+ private int health = 5;
+ public float field_804_d = (float)(Math.random() * Math.PI * 2.0D);
+
+ public EntityItem(World var1, double var2, double var4, double var6, ItemStack var8) {
+ super(var1);
+ this.setSize(0.25F, 0.25F);
+ this.yOffset = this.height / 2.0F;
+ this.setPosition(var2, var4, var6);
+ this.item = var8;
+ this.rotationYaw = (float)(Math.random() * 360.0D);
+ this.motionX = (double)((float)(Math.random() * (double)0.2F - (double)0.1F));
+ this.motionY = (double)0.2F;
+ this.motionZ = (double)((float)(Math.random() * (double)0.2F - (double)0.1F));
+ this.entityWalks = false;
+ }
+
+ public EntityItem(World var1) {
+ super(var1);
+ this.setSize(0.25F, 0.25F);
+ this.yOffset = this.height / 2.0F;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.field_805_c > 0) {
+ --this.field_805_c;
+ }
+
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= (double)0.04F;
+ if(this.worldObj.getBlockMaterial(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) == Material.lava) {
+ this.motionY = (double)0.2F;
+ this.motionX = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F);
+ this.motionZ = (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F);
+ this.worldObj.playSoundAtEntity(this, "random.fizz", 0.4F, 2.0F + this.rand.nextFloat() * 0.4F);
+ }
+
+ this.func_466_g(this.posX, this.posY, this.posZ);
+ this.handleWaterMovement();
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ float var1 = 0.98F;
+ if(this.onGround) {
+ var1 = 0.1F * 0.1F * 58.8F;
+ int var2 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var2 > 0) {
+ var1 = Block.blocksList[var2].slipperiness * 0.98F;
+ }
+ }
+
+ this.motionX *= (double)var1;
+ this.motionY *= (double)0.98F;
+ this.motionZ *= (double)var1;
+ if(this.onGround) {
+ this.motionY *= -0.5D;
+ }
+
+ ++this.field_803_e;
+ ++this.age;
+ if(this.age >= 6000) {
+ this.setEntityDead();
+ }
+
+ }
+
+ public boolean handleWaterMovement() {
+ return this.worldObj.func_682_a(this.boundingBox, Material.water, this);
+ }
+
+ private boolean func_466_g(double var1, double var3, double var5) {
+ int var7 = MathHelper.floor_double(var1);
+ int var8 = MathHelper.floor_double(var3);
+ int var9 = MathHelper.floor_double(var5);
+ double var10 = var1 - (double)var7;
+ double var12 = var3 - (double)var8;
+ double var14 = var5 - (double)var9;
+ if(Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8, var9)]) {
+ boolean var16 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7 - 1, var8, var9)];
+ boolean var17 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7 + 1, var8, var9)];
+ boolean var18 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8 - 1, var9)];
+ boolean var19 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8 + 1, var9)];
+ boolean var20 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8, var9 - 1)];
+ boolean var21 = !Block.opaqueCubeLookup[this.worldObj.getBlockId(var7, var8, var9 + 1)];
+ byte var22 = -1;
+ double var23 = 9999.0D;
+ if(var16 && var10 < var23) {
+ var23 = var10;
+ var22 = 0;
+ }
+
+ if(var17 && 1.0D - var10 < var23) {
+ var23 = 1.0D - var10;
+ var22 = 1;
+ }
+
+ if(var18 && var12 < var23) {
+ var23 = var12;
+ var22 = 2;
+ }
+
+ if(var19 && 1.0D - var12 < var23) {
+ var23 = 1.0D - var12;
+ var22 = 3;
+ }
+
+ if(var20 && var14 < var23) {
+ var23 = var14;
+ var22 = 4;
+ }
+
+ if(var21 && 1.0D - var14 < var23) {
+ var23 = 1.0D - var14;
+ var22 = 5;
+ }
+
+ float var25 = this.rand.nextFloat() * 0.2F + 0.1F;
+ if(var22 == 0) {
+ this.motionX = (double)(-var25);
+ }
+
+ if(var22 == 1) {
+ this.motionX = (double)var25;
+ }
+
+ if(var22 == 2) {
+ this.motionY = (double)(-var25);
+ }
+
+ if(var22 == 3) {
+ this.motionY = (double)var25;
+ }
+
+ if(var22 == 4) {
+ this.motionZ = (double)(-var25);
+ }
+
+ if(var22 == 5) {
+ this.motionZ = (double)var25;
+ }
+ }
+
+ return false;
+ }
+
+ protected void func_355_a(int var1) {
+ this.canAttackEntity((Entity)null, var1);
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ this.func_9281_M();
+ this.health -= var2;
+ if(this.health <= 0) {
+ this.setEntityDead();
+ }
+
+ return false;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("Health", (short)((byte)this.health));
+ var1.setShort("Age", (short)this.age);
+ var1.setCompoundTag("Item", this.item.writeToNBT(new NBTTagCompound()));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.health = var1.getShort("Health") & 255;
+ this.age = var1.getShort("Age");
+ NBTTagCompound var2 = var1.getCompoundTag("Item");
+ this.item = new ItemStack(var2);
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ //if(!this.worldObj.multiplayerWorld) {
+ int var2 = this.item.stackSize;
+ if(this.field_805_c == 0 && var1.inventory.addItemStackToInventory(this.item)) {
+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+ var1.func_443_a_(this, var2);
+ this.setEntityDead();
+ }
+
+ //}
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityLavaFX.java b/src/main/java/net/minecraft/src/EntityLavaFX.java
new file mode 100644
index 0000000..359286a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityLavaFX.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+public class EntityLavaFX extends EntityFX {
+ private float field_674_a;
+
+ public EntityLavaFX(World var1, double var2, double var4, double var6) {
+ super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D);
+ this.motionX *= (double)0.8F;
+ this.motionY *= (double)0.8F;
+ this.motionZ *= (double)0.8F;
+ this.motionY = (double)(this.rand.nextFloat() * 0.4F + 0.05F);
+ this.field_663_i = this.field_662_j = this.field_661_k = 1.0F;
+ this.field_665_g *= this.rand.nextFloat() * 2.0F + 0.2F;
+ this.field_674_a = this.field_665_g;
+ this.field_666_f = (int)(16.0D / (Math.random() * 0.8D + 0.2D));
+ this.field_9314_ba = false;
+ this.field_670_b = 49;
+ }
+
+ public float getEntityBrightness(float var1) {
+ return 1.0F;
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = ((float)this.e + var2) / (float)this.field_666_f;
+ this.field_665_g = this.field_674_a * (1.0F - var8 * var8);
+ super.func_406_a(var1, var2, var3, var4, var5, var6, var7);
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ if(this.e++ >= this.field_666_f) {
+ this.setEntityDead();
+ }
+
+ float var1 = (float)this.e / (float)this.field_666_f;
+ if(this.rand.nextFloat() > var1) {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY, this.posZ, this.motionX, this.motionY, this.motionZ);
+ }
+
+ this.motionY -= 0.03D;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.999F;
+ this.motionY *= (double)0.999F;
+ this.motionZ *= (double)0.999F;
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityList.java b/src/main/java/net/minecraft/src/EntityList.java
new file mode 100644
index 0000000..bfca2d4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityList.java
@@ -0,0 +1,106 @@
+package net.minecraft.src;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class EntityList {
+ private static Map stringToClassMapping = new HashMap();
+ private static Map classToStringMapping = new HashMap();
+ private static Map IDtoClassMapping = new HashMap();
+ private static Map classToIDMapping = new HashMap();
+
+ private static void addMapping(Class var0, String var1, int var2) {
+ stringToClassMapping.put(var1, var0);
+ classToStringMapping.put(var0, var1);
+ IDtoClassMapping.put(Integer.valueOf(var2), var0);
+ classToIDMapping.put(var0, Integer.valueOf(var2));
+ }
+
+ public static Entity createEntityInWorld(String var0, World var1) {
+ Entity var2 = null;
+
+ try {
+ Class var3 = (Class)stringToClassMapping.get(var0);
+ if(var3 != null) {
+ var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
+ }
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ }
+
+ return var2;
+ }
+
+ public static Entity createEntityFromNBT(NBTTagCompound var0, World var1) {
+ Entity var2 = null;
+
+ try {
+ Class var3 = (Class)stringToClassMapping.get(var0.getString("id"));
+ if(var3 != null) {
+ var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
+ }
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ }
+
+ if(var2 != null) {
+ var2.readFromNBT(var0);
+ } else {
+ System.out.println("Skipping Entity with id " + var0.getString("id"));
+ }
+
+ return var2;
+ }
+
+ public static Entity createEntity(int var0, World var1) {
+ Entity var2 = null;
+
+ try {
+ Class var3 = (Class)IDtoClassMapping.get(Integer.valueOf(var0));
+ if(var3 != null) {
+ var2 = (Entity)var3.getConstructor(new Class[]{World.class}).newInstance(new Object[]{var1});
+ }
+ } catch (Exception var4) {
+ var4.printStackTrace();
+ }
+
+ if(var2 == null) {
+ System.out.println("Skipping Entity with id " + var0);
+ }
+
+ return var2;
+ }
+
+ public static int getEntityID(Entity var0) {
+ return ((Integer)classToIDMapping.get(var0.getClass())).intValue();
+ }
+
+ public static String getEntityString(Entity var0) {
+ return (String)classToStringMapping.get(var0.getClass());
+ }
+
+ static {
+ addMapping(EntityArrow.class, "Arrow", 10);
+ addMapping(EntitySnowball.class, "Snowball", 11);
+ addMapping(EntityItem.class, "Item", 1);
+ addMapping(EntityPainting.class, "Painting", 9);
+ addMapping(EntityLiving.class, "Mob", 48);
+ addMapping(EntityMobs.class, "Monster", 49);
+ addMapping(EntityCreeper.class, "Creeper", 50);
+ addMapping(EntitySkeleton.class, "Skeleton", 51);
+ addMapping(EntitySpider.class, "Spider", 52);
+ addMapping(EntityZombieSimple.class, "Giant", 53);
+ addMapping(EntityZombie.class, "Zombie", 54);
+ addMapping(EntitySlime.class, "Slime", 55);
+ addMapping(EntityGhast.class, "Ghast", 56);
+ addMapping(EntityPigZombie.class, "PigZombie", 57);
+ addMapping(EntityPig.class, "Pig", 90);
+ addMapping(EntitySheep.class, "Sheep", 91);
+ addMapping(EntityCow.class, "Cow", 92);
+ addMapping(EntityChicken.class, "Chicken", 93);
+ addMapping(EntityTNTPrimed.class, "PrimedTnt", 20);
+ addMapping(EntityFallingSand.class, "FallingSand", 21);
+ addMapping(EntityMinecart.class, "Minecart", 40);
+ addMapping(EntityBoat.class, "Boat", 41);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityLiving.java b/src/main/java/net/minecraft/src/EntityLiving.java
new file mode 100644
index 0000000..2ed3776
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityLiving.java
@@ -0,0 +1,787 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityLiving extends Entity {
+ public int field_9366_o = 20;
+ public float field_9365_p;
+ public float field_9364_q;
+ public float field_9363_r;
+ public float field_735_n = 0.0F;
+ public float field_734_o = 0.0F;
+ protected float field_9362_u;
+ protected float field_9361_v;
+ protected float field_9360_w;
+ protected float field_9359_x;
+ protected boolean field_9358_y = true;
+ protected String texture = "/mob/char.png";
+ protected boolean field_9355_A = true;
+ protected float field_9353_B = 0.0F;
+ protected String field_9351_C = null;
+ protected float field_9349_D = 1.0F;
+ protected int field_9347_E = 0;
+ protected float field_9345_F = 0.0F;
+ public boolean field_9343_G = false;
+ public float prevSwingProgress;
+ public float swingProgress;
+ public int health = 10;
+ public int field_9335_K;
+ private int a;
+ public int hurtTime;
+ public int field_9332_M;
+ public float field_9331_N = 0.0F;
+ public int deathTime = 0;
+ public int attackTime = 0;
+ public float field_9329_Q;
+ public float field_9328_R;
+ protected boolean field_9327_S = false;
+ public int field_9326_T = -1;
+ public float field_9325_U = (float)(Math.random() * (double)0.9F + (double)0.1F);
+ public float field_705_Q;
+ public float field_704_R;
+ public float field_703_S;
+ protected int field_9324_Y;
+ protected double field_9323_Z;
+ protected double field_9356_aa;
+ protected double field_9354_ab;
+ protected double field_9352_ac;
+ protected double field_9350_ad;
+ float field_9348_ae = 0.0F;
+ protected int field_9346_af = 0;
+ protected int field_9344_ag = 0;
+ protected float field_9342_ah;
+ protected float field_9340_ai;
+ protected float field_9338_aj;
+ protected boolean isJumping = false;
+ protected float field_9334_al = 0.0F;
+ protected float field_9333_am = 0.7F;
+ private Entity b;
+ private int c = 0;
+
+ public EntityLiving(World var1) {
+ super(var1);
+ this.field_618_ad = true;
+ this.field_9363_r = (float)(Math.random() + 1.0D) * 0.01F;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.field_9365_p = (float)Math.random() * 12398.0F;
+ this.rotationYaw = (float)(Math.random() * (double)((float)Math.PI) * 2.0D);
+ this.field_9364_q = 1.0F;
+ this.field_9286_aZ = 0.5F;
+ }
+
+ public boolean canEntityBeSeen(Entity var1) {
+ return this.worldObj.rayTraceBlocks(Vec3D.createVector(this.posX, this.posY + (double)this.func_373_s(), this.posZ), Vec3D.createVector(var1.posX, var1.posY + (double)var1.func_373_s(), var1.posZ)) == null;
+ }
+
+ public String getEntityTexture() {
+ return this.texture;
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public boolean canBePushed() {
+ return !this.isDead;
+ }
+
+ public float func_373_s() {
+ return this.height * 0.85F;
+ }
+
+ public int func_421_b() {
+ return 80;
+ }
+
+ public void func_391_y() {
+ this.prevSwingProgress = this.swingProgress;
+ super.func_391_y();
+ if(this.rand.nextInt(1000) < this.a++) {
+ this.a = -this.func_421_b();
+ String var1 = this.getLivingSound();
+ if(var1 != null) {
+ this.worldObj.playSoundAtEntity(this, var1, this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+ }
+
+ if(this.isEntityAlive() && this.func_345_I()) {
+ this.canAttackEntity((Entity)null, 1);
+ }
+
+ if(this.isImmuneToFire) {
+ this.fire = 0;
+ }
+
+ int var8;
+ if(this.isEntityAlive() && this.isInsideOfMaterial(Material.water)) {
+ --this.air;
+ if(this.air == -20) {
+ this.air = 0;
+
+ for(var8 = 0; var8 < 8; ++var8) {
+ float var2 = this.rand.nextFloat() - this.rand.nextFloat();
+ float var3 = this.rand.nextFloat() - this.rand.nextFloat();
+ float var4 = this.rand.nextFloat() - this.rand.nextFloat();
+ this.worldObj.spawnParticle("bubble", this.posX + (double)var2, this.posY + (double)var3, this.posZ + (double)var4, this.motionX, this.motionY, this.motionZ);
+ }
+
+ this.canAttackEntity((Entity)null, 2);
+ }
+
+ this.fire = 0;
+ } else {
+ this.air = this.field_9308_bh;
+ }
+
+ this.field_9329_Q = this.field_9328_R;
+ if(this.attackTime > 0) {
+ --this.attackTime;
+ }
+
+ if(this.hurtTime > 0) {
+ --this.hurtTime;
+ }
+
+ if(this.field_9306_bj > 0) {
+ --this.field_9306_bj;
+ }
+
+ if(this.health <= 0) {
+ ++this.deathTime;
+ if(this.deathTime > 20) {
+ this.func_6392_F();
+ this.setEntityDead();
+
+ for(var8 = 0; var8 < 20; ++var8) {
+ double var9 = this.rand.nextGaussian() * 0.02D;
+ double var10 = this.rand.nextGaussian() * 0.02D;
+ double var6 = this.rand.nextGaussian() * 0.02D;
+ this.worldObj.spawnParticle("explode", this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, var9, var10, var6);
+ }
+ }
+ }
+
+ this.field_9359_x = this.field_9360_w;
+ this.field_734_o = this.field_735_n;
+ this.prevRotationYaw = this.rotationYaw;
+ this.prevRotationPitch = this.rotationPitch;
+ }
+
+ public void spawnExplosionParticle() {
+ for(int var1 = 0; var1 < 20; ++var1) {
+ double var2 = this.rand.nextGaussian() * 0.02D;
+ double var4 = this.rand.nextGaussian() * 0.02D;
+ double var6 = this.rand.nextGaussian() * 0.02D;
+ double var8 = 10.0D;
+ this.worldObj.spawnParticle("explode", this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width - var2 * var8, this.posY + (double)(this.rand.nextFloat() * this.height) - var4 * var8, this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width - var6 * var8, var2, var4, var6);
+ }
+
+ }
+
+ public void func_350_p() {
+ super.func_350_p();
+ this.field_9362_u = this.field_9361_v;
+ this.field_9361_v = 0.0F;
+ }
+
+ public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) {
+ this.yOffset = 0.0F;
+ this.field_9323_Z = var1;
+ this.field_9356_aa = var3;
+ this.field_9354_ab = var5;
+ this.field_9352_ac = (double)var7;
+ this.field_9350_ad = (double)var8;
+ this.field_9324_Y = var9;
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ this.onLivingUpdate();
+ double var1 = this.posX - this.prevPosX;
+ double var3 = this.posZ - this.prevPosZ;
+ float var5 = MathHelper.sqrt_double(var1 * var1 + var3 * var3);
+ float var6 = this.field_735_n;
+ float var7 = 0.0F;
+ this.field_9362_u = this.field_9361_v;
+ float var8 = 0.0F;
+ if(var5 > 0.05F) {
+ var8 = 1.0F;
+ var7 = var5 * 3.0F;
+ var6 = (float)Math.atan2(var3, var1) * 180.0F / (float)Math.PI - 90.0F;
+ }
+
+ if(this.swingProgress > 0.0F) {
+ var6 = this.rotationYaw;
+ }
+
+ if(!this.onGround) {
+ var8 = 0.0F;
+ }
+
+ this.field_9361_v += (var8 - this.field_9361_v) * 0.3F;
+
+ float var9;
+ for(var9 = var6 - this.field_735_n; var9 < -180.0F; var9 += 360.0F) {
+ }
+
+ while(var9 >= 180.0F) {
+ var9 -= 360.0F;
+ }
+
+ this.field_735_n += var9 * 0.3F;
+
+ float var10;
+ for(var10 = this.rotationYaw - this.field_735_n; var10 < -180.0F; var10 += 360.0F) {
+ }
+
+ while(var10 >= 180.0F) {
+ var10 -= 360.0F;
+ }
+
+ boolean var11 = var10 < -90.0F || var10 >= 90.0F;
+ if(var10 < -75.0F) {
+ var10 = -75.0F;
+ }
+
+ if(var10 >= 75.0F) {
+ var10 = 75.0F;
+ }
+
+ this.field_735_n = this.rotationYaw - var10;
+ if(var10 * var10 > 2500.0F) {
+ this.field_735_n += var10 * 0.2F;
+ }
+
+ if(var11) {
+ var7 *= -1.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ while(this.field_735_n - this.field_734_o < -180.0F) {
+ this.field_734_o -= 360.0F;
+ }
+
+ while(this.field_735_n - this.field_734_o >= 180.0F) {
+ this.field_734_o += 360.0F;
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch < -180.0F) {
+ this.prevRotationPitch -= 360.0F;
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ this.field_9360_w += var7;
+ }
+
+ protected void setSize(float var1, float var2) {
+ super.setSize(var1, var2);
+ }
+
+ public void heal(int var1) {
+ if(this.health > 0) {
+ this.health += var1;
+ if(this.health > 20) {
+ this.health = 20;
+ }
+
+ this.field_9306_bj = this.field_9366_o / 2;
+ }
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ //if(this.worldObj.multiplayerWorld) {
+ //return false;
+ //} else {
+ this.field_9344_ag = 0;
+ if(this.health <= 0) {
+ return false;
+ } else {
+ this.field_704_R = 1.5F;
+ boolean var3 = true;
+ if((float)this.field_9306_bj > (float)this.field_9366_o / 2.0F) {
+ if(var2 <= this.field_9346_af) {
+ return false;
+ }
+
+ this.damageEntity(var2 - this.field_9346_af);
+ this.field_9346_af = var2;
+ var3 = false;
+ } else {
+ this.field_9346_af = var2;
+ this.field_9335_K = this.health;
+ this.field_9306_bj = this.field_9366_o;
+ this.damageEntity(var2);
+ this.hurtTime = this.field_9332_M = 10;
+ }
+
+ this.field_9331_N = 0.0F;
+ if(var3) {
+ this.worldObj.func_9425_a(this, (byte)2);
+ this.func_9281_M();
+ if(var1 != null) {
+ double var4 = var1.posX - this.posX;
+
+ double var6;
+ for(var6 = var1.posZ - this.posZ; var4 * var4 + var6 * var6 < 1.0E-4D; var6 = (Math.random() - Math.random()) * 0.01D) {
+ var4 = (Math.random() - Math.random()) * 0.01D;
+ }
+
+ this.field_9331_N = (float)(Math.atan2(var6, var4) * 180.0D / (double)((float)Math.PI)) - this.rotationYaw;
+ this.func_434_a(var1, var2, var4, var6);
+ } else {
+ this.field_9331_N = (float)((int)(Math.random() * 2.0D) * 180);
+ }
+ }
+
+ if(this.health <= 0) {
+ if(var3) {
+ this.worldObj.playSoundAtEntity(this, this.getDeathSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ this.onDeath(var1);
+ } else if(var3) {
+ this.worldObj.playSoundAtEntity(this, this.getHurtSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ return true;
+ }
+ //}
+ }
+
+ public void func_9280_g() {
+ this.hurtTime = this.field_9332_M = 10;
+ this.field_9331_N = 0.0F;
+ }
+
+ protected void damageEntity(int var1) {
+ this.health -= var1;
+ }
+
+ protected float getSoundVolume() {
+ return 1.0F;
+ }
+
+ protected String getLivingSound() {
+ return null;
+ }
+
+ protected String getHurtSound() {
+ return "random.hurt";
+ }
+
+ protected String getDeathSound() {
+ return "random.hurt";
+ }
+
+ public void func_434_a(Entity var1, int var2, double var3, double var5) {
+ float var7 = MathHelper.sqrt_double(var3 * var3 + var5 * var5);
+ float var8 = 0.4F;
+ this.motionX /= 2.0D;
+ this.motionY /= 2.0D;
+ this.motionZ /= 2.0D;
+ this.motionX -= var3 / (double)var7 * (double)var8;
+ this.motionY += (double)0.4F;
+ this.motionZ -= var5 / (double)var7 * (double)var8;
+ if(this.motionY > (double)0.4F) {
+ this.motionY = (double)0.4F;
+ }
+
+ }
+
+ public void onDeath(Entity var1) {
+ if(this.field_9347_E > 0 && var1 != null) {
+ var1.addToPlayerScore(this, this.field_9347_E);
+ }
+
+ this.field_9327_S = true;
+ //if(!this.worldObj.multiplayerWorld) {
+ int var2 = this.getDropItemId();
+ if(var2 > 0) {
+ int var3 = this.rand.nextInt(3);
+
+ for(int var4 = 0; var4 < var3; ++var4) {
+ this.dropItem(var2, 1);
+ }
+ }
+ //}
+
+ this.worldObj.func_9425_a(this, (byte)3);
+ }
+
+ protected int getDropItemId() {
+ return 0;
+ }
+
+ protected void fall(float var1) {
+ int var2 = (int)Math.ceil((double)(var1 - 3.0F));
+ if(var2 > 0) {
+ this.canAttackEntity((Entity)null, var2);
+ int var3 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY - (double)0.2F - (double)this.yOffset), MathHelper.floor_double(this.posZ));
+ if(var3 > 0) {
+ StepSound var4 = Block.blocksList[var3].stepSound;
+ this.worldObj.playSoundAtEntity(this, var4.func_1145_d(), var4.func_1147_b() * 0.5F, var4.func_1144_c() * (12.0F / 16.0F));
+ }
+ }
+
+ }
+
+ public void func_435_b(float var1, float var2) {
+ double var3;
+ if(this.handleWaterMovement()) {
+ var3 = this.posY;
+ this.func_351_a(var1, var2, 0.02F);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.8F;
+ this.motionY *= (double)0.8F;
+ this.motionZ *= (double)0.8F;
+ this.motionY -= 0.02D;
+ if(this.field_9297_aI && this.func_403_b(this.motionX, this.motionY + (double)0.6F - this.posY + var3, this.motionZ)) {
+ this.motionY = (double)0.3F;
+ }
+ } else if(this.handleLavaMovement()) {
+ var3 = this.posY;
+ this.func_351_a(var1, var2, 0.02F);
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ this.motionY -= 0.02D;
+ if(this.field_9297_aI && this.func_403_b(this.motionX, this.motionY + (double)0.6F - this.posY + var3, this.motionZ)) {
+ this.motionY = (double)0.3F;
+ }
+ } else {
+ float var8 = 0.91F;
+ if(this.onGround) {
+ var8 = 546.0F * 0.1F * 0.1F * 0.1F;
+ int var4 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var4 > 0) {
+ var8 = Block.blocksList[var4].slipperiness * 0.91F;
+ }
+ }
+
+ float var9 = 0.16277136F / (var8 * var8 * var8);
+ this.func_351_a(var1, var2, this.onGround ? 0.1F * var9 : 0.02F);
+ var8 = 0.91F;
+ if(this.onGround) {
+ var8 = 546.0F * 0.1F * 0.1F * 0.1F;
+ int var5 = this.worldObj.getBlockId(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.boundingBox.minY) - 1, MathHelper.floor_double(this.posZ));
+ if(var5 > 0) {
+ var8 = Block.blocksList[var5].slipperiness * 0.91F;
+ }
+ }
+
+ if(this.isOnLadder()) {
+ this.fallDistance = 0.0F;
+ if(this.motionY < -0.15D) {
+ this.motionY = -0.15D;
+ }
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ if(this.field_9297_aI && this.isOnLadder()) {
+ this.motionY = 0.2D;
+ }
+
+ this.motionY -= 0.08D;
+ this.motionY *= (double)0.98F;
+ this.motionX *= (double)var8;
+ this.motionZ *= (double)var8;
+ }
+
+ this.field_705_Q = this.field_704_R;
+ var3 = this.posX - this.prevPosX;
+ double var10 = this.posZ - this.prevPosZ;
+ float var7 = MathHelper.sqrt_double(var3 * var3 + var10 * var10) * 4.0F;
+ if(var7 > 1.0F) {
+ var7 = 1.0F;
+ }
+
+ this.field_704_R += (var7 - this.field_704_R) * 0.4F;
+ this.field_703_S += this.field_704_R;
+ }
+
+ public boolean isOnLadder() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.boundingBox.minY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ return this.worldObj.getBlockId(var1, var2, var3) == Block.ladder.blockID || this.worldObj.getBlockId(var1, var2 + 1, var3) == Block.ladder.blockID;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("Health", (short)this.health);
+ var1.setShort("HurtTime", (short)this.hurtTime);
+ var1.setShort("DeathTime", (short)this.deathTime);
+ var1.setShort("AttackTime", (short)this.attackTime);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.health = var1.getShort("Health");
+ if(!var1.hasKey("Health")) {
+ this.health = 10;
+ }
+
+ this.hurtTime = var1.getShort("HurtTime");
+ this.deathTime = var1.getShort("DeathTime");
+ this.attackTime = var1.getShort("AttackTime");
+ }
+
+ public boolean isEntityAlive() {
+ return !this.isDead && this.health > 0;
+ }
+
+ public void onLivingUpdate() {
+ if(this.field_9324_Y > 0) {
+ double var1 = this.posX + (this.field_9323_Z - this.posX) / (double)this.field_9324_Y;
+ double var3 = this.posY + (this.field_9356_aa - this.posY) / (double)this.field_9324_Y;
+ double var5 = this.posZ + (this.field_9354_ab - this.posZ) / (double)this.field_9324_Y;
+
+ double var7;
+ for(var7 = this.field_9352_ac - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) {
+ }
+
+ while(var7 >= 180.0D) {
+ var7 -= 360.0D;
+ }
+
+ this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_9324_Y);
+ this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9350_ad - (double)this.rotationPitch) / (double)this.field_9324_Y);
+ --this.field_9324_Y;
+ this.setPosition(var1, var3, var5);
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ }
+
+ if(this.health <= 0) {
+ this.isJumping = false;
+ this.field_9342_ah = 0.0F;
+ this.field_9340_ai = 0.0F;
+ this.field_9338_aj = 0.0F;
+ } else if(!this.field_9343_G) {
+ this.func_418_b_();
+ }
+
+ boolean var9 = this.handleWaterMovement();
+ boolean var2 = this.handleLavaMovement();
+ if(this.isJumping) {
+ if(var9) {
+ this.motionY += (double)0.04F;
+ } else if(var2) {
+ this.motionY += (double)0.04F;
+ } else if(this.onGround) {
+ this.func_424_C();
+ }
+ }
+
+ this.field_9342_ah *= 0.98F;
+ this.field_9340_ai *= 0.98F;
+ this.field_9338_aj *= 0.9F;
+ this.func_435_b(this.field_9342_ah, this.field_9340_ai);
+ List var10 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands((double)0.2F, 0.0D, (double)0.2F));
+ if(var10 != null && var10.size() > 0) {
+ for(int var4 = 0; var4 < var10.size(); ++var4) {
+ Entity var11 = (Entity)var10.get(var4);
+ if(var11.canBePushed()) {
+ var11.applyEntityCollision(this);
+ }
+ }
+ }
+
+ }
+
+ protected void func_424_C() {
+ this.motionY = (double)0.42F;
+ }
+
+ protected void func_418_b_() {
+ ++this.field_9344_ag;
+ EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, -1.0D);
+ if(var1 != null) {
+ double var2 = var1.posX - this.posX;
+ double var4 = var1.posY - this.posY;
+ double var6 = var1.posZ - this.posZ;
+ double var8 = var2 * var2 + var4 * var4 + var6 * var6;
+ if(var8 > 16384.0D) {
+ this.setEntityDead();
+ }
+
+ if(this.field_9344_ag > 600 && this.rand.nextInt(800) == 0) {
+ if(var8 < 1024.0D) {
+ this.field_9344_ag = 0;
+ } else {
+ this.setEntityDead();
+ }
+ }
+ }
+
+ this.field_9342_ah = 0.0F;
+ this.field_9340_ai = 0.0F;
+ float var10 = 8.0F;
+ if(this.rand.nextFloat() < 0.02F) {
+ var1 = this.worldObj.getClosestPlayerToEntity(this, (double)var10);
+ if(var1 != null) {
+ this.b = var1;
+ this.c = 10 + this.rand.nextInt(20);
+ } else {
+ this.field_9338_aj = (this.rand.nextFloat() - 0.5F) * 20.0F;
+ }
+ }
+
+ if(this.b != null) {
+ this.faceEntity(this.b, 10.0F);
+ if(this.c-- <= 0 || this.b.isDead || this.b.getDistanceSqToEntity(this) > (double)(var10 * var10)) {
+ this.b = null;
+ }
+ } else {
+ if(this.rand.nextFloat() < 0.05F) {
+ this.field_9338_aj = (this.rand.nextFloat() - 0.5F) * 20.0F;
+ }
+
+ this.rotationYaw += this.field_9338_aj;
+ this.rotationPitch = this.field_9334_al;
+ }
+
+ boolean var3 = this.handleWaterMovement();
+ boolean var11 = this.handleLavaMovement();
+ if(var3 || var11) {
+ this.isJumping = this.rand.nextFloat() < 0.8F;
+ }
+
+ }
+
+ public void faceEntity(Entity var1, float var2) {
+ double var3 = var1.posX - this.posX;
+ double var7 = var1.posZ - this.posZ;
+ double var5;
+ if(var1 instanceof EntityLiving) {
+ EntityLiving var9 = (EntityLiving)var1;
+ var5 = var9.posY + (double)var9.func_373_s() - (this.posY + (double)this.func_373_s());
+ } else {
+ var5 = (var1.boundingBox.minY + var1.boundingBox.maxY) / 2.0D - (this.posY + (double)this.func_373_s());
+ }
+
+ double var13 = (double)MathHelper.sqrt_double(var3 * var3 + var7 * var7);
+ float var11 = (float)(Math.atan2(var7, var3) * 180.0D / (double)((float)Math.PI)) - 90.0F;
+ float var12 = (float)(Math.atan2(var5, var13) * 180.0D / (double)((float)Math.PI));
+ this.rotationPitch = -this.updateRotation(this.rotationPitch, var12, var2);
+ this.rotationYaw = this.updateRotation(this.rotationYaw, var11, var2);
+ }
+
+ private float updateRotation(float var1, float var2, float var3) {
+ float var4;
+ for(var4 = var2 - var1; var4 < -180.0F; var4 += 360.0F) {
+ }
+
+ while(var4 >= 180.0F) {
+ var4 -= 360.0F;
+ }
+
+ if(var4 > var3) {
+ var4 = var3;
+ }
+
+ if(var4 < -var3) {
+ var4 = -var3;
+ }
+
+ return var1 + var4;
+ }
+
+ public void func_6392_F() {
+ }
+
+ public boolean getCanSpawnHere() {
+ return this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() == 0 && !this.worldObj.getIsAnyLiquid(this.boundingBox);
+ }
+
+ protected void func_4034_G() {
+ this.canAttackEntity((Entity)null, 4);
+ }
+
+ public float getSwingProgress(float var1) {
+ float var2 = this.swingProgress - this.prevSwingProgress;
+ if(var2 < 0.0F) {
+ ++var2;
+ }
+
+ return this.prevSwingProgress + var2 * var1;
+ }
+
+ public Vec3D getPosition(float var1) {
+ if(var1 == 1.0F) {
+ return Vec3D.createVector(this.posX, this.posY, this.posZ);
+ } else {
+ double var2 = this.prevPosX + (this.posX - this.prevPosX) * (double)var1;
+ double var4 = this.prevPosY + (this.posY - this.prevPosY) * (double)var1;
+ double var6 = this.prevPosZ + (this.posZ - this.prevPosZ) * (double)var1;
+ return Vec3D.createVector(var2, var4, var6);
+ }
+ }
+
+ public Vec3D func_4037_H() {
+ return this.getLook(1.0F);
+ }
+
+ public Vec3D getLook(float var1) {
+ float var2;
+ float var3;
+ float var4;
+ float var5;
+ if(var1 == 1.0F) {
+ var2 = MathHelper.cos(-this.rotationYaw * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ var3 = MathHelper.sin(-this.rotationYaw * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ var4 = -MathHelper.cos(-this.rotationPitch * ((float)Math.PI / 180.0F));
+ var5 = MathHelper.sin(-this.rotationPitch * ((float)Math.PI / 180.0F));
+ return Vec3D.createVector((double)(var3 * var4), (double)var5, (double)(var2 * var4));
+ } else {
+ var2 = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * var1;
+ var3 = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * var1;
+ var4 = MathHelper.cos(-var3 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ var5 = MathHelper.sin(-var3 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var6 = -MathHelper.cos(-var2 * ((float)Math.PI / 180.0F));
+ float var7 = MathHelper.sin(-var2 * ((float)Math.PI / 180.0F));
+ return Vec3D.createVector((double)(var5 * var6), (double)var7, (double)(var4 * var6));
+ }
+ }
+
+ public MovingObjectPosition rayTrace(double var1, float var3) {
+ Vec3D var4 = this.getPosition(var3);
+ Vec3D var5 = this.getLook(var3);
+ Vec3D var6 = var4.addVector(var5.xCoord * var1, var5.yCoord * var1, var5.zCoord * var1);
+ return this.worldObj.rayTraceBlocks(var4, var6);
+ }
+
+ public int func_6391_i() {
+ return 4;
+ }
+
+ public ItemStack getHeldItem() {
+ return null;
+ }
+
+ public void func_9282_a(byte var1) {
+ if(var1 == 2) {
+ this.field_704_R = 1.5F;
+ this.field_9306_bj = this.field_9366_o;
+ this.hurtTime = this.field_9332_M = 10;
+ this.field_9331_N = 0.0F;
+ this.worldObj.playSoundAtEntity(this, this.getHurtSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ this.canAttackEntity((Entity)null, 0);
+ } else if(var1 == 3) {
+ this.worldObj.playSoundAtEntity(this, this.getDeathSound(), this.getSoundVolume(), (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ this.health = 0;
+ this.onDeath((Entity)null);
+ } else {
+ super.func_9282_a(var1);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityMinecart.java b/src/main/java/net/minecraft/src/EntityMinecart.java
new file mode 100644
index 0000000..223f377
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityMinecart.java
@@ -0,0 +1,707 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityMinecart extends Entity implements IInventory {
+ private ItemStack[] cargoItems;
+ public int a;
+ public int b;
+ public int c;
+ private boolean field_856_i;
+ public int d;
+ public int fuel;
+ public double pushX;
+ public double pushZ;
+ private static final int[][][] field_855_j = new int[][][]{{{0, 0, -1}, {0, 0, 1}}, {{-1, 0, 0}, {1, 0, 0}}, {{-1, -1, 0}, {1, 0, 0}}, {{-1, 0, 0}, {1, -1, 0}}, {{0, 0, -1}, {0, -1, 1}}, {{0, -1, -1}, {0, 0, 1}}, {{0, 0, 1}, {1, 0, 0}}, {{0, 0, 1}, {-1, 0, 0}}, {{0, 0, -1}, {-1, 0, 0}}, {{0, 0, -1}, {1, 0, 0}}};
+ private int field_9415_k;
+ private double field_9414_l;
+ private double field_9413_m;
+ private double field_9412_n;
+ private double field_9411_o;
+ private double field_9410_p;
+ private double field_9409_q;
+ private double field_9408_r;
+ private double field_9407_s;
+
+ public EntityMinecart(World var1) {
+ super(var1);
+ this.cargoItems = new ItemStack[36];
+ this.a = 0;
+ this.b = 0;
+ this.c = 1;
+ this.field_856_i = false;
+ this.field_618_ad = true;
+ this.setSize(0.98F, 0.7F);
+ this.yOffset = this.height / 2.0F;
+ this.entityWalks = false;
+ }
+
+ public AxisAlignedBB func_383_b_(Entity var1) {
+ return var1.boundingBox;
+ }
+
+ public AxisAlignedBB func_372_f_() {
+ return null;
+ }
+
+ public boolean canBePushed() {
+ return true;
+ }
+
+ public EntityMinecart(World var1, double var2, double var4, double var6, int var8) {
+ this(var1);
+ this.setPosition(var2, var4 + (double)this.yOffset, var6);
+ this.motionX = 0.0D;
+ this.motionY = 0.0D;
+ this.motionZ = 0.0D;
+ this.prevPosX = var2;
+ this.prevPosY = var4;
+ this.prevPosZ = var6;
+ this.d = var8;
+ }
+
+ public double func_402_h() {
+ return (double)this.height * 0.0D - (double)0.3F;
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ if(!this.isDead) {
+ this.c = -this.c;
+ this.b = 10;
+ this.func_9281_M();
+ this.a += var2 * 10;
+ if(this.a > 40) {
+ this.dropItemWithOffset(Item.minecartEmpty.shiftedIndex, 1, 0.0F);
+ if(this.d == 1) {
+ this.dropItemWithOffset(Block.crate.blockID, 1, 0.0F);
+ } else if(this.d == 2) {
+ this.dropItemWithOffset(Block.stoneOvenIdle.blockID, 1, 0.0F);
+ }
+
+ this.setEntityDead();
+ }
+
+ return true;
+ } else {
+ return true;
+ }
+ }
+
+ public void func_9280_g() {
+ System.out.println("Animating hurt");
+ this.c = -this.c;
+ this.b = 10;
+ this.a += this.a * 10;
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public void setEntityDead() {
+ for(int var1 = 0; var1 < this.getSizeInventory(); ++var1) {
+ ItemStack var2 = this.getStackInSlot(var1);
+ if(var2 != null) {
+ float var3 = this.rand.nextFloat() * 0.8F + 0.1F;
+ float var4 = this.rand.nextFloat() * 0.8F + 0.1F;
+ float var5 = this.rand.nextFloat() * 0.8F + 0.1F;
+
+ while(var2.stackSize > 0) {
+ int var6 = this.rand.nextInt(21) + 10;
+ if(var6 > var2.stackSize) {
+ var6 = var2.stackSize;
+ }
+
+ var2.stackSize -= var6;
+ EntityItem var7 = new EntityItem(this.worldObj, this.posX + (double)var3, this.posY + (double)var4, this.posZ + (double)var5, new ItemStack(var2.itemID, var6, var2.itemDamage));
+ float var8 = 0.05F;
+ var7.motionX = (double)((float)this.rand.nextGaussian() * var8);
+ var7.motionY = (double)((float)this.rand.nextGaussian() * var8 + 0.2F);
+ var7.motionZ = (double)((float)this.rand.nextGaussian() * var8);
+ this.worldObj.entityJoinedWorld(var7);
+ }
+ }
+ }
+
+ super.setEntityDead();
+ }
+
+ public void onUpdate() {
+ if(this.b > 0) {
+ --this.b;
+ }
+
+ if(this.a > 0) {
+ --this.a;
+ }
+
+ double var7;
+ //if(this.worldObj.multiplayerWorld && this.field_9415_k > 0) {
+ //if(this.field_9415_k > 0) {
+ //double var41 = this.posX + (this.field_9414_l - this.posX) / (double)this.field_9415_k;
+ //double var42 = this.posY + (this.field_9413_m - this.posY) / (double)this.field_9415_k;
+ //double var5 = this.posZ + (this.field_9412_n - this.posZ) / (double)this.field_9415_k;
+
+ //for(var7 = this.field_9411_o - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D) {
+ //}
+
+ //while(var7 >= 180.0D) {
+ //var7 -= 360.0D;
+ //}
+
+ //this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.field_9415_k);
+ //this.rotationPitch = (float)((double)this.rotationPitch + (this.field_9410_p - (double)this.rotationPitch) / (double)this.field_9415_k);
+ //--this.field_9415_k;
+ //this.setPosition(var41, var42, var5);
+ //this.setRotation(this.rotationYaw, this.rotationPitch);
+ //} else {
+ //this.setPosition(this.posX, this.posY, this.posZ);
+ //this.setRotation(this.rotationYaw, this.rotationPitch);
+ //}
+
+ //} else {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= (double)0.04F;
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.posY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ if(this.worldObj.getBlockId(var1, var2 - 1, var3) == Block.minecartTrack.blockID) {
+ --var2;
+ }
+
+ double var4 = 0.4D;
+ boolean var6 = false;
+ var7 = 1.0D / 128.0D;
+ if(this.worldObj.getBlockId(var1, var2, var3) == Block.minecartTrack.blockID) {
+ Vec3D var9 = this.func_514_g(this.posX, this.posY, this.posZ);
+ int var10 = this.worldObj.getBlockMetadata(var1, var2, var3);
+ this.posY = (double)var2;
+ if(var10 >= 2 && var10 <= 5) {
+ this.posY = (double)(var2 + 1);
+ }
+
+ if(var10 == 2) {
+ this.motionX -= var7;
+ }
+
+ if(var10 == 3) {
+ this.motionX += var7;
+ }
+
+ if(var10 == 4) {
+ this.motionZ += var7;
+ }
+
+ if(var10 == 5) {
+ this.motionZ -= var7;
+ }
+
+ int[][] var11 = field_855_j[var10];
+ double var12 = (double)(var11[1][0] - var11[0][0]);
+ double var14 = (double)(var11[1][2] - var11[0][2]);
+ double var16 = Math.sqrt(var12 * var12 + var14 * var14);
+ double var18 = this.motionX * var12 + this.motionZ * var14;
+ if(var18 < 0.0D) {
+ var12 = -var12;
+ var14 = -var14;
+ }
+
+ double var20 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.motionX = var20 * var12 / var16;
+ this.motionZ = var20 * var14 / var16;
+ double var22 = 0.0D;
+ double var24 = (double)var1 + 0.5D + (double)var11[0][0] * 0.5D;
+ double var26 = (double)var3 + 0.5D + (double)var11[0][2] * 0.5D;
+ double var28 = (double)var1 + 0.5D + (double)var11[1][0] * 0.5D;
+ double var30 = (double)var3 + 0.5D + (double)var11[1][2] * 0.5D;
+ var12 = var28 - var24;
+ var14 = var30 - var26;
+ double var32;
+ double var34;
+ double var36;
+ if(var12 == 0.0D) {
+ this.posX = (double)var1 + 0.5D;
+ var22 = this.posZ - (double)var3;
+ } else if(var14 == 0.0D) {
+ this.posZ = (double)var3 + 0.5D;
+ var22 = this.posX - (double)var1;
+ } else {
+ var32 = this.posX - var24;
+ var34 = this.posZ - var26;
+ var36 = (var32 * var12 + var34 * var14) * 2.0D;
+ var22 = var36;
+ }
+
+ this.posX = var24 + var12 * var22;
+ this.posZ = var26 + var14 * var22;
+ this.setPosition(this.posX, this.posY + (double)this.yOffset, this.posZ);
+ var32 = this.motionX;
+ var34 = this.motionZ;
+ if(this.riddenByEntity != null) {
+ var32 *= 0.75D;
+ var34 *= 0.75D;
+ }
+
+ if(var32 < -var4) {
+ var32 = -var4;
+ }
+
+ if(var32 > var4) {
+ var32 = var4;
+ }
+
+ if(var34 < -var4) {
+ var34 = -var4;
+ }
+
+ if(var34 > var4) {
+ var34 = var4;
+ }
+
+ this.moveEntity(var32, 0.0D, var34);
+ if(var11[0][1] != 0 && MathHelper.floor_double(this.posX) - var1 == var11[0][0] && MathHelper.floor_double(this.posZ) - var3 == var11[0][2]) {
+ this.setPosition(this.posX, this.posY + (double)var11[0][1], this.posZ);
+ } else if(var11[1][1] != 0 && MathHelper.floor_double(this.posX) - var1 == var11[1][0] && MathHelper.floor_double(this.posZ) - var3 == var11[1][2]) {
+ this.setPosition(this.posX, this.posY + (double)var11[1][1], this.posZ);
+ }
+
+ if(this.riddenByEntity != null) {
+ this.motionX *= (double)0.997F;
+ this.motionY *= 0.0D;
+ this.motionZ *= (double)0.997F;
+ } else {
+ if(this.d == 2) {
+ var36 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ);
+ if(var36 > 0.01D) {
+ var6 = true;
+ this.pushX /= var36;
+ this.pushZ /= var36;
+ double var38 = 0.04D;
+ this.motionX *= (double)0.8F;
+ this.motionY *= 0.0D;
+ this.motionZ *= (double)0.8F;
+ this.motionX += this.pushX * var38;
+ this.motionZ += this.pushZ * var38;
+ } else {
+ this.motionX *= (double)0.9F;
+ this.motionY *= 0.0D;
+ this.motionZ *= (double)0.9F;
+ }
+ }
+
+ this.motionX *= (double)0.96F;
+ this.motionY *= 0.0D;
+ this.motionZ *= (double)0.96F;
+ }
+
+ Vec3D var46 = this.func_514_g(this.posX, this.posY, this.posZ);
+ if(var46 != null && var9 != null) {
+ double var37 = (var9.yCoord - var46.yCoord) * 0.05D;
+ var20 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ if(var20 > 0.0D) {
+ this.motionX = this.motionX / var20 * (var20 + var37);
+ this.motionZ = this.motionZ / var20 * (var20 + var37);
+ }
+
+ this.setPosition(this.posX, var46.yCoord, this.posZ);
+ }
+
+ int var47 = MathHelper.floor_double(this.posX);
+ int var48 = MathHelper.floor_double(this.posZ);
+ if(var47 != var1 || var48 != var3) {
+ var20 = Math.sqrt(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.motionX = var20 * (double)(var47 - var1);
+ this.motionZ = var20 * (double)(var48 - var3);
+ }
+
+ if(this.d == 2) {
+ double var39 = (double)MathHelper.sqrt_double(this.pushX * this.pushX + this.pushZ * this.pushZ);
+ if(var39 > 0.01D && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.001D) {
+ this.pushX /= var39;
+ this.pushZ /= var39;
+ if(this.pushX * this.motionX + this.pushZ * this.motionZ < 0.0D) {
+ this.pushX = 0.0D;
+ this.pushZ = 0.0D;
+ } else {
+ this.pushX = this.motionX;
+ this.pushZ = this.motionZ;
+ }
+ }
+ }
+ } else {
+ if(this.motionX < -var4) {
+ this.motionX = -var4;
+ }
+
+ if(this.motionX > var4) {
+ this.motionX = var4;
+ }
+
+ if(this.motionZ < -var4) {
+ this.motionZ = -var4;
+ }
+
+ if(this.motionZ > var4) {
+ this.motionZ = var4;
+ }
+
+ if(this.onGround) {
+ this.motionX *= 0.5D;
+ this.motionY *= 0.5D;
+ this.motionZ *= 0.5D;
+ }
+
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ if(!this.onGround) {
+ this.motionX *= (double)0.95F;
+ this.motionY *= (double)0.95F;
+ this.motionZ *= (double)0.95F;
+ }
+ }
+
+ this.rotationPitch = 0.0F;
+ double var43 = this.prevPosX - this.posX;
+ double var44 = this.prevPosZ - this.posZ;
+ if(var43 * var43 + var44 * var44 > 0.001D) {
+ this.rotationYaw = (float)(Math.atan2(var44, var43) * 180.0D / Math.PI);
+ if(this.field_856_i) {
+ this.rotationYaw += 180.0F;
+ }
+ }
+
+ double var13;
+ for(var13 = (double)(this.rotationYaw - this.prevRotationYaw); var13 >= 180.0D; var13 -= 360.0D) {
+ }
+
+ while(var13 < -180.0D) {
+ var13 += 360.0D;
+ }
+
+ if(var13 < -170.0D || var13 >= 170.0D) {
+ this.rotationYaw += 180.0F;
+ this.field_856_i = !this.field_856_i;
+ }
+
+ this.setRotation(this.rotationYaw, this.rotationPitch);
+ List var15 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands((double)0.2F, 0.0D, (double)0.2F));
+ if(var15 != null && var15.size() > 0) {
+ for(int var45 = 0; var45 < var15.size(); ++var45) {
+ Entity var17 = (Entity)var15.get(var45);
+ if(var17 != this.riddenByEntity && var17.canBePushed() && var17 instanceof EntityMinecart) {
+ var17.applyEntityCollision(this);
+ }
+ }
+ }
+
+ if(this.riddenByEntity != null && this.riddenByEntity.isDead) {
+ this.riddenByEntity = null;
+ }
+
+ if(var6 && this.rand.nextInt(4) == 0) {
+ --this.fuel;
+ if(this.fuel < 0) {
+ this.pushX = this.pushZ = 0.0D;
+ }
+
+ this.worldObj.spawnParticle("largesmoke", this.posX, this.posY + 0.8D, this.posZ, 0.0D, 0.0D, 0.0D);
+ }
+
+ //}
+ }
+
+ public Vec3D func_515_a(double var1, double var3, double var5, double var7) {
+ int var9 = MathHelper.floor_double(var1);
+ int var10 = MathHelper.floor_double(var3);
+ int var11 = MathHelper.floor_double(var5);
+ if(this.worldObj.getBlockId(var9, var10 - 1, var11) == Block.minecartTrack.blockID) {
+ --var10;
+ }
+
+ if(this.worldObj.getBlockId(var9, var10, var11) == Block.minecartTrack.blockID) {
+ int var12 = this.worldObj.getBlockMetadata(var9, var10, var11);
+ var3 = (double)var10;
+ if(var12 >= 2 && var12 <= 5) {
+ var3 = (double)(var10 + 1);
+ }
+
+ int[][] var13 = field_855_j[var12];
+ double var14 = (double)(var13[1][0] - var13[0][0]);
+ double var16 = (double)(var13[1][2] - var13[0][2]);
+ double var18 = Math.sqrt(var14 * var14 + var16 * var16);
+ var14 /= var18;
+ var16 /= var18;
+ var1 += var14 * var7;
+ var5 += var16 * var7;
+ if(var13[0][1] != 0 && MathHelper.floor_double(var1) - var9 == var13[0][0] && MathHelper.floor_double(var5) - var11 == var13[0][2]) {
+ var3 += (double)var13[0][1];
+ } else if(var13[1][1] != 0 && MathHelper.floor_double(var1) - var9 == var13[1][0] && MathHelper.floor_double(var5) - var11 == var13[1][2]) {
+ var3 += (double)var13[1][1];
+ }
+
+ return this.func_514_g(var1, var3, var5);
+ } else {
+ return null;
+ }
+ }
+
+ public Vec3D func_514_g(double var1, double var3, double var5) {
+ int var7 = MathHelper.floor_double(var1);
+ int var8 = MathHelper.floor_double(var3);
+ int var9 = MathHelper.floor_double(var5);
+ if(this.worldObj.getBlockId(var7, var8 - 1, var9) == Block.minecartTrack.blockID) {
+ --var8;
+ }
+
+ if(this.worldObj.getBlockId(var7, var8, var9) == Block.minecartTrack.blockID) {
+ int var10 = this.worldObj.getBlockMetadata(var7, var8, var9);
+ var3 = (double)var8;
+ if(var10 >= 2 && var10 <= 5) {
+ var3 = (double)(var8 + 1);
+ }
+
+ int[][] var11 = field_855_j[var10];
+ double var12 = 0.0D;
+ double var14 = (double)var7 + 0.5D + (double)var11[0][0] * 0.5D;
+ double var16 = (double)var8 + 0.5D + (double)var11[0][1] * 0.5D;
+ double var18 = (double)var9 + 0.5D + (double)var11[0][2] * 0.5D;
+ double var20 = (double)var7 + 0.5D + (double)var11[1][0] * 0.5D;
+ double var22 = (double)var8 + 0.5D + (double)var11[1][1] * 0.5D;
+ double var24 = (double)var9 + 0.5D + (double)var11[1][2] * 0.5D;
+ double var26 = var20 - var14;
+ double var28 = (var22 - var16) * 2.0D;
+ double var30 = var24 - var18;
+ if(var26 == 0.0D) {
+ var1 = (double)var7 + 0.5D;
+ var12 = var5 - (double)var9;
+ } else if(var30 == 0.0D) {
+ var5 = (double)var9 + 0.5D;
+ var12 = var1 - (double)var7;
+ } else {
+ double var32 = var1 - var14;
+ double var34 = var5 - var18;
+ double var36 = (var32 * var26 + var34 * var30) * 2.0D;
+ var12 = var36;
+ }
+
+ var1 = var14 + var26 * var12;
+ var3 = var16 + var28 * var12;
+ var5 = var18 + var30 * var12;
+ if(var28 < 0.0D) {
+ ++var3;
+ }
+
+ if(var28 > 0.0D) {
+ var3 += 0.5D;
+ }
+
+ return Vec3D.createVector(var1, var3, var5);
+ } else {
+ return null;
+ }
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setInteger("Type", this.d);
+ if(this.d == 2) {
+ var1.setDouble("PushX", this.pushX);
+ var1.setDouble("PushZ", this.pushZ);
+ var1.setShort("Fuel", (short)this.fuel);
+ } else if(this.d == 1) {
+ NBTTagList var2 = new NBTTagList();
+
+ for(int var3 = 0; var3 < this.cargoItems.length; ++var3) {
+ if(this.cargoItems[var3] != null) {
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setByte("Slot", (byte)var3);
+ this.cargoItems[var3].writeToNBT(var4);
+ var2.setTag(var4);
+ }
+ }
+
+ var1.setTag("Items", var2);
+ }
+
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ this.d = var1.getInteger("Type");
+ if(this.d == 2) {
+ this.pushX = var1.getDouble("PushX");
+ this.pushZ = var1.getDouble("PushZ");
+ this.fuel = var1.getShort("Fuel");
+ } else if(this.d == 1) {
+ NBTTagList var2 = var1.getTagList("Items");
+ this.cargoItems = new ItemStack[this.getSizeInventory()];
+
+ for(int var3 = 0; var3 < var2.tagCount(); ++var3) {
+ NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+ int var5 = var4.getByte("Slot") & 255;
+ if(var5 >= 0 && var5 < this.cargoItems.length) {
+ this.cargoItems[var5] = new ItemStack(var4);
+ }
+ }
+ }
+
+ }
+
+ public float func_392_h_() {
+ return 0.0F;
+ }
+
+ public void applyEntityCollision(Entity var1) {
+ //if(!this.worldObj.multiplayerWorld) {
+ if(var1 != this.riddenByEntity) {
+ if(var1 instanceof EntityLiving && !(var1 instanceof EntityPlayer) && this.d == 0 && this.motionX * this.motionX + this.motionZ * this.motionZ > 0.01D && this.riddenByEntity == null && var1.ridingEntity == null) {
+ var1.mountEntity(this);
+ }
+
+ double var2 = var1.posX - this.posX;
+ double var4 = var1.posZ - this.posZ;
+ double var6 = var2 * var2 + var4 * var4;
+ if(var6 >= (double)1.0E-4F) {
+ var6 = (double)MathHelper.sqrt_double(var6);
+ var2 /= var6;
+ var4 /= var6;
+ double var8 = 1.0D / var6;
+ if(var8 > 1.0D) {
+ var8 = 1.0D;
+ }
+
+ var2 *= var8;
+ var4 *= var8;
+ var2 *= (double)0.1F;
+ var4 *= (double)0.1F;
+ var2 *= (double)(1.0F - this.field_632_aO);
+ var4 *= (double)(1.0F - this.field_632_aO);
+ var2 *= 0.5D;
+ var4 *= 0.5D;
+ if(var1 instanceof EntityMinecart) {
+ double var10 = var1.motionX + this.motionX;
+ double var12 = var1.motionZ + this.motionZ;
+ if(((EntityMinecart)var1).d == 2 && this.d != 2) {
+ this.motionX *= (double)0.2F;
+ this.motionZ *= (double)0.2F;
+ this.addVelocity(var1.motionX - var2, 0.0D, var1.motionZ - var4);
+ var1.motionX *= (double)0.7F;
+ var1.motionZ *= (double)0.7F;
+ } else if(((EntityMinecart)var1).d != 2 && this.d == 2) {
+ var1.motionX *= (double)0.2F;
+ var1.motionZ *= (double)0.2F;
+ var1.addVelocity(this.motionX + var2, 0.0D, this.motionZ + var4);
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ } else {
+ var10 /= 2.0D;
+ var12 /= 2.0D;
+ this.motionX *= (double)0.2F;
+ this.motionZ *= (double)0.2F;
+ this.addVelocity(var10 - var2, 0.0D, var12 - var4);
+ var1.motionX *= (double)0.2F;
+ var1.motionZ *= (double)0.2F;
+ var1.addVelocity(var10 + var2, 0.0D, var12 + var4);
+ }
+ } else {
+ this.addVelocity(-var2, 0.0D, -var4);
+ var1.addVelocity(var2 / 4.0D, 0.0D, var4 / 4.0D);
+ }
+ }
+
+ }
+ //}
+ }
+
+ public int getSizeInventory() {
+ return 27;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.cargoItems[var1];
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.cargoItems[var1] != null) {
+ ItemStack var3;
+ if(this.cargoItems[var1].stackSize <= var2) {
+ var3 = this.cargoItems[var1];
+ this.cargoItems[var1] = null;
+ return var3;
+ } else {
+ var3 = this.cargoItems[var1].splitStack(var2);
+ if(this.cargoItems[var1].stackSize == 0) {
+ this.cargoItems[var1] = null;
+ }
+
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.cargoItems[var1] = var2;
+ if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) {
+ var2.stackSize = this.getInventoryStackLimit();
+ }
+
+ }
+
+ public String getInvName() {
+ return "Minecart";
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public void onInventoryChanged() {
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ if(this.d == 0) {
+ if(this.riddenByEntity != null && this.riddenByEntity instanceof EntityPlayer && this.riddenByEntity != var1) {
+ return true;
+ }
+
+ //if(!this.worldObj.multiplayerWorld) {
+ var1.mountEntity(this);
+ //}
+ } else if(this.d == 1) {
+ var1.displayGUIChest(this);
+ } else if(this.d == 2) {
+ ItemStack var2 = var1.inventory.getCurrentItem();
+ if(var2 != null && var2.itemID == Item.coal.shiftedIndex) {
+ if(--var2.stackSize == 0) {
+ var1.inventory.setInventorySlotContents(var1.inventory.currentItem, (ItemStack)null);
+ }
+
+ this.fuel += 1200;
+ }
+
+ this.pushX = this.posX - var1.posX;
+ this.pushZ = this.posZ - var1.posZ;
+ }
+
+ return true;
+ }
+
+ public void setPositionAndRotation2(double var1, double var3, double var5, float var7, float var8, int var9) {
+ this.field_9414_l = var1;
+ this.field_9413_m = var3;
+ this.field_9412_n = var5;
+ this.field_9411_o = (double)var7;
+ this.field_9410_p = (double)var8;
+ this.field_9415_k = var9 + 2;
+ this.motionX = this.field_9409_q;
+ this.motionY = this.field_9408_r;
+ this.motionZ = this.field_9407_s;
+ }
+
+ public void setVelocity(double var1, double var3, double var5) {
+ this.field_9409_q = this.motionX = var1;
+ this.field_9408_r = this.motionY = var3;
+ this.field_9407_s = this.motionZ = var5;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityMobs.java b/src/main/java/net/minecraft/src/EntityMobs.java
new file mode 100644
index 0000000..72ef820
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityMobs.java
@@ -0,0 +1,80 @@
+package net.minecraft.src;
+
+public class EntityMobs extends EntityCreature implements IMobs {
+ protected int field_762_e = 2;
+
+ public EntityMobs(World var1) {
+ super(var1);
+ this.health = 20;
+ }
+
+ public void onLivingUpdate() {
+ float var1 = this.getEntityBrightness(1.0F);
+ if(var1 > 0.5F) {
+ this.field_9344_ag += 2;
+ }
+
+ super.onLivingUpdate();
+ }
+
+ public void onUpdate() {
+ super.onUpdate();
+ if(this.worldObj.difficultySetting == 0) {
+ this.setEntityDead();
+ }
+
+ }
+
+ protected Entity findPlayerToAttack() {
+ EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, 16.0D);
+ return var1 != null && this.canEntityBeSeen(var1) ? var1 : null;
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ if(super.canAttackEntity(var1, var2)) {
+ if(this.riddenByEntity != var1 && this.ridingEntity != var1) {
+ if(var1 != this) {
+ this.playerToAttack = var1;
+ }
+
+ return true;
+ } else {
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ if((double)var2 < 2.5D && var1.boundingBox.maxY > this.boundingBox.minY && var1.boundingBox.minY < this.boundingBox.maxY) {
+ this.attackTime = 20;
+ var1.canAttackEntity(this, this.field_762_e);
+ }
+
+ }
+
+ protected float func_439_a(int var1, int var2, int var3) {
+ return 0.5F - this.worldObj.getLightBrightness(var1, var2, var3);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ public boolean getCanSpawnHere() {
+ int var1 = MathHelper.floor_double(this.posX);
+ int var2 = MathHelper.floor_double(this.boundingBox.minY);
+ int var3 = MathHelper.floor_double(this.posZ);
+ if(this.worldObj.getSavedLightValue(EnumSkyBlock.Sky, var1, var2, var3) > this.rand.nextInt(32)) {
+ return false;
+ } else {
+ int var4 = this.worldObj.getBlockLightValue(var1, var2, var3);
+ return var4 <= this.rand.nextInt(8) && super.getCanSpawnHere();
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityPainting.java b/src/main/java/net/minecraft/src/EntityPainting.java
new file mode 100644
index 0000000..94715ae
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityPainting.java
@@ -0,0 +1,213 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class EntityPainting extends Entity {
+ private int field_695_c;
+ public int field_691_a;
+ private int field_9322_d;
+ private int field_9321_e;
+ private int field_9320_f;
+ public EnumArt field_690_b;
+
+ public EntityPainting(World var1) {
+ super(var1);
+ this.field_695_c = 0;
+ this.field_691_a = 0;
+ this.yOffset = 0.0F;
+ this.setSize(0.5F, 0.5F);
+ }
+
+ public EntityPainting(World var1, int var2, int var3, int var4, int var5) {
+ this(var1);
+ this.field_9322_d = var2;
+ this.field_9321_e = var3;
+ this.field_9320_f = var4;
+ ArrayList var6 = new ArrayList();
+ EnumArt[] var7 = EnumArt.values();
+ int var8 = var7.length;
+
+ for(int var9 = 0; var9 < var8; ++var9) {
+ EnumArt var10 = var7[var9];
+ this.field_690_b = var10;
+ this.func_412_b(var5);
+ if(this.func_410_i()) {
+ var6.add(var10);
+ }
+ }
+
+ if(var6.size() > 0) {
+ this.field_690_b = (EnumArt)var6.get(this.rand.nextInt(var6.size()));
+ }
+
+ this.func_412_b(var5);
+ }
+
+ public void func_412_b(int var1) {
+ this.field_691_a = var1;
+ this.prevRotationYaw = this.rotationYaw = (float)(var1 * 90);
+ float var2 = (float)this.field_690_b.field_1623_z;
+ float var3 = (float)this.field_690_b.field_1636_A;
+ float var4 = (float)this.field_690_b.field_1623_z;
+ if(var1 != 0 && var1 != 2) {
+ var2 = 0.5F;
+ } else {
+ var4 = 0.5F;
+ }
+
+ var2 /= 32.0F;
+ var3 /= 32.0F;
+ var4 /= 32.0F;
+ float var5 = (float)this.field_9322_d + 0.5F;
+ float var6 = (float)this.field_9321_e + 0.5F;
+ float var7 = (float)this.field_9320_f + 0.5F;
+ float var8 = 9.0F / 16.0F;
+ if(var1 == 0) {
+ var7 -= var8;
+ }
+
+ if(var1 == 1) {
+ var5 -= var8;
+ }
+
+ if(var1 == 2) {
+ var7 += var8;
+ }
+
+ if(var1 == 3) {
+ var5 += var8;
+ }
+
+ if(var1 == 0) {
+ var5 -= this.func_411_c(this.field_690_b.field_1623_z);
+ }
+
+ if(var1 == 1) {
+ var7 += this.func_411_c(this.field_690_b.field_1623_z);
+ }
+
+ if(var1 == 2) {
+ var5 += this.func_411_c(this.field_690_b.field_1623_z);
+ }
+
+ if(var1 == 3) {
+ var7 -= this.func_411_c(this.field_690_b.field_1623_z);
+ }
+
+ var6 += this.func_411_c(this.field_690_b.field_1636_A);
+ this.setPosition((double)var5, (double)var6, (double)var7);
+ float var9 = -(0.1F / 16.0F);
+ this.boundingBox.setBounds((double)(var5 - var2 - var9), (double)(var6 - var3 - var9), (double)(var7 - var4 - var9), (double)(var5 + var2 + var9), (double)(var6 + var3 + var9), (double)(var7 + var4 + var9));
+ }
+
+ private float func_411_c(int var1) {
+ return var1 == 32 ? 0.5F : (var1 == 64 ? 0.5F : 0.0F);
+ }
+
+ public void onUpdate() {
+ if(this.field_695_c++ == 100 && !this.func_410_i()) {
+ this.field_695_c = 0;
+ this.setEntityDead();
+ this.worldObj.entityJoinedWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
+ }
+
+ }
+
+ public boolean func_410_i() {
+ if(this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() > 0) {
+ return false;
+ } else {
+ int var1 = this.field_690_b.field_1623_z / 16;
+ int var2 = this.field_690_b.field_1636_A / 16;
+ int var3 = this.field_9322_d;
+ int var4 = this.field_9321_e;
+ int var5 = this.field_9320_f;
+ if(this.field_691_a == 0) {
+ var3 = MathHelper.floor_double(this.posX - (double)((float)this.field_690_b.field_1623_z / 32.0F));
+ }
+
+ if(this.field_691_a == 1) {
+ var5 = MathHelper.floor_double(this.posZ - (double)((float)this.field_690_b.field_1623_z / 32.0F));
+ }
+
+ if(this.field_691_a == 2) {
+ var3 = MathHelper.floor_double(this.posX - (double)((float)this.field_690_b.field_1623_z / 32.0F));
+ }
+
+ if(this.field_691_a == 3) {
+ var5 = MathHelper.floor_double(this.posZ - (double)((float)this.field_690_b.field_1623_z / 32.0F));
+ }
+
+ var4 = MathHelper.floor_double(this.posY - (double)((float)this.field_690_b.field_1636_A / 32.0F));
+
+ int var7;
+ for(int var6 = 0; var6 < var1; ++var6) {
+ for(var7 = 0; var7 < var2; ++var7) {
+ Material var8;
+ if(this.field_691_a != 0 && this.field_691_a != 2) {
+ var8 = this.worldObj.getBlockMaterial(this.field_9322_d, var4 + var7, var5 + var6);
+ } else {
+ var8 = this.worldObj.getBlockMaterial(var3 + var6, var4 + var7, this.field_9320_f);
+ }
+
+ if(!var8.func_878_a()) {
+ return false;
+ }
+ }
+ }
+
+ List var9 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox);
+
+ for(var7 = 0; var7 < var9.size(); ++var7) {
+ if(var9.get(var7) instanceof EntityPainting) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+
+ public boolean canBeCollidedWith() {
+ return true;
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ this.setEntityDead();
+ this.func_9281_M();
+ this.worldObj.entityJoinedWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
+ return true;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setByte("Dir", (byte)this.field_691_a);
+ var1.setString("Motive", this.field_690_b.field_1624_y);
+ var1.setInteger("TileX", this.field_9322_d);
+ var1.setInteger("TileY", this.field_9321_e);
+ var1.setInteger("TileZ", this.field_9320_f);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.field_691_a = var1.getByte("Dir");
+ this.field_9322_d = var1.getInteger("TileX");
+ this.field_9321_e = var1.getInteger("TileY");
+ this.field_9320_f = var1.getInteger("TileZ");
+ String var2 = var1.getString("Motive");
+ EnumArt[] var3 = EnumArt.values();
+ int var4 = var3.length;
+
+ for(int var5 = 0; var5 < var4; ++var5) {
+ EnumArt var6 = var3[var5];
+ if(var6.field_1624_y.equals(var2)) {
+ this.field_690_b = var6;
+ }
+ }
+
+ if(this.field_690_b == null) {
+ this.field_690_b = EnumArt.Kebab;
+ }
+
+ this.func_412_b(this.field_691_a);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityPickupFX.java b/src/main/java/net/minecraft/src/EntityPickupFX.java
new file mode 100644
index 0000000..d5f3bd3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityPickupFX.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class EntityPickupFX extends EntityFX {
+ private Entity field_675_a;
+ private Entity field_679_o;
+ private int field_678_p = 0;
+ private int field_677_q = 0;
+ private float field_676_r;
+
+ public EntityPickupFX(World var1, Entity var2, Entity var3, float var4) {
+ super(var1, var2.posX, var2.posY, var2.posZ, var2.motionX, var2.motionY, var2.motionZ);
+ this.field_675_a = var2;
+ this.field_679_o = var3;
+ this.field_677_q = 3;
+ this.field_676_r = var4;
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = ((float)this.field_678_p + var2) / (float)this.field_677_q;
+ var8 *= var8;
+ double var9 = this.field_675_a.posX;
+ double var11 = this.field_675_a.posY;
+ double var13 = this.field_675_a.posZ;
+ double var15 = this.field_679_o.lastTickPosX + (this.field_679_o.posX - this.field_679_o.lastTickPosX) * (double)var2;
+ double var17 = this.field_679_o.lastTickPosY + (this.field_679_o.posY - this.field_679_o.lastTickPosY) * (double)var2 + (double)this.field_676_r;
+ double var19 = this.field_679_o.lastTickPosZ + (this.field_679_o.posZ - this.field_679_o.lastTickPosZ) * (double)var2;
+ double var21 = var9 + (var15 - var9) * (double)var8;
+ double var23 = var11 + (var17 - var11) * (double)var8;
+ double var25 = var13 + (var19 - var13) * (double)var8;
+ int var27 = MathHelper.floor_double(var21);
+ int var28 = MathHelper.floor_double(var23 + (double)(this.yOffset / 2.0F));
+ int var29 = MathHelper.floor_double(var25);
+ float var30 = this.worldObj.getLightBrightness(var27, var28, var29);
+ var21 -= field_660_l;
+ var23 -= field_659_m;
+ var25 -= field_658_n;
+ GL11.glColor4f(var30, var30, var30, 1.0F);
+ RenderManager.instance.func_853_a(this.field_675_a, (double)((float)var21), (double)((float)var23), (double)((float)var25), this.field_675_a.rotationYaw, var2);
+ }
+
+ public void onUpdate() {
+ ++this.field_678_p;
+ if(this.field_678_p == this.field_677_q) {
+ this.setEntityDead();
+ }
+
+ }
+
+ public int func_404_c() {
+ return 3;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityPig.java b/src/main/java/net/minecraft/src/EntityPig.java
new file mode 100644
index 0000000..5f32afc
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityPig.java
@@ -0,0 +1,47 @@
+package net.minecraft.src;
+
+public class EntityPig extends EntityAnimals {
+ public boolean rideable = false;
+
+ public EntityPig(World var1) {
+ super(var1);
+ this.texture = "/mob/pig.png";
+ this.setSize(0.9F, 0.9F);
+ this.rideable = false;
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setBoolean("Saddle", this.rideable);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.rideable = var1.getBoolean("Saddle");
+ }
+
+ protected String getLivingSound() {
+ return "mob.pig";
+ }
+
+ protected String getHurtSound() {
+ return "mob.pig";
+ }
+
+ protected String getDeathSound() {
+ return "mob.pigdeath";
+ }
+
+ public boolean interact(EntityPlayer var1) {
+ if(this.rideable) {
+ var1.mountEntity(this);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ protected int getDropItemId() {
+ return Item.porkRaw.shiftedIndex;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityPigZombie.java b/src/main/java/net/minecraft/src/EntityPigZombie.java
new file mode 100644
index 0000000..0812686
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityPigZombie.java
@@ -0,0 +1,92 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityPigZombie extends EntityZombie {
+ private int angerLevel = 0;
+ private int randomSoundDelay = 0;
+ private static final ItemStack defaultHeldItem = new ItemStack(Item.swordGold, 1);
+
+ public EntityPigZombie(World var1) {
+ super(var1);
+ this.texture = "/mob/pigzombie.png";
+ this.field_9333_am = 0.5F;
+ this.field_762_e = 5;
+ this.isImmuneToFire = true;
+ }
+
+ public void onUpdate() {
+ this.field_9333_am = this.playerToAttack != null ? 0.95F : 0.5F;
+ if(this.randomSoundDelay > 0 && --this.randomSoundDelay == 0) {
+ this.worldObj.playSoundAtEntity(this, "mob.zombiepig.zpigangry", this.getSoundVolume() * 2.0F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 1.8F);
+ }
+
+ super.onUpdate();
+ }
+
+ public boolean getCanSpawnHere() {
+ return this.worldObj.difficultySetting > 0 && this.worldObj.checkIfAABBIsClear(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).size() == 0 && !this.worldObj.getIsAnyLiquid(this.boundingBox);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setShort("Anger", (short)this.angerLevel);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.angerLevel = var1.getShort("Anger");
+ }
+
+ protected Entity findPlayerToAttack() {
+ return this.angerLevel == 0 ? null : super.findPlayerToAttack();
+ }
+
+ public void onLivingUpdate() {
+ super.onLivingUpdate();
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ if(var1 instanceof EntityPlayer) {
+ List var3 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands(32.0D, 32.0D, 32.0D));
+
+ for(int var4 = 0; var4 < var3.size(); ++var4) {
+ Entity var5 = (Entity)var3.get(var4);
+ if(var5 instanceof EntityPigZombie) {
+ EntityPigZombie var6 = (EntityPigZombie)var5;
+ var6.becomeAngryAt(var1);
+ }
+ }
+
+ this.becomeAngryAt(var1);
+ }
+
+ return super.canAttackEntity(var1, var2);
+ }
+
+ private void becomeAngryAt(Entity var1) {
+ this.playerToAttack = var1;
+ this.angerLevel = 400 + this.rand.nextInt(400);
+ this.randomSoundDelay = this.rand.nextInt(40);
+ }
+
+ protected String getLivingSound() {
+ return "mob.zombiepig.zpig";
+ }
+
+ protected String getHurtSound() {
+ return "mob.zombiepig.zpighurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.zombiepig.zpigdeath";
+ }
+
+ protected int getDropItemId() {
+ return Item.porkCooked.shiftedIndex;
+ }
+
+ public ItemStack getHeldItem() {
+ return defaultHeldItem;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityPlayer.java b/src/main/java/net/minecraft/src/EntityPlayer.java
new file mode 100644
index 0000000..1b503df
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityPlayer.java
@@ -0,0 +1,281 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntityPlayer extends EntityLiving {
+ public InventoryPlayer inventory = new InventoryPlayer(this);
+ public byte field_9371_f = 0;
+ public int score = 0;
+ public float field_775_e;
+ public float field_774_f;
+ public boolean field_9369_j = false;
+ public int field_9368_k = 0;
+ public String field_771_i;
+ public int dimension;
+ private int field_781_a = 0;
+ public EntityFish fishEntity = null;
+
+ public EntityPlayer(World var1) {
+ super(var1);
+ this.yOffset = 1.62F;
+ this.setLocationAndAngles((double)var1.spawnX + 0.5D, (double)(var1.spawnY + 1), (double)var1.spawnZ + 0.5D, 0.0F, 0.0F);
+ this.health = 20;
+ this.field_9351_C = "humanoid";
+ this.field_9353_B = 180.0F;
+ this.field_9310_bf = 20;
+ this.texture = "/mob/char.png";
+ }
+
+ public void func_350_p() {
+ super.func_350_p();
+ this.field_775_e = this.field_774_f;
+ this.field_774_f = 0.0F;
+ }
+
+ public void preparePlayerToSpawn() {
+ this.yOffset = 1.62F;
+ this.setSize(0.6F, 1.8F);
+ super.preparePlayerToSpawn();
+ this.health = 20;
+ this.deathTime = 0;
+ }
+
+ protected void func_418_b_() {
+ if(this.field_9369_j) {
+ ++this.field_9368_k;
+ if(this.field_9368_k == 8) {
+ this.field_9368_k = 0;
+ this.field_9369_j = false;
+ }
+ } else {
+ this.field_9368_k = 0;
+ }
+
+ this.swingProgress = (float)this.field_9368_k / 8.0F;
+ }
+
+ public void onLivingUpdate() {
+ if(this.worldObj.difficultySetting == 0 && this.health < 20 && this.field_9311_be % 20 * 4 == 0) {
+ this.heal(1);
+ }
+
+ this.inventory.decrementAnimations();
+ this.field_775_e = this.field_774_f;
+ super.onLivingUpdate();
+ float var1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ float var2 = (float)Math.atan(-this.motionY * (double)0.2F) * 15.0F;
+ if(var1 > 0.1F) {
+ var1 = 0.1F;
+ }
+
+ if(!this.onGround || this.health <= 0) {
+ var1 = 0.0F;
+ }
+
+ if(this.onGround || this.health <= 0) {
+ var2 = 0.0F;
+ }
+
+ this.field_774_f += (var1 - this.field_774_f) * 0.4F;
+ this.field_9328_R += (var2 - this.field_9328_R) * 0.8F;
+ if(this.health > 0) {
+ List var3 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expands(1.0D, 0.0D, 1.0D));
+ if(var3 != null) {
+ for(int var4 = 0; var4 < var3.size(); ++var4) {
+ this.func_451_h((Entity)var3.get(var4));
+ }
+ }
+ }
+
+ }
+
+ private void func_451_h(Entity var1) {
+ var1.onCollideWithPlayer(this);
+ }
+
+ public int func_6417_t() {
+ return this.score;
+ }
+
+ public void onDeath(Entity var1) {
+ super.onDeath(var1);
+ this.setSize(0.2F, 0.2F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.motionY = (double)0.1F;
+ if(this.field_771_i.equals("Notch")) {
+ this.dropPlayerItemWithRandomChoice(new ItemStack(Item.appleRed, 1), true);
+ }
+
+ this.inventory.dropAllItems();
+ if(var1 != null) {
+ this.motionX = (double)(-MathHelper.cos((this.field_9331_N + this.rotationYaw) * (float)Math.PI / 180.0F) * 0.1F);
+ this.motionZ = (double)(-MathHelper.sin((this.field_9331_N + this.rotationYaw) * (float)Math.PI / 180.0F) * 0.1F);
+ } else {
+ this.motionX = this.motionZ = 0.0D;
+ }
+
+ this.yOffset = 0.1F;
+ }
+
+ public void addToPlayerScore(Entity var1, int var2) {
+ this.score += var2;
+ }
+
+ public void dropPlayerItem(ItemStack var1) {
+ this.dropPlayerItemWithRandomChoice(var1, false);
+ }
+
+ public void dropPlayerItemWithRandomChoice(ItemStack var1, boolean var2) {
+ if(var1 != null) {
+ EntityItem var3 = new EntityItem(this.worldObj, this.posX, this.posY - (double)0.3F + (double)this.func_373_s(), this.posZ, var1);
+ var3.field_805_c = 40;
+ float var4 = 0.1F;
+ float var5;
+ if(var2) {
+ var5 = this.rand.nextFloat() * 0.5F;
+ float var6 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ var3.motionX = (double)(-MathHelper.sin(var6) * var5);
+ var3.motionZ = (double)(MathHelper.cos(var6) * var5);
+ var3.motionY = (double)0.2F;
+ } else {
+ var4 = 0.3F;
+ var3.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var4);
+ var3.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var4);
+ var3.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var4 + 0.1F);
+ var4 = 0.02F;
+ var5 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ var4 *= this.rand.nextFloat();
+ var3.motionX += Math.cos((double)var5) * (double)var4;
+ var3.motionY += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F);
+ var3.motionZ += Math.sin((double)var5) * (double)var4;
+ }
+
+ this.joinEntityItemWithWorld(var3);
+ }
+ }
+
+ protected void joinEntityItemWithWorld(EntityItem var1) {
+ this.worldObj.entityJoinedWorld(var1);
+ }
+
+ public float getCurrentPlayerStrVsBlock(Block var1) {
+ float var2 = this.inventory.getStrVsBlock(var1);
+ if(this.isInsideOfMaterial(Material.water)) {
+ var2 /= 5.0F;
+ }
+
+ if(!this.onGround) {
+ var2 /= 5.0F;
+ }
+
+ return var2;
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return this.inventory.canHarvestBlock(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ NBTTagList var2 = var1.getTagList("Inventory");
+ this.inventory.readFromNBT(var2);
+ this.dimension = var1.getInteger("Dimension");
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setTag("Inventory", this.inventory.writeToNBT(new NBTTagList()));
+ var1.setInteger("Dimension", this.dimension);
+ }
+
+ public void displayGUIChest(IInventory var1) {
+ }
+
+ public void displayWorkbenchGUI() {
+ }
+
+ public void func_443_a_(Entity var1, int var2) {
+ }
+
+ public float func_373_s() {
+ return 0.12F;
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ this.field_9344_ag = 0;
+ if(this.health <= 0) {
+ return false;
+ } else {
+ if(var1 instanceof EntityMobs || var1 instanceof EntityArrow) {
+ if(this.worldObj.difficultySetting == 0) {
+ var2 = 0;
+ }
+
+ if(this.worldObj.difficultySetting == 1) {
+ var2 = var2 / 3 + 1;
+ }
+
+ if(this.worldObj.difficultySetting == 3) {
+ var2 = var2 * 3 / 2;
+ }
+ }
+
+ return var2 == 0 ? false : super.canAttackEntity(var1, var2);
+ }
+ }
+
+ protected void damageEntity(int var1) {
+ int var2 = 25 - this.inventory.getTotalArmorValue();
+ int var3 = var1 * var2 + this.field_781_a;
+ this.inventory.damageArmor(var1);
+ var1 = var3 / 25;
+ this.field_781_a = var3 % 25;
+ super.damageEntity(var1);
+ }
+
+ public void displayGUIFurnace(TileEntityFurnace var1) {
+ }
+
+ public void displayGUIEditSign(TileEntitySign var1) {
+ }
+
+ public void func_6415_a_(Entity var1) {
+ var1.interact(this);
+ }
+
+ public ItemStack getCurrentEquippedItem() {
+ return this.inventory.getCurrentItem();
+ }
+
+ public void destroyCurrentEquippedItem() {
+ this.inventory.setInventorySlotContents(this.inventory.currentItem, (ItemStack)null);
+ }
+
+ public double func_388_v() {
+ return (double)(this.yOffset - 0.5F);
+ }
+
+ public void func_457_w() {
+ this.field_9368_k = -1;
+ this.field_9369_j = true;
+ }
+
+ public void attackTargetEntityWithCurrentItem(Entity var1) {
+ int var2 = this.inventory.getDamageVsEntity(var1);
+ if(var2 > 0) {
+ var1.canAttackEntity(this, var2);
+ ItemStack var3 = this.getCurrentEquippedItem();
+ if(var3 != null && var1 instanceof EntityLiving) {
+ var3.hitEntity((EntityLiving)var1);
+ if(var3.stackSize <= 0) {
+ var3.func_1097_a(this);
+ this.destroyCurrentEquippedItem();
+ }
+ }
+ }
+
+ }
+
+ public void func_9367_r() {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityPlayerSP.java b/src/main/java/net/minecraft/src/EntityPlayerSP.java
new file mode 100644
index 0000000..2f833e0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityPlayerSP.java
@@ -0,0 +1,156 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+
+public class EntityPlayerSP extends EntityPlayer {
+ public MovementInput field_787_a;
+ private Minecraft mc;
+ public int field_9373_b = 20;
+ private boolean field_9374_bx = false;
+ public float field_4134_c;
+ public float field_4133_d;
+
+ public EntityPlayerSP(Minecraft var1, World var2, Session var3, int var4) {
+ super(var2);
+ this.mc = var1;
+ this.dimension = var4;
+ if(var3 != null && var3.inventory != null && var3.inventory.length() > 0) {
+ this.skinUrl = "http://www.minecraft.net/skin/" + var3.inventory + ".png";
+ System.out.println("Loading texture " + this.skinUrl);
+ }
+
+ this.field_771_i = var3.inventory;
+ }
+
+ public void func_418_b_() {
+ super.func_418_b_();
+ this.field_9342_ah = this.field_787_a.field_1174_a;
+ this.field_9340_ai = this.field_787_a.field_1173_b;
+ this.isJumping = this.field_787_a.field_1176_d;
+ }
+
+ public void onLivingUpdate() {
+ this.field_4133_d = this.field_4134_c;
+ if(this.field_9374_bx) {
+ this.field_4134_c += 0.0125F;
+ if(this.field_4134_c >= 1.0F) {
+ this.field_4134_c = 1.0F;
+ this.field_9373_b = 10;
+ this.mc.func_6237_k();
+ }
+
+ this.field_9374_bx = false;
+ } else {
+ if(this.field_4134_c > 0.0F) {
+ this.field_4134_c -= 0.05F;
+ }
+
+ if(this.field_4134_c < 0.0F) {
+ this.field_4134_c = 0.0F;
+ }
+ }
+
+ if(this.field_9373_b > 0) {
+ --this.field_9373_b;
+ }
+
+ this.field_787_a.func_797_a(this);
+ if(this.field_787_a.field_1175_e && this.field_9287_aY < 0.2F) {
+ this.field_9287_aY = 0.2F;
+ }
+
+ super.onLivingUpdate();
+ }
+
+ public void func_458_k() {
+ this.field_787_a.func_798_a();
+ }
+
+ public void func_460_a(int var1, boolean var2) {
+ this.field_787_a.func_796_a(var1, var2);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setInteger("Score", this.score);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.score = var1.getInteger("Score");
+ }
+
+ public void displayGUIChest(IInventory var1) {
+ this.mc.displayGuiScreen(new GuiChest(this.inventory, var1));
+ }
+
+ public void displayGUIEditSign(TileEntitySign var1) {
+ this.mc.displayGuiScreen(new GuiEditSign(var1));
+ }
+
+ public void displayWorkbenchGUI() {
+ this.mc.displayGuiScreen(new GuiCrafting(this.inventory));
+ }
+
+ public void displayGUIFurnace(TileEntityFurnace var1) {
+ this.mc.displayGuiScreen(new GuiFurnace(this.inventory, var1));
+ }
+
+ public void func_443_a_(Entity var1, int var2) {
+ this.mc.field_6321_h.func_1192_a(new EntityPickupFX(this.mc.theWorld, var1, this, -0.5F));
+ }
+
+ public int getPlayerArmorValue() {
+ return this.inventory.getTotalArmorValue();
+ }
+
+ public void func_6415_a_(Entity var1) {
+ if(!var1.interact(this)) {
+ ItemStack var2 = this.getCurrentEquippedItem();
+ if(var2 != null && var1 instanceof EntityLiving) {
+ var2.useItemOnEntity((EntityLiving)var1);
+ if(var2.stackSize <= 0) {
+ var2.func_1097_a(this);
+ this.destroyCurrentEquippedItem();
+ }
+ }
+
+ }
+ }
+
+ public void sendChatMessage(String var1) {
+ }
+
+ public void func_6420_o() {
+ }
+
+ public boolean func_381_o() {
+ return this.field_787_a.field_1175_e;
+ }
+
+ public void func_4039_q() {
+ if(this.field_9373_b > 0) {
+ this.field_9373_b = 10;
+ } else {
+ this.field_9374_bx = true;
+ }
+ }
+
+ public void setHealth(int var1) {
+ int var2 = this.health - var1;
+ if(var2 <= 0) {
+ this.health = var1;
+ } else {
+ this.field_9346_af = var2;
+ this.field_9335_K = this.health;
+ this.field_9306_bj = this.field_9366_o;
+ this.damageEntity(var2);
+ this.hurtTime = this.field_9332_M = 10;
+ }
+
+ }
+
+ public void func_9367_r() {
+ this.mc.respawn();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityPortalFX.java b/src/main/java/net/minecraft/src/EntityPortalFX.java
new file mode 100644
index 0000000..484d5b7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityPortalFX.java
@@ -0,0 +1,60 @@
+package net.minecraft.src;
+
+public class EntityPortalFX extends EntityFX {
+ private float field_4083_a;
+ private double field_4086_p;
+ private double field_4085_q;
+ private double field_4084_r;
+
+ public EntityPortalFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ super(var1, var2, var4, var6, var8, var10, var12);
+ this.motionX = var8;
+ this.motionY = var10;
+ this.motionZ = var12;
+ this.field_4086_p = this.posX = var2;
+ this.field_4085_q = this.posY = var4;
+ this.field_4084_r = this.posZ = var6;
+ float var14 = this.rand.nextFloat() * 0.6F + 0.4F;
+ this.field_4083_a = this.field_665_g = this.rand.nextFloat() * 0.2F + 0.5F;
+ this.field_663_i = this.field_662_j = this.field_661_k = 1.0F * var14;
+ this.field_662_j *= 0.3F;
+ this.field_663_i *= 0.9F;
+ this.field_666_f = (int)(Math.random() * 10.0D) + 40;
+ this.field_9314_ba = true;
+ this.field_670_b = (int)(Math.random() * 8.0D);
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = ((float)this.e + var2) / (float)this.field_666_f;
+ var8 = 1.0F - var8;
+ var8 *= var8;
+ var8 = 1.0F - var8;
+ this.field_665_g = this.field_4083_a * var8;
+ super.func_406_a(var1, var2, var3, var4, var5, var6, var7);
+ }
+
+ public float getEntityBrightness(float var1) {
+ float var2 = super.getEntityBrightness(var1);
+ float var3 = (float)this.e / (float)this.field_666_f;
+ var3 *= var3;
+ var3 *= var3;
+ return var2 * (1.0F - var3) + var3;
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ float var1 = (float)this.e / (float)this.field_666_f;
+ float var2 = var1;
+ var1 = -var1 + var1 * var1 * 2.0F;
+ var1 = 1.0F - var1;
+ this.posX = this.field_4086_p + this.motionX * (double)var1;
+ this.posY = this.field_4085_q + this.motionY * (double)var1 + (double)(1.0F - var2);
+ this.posZ = this.field_4084_r + this.motionZ * (double)var1;
+ if(this.e++ >= this.field_666_f) {
+ this.setEntityDead();
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityRainFX.java b/src/main/java/net/minecraft/src/EntityRainFX.java
new file mode 100644
index 0000000..3bd6ffa
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityRainFX.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+public class EntityRainFX extends EntityFX {
+ public EntityRainFX(World var1, double var2, double var4, double var6) {
+ super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D);
+ this.motionX *= (double)0.3F;
+ this.motionY = (double)((float)Math.random() * 0.2F + 0.1F);
+ this.motionZ *= (double)0.3F;
+ this.field_663_i = 1.0F;
+ this.field_662_j = 1.0F;
+ this.field_661_k = 1.0F;
+ this.field_670_b = 19 + this.rand.nextInt(4);
+ this.setSize(0.01F, 0.01F);
+ this.field_664_h = 0.06F;
+ this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D));
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ super.func_406_a(var1, var2, var3, var4, var5, var6, var7);
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= (double)this.field_664_h;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.98F;
+ this.motionY *= (double)0.98F;
+ this.motionZ *= (double)0.98F;
+ if(this.field_666_f-- <= 0) {
+ this.setEntityDead();
+ }
+
+ if(this.onGround) {
+ if(Math.random() < 0.5D) {
+ this.setEntityDead();
+ }
+
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ }
+
+ Material var1 = this.worldObj.getBlockMaterial(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ));
+ if(var1.getIsLiquid() || var1.func_878_a()) {
+ double var2 = (double)((float)(MathHelper.floor_double(this.posY) + 1) - BlockFluids.func_288_b(this.worldObj.getBlockMetadata(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ))));
+ if(this.posY < var2) {
+ this.setEntityDead();
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityReddustFX.java b/src/main/java/net/minecraft/src/EntityReddustFX.java
new file mode 100644
index 0000000..c1a1ca4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityReddustFX.java
@@ -0,0 +1,63 @@
+package net.minecraft.src;
+
+public class EntityReddustFX extends EntityFX {
+ float field_673_a;
+
+ public EntityReddustFX(World var1, double var2, double var4, double var6) {
+ this(var1, var2, var4, var6, 1.0F);
+ }
+
+ public EntityReddustFX(World var1, double var2, double var4, double var6, float var8) {
+ super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D);
+ this.motionX *= (double)0.1F;
+ this.motionY *= (double)0.1F;
+ this.motionZ *= (double)0.1F;
+ this.field_663_i = (float)(Math.random() * (double)0.3F) + 0.7F;
+ this.field_662_j = this.field_661_k = (float)(Math.random() * (double)0.1F);
+ this.field_665_g *= 12.0F / 16.0F;
+ this.field_665_g *= var8;
+ this.field_673_a = this.field_665_g;
+ this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D));
+ this.field_666_f = (int)((float)this.field_666_f * var8);
+ this.field_9314_ba = false;
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = ((float)this.e + var2) / (float)this.field_666_f * 32.0F;
+ if(var8 < 0.0F) {
+ var8 = 0.0F;
+ }
+
+ if(var8 > 1.0F) {
+ var8 = 1.0F;
+ }
+
+ this.field_665_g = this.field_673_a * var8;
+ super.func_406_a(var1, var2, var3, var4, var5, var6, var7);
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ if(this.e++ >= this.field_666_f) {
+ this.setEntityDead();
+ }
+
+ this.field_670_b = 7 - this.e * 8 / this.field_666_f;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ if(this.posY == this.prevPosY) {
+ this.motionX *= 1.1D;
+ this.motionZ *= 1.1D;
+ }
+
+ this.motionX *= (double)0.96F;
+ this.motionY *= (double)0.96F;
+ this.motionZ *= (double)0.96F;
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityRenderer.java b/src/main/java/net/minecraft/src/EntityRenderer.java
new file mode 100644
index 0000000..54120ba
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityRenderer.java
@@ -0,0 +1,560 @@
+package net.minecraft.src;
+
+import java.nio.FloatBuffer;
+import java.util.List;
+import java.util.Random;
+import net.minecraft.client.Minecraft;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.util.glu.GLU;
+
+public class EntityRenderer {
+ private Minecraft mc;
+ private float field_1387_i = 0.0F;
+ public ItemRenderer field_1395_a;
+ private int field_1386_j;
+ private Entity field_1385_k = null;
+ private long field_1384_l = System.currentTimeMillis();
+ private Random field_1383_m = new Random();
+ volatile int field_1394_b = 0;
+ volatile int field_1393_c = 0;
+ FloatBuffer field_1392_d = GLAllocation.createDirectFloatBuffer(16);
+ float field_4270_e;
+ float field_4269_f;
+ float field_4268_g;
+ private float field_1382_n;
+ private float field_1381_o;
+
+ public EntityRenderer(Minecraft var1) {
+ this.mc = var1;
+ this.field_1395_a = new ItemRenderer(var1);
+ }
+
+ public void func_911_a() {
+ this.field_1382_n = this.field_1381_o;
+ float var1 = this.mc.theWorld.getLightBrightness(MathHelper.floor_double(this.mc.thePlayer.posX), MathHelper.floor_double(this.mc.thePlayer.posY), MathHelper.floor_double(this.mc.thePlayer.posZ));
+ float var2 = (float)(3 - this.mc.gameSettings.renderDistance) / 3.0F;
+ float var3 = var1 * (1.0F - var2) + var2;
+ this.field_1381_o += (var3 - this.field_1381_o) * 0.1F;
+ ++this.field_1386_j;
+ this.field_1395_a.func_895_a();
+ if(this.mc.field_6288_M) {
+ this.func_916_c();
+ }
+
+ }
+
+ public void func_910_a(float var1) {
+ if(this.mc.thePlayer != null) {
+ double var2 = (double)this.mc.field_6327_b.getBlockReachDistance();
+ this.mc.objectMouseOver = this.mc.thePlayer.rayTrace(var2, var1);
+ double var4 = var2;
+ Vec3D var6 = this.mc.thePlayer.getPosition(var1);
+ if(this.mc.objectMouseOver != null) {
+ var4 = this.mc.objectMouseOver.hitVec.distanceTo(var6);
+ }
+
+ if(this.mc.field_6327_b instanceof PlayerControllerTest) {
+ var2 = 32.0D;
+ } else {
+ if(var4 > 3.0D) {
+ var4 = 3.0D;
+ }
+
+ var2 = var4;
+ }
+
+ Vec3D var7 = this.mc.thePlayer.getLook(var1);
+ Vec3D var8 = var6.addVector(var7.xCoord * var2, var7.yCoord * var2, var7.zCoord * var2);
+ this.field_1385_k = null;
+ float var9 = 1.0F;
+ List var10 = this.mc.theWorld.getEntitiesWithinAABBExcludingEntity(this.mc.thePlayer, this.mc.thePlayer.boundingBox.addCoord(var7.xCoord * var2, var7.yCoord * var2, var7.zCoord * var2).expands((double)var9, (double)var9, (double)var9));
+ double var11 = 0.0D;
+
+ for(int var13 = 0; var13 < var10.size(); ++var13) {
+ Entity var14 = (Entity)var10.get(var13);
+ if(var14.canBeCollidedWith()) {
+ float var15 = var14.func_4035_j_();
+ AxisAlignedBB var16 = var14.boundingBox.expands((double)var15, (double)var15, (double)var15);
+ MovingObjectPosition var17 = var16.func_1169_a(var6, var8);
+ if(var16.isVecInside(var6)) {
+ if(0.0D < var11 || var11 == 0.0D) {
+ this.field_1385_k = var14;
+ var11 = 0.0D;
+ }
+ } else if(var17 != null) {
+ double var18 = var6.distanceTo(var17.hitVec);
+ if(var18 < var11 || var11 == 0.0D) {
+ this.field_1385_k = var14;
+ var11 = var18;
+ }
+ }
+ }
+ }
+
+ if(this.field_1385_k != null && !(this.mc.field_6327_b instanceof PlayerControllerTest)) {
+ this.mc.objectMouseOver = new MovingObjectPosition(this.field_1385_k);
+ }
+
+ }
+ }
+
+ private float func_914_d(float var1) {
+ EntityPlayerSP var2 = this.mc.thePlayer;
+ float var3 = 70.0F;
+ if(var2.isInsideOfMaterial(Material.water)) {
+ var3 = 60.0F;
+ }
+
+ if(var2.health <= 0) {
+ float var4 = (float)var2.deathTime + var1;
+ var3 /= (1.0F - 500.0F / (var4 + 500.0F)) * 2.0F + 1.0F;
+ }
+
+ return var3;
+ }
+
+ private void hurtCameraEffect(float var1) {
+ EntityPlayerSP var2 = this.mc.thePlayer;
+ float var3 = (float)var2.hurtTime - var1;
+ float var4;
+ if(var2.health <= 0) {
+ var4 = (float)var2.deathTime + var1;
+ GL11.glRotatef(40.0F - 8000.0F / (var4 + 200.0F), 0.0F, 0.0F, 1.0F);
+ }
+
+ if(var3 >= 0.0F) {
+ var3 /= (float)var2.field_9332_M;
+ var3 = MathHelper.sin(var3 * var3 * var3 * var3 * (float)Math.PI);
+ var4 = var2.field_9331_N;
+ GL11.glRotatef(-var4, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-var3 * 14.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(var4, 0.0F, 1.0F, 0.0F);
+ }
+ }
+
+ private void func_917_f(float var1) {
+ if(!this.mc.gameSettings.thirdPersonView) {
+ EntityPlayerSP var2 = this.mc.thePlayer;
+ float var3 = var2.field_9290_aS - var2.field_9291_aR;
+ float var4 = var2.field_9290_aS + var3 * var1;
+ float var5 = var2.field_775_e + (var2.field_774_f - var2.field_775_e) * var1;
+ float var6 = var2.field_9329_Q + (var2.field_9328_R - var2.field_9329_Q) * var1;
+ GL11.glTranslatef(MathHelper.sin(var4 * (float)Math.PI) * var5 * 0.5F, -Math.abs(MathHelper.cos(var4 * (float)Math.PI) * var5), 0.0F);
+ GL11.glRotatef(MathHelper.sin(var4 * (float)Math.PI) * var5 * 3.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(Math.abs(MathHelper.cos(var4 * (float)Math.PI + 0.2F) * var5) * 5.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(var6, 1.0F, 0.0F, 0.0F);
+ }
+ }
+
+ private void orientCamera(float var1) {
+ EntityPlayerSP var2 = this.mc.thePlayer;
+ double var3 = var2.prevPosX + (var2.posX - var2.prevPosX) * (double)var1;
+ double var5 = var2.prevPosY + (var2.posY - var2.prevPosY) * (double)var1;
+ double var7 = var2.prevPosZ + (var2.posZ - var2.prevPosZ) * (double)var1;
+ if(this.mc.gameSettings.thirdPersonView) {
+ double var9 = 4.0D;
+ float var11 = var2.rotationYaw;
+ float var12 = var2.rotationPitch;
+ if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(2)) {
+ var12 += 180.0F;
+ var9 += 2.0D;
+ }
+
+ double var13 = (double)(-MathHelper.sin(var11 / 180.0F * (float)Math.PI) * MathHelper.cos(var12 / 180.0F * (float)Math.PI)) * var9;
+ double var15 = (double)(MathHelper.cos(var11 / 180.0F * (float)Math.PI) * MathHelper.cos(var12 / 180.0F * (float)Math.PI)) * var9;
+ double var17 = (double)(-MathHelper.sin(var12 / 180.0F * (float)Math.PI)) * var9;
+
+ for(int var19 = 0; var19 < 8; ++var19) {
+ float var20 = (float)((var19 & 1) * 2 - 1);
+ float var21 = (float)((var19 >> 1 & 1) * 2 - 1);
+ float var22 = (float)((var19 >> 2 & 1) * 2 - 1);
+ var20 *= 0.1F;
+ var21 *= 0.1F;
+ var22 *= 0.1F;
+ MovingObjectPosition var23 = this.mc.theWorld.rayTraceBlocks(Vec3D.createVector(var3 + (double)var20, var5 + (double)var21, var7 + (double)var22), Vec3D.createVector(var3 - var13 + (double)var20 + (double)var22, var5 - var17 + (double)var21, var7 - var15 + (double)var22));
+ if(var23 != null) {
+ double var24 = var23.hitVec.distanceTo(Vec3D.createVector(var3, var5, var7));
+ if(var24 < var9) {
+ var9 = var24;
+ }
+ }
+ }
+
+ if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(2)) {
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ }
+
+ GL11.glRotatef(var2.rotationPitch - var12, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(var2.rotationYaw - var11, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(0.0F, 0.0F, (float)(-var9));
+ GL11.glRotatef(var11 - var2.rotationYaw, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(var12 - var2.rotationPitch, 1.0F, 0.0F, 0.0F);
+ } else {
+ GL11.glTranslatef(0.0F, 0.0F, -0.1F);
+ }
+
+ GL11.glRotatef(var2.prevRotationPitch + (var2.rotationPitch - var2.prevRotationPitch) * var1, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(var2.prevRotationYaw + (var2.rotationYaw - var2.prevRotationYaw) * var1 + 180.0F, 0.0F, 1.0F, 0.0F);
+ }
+
+ private void setupCameraTransform(float var1, int var2) {
+ this.field_1387_i = (float)(256 >> this.mc.gameSettings.renderDistance);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glLoadIdentity();
+ float var3 = 0.07F;
+ if(this.mc.gameSettings.anaglyph) {
+ GL11.glTranslatef((float)(-(var2 * 2 - 1)) * var3, 0.0F, 0.0F);
+ }
+
+ GLU.gluPerspective(this.func_914_d(var1), (float)this.mc.displayWidth / (float)this.mc.displayHeight, 0.05F, this.field_1387_i);
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glLoadIdentity();
+ if(this.mc.gameSettings.anaglyph) {
+ GL11.glTranslatef((float)(var2 * 2 - 1) * 0.1F, 0.0F, 0.0F);
+ }
+
+ this.hurtCameraEffect(var1);
+ if(this.mc.gameSettings.viewBobbing) {
+ this.func_917_f(var1);
+ }
+
+ float var4 = this.mc.thePlayer.field_4133_d + (this.mc.thePlayer.field_4134_c - this.mc.thePlayer.field_4133_d) * var1;
+ if(var4 > 0.0F) {
+ float var5 = 5.0F / (var4 * var4 + 5.0F) - var4 * 0.04F;
+ var5 *= var5;
+ GL11.glRotatef(var4 * var4 * 1500.0F, 0.0F, 1.0F, 1.0F);
+ GL11.glScalef(1.0F / var5, 1.0F, 1.0F);
+ GL11.glRotatef(-var4 * var4 * 1500.0F, 0.0F, 1.0F, 1.0F);
+ }
+
+ this.orientCamera(var1);
+ }
+
+ private void func_4135_b(float var1, int var2) {
+ GL11.glLoadIdentity();
+ if(this.mc.gameSettings.anaglyph) {
+ GL11.glTranslatef((float)(var2 * 2 - 1) * 0.1F, 0.0F, 0.0F);
+ }
+
+ GL11.glPushMatrix();
+ this.hurtCameraEffect(var1);
+ if(this.mc.gameSettings.viewBobbing) {
+ this.func_917_f(var1);
+ }
+
+ if(!this.mc.gameSettings.thirdPersonView && !(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(2))) {
+ this.field_1395_a.renderItemInFirstPerson(var1);
+ }
+
+ GL11.glPopMatrix();
+ if(!this.mc.gameSettings.thirdPersonView) {
+ this.field_1395_a.renderOverlays(var1);
+ this.hurtCameraEffect(var1);
+ }
+
+ if(this.mc.gameSettings.viewBobbing) {
+ this.func_917_f(var1);
+ }
+
+ }
+
+ public void func_4136_b(float var1) {
+ if(!GL11.isFocused()) {
+ if(System.currentTimeMillis() - this.field_1384_l > 500L) {
+ this.mc.func_6252_g();
+ }
+ } else {
+ this.field_1384_l = System.currentTimeMillis();
+ }
+
+ if(this.mc.field_6289_L) {
+ this.mc.mouseHelper.func_772_c();
+ float var2 = this.mc.gameSettings.mouseSensitivity * 0.6F + 0.2F;
+ float var3 = var2 * var2 * var2 * 8.0F;
+ float var4 = (float)this.mc.mouseHelper.field_1114_a * var3;
+ float var5 = (float)this.mc.mouseHelper.field_1113_b * var3;
+ byte var6 = 1;
+ if(this.mc.gameSettings.invertMouse) {
+ var6 = -1;
+ }
+
+ this.mc.thePlayer.func_346_d(var4, var5 * (float)var6);
+ }
+
+ if(!this.mc.field_6307_v) {
+ ScaledResolution var7 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight);
+ int var8 = var7.getScaledWidth();
+ int var9 = var7.getScaledHeight();
+ int var10 = Mouse.getX() * var8 / this.mc.displayWidth;
+ int var11 = var9 - Mouse.getY() * var9 / this.mc.displayHeight - 1;
+ if(this.mc.theWorld != null) {
+ this.func_4134_c(var1);
+ if(!(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(2))) {
+ this.mc.ingameGUI.renderGameOverlay(var1, this.mc.currentScreen != null, var10, var11);
+ }
+ } else {
+ GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight);
+ GL11.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glLoadIdentity();
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glLoadIdentity();
+ this.func_905_b();
+ }
+
+ if(this.mc.currentScreen != null) {
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ this.mc.currentScreen.drawScreen(var10, var11, var1);
+ }
+
+ }
+ }
+
+ public void func_4134_c(float var1) {
+ this.func_910_a(var1);
+ EntityPlayerSP var2 = this.mc.thePlayer;
+ RenderGlobal var3 = this.mc.field_6323_f;
+ EffectRenderer var4 = this.mc.field_6321_h;
+ double var5 = var2.lastTickPosX + (var2.posX - var2.lastTickPosX) * (double)var1;
+ double var7 = var2.lastTickPosY + (var2.posY - var2.lastTickPosY) * (double)var1;
+ double var9 = var2.lastTickPosZ + (var2.posZ - var2.lastTickPosZ) * (double)var1;
+
+ for(int var11 = 0; var11 < 2; ++var11) {
+ if(this.mc.gameSettings.anaglyph) {
+ if(var11 == 0) {
+ GL11.glColorMask(false, true, true, false);
+ } else {
+ GL11.glColorMask(true, false, false, false);
+ }
+ }
+
+ GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight);
+ this.updateFogColor(var1);
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ this.setupCameraTransform(var1, var11);
+ ClippingHelperImplementation.func_1155_a();
+ if(this.mc.gameSettings.renderDistance < 2) {
+ this.func_4140_a(-1);
+ var3.func_4142_a(var1);
+ }
+
+ GL11.glEnable(GL11.GL_FOG);
+ this.func_4140_a(1);
+ Frustrum var12 = new Frustrum();
+ var12.func_343_a(var5, var7, var9);
+ this.mc.field_6323_f.func_960_a(var12, var1);
+ this.mc.field_6323_f.func_948_a(var2, false);
+ this.func_4140_a(0);
+ GL11.glEnable(GL11.GL_FOG);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png"));
+ RenderHelper.disableStandardItemLighting();
+ var3.func_943_a(var2, 0, (double)var1);
+ RenderHelper.enableStandardItemLighting();
+ var3.func_951_a(var2.getPosition(var1), var12, var1);
+ var4.func_1187_b(var2, var1);
+ RenderHelper.disableStandardItemLighting();
+ this.func_4140_a(0);
+ var4.func_1189_a(var2, var1);
+ if(this.mc.objectMouseOver != null && var2.isInsideOfMaterial(Material.water)) {
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ var3.func_959_a(var2, this.mc.objectMouseOver, 0, var2.inventory.getCurrentItem(), var1);
+ var3.drawSelectionBox(var2, this.mc.objectMouseOver, 0, var2.inventory.getCurrentItem(), var1);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ }
+
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ this.func_4140_a(0);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png"));
+ if(this.mc.gameSettings.fancyGraphics) {
+ GL11.glColorMask(false, false, false, false);
+ int var13 = var3.func_943_a(var2, 1, (double)var1);
+ GL11.glColorMask(true, true, true, true);
+ if(this.mc.gameSettings.anaglyph) {
+ if(var11 == 0) {
+ GL11.glColorMask(false, true, true, false);
+ } else {
+ GL11.glColorMask(true, false, false, false);
+ }
+ }
+
+ if(var13 > 0) {
+ var3.func_944_a(1, (double)var1);
+ }
+ } else {
+ var3.func_943_a(var2, 1, (double)var1);
+ }
+
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glDisable(GL11.GL_BLEND);
+ if(this.mc.objectMouseOver != null && !var2.isInsideOfMaterial(Material.water)) {
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ var3.func_959_a(var2, this.mc.objectMouseOver, 0, var2.inventory.getCurrentItem(), var1);
+ var3.drawSelectionBox(var2, this.mc.objectMouseOver, 0, var2.inventory.getCurrentItem(), var1);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ }
+
+ GL11.glDisable(GL11.GL_FOG);
+ if(this.field_1385_k != null) {
+ }
+
+ this.func_4140_a(0);
+ GL11.glEnable(GL11.GL_FOG);
+ var3.func_4141_b(var1);
+ GL11.glDisable(GL11.GL_FOG);
+ this.func_4140_a(1);
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ this.func_4135_b(var1, var11);
+ if(!this.mc.gameSettings.anaglyph) {
+ return;
+ }
+ }
+
+ GL11.glColorMask(true, true, true, false);
+ }
+
+ private void func_916_c() {
+ if(this.mc.gameSettings.fancyGraphics) {
+ EntityPlayerSP var1 = this.mc.thePlayer;
+ World var2 = this.mc.theWorld;
+ int var3 = MathHelper.floor_double(var1.posX);
+ int var4 = MathHelper.floor_double(var1.posY);
+ int var5 = MathHelper.floor_double(var1.posZ);
+ byte var6 = 16;
+
+ for(int var7 = 0; var7 < 150; ++var7) {
+ int var8 = var3 + this.field_1383_m.nextInt(var6) - this.field_1383_m.nextInt(var6);
+ int var9 = var5 + this.field_1383_m.nextInt(var6) - this.field_1383_m.nextInt(var6);
+ int var10 = var2.func_696_e(var8, var9);
+ int var11 = var2.getBlockId(var8, var10 - 1, var9);
+ if(var10 <= var4 + var6 && var10 >= var4 - var6) {
+ float var12 = this.field_1383_m.nextFloat();
+ float var13 = this.field_1383_m.nextFloat();
+ if(var11 > 0) {
+ this.mc.field_6321_h.func_1192_a(new EntityRainFX(var2, (double)((float)var8 + var12), (double)((float)var10 + 0.1F) - Block.blocksList[var11].minY, (double)((float)var9 + var13)));
+ }
+ }
+ }
+
+ }
+ }
+
+ public void func_905_b() {
+ ScaledResolution var1 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight);
+ int var2 = var1.getScaledWidth();
+ int var3 = var1.getScaledHeight();
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glLoadIdentity();
+ GL11.glOrtho(0.0D, (double)var2, (double)var3, 0.0D, 1000.0D, 3000.0D);
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glLoadIdentity();
+ GL11.glTranslatef(0.0F, 0.0F, -2000.0F);
+ }
+
+ private void updateFogColor(float var1) {
+ World var2 = this.mc.theWorld;
+ EntityPlayerSP var3 = this.mc.thePlayer;
+ float var4 = 1.0F / (float)(4 - this.mc.gameSettings.renderDistance);
+ var4 = 1.0F - (float)Math.pow((double)var4, 0.25D);
+ Vec3D var5 = var2.func_4079_a(this.mc.thePlayer, var1);
+ float var6 = (float)var5.xCoord;
+ float var7 = (float)var5.yCoord;
+ float var8 = (float)var5.zCoord;
+ Vec3D var9 = var2.func_4082_d(var1);
+ this.field_4270_e = (float)var9.xCoord;
+ this.field_4269_f = (float)var9.yCoord;
+ this.field_4268_g = (float)var9.zCoord;
+ this.field_4270_e += (var6 - this.field_4270_e) * var4;
+ this.field_4269_f += (var7 - this.field_4269_f) * var4;
+ this.field_4268_g += (var8 - this.field_4268_g) * var4;
+ if(var3.isInsideOfMaterial(Material.water)) {
+ this.field_4270_e = 0.02F;
+ this.field_4269_f = 0.02F;
+ this.field_4268_g = 0.2F;
+ } else if(var3.isInsideOfMaterial(Material.lava)) {
+ this.field_4270_e = 0.6F;
+ this.field_4269_f = 0.1F;
+ this.field_4268_g = 0.0F;
+ }
+
+ float var10 = this.field_1382_n + (this.field_1381_o - this.field_1382_n) * var1;
+ this.field_4270_e *= var10;
+ this.field_4269_f *= var10;
+ this.field_4268_g *= var10;
+ if(this.mc.gameSettings.anaglyph) {
+ float var11 = (this.field_4270_e * 30.0F + this.field_4269_f * 59.0F + this.field_4268_g * 11.0F) / 100.0F;
+ float var12 = (this.field_4270_e * 30.0F + this.field_4269_f * 70.0F) / 100.0F;
+ float var13 = (this.field_4270_e * 30.0F + this.field_4268_g * 70.0F) / 100.0F;
+ this.field_4270_e = var11;
+ this.field_4269_f = var12;
+ this.field_4268_g = var13;
+ }
+
+ GL11.glClearColor(this.field_4270_e, this.field_4269_f, this.field_4268_g, 0.0F);
+ }
+
+ private void func_4140_a(int var1) {
+ EntityPlayerSP var2 = this.mc.thePlayer;
+ GL11.glFog(GL11.GL_FOG_COLOR, this.func_908_a(this.field_4270_e, this.field_4269_f, this.field_4268_g, 1.0F));
+ GL11.glNormal3f(0.0F, -1.0F, 0.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ float var3;
+ float var4;
+ float var5;
+ float var6;
+ float var7;
+ float var8;
+ if(var2.isInsideOfMaterial(Material.water)) {
+ GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
+ GL11.glFogf(GL11.GL_FOG_DENSITY, 0.1F);
+ var3 = 0.4F;
+ var4 = 0.4F;
+ var5 = 0.9F;
+ if(this.mc.gameSettings.anaglyph) {
+ var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F;
+ var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F;
+ var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F;
+ }
+ } else if(var2.isInsideOfMaterial(Material.lava)) {
+ GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_EXP);
+ GL11.glFogf(GL11.GL_FOG_DENSITY, 2.0F);
+ var3 = 0.4F;
+ var4 = 0.3F;
+ var5 = 0.3F;
+ if(this.mc.gameSettings.anaglyph) {
+ var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F;
+ var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F;
+ var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F;
+ }
+ } else {
+ GL11.glFogi(GL11.GL_FOG_MODE, GL11.GL_LINEAR);
+ GL11.glFogf(GL11.GL_FOG_START, this.field_1387_i * 0.25F);
+ GL11.glFogf(GL11.GL_FOG_END, this.field_1387_i);
+ if(var1 < 0) {
+ GL11.glFogf(GL11.GL_FOG_START, 0.0F);
+ GL11.glFogf(GL11.GL_FOG_END, this.field_1387_i * 0.8F);
+ }
+
+ if(this.mc.theWorld.worldProvider.field_4220_c) {
+ GL11.glFogf(GL11.GL_FOG_START, 0.0F);
+ }
+ }
+
+ GL11.glEnable(GL11.GL_COLOR_MATERIAL);
+ GL11.glColorMaterial(GL11.GL_FRONT, GL11.GL_AMBIENT);
+ }
+
+ private FloatBuffer func_908_a(float var1, float var2, float var3, float var4) {
+ this.field_1392_d.clear();
+ this.field_1392_d.put(var1).put(var2).put(var3).put(var4);
+ this.field_1392_d.flip();
+ return this.field_1392_d;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySheep.java b/src/main/java/net/minecraft/src/EntitySheep.java
new file mode 100644
index 0000000..fe680e2
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySheep.java
@@ -0,0 +1,49 @@
+package net.minecraft.src;
+
+public class EntitySheep extends EntityAnimals {
+ public boolean sheared = false;
+
+ public EntitySheep(World var1) {
+ super(var1);
+ this.texture = "/mob/sheep.png";
+ this.setSize(0.9F, 1.3F);
+ }
+
+ public boolean canAttackEntity(Entity var1, int var2) {
+ if(!this.sheared && var1 instanceof EntityLiving) {
+ this.sheared = true;
+ int var3 = 1 + this.rand.nextInt(3);
+
+ for(int var4 = 0; var4 < var3; ++var4) {
+ EntityItem var5 = this.dropItemWithOffset(Block.cloth.blockID, 1, 1.0F);
+ var5.motionY += (double)(this.rand.nextFloat() * 0.05F);
+ var5.motionX += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F);
+ var5.motionZ += (double)((this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F);
+ }
+ }
+
+ return super.canAttackEntity(var1, var2);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setBoolean("Sheared", this.sheared);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.sheared = var1.getBoolean("Sheared");
+ }
+
+ protected String getLivingSound() {
+ return "mob.sheep";
+ }
+
+ protected String getHurtSound() {
+ return "mob.sheep";
+ }
+
+ protected String getDeathSound() {
+ return "mob.sheep";
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySkeleton.java b/src/main/java/net/minecraft/src/EntitySkeleton.java
new file mode 100644
index 0000000..59b837c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySkeleton.java
@@ -0,0 +1,70 @@
+package net.minecraft.src;
+
+public class EntitySkeleton extends EntityMobs {
+ private static final ItemStack defaultHeldItem = new ItemStack(Item.bow, 1);
+
+ public EntitySkeleton(World var1) {
+ super(var1);
+ this.texture = "/mob/skeleton.png";
+ }
+
+ protected String getLivingSound() {
+ return "mob.skeleton";
+ }
+
+ protected String getHurtSound() {
+ return "mob.skeletonhurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.skeletonhurt";
+ }
+
+ public void onLivingUpdate() {
+ if(this.worldObj.isDaytime()) {
+ float var1 = this.getEntityBrightness(1.0F);
+ if(var1 > 0.5F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) {
+ this.fire = 300;
+ }
+ }
+
+ super.onLivingUpdate();
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ if(var2 < 10.0F) {
+ double var3 = var1.posX - this.posX;
+ double var5 = var1.posZ - this.posZ;
+ if(this.attackTime == 0) {
+ EntityArrow var7 = new EntityArrow(this.worldObj, this);
+ var7.posY += (double)1.4F;
+ double var8 = var1.posY - (double)0.2F - var7.posY;
+ float var10 = MathHelper.sqrt_double(var3 * var3 + var5 * var5) * 0.2F;
+ this.worldObj.playSoundAtEntity(this, "random.bow", 1.0F, 1.0F / (this.rand.nextFloat() * 0.4F + 0.8F));
+ this.worldObj.entityJoinedWorld(var7);
+ var7.func_408_a(var3, var8 + (double)var10, var5, 0.6F, 12.0F);
+ this.attackTime = 30;
+ }
+
+ this.rotationYaw = (float)(Math.atan2(var5, var3) * 180.0D / (double)((float)Math.PI)) - 90.0F;
+ this.hasAttacked = true;
+ }
+
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected int getDropItemId() {
+ return Item.arrow.shiftedIndex;
+ }
+
+ public ItemStack getHeldItem() {
+ return defaultHeldItem;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySlime.java b/src/main/java/net/minecraft/src/EntitySlime.java
new file mode 100644
index 0000000..0bbea93
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySlime.java
@@ -0,0 +1,129 @@
+package net.minecraft.src;
+
+public class EntitySlime extends EntityLiving implements IMobs {
+ public float field_768_a;
+ public float field_767_b;
+ private int field_769_d = 0;
+ public int field_770_c = 1;
+
+ public EntitySlime(World var1) {
+ super(var1);
+ this.texture = "/mob/slime.png";
+ this.field_770_c = 1 << this.rand.nextInt(3);
+ this.yOffset = 0.0F;
+ this.field_769_d = this.rand.nextInt(20) + 10;
+ this.func_441_c(this.field_770_c);
+ }
+
+ public void func_441_c(int var1) {
+ this.field_770_c = var1;
+ this.setSize(0.6F * (float)var1, 0.6F * (float)var1);
+ this.health = var1 * var1;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ var1.setInteger("Size", this.field_770_c - 1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ this.field_770_c = var1.getInteger("Size") + 1;
+ }
+
+ public void onUpdate() {
+ this.field_767_b = this.field_768_a;
+ boolean var1 = this.onGround;
+ super.onUpdate();
+ if(this.onGround && !var1) {
+ for(int var2 = 0; var2 < this.field_770_c * 8; ++var2) {
+ float var3 = this.rand.nextFloat() * (float)Math.PI * 2.0F;
+ float var4 = this.rand.nextFloat() * 0.5F + 0.5F;
+ float var5 = MathHelper.sin(var3) * (float)this.field_770_c * 0.5F * var4;
+ float var6 = MathHelper.cos(var3) * (float)this.field_770_c * 0.5F * var4;
+ this.worldObj.spawnParticle("slime", this.posX + (double)var5, this.boundingBox.minY, this.posZ + (double)var6, 0.0D, 0.0D, 0.0D);
+ }
+
+ if(this.field_770_c > 2) {
+ this.worldObj.playSoundAtEntity(this, "mob.slime", this.getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) / 0.8F);
+ }
+
+ this.field_768_a = -0.5F;
+ }
+
+ this.field_768_a *= 0.6F;
+ }
+
+ protected void func_418_b_() {
+ EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, 16.0D);
+ if(var1 != null) {
+ this.faceEntity(var1, 10.0F);
+ }
+
+ if(this.onGround && this.field_769_d-- <= 0) {
+ this.field_769_d = this.rand.nextInt(20) + 10;
+ if(var1 != null) {
+ this.field_769_d /= 3;
+ }
+
+ this.isJumping = true;
+ if(this.field_770_c > 1) {
+ this.worldObj.playSoundAtEntity(this, "mob.slime", this.getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 0.8F);
+ }
+
+ this.field_768_a = 1.0F;
+ this.field_9342_ah = 1.0F - this.rand.nextFloat() * 2.0F;
+ this.field_9340_ai = (float)(1 * this.field_770_c);
+ } else {
+ this.isJumping = false;
+ if(this.onGround) {
+ this.field_9342_ah = this.field_9340_ai = 0.0F;
+ }
+ }
+
+ }
+
+ public void setEntityDead() {
+ if(this.field_770_c > 1 && this.health == 0) {
+ for(int var1 = 0; var1 < 4; ++var1) {
+ float var2 = ((float)(var1 % 2) - 0.5F) * (float)this.field_770_c / 4.0F;
+ float var3 = ((float)(var1 / 2) - 0.5F) * (float)this.field_770_c / 4.0F;
+ EntitySlime var4 = new EntitySlime(this.worldObj);
+ var4.func_441_c(this.field_770_c / 2);
+ var4.setLocationAndAngles(this.posX + (double)var2, this.posY + 0.5D, this.posZ + (double)var3, this.rand.nextFloat() * 360.0F, 0.0F);
+ this.worldObj.entityJoinedWorld(var4);
+ }
+ }
+
+ super.setEntityDead();
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ if(this.field_770_c > 1 && this.canEntityBeSeen(var1) && (double)this.getDistanceToEntity(var1) < 0.6D * (double)this.field_770_c && var1.canAttackEntity(this, this.field_770_c)) {
+ this.worldObj.playSoundAtEntity(this, "mob.slimeattack", 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
+ }
+
+ }
+
+ protected String getHurtSound() {
+ return "mob.slime";
+ }
+
+ protected String getDeathSound() {
+ return "mob.slime";
+ }
+
+ protected int getDropItemId() {
+ return this.field_770_c == 1 ? Item.slimeBall.shiftedIndex : 0;
+ }
+
+ public boolean getCanSpawnHere() {
+ Chunk var1 = this.worldObj.getChunkFromBlockCoords(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posZ));
+ return (this.field_770_c == 1 || this.worldObj.difficultySetting > 0) && this.rand.nextInt(10) == 0 && var1.func_997_a(987234911L).nextInt(10) == 0 && this.posY < 16.0D;
+ }
+
+ protected float getSoundVolume() {
+ return 0.6F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySlimeFX.java b/src/main/java/net/minecraft/src/EntitySlimeFX.java
new file mode 100644
index 0000000..9b5ae4a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySlimeFX.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+public class EntitySlimeFX extends EntityFX {
+ public EntitySlimeFX(World var1, double var2, double var4, double var6, Item var8) {
+ super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D);
+ this.field_670_b = var8.getIconIndex((ItemStack)null);
+ this.field_663_i = this.field_662_j = this.field_661_k = 1.0F;
+ this.field_664_h = Block.blockSnow.field_357_bm;
+ this.field_665_g /= 2.0F;
+ }
+
+ public int func_404_c() {
+ return 2;
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = ((float)(this.field_670_b % 16) + this.field_669_c / 4.0F) / 16.0F;
+ float var9 = var8 + 0.999F / 64.0F;
+ float var10 = ((float)(this.field_670_b / 16) + this.field_668_d / 4.0F) / 16.0F;
+ float var11 = var10 + 0.999F / 64.0F;
+ float var12 = 0.1F * this.field_665_g;
+ float var13 = (float)(this.prevPosX + (this.posX - this.prevPosX) * (double)var2 - field_660_l);
+ float var14 = (float)(this.prevPosY + (this.posY - this.prevPosY) * (double)var2 - field_659_m);
+ float var15 = (float)(this.prevPosZ + (this.posZ - this.prevPosZ) * (double)var2 - field_658_n);
+ float var16 = this.getEntityBrightness(var2);
+ var1.setColorOpaque_F(var16 * this.field_663_i, var16 * this.field_662_j, var16 * this.field_661_k);
+ var1.addVertexWithUV((double)(var13 - var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 - var5 * var12 - var7 * var12), (double)var8, (double)var11);
+ var1.addVertexWithUV((double)(var13 - var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 - var5 * var12 + var7 * var12), (double)var8, (double)var10);
+ var1.addVertexWithUV((double)(var13 + var3 * var12 + var6 * var12), (double)(var14 + var4 * var12), (double)(var15 + var5 * var12 + var7 * var12), (double)var9, (double)var10);
+ var1.addVertexWithUV((double)(var13 + var3 * var12 - var6 * var12), (double)(var14 - var4 * var12), (double)(var15 + var5 * var12 - var7 * var12), (double)var9, (double)var11);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySmokeFX.java b/src/main/java/net/minecraft/src/EntitySmokeFX.java
new file mode 100644
index 0000000..556eddf
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySmokeFX.java
@@ -0,0 +1,63 @@
+package net.minecraft.src;
+
+public class EntitySmokeFX extends EntityFX {
+ float field_671_a;
+
+ public EntitySmokeFX(World var1, double var2, double var4, double var6) {
+ this(var1, var2, var4, var6, 1.0F);
+ }
+
+ public EntitySmokeFX(World var1, double var2, double var4, double var6, float var8) {
+ super(var1, var2, var4, var6, 0.0D, 0.0D, 0.0D);
+ this.motionX *= (double)0.1F;
+ this.motionY *= (double)0.1F;
+ this.motionZ *= (double)0.1F;
+ this.field_663_i = this.field_662_j = this.field_661_k = (float)(Math.random() * (double)0.3F);
+ this.field_665_g *= 12.0F / 16.0F;
+ this.field_665_g *= var8;
+ this.field_671_a = this.field_665_g;
+ this.field_666_f = (int)(8.0D / (Math.random() * 0.8D + 0.2D));
+ this.field_666_f = (int)((float)this.field_666_f * var8);
+ this.field_9314_ba = false;
+ }
+
+ public void func_406_a(Tessellator var1, float var2, float var3, float var4, float var5, float var6, float var7) {
+ float var8 = ((float)this.e + var2) / (float)this.field_666_f * 32.0F;
+ if(var8 < 0.0F) {
+ var8 = 0.0F;
+ }
+
+ if(var8 > 1.0F) {
+ var8 = 1.0F;
+ }
+
+ this.field_665_g = this.field_671_a * var8;
+ super.func_406_a(var1, var2, var3, var4, var5, var6, var7);
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ if(this.e++ >= this.field_666_f) {
+ this.setEntityDead();
+ }
+
+ this.field_670_b = 7 - this.e * 8 / this.field_666_f;
+ this.motionY += 0.004D;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ if(this.posY == this.prevPosY) {
+ this.motionX *= 1.1D;
+ this.motionZ *= 1.1D;
+ }
+
+ this.motionX *= (double)0.96F;
+ this.motionY *= (double)0.96F;
+ this.motionZ *= (double)0.96F;
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySnowball.java b/src/main/java/net/minecraft/src/EntitySnowball.java
new file mode 100644
index 0000000..b24c7a7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySnowball.java
@@ -0,0 +1,231 @@
+package net.minecraft.src;
+
+import java.util.List;
+
+public class EntitySnowball extends Entity {
+ private int field_816_b = -1;
+ private int field_815_c = -1;
+ private int field_814_d = -1;
+ private int field_813_e = 0;
+ private boolean field_812_f = false;
+ public int field_817_a = 0;
+ private EntityLiving field_811_g;
+ private int field_810_h;
+ private int field_809_i = 0;
+
+ public EntitySnowball(World var1) {
+ super(var1);
+ this.setSize(0.25F, 0.25F);
+ }
+
+ public boolean func_384_a(double var1) {
+ double var3 = this.boundingBox.getAverageEdgeLength() * 4.0D;
+ var3 *= 64.0D;
+ return var1 < var3 * var3;
+ }
+
+ public EntitySnowball(World var1, EntityLiving var2) {
+ super(var1);
+ this.field_811_g = var2;
+ this.setSize(0.25F, 0.25F);
+ this.setLocationAndAngles(var2.posX, var2.posY + (double)var2.func_373_s(), var2.posZ, var2.rotationYaw, var2.rotationPitch);
+ this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.posY -= (double)0.1F;
+ this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
+ this.setPosition(this.posX, this.posY, this.posZ);
+ this.yOffset = 0.0F;
+ float var3 = 0.4F;
+ this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.motionY = (double)(-MathHelper.sin(this.rotationPitch / 180.0F * (float)Math.PI) * var3);
+ this.func_467_a(this.motionX, this.motionY, this.motionZ, 1.5F, 1.0F);
+ }
+
+ public EntitySnowball(World var1, double var2, double var4, double var6) {
+ super(var1);
+ this.field_810_h = 0;
+ this.setSize(0.25F, 0.25F);
+ this.setPosition(var2, var4, var6);
+ this.yOffset = 0.0F;
+ }
+
+ public void func_467_a(double var1, double var3, double var5, float var7, float var8) {
+ float var9 = MathHelper.sqrt_double(var1 * var1 + var3 * var3 + var5 * var5);
+ var1 /= (double)var9;
+ var3 /= (double)var9;
+ var5 /= (double)var9;
+ var1 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var3 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var5 += this.rand.nextGaussian() * (double)0.0075F * (double)var8;
+ var1 *= (double)var7;
+ var3 *= (double)var7;
+ var5 *= (double)var7;
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ float var10 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var10) * 180.0D / (double)((float)Math.PI));
+ this.field_810_h = 0;
+ }
+
+ public void setVelocity(double var1, double var3, double var5) {
+ this.motionX = var1;
+ this.motionY = var3;
+ this.motionZ = var5;
+ if(this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F) {
+ float var7 = MathHelper.sqrt_double(var1 * var1 + var5 * var5);
+ this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(var1, var5) * 180.0D / (double)((float)Math.PI));
+ this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(var3, (double)var7) * 180.0D / (double)((float)Math.PI));
+ }
+
+ }
+
+ public void onUpdate() {
+ this.lastTickPosX = this.posX;
+ this.lastTickPosY = this.posY;
+ this.lastTickPosZ = this.posZ;
+ super.onUpdate();
+ if(this.field_817_a > 0) {
+ --this.field_817_a;
+ }
+
+ if(this.field_812_f) {
+ int var1 = this.worldObj.getBlockId(this.field_816_b, this.field_815_c, this.field_814_d);
+ if(var1 == this.field_813_e) {
+ ++this.field_810_h;
+ if(this.field_810_h == 1200) {
+ this.setEntityDead();
+ }
+
+ return;
+ }
+
+ this.field_812_f = false;
+ this.motionX *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionY *= (double)(this.rand.nextFloat() * 0.2F);
+ this.motionZ *= (double)(this.rand.nextFloat() * 0.2F);
+ this.field_810_h = 0;
+ this.field_809_i = 0;
+ } else {
+ ++this.field_809_i;
+ }
+
+ Vec3D var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ Vec3D var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ MovingObjectPosition var3 = this.worldObj.rayTraceBlocks(var15, var2);
+ var15 = Vec3D.createVector(this.posX, this.posY, this.posZ);
+ var2 = Vec3D.createVector(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
+ if(var3 != null) {
+ var2 = Vec3D.createVector(var3.hitVec.xCoord, var3.hitVec.yCoord, var3.hitVec.zCoord);
+ }
+
+ //if(!this.worldObj.multiplayerWorld) {
+ Entity var4 = null;
+ List var5 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expands(1.0D, 1.0D, 1.0D));
+ double var6 = 0.0D;
+
+ for(int var8 = 0; var8 < var5.size(); ++var8) {
+ Entity var9 = (Entity)var5.get(var8);
+ if(var9.canBeCollidedWith() && (var9 != this.field_811_g || this.field_809_i >= 5)) {
+ float var10 = 0.3F;
+ AxisAlignedBB var11 = var9.boundingBox.expands((double)var10, (double)var10, (double)var10);
+ MovingObjectPosition var12 = var11.func_1169_a(var15, var2);
+ if(var12 != null) {
+ double var13 = var15.distanceTo(var12.hitVec);
+ if(var13 < var6 || var6 == 0.0D) {
+ var4 = var9;
+ var6 = var13;
+ }
+ }
+ }
+ }
+
+ if(var4 != null) {
+ var3 = new MovingObjectPosition(var4);
+ }
+ //}
+
+ if(var3 != null) {
+ if(var3.entityHit != null && var3.entityHit.canAttackEntity(this.field_811_g, 0)) {
+ }
+
+ for(int var16 = 0; var16 < 8; ++var16) {
+ this.worldObj.spawnParticle("snowballpoof", this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D);
+ }
+
+ this.setEntityDead();
+ }
+
+ this.posX += this.motionX;
+ this.posY += this.motionY;
+ this.posZ += this.motionZ;
+ float var17 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
+ this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / (double)((float)Math.PI));
+
+ for(this.rotationPitch = (float)(Math.atan2(this.motionY, (double)var17) * 180.0D / (double)((float)Math.PI)); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F) {
+ }
+
+ while(this.rotationPitch - this.prevRotationPitch >= 180.0F) {
+ this.prevRotationPitch += 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw < -180.0F) {
+ this.prevRotationYaw -= 360.0F;
+ }
+
+ while(this.rotationYaw - this.prevRotationYaw >= 180.0F) {
+ this.prevRotationYaw += 360.0F;
+ }
+
+ this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
+ this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
+ float var18 = 0.99F;
+ float var19 = 0.03F;
+ if(this.handleWaterMovement()) {
+ for(int var7 = 0; var7 < 4; ++var7) {
+ float var20 = 0.25F;
+ this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)var20, this.posY - this.motionY * (double)var20, this.posZ - this.motionZ * (double)var20, this.motionX, this.motionY, this.motionZ);
+ }
+
+ var18 = 0.8F;
+ }
+
+ this.motionX *= (double)var18;
+ this.motionY *= (double)var18;
+ this.motionZ *= (double)var18;
+ this.motionY -= (double)var19;
+ this.setPosition(this.posX, this.posY, this.posZ);
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setShort("xTile", (short)this.field_816_b);
+ var1.setShort("yTile", (short)this.field_815_c);
+ var1.setShort("zTile", (short)this.field_814_d);
+ var1.setByte("inTile", (byte)this.field_813_e);
+ var1.setByte("shake", (byte)this.field_817_a);
+ var1.setByte("inGround", (byte)(this.field_812_f ? 1 : 0));
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ this.field_816_b = var1.getShort("xTile");
+ this.field_815_c = var1.getShort("yTile");
+ this.field_814_d = var1.getShort("zTile");
+ this.field_813_e = var1.getByte("inTile") & 255;
+ this.field_817_a = var1.getByte("shake") & 255;
+ this.field_812_f = var1.getByte("inGround") == 1;
+ }
+
+ public void onCollideWithPlayer(EntityPlayer var1) {
+ if(this.field_812_f && this.field_811_g == var1 && this.field_817_a <= 0 && var1.inventory.addItemStackToInventory(new ItemStack(Item.arrow.shiftedIndex, 1))) {
+ this.worldObj.playSoundAtEntity(this, "random.pop", 0.2F, ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.7F + 1.0F) * 2.0F);
+ var1.func_443_a_(this, 1);
+ this.setEntityDead();
+ }
+
+ }
+
+ public float func_392_h_() {
+ return 0.0F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySorter.java b/src/main/java/net/minecraft/src/EntitySorter.java
new file mode 100644
index 0000000..603143a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySorter.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+import java.util.Comparator;
+
+public class EntitySorter implements Comparator {
+ private Entity field_1594_a;
+
+ public EntitySorter(Entity var1) {
+ this.field_1594_a = var1;
+ }
+
+ public int a(WorldRenderer var1, WorldRenderer var2) {
+ return var1.func_1202_a(this.field_1594_a) < var2.func_1202_a(this.field_1594_a) ? -1 : 1;
+ }
+
+ public int compare(Object var1, Object var2) {
+ return this.a((WorldRenderer)var1, (WorldRenderer)var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySpider.java b/src/main/java/net/minecraft/src/EntitySpider.java
new file mode 100644
index 0000000..aaa832b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySpider.java
@@ -0,0 +1,69 @@
+package net.minecraft.src;
+
+public class EntitySpider extends EntityMobs {
+ public EntitySpider(World var1) {
+ super(var1);
+ this.texture = "/mob/spider.png";
+ this.setSize(1.4F, 0.9F);
+ this.field_9333_am = 0.8F;
+ }
+
+ public double func_402_h() {
+ return (double)this.height * 0.75D - 0.5D;
+ }
+
+ protected Entity findPlayerToAttack() {
+ float var1 = this.getEntityBrightness(1.0F);
+ if(var1 < 0.5F) {
+ double var2 = 16.0D;
+ return this.worldObj.getClosestPlayerToEntity(this, var2);
+ } else {
+ return null;
+ }
+ }
+
+ protected String getLivingSound() {
+ return "mob.spider";
+ }
+
+ protected String getHurtSound() {
+ return "mob.spider";
+ }
+
+ protected String getDeathSound() {
+ return "mob.spiderdeath";
+ }
+
+ protected void attackEntity(Entity var1, float var2) {
+ float var3 = this.getEntityBrightness(1.0F);
+ if(var3 > 0.5F && this.rand.nextInt(100) == 0) {
+ this.playerToAttack = null;
+ } else {
+ if(var2 > 2.0F && var2 < 6.0F && this.rand.nextInt(10) == 0) {
+ if(this.onGround) {
+ double var4 = var1.posX - this.posX;
+ double var6 = var1.posZ - this.posZ;
+ float var8 = MathHelper.sqrt_double(var4 * var4 + var6 * var6);
+ this.motionX = var4 / (double)var8 * 0.5D * (double)0.8F + this.motionX * (double)0.2F;
+ this.motionZ = var6 / (double)var8 * 0.5D * (double)0.8F + this.motionZ * (double)0.2F;
+ this.motionY = (double)0.4F;
+ }
+ } else {
+ super.attackEntity(var1, var2);
+ }
+
+ }
+ }
+
+ public void writeEntityToNBT(NBTTagCompound var1) {
+ super.writeEntityToNBT(var1);
+ }
+
+ public void readEntityFromNBT(NBTTagCompound var1) {
+ super.readEntityFromNBT(var1);
+ }
+
+ protected int getDropItemId() {
+ return Item.silk.shiftedIndex;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntitySplashFX.java b/src/main/java/net/minecraft/src/EntitySplashFX.java
new file mode 100644
index 0000000..6db11b5
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntitySplashFX.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public class EntitySplashFX extends EntityRainFX {
+ public EntitySplashFX(World var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ super(var1, var2, var4, var6);
+ this.field_664_h = 0.04F;
+ ++this.field_670_b;
+ if(var10 == 0.0D && (var8 != 0.0D || var12 != 0.0D)) {
+ this.motionX = var8;
+ this.motionY = var10 + 0.1D;
+ this.motionZ = var12;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityTNTPrimed.java b/src/main/java/net/minecraft/src/EntityTNTPrimed.java
new file mode 100644
index 0000000..3b4949e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityTNTPrimed.java
@@ -0,0 +1,72 @@
+package net.minecraft.src;
+
+public class EntityTNTPrimed extends Entity {
+ public int fuse;
+
+ public EntityTNTPrimed(World var1) {
+ super(var1);
+ this.fuse = 0;
+ this.field_618_ad = true;
+ this.setSize(0.98F, 0.98F);
+ this.yOffset = this.height / 2.0F;
+ }
+
+ public EntityTNTPrimed(World var1, double var2, double var4, double var6) {
+ this(var1);
+ this.setPosition(var2, var4, var6);
+ float var8 = (float)(Math.random() * (double)((float)Math.PI) * 2.0D);
+ this.motionX = (double)(-MathHelper.sin(var8 * (float)Math.PI / 180.0F) * 0.02F);
+ this.motionY = (double)0.2F;
+ this.motionZ = (double)(-MathHelper.cos(var8 * (float)Math.PI / 180.0F) * 0.02F);
+ this.entityWalks = false;
+ this.fuse = 80;
+ this.prevPosX = var2;
+ this.prevPosY = var4;
+ this.prevPosZ = var6;
+ }
+
+ public boolean canBeCollidedWith() {
+ return !this.isDead;
+ }
+
+ public void onUpdate() {
+ this.prevPosX = this.posX;
+ this.prevPosY = this.posY;
+ this.prevPosZ = this.posZ;
+ this.motionY -= (double)0.04F;
+ this.moveEntity(this.motionX, this.motionY, this.motionZ);
+ this.motionX *= (double)0.98F;
+ this.motionY *= (double)0.98F;
+ this.motionZ *= (double)0.98F;
+ if(this.onGround) {
+ this.motionX *= (double)0.7F;
+ this.motionZ *= (double)0.7F;
+ this.motionY *= -0.5D;
+ }
+
+ if(this.fuse-- <= 0) {
+ this.setEntityDead();
+ this.explode();
+ } else {
+ this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D);
+ }
+
+ }
+
+ private void explode() {
+ float var1 = 4.0F;
+ this.worldObj.func_12243_a((Entity)null, this.posX, this.posY, this.posZ, var1);
+ }
+
+ protected void writeEntityToNBT(NBTTagCompound var1) {
+ var1.setByte("Fuse", (byte)this.fuse);
+ }
+
+ protected void readEntityFromNBT(NBTTagCompound var1) {
+ this.fuse = var1.getByte("Fuse");
+ }
+
+ public float func_392_h_() {
+ return 0.0F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityZombie.java b/src/main/java/net/minecraft/src/EntityZombie.java
new file mode 100644
index 0000000..f81990f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityZombie.java
@@ -0,0 +1,37 @@
+package net.minecraft.src;
+
+public class EntityZombie extends EntityMobs {
+ public EntityZombie(World var1) {
+ super(var1);
+ this.texture = "/mob/zombie.png";
+ this.field_9333_am = 0.5F;
+ this.field_762_e = 5;
+ }
+
+ public void onLivingUpdate() {
+ if(this.worldObj.isDaytime()) {
+ float var1 = this.getEntityBrightness(1.0F);
+ if(var1 > 0.5F && this.worldObj.canBlockSeeTheSky(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)) && this.rand.nextFloat() * 30.0F < (var1 - 0.4F) * 2.0F) {
+ this.fire = 300;
+ }
+ }
+
+ super.onLivingUpdate();
+ }
+
+ protected String getLivingSound() {
+ return "mob.zombie";
+ }
+
+ protected String getHurtSound() {
+ return "mob.zombiehurt";
+ }
+
+ protected String getDeathSound() {
+ return "mob.zombiedeath";
+ }
+
+ protected int getDropItemId() {
+ return Item.feather.shiftedIndex;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EntityZombieSimple.java b/src/main/java/net/minecraft/src/EntityZombieSimple.java
new file mode 100644
index 0000000..f80a076
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EntityZombieSimple.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class EntityZombieSimple extends EntityMobs {
+ public EntityZombieSimple(World var1) {
+ super(var1);
+ this.texture = "/mob/zombie.png";
+ this.field_9333_am = 0.5F;
+ this.field_762_e = 50;
+ this.health *= 10;
+ this.yOffset *= 6.0F;
+ this.setSize(this.width * 6.0F, this.height * 6.0F);
+ }
+
+ protected float func_439_a(int var1, int var2, int var3) {
+ return this.worldObj.getLightBrightness(var1, var2, var3) - 0.5F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EnumArt.java b/src/main/java/net/minecraft/src/EnumArt.java
new file mode 100644
index 0000000..4ed300d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EnumArt.java
@@ -0,0 +1,42 @@
+package net.minecraft.src;
+
+public enum EnumArt {
+ Kebab("Kebab", 16, 16, 0, 0),
+ Aztec("Aztec", 16, 16, 16, 0),
+ Alban("Alban", 16, 16, 32, 0),
+ Aztec2("Aztec2", 16, 16, 48, 0),
+ Bomb("Bomb", 16, 16, 64, 0),
+ Plant("Plant", 16, 16, 80, 0),
+ Wasteland("Wasteland", 16, 16, 96, 0),
+ Pool("Pool", 32, 16, 0, 32),
+ Courbet("Courbet", 32, 16, 32, 32),
+ Sea("Sea", 32, 16, 64, 32),
+ Sunset("Sunset", 32, 16, 96, 32),
+ Creebet("Creebet", 32, 16, 128, 32),
+ Wanderer("Wanderer", 16, 32, 0, 64),
+ Graham("Graham", 16, 32, 16, 64),
+ Match("Match", 32, 32, 0, 128),
+ Bust("Bust", 32, 32, 32, 128),
+ Stage("Stage", 32, 32, 64, 128),
+ Void("Void", 32, 32, 96, 128),
+ SkullAndRoses("SkullAndRoses", 32, 32, 128, 128),
+ Fighters("Fighters", 64, 32, 0, 96),
+ Pointer("Pointer", 64, 64, 0, 192),
+ Pigscene("Pigscene", 64, 64, 64, 192),
+ Skeleton("Skeleton", 64, 48, 192, 64),
+ DonkeyKong("DonkeyKong", 64, 48, 192, 112);
+
+ public final String field_1624_y;
+ public final int field_1623_z;
+ public final int field_1636_A;
+ public final int field_1634_B;
+ public final int field_1632_C;
+
+ private EnumArt(String var3, int var4, int var5, int var6, int var7) {
+ this.field_1624_y = var3;
+ this.field_1623_z = var4;
+ this.field_1636_A = var5;
+ this.field_1634_B = var6;
+ this.field_1632_C = var7;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EnumCreatureType.java b/src/main/java/net/minecraft/src/EnumCreatureType.java
new file mode 100644
index 0000000..3302563
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EnumCreatureType.java
@@ -0,0 +1,14 @@
+package net.minecraft.src;
+
+public enum EnumCreatureType {
+ monster(IMobs.class, 100),
+ creature(EntityAnimals.class, 20);
+
+ public final Class field_4278_c;
+ public final int maxNumberOfEntityType;
+
+ private EnumCreatureType(Class var3, int var4) {
+ this.field_4278_c = var3;
+ this.maxNumberOfEntityType = var4;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/EnumMobType.java b/src/main/java/net/minecraft/src/EnumMobType.java
new file mode 100644
index 0000000..a4a69b6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EnumMobType.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public enum EnumMobType {
+ everything,
+ mobs,
+ players;
+}
diff --git a/src/main/java/net/minecraft/src/EnumSkyBlock.java b/src/main/java/net/minecraft/src/EnumSkyBlock.java
new file mode 100644
index 0000000..6d45b0b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/EnumSkyBlock.java
@@ -0,0 +1,12 @@
+package net.minecraft.src;
+
+public enum EnumSkyBlock {
+ Sky(15),
+ Block(0);
+
+ public final int field_1722_c;
+
+ private EnumSkyBlock(int var3) {
+ this.field_1722_c = var3;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Explosion.java b/src/main/java/net/minecraft/src/Explosion.java
new file mode 100644
index 0000000..7e35a55
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Explosion.java
@@ -0,0 +1,166 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+public class Explosion {
+ public boolean field_12257_a = false;
+ private Random field_12250_h = new Random();
+ private World field_12249_i;
+ public double field_12256_b;
+ public double field_12255_c;
+ public double field_12254_d;
+ public Entity field_12253_e;
+ public float field_12252_f;
+ public Set field_12251_g = new HashSet();
+
+ public Explosion(World var1, Entity var2, double var3, double var5, double var7, float var9) {
+ this.field_12249_i = var1;
+ this.field_12253_e = var2;
+ this.field_12252_f = var9;
+ this.field_12256_b = var3;
+ this.field_12255_c = var5;
+ this.field_12254_d = var7;
+ }
+
+ public void func_12248_a() {
+ float var1 = this.field_12252_f;
+ byte var2 = 16;
+
+ int var3;
+ int var4;
+ int var5;
+ double var15;
+ double var17;
+ double var19;
+ for(var3 = 0; var3 < var2; ++var3) {
+ for(var4 = 0; var4 < var2; ++var4) {
+ for(var5 = 0; var5 < var2; ++var5) {
+ if(var3 == 0 || var3 == var2 - 1 || var4 == 0 || var4 == var2 - 1 || var5 == 0 || var5 == var2 - 1) {
+ double var6 = (double)((float)var3 / ((float)var2 - 1.0F) * 2.0F - 1.0F);
+ double var8 = (double)((float)var4 / ((float)var2 - 1.0F) * 2.0F - 1.0F);
+ double var10 = (double)((float)var5 / ((float)var2 - 1.0F) * 2.0F - 1.0F);
+ double var12 = Math.sqrt(var6 * var6 + var8 * var8 + var10 * var10);
+ var6 /= var12;
+ var8 /= var12;
+ var10 /= var12;
+ float var14 = this.field_12252_f * (0.7F + this.field_12249_i.rand.nextFloat() * 0.6F);
+ var15 = this.field_12256_b;
+ var17 = this.field_12255_c;
+ var19 = this.field_12254_d;
+
+ for(float var21 = 0.3F; var14 > 0.0F; var14 -= var21 * (12.0F / 16.0F)) {
+ int var22 = MathHelper.floor_double(var15);
+ int var23 = MathHelper.floor_double(var17);
+ int var24 = MathHelper.floor_double(var19);
+ int var25 = this.field_12249_i.getBlockId(var22, var23, var24);
+ if(var25 > 0) {
+ var14 -= (Block.blocksList[var25].func_227_a(this.field_12253_e) + 0.3F) * var21;
+ }
+
+ if(var14 > 0.0F) {
+ this.field_12251_g.add(new ChunkPosition(var22, var23, var24));
+ }
+
+ var15 += var6 * (double)var21;
+ var17 += var8 * (double)var21;
+ var19 += var10 * (double)var21;
+ }
+ }
+ }
+ }
+ }
+
+ this.field_12252_f *= 2.0F;
+ var3 = MathHelper.floor_double(this.field_12256_b - (double)this.field_12252_f - 1.0D);
+ var4 = MathHelper.floor_double(this.field_12256_b + (double)this.field_12252_f + 1.0D);
+ var5 = MathHelper.floor_double(this.field_12255_c - (double)this.field_12252_f - 1.0D);
+ int var29 = MathHelper.floor_double(this.field_12255_c + (double)this.field_12252_f + 1.0D);
+ int var7 = MathHelper.floor_double(this.field_12254_d - (double)this.field_12252_f - 1.0D);
+ int var30 = MathHelper.floor_double(this.field_12254_d + (double)this.field_12252_f + 1.0D);
+ List var9 = this.field_12249_i.getEntitiesWithinAABBExcludingEntity(this.field_12253_e, AxisAlignedBB.getBoundingBoxFromPool((double)var3, (double)var5, (double)var7, (double)var4, (double)var29, (double)var30));
+ Vec3D var31 = Vec3D.createVector(this.field_12256_b, this.field_12255_c, this.field_12254_d);
+
+ for(int var11 = 0; var11 < var9.size(); ++var11) {
+ Entity var33 = (Entity)var9.get(var11);
+ double var13 = var33.getDistance(this.field_12256_b, this.field_12255_c, this.field_12254_d) / (double)this.field_12252_f;
+ if(var13 <= 1.0D) {
+ var15 = var33.posX - this.field_12256_b;
+ var17 = var33.posY - this.field_12255_c;
+ var19 = var33.posZ - this.field_12254_d;
+ double var39 = (double)MathHelper.sqrt_double(var15 * var15 + var17 * var17 + var19 * var19);
+ var15 /= var39;
+ var17 /= var39;
+ var19 /= var39;
+ double var40 = (double)this.field_12249_i.func_675_a(var31, var33.boundingBox);
+ double var41 = (1.0D - var13) * var40;
+ var33.canAttackEntity(this.field_12253_e, (int)((var41 * var41 + var41) / 2.0D * 8.0D * (double)this.field_12252_f + 1.0D));
+ var33.motionX += var15 * var41;
+ var33.motionY += var17 * var41;
+ var33.motionZ += var19 * var41;
+ }
+ }
+
+ this.field_12252_f = var1;
+ ArrayList var32 = new ArrayList();
+ var32.addAll(this.field_12251_g);
+ if(this.field_12257_a) {
+ for(int var34 = var32.size() - 1; var34 >= 0; --var34) {
+ ChunkPosition var35 = (ChunkPosition)var32.get(var34);
+ int var36 = var35.x;
+ int var37 = var35.y;
+ int var16 = var35.z;
+ int var38 = this.field_12249_i.getBlockId(var36, var37, var16);
+ int var18 = this.field_12249_i.getBlockId(var36, var37 - 1, var16);
+ if(var38 == 0 && Block.opaqueCubeLookup[var18] && this.field_12250_h.nextInt(3) == 0) {
+ this.field_12249_i.setBlockWithNotify(var36, var37, var16, Block.fire.blockID);
+ }
+ }
+ }
+
+ }
+
+ public void func_12247_b() {
+ this.field_12249_i.playSoundEffect(this.field_12256_b, this.field_12255_c, this.field_12254_d, "random.explode", 4.0F, (1.0F + (this.field_12249_i.rand.nextFloat() - this.field_12249_i.rand.nextFloat()) * 0.2F) * 0.7F);
+ ArrayList var1 = new ArrayList();
+ var1.addAll(this.field_12251_g);
+
+ for(int var2 = var1.size() - 1; var2 >= 0; --var2) {
+ ChunkPosition var3 = (ChunkPosition)var1.get(var2);
+ int var4 = var3.x;
+ int var5 = var3.y;
+ int var6 = var3.z;
+ int var7 = this.field_12249_i.getBlockId(var4, var5, var6);
+
+ for(int var8 = 0; var8 < 1; ++var8) {
+ double var9 = (double)((float)var4 + this.field_12249_i.rand.nextFloat());
+ double var11 = (double)((float)var5 + this.field_12249_i.rand.nextFloat());
+ double var13 = (double)((float)var6 + this.field_12249_i.rand.nextFloat());
+ double var15 = var9 - this.field_12256_b;
+ double var17 = var11 - this.field_12255_c;
+ double var19 = var13 - this.field_12254_d;
+ double var21 = (double)MathHelper.sqrt_double(var15 * var15 + var17 * var17 + var19 * var19);
+ var15 /= var21;
+ var17 /= var21;
+ var19 /= var21;
+ double var23 = 0.5D / (var21 / (double)this.field_12252_f + 0.1D);
+ var23 *= (double)(this.field_12249_i.rand.nextFloat() * this.field_12249_i.rand.nextFloat() + 0.3F);
+ var15 *= var23;
+ var17 *= var23;
+ var19 *= var23;
+ this.field_12249_i.spawnParticle("explode", (var9 + this.field_12256_b * 1.0D) / 2.0D, (var11 + this.field_12255_c * 1.0D) / 2.0D, (var13 + this.field_12254_d * 1.0D) / 2.0D, var15, var17, var19);
+ this.field_12249_i.spawnParticle("smoke", var9, var11, var13, var15, var17, var19);
+ }
+
+ if(var7 > 0) {
+ Block.blocksList[var7].dropBlockAsItemWithChance(this.field_12249_i, var4, var5, var6, this.field_12249_i.getBlockMetadata(var4, var5, var6), 0.3F);
+ this.field_12249_i.setBlockWithNotify(var4, var5, var6, 0);
+ Block.blocksList[var7].onBlockDestroyedByExplosion(this.field_12249_i, var4, var5, var6);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/FontAllowedCharacters.java b/src/main/java/net/minecraft/src/FontAllowedCharacters.java
new file mode 100644
index 0000000..8214d53
--- /dev/null
+++ b/src/main/java/net/minecraft/src/FontAllowedCharacters.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+public class FontAllowedCharacters {
+
+ public static int isAllowed(char c) {
+ int cc = (int) c;
+ for(int i = 0; i < allowedChars.length; ++i) {
+ if(cc == allowedChars[i]) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public static final int[] allowedChars = new int[]{
+ 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,
+ 59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,
+ 86,87,88,89,90,91,92,93,94,95,39,97,98,99,100,101,102,103,104,105,106,107,108,109,
+ 110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,8962,199,252,
+ 233,226,228,224,229,231,234,235,232,239,238,236,196,197,201,230,198,244,246,242,
+ 251,249,255,214,220,248,163,216,215,402,225,237,243,250,241,209,170,186,191,174,
+ 172,189,188,161,171,187
+ };
+
+ public static final char field_22286_b[] = { '/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '"', ':' };
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/src/FontRenderer.java b/src/main/java/net/minecraft/src/FontRenderer.java
new file mode 100644
index 0000000..b87c9d1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/FontRenderer.java
@@ -0,0 +1,183 @@
+package net.minecraft.src;
+
+import java.nio.IntBuffer;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import org.lwjgl.opengl.GL11;
+
+import net.lax1dude.eaglercraft.EaglerImage;
+
+public class FontRenderer {
+
+ public FontRenderer(GameSettings gamesettings, String s, RenderEngine renderengine) {
+ charWidth = new int[256];
+ fontTextureName = 0;
+ EaglerImage bufferedimage = GL11.loadPNG(GL11.loadResourceBytes(s));
+ int i = bufferedimage.w;
+ int j = bufferedimage.h;
+ int ai[] = bufferedimage.data;
+ for (int k = 0; k < 256; k++) {
+ int l = k % 16;
+ int k1 = k / 16;
+ int j2 = 7;
+ do {
+ if (j2 < 0) {
+ break;
+ }
+ int i3 = l * 8 + j2;
+ boolean flag = true;
+ for (int l3 = 0; l3 < 8 && flag; l3++) {
+ int i4 = (k1 * 8 + l3) * i;
+ int k4 = ai[i3 + i4] & 0xff;
+ if (k4 > 0) {
+ flag = false;
+ }
+ }
+
+ if (!flag) {
+ break;
+ }
+ j2--;
+ } while (true);
+ if (k == 32) {
+ j2 = 2;
+ }
+ charWidth[k] = j2 + 2;
+ }
+
+ fontTextureName = renderengine.allocateAndSetupTexture(bufferedimage);
+ fontDisplayLists = GLAllocation.generateDisplayLists(288);
+ Tessellator tessellator = Tessellator.instance;
+ for (int i1 = 0; i1 < 256; i1++) {
+ GL11.glNewList(fontDisplayLists + i1, 4864 /* GL_COMPILE */);
+ tessellator.startDrawingQuads();
+ int l1 = (i1 % 16) * 8;
+ int k2 = (i1 / 16) * 8;
+ float f = 7.99F;
+ float f1 = 0.0F;
+ float f2 = 0.0F;
+ tessellator.addVertexWithUV(0.0D, 0.0F + f, 0.0D, (float) l1 / 128F + f1, ((float) k2 + f) / 128F + f2);
+ tessellator.addVertexWithUV(0.0F + f, 0.0F + f, 0.0D, ((float) l1 + f) / 128F + f1,
+ ((float) k2 + f) / 128F + f2);
+ tessellator.addVertexWithUV(0.0F + f, 0.0D, 0.0D, ((float) l1 + f) / 128F + f1, (float) k2 / 128F + f2);
+ tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, (float) l1 / 128F + f1, (float) k2 / 128F + f2);
+ tessellator.draw();
+ GL11.glEndList();
+ }
+
+ for (int j1 = 0; j1 < 32; j1++) {
+ int i2 = (j1 >> 3 & 1) * 85;
+ int l2 = (j1 >> 2 & 1) * 170 + i2;
+ int j3 = (j1 >> 1 & 1) * 170 + i2;
+ int k3 = (j1 >> 0 & 1) * 170 + i2;
+ if (j1 == 6) {
+ l2 += 85;
+ }
+ boolean flag1 = j1 >= 16;
+ if (gamesettings.anaglyph) {
+ int j4 = (l2 * 30 + j3 * 59 + k3 * 11) / 100;
+ int l4 = (l2 * 30 + j3 * 70) / 100;
+ int i5 = (l2 * 30 + k3 * 70) / 100;
+ l2 = j4;
+ j3 = l4;
+ k3 = i5;
+ }
+ if (flag1) {
+ l2 /= 4;
+ j3 /= 4;
+ k3 /= 4;
+ }
+ GL11.glNewList(fontDisplayLists + 256 + j1, 4864 /* GL_COMPILE */);
+ GL11.glColor3f((float) l2 / 255F, (float) j3 / 255F, (float) k3 / 255F);
+ GL11.glEndList();
+ }
+
+ }
+
+ public void drawStringWithShadow(String s, int i, int j, int k) {
+ renderString(s, i + 1, j + 1, k, true);
+ drawString(s, i, j, k);
+ }
+
+ public void drawString(String s, int i, int j, int k) {
+ renderString(s, i, j, k, false);
+ }
+
+ public void renderString(String s, int i, int j, int k, boolean flag) {
+ if (s == null) {
+ return;
+ }
+ if (flag) {
+ int l = k & 0xff000000;
+ k = (k & 0xfcfcfc) >> 2;
+ k += l;
+ }
+ GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, fontTextureName);
+ float f = (float) (k >> 16 & 0xff) / 255F;
+ float f1 = (float) (k >> 8 & 0xff) / 255F;
+ float f2 = (float) (k & 0xff) / 255F;
+ float f3 = (float) (k >> 24 & 0xff) / 255F;
+ if (f3 == 0.0F) {
+ f3 = 1.0F;
+ }
+ GL11.glColor4f(f, f1, f2, f3);
+ GL11.glPushMatrix();
+ GL11.glTranslatef(i, j, 0.0F);
+ for (int i1 = 0; i1 < s.length(); i1++) {
+ for (; s.length() > i1 + 1 && s.charAt(i1) == '\247'; i1 += 2) {
+ int j1 = "0123456789abcdef".indexOf(s.toLowerCase().charAt(i1 + 1));
+ if (j1 < 0 || j1 > 15) {
+ j1 = 15;
+ }
+ continue;
+ }
+
+ if (i1 < s.length()) {
+ int k1 = FontAllowedCharacters.isAllowed(s.charAt(i1));
+ if (k1 >= 0) {
+ GL11.glCallList(fontDisplayLists + k1 + 32);
+ GL11.glTranslatef(charWidth[k1 + 32], 0.0F, 0.0F);
+ }
+ }
+ }
+
+ GL11.glPopMatrix();
+ }
+
+ public int getStringWidth(String s) {
+ if (s == null) {
+ return 0;
+ }
+ int i = 0;
+ for (int j = 0; j < s.length(); j++) {
+ if (s.charAt(j) == '\247') {
+ j++;
+ continue;
+ }
+ int k = FontAllowedCharacters.isAllowed(s.charAt(j));
+ if (k >= 0) {
+ i += charWidth[k + 32];
+ }
+ }
+
+ return i;
+ }
+
+ private int charWidth[];
+ public int fontTextureName;
+ private int fontDisplayLists;
+ private IntBuffer buffer;
+
+ public static final char formatChar = '\247';
+
+ public List listFormattedStringToWidth(String title2) {
+ java.util.ArrayList arraylist = new java.util.ArrayList();
+ String[] string = title2.split("\n");
+ for (String list : string) {
+ arraylist.add(list);
+ }
+ return arraylist;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/src/Frustrum.java b/src/main/java/net/minecraft/src/Frustrum.java
new file mode 100644
index 0000000..82e71c1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Frustrum.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+public class Frustrum implements ICamera {
+ private ClippingHelper field_593_a = ClippingHelperImplementation.func_1155_a();
+ private double field_592_b;
+ private double field_595_c;
+ private double field_594_d;
+
+ public void func_343_a(double var1, double var3, double var5) {
+ this.field_592_b = var1;
+ this.field_595_c = var3;
+ this.field_594_d = var5;
+ }
+
+ public boolean func_344_a(double var1, double var3, double var5, double var7, double var9, double var11) {
+ return this.field_593_a.func_1152_a(var1 - this.field_592_b, var3 - this.field_595_c, var5 - this.field_594_d, var7 - this.field_592_b, var9 - this.field_595_c, var11 - this.field_594_d);
+ }
+
+ public boolean func_342_a(AxisAlignedBB var1) {
+ return this.func_344_a(var1.minX, var1.minY, var1.minZ, var1.maxX, var1.maxY, var1.maxZ);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GLAllocation.java b/src/main/java/net/minecraft/src/GLAllocation.java
new file mode 100644
index 0000000..4df398c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GLAllocation.java
@@ -0,0 +1,60 @@
+package net.minecraft.src;
+
+import java.nio.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lwjgl.opengl.GL11;
+
+public class GLAllocation {
+
+ public GLAllocation() {
+ }
+
+ public static synchronized int generateDisplayLists(int i) {
+ int j = GL11.glGenLists(i);
+ displayLists.add(Integer.valueOf(j));
+ displayLists.add(Integer.valueOf(i));
+ return j;
+ }
+
+ public static synchronized void generateTextureNames(IntBuffer intbuffer) {
+
+ for (int i = intbuffer.position(); i < intbuffer.limit(); i++) {
+ int tx = GL11.glGenTextures();
+ intbuffer.put(i, tx);
+ textureNames.add(Integer.valueOf(tx));
+ }
+
+ }
+
+ public static synchronized void deleteTexturesAndDisplayLists() {
+ for (int i = 0; i < displayLists.size(); i += 2) {
+ GL11.glDeleteLists(((Integer) displayLists.get(i)).intValue(),
+ ((Integer) displayLists.get(i + 1)).intValue());
+ }
+
+ for (int j = 0; j < textureNames.size(); j++) {
+ GL11.glDeleteTextures(((Integer) textureNames.get(j)).intValue());
+ }
+
+ displayLists.clear();
+ textureNames.clear();
+ }
+
+ public static ByteBuffer createDirectByteBuffer(int par0) {
+ return ByteBuffer.wrap(new byte[par0]).order(ByteOrder.nativeOrder());
+ }
+
+ public static IntBuffer createDirectIntBuffer(int par0) {
+ return IntBuffer.wrap(new int[par0]);
+ }
+
+ public static FloatBuffer createDirectFloatBuffer(int par0) {
+ return FloatBuffer.wrap(new float[par0]);
+ }
+
+ private static List displayLists = new ArrayList();
+ private static List textureNames = new ArrayList();
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/src/GameSettings.java b/src/main/java/net/minecraft/src/GameSettings.java
new file mode 100644
index 0000000..edd10d3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GameSettings.java
@@ -0,0 +1,229 @@
+package net.minecraft.src;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import net.minecraft.client.Minecraft;
+import org.lwjgl.input.Keyboard;
+
+public class GameSettings {
+ private static final String[] RENDER_DISTANCES = new String[]{"FAR", "NORMAL", "SHORT", "TINY"};
+ private static final String[] DIFFICULTY_LEVELS = new String[]{"Peaceful", "Easy", "Normal", "Hard"};
+ public float musicVolume = 1.0F;
+ public float soundVolume = 1.0F;
+ public float mouseSensitivity = 0.5F;
+ public boolean invertMouse = false;
+ public int renderDistance = 0;
+ public boolean viewBobbing = true;
+ public boolean anaglyph = false;
+ public boolean limitFramerate = false;
+ public boolean fancyGraphics = true;
+ public String skin = "Default";
+ public KeyBinding keyBindForward = new KeyBinding("Forward", 17);
+ public KeyBinding keyBindLeft = new KeyBinding("Left", 30);
+ public KeyBinding keyBindBack = new KeyBinding("Back", 31);
+ public KeyBinding keyBindRight = new KeyBinding("Right", 32);
+ public KeyBinding keyBindJump = new KeyBinding("Jump", 57);
+ public KeyBinding keyBindInventory = new KeyBinding("Inventory", 23);
+ public KeyBinding keyBindDrop = new KeyBinding("Drop", 16);
+ public KeyBinding keyBindChat = new KeyBinding("Chat", 20);
+ public KeyBinding keyBindToggleFog = new KeyBinding("Toggle fog", 33);
+ public KeyBinding keyBindSneak = new KeyBinding("Sneak", 42);
+ public KeyBinding[] keyBindings = new KeyBinding[]{this.keyBindForward, this.keyBindLeft, this.keyBindBack, this.keyBindRight, this.keyBindJump, this.keyBindSneak, this.keyBindDrop, this.keyBindInventory, this.keyBindChat, this.keyBindToggleFog};
+ protected Minecraft mc;
+ private File optionsFile;
+ public int numberOfOptions = 10;
+ public int difficulty = 2;
+ public boolean thirdPersonView = false;
+ public String field_12259_z = "";
+
+ public GameSettings(Minecraft var1, File var2) {
+ this.mc = var1;
+ this.optionsFile = new File(var2, "options.txt");
+ this.loadOptions();
+ }
+
+ public GameSettings() {
+ }
+
+ public String getKeyBinding(int var1) {
+ return this.keyBindings[var1].keyDescription + ": " + Keyboard.getKeyName(this.keyBindings[var1].keyCode);
+ }
+
+ public void setKeyBinding(int var1, int var2) {
+ this.keyBindings[var1].keyCode = var2;
+ this.saveOptions();
+ }
+
+ public void setOptionFloatValue(int var1, float var2) {
+ if(var1 == 0) {
+ this.musicVolume = var2;
+ }
+
+ if(var1 == 1) {
+ this.soundVolume = var2;
+ }
+
+ if(var1 == 3) {
+ this.mouseSensitivity = var2;
+ }
+
+ }
+
+ public void setOptionValue(int var1, int var2) {
+ if(var1 == 2) {
+ this.invertMouse = !this.invertMouse;
+ }
+
+ if(var1 == 4) {
+ this.renderDistance = this.renderDistance + var2 & 3;
+ }
+
+ if(var1 == 5) {
+ this.viewBobbing = !this.viewBobbing;
+ }
+
+ if(var1 == 6) {
+ this.anaglyph = !this.anaglyph;
+ }
+
+ if(var1 == 7) {
+ this.limitFramerate = !this.limitFramerate;
+ }
+
+ if(var1 == 8) {
+ this.difficulty = this.difficulty + var2 & 3;
+ }
+
+ if(var1 == 9) {
+ this.fancyGraphics = !this.fancyGraphics;
+ this.mc.field_6323_f.func_958_a();
+ }
+
+ this.saveOptions();
+ }
+
+ public int getOptionControlType(int var1) {
+ return var1 == 0 ? 1 : (var1 == 1 ? 1 : (var1 == 3 ? 1 : 0));
+ }
+
+ public float getOptionFloatValue(int var1) {
+ return var1 == 0 ? this.musicVolume : (var1 == 1 ? this.soundVolume : (var1 == 3 ? this.mouseSensitivity : 0.0F));
+ }
+
+ public String getOptionDisplayString(int var1) {
+ return var1 == 0 ? "Music: " + (this.musicVolume > 0.0F ? (int)(this.musicVolume * 100.0F) + "%" : "OFF") : (var1 == 1 ? "Sound: " + (this.soundVolume > 0.0F ? (int)(this.soundVolume * 100.0F) + "%" : "OFF") : (var1 == 2 ? "Invert mouse: " + (this.invertMouse ? "ON" : "OFF") : (var1 == 3 ? (this.mouseSensitivity == 0.0F ? "Sensitivity: *yawn*" : (this.mouseSensitivity == 1.0F ? "Sensitivity: HYPERSPEED!!!" : "Sensitivity: " + (int)(this.mouseSensitivity * 200.0F) + "%")) : (var1 == 4 ? "Render distance: " + RENDER_DISTANCES[this.renderDistance] : (var1 == 5 ? "View bobbing: " + (this.viewBobbing ? "ON" : "OFF") : (var1 == 6 ? "3d anaglyph: " + (this.anaglyph ? "ON" : "OFF") : (var1 == 7 ? "Limit framerate: " + (this.limitFramerate ? "ON" : "OFF") : (var1 == 8 ? "Difficulty: " + DIFFICULTY_LEVELS[this.difficulty] : (var1 == 9 ? "Graphics: " + (this.fancyGraphics ? "FANCY" : "FAST") : "")))))))));
+ }
+
+ public void loadOptions() {
+ try {
+ if(!this.optionsFile.exists()) {
+ return;
+ }
+
+ BufferedReader var1 = new BufferedReader(new FileReader(this.optionsFile));
+ String var2 = "";
+
+ while(true) {
+ var2 = var1.readLine();
+ if(var2 == null) {
+ var1.close();
+ break;
+ }
+
+ String[] var3 = var2.split(":");
+ if(var3[0].equals("music")) {
+ this.musicVolume = this.parseFloat(var3[1]);
+ }
+
+ if(var3[0].equals("sound")) {
+ this.soundVolume = this.parseFloat(var3[1]);
+ }
+
+ if(var3[0].equals("mouseSensitivity")) {
+ this.mouseSensitivity = this.parseFloat(var3[1]);
+ }
+
+ if(var3[0].equals("invertYMouse")) {
+ this.invertMouse = var3[1].equals("true");
+ }
+
+ if(var3[0].equals("viewDistance")) {
+ this.renderDistance = Integer.parseInt(var3[1]);
+ }
+
+ if(var3[0].equals("bobView")) {
+ this.viewBobbing = var3[1].equals("true");
+ }
+
+ if(var3[0].equals("anaglyph3d")) {
+ this.anaglyph = var3[1].equals("true");
+ }
+
+ if(var3[0].equals("limitFramerate")) {
+ this.limitFramerate = var3[1].equals("true");
+ }
+
+ if(var3[0].equals("difficulty")) {
+ this.difficulty = Integer.parseInt(var3[1]);
+ }
+
+ if(var3[0].equals("fancyGraphics")) {
+ this.fancyGraphics = var3[1].equals("true");
+ }
+
+ if(var3[0].equals("skin")) {
+ this.skin = var3[1];
+ }
+
+ if(var3[0].equals("lastServer")) {
+ this.field_12259_z = var3[1];
+ }
+
+ for(int var4 = 0; var4 < this.keyBindings.length; ++var4) {
+ if(var3[0].equals("key_" + this.keyBindings[var4].keyDescription)) {
+ this.keyBindings[var4].keyCode = Integer.parseInt(var3[1]);
+ }
+ }
+ }
+ } catch (Exception var5) {
+ System.out.println("Failed to load options");
+ var5.printStackTrace();
+ }
+
+ }
+
+ private float parseFloat(String var1) {
+ return var1.equals("true") ? 1.0F : (var1.equals("false") ? 0.0F : Float.parseFloat(var1));
+ }
+
+ public void saveOptions() {
+ try {
+ PrintWriter var1 = new PrintWriter(new FileWriter(this.optionsFile));
+ var1.println("music:" + this.musicVolume);
+ var1.println("sound:" + this.soundVolume);
+ var1.println("invertYMouse:" + this.invertMouse);
+ var1.println("mouseSensitivity:" + this.mouseSensitivity);
+ var1.println("viewDistance:" + this.renderDistance);
+ var1.println("bobView:" + this.viewBobbing);
+ var1.println("anaglyph3d:" + this.anaglyph);
+ var1.println("limitFramerate:" + this.limitFramerate);
+ var1.println("difficulty:" + this.difficulty);
+ var1.println("fancyGraphics:" + this.fancyGraphics);
+ var1.println("skin:" + this.skin);
+ var1.println("lastServer:" + this.field_12259_z);
+
+ for(int var2 = 0; var2 < this.keyBindings.length; ++var2) {
+ var1.println("key_" + this.keyBindings[var2].keyDescription + ":" + this.keyBindings[var2].keyCode);
+ }
+
+ var1.close();
+ } catch (Exception var3) {
+ System.out.println("Failed to save options");
+ var3.printStackTrace();
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GameWindowListener.java b/src/main/java/net/minecraft/src/GameWindowListener.java
new file mode 100644
index 0000000..5ef7d0f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GameWindowListener.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import net.minecraft.client.Minecraft;
+
+public final class GameWindowListener extends WindowAdapter {
+ final Minecraft mc;
+ final Thread mcThread;
+
+ public GameWindowListener(Minecraft var1, Thread var2) {
+ this.mc = var1;
+ this.mcThread = var2;
+ }
+
+ public void windowClosing(WindowEvent var1) {
+ this.mc.shutdown();
+
+ try {
+ this.mcThread.join();
+ } catch (InterruptedException var3) {
+ var3.printStackTrace();
+ }
+
+ System.exit(0);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Gui.java b/src/main/java/net/minecraft/src/Gui.java
new file mode 100644
index 0000000..88dd25b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Gui.java
@@ -0,0 +1,76 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class Gui {
+ protected float zLevel = 0.0F;
+
+ protected void drawRect(int var1, int var2, int var3, int var4, int var5) {
+ float var6 = (float)(var5 >> 24 & 255) / 255.0F;
+ float var7 = (float)(var5 >> 16 & 255) / 255.0F;
+ float var8 = (float)(var5 >> 8 & 255) / 255.0F;
+ float var9 = (float)(var5 & 255) / 255.0F;
+ Tessellator var10 = Tessellator.instance;
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glColor4f(var7, var8, var9, var6);
+ var10.startDrawingQuads();
+ var10.addVertex((double)var1, (double)var4, 0.0D);
+ var10.addVertex((double)var3, (double)var4, 0.0D);
+ var10.addVertex((double)var3, (double)var2, 0.0D);
+ var10.addVertex((double)var1, (double)var2, 0.0D);
+ var10.draw();
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+
+ protected void drawGradientRect(int var1, int var2, int var3, int var4, int var5, int var6) {
+ float var7 = (float)(var5 >> 24 & 255) / 255.0F;
+ float var8 = (float)(var5 >> 16 & 255) / 255.0F;
+ float var9 = (float)(var5 >> 8 & 255) / 255.0F;
+ float var10 = (float)(var5 & 255) / 255.0F;
+ float var11 = (float)(var6 >> 24 & 255) / 255.0F;
+ float var12 = (float)(var6 >> 16 & 255) / 255.0F;
+ float var13 = (float)(var6 >> 8 & 255) / 255.0F;
+ float var14 = (float)(var6 & 255) / 255.0F;
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glShadeModel(GL11.GL_SMOOTH);
+ Tessellator var15 = Tessellator.instance;
+ var15.startDrawingQuads();
+ var15.setColorRGBA_F(var8, var9, var10, var7);
+ var15.addVertex((double)var3, (double)var2, 0.0D);
+ var15.addVertex((double)var1, (double)var2, 0.0D);
+ var15.setColorRGBA_F(var12, var13, var14, var11);
+ var15.addVertex((double)var1, (double)var4, 0.0D);
+ var15.addVertex((double)var3, (double)var4, 0.0D);
+ var15.draw();
+ GL11.glShadeModel(GL11.GL_FLAT);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ public void drawCenteredString(FontRenderer var1, String var2, int var3, int var4, int var5) {
+ var1.drawStringWithShadow(var2, var3 - var1.getStringWidth(var2) / 2, var4, var5);
+ }
+
+ public void drawString(FontRenderer var1, String var2, int var3, int var4, int var5) {
+ var1.drawStringWithShadow(var2, var3, var4, var5);
+ }
+
+ public void drawTexturedModalRect(int var1, int var2, int var3, int var4, int var5, int var6) {
+ float var7 = 0.00390625F;
+ float var8 = 0.00390625F;
+ Tessellator var9 = Tessellator.instance;
+ var9.startDrawingQuads();
+ var9.addVertexWithUV((double)(var1 + 0), (double)(var2 + var6), (double)this.zLevel, (double)((float)(var3 + 0) * var7), (double)((float)(var4 + var6) * var8));
+ var9.addVertexWithUV((double)(var1 + var5), (double)(var2 + var6), (double)this.zLevel, (double)((float)(var3 + var5) * var7), (double)((float)(var4 + var6) * var8));
+ var9.addVertexWithUV((double)(var1 + var5), (double)(var2 + 0), (double)this.zLevel, (double)((float)(var3 + var5) * var7), (double)((float)(var4 + 0) * var8));
+ var9.addVertexWithUV((double)(var1 + 0), (double)(var2 + 0), (double)this.zLevel, (double)((float)(var3 + 0) * var7), (double)((float)(var4 + 0) * var8));
+ var9.draw();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiButton.java b/src/main/java/net/minecraft/src/GuiButton.java
new file mode 100644
index 0000000..3620a0e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiButton.java
@@ -0,0 +1,74 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+import org.lwjgl.opengl.GL11;
+
+public class GuiButton extends Gui {
+ protected int width;
+ protected int height;
+ public int xPosition;
+ public int yPosition;
+ public String displayString;
+ public int id;
+ public boolean enabled;
+ public boolean enabled2;
+
+ public GuiButton(int var1, int var2, int var3, String var4) {
+ this(var1, var2, var3, 200, 20, var4);
+ }
+
+ protected GuiButton(int var1, int var2, int var3, int var4, int var5, String var6) {
+ this.width = 200;
+ this.height = 20;
+ this.enabled = true;
+ this.enabled2 = true;
+ this.id = var1;
+ this.xPosition = var2;
+ this.yPosition = var3;
+ this.width = var4;
+ this.height = var5;
+ this.displayString = var6;
+ }
+
+ protected int getHoverState(boolean var1) {
+ byte var2 = 1;
+ if(!this.enabled) {
+ var2 = 0;
+ } else if(var1) {
+ var2 = 2;
+ }
+
+ return var2;
+ }
+
+ public void drawButton(Minecraft var1, int var2, int var3) {
+ if(this.enabled2) {
+ FontRenderer var4 = var1.fontRenderer;
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var1.renderEngine.getTexture("/gui/gui.png"));
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ boolean var5 = var2 >= this.xPosition && var3 >= this.yPosition && var2 < this.xPosition + this.width && var3 < this.yPosition + this.height;
+ int var6 = this.getHoverState(var5);
+ this.drawTexturedModalRect(this.xPosition, this.yPosition, 0, 46 + var6 * 20, this.width / 2, this.height);
+ this.drawTexturedModalRect(this.xPosition + this.width / 2, this.yPosition, 200 - this.width / 2, 46 + var6 * 20, this.width / 2, this.height);
+ this.mouseDragged(var1, var2, var3);
+ if(!this.enabled) {
+ this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, -6250336);
+ } else if(var5) {
+ this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 16777120);
+ } else {
+ this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 14737632);
+ }
+
+ }
+ }
+
+ protected void mouseDragged(Minecraft var1, int var2, int var3) {
+ }
+
+ public void mouseReleased(int var1, int var2) {
+ }
+
+ public boolean mousePressed(Minecraft var1, int var2, int var3) {
+ return this.enabled && var2 >= this.xPosition && var3 >= this.yPosition && var2 < this.xPosition + this.width && var3 < this.yPosition + this.height;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiChat.java b/src/main/java/net/minecraft/src/GuiChat.java
new file mode 100644
index 0000000..662dacf
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiChat.java
@@ -0,0 +1,62 @@
+package net.minecraft.src;
+
+import org.lwjgl.input.Keyboard;
+
+public class GuiChat extends GuiScreen {
+ private String message = "";
+ private int updateCounter = 0;
+
+ public void initGui() {
+ Keyboard.enableRepeatEvents(true);
+ }
+
+ public void onGuiClosed() {
+ Keyboard.enableRepeatEvents(false);
+ }
+
+ public void updateScreen() {
+ ++this.updateCounter;
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ if(var2 == 1) {
+ this.mc.displayGuiScreen((GuiScreen)null);
+ } else if(var2 == 28) {
+ String var3 = this.message.trim();
+ if(var3.length() > 0) {
+ this.mc.thePlayer.sendChatMessage(this.message.trim());
+ }
+
+ this.mc.displayGuiScreen((GuiScreen)null);
+ } else {
+ if(var2 == 14 && this.message.length() > 0) {
+ this.message = this.message.substring(0, this.message.length() - 1);
+ }
+
+ if(" !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\'abcdefghijklmnopqrstuvwxyz{|}~\u2302\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb".indexOf(var1) >= 0 && this.message.length() < 100) {
+ this.message = this.message + var1;
+ }
+
+ }
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawRect(2, this.height - 14, this.width - 2, this.height - 2, Integer.MIN_VALUE);
+ this.drawString(this.fontRenderer, "> " + this.message + (this.updateCounter / 6 % 2 == 0 ? "_" : ""), 4, this.height - 12, 14737632);
+ }
+
+ protected void mouseClicked(int var1, int var2, int var3) {
+ if(var3 == 0 && this.mc.ingameGUI.field_933_a != null) {
+ if(this.message.length() > 0 && !this.message.endsWith(" ")) {
+ this.message = this.message + " ";
+ }
+
+ this.message = this.message + this.mc.ingameGUI.field_933_a;
+ byte var4 = 100;
+ if(this.message.length() > var4) {
+ this.message = this.message.substring(0, var4);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiChest.java b/src/main/java/net/minecraft/src/GuiChest.java
new file mode 100644
index 0000000..d6f312f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiChest.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class GuiChest extends GuiContainer {
+ private IInventory field_982_j;
+ private IInventory field_981_l;
+ private int field_980_m = 0;
+
+ public GuiChest(IInventory var1, IInventory var2) {
+ this.field_982_j = var1;
+ this.field_981_l = var2;
+ this.field_948_f = false;
+ short var3 = 222;
+ int var4 = var3 - 108;
+ this.field_980_m = var2.getSizeInventory() / 9;
+ this.ySize = var4 + this.field_980_m * 18;
+ int var5 = (this.field_980_m - 4) * 18;
+
+ int var6;
+ int var7;
+ for(var6 = 0; var6 < this.field_980_m; ++var6) {
+ for(var7 = 0; var7 < 9; ++var7) {
+ this.inventorySlots.add(new SlotInventory(this, var2, var7 + var6 * 9, 8 + var7 * 18, 18 + var6 * 18));
+ }
+ }
+
+ for(var6 = 0; var6 < 3; ++var6) {
+ for(var7 = 0; var7 < 9; ++var7) {
+ this.inventorySlots.add(new SlotInventory(this, var1, var7 + (var6 + 1) * 9, 8 + var7 * 18, 103 + var6 * 18 + var5));
+ }
+ }
+
+ for(var6 = 0; var6 < 9; ++var6) {
+ this.inventorySlots.add(new SlotInventory(this, var1, var6, 8 + var6 * 18, 161 + var5));
+ }
+
+ }
+
+ protected void drawGuiContainerForegroundLayer() {
+ this.fontRenderer.drawString(this.field_981_l.getInvName(), 8, 6, 4210752);
+ this.fontRenderer.drawString(this.field_982_j.getInvName(), 8, this.ySize - 96 + 2, 4210752);
+ }
+
+ protected void drawGuiContainerBackgroundLayer(float var1) {
+ int var2 = this.mc.renderEngine.getTexture("/gui/container.png");
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ this.mc.renderEngine.bindTexture(var2);
+ int var3 = (this.width - this.xSize) / 2;
+ int var4 = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(var3, var4, 0, 0, this.xSize, this.field_980_m * 18 + 17);
+ this.drawTexturedModalRect(var3, var4 + this.field_980_m * 18 + 17, 0, 126, this.xSize, 96);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiConflictWarning.java b/src/main/java/net/minecraft/src/GuiConflictWarning.java
new file mode 100644
index 0000000..9abddce
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiConflictWarning.java
@@ -0,0 +1,33 @@
+package net.minecraft.src;
+
+public class GuiConflictWarning extends GuiScreen {
+ private int updateCounter = 0;
+
+ public void updateScreen() {
+ ++this.updateCounter;
+ }
+
+ public void initGui() {
+ this.controlList.clear();
+ this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120 + 12, "Back to title screen"));
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ if(var1.enabled) {
+ if(var1.id == 0) {
+ this.mc.displayGuiScreen(new GuiMainMenu());
+ }
+
+ }
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ this.drawCenteredString(this.fontRenderer, "Level save conflict", this.width / 2, this.height / 4 - 60 + 20, 16777215);
+ this.drawString(this.fontRenderer, "Minecraft detected a conflict in the level save data.", this.width / 2 - 140, this.height / 4 - 60 + 60 + 0, 10526880);
+ this.drawString(this.fontRenderer, "This could be caused by two copies of the game", this.width / 2 - 140, this.height / 4 - 60 + 60 + 18, 10526880);
+ this.drawString(this.fontRenderer, "accessing the same level.", this.width / 2 - 140, this.height / 4 - 60 + 60 + 27, 10526880);
+ this.drawString(this.fontRenderer, "To prevent level corruption, the current game has quit.", this.width / 2 - 140, this.height / 4 - 60 + 60 + 45, 10526880);
+ super.drawScreen(var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiConnectFailed.java b/src/main/java/net/minecraft/src/GuiConnectFailed.java
new file mode 100644
index 0000000..da51556
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiConnectFailed.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+public class GuiConnectFailed extends GuiScreen {
+ private String errorMessage;
+ private String errorDetail;
+
+ public GuiConnectFailed(String var1, String var2) {
+ this.errorMessage = var1;
+ this.errorDetail = var2;
+ }
+
+ public void updateScreen() {
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ }
+
+ public void initGui() {
+ this.controlList.clear();
+ this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120 + 12, "Back to title screen"));
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ if(var1.id == 0) {
+ this.mc.displayGuiScreen(new GuiMainMenu());
+ }
+
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ this.drawCenteredString(this.fontRenderer, this.errorMessage, this.width / 2, this.height / 2 - 50, 16777215);
+ this.drawCenteredString(this.fontRenderer, this.errorDetail, this.width / 2, this.height / 2 - 10, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiContainer.java b/src/main/java/net/minecraft/src/GuiContainer.java
new file mode 100644
index 0000000..5a2b603
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiContainer.java
@@ -0,0 +1,229 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public abstract class GuiContainer extends GuiScreen {
+ private static RenderItem itemRenderer = new RenderItem();
+ protected int xSize = 176;
+ protected int ySize = 166;
+ protected List inventorySlots = new ArrayList();
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ int var4 = (this.width - this.xSize) / 2;
+ int var5 = (this.height - this.ySize) / 2;
+ this.drawGuiContainerBackgroundLayer(var3);
+ GL11.glPushMatrix();
+ GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F);
+ RenderHelper.enableStandardItemLighting();
+ GL11.glPopMatrix();
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var4, (float)var5, 0.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+
+ for(int var6 = 0; var6 < this.inventorySlots.size(); ++var6) {
+ SlotInventory var7 = (SlotInventory)this.inventorySlots.get(var6);
+ this.drawSlotInventory(var7);
+ if(var7.isAtCursorPos(var1, var2)) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ int var8 = var7.xPos;
+ int var9 = var7.yPos;
+ this.drawGradientRect(var8, var9, var8 + 16, var9 + 16, -2130706433, -2130706433);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ }
+ }
+
+ InventoryPlayer var10 = this.mc.thePlayer.inventory;
+ if(var10.draggingItemStack != null) {
+ GL11.glTranslatef(0.0F, 0.0F, 32.0F);
+ itemRenderer.renderItemIntoGUI(this.fontRenderer, this.mc.renderEngine, var10.draggingItemStack, var1 - var4 - 8, var2 - var5 - 8);
+ itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, var10.draggingItemStack, var1 - var4 - 8, var2 - var5 - 8);
+ }
+
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ RenderHelper.disableStandardItemLighting();
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ this.drawGuiContainerForegroundLayer();
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL11.glPopMatrix();
+ }
+
+ protected void drawGuiContainerForegroundLayer() {
+ }
+
+ protected abstract void drawGuiContainerBackgroundLayer(float var1);
+
+ private void drawSlotInventory(SlotInventory var1) {
+ IInventory var2 = var1.inventory;
+ int var3 = var1.slotIndex;
+ int var4 = var1.xPos;
+ int var5 = var1.yPos;
+ ItemStack var6 = var2.getStackInSlot(var3);
+ if(var6 == null) {
+ int var7 = var1.func_775_c();
+ if(var7 >= 0) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ this.mc.renderEngine.bindTexture(this.mc.renderEngine.getTexture("/gui/items.png"));
+ this.drawTexturedModalRect(var4, var5, var7 % 16 * 16, var7 / 16 * 16, 16, 16);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ return;
+ }
+ }
+
+ itemRenderer.renderItemIntoGUI(this.fontRenderer, this.mc.renderEngine, var6, var4, var5);
+ itemRenderer.renderItemOverlayIntoGUI(this.fontRenderer, this.mc.renderEngine, var6, var4, var5);
+ }
+
+ private Slot getSlotAtPosition(int var1, int var2) {
+ for(int var3 = 0; var3 < this.inventorySlots.size(); ++var3) {
+ SlotInventory var4 = (SlotInventory)this.inventorySlots.get(var3);
+ if(var4.isAtCursorPos(var1, var2)) {
+ return var4;
+ }
+ }
+
+ return null;
+ }
+
+ protected void mouseClicked(int var1, int var2, int var3) {
+ if(var3 == 0 || var3 == 1) {
+ Slot var4 = this.getSlotAtPosition(var1, var2);
+ InventoryPlayer var5 = this.mc.thePlayer.inventory;
+ int var7;
+ if(var4 != null) {
+ ItemStack var6 = var4.getStack();
+ if(var6 != null || var5.draggingItemStack != null) {
+ if(var6 != null && var5.draggingItemStack == null) {
+ var7 = var3 == 0 ? var6.stackSize : (var6.stackSize + 1) / 2;
+ var5.draggingItemStack = var4.inventory.decrStackSize(var4.slotIndex, var7);
+ if(var6.stackSize == 0) {
+ var4.putStack((ItemStack)null);
+ }
+
+ var4.onPickupFromSlot();
+ } else if(var6 == null && var5.draggingItemStack != null && var4.isItemValid(var5.draggingItemStack)) {
+ var7 = var3 == 0 ? var5.draggingItemStack.stackSize : 1;
+ if(var7 > var4.getSlotStackLimit()) {
+ var7 = var4.getSlotStackLimit();
+ }
+
+ var4.putStack(var5.draggingItemStack.splitStack(var7));
+ if(var5.draggingItemStack.stackSize == 0) {
+ var5.draggingItemStack = null;
+ }
+ } else if(var6 != null && var5.draggingItemStack != null) {
+ if(var4.isItemValid(var5.draggingItemStack)) {
+ if(var6.itemID != var5.draggingItemStack.itemID) {
+ if(var5.draggingItemStack.stackSize <= var4.getSlotStackLimit()) {
+ var4.putStack(var5.draggingItemStack);
+ var5.draggingItemStack = var6;
+ }
+ } else if(var6.itemID == var5.draggingItemStack.itemID) {
+ if(var3 == 0) {
+ var7 = var5.draggingItemStack.stackSize;
+ if(var7 > var4.getSlotStackLimit() - var6.stackSize) {
+ var7 = var4.getSlotStackLimit() - var6.stackSize;
+ }
+
+ if(var7 > var5.draggingItemStack.getMaxStackSize() - var6.stackSize) {
+ var7 = var5.draggingItemStack.getMaxStackSize() - var6.stackSize;
+ }
+
+ var5.draggingItemStack.splitStack(var7);
+ if(var5.draggingItemStack.stackSize == 0) {
+ var5.draggingItemStack = null;
+ }
+
+ var6.stackSize += var7;
+ } else if(var3 == 1) {
+ var7 = 1;
+ if(var7 > var4.getSlotStackLimit() - var6.stackSize) {
+ var7 = var4.getSlotStackLimit() - var6.stackSize;
+ }
+
+ if(var7 > var5.draggingItemStack.getMaxStackSize() - var6.stackSize) {
+ var7 = var5.draggingItemStack.getMaxStackSize() - var6.stackSize;
+ }
+
+ var5.draggingItemStack.splitStack(var7);
+ if(var5.draggingItemStack.stackSize == 0) {
+ var5.draggingItemStack = null;
+ }
+
+ var6.stackSize += var7;
+ }
+ }
+ } else if(var6.itemID == var5.draggingItemStack.itemID && var5.draggingItemStack.getMaxStackSize() > 1) {
+ var7 = var6.stackSize;
+ if(var7 > 0 && var7 + var5.draggingItemStack.stackSize <= var5.draggingItemStack.getMaxStackSize()) {
+ var5.draggingItemStack.stackSize += var7;
+ var6.splitStack(var7);
+ if(var6.stackSize == 0) {
+ var4.putStack((ItemStack)null);
+ }
+
+ var4.onPickupFromSlot();
+ }
+ }
+ }
+ }
+
+ var4.onSlotChanged();
+ } else if(var5.draggingItemStack != null) {
+ int var9 = (this.width - this.xSize) / 2;
+ var7 = (this.height - this.ySize) / 2;
+ if(var1 < var9 || var2 < var7 || var1 >= var9 + this.xSize || var2 >= var7 + this.xSize) {
+ EntityPlayerSP var8 = this.mc.thePlayer;
+ if(var3 == 0) {
+ var8.dropPlayerItem(var5.draggingItemStack);
+ var5.draggingItemStack = null;
+ }
+
+ if(var3 == 1) {
+ var8.dropPlayerItem(var5.draggingItemStack.splitStack(1));
+ if(var5.draggingItemStack.stackSize == 0) {
+ var5.draggingItemStack = null;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ protected void mouseMovedOrUp(int var1, int var2, int var3) {
+ if(var3 == 0) {
+ }
+
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ if(var2 == 1 || var2 == this.mc.gameSettings.keyBindInventory.keyCode) {
+ this.mc.displayGuiScreen((GuiScreen)null);
+ }
+
+ }
+
+ public void onGuiClosed() {
+ if(this.mc.thePlayer != null) {
+ InventoryPlayer var1 = this.mc.thePlayer.inventory;
+ if(var1.draggingItemStack != null) {
+ this.mc.thePlayer.dropPlayerItem(var1.draggingItemStack);
+ var1.draggingItemStack = null;
+ }
+
+ }
+ }
+
+ public boolean doesGuiPauseGame() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiControls.java b/src/main/java/net/minecraft/src/GuiControls.java
new file mode 100644
index 0000000..53580ed
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiControls.java
@@ -0,0 +1,52 @@
+package net.minecraft.src;
+
+public class GuiControls extends GuiScreen {
+ private GuiScreen parentScreen;
+ protected String screenTitle = "Controls";
+ private GameSettings options;
+ private int buttonId = -1;
+
+ public GuiControls(GuiScreen var1, GameSettings var2) {
+ this.parentScreen = var1;
+ this.options = var2;
+ }
+
+ public void initGui() {
+ for(int var1 = 0; var1 < this.options.keyBindings.length; ++var1) {
+ this.controlList.add(new GuiSmallButton(var1, this.width / 2 - 155 + var1 % 2 * 160, this.height / 6 + 24 * (var1 >> 1), this.options.getKeyBinding(var1)));
+ }
+
+ this.controlList.add(new GuiButton(200, this.width / 2 - 100, this.height / 6 + 168, "Done"));
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ for(int var2 = 0; var2 < this.options.keyBindings.length; ++var2) {
+ ((GuiButton)this.controlList.get(var2)).displayString = this.options.getKeyBinding(var2);
+ }
+
+ if(var1.id == 200) {
+ this.mc.displayGuiScreen(this.parentScreen);
+ } else {
+ this.buttonId = var1.id;
+ var1.displayString = "> " + this.options.getKeyBinding(var1.id) + " <";
+ }
+
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ if(this.buttonId >= 0) {
+ this.options.setKeyBinding(this.buttonId, var2);
+ ((GuiButton)this.controlList.get(this.buttonId)).displayString = this.options.getKeyBinding(this.buttonId);
+ this.buttonId = -1;
+ } else {
+ super.keyTyped(var1, var2);
+ }
+
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiCrafting.java b/src/main/java/net/minecraft/src/GuiCrafting.java
new file mode 100644
index 0000000..7a3deca
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiCrafting.java
@@ -0,0 +1,49 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class GuiCrafting extends GuiContainer {
+ public CraftingInventoryWorkbenchCB field_979_j = new CraftingInventoryWorkbenchCB();
+
+ public GuiCrafting(InventoryPlayer var1) {
+ this.inventorySlots.add(new SlotCrafting(this, this.field_979_j.craftMatrix, this.field_979_j.craftResult, 0, 124, 35));
+
+ int var2;
+ int var3;
+ for(var2 = 0; var2 < 3; ++var2) {
+ for(var3 = 0; var3 < 3; ++var3) {
+ this.inventorySlots.add(new SlotInventory(this, this.field_979_j.craftMatrix, var3 + var2 * 3, 30 + var3 * 18, 17 + var2 * 18));
+ }
+ }
+
+ for(var2 = 0; var2 < 3; ++var2) {
+ for(var3 = 0; var3 < 9; ++var3) {
+ this.inventorySlots.add(new SlotInventory(this, var1, var3 + (var2 + 1) * 9, 8 + var3 * 18, 84 + var2 * 18));
+ }
+ }
+
+ for(var2 = 0; var2 < 9; ++var2) {
+ this.inventorySlots.add(new SlotInventory(this, var1, var2, 8 + var2 * 18, 142));
+ }
+
+ }
+
+ public void onGuiClosed() {
+ super.onGuiClosed();
+ this.field_979_j.onCraftGuiClosed(this.mc.thePlayer);
+ }
+
+ protected void drawGuiContainerForegroundLayer() {
+ this.fontRenderer.drawString("Crafting", 28, 6, 4210752);
+ this.fontRenderer.drawString("Inventory", 8, this.ySize - 96 + 2, 4210752);
+ }
+
+ protected void drawGuiContainerBackgroundLayer(float var1) {
+ int var2 = this.mc.renderEngine.getTexture("/gui/crafting.png");
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ this.mc.renderEngine.bindTexture(var2);
+ int var3 = (this.width - this.xSize) / 2;
+ int var4 = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(var3, var4, 0, 0, this.xSize, this.ySize);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiDeleteWorld.java b/src/main/java/net/minecraft/src/GuiDeleteWorld.java
new file mode 100644
index 0000000..5da0735
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiDeleteWorld.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.File;
+import net.minecraft.client.Minecraft;
+
+public class GuiDeleteWorld extends GuiSelectWorld {
+ public GuiDeleteWorld(GuiScreen var1) {
+ super(var1);
+ this.screenTitle = "Delete world";
+ }
+
+ public void initGui2() {
+ this.controlList.add(new GuiButton(6, this.width / 2 - 100, this.height / 6 + 168, "Cancel"));
+ }
+
+ public void selectWorld(int var1) {
+ String var2 = this.getWorldName(var1);
+ if(var2 != null) {
+ this.mc.displayGuiScreen(new GuiYesNo(this, "Are you sure you want to delete this world?", "\'" + var2 + "\' will be lost forever!", var1));
+ }
+
+ }
+
+ public void deleteWorld(boolean var1, int var2) {
+ if(var1) {
+ File var3 = Minecraft.getMinecraftDir();
+ World.deleteWorld(var3, this.getWorldName(var2));
+ }
+
+ this.mc.displayGuiScreen(this.parentScreen);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiEditSign.java b/src/main/java/net/minecraft/src/GuiEditSign.java
new file mode 100644
index 0000000..7e1d435
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiEditSign.java
@@ -0,0 +1,100 @@
+package net.minecraft.src;
+
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.opengl.GL11;
+
+public class GuiEditSign extends GuiScreen {
+ protected String screenTitle = "Edit sign message:";
+ private TileEntitySign entitySign;
+ private int updateCounter;
+ private int editLine = 0;
+
+ public GuiEditSign(TileEntitySign var1) {
+ this.entitySign = var1;
+ }
+
+ public void initGui() {
+ this.controlList.clear();
+ Keyboard.enableRepeatEvents(true);
+ this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120, "Done"));
+ }
+
+ public void onGuiClosed() {
+ Keyboard.enableRepeatEvents(false);
+ }
+
+ public void updateScreen() {
+ ++this.updateCounter;
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ if(var1.enabled) {
+ if(var1.id == 0) {
+ this.entitySign.onInventoryChanged();
+ this.mc.displayGuiScreen((GuiScreen)null);
+ }
+
+ }
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ if(var2 == 200) {
+ this.editLine = this.editLine - 1 & 3;
+ }
+
+ if(var2 == 208 || var2 == 28) {
+ this.editLine = this.editLine + 1 & 3;
+ }
+
+ if(var2 == 14 && this.entitySign.signText[this.editLine].length() > 0) {
+ this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine].substring(0, this.entitySign.signText[this.editLine].length() - 1);
+ }
+
+ if(" !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\'abcdefghijklmnopqrstuvwxyz{|}~\u2302\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb".indexOf(var1) >= 0 && this.entitySign.signText[this.editLine].length() < 15) {
+ this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine] + var1;
+ }
+
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 40, 16777215);
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)(this.width / 2), (float)(this.height / 2), 50.0F);
+ float var4 = 93.75F;
+ GL11.glScalef(-var4, -var4, -var4);
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ Block var5 = this.entitySign.getBlockType();
+ if(var5 == Block.signPost) {
+ float var6 = (float)(this.entitySign.getBlockMetadata() * 360) / 16.0F;
+ GL11.glRotatef(var6, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(0.0F, 5.0F / 16.0F, 0.0F);
+ } else {
+ int var8 = this.entitySign.getBlockMetadata();
+ float var7 = 0.0F;
+ if(var8 == 2) {
+ var7 = 180.0F;
+ }
+
+ if(var8 == 4) {
+ var7 = 90.0F;
+ }
+
+ if(var8 == 5) {
+ var7 = -90.0F;
+ }
+
+ GL11.glRotatef(var7, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(0.0F, 5.0F / 16.0F, 0.0F);
+ }
+
+ if(this.updateCounter / 6 % 2 == 0) {
+ this.entitySign.lineBeingEdited = this.editLine;
+ }
+
+ TileEntityRenderer.instance.renderTileEntityAt(this.entitySign, -0.5D, -0.75D, -0.5D, 0.0F);
+ this.entitySign.lineBeingEdited = -1;
+ GL11.glPopMatrix();
+ super.drawScreen(var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiFurnace.java b/src/main/java/net/minecraft/src/GuiFurnace.java
new file mode 100644
index 0000000..f576c7e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiFurnace.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class GuiFurnace extends GuiContainer {
+ private TileEntityFurnace field_978_j;
+
+ public GuiFurnace(InventoryPlayer var1, TileEntityFurnace var2) {
+ this.field_978_j = var2;
+ this.inventorySlots.add(new SlotInventory(this, var2, 0, 56, 17));
+ this.inventorySlots.add(new SlotInventory(this, var2, 1, 56, 53));
+ this.inventorySlots.add(new SlotInventory(this, var2, 2, 116, 35));
+
+ int var3;
+ for(var3 = 0; var3 < 3; ++var3) {
+ for(int var4 = 0; var4 < 9; ++var4) {
+ this.inventorySlots.add(new SlotInventory(this, var1, var4 + (var3 + 1) * 9, 8 + var4 * 18, 84 + var3 * 18));
+ }
+ }
+
+ for(var3 = 0; var3 < 9; ++var3) {
+ this.inventorySlots.add(new SlotInventory(this, var1, var3, 8 + var3 * 18, 142));
+ }
+
+ }
+
+ protected void drawGuiContainerForegroundLayer() {
+ this.fontRenderer.drawString("Furnace", 60, 6, 4210752);
+ this.fontRenderer.drawString("Inventory", 8, this.ySize - 96 + 2, 4210752);
+ }
+
+ protected void drawGuiContainerBackgroundLayer(float var1) {
+ int var2 = this.mc.renderEngine.getTexture("/gui/furnace.png");
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ this.mc.renderEngine.bindTexture(var2);
+ int var3 = (this.width - this.xSize) / 2;
+ int var4 = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(var3, var4, 0, 0, this.xSize, this.ySize);
+ int var5;
+ if(this.field_978_j.isBurning()) {
+ var5 = this.field_978_j.getBurnTimeRemainingScaled(12);
+ this.drawTexturedModalRect(var3 + 56, var4 + 36 + 12 - var5, 176, 12 - var5, 14, var5 + 2);
+ }
+
+ var5 = this.field_978_j.getCookProgressScaled(24);
+ this.drawTexturedModalRect(var3 + 79, var4 + 34, 176, 14, var5 + 1, 16);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiGameOver.java b/src/main/java/net/minecraft/src/GuiGameOver.java
new file mode 100644
index 0000000..7e3d706
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiGameOver.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class GuiGameOver extends GuiScreen {
+ public void initGui() {
+ this.controlList.clear();
+ this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 72, "Respawn"));
+ this.controlList.add(new GuiButton(2, this.width / 2 - 100, this.height / 4 + 96, "Title menu"));
+ if(this.mc.field_6320_i == null) {
+ ((GuiButton)this.controlList.get(1)).enabled = false;
+ }
+
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ if(var1.id == 0) {
+ }
+
+ if(var1.id == 1) {
+ this.mc.thePlayer.func_9367_r();
+ this.mc.displayGuiScreen((GuiScreen)null);
+ }
+
+ if(var1.id == 2) {
+ this.mc.func_6261_a((World)null);
+ this.mc.displayGuiScreen(new GuiMainMenu());
+ }
+
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawGradientRect(0, 0, this.width, this.height, 1615855616, -1602211792);
+ GL11.glPushMatrix();
+ GL11.glScalef(2.0F, 2.0F, 2.0F);
+ this.drawCenteredString(this.fontRenderer, "Game over!", this.width / 2 / 2, 30, 16777215);
+ GL11.glPopMatrix();
+ this.drawCenteredString(this.fontRenderer, "Score: &e" + this.mc.thePlayer.func_6417_t(), this.width / 2, 100, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+
+ public boolean doesGuiPauseGame() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiIngame.java b/src/main/java/net/minecraft/src/GuiIngame.java
new file mode 100644
index 0000000..fa1ff18
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiIngame.java
@@ -0,0 +1,371 @@
+package net.minecraft.src;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import net.minecraft.client.Minecraft;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class GuiIngame extends Gui {
+ private static RenderItem itemRenderer = new RenderItem();
+ private List chatMessageList = new ArrayList();
+ private Random rand = new Random();
+ private Minecraft mc;
+ public String field_933_a = null;
+ private int updateCounter = 0;
+ private String field_9420_i = "";
+ private int field_9419_j = 0;
+ public float field_6446_b;
+ float field_931_c = 1.0F;
+
+ public GuiIngame(Minecraft var1) {
+ this.mc = var1;
+ }
+
+ public void renderGameOverlay(float var1, boolean var2, int var3, int var4) {
+ ScaledResolution var5 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight);
+ int var6 = var5.getScaledWidth();
+ int var7 = var5.getScaledHeight();
+ FontRenderer var8 = this.mc.fontRenderer;
+ this.mc.field_9243_r.func_905_b();
+ GL11.glEnable(GL11.GL_BLEND);
+ if(this.mc.gameSettings.fancyGraphics) {
+ this.func_4064_a(this.mc.thePlayer.getEntityBrightness(var1), var6, var7);
+ }
+
+ ItemStack var9 = this.mc.thePlayer.inventory.armorItemInSlot(3);
+ if(!this.mc.gameSettings.thirdPersonView && var9 != null && var9.itemID == Block.pumpkin.blockID) {
+ this.func_4063_a(var6, var7);
+ }
+
+ float var10 = this.mc.thePlayer.field_4133_d + (this.mc.thePlayer.field_4134_c - this.mc.thePlayer.field_4133_d) * var1;
+ if(var10 > 0.0F) {
+ this.func_4065_b(var10, var6, var7);
+ }
+
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/gui.png"));
+ InventoryPlayer var11 = this.mc.thePlayer.inventory;
+ this.zLevel = -90.0F;
+ this.drawTexturedModalRect(var6 / 2 - 91, var7 - 22, 0, 0, 182, 22);
+ this.drawTexturedModalRect(var6 / 2 - 91 - 1 + var11.currentItem * 20, var7 - 22 - 1, 0, 22, 24, 22);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/icons.png"));
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_ONE_MINUS_DST_COLOR, GL11.GL_ONE_MINUS_SRC_COLOR);
+ this.drawTexturedModalRect(var6 / 2 - 7, var7 / 2 - 7, 0, 0, 16, 16);
+ GL11.glDisable(GL11.GL_BLEND);
+ boolean var12 = this.mc.thePlayer.field_9306_bj / 3 % 2 == 1;
+ if(this.mc.thePlayer.field_9306_bj < 10) {
+ var12 = false;
+ }
+
+ int var13 = this.mc.thePlayer.health;
+ int var14 = this.mc.thePlayer.field_9335_K;
+ this.rand.setSeed((long)(this.updateCounter * 312871));
+ int var15;
+ int var16;
+ int var17;
+ if(this.mc.field_6327_b.func_6469_d()) {
+ var15 = this.mc.thePlayer.getPlayerArmorValue();
+
+ int var18;
+ for(var16 = 0; var16 < 10; ++var16) {
+ var17 = var7 - 32;
+ if(var15 > 0) {
+ var18 = var6 / 2 + 91 - var16 * 8 - 9;
+ if(var16 * 2 + 1 < var15) {
+ this.drawTexturedModalRect(var18, var17, 34, 9, 9, 9);
+ }
+
+ if(var16 * 2 + 1 == var15) {
+ this.drawTexturedModalRect(var18, var17, 25, 9, 9, 9);
+ }
+
+ if(var16 * 2 + 1 > var15) {
+ this.drawTexturedModalRect(var18, var17, 16, 9, 9, 9);
+ }
+ }
+
+ byte var27 = 0;
+ if(var12) {
+ var27 = 1;
+ }
+
+ int var19 = var6 / 2 - 91 + var16 * 8;
+ if(var13 <= 4) {
+ var17 += this.rand.nextInt(2);
+ }
+
+ this.drawTexturedModalRect(var19, var17, 16 + var27 * 9, 0, 9, 9);
+ if(var12) {
+ if(var16 * 2 + 1 < var14) {
+ this.drawTexturedModalRect(var19, var17, 70, 0, 9, 9);
+ }
+
+ if(var16 * 2 + 1 == var14) {
+ this.drawTexturedModalRect(var19, var17, 79, 0, 9, 9);
+ }
+ }
+
+ if(var16 * 2 + 1 < var13) {
+ this.drawTexturedModalRect(var19, var17, 52, 0, 9, 9);
+ }
+
+ if(var16 * 2 + 1 == var13) {
+ this.drawTexturedModalRect(var19, var17, 61, 0, 9, 9);
+ }
+ }
+
+ if(this.mc.thePlayer.isInsideOfMaterial(Material.water)) {
+ var16 = (int)Math.ceil((double)(this.mc.thePlayer.air - 2) * 10.0D / 300.0D);
+ var17 = (int)Math.ceil((double)this.mc.thePlayer.air * 10.0D / 300.0D) - var16;
+
+ for(var18 = 0; var18 < var16 + var17; ++var18) {
+ if(var18 < var16) {
+ this.drawTexturedModalRect(var6 / 2 - 91 + var18 * 8, var7 - 32 - 9, 16, 18, 9, 9);
+ } else {
+ this.drawTexturedModalRect(var6 / 2 - 91 + var18 * 8, var7 - 32 - 9, 25, 18, 9, 9);
+ }
+ }
+ }
+ }
+
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPushMatrix();
+ GL11.glRotatef(180.0F, 1.0F, 0.0F, 0.0F);
+ RenderHelper.enableStandardItemLighting();
+ GL11.glPopMatrix();
+
+ for(var15 = 0; var15 < 9; ++var15) {
+ var16 = var6 / 2 - 90 + var15 * 20 + 2;
+ var17 = var7 - 16 - 3;
+ this.func_554_a(var15, var16, var17, var1);
+ }
+
+ RenderHelper.disableStandardItemLighting();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ String var23;
+ if(Keyboard.getEventKey() == 33 && Keyboard.isKeyDown(4)) {
+ var8.drawStringWithShadow("Minecraft Alpha v1.2.6 (" + this.mc.field_6292_I + ")", 2, 2, 16777215);
+ var8.drawStringWithShadow(this.mc.func_6241_m(), 2, 12, 16777215);
+ var8.drawStringWithShadow(this.mc.func_6262_n(), 2, 22, 16777215);
+ var8.drawStringWithShadow(this.mc.func_6245_o(), 2, 32, 16777215);
+ long var24 = Runtime.getRuntime().maxMemory();
+ long var29 = Runtime.getRuntime().totalMemory();
+ long var30 = Runtime.getRuntime().freeMemory();
+ long var21 = var29 - var30;
+ var23 = "Used memory: " + var21 * 100L / var24 + "% (" + var21 / 1024L / 1024L + "MB) of " + var24 / 1024L / 1024L + "MB";
+ this.drawString(var8, var23, var6 - var8.getStringWidth(var23) - 2, 2, 14737632);
+ var23 = "Allocated memory: " + var29 * 100L / var24 + "% (" + var29 / 1024L / 1024L + "MB)";
+ this.drawString(var8, var23, var6 - var8.getStringWidth(var23) - 2, 12, 14737632);
+ this.drawString(var8, "x: " + this.mc.thePlayer.posX, 2, 64, 14737632);
+ this.drawString(var8, "y: " + this.mc.thePlayer.posY, 2, 72, 14737632);
+ this.drawString(var8, "z: " + this.mc.thePlayer.posZ, 2, 80, 14737632);
+ } else {
+ var8.drawStringWithShadow("Minecraft Alpha v1.2.6", 2, 2, 16777215);
+ }
+
+ if(this.field_9419_j > 0) {
+ float var25 = (float)this.field_9419_j - var1;
+ var16 = (int)(var25 * 256.0F / 20.0F);
+ if(var16 > 255) {
+ var16 = 255;
+ }
+
+ if(var16 > 0) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)(var6 / 2), (float)(var7 - 48), 0.0F);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ var17 = Color.HSBtoRGB(var25 / 50.0F, 0.7F, 0.6F) & 16777215;
+ var8.drawString(this.field_9420_i, -var8.getStringWidth(this.field_9420_i) / 2, -4, var17 + (var16 << 24));
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glPopMatrix();
+ }
+ }
+
+ byte var26 = 10;
+ boolean var28 = false;
+ if(this.mc.currentScreen instanceof GuiChat) {
+ var26 = 20;
+ var28 = true;
+ }
+
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glPushMatrix();
+ GL11.glTranslatef(0.0F, (float)(var7 - 48), 0.0F);
+
+ for(var17 = 0; var17 < this.chatMessageList.size() && var17 < var26; ++var17) {
+ if(((ChatLine)this.chatMessageList.get(var17)).updateCounter < 200 || var28) {
+ double var31 = (double)((ChatLine)this.chatMessageList.get(var17)).updateCounter / 200.0D;
+ var31 = 1.0D - var31;
+ var31 *= 10.0D;
+ if(var31 < 0.0D) {
+ var31 = 0.0D;
+ }
+
+ if(var31 > 1.0D) {
+ var31 = 1.0D;
+ }
+
+ var31 *= var31;
+ int var20 = (int)(255.0D * var31);
+ if(var28) {
+ var20 = 255;
+ }
+
+ if(var20 > 0) {
+ byte var32 = 2;
+ int var22 = -var17 * 9;
+ var23 = ((ChatLine)this.chatMessageList.get(var17)).message;
+ this.drawRect(var32, var22 - 1, var32 + 320, var22 + 8, var20 / 2 << 24);
+ GL11.glEnable(GL11.GL_BLEND);
+ var8.drawStringWithShadow(var23, var32, var22, 16777215 + (var20 << 24));
+ }
+ }
+ }
+
+ GL11.glPopMatrix();
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+
+ private void func_4063_a(int var1, int var2) {
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glDepthMask(false);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("%blur%/misc/pumpkinblur.png"));
+ Tessellator var3 = Tessellator.instance;
+ var3.startDrawingQuads();
+ var3.addVertexWithUV(0.0D, (double)var2, -90.0D, 0.0D, 1.0D);
+ var3.addVertexWithUV((double)var1, (double)var2, -90.0D, 1.0D, 1.0D);
+ var3.addVertexWithUV((double)var1, 0.0D, -90.0D, 1.0D, 0.0D);
+ var3.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D);
+ var3.draw();
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ private void func_4064_a(float var1, int var2, int var3) {
+ var1 = 1.0F - var1;
+ if(var1 < 0.0F) {
+ var1 = 0.0F;
+ }
+
+ if(var1 > 1.0F) {
+ var1 = 1.0F;
+ }
+
+ this.field_931_c = (float)((double)this.field_931_c + (double)(var1 - this.field_931_c) * 0.01D);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glDepthMask(false);
+ GL11.glBlendFunc(GL11.GL_ZERO, GL11.GL_ONE_MINUS_SRC_COLOR);
+ GL11.glColor4f(this.field_931_c, this.field_931_c, this.field_931_c, 1.0F);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("%blur%/misc/vignette.png"));
+ Tessellator var4 = Tessellator.instance;
+ var4.startDrawingQuads();
+ var4.addVertexWithUV(0.0D, (double)var3, -90.0D, 0.0D, 1.0D);
+ var4.addVertexWithUV((double)var2, (double)var3, -90.0D, 1.0D, 1.0D);
+ var4.addVertexWithUV((double)var2, 0.0D, -90.0D, 1.0D, 0.0D);
+ var4.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D);
+ var4.draw();
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ private void func_4065_b(float var1, int var2, int var3) {
+ var1 *= var1;
+ var1 *= var1;
+ var1 = var1 * 0.8F + 0.2F;
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glDepthMask(false);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, var1);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png"));
+ float var4 = (float)(Block.portal.blockIndexInTexture % 16) / 16.0F;
+ float var5 = (float)(Block.portal.blockIndexInTexture / 16) / 16.0F;
+ float var6 = (float)(Block.portal.blockIndexInTexture % 16 + 1) / 16.0F;
+ float var7 = (float)(Block.portal.blockIndexInTexture / 16 + 1) / 16.0F;
+ Tessellator var8 = Tessellator.instance;
+ var8.startDrawingQuads();
+ var8.addVertexWithUV(0.0D, (double)var3, -90.0D, (double)var4, (double)var7);
+ var8.addVertexWithUV((double)var2, (double)var3, -90.0D, (double)var6, (double)var7);
+ var8.addVertexWithUV((double)var2, 0.0D, -90.0D, (double)var6, (double)var5);
+ var8.addVertexWithUV(0.0D, 0.0D, -90.0D, (double)var4, (double)var5);
+ var8.draw();
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ private void func_554_a(int var1, int var2, int var3, float var4) {
+ ItemStack var5 = this.mc.thePlayer.inventory.mainInventory[var1];
+ if(var5 != null) {
+ float var6 = (float)var5.animationsToGo - var4;
+ if(var6 > 0.0F) {
+ GL11.glPushMatrix();
+ float var7 = 1.0F + var6 / 5.0F;
+ GL11.glTranslatef((float)(var2 + 8), (float)(var3 + 12), 0.0F);
+ GL11.glScalef(1.0F / var7, (var7 + 1.0F) / 2.0F, 1.0F);
+ GL11.glTranslatef((float)(-(var2 + 8)), (float)(-(var3 + 12)), 0.0F);
+ }
+
+ itemRenderer.renderItemIntoGUI(this.mc.fontRenderer, this.mc.renderEngine, var5, var2, var3);
+ if(var6 > 0.0F) {
+ GL11.glPopMatrix();
+ }
+
+ itemRenderer.renderItemOverlayIntoGUI(this.mc.fontRenderer, this.mc.renderEngine, var5, var2, var3);
+ }
+ }
+
+ public void func_555_a() {
+ if(this.field_9419_j > 0) {
+ --this.field_9419_j;
+ }
+
+ ++this.updateCounter;
+
+ for(int var1 = 0; var1 < this.chatMessageList.size(); ++var1) {
+ ++((ChatLine)this.chatMessageList.get(var1)).updateCounter;
+ }
+
+ }
+
+ public void addChatMessage(String var1) {
+ while(this.mc.fontRenderer.getStringWidth(var1) > 320) {
+ int var2;
+ for(var2 = 1; var2 < var1.length() && this.mc.fontRenderer.getStringWidth(var1.substring(0, var2 + 1)) <= 320; ++var2) {
+ }
+
+ this.addChatMessage(var1.substring(0, var2));
+ var1 = var1.substring(var2);
+ }
+
+ this.chatMessageList.add(0, new ChatLine(var1));
+
+ while(this.chatMessageList.size() > 50) {
+ this.chatMessageList.remove(this.chatMessageList.size() - 1);
+ }
+
+ }
+
+ public void func_553_b(String var1) {
+ this.field_9420_i = "Now playing: " + var1;
+ this.field_9419_j = 60;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiIngameMenu.java b/src/main/java/net/minecraft/src/GuiIngameMenu.java
new file mode 100644
index 0000000..1295abd
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiIngameMenu.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+public class GuiIngameMenu extends GuiScreen {
+ private int updateCounter2 = 0;
+ private int updateCounter = 0;
+
+ public void initGui() {
+ this.updateCounter2 = 0;
+ this.controlList.clear();
+ this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 48, "Save and quit to title"));
+ this.controlList.add(new GuiButton(4, this.width / 2 - 100, this.height / 4 + 24, "Back to game"));
+ this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96, "Options..."));
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ if(var1.id == 0) {
+ this.mc.displayGuiScreen(new GuiOptions(this, this.mc.gameSettings));
+ }
+
+ if(var1.id == 1) {
+ this.mc.func_6261_a((World)null);
+ this.mc.displayGuiScreen(new GuiMainMenu());
+ }
+
+ if(var1.id == 4) {
+ this.mc.displayGuiScreen((GuiScreen)null);
+ this.mc.func_6259_e();
+ }
+
+ }
+
+ public void updateScreen() {
+ super.updateScreen();
+ ++this.updateCounter;
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ boolean var4 = !this.mc.theWorld.func_650_a(this.updateCounter2++);
+ if(var4 || this.updateCounter < 20) {
+ float var5 = ((float)(this.updateCounter % 10) + var3) / 10.0F;
+ var5 = MathHelper.sin(var5 * (float)Math.PI * 2.0F) * 0.2F + 0.8F;
+ int var6 = (int)(255.0F * var5);
+ this.drawString(this.fontRenderer, "Saving level..", 8, this.height - 16, var6 << 16 | var6 << 8 | var6);
+ }
+
+ this.drawCenteredString(this.fontRenderer, "Game menu", this.width / 2, 40, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiInventory.java b/src/main/java/net/minecraft/src/GuiInventory.java
new file mode 100644
index 0000000..ec5fa5c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiInventory.java
@@ -0,0 +1,85 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class GuiInventory extends GuiContainer {
+ private CraftingInventoryPlayerCB field_977_j;
+ private float xSize_lo;
+ private float ySize_lo;
+
+ public GuiInventory(IInventory var1, ItemStack[] var2) {
+ this.field_948_f = true;
+ this.field_977_j = new CraftingInventoryPlayerCB(var2);
+ this.inventorySlots.add(new SlotCrafting(this, this.field_977_j.craftMatrix, this.field_977_j.craftResult, 0, 144, 36));
+
+ int var3;
+ int var4;
+ for(var3 = 0; var3 < 2; ++var3) {
+ for(var4 = 0; var4 < 2; ++var4) {
+ this.inventorySlots.add(new SlotInventory(this, this.field_977_j.craftMatrix, var4 + var3 * 2, 88 + var4 * 18, 26 + var3 * 18));
+ }
+ }
+
+ for(var3 = 0; var3 < 4; ++var3) {
+ this.inventorySlots.add(new SlotArmor(this, this, var1, var1.getSizeInventory() - 1 - var3, 8, 8 + var3 * 18, var3));
+ }
+
+ for(var3 = 0; var3 < 3; ++var3) {
+ for(var4 = 0; var4 < 9; ++var4) {
+ this.inventorySlots.add(new SlotInventory(this, var1, var4 + (var3 + 1) * 9, 8 + var4 * 18, 84 + var3 * 18));
+ }
+ }
+
+ for(var3 = 0; var3 < 9; ++var3) {
+ this.inventorySlots.add(new SlotInventory(this, var1, var3, 8 + var3 * 18, 142));
+ }
+
+ }
+
+ protected void drawGuiContainerForegroundLayer() {
+ this.fontRenderer.drawString("Crafting", 86, 16, 4210752);
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ super.drawScreen(var1, var2, var3);
+ this.xSize_lo = (float)var1;
+ this.ySize_lo = (float)var2;
+ }
+
+ protected void drawGuiContainerBackgroundLayer(float var1) {
+ int var2 = this.mc.renderEngine.getTexture("/gui/inventory.png");
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ this.mc.renderEngine.bindTexture(var2);
+ int var3 = (this.width - this.xSize) / 2;
+ int var4 = (this.height - this.ySize) / 2;
+ this.drawTexturedModalRect(var3, var4, 0, 0, this.xSize, this.ySize);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glEnable(GL11.GL_COLOR_MATERIAL);
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)(var3 + 51), (float)(var4 + 75), 50.0F);
+ float var5 = 30.0F;
+ GL11.glScalef(-var5, var5, var5);
+ GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
+ float var6 = this.mc.thePlayer.field_735_n;
+ float var7 = this.mc.thePlayer.rotationYaw;
+ float var8 = this.mc.thePlayer.rotationPitch;
+ float var9 = (float)(var3 + 51) - this.xSize_lo;
+ float var10 = (float)(var4 + 75 - 50) - this.ySize_lo;
+ GL11.glRotatef(135.0F, 0.0F, 1.0F, 0.0F);
+ RenderHelper.enableStandardItemLighting();
+ GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-((float)Math.atan((double)(var10 / 40.0F))) * 20.0F, 1.0F, 0.0F, 0.0F);
+ this.mc.thePlayer.field_735_n = (float)Math.atan((double)(var9 / 40.0F)) * 20.0F;
+ this.mc.thePlayer.rotationYaw = (float)Math.atan((double)(var9 / 40.0F)) * 40.0F;
+ this.mc.thePlayer.rotationPitch = -((float)Math.atan((double)(var10 / 40.0F))) * 20.0F;
+ GL11.glTranslatef(0.0F, this.mc.thePlayer.yOffset, 0.0F);
+ RenderManager.instance.func_853_a(this.mc.thePlayer, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F);
+ this.mc.thePlayer.field_735_n = var6;
+ this.mc.thePlayer.rotationYaw = var7;
+ this.mc.thePlayer.rotationPitch = var8;
+ GL11.glPopMatrix();
+ RenderHelper.disableStandardItemLighting();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiMainMenu.java b/src/main/java/net/minecraft/src/GuiMainMenu.java
new file mode 100644
index 0000000..502113a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiMainMenu.java
@@ -0,0 +1,220 @@
+package net.minecraft.src;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Random;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.util.glu.GLU;
+
+public class GuiMainMenu extends GuiScreen {
+ private static final Random rand = new Random();
+ String[] minecraftLogo = new String[]{" * * * * * *** *** *** *** *** ***", " ** ** * ** * * * * * * * * * ", " * * * * * * * ** * ** *** ** * ", " * * * * ** * * * * * * * * ", " * * * * * *** *** * * * * * * "};
+ private LogoEffectRandomizer[][] logoEffects;
+ private float updateCounter = 0.0F;
+ private String splashText = "missingno";
+
+ public GuiMainMenu() {
+ try {
+ ArrayList var1 = new ArrayList();
+ BufferedReader var2 = new BufferedReader(new InputStreamReader(GuiMainMenu.class.getResourceAsStream("/title/splashes.txt")));
+ String var3 = "";
+
+ while(true) {
+ var3 = var2.readLine();
+ if(var3 == null) {
+ this.splashText = (String)var1.get(rand.nextInt(var1.size()));
+ break;
+ }
+
+ var3 = var3.trim();
+ if(var3.length() > 0) {
+ var1.add(var3);
+ }
+ }
+ } catch (Exception var4) {
+ }
+
+ }
+
+ public void updateScreen() {
+ ++this.updateCounter;
+ if(this.logoEffects != null) {
+ for(int var1 = 0; var1 < this.logoEffects.length; ++var1) {
+ for(int var2 = 0; var2 < this.logoEffects[var1].length; ++var2) {
+ this.logoEffects[var1][var2].func_875_a();
+ }
+ }
+ }
+
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ }
+
+ public void initGui() {
+ Calendar var1 = Calendar.getInstance();
+ var1.setTime(new Date());
+ if(var1.get(2) + 1 == 11 && var1.get(5) == 9) {
+ this.splashText = "Happy birthday, ez!";
+ } else if(var1.get(2) + 1 == 6 && var1.get(5) == 1) {
+ this.splashText = "Happy birthday, Notch!";
+ } else if(var1.get(2) + 1 == 12 && var1.get(5) == 24) {
+ this.splashText = "Merry X-mas!";
+ } else if(var1.get(2) + 1 == 1 && var1.get(5) == 1) {
+ this.splashText = "Happy new year!";
+ }
+
+ this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 48, "Singleplayer"));
+ GuiButton button;
+ this.controlList.add(button = new GuiButton(2, this.width / 2 - 100, this.height / 4 + 72, "Multiplayer"));
+ button.enabled = false;
+ this.controlList.add(button = new GuiButton(3, this.width / 2 - 100, this.height / 4 + 96, "Mods and Texture Packs"));
+ button.enabled = false;
+ this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120 + 12, "Options..."));
+ if(this.mc.field_6320_i == null) {
+ ((GuiButton)this.controlList.get(1)).enabled = false;
+ }
+
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ if(var1.id == 0) {
+ this.mc.displayGuiScreen(new GuiOptions(this, this.mc.gameSettings));
+ }
+
+ if(var1.id == 1) {
+ this.mc.displayGuiScreen(new GuiSelectWorld(this));
+ }
+
+ if(var1.id == 2) {
+ //this.mc.displayGuiScreen(new GuiMultiplayer(this));
+ }
+
+ if(var1.id == 3) {
+ //.mc.displayGuiScreen(new GuiTexturePacks(this));
+ }
+
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ Tessellator var4 = Tessellator.instance;
+ this.drawLogo(var3);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/logo.png"));
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ var4.setColorOpaque_I(16777215);
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)(this.width / 2 + 90), 70.0F, 0.0F);
+ GL11.glRotatef(-20.0F, 0.0F, 0.0F, 1.0F);
+ float var5 = 1.8F - MathHelper.abs(MathHelper.sin((float)(System.currentTimeMillis() % 1000L) / 1000.0F * (float)Math.PI * 2.0F) * 0.1F);
+ var5 = var5 * 100.0F / (float)(this.fontRenderer.getStringWidth(this.splashText) + 32);
+ GL11.glScalef(var5, var5, var5);
+ this.drawCenteredString(this.fontRenderer, this.splashText, 0, -8, 16776960);
+ GL11.glPopMatrix();
+ this.drawString(this.fontRenderer, "Minecraft Alpha v1.2.6", 2, 2, 5263440);
+ String var6 = "Copyright Mojang Specifications. Do not distribute.";
+ this.drawString(this.fontRenderer, var6, this.width - this.fontRenderer.getStringWidth(var6) - 2, this.height - 10, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+
+ private void drawLogo(float var1) {
+ int var3;
+ if(this.logoEffects == null) {
+ this.logoEffects = new LogoEffectRandomizer[this.minecraftLogo[0].length()][this.minecraftLogo.length];
+
+ for(int var2 = 0; var2 < this.logoEffects.length; ++var2) {
+ for(var3 = 0; var3 < this.logoEffects[var2].length; ++var3) {
+ this.logoEffects[var2][var3] = new LogoEffectRandomizer(this, var2, var3);
+ }
+ }
+ }
+
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glPushMatrix();
+ GL11.glLoadIdentity();
+ ScaledResolution var14 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight);
+ var3 = 120 * var14.scaleFactor;
+ GLU.gluPerspective(70.0F, (float)this.mc.displayWidth / (float)var3, 0.05F, 100.0F);
+ GL11.glViewport(0, this.mc.displayHeight - var3, this.mc.displayWidth, var3);
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glPushMatrix();
+ GL11.glLoadIdentity();
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ GL11.glCullFace(GL11.GL_BACK);
+ GL11.glDepthMask(true);
+ RenderBlocks var4 = new RenderBlocks();
+
+ for(int var5 = 0; var5 < 3; ++var5) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef(0.4F, 0.6F, -13.0F);
+ if(var5 == 0) {
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GL11.glTranslatef(0.0F, -0.4F, 0.0F);
+ GL11.glScalef(0.98F, 1.0F, 1.0F);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ if(var5 == 1) {
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ }
+
+ if(var5 == 2) {
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_COLOR, GL11.GL_ONE);
+ }
+
+ GL11.glScalef(1.0F, -1.0F, 1.0F);
+ GL11.glRotatef(15.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glScalef(0.89F, 1.0F, 0.4F);
+ GL11.glTranslatef((float)(-this.minecraftLogo[0].length()) * 0.5F, (float)(-this.minecraftLogo.length) * 0.5F, 0.0F);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png"));
+ if(var5 == 0) {
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/title/black.png"));
+ }
+
+ for(int var6 = 0; var6 < this.minecraftLogo.length; ++var6) {
+ for(int var7 = 0; var7 < this.minecraftLogo[var6].length(); ++var7) {
+ char var8 = this.minecraftLogo[var6].charAt(var7);
+ if(var8 != 32) {
+ GL11.glPushMatrix();
+ LogoEffectRandomizer var9 = this.logoEffects[var7][var6];
+ float var10 = (float)(var9.field_1311_b + (var9.field_1312_a - var9.field_1311_b) * (double)var1);
+ float var11 = 1.0F;
+ float var12 = 1.0F;
+ float var13 = 0.0F;
+ if(var5 == 0) {
+ var11 = var10 * 0.04F + 1.0F;
+ var12 = 1.0F / var11;
+ var10 = 0.0F;
+ }
+
+ GL11.glTranslatef((float)var7, (float)var6, var10);
+ GL11.glScalef(var11, var11, var11);
+ GL11.glRotatef(var13, 0.0F, 1.0F, 0.0F);
+ var4.func_1238_a(Block.stone, var12);
+ GL11.glPopMatrix();
+ }
+ }
+ }
+
+ GL11.glPopMatrix();
+ }
+
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glPopMatrix();
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glPopMatrix();
+ GL11.glViewport(0, 0, this.mc.displayWidth, this.mc.displayHeight);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ }
+
+ static Random getRand() {
+ return rand;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiOptions.java b/src/main/java/net/minecraft/src/GuiOptions.java
new file mode 100644
index 0000000..790e818
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiOptions.java
@@ -0,0 +1,52 @@
+package net.minecraft.src;
+
+public class GuiOptions extends GuiScreen {
+ private GuiScreen parentScreen;
+ protected String screenTitle = "Options";
+ private GameSettings options;
+
+ public GuiOptions(GuiScreen var1, GameSettings var2) {
+ this.parentScreen = var1;
+ this.options = var2;
+ }
+
+ public void initGui() {
+ for(int var1 = 0; var1 < this.options.numberOfOptions; ++var1) {
+ int var2 = this.options.getOptionControlType(var1);
+ if(var2 == 0) {
+ this.controlList.add(new GuiSmallButton(var1, this.width / 2 - 155 + var1 % 2 * 160, this.height / 6 + 24 * (var1 >> 1), this.options.getOptionDisplayString(var1)));
+ } else {
+ this.controlList.add(new GuiSlider(var1, this.width / 2 - 155 + var1 % 2 * 160, this.height / 6 + 24 * (var1 >> 1), var1, this.options.getOptionDisplayString(var1), this.options.getOptionFloatValue(var1)));
+ }
+ }
+
+ this.controlList.add(new GuiButton(100, this.width / 2 - 100, this.height / 6 + 120 + 12, "Controls..."));
+ this.controlList.add(new GuiButton(200, this.width / 2 - 100, this.height / 6 + 168, "Done"));
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ if(var1.enabled) {
+ if(var1.id < 100) {
+ this.options.setOptionValue(var1.id, 1);
+ var1.displayString = this.options.getOptionDisplayString(var1.id);
+ }
+
+ if(var1.id == 100) {
+ this.mc.gameSettings.saveOptions();
+ this.mc.displayGuiScreen(new GuiControls(this, this.options));
+ }
+
+ if(var1.id == 200) {
+ this.mc.gameSettings.saveOptions();
+ this.mc.displayGuiScreen(this.parentScreen);
+ }
+
+ }
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiScreen.java b/src/main/java/net/minecraft/src/GuiScreen.java
new file mode 100644
index 0000000..87d0719
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiScreen.java
@@ -0,0 +1,161 @@
+package net.minecraft.src;
+
+import java.awt.Toolkit;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.util.ArrayList;
+import java.util.List;
+import net.minecraft.client.Minecraft;
+import org.lwjgl.input.Keyboard;
+import org.lwjgl.input.Mouse;
+import org.lwjgl.opengl.GL11;
+
+public class GuiScreen extends Gui {
+ protected Minecraft mc;
+ public int width;
+ public int height;
+ protected List controlList = new ArrayList();
+ public boolean field_948_f = false;
+ protected FontRenderer fontRenderer;
+ private GuiButton selectedButton = null;
+
+ public void drawScreen(int var1, int var2, float var3) {
+ for(int var4 = 0; var4 < this.controlList.size(); ++var4) {
+ GuiButton var5 = (GuiButton)this.controlList.get(var4);
+ var5.drawButton(this.mc, var1, var2);
+ }
+
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ if(var2 == 1) {
+ this.mc.displayGuiScreen((GuiScreen)null);
+ this.mc.func_6259_e();
+ }
+
+ }
+
+ public static String getClipboardString() {
+ try {
+ Transferable var0 = Toolkit.getDefaultToolkit().getSystemClipboard().getContents((Object)null);
+ if(var0 != null && var0.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+ String var1 = (String)var0.getTransferData(DataFlavor.stringFlavor);
+ return var1;
+ }
+ } catch (Exception var2) {
+ }
+
+ return null;
+ }
+
+ protected void mouseClicked(int var1, int var2, int var3) {
+ if(var3 == 0) {
+ for(int var4 = 0; var4 < this.controlList.size(); ++var4) {
+ GuiButton var5 = (GuiButton)this.controlList.get(var4);
+ if(var5.mousePressed(this.mc, var1, var2)) {
+ this.selectedButton = var5;
+ this.actionPerformed(var5);
+ }
+ }
+ }
+
+ }
+
+ protected void mouseMovedOrUp(int var1, int var2, int var3) {
+ if(this.selectedButton != null && var3 == 0) {
+ this.selectedButton.mouseReleased(var1, var2);
+ this.selectedButton = null;
+ }
+
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ }
+
+ public void setWorldAndResolution(Minecraft var1, int var2, int var3) {
+ this.mc = var1;
+ this.fontRenderer = var1.fontRenderer;
+ this.width = var2;
+ this.height = var3;
+ this.controlList.clear();
+ this.initGui();
+ }
+
+ public void initGui() {
+ }
+
+ public void handleInput() {
+ while(Mouse.next()) {
+ this.handleMouseInput();
+ }
+
+ while(Keyboard.next()) {
+ this.handleKeyboardInput();
+ }
+
+ }
+
+ public void handleMouseInput() {
+ int var1;
+ int var2;
+ if(Mouse.getEventButtonState()) {
+ var1 = Mouse.getEventX() * this.width / this.mc.displayWidth;
+ var2 = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
+ this.mouseClicked(var1, var2, Mouse.getEventButton());
+ } else {
+ var1 = Mouse.getEventX() * this.width / this.mc.displayWidth;
+ var2 = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
+ this.mouseMovedOrUp(var1, var2, Mouse.getEventButton());
+ }
+
+ }
+
+ public void handleKeyboardInput() {
+ if(Keyboard.getEventKeyState()) {
+ this.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey());
+ }
+
+ }
+
+ public void updateScreen() {
+ }
+
+ public void onGuiClosed() {
+ }
+
+ public void drawDefaultBackground() {
+ this.func_567_a(0);
+ }
+
+ public void func_567_a(int var1) {
+ if(this.mc.theWorld != null) {
+ this.drawGradientRect(0, 0, this.width, this.height, -1072689136, -804253680);
+ } else {
+ this.drawBackground(var1);
+ }
+
+ }
+
+ public void drawBackground(int var1) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_FOG);
+ Tessellator var2 = Tessellator.instance;
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/background.png"));
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ float var3 = 32.0F;
+ var2.startDrawingQuads();
+ var2.setColorOpaque_I(4210752);
+ var2.addVertexWithUV(0.0D, (double)this.height, 0.0D, 0.0D, (double)((float)this.height / var3 + (float)var1));
+ var2.addVertexWithUV((double)this.width, (double)this.height, 0.0D, (double)((float)this.width / var3), (double)((float)this.height / var3 + (float)var1));
+ var2.addVertexWithUV((double)this.width, 0.0D, 0.0D, (double)((float)this.width / var3), (double)(0 + var1));
+ var2.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, (double)(0 + var1));
+ var2.draw();
+ }
+
+ public boolean doesGuiPauseGame() {
+ return true;
+ }
+
+ public void deleteWorld(boolean var1, int var2) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiSelectWorld.java b/src/main/java/net/minecraft/src/GuiSelectWorld.java
new file mode 100644
index 0000000..0a6eb68
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiSelectWorld.java
@@ -0,0 +1,71 @@
+package net.minecraft.src;
+
+import java.io.File;
+import net.minecraft.client.Minecraft;
+
+public class GuiSelectWorld extends GuiScreen {
+ protected GuiScreen parentScreen;
+ protected String screenTitle = "Select world";
+ private boolean selected = false;
+
+ public GuiSelectWorld(GuiScreen var1) {
+ this.parentScreen = var1;
+ }
+
+ public void initGui() {
+ File var1 = Minecraft.getMinecraftDir();
+
+ for(int var2 = 0; var2 < 5; ++var2) {
+ NBTTagCompound var3 = World.func_629_a(var1, "World" + (var2 + 1));
+ if(var3 == null) {
+ this.controlList.add(new GuiButton(var2, this.width / 2 - 100, this.height / 6 + 24 * var2, "- empty -"));
+ } else {
+ String var4 = "World " + (var2 + 1);
+ long var5 = var3.getLong("SizeOnDisk");
+ var4 = var4 + " (" + (float)(var5 / 1024L * 100L / 1024L) / 100.0F + " MB)";
+ this.controlList.add(new GuiButton(var2, this.width / 2 - 100, this.height / 6 + 24 * var2, var4));
+ }
+ }
+
+ this.initGui2();
+ }
+
+ protected String getWorldName(int var1) {
+ File var2 = Minecraft.getMinecraftDir();
+ return World.func_629_a(var2, "World" + var1) != null ? "World" + var1 : null;
+ }
+
+ public void initGui2() {
+ this.controlList.add(new GuiButton(5, this.width / 2 - 100, this.height / 6 + 120 + 12, "Delete world..."));
+ this.controlList.add(new GuiButton(6, this.width / 2 - 100, this.height / 6 + 168, "Cancel"));
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ if(var1.enabled) {
+ if(var1.id < 5) {
+ this.selectWorld(var1.id + 1);
+ } else if(var1.id == 5) {
+ this.mc.displayGuiScreen(new GuiDeleteWorld(this));
+ } else if(var1.id == 6) {
+ this.mc.displayGuiScreen(this.parentScreen);
+ }
+
+ }
+ }
+
+ public void selectWorld(int var1) {
+ this.mc.displayGuiScreen((GuiScreen)null);
+ if(!this.selected) {
+ this.selected = true;
+ this.mc.field_6327_b = new PlayerControllerSP(this.mc);
+ this.mc.func_6247_b("World" + var1);
+ this.mc.displayGuiScreen((GuiScreen)null);
+ }
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiSlider.java b/src/main/java/net/minecraft/src/GuiSlider.java
new file mode 100644
index 0000000..494e584
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiSlider.java
@@ -0,0 +1,66 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+import org.lwjgl.opengl.GL11;
+
+public class GuiSlider extends GuiButton {
+ public float sliderValue = 1.0F;
+ public boolean dragging = false;
+ private int idFloat = 0;
+
+ public GuiSlider(int var1, int var2, int var3, int var4, String var5, float var6) {
+ super(var1, var2, var3, 150, 20, var5);
+ this.idFloat = var4;
+ this.sliderValue = var6;
+ }
+
+ protected int getHoverState(boolean var1) {
+ return 0;
+ }
+
+ protected void mouseDragged(Minecraft var1, int var2, int var3) {
+ if(this.enabled2) {
+ if(this.dragging) {
+ this.sliderValue = (float)(var2 - (this.xPosition + 4)) / (float)(this.width - 8);
+ if(this.sliderValue < 0.0F) {
+ this.sliderValue = 0.0F;
+ }
+
+ if(this.sliderValue > 1.0F) {
+ this.sliderValue = 1.0F;
+ }
+
+ var1.gameSettings.setOptionFloatValue(this.idFloat, this.sliderValue);
+ this.displayString = var1.gameSettings.getOptionDisplayString(this.idFloat);
+ }
+
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ this.drawTexturedModalRect(this.xPosition + (int)(this.sliderValue * (float)(this.width - 8)), this.yPosition, 0, 66, 4, 20);
+ this.drawTexturedModalRect(this.xPosition + (int)(this.sliderValue * (float)(this.width - 8)) + 4, this.yPosition, 196, 66, 4, 20);
+ }
+ }
+
+ public boolean mousePressed(Minecraft var1, int var2, int var3) {
+ if(super.mousePressed(var1, var2, var3)) {
+ this.sliderValue = (float)(var2 - (this.xPosition + 4)) / (float)(this.width - 8);
+ if(this.sliderValue < 0.0F) {
+ this.sliderValue = 0.0F;
+ }
+
+ if(this.sliderValue > 1.0F) {
+ this.sliderValue = 1.0F;
+ }
+
+ var1.gameSettings.setOptionFloatValue(this.idFloat, this.sliderValue);
+ this.displayString = var1.gameSettings.getOptionDisplayString(this.idFloat);
+ this.dragging = true;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void mouseReleased(int var1, int var2) {
+ this.dragging = false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiSmallButton.java b/src/main/java/net/minecraft/src/GuiSmallButton.java
new file mode 100644
index 0000000..e64c277
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiSmallButton.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public class GuiSmallButton extends GuiButton {
+ public GuiSmallButton(int var1, int var2, int var3, String var4) {
+ super(var1, var2, var3, 150, 20, var4);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiUnused.java b/src/main/java/net/minecraft/src/GuiUnused.java
new file mode 100644
index 0000000..922f513
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiUnused.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class GuiUnused extends GuiScreen {
+ private String message1;
+ private String message2;
+
+ public void initGui() {
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawGradientRect(0, 0, this.width, this.height, -12574688, -11530224);
+ this.drawCenteredString(this.fontRenderer, this.message1, this.width / 2, 90, 16777215);
+ this.drawCenteredString(this.fontRenderer, this.message2, this.width / 2, 110, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+
+ protected void keyTyped(char var1, int var2) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/GuiYesNo.java b/src/main/java/net/minecraft/src/GuiYesNo.java
new file mode 100644
index 0000000..3c22273
--- /dev/null
+++ b/src/main/java/net/minecraft/src/GuiYesNo.java
@@ -0,0 +1,31 @@
+package net.minecraft.src;
+
+public class GuiYesNo extends GuiScreen {
+ private GuiScreen parentScreen;
+ private String message1;
+ private String message2;
+ private int worldNumber;
+
+ public GuiYesNo(GuiScreen var1, String var2, String var3, int var4) {
+ this.parentScreen = var1;
+ this.message1 = var2;
+ this.message2 = var3;
+ this.worldNumber = var4;
+ }
+
+ public void initGui() {
+ this.controlList.add(new GuiSmallButton(0, this.width / 2 - 155 + 0, this.height / 6 + 96, "Yes"));
+ this.controlList.add(new GuiSmallButton(1, this.width / 2 - 155 + 160, this.height / 6 + 96, "No"));
+ }
+
+ protected void actionPerformed(GuiButton var1) {
+ this.parentScreen.deleteWorld(var1.id == 0, this.worldNumber);
+ }
+
+ public void drawScreen(int var1, int var2, float var3) {
+ this.drawDefaultBackground();
+ this.drawCenteredString(this.fontRenderer, this.message1, this.width / 2, 70, 16777215);
+ this.drawCenteredString(this.fontRenderer, this.message2, this.width / 2, 90, 16777215);
+ super.drawScreen(var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/HashEntry.java b/src/main/java/net/minecraft/src/HashEntry.java
new file mode 100644
index 0000000..b7c9e6e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/HashEntry.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+class HashEntry {
+ final int hashEntry;
+ Object valueEntry;
+ HashEntry nextEntry;
+ final int slotHash;
+
+ HashEntry(int var1, int var2, Object var3, HashEntry var4) {
+ this.valueEntry = var3;
+ this.nextEntry = var4;
+ this.hashEntry = var2;
+ this.slotHash = var1;
+ }
+
+ public final int getHash() {
+ return this.hashEntry;
+ }
+
+ public final Object getValue() {
+ return this.valueEntry;
+ }
+
+ public final boolean equals(Object var1) {
+ if(!(var1 instanceof HashEntry)) {
+ return false;
+ } else {
+ HashEntry var2 = (HashEntry)var1;
+ Integer var3 = Integer.valueOf(this.getHash());
+ Integer var4 = Integer.valueOf(var2.getHash());
+ if(var3 == var4 || var3 != null && var3.equals(var4)) {
+ Object var5 = this.getValue();
+ Object var6 = var2.getValue();
+ if(var5 == var6 || var5 != null && var5.equals(var6)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+
+ public final int hashCode() {
+ return MCHashTable.getHash(this.hashEntry);
+ }
+
+ public final String toString() {
+ return this.getHash() + "=" + this.getValue();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/IBlockAccess.java b/src/main/java/net/minecraft/src/IBlockAccess.java
new file mode 100644
index 0000000..12901ae
--- /dev/null
+++ b/src/main/java/net/minecraft/src/IBlockAccess.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public interface IBlockAccess {
+ int getBlockId(int var1, int var2, int var3);
+
+ TileEntity getBlockTileEntity(int var1, int var2, int var3);
+
+ float getLightBrightness(int var1, int var2, int var3);
+
+ int getBlockMetadata(int var1, int var2, int var3);
+
+ Material getBlockMaterial(int var1, int var2, int var3);
+
+ boolean isBlockOpaqueCube(int var1, int var2, int var3);
+
+ WorldChunkManager func_4075_a();
+}
diff --git a/src/main/java/net/minecraft/src/ICamera.java b/src/main/java/net/minecraft/src/ICamera.java
new file mode 100644
index 0000000..8ad4aa6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ICamera.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public interface ICamera {
+ boolean func_342_a(AxisAlignedBB var1);
+
+ void func_343_a(double var1, double var3, double var5);
+}
diff --git a/src/main/java/net/minecraft/src/IChunkLoader.java b/src/main/java/net/minecraft/src/IChunkLoader.java
new file mode 100644
index 0000000..68ffd66
--- /dev/null
+++ b/src/main/java/net/minecraft/src/IChunkLoader.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+
+public interface IChunkLoader {
+ Chunk loadChunk(World var1, int var2, int var3) throws IOException;
+
+ void saveChunk(World var1, Chunk var2) throws IOException;
+
+ void saveExtraChunkData(World var1, Chunk var2) throws IOException;
+
+ void func_814_a();
+
+ void saveExtraData();
+}
diff --git a/src/main/java/net/minecraft/src/IChunkProvider.java b/src/main/java/net/minecraft/src/IChunkProvider.java
new file mode 100644
index 0000000..cb78309
--- /dev/null
+++ b/src/main/java/net/minecraft/src/IChunkProvider.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public interface IChunkProvider {
+ boolean chunkExists(int var1, int var2);
+
+ Chunk provideChunk(int var1, int var2);
+
+ void populate(IChunkProvider var1, int var2, int var3);
+
+ boolean saveChunks(boolean var1, IProgressUpdate var2);
+
+ boolean func_532_a();
+
+ boolean func_536_b();
+}
diff --git a/src/main/java/net/minecraft/src/IInventory.java b/src/main/java/net/minecraft/src/IInventory.java
new file mode 100644
index 0000000..b4564c7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/IInventory.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public interface IInventory {
+ int getSizeInventory();
+
+ ItemStack getStackInSlot(int var1);
+
+ ItemStack decrStackSize(int var1, int var2);
+
+ void setInventorySlotContents(int var1, ItemStack var2);
+
+ String getInvName();
+
+ int getInventoryStackLimit();
+
+ void onInventoryChanged();
+}
diff --git a/src/main/java/net/minecraft/src/IMobs.java b/src/main/java/net/minecraft/src/IMobs.java
new file mode 100644
index 0000000..73e52bb
--- /dev/null
+++ b/src/main/java/net/minecraft/src/IMobs.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public interface IMobs {
+}
diff --git a/src/main/java/net/minecraft/src/IProgressUpdate.java b/src/main/java/net/minecraft/src/IProgressUpdate.java
new file mode 100644
index 0000000..86d30ba
--- /dev/null
+++ b/src/main/java/net/minecraft/src/IProgressUpdate.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+public interface IProgressUpdate {
+ void func_594_b(String var1);
+
+ void displayLoadingString(String var1);
+
+ void setLoadingProgress(int var1);
+}
diff --git a/src/main/java/net/minecraft/src/IWorldAccess.java b/src/main/java/net/minecraft/src/IWorldAccess.java
new file mode 100644
index 0000000..1132fcd
--- /dev/null
+++ b/src/main/java/net/minecraft/src/IWorldAccess.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+public interface IWorldAccess {
+ void func_934_a(int var1, int var2, int var3);
+
+ void func_937_b(int var1, int var2, int var3, int var4, int var5, int var6);
+
+ void playSound(String var1, double var2, double var4, double var6, float var8, float var9);
+
+ void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12);
+
+ void obtainEntitySkin(Entity var1);
+
+ void releaseEntitySkin(Entity var1);
+
+ void func_936_e();
+
+ void playRecord(String var1, int var2, int var3, int var4);
+
+ void func_935_a(int var1, int var2, int var3, TileEntity var4);
+}
diff --git a/src/main/java/net/minecraft/src/InventoryCraftResult.java b/src/main/java/net/minecraft/src/InventoryCraftResult.java
new file mode 100644
index 0000000..de21b2a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/InventoryCraftResult.java
@@ -0,0 +1,38 @@
+package net.minecraft.src;
+
+public class InventoryCraftResult implements IInventory {
+ private ItemStack[] stackResult = new ItemStack[1];
+
+ public int getSizeInventory() {
+ return 1;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.stackResult[var1];
+ }
+
+ public String getInvName() {
+ return "Result";
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.stackResult[var1] != null) {
+ ItemStack var3 = this.stackResult[var1];
+ this.stackResult[var1] = null;
+ return var3;
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.stackResult[var1] = var2;
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public void onInventoryChanged() {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/InventoryCrafting.java b/src/main/java/net/minecraft/src/InventoryCrafting.java
new file mode 100644
index 0000000..51fe9f2
--- /dev/null
+++ b/src/main/java/net/minecraft/src/InventoryCrafting.java
@@ -0,0 +1,65 @@
+package net.minecraft.src;
+
+public class InventoryCrafting implements IInventory {
+ private ItemStack[] stackList;
+ private int nbrSlots;
+ private CraftingInventoryCB eventHandler;
+
+ public InventoryCrafting(CraftingInventoryCB var1, int var2, int var3) {
+ this.nbrSlots = var2 * var3;
+ this.stackList = new ItemStack[this.nbrSlots];
+ this.eventHandler = var1;
+ }
+
+ public InventoryCrafting(CraftingInventoryCB var1, ItemStack[] var2) {
+ this.nbrSlots = var2.length;
+ this.stackList = var2;
+ this.eventHandler = var1;
+ }
+
+ public int getSizeInventory() {
+ return this.nbrSlots;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.stackList[var1];
+ }
+
+ public String getInvName() {
+ return "Crafting";
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.stackList[var1] != null) {
+ ItemStack var3;
+ if(this.stackList[var1].stackSize <= var2) {
+ var3 = this.stackList[var1];
+ this.stackList[var1] = null;
+ this.eventHandler.onCraftMatrixChanged(this);
+ return var3;
+ } else {
+ var3 = this.stackList[var1].splitStack(var2);
+ if(this.stackList[var1].stackSize == 0) {
+ this.stackList[var1] = null;
+ }
+
+ this.eventHandler.onCraftMatrixChanged(this);
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.stackList[var1] = var2;
+ this.eventHandler.onCraftMatrixChanged(this);
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public void onInventoryChanged() {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/InventoryLargeChest.java b/src/main/java/net/minecraft/src/InventoryLargeChest.java
new file mode 100644
index 0000000..daced98
--- /dev/null
+++ b/src/main/java/net/minecraft/src/InventoryLargeChest.java
@@ -0,0 +1,47 @@
+package net.minecraft.src;
+
+public class InventoryLargeChest implements IInventory {
+ private String name;
+ private IInventory upperChest;
+ private IInventory lowerChest;
+
+ public InventoryLargeChest(String var1, IInventory var2, IInventory var3) {
+ this.name = var1;
+ this.upperChest = var2;
+ this.lowerChest = var3;
+ }
+
+ public int getSizeInventory() {
+ return this.upperChest.getSizeInventory() + this.lowerChest.getSizeInventory();
+ }
+
+ public String getInvName() {
+ return this.name;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return var1 >= this.upperChest.getSizeInventory() ? this.lowerChest.getStackInSlot(var1 - this.upperChest.getSizeInventory()) : this.upperChest.getStackInSlot(var1);
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ return var1 >= this.upperChest.getSizeInventory() ? this.lowerChest.decrStackSize(var1 - this.upperChest.getSizeInventory(), var2) : this.upperChest.decrStackSize(var1, var2);
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ if(var1 >= this.upperChest.getSizeInventory()) {
+ this.lowerChest.setInventorySlotContents(var1 - this.upperChest.getSizeInventory(), var2);
+ } else {
+ this.upperChest.setInventorySlotContents(var1, var2);
+ }
+
+ }
+
+ public int getInventoryStackLimit() {
+ return this.upperChest.getInventoryStackLimit();
+ }
+
+ public void onInventoryChanged() {
+ this.upperChest.onInventoryChanged();
+ this.lowerChest.onInventoryChanged();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/InventoryPlayer.java b/src/main/java/net/minecraft/src/InventoryPlayer.java
new file mode 100644
index 0000000..ea8654f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/InventoryPlayer.java
@@ -0,0 +1,403 @@
+package net.minecraft.src;
+
+public class InventoryPlayer implements IInventory {
+ public ItemStack[] mainInventory = new ItemStack[37];
+ public ItemStack[] armorInventory = new ItemStack[4];
+ public ItemStack[] craftingInventory = new ItemStack[4];
+ public int currentItem = 0;
+ private EntityPlayer player;
+ public ItemStack draggingItemStack;
+ public boolean field_845_f = false;
+
+ public InventoryPlayer(EntityPlayer var1) {
+ this.player = var1;
+ }
+
+ public ItemStack getCurrentItem() {
+ return this.mainInventory[this.currentItem];
+ }
+
+ private int getInventorySlotContainItem(int var1) {
+ for(int var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ if(this.mainInventory[var2] != null && this.mainInventory[var2].itemID == var1) {
+ return var2;
+ }
+ }
+
+ return -1;
+ }
+
+ private int getFirstPartialMatchingStack(int var1) {
+ for(int var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ if(this.mainInventory[var2] != null && this.mainInventory[var2].itemID == var1 && this.mainInventory[var2].stackSize < this.mainInventory[var2].getMaxStackSize() && this.mainInventory[var2].stackSize < this.getInventoryStackLimit()) {
+ return var2;
+ }
+ }
+
+ return -1;
+ }
+
+ private int getFirstEmptyStack() {
+ for(int var1 = 0; var1 < this.mainInventory.length; ++var1) {
+ if(this.mainInventory[var1] == null) {
+ return var1;
+ }
+ }
+
+ return -1;
+ }
+
+ public void setCurrentItem(int var1, boolean var2) {
+ int var3 = this.getInventorySlotContainItem(var1);
+ if(var3 >= 0 && var3 < 9) {
+ this.currentItem = var3;
+ }
+ }
+
+ public void changeCurrentItem(int var1) {
+ if(var1 > 0) {
+ var1 = 1;
+ }
+
+ if(var1 < 0) {
+ var1 = -1;
+ }
+
+ for(this.currentItem -= var1; this.currentItem < 0; this.currentItem += 9) {
+ }
+
+ while(this.currentItem >= 9) {
+ this.currentItem -= 9;
+ }
+
+ }
+
+ private int addItemsToInventory(int var1, int var2) {
+ int var3 = this.getFirstPartialMatchingStack(var1);
+ if(var3 < 0) {
+ var3 = this.getFirstEmptyStack();
+ }
+
+ if(var3 < 0) {
+ return var2;
+ } else {
+ if(this.mainInventory[var3] == null) {
+ this.mainInventory[var3] = new ItemStack(var1, 0);
+ }
+
+ int var4 = var2;
+ if(var2 > this.mainInventory[var3].getMaxStackSize() - this.mainInventory[var3].stackSize) {
+ var4 = this.mainInventory[var3].getMaxStackSize() - this.mainInventory[var3].stackSize;
+ }
+
+ if(var4 > this.getInventoryStackLimit() - this.mainInventory[var3].stackSize) {
+ var4 = this.getInventoryStackLimit() - this.mainInventory[var3].stackSize;
+ }
+
+ if(var4 == 0) {
+ return var2;
+ } else {
+ var2 -= var4;
+ this.mainInventory[var3].stackSize += var4;
+ this.mainInventory[var3].animationsToGo = 5;
+ return var2;
+ }
+ }
+ }
+
+ public void decrementAnimations() {
+ for(int var1 = 0; var1 < this.mainInventory.length; ++var1) {
+ if(this.mainInventory[var1] != null && this.mainInventory[var1].animationsToGo > 0) {
+ --this.mainInventory[var1].animationsToGo;
+ }
+ }
+
+ }
+
+ public boolean consumeInventoryItem(int var1) {
+ int var2 = this.getInventorySlotContainItem(var1);
+ if(var2 < 0) {
+ return false;
+ } else {
+ if(--this.mainInventory[var2].stackSize <= 0) {
+ this.mainInventory[var2] = null;
+ }
+
+ return true;
+ }
+ }
+
+ public boolean addItemStackToInventory(ItemStack var1) {
+ if(var1.itemDamage == 0) {
+ var1.stackSize = this.addItemsToInventory(var1.itemID, var1.stackSize);
+ if(var1.stackSize == 0) {
+ return true;
+ }
+ }
+
+ int var2 = this.getFirstEmptyStack();
+ if(var2 >= 0) {
+ this.mainInventory[var2] = var1;
+ this.mainInventory[var2].animationsToGo = 5;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ ItemStack[] var3 = this.mainInventory;
+ if(var1 >= this.mainInventory.length) {
+ var3 = this.armorInventory;
+ var1 -= this.mainInventory.length;
+ }
+
+ if(var3[var1] != null) {
+ ItemStack var4;
+ if(var3[var1].stackSize <= var2) {
+ var4 = var3[var1];
+ var3[var1] = null;
+ return var4;
+ } else {
+ var4 = var3[var1].splitStack(var2);
+ if(var3[var1].stackSize == 0) {
+ var3[var1] = null;
+ }
+
+ return var4;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ ItemStack[] var3 = this.mainInventory;
+ if(var1 >= var3.length) {
+ var1 -= var3.length;
+ var3 = this.armorInventory;
+ }
+
+ if(var1 >= var3.length) {
+ var1 -= var3.length;
+ var3 = this.craftingInventory;
+ }
+
+ var3[var1] = var2;
+ }
+
+ public float getStrVsBlock(Block var1) {
+ float var2 = 1.0F;
+ if(this.mainInventory[this.currentItem] != null) {
+ var2 *= this.mainInventory[this.currentItem].getStrVsBlock(var1);
+ }
+
+ return var2;
+ }
+
+ public NBTTagList writeToNBT(NBTTagList var1) {
+ int var2;
+ NBTTagCompound var3;
+ for(var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ if(this.mainInventory[var2] != null) {
+ var3 = new NBTTagCompound();
+ var3.setByte("Slot", (byte)var2);
+ this.mainInventory[var2].writeToNBT(var3);
+ var1.setTag(var3);
+ }
+ }
+
+ for(var2 = 0; var2 < this.armorInventory.length; ++var2) {
+ if(this.armorInventory[var2] != null) {
+ var3 = new NBTTagCompound();
+ var3.setByte("Slot", (byte)(var2 + 100));
+ this.armorInventory[var2].writeToNBT(var3);
+ var1.setTag(var3);
+ }
+ }
+
+ for(var2 = 0; var2 < this.craftingInventory.length; ++var2) {
+ if(this.craftingInventory[var2] != null) {
+ var3 = new NBTTagCompound();
+ var3.setByte("Slot", (byte)(var2 + 80));
+ this.craftingInventory[var2].writeToNBT(var3);
+ var1.setTag(var3);
+ }
+ }
+
+ return var1;
+ }
+
+ public void readFromNBT(NBTTagList var1) {
+ this.mainInventory = new ItemStack[36];
+ this.armorInventory = new ItemStack[4];
+ this.craftingInventory = new ItemStack[4];
+
+ for(int var2 = 0; var2 < var1.tagCount(); ++var2) {
+ NBTTagCompound var3 = (NBTTagCompound)var1.tagAt(var2);
+ int var4 = var3.getByte("Slot") & 255;
+ if(var4 >= 0 && var4 < this.mainInventory.length) {
+ this.mainInventory[var4] = new ItemStack(var3);
+ }
+
+ if(var4 >= 80 && var4 < this.craftingInventory.length + 80) {
+ this.craftingInventory[var4 - 80] = new ItemStack(var3);
+ }
+
+ if(var4 >= 100 && var4 < this.armorInventory.length + 100) {
+ this.armorInventory[var4 - 100] = new ItemStack(var3);
+ }
+ }
+
+ }
+
+ public int getSizeInventory() {
+ return this.mainInventory.length + 4;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ ItemStack[] var2 = this.mainInventory;
+ if(var1 >= var2.length) {
+ var1 -= var2.length;
+ var2 = this.armorInventory;
+ }
+
+ if(var1 >= var2.length) {
+ var1 -= var2.length;
+ var2 = this.craftingInventory;
+ }
+
+ return var2[var1];
+ }
+
+ public String getInvName() {
+ return "Inventory";
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ ItemStack var2 = this.getStackInSlot(this.currentItem);
+ return var2 != null ? var2.getDamageVsEntity(var1) : 1;
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ if(var1.blockMaterial != Material.rock && var1.blockMaterial != Material.iron && var1.blockMaterial != Material.builtSnow && var1.blockMaterial != Material.snow) {
+ return true;
+ } else {
+ ItemStack var2 = this.getStackInSlot(this.currentItem);
+ return var2 != null ? var2.canHarvestBlock(var1) : false;
+ }
+ }
+
+ public ItemStack armorItemInSlot(int var1) {
+ return this.armorInventory[var1];
+ }
+
+ public int getTotalArmorValue() {
+ int var1 = 0;
+ int var2 = 0;
+ int var3 = 0;
+
+ for(int var4 = 0; var4 < this.armorInventory.length; ++var4) {
+ if(this.armorInventory[var4] != null && this.armorInventory[var4].getItem() instanceof ItemArmor) {
+ int var5 = this.armorInventory[var4].getMaxDamage();
+ int var6 = this.armorInventory[var4].itemDamage;
+ int var7 = var5 - var6;
+ var2 += var7;
+ var3 += var5;
+ int var8 = ((ItemArmor)this.armorInventory[var4].getItem()).damageReduceAmmount;
+ var1 += var8;
+ }
+ }
+
+ if(var3 == 0) {
+ return 0;
+ } else {
+ return (var1 - 1) * var2 / var3 + 1;
+ }
+ }
+
+ public void damageArmor(int var1) {
+ for(int var2 = 0; var2 < this.armorInventory.length; ++var2) {
+ if(this.armorInventory[var2] != null && this.armorInventory[var2].getItem() instanceof ItemArmor) {
+ this.armorInventory[var2].damageItem(var1);
+ if(this.armorInventory[var2].stackSize == 0) {
+ this.armorInventory[var2].func_1097_a(this.player);
+ this.armorInventory[var2] = null;
+ }
+ }
+ }
+
+ }
+
+ public void dropAllItems() {
+ int var1;
+ for(var1 = 0; var1 < this.mainInventory.length; ++var1) {
+ if(this.mainInventory[var1] != null) {
+ this.player.dropPlayerItemWithRandomChoice(this.mainInventory[var1], true);
+ this.mainInventory[var1] = null;
+ }
+ }
+
+ for(var1 = 0; var1 < this.armorInventory.length; ++var1) {
+ if(this.armorInventory[var1] != null) {
+ this.player.dropPlayerItemWithRandomChoice(this.armorInventory[var1], true);
+ this.armorInventory[var1] = null;
+ }
+ }
+
+ }
+
+ public void onInventoryChanged() {
+ this.field_845_f = true;
+ }
+
+ public boolean compareInventory(InventoryPlayer var1) {
+ int var2;
+ for(var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ if(!this.compareItemStack(var1.mainInventory[var2], this.mainInventory[var2])) {
+ return false;
+ }
+ }
+
+ for(var2 = 0; var2 < this.armorInventory.length; ++var2) {
+ if(!this.compareItemStack(var1.armorInventory[var2], this.armorInventory[var2])) {
+ return false;
+ }
+ }
+
+ for(var2 = 0; var2 < this.craftingInventory.length; ++var2) {
+ if(!this.compareItemStack(var1.craftingInventory[var2], this.craftingInventory[var2])) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private boolean compareItemStack(ItemStack var1, ItemStack var2) {
+ return var1 == null && var2 == null ? true : (var1 != null && var2 != null ? var1.itemID == var2.itemID && var1.stackSize == var2.stackSize && var1.itemDamage == var2.itemDamage : false);
+ }
+
+ public InventoryPlayer copyInventory() {
+ InventoryPlayer var1 = new InventoryPlayer((EntityPlayer)null);
+
+ int var2;
+ for(var2 = 0; var2 < this.mainInventory.length; ++var2) {
+ var1.mainInventory[var2] = this.mainInventory[var2] != null ? this.mainInventory[var2].copy() : null;
+ }
+
+ for(var2 = 0; var2 < this.armorInventory.length; ++var2) {
+ var1.armorInventory[var2] = this.armorInventory[var2] != null ? this.armorInventory[var2].copy() : null;
+ }
+
+ for(var2 = 0; var2 < this.craftingInventory.length; ++var2) {
+ var1.craftingInventory[var2] = this.craftingInventory[var2] != null ? this.craftingInventory[var2].copy() : null;
+ }
+
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Item.java b/src/main/java/net/minecraft/src/Item.java
new file mode 100644
index 0000000..47da16c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Item.java
@@ -0,0 +1,178 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class Item {
+ protected static Random itemRand = new Random();
+ public static Item[] itemsList = new Item[32000];
+ public static Item shovelSteel = (new ItemSpade(0, 2)).setIconIndex(82);
+ public static Item pickaxeSteel = (new ItemPickaxe(1, 2)).setIconIndex(98);
+ public static Item axeSteel = (new ItemAxe(2, 2)).setIconIndex(114);
+ public static Item flintAndSteel = (new ItemFlintAndSteel(3)).setIconIndex(5);
+ public static Item appleRed = (new ItemFood(4, 4)).setIconIndex(10);
+ public static Item bow = (new ItemBow(5)).setIconIndex(21);
+ public static Item arrow = (new Item(6)).setIconIndex(37);
+ public static Item coal = (new Item(7)).setIconIndex(7);
+ public static Item diamond = (new Item(8)).setIconIndex(55);
+ public static Item ingotIron = (new Item(9)).setIconIndex(23);
+ public static Item ingotGold = (new Item(10)).setIconIndex(39);
+ public static Item swordSteel = (new ItemSword(11, 2)).setIconIndex(66);
+ public static Item swordWood = (new ItemSword(12, 0)).setIconIndex(64);
+ public static Item shovelWood = (new ItemSpade(13, 0)).setIconIndex(80);
+ public static Item pickaxeWood = (new ItemPickaxe(14, 0)).setIconIndex(96);
+ public static Item axeWood = (new ItemAxe(15, 0)).setIconIndex(112);
+ public static Item swordStone = (new ItemSword(16, 1)).setIconIndex(65);
+ public static Item shovelStone = (new ItemSpade(17, 1)).setIconIndex(81);
+ public static Item pickaxeStone = (new ItemPickaxe(18, 1)).setIconIndex(97);
+ public static Item axeStone = (new ItemAxe(19, 1)).setIconIndex(113);
+ public static Item swordDiamond = (new ItemSword(20, 3)).setIconIndex(67);
+ public static Item shovelDiamond = (new ItemSpade(21, 3)).setIconIndex(83);
+ public static Item pickaxeDiamond = (new ItemPickaxe(22, 3)).setIconIndex(99);
+ public static Item axeDiamond = (new ItemAxe(23, 3)).setIconIndex(115);
+ public static Item stick = (new Item(24)).setIconIndex(53).setFull3D();
+ public static Item bowlEmpty = (new Item(25)).setIconIndex(71);
+ public static Item bowlSoup = (new ItemSoup(26, 10)).setIconIndex(72);
+ public static Item swordGold = (new ItemSword(27, 0)).setIconIndex(68);
+ public static Item shovelGold = (new ItemSpade(28, 0)).setIconIndex(84);
+ public static Item pickaxeGold = (new ItemPickaxe(29, 0)).setIconIndex(100);
+ public static Item axeGold = (new ItemAxe(30, 0)).setIconIndex(116);
+ public static Item silk = (new Item(31)).setIconIndex(8);
+ public static Item feather = (new Item(32)).setIconIndex(24);
+ public static Item gunpowder = (new Item(33)).setIconIndex(40);
+ public static Item hoeWood = (new ItemHoe(34, 0)).setIconIndex(128);
+ public static Item hoeStone = (new ItemHoe(35, 1)).setIconIndex(129);
+ public static Item hoeSteel = (new ItemHoe(36, 2)).setIconIndex(130);
+ public static Item hoeDiamond = (new ItemHoe(37, 3)).setIconIndex(131);
+ public static Item hoeGold = (new ItemHoe(38, 1)).setIconIndex(132);
+ public static Item seeds = (new ItemSeeds(39, Block.crops.blockID)).setIconIndex(9);
+ public static Item wheat = (new Item(40)).setIconIndex(25);
+ public static Item bread = (new ItemFood(41, 5)).setIconIndex(41);
+ public static Item helmetLeather = (new ItemArmor(42, 0, 0, 0)).setIconIndex(0);
+ public static Item plateLeather = (new ItemArmor(43, 0, 0, 1)).setIconIndex(16);
+ public static Item legsLeather = (new ItemArmor(44, 0, 0, 2)).setIconIndex(32);
+ public static Item bootsLeather = (new ItemArmor(45, 0, 0, 3)).setIconIndex(48);
+ public static Item helmetChain = (new ItemArmor(46, 1, 1, 0)).setIconIndex(1);
+ public static Item plateChain = (new ItemArmor(47, 1, 1, 1)).setIconIndex(17);
+ public static Item legsChain = (new ItemArmor(48, 1, 1, 2)).setIconIndex(33);
+ public static Item bootsChain = (new ItemArmor(49, 1, 1, 3)).setIconIndex(49);
+ public static Item helmetSteel = (new ItemArmor(50, 2, 2, 0)).setIconIndex(2);
+ public static Item plateSteel = (new ItemArmor(51, 2, 2, 1)).setIconIndex(18);
+ public static Item legsSteel = (new ItemArmor(52, 2, 2, 2)).setIconIndex(34);
+ public static Item bootsSteel = (new ItemArmor(53, 2, 2, 3)).setIconIndex(50);
+ public static Item helmetDiamond = (new ItemArmor(54, 3, 3, 0)).setIconIndex(3);
+ public static Item plateDiamond = (new ItemArmor(55, 3, 3, 1)).setIconIndex(19);
+ public static Item legsDiamond = (new ItemArmor(56, 3, 3, 2)).setIconIndex(35);
+ public static Item bootsDiamond = (new ItemArmor(57, 3, 3, 3)).setIconIndex(51);
+ public static Item helmetGold = (new ItemArmor(58, 1, 4, 0)).setIconIndex(4);
+ public static Item plateGold = (new ItemArmor(59, 1, 4, 1)).setIconIndex(20);
+ public static Item legsGold = (new ItemArmor(60, 1, 4, 2)).setIconIndex(36);
+ public static Item bootsGold = (new ItemArmor(61, 1, 4, 3)).setIconIndex(52);
+ public static Item flint = (new Item(62)).setIconIndex(6);
+ public static Item porkRaw = (new ItemFood(63, 3)).setIconIndex(87);
+ public static Item porkCooked = (new ItemFood(64, 8)).setIconIndex(88);
+ public static Item painting = (new ItemPainting(65)).setIconIndex(26);
+ public static Item appleGold = (new ItemFood(66, 42)).setIconIndex(11);
+ public static Item sign = (new ItemSign(67)).setIconIndex(42);
+ public static Item doorWood = (new ItemDoor(68, Material.wood)).setIconIndex(43);
+ public static Item bucketEmpty = (new ItemBucket(69, 0)).setIconIndex(74);
+ public static Item bucketWater = (new ItemBucket(70, Block.waterStill.blockID)).setIconIndex(75);
+ public static Item bucketLava = (new ItemBucket(71, Block.lavaStill.blockID)).setIconIndex(76);
+ public static Item minecartEmpty = (new ItemMinecart(72, 0)).setIconIndex(135);
+ public static Item saddle = (new ItemSaddle(73)).setIconIndex(104);
+ public static Item doorSteel = (new ItemDoor(74, Material.iron)).setIconIndex(44);
+ public static Item redstone = (new ItemRedstone(75)).setIconIndex(56);
+ public static Item snowball = (new ItemSnowball(76)).setIconIndex(14);
+ public static Item boat = (new ItemBoat(77)).setIconIndex(136);
+ public static Item leather = (new Item(78)).setIconIndex(103);
+ public static Item bucketMilk = (new ItemBucket(79, -1)).setIconIndex(77);
+ public static Item brick = (new Item(80)).setIconIndex(22);
+ public static Item clay = (new Item(81)).setIconIndex(57);
+ public static Item reed = (new ItemReed(82, Block.reed)).setIconIndex(27);
+ public static Item paper = (new Item(83)).setIconIndex(58);
+ public static Item book = (new Item(84)).setIconIndex(59);
+ public static Item slimeBall = (new Item(85)).setIconIndex(30);
+ public static Item minecartCrate = (new ItemMinecart(86, 1)).setIconIndex(151);
+ public static Item minecartPowered = (new ItemMinecart(87, 2)).setIconIndex(167);
+ public static Item egg = (new Item(88)).setIconIndex(12);
+ public static Item compass = (new Item(89)).setIconIndex(54);
+ public static Item fishingRod = (new ItemFishingRod(90)).setIconIndex(69);
+ public static Item pocketSundial = (new Item(91)).setIconIndex(70);
+ public static Item lightStoneDust = (new Item(92)).setIconIndex(73);
+ public static Item fishRaw = (new ItemFood(93, 2)).setIconIndex(89);
+ public static Item fishCooked = (new ItemFood(94, 5)).setIconIndex(90);
+ public static Item record13 = (new ItemRecord(2000, "13")).setIconIndex(240);
+ public static Item recordCat = (new ItemRecord(2001, "cat")).setIconIndex(241);
+ public final int shiftedIndex;
+ protected int maxStackSize = 64;
+ protected int maxDamage = 32;
+ protected int iconIndex;
+ protected boolean bFull3D = false;
+
+ protected Item(int var1) {
+ this.shiftedIndex = 256 + var1;
+ if(itemsList[256 + var1] != null) {
+ System.out.println("CONFLICT @ " + var1);
+ }
+
+ itemsList[256 + var1] = this;
+ }
+
+ public Item setIconIndex(int var1) {
+ this.iconIndex = var1;
+ return this;
+ }
+
+ public int getIconIndex(ItemStack var1) {
+ return this.iconIndex;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ return false;
+ }
+
+ public float getStrVsBlock(ItemStack var1, Block var2) {
+ return 1.0F;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ return var1;
+ }
+
+ public int getItemStackLimit() {
+ return this.maxStackSize;
+ }
+
+ public int getMaxDamage() {
+ return this.maxDamage;
+ }
+
+ public void hitEntity(ItemStack var1, EntityLiving var2) {
+ }
+
+ public void hitBlock(ItemStack var1, int var2, int var3, int var4, int var5) {
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ return 1;
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return false;
+ }
+
+ public void func_4019_b(ItemStack var1, EntityLiving var2) {
+ }
+
+ public Item setFull3D() {
+ this.bFull3D = true;
+ return this;
+ }
+
+ public boolean isFull3D() {
+ return this.bFull3D;
+ }
+
+ public boolean shouldRotateAroundWhenRendering() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemArmor.java b/src/main/java/net/minecraft/src/ItemArmor.java
new file mode 100644
index 0000000..75bb557
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemArmor.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+public class ItemArmor extends Item {
+ private static final int[] damageReduceAmmountArray = new int[]{3, 8, 6, 3};
+ private static final int[] maxDamageArray = new int[]{11, 16, 15, 13};
+ public final int armorLevel;
+ public final int armorType;
+ public final int damageReduceAmmount;
+ public final int renderIndex;
+
+ public ItemArmor(int var1, int var2, int var3, int var4) {
+ super(var1);
+ this.armorLevel = var2;
+ this.armorType = var4;
+ this.renderIndex = var3;
+ this.damageReduceAmmount = damageReduceAmmountArray[var4];
+ this.maxDamage = maxDamageArray[var4] * 3 << var2;
+ this.maxStackSize = 1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemAxe.java b/src/main/java/net/minecraft/src/ItemAxe.java
new file mode 100644
index 0000000..e8027b2
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemAxe.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+public class ItemAxe extends ItemTool {
+ private static Block[] blocksEffectiveAgainst = new Block[]{Block.planks, Block.bookShelf, Block.wood, Block.crate};
+
+ public ItemAxe(int var1, int var2) {
+ super(var1, 3, var2, blocksEffectiveAgainst);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemBlock.java b/src/main/java/net/minecraft/src/ItemBlock.java
new file mode 100644
index 0000000..4cb5ebc
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemBlock.java
@@ -0,0 +1,57 @@
+package net.minecraft.src;
+
+public class ItemBlock extends Item {
+ private int blockID;
+
+ public ItemBlock(int var1) {
+ super(var1);
+ this.blockID = var1 + 256;
+ this.setIconIndex(Block.blocksList[var1 + 256].getBlockTextureFromSide(2));
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var3.getBlockId(var4, var5, var6) == Block.snow.blockID) {
+ var7 = 0;
+ } else {
+ if(var7 == 0) {
+ --var5;
+ }
+
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+ }
+
+ if(var1.stackSize == 0) {
+ return false;
+ } else {
+ if(var3.canBlockBePlacedAt(this.blockID, var4, var5, var6, false)) {
+ Block var8 = Block.blocksList[this.blockID];
+ if(var3.setBlockWithNotify(var4, var5, var6, this.blockID)) {
+ Block.blocksList[this.blockID].onBlockPlaced(var3, var4, var5, var6, var7);
+ Block.blocksList[this.blockID].onBlockPlacedBy(var3, var4, var5, var6, var2);
+ var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var8.stepSound.func_1145_d(), (var8.stepSound.func_1147_b() + 1.0F) / 2.0F, var8.stepSound.func_1144_c() * 0.8F);
+ --var1.stackSize;
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemBoat.java b/src/main/java/net/minecraft/src/ItemBoat.java
new file mode 100644
index 0000000..1368b3b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemBoat.java
@@ -0,0 +1,43 @@
+package net.minecraft.src;
+
+public class ItemBoat extends Item {
+ public ItemBoat(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ float var4 = 1.0F;
+ float var5 = var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var4;
+ float var6 = var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var4;
+ double var7 = var3.prevPosX + (var3.posX - var3.prevPosX) * (double)var4;
+ double var9 = var3.prevPosY + (var3.posY - var3.prevPosY) * (double)var4 + 1.62D - (double)var3.yOffset;
+ double var11 = var3.prevPosZ + (var3.posZ - var3.prevPosZ) * (double)var4;
+ Vec3D var13 = Vec3D.createVector(var7, var9, var11);
+ float var14 = MathHelper.cos(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var15 = MathHelper.sin(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var16 = -MathHelper.cos(-var5 * ((float)Math.PI / 180.0F));
+ float var17 = MathHelper.sin(-var5 * ((float)Math.PI / 180.0F));
+ float var18 = var15 * var16;
+ float var20 = var14 * var16;
+ double var21 = 5.0D;
+ Vec3D var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21);
+ MovingObjectPosition var24 = var2.rayTraceBlocks(var13, var23, true);
+ if(var24 == null) {
+ return var1;
+ } else {
+ if(var24.typeOfHit == 0) {
+ int var25 = var24.blockX;
+ int var26 = var24.blockY;
+ int var27 = var24.blockZ;
+ //if(!var2.multiplayerWorld) {
+ var2.entityJoinedWorld(new EntityBoat(var2, (double)((float)var25 + 0.5F), (double)((float)var26 + 1.5F), (double)((float)var27 + 0.5F)));
+ //}
+
+ --var1.stackSize;
+ }
+
+ return var1;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemBow.java b/src/main/java/net/minecraft/src/ItemBow.java
new file mode 100644
index 0000000..1b9b4d6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemBow.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class ItemBow extends Item {
+ public ItemBow(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ if(var3.inventory.consumeInventoryItem(Item.arrow.shiftedIndex)) {
+ var2.playSoundAtEntity(var3, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 0.8F));
+ //if(!var2.multiplayerWorld) {
+ var2.entityJoinedWorld(new EntityArrow(var2, var3));
+ //}
+ }
+
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemBucket.java b/src/main/java/net/minecraft/src/ItemBucket.java
new file mode 100644
index 0000000..c499b87
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemBucket.java
@@ -0,0 +1,101 @@
+package net.minecraft.src;
+
+public class ItemBucket extends Item {
+ private int isFull;
+
+ public ItemBucket(int var1, int var2) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.maxDamage = 64;
+ this.isFull = var2;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ float var4 = 1.0F;
+ float var5 = var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var4;
+ float var6 = var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var4;
+ double var7 = var3.prevPosX + (var3.posX - var3.prevPosX) * (double)var4;
+ double var9 = var3.prevPosY + (var3.posY - var3.prevPosY) * (double)var4 + 1.62D - (double)var3.yOffset;
+ double var11 = var3.prevPosZ + (var3.posZ - var3.prevPosZ) * (double)var4;
+ Vec3D var13 = Vec3D.createVector(var7, var9, var11);
+ float var14 = MathHelper.cos(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var15 = MathHelper.sin(-var6 * ((float)Math.PI / 180.0F) - (float)Math.PI);
+ float var16 = -MathHelper.cos(-var5 * ((float)Math.PI / 180.0F));
+ float var17 = MathHelper.sin(-var5 * ((float)Math.PI / 180.0F));
+ float var18 = var15 * var16;
+ float var20 = var14 * var16;
+ double var21 = 5.0D;
+ Vec3D var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21);
+ MovingObjectPosition var24 = var2.rayTraceBlocks(var13, var23, this.isFull == 0);
+ if(var24 == null) {
+ return var1;
+ } else {
+ if(var24.typeOfHit == 0) {
+ int var25 = var24.blockX;
+ int var26 = var24.blockY;
+ int var27 = var24.blockZ;
+ if(!var2.func_6466_a(var3, var25, var26, var27)) {
+ return var1;
+ }
+
+ if(this.isFull == 0) {
+ if(var2.getBlockMaterial(var25, var26, var27) == Material.water && var2.getBlockMetadata(var25, var26, var27) == 0) {
+ var2.setBlockWithNotify(var25, var26, var27, 0);
+ return new ItemStack(Item.bucketWater);
+ }
+
+ if(var2.getBlockMaterial(var25, var26, var27) == Material.lava && var2.getBlockMetadata(var25, var26, var27) == 0) {
+ var2.setBlockWithNotify(var25, var26, var27, 0);
+ return new ItemStack(Item.bucketLava);
+ }
+ } else {
+ if(this.isFull < 0) {
+ return new ItemStack(Item.bucketEmpty);
+ }
+
+ if(var24.sideHit == 0) {
+ --var26;
+ }
+
+ if(var24.sideHit == 1) {
+ ++var26;
+ }
+
+ if(var24.sideHit == 2) {
+ --var27;
+ }
+
+ if(var24.sideHit == 3) {
+ ++var27;
+ }
+
+ if(var24.sideHit == 4) {
+ --var25;
+ }
+
+ if(var24.sideHit == 5) {
+ ++var25;
+ }
+
+ if(var2.getBlockId(var25, var26, var27) == 0 || !var2.getBlockMaterial(var25, var26, var27).func_878_a()) {
+ if(var2.worldProvider.field_6479_d && this.isFull == Block.waterStill.blockID) {
+ var2.playSoundEffect(var7 + 0.5D, var9 + 0.5D, var11 + 0.5D, "random.fizz", 0.5F, 2.6F + (var2.rand.nextFloat() - var2.rand.nextFloat()) * 0.8F);
+
+ for(int var28 = 0; var28 < 8; ++var28) {
+ var2.spawnParticle("largesmoke", (double)var25 + Math.random(), (double)var26 + Math.random(), (double)var27 + Math.random(), 0.0D, 0.0D, 0.0D);
+ }
+ } else {
+ var2.setBlockAndMetadataWithNotify(var25, var26, var27, this.isFull, 0);
+ }
+
+ return new ItemStack(Item.bucketEmpty);
+ }
+ }
+ } else if(this.isFull == 0 && var24.entityHit instanceof EntityCow) {
+ return new ItemStack(Item.bucketMilk);
+ }
+
+ return var1;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemDoor.java b/src/main/java/net/minecraft/src/ItemDoor.java
new file mode 100644
index 0000000..5ba8451
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemDoor.java
@@ -0,0 +1,72 @@
+package net.minecraft.src;
+
+public class ItemDoor extends Item {
+ private Material field_321_a;
+
+ public ItemDoor(int var1, Material var2) {
+ super(var1);
+ this.field_321_a = var2;
+ this.maxDamage = 64;
+ this.maxStackSize = 1;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 != 1) {
+ return false;
+ } else {
+ ++var5;
+ Block var8;
+ if(this.field_321_a == Material.wood) {
+ var8 = Block.doorWood;
+ } else {
+ var8 = Block.doorSteel;
+ }
+
+ if(!var8.canPlaceBlockAt(var3, var4, var5, var6)) {
+ return false;
+ } else {
+ int var9 = MathHelper.floor_double((double)((var2.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3;
+ byte var10 = 0;
+ byte var11 = 0;
+ if(var9 == 0) {
+ var11 = 1;
+ }
+
+ if(var9 == 1) {
+ var10 = -1;
+ }
+
+ if(var9 == 2) {
+ var11 = -1;
+ }
+
+ if(var9 == 3) {
+ var10 = 1;
+ }
+
+ int var12 = (var3.isBlockOpaqueCube(var4 - var10, var5, var6 - var11) ? 1 : 0) + (var3.isBlockOpaqueCube(var4 - var10, var5 + 1, var6 - var11) ? 1 : 0);
+ int var13 = (var3.isBlockOpaqueCube(var4 + var10, var5, var6 + var11) ? 1 : 0) + (var3.isBlockOpaqueCube(var4 + var10, var5 + 1, var6 + var11) ? 1 : 0);
+ boolean var14 = var3.getBlockId(var4 - var10, var5, var6 - var11) == var8.blockID || var3.getBlockId(var4 - var10, var5 + 1, var6 - var11) == var8.blockID;
+ boolean var15 = var3.getBlockId(var4 + var10, var5, var6 + var11) == var8.blockID || var3.getBlockId(var4 + var10, var5 + 1, var6 + var11) == var8.blockID;
+ boolean var16 = false;
+ if(var14 && !var15) {
+ var16 = true;
+ } else if(var13 > var12) {
+ var16 = true;
+ }
+
+ if(var16) {
+ var9 = var9 - 1 & 3;
+ var9 += 4;
+ }
+
+ var3.setBlockWithNotify(var4, var5, var6, var8.blockID);
+ var3.setBlockMetadataWithNotify(var4, var5, var6, var9);
+ var3.setBlockWithNotify(var4, var5 + 1, var6, var8.blockID);
+ var3.setBlockMetadataWithNotify(var4, var5 + 1, var6, var9 + 8);
+ --var1.stackSize;
+ return true;
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemFishingRod.java b/src/main/java/net/minecraft/src/ItemFishingRod.java
new file mode 100644
index 0000000..86aeadb
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemFishingRod.java
@@ -0,0 +1,33 @@
+package net.minecraft.src;
+
+public class ItemFishingRod extends Item {
+ public ItemFishingRod(int var1) {
+ super(var1);
+ this.maxDamage = 64;
+ }
+
+ public boolean isFull3D() {
+ return true;
+ }
+
+ public boolean shouldRotateAroundWhenRendering() {
+ return true;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ if(var3.fishEntity != null) {
+ int var4 = var3.fishEntity.func_4043_i();
+ var1.damageItem(var4);
+ var3.func_457_w();
+ } else {
+ var2.playSoundAtEntity(var3, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
+ //if(!var2.multiplayerWorld) {
+ var2.entityJoinedWorld(new EntityFish(var2, var3));
+ //}
+
+ var3.func_457_w();
+ }
+
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemFlintAndSteel.java b/src/main/java/net/minecraft/src/ItemFlintAndSteel.java
new file mode 100644
index 0000000..cd682fc
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemFlintAndSteel.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+public class ItemFlintAndSteel extends Item {
+ public ItemFlintAndSteel(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.maxDamage = 64;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 == 0) {
+ --var5;
+ }
+
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+
+ int var8 = var3.getBlockId(var4, var5, var6);
+ if(var8 == 0) {
+ var3.playSoundEffect((double)var4 + 0.5D, (double)var5 + 0.5D, (double)var6 + 0.5D, "fire.ignite", 1.0F, itemRand.nextFloat() * 0.4F + 0.8F);
+ var3.setBlockWithNotify(var4, var5, var6, Block.fire.blockID);
+ }
+
+ var1.damageItem(1);
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemFood.java b/src/main/java/net/minecraft/src/ItemFood.java
new file mode 100644
index 0000000..d0b8bf9
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemFood.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class ItemFood extends Item {
+ private int healAmount;
+
+ public ItemFood(int var1, int var2) {
+ super(var1);
+ this.healAmount = var2;
+ this.maxStackSize = 1;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ --var1.stackSize;
+ var3.heal(this.healAmount);
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemHoe.java b/src/main/java/net/minecraft/src/ItemHoe.java
new file mode 100644
index 0000000..1fe9fe0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemHoe.java
@@ -0,0 +1,45 @@
+package net.minecraft.src;
+
+public class ItemHoe extends Item {
+ public ItemHoe(int var1, int var2) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.maxDamage = 32 << var2;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ int var8 = var3.getBlockId(var4, var5, var6);
+ Material var9 = var3.getBlockMaterial(var4, var5 + 1, var6);
+ if((var9.func_878_a() || var8 != Block.grass.blockID) && var8 != Block.dirt.blockID) {
+ return false;
+ } else {
+ Block var10 = Block.tilledField;
+ var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var10.stepSound.func_1145_d(), (var10.stepSound.func_1147_b() + 1.0F) / 2.0F, var10.stepSound.func_1144_c() * 0.8F);
+ //if(var3.multiplayerWorld) {
+ //return true;
+ //} else {
+ var3.setBlockWithNotify(var4, var5, var6, var10.blockID);
+ var1.damageItem(1);
+ if(var3.rand.nextInt(8) == 0 && var8 == Block.grass.blockID) {
+ byte var11 = 1;
+
+ for(int var12 = 0; var12 < var11; ++var12) {
+ float var13 = 0.7F;
+ float var14 = var3.rand.nextFloat() * var13 + (1.0F - var13) * 0.5F;
+ float var15 = 1.2F;
+ float var16 = var3.rand.nextFloat() * var13 + (1.0F - var13) * 0.5F;
+ EntityItem var17 = new EntityItem(var3, (double)((float)var4 + var14), (double)((float)var5 + var15), (double)((float)var6 + var16), new ItemStack(Item.seeds));
+ var17.field_805_c = 10;
+ var3.entityJoinedWorld(var17);
+ }
+ }
+
+ return true;
+ //}
+ }
+ }
+
+ public boolean isFull3D() {
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemMinecart.java b/src/main/java/net/minecraft/src/ItemMinecart.java
new file mode 100644
index 0000000..4d1fa48
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemMinecart.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+public class ItemMinecart extends Item {
+ public int field_317_a;
+
+ public ItemMinecart(int var1, int var2) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.field_317_a = var2;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ int var8 = var3.getBlockId(var4, var5, var6);
+ if(var8 == Block.minecartTrack.blockID) {
+ //(!var3.multiplayerWorld) {
+ var3.entityJoinedWorld(new EntityMinecart(var3, (double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), this.field_317_a));
+ //}
+
+ --var1.stackSize;
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemPainting.java b/src/main/java/net/minecraft/src/ItemPainting.java
new file mode 100644
index 0000000..dc84948
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemPainting.java
@@ -0,0 +1,37 @@
+package net.minecraft.src;
+
+public class ItemPainting extends Item {
+ public ItemPainting(int var1) {
+ super(var1);
+ this.maxDamage = 64;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 == 0) {
+ return false;
+ } else if(var7 == 1) {
+ return false;
+ } else {
+ byte var8 = 0;
+ if(var7 == 4) {
+ var8 = 1;
+ }
+
+ if(var7 == 3) {
+ var8 = 2;
+ }
+
+ if(var7 == 5) {
+ var8 = 3;
+ }
+
+ EntityPainting var9 = new EntityPainting(var3, var4, var5, var6, var8);
+ if(var9.func_410_i()) {
+ var3.entityJoinedWorld(var9);
+ --var1.stackSize;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemPickaxe.java b/src/main/java/net/minecraft/src/ItemPickaxe.java
new file mode 100644
index 0000000..31ca3e5
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemPickaxe.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public class ItemPickaxe extends ItemTool {
+ private static Block[] blocksEffectiveAgainst = new Block[]{Block.cobblestone, Block.stairDouble, Block.stairSingle, Block.stone, Block.cobblestoneMossy, Block.oreIron, Block.blockSteel, Block.oreCoal, Block.blockGold, Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.blockIce, Block.bloodStone};
+ private int field_328_aY;
+
+ public ItemPickaxe(int var1, int var2) {
+ super(var1, 2, var2, blocksEffectiveAgainst);
+ this.field_328_aY = var2;
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return var1 == Block.obsidian ? this.field_328_aY == 3 : (var1 != Block.blockDiamond && var1 != Block.oreDiamond ? (var1 != Block.blockGold && var1 != Block.oreGold ? (var1 != Block.blockSteel && var1 != Block.oreIron ? (var1 != Block.oreRedstone && var1 != Block.oreRedstoneGlowing ? (var1.blockMaterial == Material.rock ? true : var1.blockMaterial == Material.iron) : this.field_328_aY >= 2) : this.field_328_aY >= 1) : this.field_328_aY >= 2) : this.field_328_aY >= 2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemRecord.java b/src/main/java/net/minecraft/src/ItemRecord.java
new file mode 100644
index 0000000..e7ef4ab
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemRecord.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+public class ItemRecord extends Item {
+ private String recordName;
+
+ protected ItemRecord(int var1, String var2) {
+ super(var1);
+ this.recordName = var2;
+ this.maxStackSize = 1;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var3.getBlockId(var4, var5, var6) == Block.jukebox.blockID && var3.getBlockMetadata(var4, var5, var6) == 0) {
+ var3.setBlockMetadataWithNotify(var4, var5, var6, this.shiftedIndex - Item.record13.shiftedIndex + 1);
+ var3.playRecord(this.recordName, var4, var5, var6);
+ --var1.stackSize;
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemRedstone.java b/src/main/java/net/minecraft/src/ItemRedstone.java
new file mode 100644
index 0000000..937521a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemRedstone.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+public class ItemRedstone extends Item {
+ public ItemRedstone(int var1) {
+ super(var1);
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 == 0) {
+ --var5;
+ }
+
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+
+ if(var3.getBlockId(var4, var5, var6) != 0) {
+ return false;
+ } else {
+ if(Block.redstoneWire.canPlaceBlockAt(var3, var4, var5, var6)) {
+ --var1.stackSize;
+ var3.setBlockWithNotify(var4, var5, var6, Block.redstoneWire.blockID);
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemReed.java b/src/main/java/net/minecraft/src/ItemReed.java
new file mode 100644
index 0000000..b7d6d90
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemReed.java
@@ -0,0 +1,55 @@
+package net.minecraft.src;
+
+public class ItemReed extends Item {
+ private int field_320_a;
+
+ public ItemReed(int var1, Block var2) {
+ super(var1);
+ this.field_320_a = var2.blockID;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var3.getBlockId(var4, var5, var6) == Block.snow.blockID) {
+ var7 = 0;
+ } else {
+ if(var7 == 0) {
+ --var5;
+ }
+
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+ }
+
+ if(var1.stackSize == 0) {
+ return false;
+ } else {
+ if(var3.canBlockBePlacedAt(this.field_320_a, var4, var5, var6, false)) {
+ Block var8 = Block.blocksList[this.field_320_a];
+ if(var3.setBlockWithNotify(var4, var5, var6, this.field_320_a)) {
+ Block.blocksList[this.field_320_a].onBlockPlaced(var3, var4, var5, var6, var7);
+ var3.playSoundEffect((double)((float)var4 + 0.5F), (double)((float)var5 + 0.5F), (double)((float)var6 + 0.5F), var8.stepSound.func_1145_d(), (var8.stepSound.func_1147_b() + 1.0F) / 2.0F, var8.stepSound.func_1144_c() * 0.8F);
+ --var1.stackSize;
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemRenderer.java b/src/main/java/net/minecraft/src/ItemRenderer.java
new file mode 100644
index 0000000..ef6db25
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemRenderer.java
@@ -0,0 +1,350 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class ItemRenderer {
+ private Minecraft mc;
+ private ItemStack field_9451_b = null;
+ private float field_9453_c = 0.0F;
+ private float field_9452_d = 0.0F;
+ private RenderBlocks field_1357_e = new RenderBlocks();
+
+ public ItemRenderer(Minecraft var1) {
+ this.mc = var1;
+ }
+
+ public void renderItem(ItemStack var1) {
+ GL11.glPushMatrix();
+ if(var1.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var1.itemID].getRenderType())) {
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png"));
+ this.field_1357_e.func_1227_a(Block.blocksList[var1.itemID]);
+ } else {
+ if(var1.itemID < 256) {
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/terrain.png"));
+ } else {
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTexture("/gui/items.png"));
+ }
+
+ Tessellator var2 = Tessellator.instance;
+ float var3 = ((float)(var1.getIconIndex() % 16 * 16) + 0.0F) / 256.0F;
+ float var4 = ((float)(var1.getIconIndex() % 16 * 16) + 15.99F) / 256.0F;
+ float var5 = ((float)(var1.getIconIndex() / 16 * 16) + 0.0F) / 256.0F;
+ float var6 = ((float)(var1.getIconIndex() / 16 * 16) + 15.99F) / 256.0F;
+ float var7 = 1.0F;
+ float var8 = 0.0F;
+ float var9 = 0.3F;
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glTranslatef(-var8, -var9, 0.0F);
+ float var10 = 1.5F;
+ GL11.glScalef(var10, var10, var10);
+ GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(335.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glTranslatef(-(15.0F / 16.0F), -(1.0F / 16.0F), 0.0F);
+ float var11 = 1.0F / 16.0F;
+ var2.startDrawingQuads();
+ var2.setNormal(0.0F, 0.0F, 1.0F);
+ var2.addVertexWithUV(0.0D, 0.0D, 0.0D, (double)var4, (double)var6);
+ var2.addVertexWithUV((double)var7, 0.0D, 0.0D, (double)var3, (double)var6);
+ var2.addVertexWithUV((double)var7, 1.0D, 0.0D, (double)var3, (double)var5);
+ var2.addVertexWithUV(0.0D, 1.0D, 0.0D, (double)var4, (double)var5);
+ var2.draw();
+ var2.startDrawingQuads();
+ var2.setNormal(0.0F, 0.0F, -1.0F);
+ var2.addVertexWithUV(0.0D, 1.0D, (double)(0.0F - var11), (double)var4, (double)var5);
+ var2.addVertexWithUV((double)var7, 1.0D, (double)(0.0F - var11), (double)var3, (double)var5);
+ var2.addVertexWithUV((double)var7, 0.0D, (double)(0.0F - var11), (double)var3, (double)var6);
+ var2.addVertexWithUV(0.0D, 0.0D, (double)(0.0F - var11), (double)var4, (double)var6);
+ var2.draw();
+ var2.startDrawingQuads();
+ var2.setNormal(-1.0F, 0.0F, 0.0F);
+
+ int var12;
+ float var13;
+ float var14;
+ float var15;
+ for(var12 = 0; var12 < 16; ++var12) {
+ var13 = (float)var12 / 16.0F;
+ var14 = var4 + (var3 - var4) * var13 - 0.001953125F;
+ var15 = var7 * var13;
+ var2.addVertexWithUV((double)var15, 0.0D, (double)(0.0F - var11), (double)var14, (double)var6);
+ var2.addVertexWithUV((double)var15, 0.0D, 0.0D, (double)var14, (double)var6);
+ var2.addVertexWithUV((double)var15, 1.0D, 0.0D, (double)var14, (double)var5);
+ var2.addVertexWithUV((double)var15, 1.0D, (double)(0.0F - var11), (double)var14, (double)var5);
+ }
+
+ var2.draw();
+ var2.startDrawingQuads();
+ var2.setNormal(1.0F, 0.0F, 0.0F);
+
+ for(var12 = 0; var12 < 16; ++var12) {
+ var13 = (float)var12 / 16.0F;
+ var14 = var4 + (var3 - var4) * var13 - 0.001953125F;
+ var15 = var7 * var13 + 1.0F / 16.0F;
+ var2.addVertexWithUV((double)var15, 1.0D, (double)(0.0F - var11), (double)var14, (double)var5);
+ var2.addVertexWithUV((double)var15, 1.0D, 0.0D, (double)var14, (double)var5);
+ var2.addVertexWithUV((double)var15, 0.0D, 0.0D, (double)var14, (double)var6);
+ var2.addVertexWithUV((double)var15, 0.0D, (double)(0.0F - var11), (double)var14, (double)var6);
+ }
+
+ var2.draw();
+ var2.startDrawingQuads();
+ var2.setNormal(0.0F, 1.0F, 0.0F);
+
+ for(var12 = 0; var12 < 16; ++var12) {
+ var13 = (float)var12 / 16.0F;
+ var14 = var6 + (var5 - var6) * var13 - 0.001953125F;
+ var15 = var7 * var13 + 1.0F / 16.0F;
+ var2.addVertexWithUV(0.0D, (double)var15, 0.0D, (double)var4, (double)var14);
+ var2.addVertexWithUV((double)var7, (double)var15, 0.0D, (double)var3, (double)var14);
+ var2.addVertexWithUV((double)var7, (double)var15, (double)(0.0F - var11), (double)var3, (double)var14);
+ var2.addVertexWithUV(0.0D, (double)var15, (double)(0.0F - var11), (double)var4, (double)var14);
+ }
+
+ var2.draw();
+ var2.startDrawingQuads();
+ var2.setNormal(0.0F, -1.0F, 0.0F);
+
+ for(var12 = 0; var12 < 16; ++var12) {
+ var13 = (float)var12 / 16.0F;
+ var14 = var6 + (var5 - var6) * var13 - 0.001953125F;
+ var15 = var7 * var13;
+ var2.addVertexWithUV((double)var7, (double)var15, 0.0D, (double)var3, (double)var14);
+ var2.addVertexWithUV(0.0D, (double)var15, 0.0D, (double)var4, (double)var14);
+ var2.addVertexWithUV(0.0D, (double)var15, (double)(0.0F - var11), (double)var4, (double)var14);
+ var2.addVertexWithUV((double)var7, (double)var15, (double)(0.0F - var11), (double)var3, (double)var14);
+ }
+
+ var2.draw();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ }
+
+ GL11.glPopMatrix();
+ }
+
+ public void renderItemInFirstPerson(float var1) {
+ float var2 = this.field_9452_d + (this.field_9453_c - this.field_9452_d) * var1;
+ EntityPlayerSP var3 = this.mc.thePlayer;
+ GL11.glPushMatrix();
+ GL11.glRotatef(var3.prevRotationPitch + (var3.rotationPitch - var3.prevRotationPitch) * var1, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(var3.prevRotationYaw + (var3.rotationYaw - var3.prevRotationYaw) * var1, 0.0F, 1.0F, 0.0F);
+ RenderHelper.enableStandardItemLighting();
+ GL11.glPopMatrix();
+ float var4 = this.mc.theWorld.getLightBrightness(MathHelper.floor_double(var3.posX), MathHelper.floor_double(var3.posY), MathHelper.floor_double(var3.posZ));
+ GL11.glColor4f(var4, var4, var4, 1.0F);
+ ItemStack var5 = this.field_9451_b;
+ if(var3.fishEntity != null) {
+ var5 = new ItemStack(Item.stick.shiftedIndex);
+ }
+
+ float var6;
+ float var7;
+ float var8;
+ float var9;
+ if(var5 != null) {
+ GL11.glPushMatrix();
+ var6 = 0.8F;
+ var7 = var3.getSwingProgress(var1);
+ var8 = MathHelper.sin(var7 * (float)Math.PI);
+ var9 = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI);
+ GL11.glTranslatef(-var9 * 0.4F, MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI * 2.0F) * 0.2F, -var8 * 0.2F);
+ GL11.glTranslatef(0.7F * var6, -0.65F * var6 - (1.0F - var2) * 0.6F, -0.9F * var6);
+ GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ var7 = var3.getSwingProgress(var1);
+ var8 = MathHelper.sin(var7 * var7 * (float)Math.PI);
+ var9 = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI);
+ GL11.glRotatef(-var8 * 20.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-var9 * 20.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(-var9 * 80.0F, 1.0F, 0.0F, 0.0F);
+ var7 = 0.4F;
+ GL11.glScalef(var7, var7, var7);
+ if(var5.getItem().shouldRotateAroundWhenRendering()) {
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ }
+
+ this.renderItem(var5);
+ GL11.glPopMatrix();
+ } else {
+ GL11.glPushMatrix();
+ var6 = 0.8F;
+ var7 = var3.getSwingProgress(var1);
+ var8 = MathHelper.sin(var7 * (float)Math.PI);
+ var9 = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI);
+ GL11.glTranslatef(-var9 * 0.3F, MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI * 2.0F) * 0.4F, -var8 * 0.4F);
+ GL11.glTranslatef(0.8F * var6, -(12.0F / 16.0F) * var6 - (1.0F - var2) * 0.6F, -0.9F * var6);
+ GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ var7 = var3.getSwingProgress(var1);
+ var8 = MathHelper.sin(var7 * var7 * (float)Math.PI);
+ var9 = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI);
+ GL11.glRotatef(var9 * 70.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-var8 * 20.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.mc.renderEngine.getTextureForDownloadableImage(this.mc.thePlayer.skinUrl, this.mc.thePlayer.getEntityTexture()));
+ GL11.glTranslatef(-1.0F, 3.6F, 3.5F);
+ GL11.glRotatef(120.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(200.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(-135.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glScalef(1.0F, 1.0F, 1.0F);
+ GL11.glTranslatef(5.6F, 0.0F, 0.0F);
+ Render var10 = RenderManager.instance.func_855_a(this.mc.thePlayer);
+ RenderPlayer var11 = (RenderPlayer)var10;
+ var9 = 1.0F;
+ GL11.glScalef(var9, var9, var9);
+ var11.drawFirstPersonHand();
+ GL11.glPopMatrix();
+ }
+
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ RenderHelper.disableStandardItemLighting();
+ }
+
+ public void renderOverlays(float var1) {
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ int var2;
+ if(this.mc.thePlayer.fire > 0 || this.mc.thePlayer.field_9299_bv) {
+ var2 = this.mc.renderEngine.getTexture("/terrain.png");
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2);
+ this.renderFireInFirstPerson(var1);
+ }
+
+ if(this.mc.thePlayer.func_345_I()) {
+ var2 = MathHelper.floor_double(this.mc.thePlayer.posX);
+ int var3 = MathHelper.floor_double(this.mc.thePlayer.posY);
+ int var4 = MathHelper.floor_double(this.mc.thePlayer.posZ);
+ int var5 = this.mc.renderEngine.getTexture("/terrain.png");
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var5);
+ int var6 = this.mc.theWorld.getBlockId(var2, var3, var4);
+ if(Block.blocksList[var6] != null) {
+ this.renderInsideOfBlock(var1, Block.blocksList[var6].getBlockTextureFromSide(2));
+ }
+ }
+
+ if(this.mc.thePlayer.isInsideOfMaterial(Material.water)) {
+ var2 = this.mc.renderEngine.getTexture("/misc/water.png");
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var2);
+ this.renderWarpedTextureOverlay(var1);
+ }
+
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ }
+
+ private void renderInsideOfBlock(float var1, int var2) {
+ Tessellator var3 = Tessellator.instance;
+ this.mc.thePlayer.getEntityBrightness(var1);
+ float var4 = 0.1F;
+ GL11.glColor4f(var4, var4, var4, 0.5F);
+ GL11.glPushMatrix();
+ float var5 = -1.0F;
+ float var6 = 1.0F;
+ float var7 = -1.0F;
+ float var8 = 1.0F;
+ float var9 = -0.5F;
+ float var10 = 0.0078125F;
+ float var11 = (float)(var2 % 16) / 256.0F - var10;
+ float var12 = ((float)(var2 % 16) + 15.99F) / 256.0F + var10;
+ float var13 = (float)(var2 / 16) / 256.0F - var10;
+ float var14 = ((float)(var2 / 16) + 15.99F) / 256.0F + var10;
+ var3.startDrawingQuads();
+ var3.addVertexWithUV((double)var5, (double)var7, (double)var9, (double)var12, (double)var14);
+ var3.addVertexWithUV((double)var6, (double)var7, (double)var9, (double)var11, (double)var14);
+ var3.addVertexWithUV((double)var6, (double)var8, (double)var9, (double)var11, (double)var13);
+ var3.addVertexWithUV((double)var5, (double)var8, (double)var9, (double)var12, (double)var13);
+ var3.draw();
+ GL11.glPopMatrix();
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ private void renderWarpedTextureOverlay(float var1) {
+ Tessellator var2 = Tessellator.instance;
+ float var3 = this.mc.thePlayer.getEntityBrightness(var1);
+ GL11.glColor4f(var3, var3, var3, 0.5F);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glPushMatrix();
+ float var4 = 4.0F;
+ float var5 = -1.0F;
+ float var6 = 1.0F;
+ float var7 = -1.0F;
+ float var8 = 1.0F;
+ float var9 = -0.5F;
+ float var10 = -this.mc.thePlayer.rotationYaw / 64.0F;
+ float var11 = this.mc.thePlayer.rotationPitch / 64.0F;
+ var2.startDrawingQuads();
+ var2.addVertexWithUV((double)var5, (double)var7, (double)var9, (double)(var4 + var10), (double)(var4 + var11));
+ var2.addVertexWithUV((double)var6, (double)var7, (double)var9, (double)(0.0F + var10), (double)(var4 + var11));
+ var2.addVertexWithUV((double)var6, (double)var8, (double)var9, (double)(0.0F + var10), (double)(0.0F + var11));
+ var2.addVertexWithUV((double)var5, (double)var8, (double)var9, (double)(var4 + var10), (double)(0.0F + var11));
+ var2.draw();
+ GL11.glPopMatrix();
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+
+ private void renderFireInFirstPerson(float var1) {
+ Tessellator var2 = Tessellator.instance;
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.9F);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ float var3 = 1.0F;
+
+ for(int var4 = 0; var4 < 2; ++var4) {
+ GL11.glPushMatrix();
+ int var5 = Block.fire.blockIndexInTexture + var4 * 16;
+ int var6 = (var5 & 15) << 4;
+ int var7 = var5 & 240;
+ float var8 = (float)var6 / 256.0F;
+ float var9 = ((float)var6 + 15.99F) / 256.0F;
+ float var10 = (float)var7 / 256.0F;
+ float var11 = ((float)var7 + 15.99F) / 256.0F;
+ float var12 = (0.0F - var3) / 2.0F;
+ float var13 = var12 + var3;
+ float var14 = 0.0F - var3 / 2.0F;
+ float var15 = var14 + var3;
+ float var16 = -0.5F;
+ GL11.glTranslatef((float)(-(var4 * 2 - 1)) * 0.24F, -0.3F, 0.0F);
+ GL11.glRotatef((float)(var4 * 2 - 1) * 10.0F, 0.0F, 1.0F, 0.0F);
+ var2.startDrawingQuads();
+ var2.addVertexWithUV((double)var12, (double)var14, (double)var16, (double)var9, (double)var11);
+ var2.addVertexWithUV((double)var13, (double)var14, (double)var16, (double)var8, (double)var11);
+ var2.addVertexWithUV((double)var13, (double)var15, (double)var16, (double)var8, (double)var10);
+ var2.addVertexWithUV((double)var12, (double)var15, (double)var16, (double)var9, (double)var10);
+ var2.draw();
+ GL11.glPopMatrix();
+ }
+
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+
+ public void func_895_a() {
+ this.field_9452_d = this.field_9453_c;
+ EntityPlayerSP var1 = this.mc.thePlayer;
+ ItemStack var2 = var1.inventory.getCurrentItem();
+ float var4 = 0.4F;
+ float var5 = var2 == this.field_9451_b ? 1.0F : 0.0F;
+ float var6 = var5 - this.field_9453_c;
+ if(var6 < -var4) {
+ var6 = -var4;
+ }
+
+ if(var6 > var4) {
+ var6 = var4;
+ }
+
+ this.field_9453_c += var6;
+ if(this.field_9453_c < 0.1F) {
+ this.field_9451_b = var2;
+ }
+
+ }
+
+ public void func_9449_b() {
+ this.field_9453_c = 0.0F;
+ }
+
+ public void func_9450_c() {
+ this.field_9453_c = 0.0F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemSaddle.java b/src/main/java/net/minecraft/src/ItemSaddle.java
new file mode 100644
index 0000000..1afc4b5
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemSaddle.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+public class ItemSaddle extends Item {
+ public ItemSaddle(int var1) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.maxDamage = 64;
+ }
+
+ public void func_4019_b(ItemStack var1, EntityLiving var2) {
+ if(var2 instanceof EntityPig) {
+ EntityPig var3 = (EntityPig)var2;
+ if(!var3.rideable) {
+ var3.rideable = true;
+ --var1.stackSize;
+ }
+ }
+
+ }
+
+ public void hitEntity(ItemStack var1, EntityLiving var2) {
+ this.func_4019_b(var1, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemSeeds.java b/src/main/java/net/minecraft/src/ItemSeeds.java
new file mode 100644
index 0000000..1710687
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemSeeds.java
@@ -0,0 +1,25 @@
+package net.minecraft.src;
+
+public class ItemSeeds extends Item {
+ private int field_318_a;
+
+ public ItemSeeds(int var1, int var2) {
+ super(var1);
+ this.field_318_a = var2;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 != 1) {
+ return false;
+ } else {
+ int var8 = var3.getBlockId(var4, var5, var6);
+ if(var8 == Block.tilledField.blockID) {
+ var3.setBlockWithNotify(var4, var5 + 1, var6, this.field_318_a);
+ --var1.stackSize;
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemSign.java b/src/main/java/net/minecraft/src/ItemSign.java
new file mode 100644
index 0000000..834426b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemSign.java
@@ -0,0 +1,55 @@
+package net.minecraft.src;
+
+public class ItemSign extends Item {
+ public ItemSign(int var1) {
+ super(var1);
+ this.maxDamage = 64;
+ this.maxStackSize = 1;
+ }
+
+ public boolean onItemUse(ItemStack var1, EntityPlayer var2, World var3, int var4, int var5, int var6, int var7) {
+ if(var7 == 0) {
+ return false;
+ } else if(!var3.getBlockMaterial(var4, var5, var6).func_878_a()) {
+ return false;
+ } else {
+ if(var7 == 1) {
+ ++var5;
+ }
+
+ if(var7 == 2) {
+ --var6;
+ }
+
+ if(var7 == 3) {
+ ++var6;
+ }
+
+ if(var7 == 4) {
+ --var4;
+ }
+
+ if(var7 == 5) {
+ ++var4;
+ }
+
+ if(!Block.signPost.canPlaceBlockAt(var3, var4, var5, var6)) {
+ return false;
+ } else {
+ if(var7 == 1) {
+ var3.setBlockAndMetadataWithNotify(var4, var5, var6, Block.signPost.blockID, MathHelper.floor_double((double)((var2.rotationYaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15);
+ } else {
+ var3.setBlockAndMetadataWithNotify(var4, var5, var6, Block.signWall.blockID, var7);
+ }
+
+ --var1.stackSize;
+ TileEntitySign var8 = (TileEntitySign)var3.getBlockTileEntity(var4, var5, var6);
+ if(var8 != null) {
+ var2.displayGUIEditSign(var8);
+ }
+
+ return true;
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemSnowball.java b/src/main/java/net/minecraft/src/ItemSnowball.java
new file mode 100644
index 0000000..7b5efec
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemSnowball.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class ItemSnowball extends Item {
+ public ItemSnowball(int var1) {
+ super(var1);
+ this.maxStackSize = 16;
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ --var1.stackSize;
+ var2.playSoundAtEntity(var3, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
+ //if(!var2.multiplayerWorld) {
+ var2.entityJoinedWorld(new EntitySnowball(var2, var3));
+ //}
+
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemSoup.java b/src/main/java/net/minecraft/src/ItemSoup.java
new file mode 100644
index 0000000..7143549
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemSoup.java
@@ -0,0 +1,12 @@
+package net.minecraft.src;
+
+public class ItemSoup extends ItemFood {
+ public ItemSoup(int var1, int var2) {
+ super(var1, var2);
+ }
+
+ public ItemStack onItemRightClick(ItemStack var1, World var2, EntityPlayer var3) {
+ super.onItemRightClick(var1, var2, var3);
+ return new ItemStack(Item.bowlEmpty);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemSpade.java b/src/main/java/net/minecraft/src/ItemSpade.java
new file mode 100644
index 0000000..2f85c9b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemSpade.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ItemSpade extends ItemTool {
+ private static Block[] blocksEffectiveAgainst = new Block[]{Block.grass, Block.dirt, Block.sand, Block.gravel, Block.snow, Block.blockSnow, Block.blockClay};
+
+ public ItemSpade(int var1, int var2) {
+ super(var1, 1, var2, blocksEffectiveAgainst);
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return var1 == Block.snow ? true : var1 == Block.blockSnow;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemStack.java b/src/main/java/net/minecraft/src/ItemStack.java
new file mode 100644
index 0000000..39838fa
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemStack.java
@@ -0,0 +1,132 @@
+package net.minecraft.src;
+
+public final class ItemStack {
+ public int stackSize;
+ public int animationsToGo;
+ public int itemID;
+ public int itemDamage;
+
+ public ItemStack(Block var1) {
+ this((Block)var1, 1);
+ }
+
+ public ItemStack(Block var1, int var2) {
+ this(var1.blockID, var2);
+ }
+
+ public ItemStack(Item var1) {
+ this((Item)var1, 1);
+ }
+
+ public ItemStack(Item var1, int var2) {
+ this(var1.shiftedIndex, var2);
+ }
+
+ public ItemStack(int var1) {
+ this(var1, 1);
+ }
+
+ public ItemStack(int var1, int var2) {
+ this.stackSize = 0;
+ this.itemID = var1;
+ this.stackSize = var2;
+ }
+
+ public ItemStack(int var1, int var2, int var3) {
+ this.stackSize = 0;
+ this.itemID = var1;
+ this.stackSize = var2;
+ this.itemDamage = var3;
+ }
+
+ public ItemStack(NBTTagCompound var1) {
+ this.stackSize = 0;
+ this.readFromNBT(var1);
+ }
+
+ public ItemStack splitStack(int var1) {
+ this.stackSize -= var1;
+ return new ItemStack(this.itemID, var1, this.itemDamage);
+ }
+
+ public Item getItem() {
+ return Item.itemsList[this.itemID];
+ }
+
+ public int getIconIndex() {
+ return this.getItem().getIconIndex(this);
+ }
+
+ public boolean useItem(EntityPlayer var1, World var2, int var3, int var4, int var5, int var6) {
+ return this.getItem().onItemUse(this, var1, var2, var3, var4, var5, var6);
+ }
+
+ public float getStrVsBlock(Block var1) {
+ return this.getItem().getStrVsBlock(this, var1);
+ }
+
+ public ItemStack useItemRightClick(World var1, EntityPlayer var2) {
+ return this.getItem().onItemRightClick(this, var1, var2);
+ }
+
+ public NBTTagCompound writeToNBT(NBTTagCompound var1) {
+ var1.setShort("id", (short)this.itemID);
+ var1.setByte("Count", (byte)this.stackSize);
+ var1.setShort("Damage", (short)this.itemDamage);
+ return var1;
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ this.itemID = var1.getShort("id");
+ this.stackSize = var1.getByte("Count");
+ this.itemDamage = var1.getShort("Damage");
+ }
+
+ public int getMaxStackSize() {
+ return this.getItem().getItemStackLimit();
+ }
+
+ public int getMaxDamage() {
+ return Item.itemsList[this.itemID].getMaxDamage();
+ }
+
+ public void damageItem(int var1) {
+ this.itemDamage += var1;
+ if(this.itemDamage > this.getMaxDamage()) {
+ --this.stackSize;
+ if(this.stackSize < 0) {
+ this.stackSize = 0;
+ }
+
+ this.itemDamage = 0;
+ }
+
+ }
+
+ public void hitEntity(EntityLiving var1) {
+ Item.itemsList[this.itemID].hitEntity(this, var1);
+ }
+
+ public void hitBlock(int var1, int var2, int var3, int var4) {
+ Item.itemsList[this.itemID].hitBlock(this, var1, var2, var3, var4);
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ return Item.itemsList[this.itemID].getDamageVsEntity(var1);
+ }
+
+ public boolean canHarvestBlock(Block var1) {
+ return Item.itemsList[this.itemID].canHarvestBlock(var1);
+ }
+
+ public void func_1097_a(EntityPlayer var1) {
+ }
+
+ public void useItemOnEntity(EntityLiving var1) {
+ Item.itemsList[this.itemID].func_4019_b(this, var1);
+ }
+
+ public ItemStack copy() {
+ return new ItemStack(this.itemID, this.stackSize, this.itemDamage);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemSword.java b/src/main/java/net/minecraft/src/ItemSword.java
new file mode 100644
index 0000000..0bd7b56
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemSword.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+public class ItemSword extends Item {
+ private int weaponDamage;
+
+ public ItemSword(int var1, int var2) {
+ super(var1);
+ this.maxStackSize = 1;
+ this.maxDamage = 32 << var2;
+ if(var2 == 3) {
+ this.maxDamage *= 4;
+ }
+
+ this.weaponDamage = 4 + var2 * 2;
+ }
+
+ public float getStrVsBlock(ItemStack var1, Block var2) {
+ return 1.5F;
+ }
+
+ public void hitEntity(ItemStack var1, EntityLiving var2) {
+ var1.damageItem(1);
+ }
+
+ public void hitBlock(ItemStack var1, int var2, int var3, int var4, int var5) {
+ var1.damageItem(2);
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ return this.weaponDamage;
+ }
+
+ public boolean isFull3D() {
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ItemTool.java b/src/main/java/net/minecraft/src/ItemTool.java
new file mode 100644
index 0000000..a61fb01
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ItemTool.java
@@ -0,0 +1,48 @@
+package net.minecraft.src;
+
+public class ItemTool extends Item {
+ private Block[] blocksEffectiveAgainst;
+ private float efficiencyOnProperMaterial = 4.0F;
+ private int damageVsEntity;
+ protected int ingredientQuality;
+
+ public ItemTool(int var1, int var2, int var3, Block[] var4) {
+ super(var1);
+ this.ingredientQuality = var3;
+ this.blocksEffectiveAgainst = var4;
+ this.maxStackSize = 1;
+ this.maxDamage = 32 << var3;
+ if(var3 == 3) {
+ this.maxDamage *= 4;
+ }
+
+ this.efficiencyOnProperMaterial = (float)((var3 + 1) * 2);
+ this.damageVsEntity = var2 + var3;
+ }
+
+ public float getStrVsBlock(ItemStack var1, Block var2) {
+ for(int var3 = 0; var3 < this.blocksEffectiveAgainst.length; ++var3) {
+ if(this.blocksEffectiveAgainst[var3] == var2) {
+ return this.efficiencyOnProperMaterial;
+ }
+ }
+
+ return 1.0F;
+ }
+
+ public void hitEntity(ItemStack var1, EntityLiving var2) {
+ var1.damageItem(2);
+ }
+
+ public void hitBlock(ItemStack var1, int var2, int var3, int var4, int var5) {
+ var1.damageItem(1);
+ }
+
+ public int getDamageVsEntity(Entity var1) {
+ return this.damageVsEntity;
+ }
+
+ public boolean isFull3D() {
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/KeyBinding.java b/src/main/java/net/minecraft/src/KeyBinding.java
new file mode 100644
index 0000000..6d27b38
--- /dev/null
+++ b/src/main/java/net/minecraft/src/KeyBinding.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class KeyBinding {
+ public String keyDescription;
+ public int keyCode;
+
+ public KeyBinding(String var1, int var2) {
+ this.keyDescription = var1;
+ this.keyCode = var2;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/LoadingScreenRenderer.java b/src/main/java/net/minecraft/src/LoadingScreenRenderer.java
new file mode 100644
index 0000000..2c21aaf
--- /dev/null
+++ b/src/main/java/net/minecraft/src/LoadingScreenRenderer.java
@@ -0,0 +1,124 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+import org.lwjgl.opengl.GL11;
+
+public class LoadingScreenRenderer implements IProgressUpdate {
+ private String field_1004_a = "";
+ private Minecraft mc;
+ private String field_1007_c = "";
+ private long field_1006_d = System.currentTimeMillis();
+ private boolean field_1005_e = false;
+
+ public LoadingScreenRenderer(Minecraft var1) {
+ this.mc = var1;
+ }
+
+ public void func_596_a(String var1) {
+ this.field_1005_e = false;
+ this.func_597_c(var1);
+ }
+
+ public void func_594_b(String var1) {
+ this.field_1005_e = true;
+ this.func_597_c(this.field_1007_c);
+ }
+
+ public void func_597_c(String var1) {
+ if(!this.mc.running) {
+ if(!this.field_1005_e) {
+ throw new MinecraftError();
+ }
+ } else {
+ this.field_1007_c = var1;
+ ScaledResolution var2 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight);
+ int var3 = var2.getScaledWidth();
+ int var4 = var2.getScaledHeight();
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glLoadIdentity();
+ GL11.glOrtho(0.0D, (double)var3, (double)var4, 0.0D, 100.0D, 300.0D);
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glLoadIdentity();
+ GL11.glTranslatef(0.0F, 0.0F, -200.0F);
+ }
+ }
+
+ public void displayLoadingString(String var1) {
+ if(!this.mc.running) {
+ if(!this.field_1005_e) {
+ throw new MinecraftError();
+ }
+ } else {
+ this.field_1006_d = 0L;
+ this.field_1004_a = var1;
+ this.setLoadingProgress(-1);
+ this.field_1006_d = 0L;
+ }
+ }
+
+ public void setLoadingProgress(int var1) {
+ if(!this.mc.running) {
+ if(!this.field_1005_e) {
+ throw new MinecraftError();
+ }
+ } else {
+ long var2 = System.currentTimeMillis();
+ if(var2 - this.field_1006_d >= 20L) {
+ this.field_1006_d = var2;
+ ScaledResolution var4 = new ScaledResolution(this.mc.displayWidth, this.mc.displayHeight);
+ int var5 = var4.getScaledWidth();
+ int var6 = var4.getScaledHeight();
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
+ GL11.glMatrixMode(GL11.GL_PROJECTION);
+ GL11.glLoadIdentity();
+ GL11.glOrtho(0.0D, (double)var5, (double)var6, 0.0D, 100.0D, 300.0D);
+ GL11.glMatrixMode(GL11.GL_MODELVIEW);
+ GL11.glLoadIdentity();
+ GL11.glTranslatef(0.0F, 0.0F, -200.0F);
+ GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_COLOR_BUFFER_BIT);
+ Tessellator var7 = Tessellator.instance;
+ int var8 = this.mc.renderEngine.getTexture("/gui/background.png");
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var8);
+ float var9 = 32.0F;
+ var7.startDrawingQuads();
+ var7.setColorOpaque_I(4210752);
+ var7.addVertexWithUV(0.0D, (double)var6, 0.0D, 0.0D, (double)((float)var6 / var9));
+ var7.addVertexWithUV((double)var5, (double)var6, 0.0D, (double)((float)var5 / var9), (double)((float)var6 / var9));
+ var7.addVertexWithUV((double)var5, 0.0D, 0.0D, (double)((float)var5 / var9), 0.0D);
+ var7.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
+ var7.draw();
+ if(var1 >= 0) {
+ byte var10 = 100;
+ byte var11 = 2;
+ int var12 = var5 / 2 - var10 / 2;
+ int var13 = var6 / 2 + 16;
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ var7.startDrawingQuads();
+ var7.setColorOpaque_I(8421504);
+ var7.addVertex((double)var12, (double)var13, 0.0D);
+ var7.addVertex((double)var12, (double)(var13 + var11), 0.0D);
+ var7.addVertex((double)(var12 + var10), (double)(var13 + var11), 0.0D);
+ var7.addVertex((double)(var12 + var10), (double)var13, 0.0D);
+ var7.setColorOpaque_I(8454016);
+ var7.addVertex((double)var12, (double)var13, 0.0D);
+ var7.addVertex((double)var12, (double)(var13 + var11), 0.0D);
+ var7.addVertex((double)(var12 + var1), (double)(var13 + var11), 0.0D);
+ var7.addVertex((double)(var12 + var1), (double)var13, 0.0D);
+ var7.draw();
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ this.mc.fontRenderer.drawStringWithShadow(this.field_1007_c, (var5 - this.mc.fontRenderer.getStringWidth(this.field_1007_c)) / 2, var6 / 2 - 4 - 16, 16777215);
+ this.mc.fontRenderer.drawStringWithShadow(this.field_1004_a, (var5 - this.mc.fontRenderer.getStringWidth(this.field_1004_a)) / 2, var6 / 2 - 4 + 8, 16777215);
+ GL11.updateDisplay();
+
+ try {
+ Thread.yield();
+ } catch (Exception var14) {
+ }
+
+ }
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/LogoEffectRandomizer.java b/src/main/java/net/minecraft/src/LogoEffectRandomizer.java
new file mode 100644
index 0000000..29da6e7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/LogoEffectRandomizer.java
@@ -0,0 +1,28 @@
+package net.minecraft.src;
+
+class LogoEffectRandomizer {
+ public double field_1312_a;
+ public double field_1311_b;
+ public double field_1314_c;
+ final GuiMainMenu mainMenu;
+
+ public LogoEffectRandomizer(GuiMainMenu var1, int var2, int var3) {
+ this.mainMenu = var1;
+ this.field_1312_a = this.field_1311_b = (double)(10 + var3) + GuiMainMenu.getRand().nextDouble() * 32.0D + (double)var2;
+ }
+
+ public void func_875_a() {
+ this.field_1311_b = this.field_1312_a;
+ if(this.field_1312_a > 0.0D) {
+ this.field_1314_c -= 0.6D;
+ }
+
+ this.field_1312_a += this.field_1314_c;
+ this.field_1314_c *= 0.9D;
+ if(this.field_1312_a < 0.0D) {
+ this.field_1312_a = 0.0D;
+ this.field_1314_c = 0.0D;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MCHashTable.java b/src/main/java/net/minecraft/src/MCHashTable.java
new file mode 100644
index 0000000..ffe720b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MCHashTable.java
@@ -0,0 +1,135 @@
+package net.minecraft.src;
+
+public class MCHashTable {
+ private transient HashEntry[] slots = new HashEntry[16];
+ private transient int count;
+ private int threshold = 12;
+ private final float growFactor = 12.0F / 16.0F;
+ private transient volatile int versionStamp;
+
+ private static int computeHash(int var0) {
+ var0 ^= var0 >>> 20 ^ var0 >>> 12;
+ return var0 ^ var0 >>> 7 ^ var0 >>> 4;
+ }
+
+ private static int getSlotIndex(int var0, int var1) {
+ return var0 & var1 - 1;
+ }
+
+ public Object lookup(int var1) {
+ int var2 = computeHash(var1);
+
+ for(HashEntry var3 = this.slots[getSlotIndex(var2, this.slots.length)]; var3 != null; var3 = var3.nextEntry) {
+ if(var3.hashEntry == var1) {
+ return var3.valueEntry;
+ }
+ }
+
+ return null;
+ }
+
+ public void addKey(int var1, Object var2) {
+ int var3 = computeHash(var1);
+ int var4 = getSlotIndex(var3, this.slots.length);
+
+ for(HashEntry var5 = this.slots[var4]; var5 != null; var5 = var5.nextEntry) {
+ if(var5.hashEntry == var1) {
+ var5.valueEntry = var2;
+ }
+ }
+
+ ++this.versionStamp;
+ this.insert(var3, var1, var2, var4);
+ }
+
+ private void grow(int var1) {
+ HashEntry[] var2 = this.slots;
+ int var3 = var2.length;
+ if(var3 == 1073741824) {
+ this.threshold = Integer.MAX_VALUE;
+ } else {
+ HashEntry[] var4 = new HashEntry[var1];
+ this.copyTo(var4);
+ this.slots = var4;
+ this.threshold = (int)((float)var1 * this.growFactor);
+ }
+ }
+
+ private void copyTo(HashEntry[] var1) {
+ HashEntry[] var2 = this.slots;
+ int var3 = var1.length;
+
+ for(int var4 = 0; var4 < var2.length; ++var4) {
+ HashEntry var5 = var2[var4];
+ if(var5 != null) {
+ var2[var4] = null;
+
+ HashEntry var6;
+ do {
+ var6 = var5.nextEntry;
+ int var7 = getSlotIndex(var5.slotHash, var3);
+ var5.nextEntry = var1[var7];
+ var1[var7] = var5;
+ var5 = var6;
+ } while(var6 != null);
+ }
+ }
+
+ }
+
+ public Object removeObject(int var1) {
+ HashEntry var2 = this.removeEntry(var1);
+ return var2 == null ? null : var2.valueEntry;
+ }
+
+ final HashEntry removeEntry(int var1) {
+ int var2 = computeHash(var1);
+ int var3 = getSlotIndex(var2, this.slots.length);
+ HashEntry var4 = this.slots[var3];
+
+ HashEntry var5;
+ HashEntry var6;
+ for(var5 = var4; var5 != null; var5 = var6) {
+ var6 = var5.nextEntry;
+ if(var5.hashEntry == var1) {
+ ++this.versionStamp;
+ --this.count;
+ if(var4 == var5) {
+ this.slots[var3] = var6;
+ } else {
+ var4.nextEntry = var6;
+ }
+
+ return var5;
+ }
+
+ var4 = var5;
+ }
+
+ return var5;
+ }
+
+ public void clearMap() {
+ ++this.versionStamp;
+ HashEntry[] var1 = this.slots;
+
+ for(int var2 = 0; var2 < var1.length; ++var2) {
+ var1[var2] = null;
+ }
+
+ this.count = 0;
+ }
+
+ private void insert(int var1, int var2, Object var3, int var4) {
+ HashEntry var5 = this.slots[var4];
+ this.slots[var4] = new HashEntry(var1, var2, var3, var5);
+ if(this.count++ >= this.threshold) {
+ this.grow(2 * this.slots.length);
+ }
+
+ }
+
+ static int getHash(int var0) {
+ return computeHash(var0);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MapGenBase.java b/src/main/java/net/minecraft/src/MapGenBase.java
new file mode 100644
index 0000000..604b462
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MapGenBase.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class MapGenBase {
+ protected int field_1306_a = 8;
+ protected Random field_1305_b = new Random();
+
+ public void func_867_a(IChunkProvider var1, World var2, int var3, int var4, byte[] var5) {
+ int var6 = this.field_1306_a;
+ this.field_1305_b.setSeed(var2.randomSeed);
+ long var7 = this.field_1305_b.nextLong() / 2L * 2L + 1L;
+ long var9 = this.field_1305_b.nextLong() / 2L * 2L + 1L;
+
+ for(int var11 = var3 - var6; var11 <= var3 + var6; ++var11) {
+ for(int var12 = var4 - var6; var12 <= var4 + var6; ++var12) {
+ this.field_1305_b.setSeed((long)var11 * var7 + (long)var12 * var9 ^ var2.randomSeed);
+ this.func_868_a(var2, var11, var12, var3, var4, var5);
+ }
+ }
+
+ }
+
+ protected void func_868_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MapGenCaves.java b/src/main/java/net/minecraft/src/MapGenCaves.java
new file mode 100644
index 0000000..747c2ba
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MapGenCaves.java
@@ -0,0 +1,185 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class MapGenCaves extends MapGenBase {
+ protected void func_870_a(int var1, int var2, byte[] var3, double var4, double var6, double var8) {
+ this.func_869_a(var1, var2, var3, var4, var6, var8, 1.0F + this.field_1305_b.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D);
+ }
+
+ protected void func_869_a(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) {
+ double var17 = (double)(var1 * 16 + 8);
+ double var19 = (double)(var2 * 16 + 8);
+ float var21 = 0.0F;
+ float var22 = 0.0F;
+ Random var23 = new Random(this.field_1305_b.nextLong());
+ if(var14 <= 0) {
+ int var24 = this.field_1306_a * 16 - 16;
+ var14 = var24 - var23.nextInt(var24 / 4);
+ }
+
+ boolean var52 = false;
+ if(var13 == -1) {
+ var13 = var14 / 2;
+ var52 = true;
+ }
+
+ int var25 = var23.nextInt(var14 / 2) + var14 / 4;
+
+ for(boolean var26 = var23.nextInt(6) == 0; var13 < var14; ++var13) {
+ double var27 = 1.5D + (double)(MathHelper.sin((float)var13 * (float)Math.PI / (float)var14) * var10 * 1.0F);
+ double var29 = var27 * var15;
+ float var31 = MathHelper.cos(var12);
+ float var32 = MathHelper.sin(var12);
+ var4 += (double)(MathHelper.cos(var11) * var31);
+ var6 += (double)var32;
+ var8 += (double)(MathHelper.sin(var11) * var31);
+ if(var26) {
+ var12 *= 0.92F;
+ } else {
+ var12 *= 0.7F;
+ }
+
+ var12 += var22 * 0.1F;
+ var11 += var21 * 0.1F;
+ var22 *= 0.9F;
+ var21 *= 12.0F / 16.0F;
+ var22 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 2.0F;
+ var21 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 4.0F;
+ if(!var52 && var13 == var25 && var10 > 1.0F) {
+ this.func_869_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D);
+ this.func_869_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D);
+ return;
+ }
+
+ if(var52 || var23.nextInt(4) != 0) {
+ double var33 = var4 - var17;
+ double var35 = var8 - var19;
+ double var37 = (double)(var14 - var13);
+ double var39 = (double)(var10 + 2.0F + 16.0F);
+ if(var33 * var33 + var35 * var35 - var37 * var37 > var39 * var39) {
+ return;
+ }
+
+ if(var4 >= var17 - 16.0D - var27 * 2.0D && var8 >= var19 - 16.0D - var27 * 2.0D && var4 <= var17 + 16.0D + var27 * 2.0D && var8 <= var19 + 16.0D + var27 * 2.0D) {
+ int var53 = MathHelper.floor_double(var4 - var27) - var1 * 16 - 1;
+ int var34 = MathHelper.floor_double(var4 + var27) - var1 * 16 + 1;
+ int var54 = MathHelper.floor_double(var6 - var29) - 1;
+ int var36 = MathHelper.floor_double(var6 + var29) + 1;
+ int var55 = MathHelper.floor_double(var8 - var27) - var2 * 16 - 1;
+ int var38 = MathHelper.floor_double(var8 + var27) - var2 * 16 + 1;
+ if(var53 < 0) {
+ var53 = 0;
+ }
+
+ if(var34 > 16) {
+ var34 = 16;
+ }
+
+ if(var54 < 1) {
+ var54 = 1;
+ }
+
+ if(var36 > 120) {
+ var36 = 120;
+ }
+
+ if(var55 < 0) {
+ var55 = 0;
+ }
+
+ if(var38 > 16) {
+ var38 = 16;
+ }
+
+ boolean var56 = false;
+
+ int var40;
+ int var43;
+ for(var40 = var53; !var56 && var40 < var34; ++var40) {
+ for(int var41 = var55; !var56 && var41 < var38; ++var41) {
+ for(int var42 = var36 + 1; !var56 && var42 >= var54 - 1; --var42) {
+ var43 = (var40 * 16 + var41) * 128 + var42;
+ if(var42 >= 0 && var42 < 128) {
+ if(var3[var43] == Block.waterStill.blockID || var3[var43] == Block.waterMoving.blockID) {
+ var56 = true;
+ }
+
+ if(var42 != var54 - 1 && var40 != var53 && var40 != var34 - 1 && var41 != var55 && var41 != var38 - 1) {
+ var42 = var54;
+ }
+ }
+ }
+ }
+ }
+
+ if(!var56) {
+ for(var40 = var53; var40 < var34; ++var40) {
+ double var57 = ((double)(var40 + var1 * 16) + 0.5D - var4) / var27;
+
+ for(var43 = var55; var43 < var38; ++var43) {
+ double var44 = ((double)(var43 + var2 * 16) + 0.5D - var8) / var27;
+ int var46 = (var40 * 16 + var43) * 128 + var36;
+ boolean var47 = false;
+
+ for(int var48 = var36 - 1; var48 >= var54; --var48) {
+ double var49 = ((double)var48 + 0.5D - var6) / var29;
+ if(var49 > -0.7D && var57 * var57 + var49 * var49 + var44 * var44 < 1.0D) {
+ byte var51 = var3[var46];
+ if(var51 == Block.grass.blockID) {
+ var47 = true;
+ }
+
+ if(var51 == Block.stone.blockID || var51 == Block.dirt.blockID || var51 == Block.grass.blockID) {
+ if(var48 < 10) {
+ var3[var46] = (byte)Block.lavaStill.blockID;
+ } else {
+ var3[var46] = 0;
+ if(var47 && var3[var46 - 1] == Block.dirt.blockID) {
+ var3[var46 - 1] = (byte)Block.grass.blockID;
+ }
+ }
+ }
+ }
+
+ --var46;
+ }
+ }
+ }
+
+ if(var52) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ protected void func_868_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) {
+ int var7 = this.field_1305_b.nextInt(this.field_1305_b.nextInt(this.field_1305_b.nextInt(40) + 1) + 1);
+ if(this.field_1305_b.nextInt(15) != 0) {
+ var7 = 0;
+ }
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ double var9 = (double)(var2 * 16 + this.field_1305_b.nextInt(16));
+ double var11 = (double)this.field_1305_b.nextInt(this.field_1305_b.nextInt(120) + 8);
+ double var13 = (double)(var3 * 16 + this.field_1305_b.nextInt(16));
+ int var15 = 1;
+ if(this.field_1305_b.nextInt(4) == 0) {
+ this.func_870_a(var4, var5, var6, var9, var11, var13);
+ var15 += this.field_1305_b.nextInt(4);
+ }
+
+ for(int var16 = 0; var16 < var15; ++var16) {
+ float var17 = this.field_1305_b.nextFloat() * (float)Math.PI * 2.0F;
+ float var18 = (this.field_1305_b.nextFloat() - 0.5F) * 2.0F / 8.0F;
+ float var19 = this.field_1305_b.nextFloat() * 2.0F + this.field_1305_b.nextFloat();
+ this.func_869_a(var4, var5, var6, var9, var11, var13, var19, var17, var18, 0, 0, 1.0D);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MapGenCavesHell.java b/src/main/java/net/minecraft/src/MapGenCavesHell.java
new file mode 100644
index 0000000..4927c18
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MapGenCavesHell.java
@@ -0,0 +1,173 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class MapGenCavesHell extends MapGenBase {
+ protected void func_4129_a(int var1, int var2, byte[] var3, double var4, double var6, double var8) {
+ this.func_4128_a(var1, var2, var3, var4, var6, var8, 1.0F + this.field_1305_b.nextFloat() * 6.0F, 0.0F, 0.0F, -1, -1, 0.5D);
+ }
+
+ protected void func_4128_a(int var1, int var2, byte[] var3, double var4, double var6, double var8, float var10, float var11, float var12, int var13, int var14, double var15) {
+ double var17 = (double)(var1 * 16 + 8);
+ double var19 = (double)(var2 * 16 + 8);
+ float var21 = 0.0F;
+ float var22 = 0.0F;
+ Random var23 = new Random(this.field_1305_b.nextLong());
+ if(var14 <= 0) {
+ int var24 = this.field_1306_a * 16 - 16;
+ var14 = var24 - var23.nextInt(var24 / 4);
+ }
+
+ boolean var51 = false;
+ if(var13 == -1) {
+ var13 = var14 / 2;
+ var51 = true;
+ }
+
+ int var25 = var23.nextInt(var14 / 2) + var14 / 4;
+
+ for(boolean var26 = var23.nextInt(6) == 0; var13 < var14; ++var13) {
+ double var27 = 1.5D + (double)(MathHelper.sin((float)var13 * (float)Math.PI / (float)var14) * var10 * 1.0F);
+ double var29 = var27 * var15;
+ float var31 = MathHelper.cos(var12);
+ float var32 = MathHelper.sin(var12);
+ var4 += (double)(MathHelper.cos(var11) * var31);
+ var6 += (double)var32;
+ var8 += (double)(MathHelper.sin(var11) * var31);
+ if(var26) {
+ var12 *= 0.92F;
+ } else {
+ var12 *= 0.7F;
+ }
+
+ var12 += var22 * 0.1F;
+ var11 += var21 * 0.1F;
+ var22 *= 0.9F;
+ var21 *= 12.0F / 16.0F;
+ var22 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 2.0F;
+ var21 += (var23.nextFloat() - var23.nextFloat()) * var23.nextFloat() * 4.0F;
+ if(!var51 && var13 == var25 && var10 > 1.0F) {
+ this.func_4128_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 - (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D);
+ this.func_4128_a(var1, var2, var3, var4, var6, var8, var23.nextFloat() * 0.5F + 0.5F, var11 + (float)Math.PI * 0.5F, var12 / 3.0F, var13, var14, 1.0D);
+ return;
+ }
+
+ if(var51 || var23.nextInt(4) != 0) {
+ double var33 = var4 - var17;
+ double var35 = var8 - var19;
+ double var37 = (double)(var14 - var13);
+ double var39 = (double)(var10 + 2.0F + 16.0F);
+ if(var33 * var33 + var35 * var35 - var37 * var37 > var39 * var39) {
+ return;
+ }
+
+ if(var4 >= var17 - 16.0D - var27 * 2.0D && var8 >= var19 - 16.0D - var27 * 2.0D && var4 <= var17 + 16.0D + var27 * 2.0D && var8 <= var19 + 16.0D + var27 * 2.0D) {
+ int var52 = MathHelper.floor_double(var4 - var27) - var1 * 16 - 1;
+ int var34 = MathHelper.floor_double(var4 + var27) - var1 * 16 + 1;
+ int var53 = MathHelper.floor_double(var6 - var29) - 1;
+ int var36 = MathHelper.floor_double(var6 + var29) + 1;
+ int var54 = MathHelper.floor_double(var8 - var27) - var2 * 16 - 1;
+ int var38 = MathHelper.floor_double(var8 + var27) - var2 * 16 + 1;
+ if(var52 < 0) {
+ var52 = 0;
+ }
+
+ if(var34 > 16) {
+ var34 = 16;
+ }
+
+ if(var53 < 1) {
+ var53 = 1;
+ }
+
+ if(var36 > 120) {
+ var36 = 120;
+ }
+
+ if(var54 < 0) {
+ var54 = 0;
+ }
+
+ if(var38 > 16) {
+ var38 = 16;
+ }
+
+ boolean var55 = false;
+
+ int var40;
+ int var43;
+ for(var40 = var52; !var55 && var40 < var34; ++var40) {
+ for(int var41 = var54; !var55 && var41 < var38; ++var41) {
+ for(int var42 = var36 + 1; !var55 && var42 >= var53 - 1; --var42) {
+ var43 = (var40 * 16 + var41) * 128 + var42;
+ if(var42 >= 0 && var42 < 128) {
+ if(var3[var43] == Block.lavaStill.blockID || var3[var43] == Block.lavaMoving.blockID) {
+ var55 = true;
+ }
+
+ if(var42 != var53 - 1 && var40 != var52 && var40 != var34 - 1 && var41 != var54 && var41 != var38 - 1) {
+ var42 = var53;
+ }
+ }
+ }
+ }
+ }
+
+ if(!var55) {
+ for(var40 = var52; var40 < var34; ++var40) {
+ double var56 = ((double)(var40 + var1 * 16) + 0.5D - var4) / var27;
+
+ for(var43 = var54; var43 < var38; ++var43) {
+ double var44 = ((double)(var43 + var2 * 16) + 0.5D - var8) / var27;
+ int var46 = (var40 * 16 + var43) * 128 + var36;
+
+ for(int var47 = var36 - 1; var47 >= var53; --var47) {
+ double var48 = ((double)var47 + 0.5D - var6) / var29;
+ if(var48 > -0.7D && var56 * var56 + var48 * var48 + var44 * var44 < 1.0D) {
+ byte var50 = var3[var46];
+ if(var50 == Block.bloodStone.blockID || var50 == Block.dirt.blockID || var50 == Block.grass.blockID) {
+ var3[var46] = 0;
+ }
+ }
+
+ --var46;
+ }
+ }
+ }
+
+ if(var51) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ protected void func_868_a(World var1, int var2, int var3, int var4, int var5, byte[] var6) {
+ int var7 = this.field_1305_b.nextInt(this.field_1305_b.nextInt(this.field_1305_b.nextInt(10) + 1) + 1);
+ if(this.field_1305_b.nextInt(5) != 0) {
+ var7 = 0;
+ }
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ double var9 = (double)(var2 * 16 + this.field_1305_b.nextInt(16));
+ double var11 = (double)this.field_1305_b.nextInt(128);
+ double var13 = (double)(var3 * 16 + this.field_1305_b.nextInt(16));
+ int var15 = 1;
+ if(this.field_1305_b.nextInt(4) == 0) {
+ this.func_4129_a(var4, var5, var6, var9, var11, var13);
+ var15 += this.field_1305_b.nextInt(4);
+ }
+
+ for(int var16 = 0; var16 < var15; ++var16) {
+ float var17 = this.field_1305_b.nextFloat() * (float)Math.PI * 2.0F;
+ float var18 = (this.field_1305_b.nextFloat() - 0.5F) * 2.0F / 8.0F;
+ float var19 = this.field_1305_b.nextFloat() * 2.0F + this.field_1305_b.nextFloat();
+ this.func_4128_a(var4, var5, var6, var9, var11, var13, var19 * 2.0F, var17, var18, 0, 0, 0.5D);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Material.java b/src/main/java/net/minecraft/src/Material.java
new file mode 100644
index 0000000..6e4f755
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Material.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+public class Material {
+ public static final Material air = new MaterialTransparent();
+ public static final Material ground = new Material();
+ public static final Material wood = (new Material()).setBurning();
+ public static final Material rock = new Material();
+ public static final Material iron = new Material();
+ public static final Material water = new MaterialLiquid();
+ public static final Material lava = new MaterialLiquid();
+ public static final Material leaves = (new Material()).setBurning();
+ public static final Material plants = new MaterialLogic();
+ public static final Material sponge = new Material();
+ public static final Material cloth = (new Material()).setBurning();
+ public static final Material fire = new MaterialTransparent();
+ public static final Material sand = new Material();
+ public static final Material circuits = new MaterialLogic();
+ public static final Material glass = new Material();
+ public static final Material tnt = (new Material()).setBurning();
+ public static final Material unused = new Material();
+ public static final Material ice = new Material();
+ public static final Material snow = new MaterialLogic();
+ public static final Material builtSnow = new Material();
+ public static final Material cactus = new Material();
+ public static final Material clay = new Material();
+ public static final Material pumpkin = new Material();
+ public static final Material field_4260_x = new Material();
+ private boolean canBurn;
+
+ public boolean getIsLiquid() {
+ return false;
+ }
+
+ public boolean func_878_a() {
+ return true;
+ }
+
+ public boolean getCanBlockGrass() {
+ return true;
+ }
+
+ public boolean func_880_c() {
+ return true;
+ }
+
+ private Material setBurning() {
+ this.canBurn = true;
+ return this;
+ }
+
+ public boolean getBurning() {
+ return this.canBurn;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MaterialLiquid.java b/src/main/java/net/minecraft/src/MaterialLiquid.java
new file mode 100644
index 0000000..33fba01
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MaterialLiquid.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public class MaterialLiquid extends Material {
+ public boolean getIsLiquid() {
+ return true;
+ }
+
+ public boolean func_880_c() {
+ return false;
+ }
+
+ public boolean func_878_a() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MaterialLogic.java b/src/main/java/net/minecraft/src/MaterialLogic.java
new file mode 100644
index 0000000..ffd1400
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MaterialLogic.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public class MaterialLogic extends Material {
+ public boolean func_878_a() {
+ return false;
+ }
+
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ public boolean func_880_c() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MaterialTransparent.java b/src/main/java/net/minecraft/src/MaterialTransparent.java
new file mode 100644
index 0000000..9242549
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MaterialTransparent.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public class MaterialTransparent extends Material {
+ public boolean func_878_a() {
+ return false;
+ }
+
+ public boolean getCanBlockGrass() {
+ return false;
+ }
+
+ public boolean func_880_c() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MathHelper.java b/src/main/java/net/minecraft/src/MathHelper.java
new file mode 100644
index 0000000..bd32d54
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MathHelper.java
@@ -0,0 +1,58 @@
+package net.minecraft.src;
+
+public class MathHelper {
+ private static float[] SIN_TABLE = new float[65536];
+
+ public static final float sin(float var0) {
+ return SIN_TABLE[(int)(var0 * 10430.378F) & '\uffff'];
+ }
+
+ public static final float cos(float var0) {
+ return SIN_TABLE[(int)(var0 * 10430.378F + 16384.0F) & '\uffff'];
+ }
+
+ public static final float sqrt_float(float var0) {
+ return (float)Math.sqrt((double)var0);
+ }
+
+ public static final float sqrt_double(double var0) {
+ return (float)Math.sqrt(var0);
+ }
+
+ public static int floor_float(float var0) {
+ int var1 = (int)var0;
+ return var0 < (float)var1 ? var1 - 1 : var1;
+ }
+
+ public static int floor_double(double var0) {
+ int var2 = (int)var0;
+ return var0 < (double)var2 ? var2 - 1 : var2;
+ }
+
+ public static float abs(float var0) {
+ return var0 >= 0.0F ? var0 : -var0;
+ }
+
+ public static double abs_max(double var0, double var2) {
+ if(var0 < 0.0D) {
+ var0 = -var0;
+ }
+
+ if(var2 < 0.0D) {
+ var2 = -var2;
+ }
+
+ return var0 > var2 ? var0 : var2;
+ }
+
+ public static int bucketInt(int var0, int var1) {
+ return var0 < 0 ? -((-var0 - 1) / var1) - 1 : var0 / var1;
+ }
+
+ static {
+ for(int var0 = 0; var0 < 65536; ++var0) {
+ SIN_TABLE[var0] = (float)Math.sin((double)var0 * Math.PI * 2.0D / 65536.0D);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MetadataChunkBlock.java b/src/main/java/net/minecraft/src/MetadataChunkBlock.java
new file mode 100644
index 0000000..6fcbc2c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MetadataChunkBlock.java
@@ -0,0 +1,175 @@
+package net.minecraft.src;
+
+public class MetadataChunkBlock {
+ public final EnumSkyBlock field_1299_a;
+ public int field_1298_b;
+ public int field_1304_c;
+ public int field_1303_d;
+ public int field_1302_e;
+ public int field_1301_f;
+ public int field_1300_g;
+
+ public MetadataChunkBlock(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ this.field_1299_a = var1;
+ this.field_1298_b = var2;
+ this.field_1304_c = var3;
+ this.field_1303_d = var4;
+ this.field_1302_e = var5;
+ this.field_1301_f = var6;
+ this.field_1300_g = var7;
+ }
+
+ public void func_4127_a(World var1) {
+ int var2 = this.field_1302_e - this.field_1298_b + 1;
+ int var3 = this.field_1301_f - this.field_1304_c + 1;
+ int var4 = this.field_1300_g - this.field_1303_d + 1;
+ int var5 = var2 * var3 * var4;
+ if(var5 <= -Short.MIN_VALUE) {
+ for(int var6 = this.field_1298_b; var6 <= this.field_1302_e; ++var6) {
+ for(int var7 = this.field_1303_d; var7 <= this.field_1300_g; ++var7) {
+ if(var1.blockExists(var6, 0, var7)) {
+ for(int var8 = this.field_1304_c; var8 <= this.field_1301_f; ++var8) {
+ if(var8 >= 0 && var8 < 128) {
+ int var9 = var1.getSavedLightValue(this.field_1299_a, var6, var8, var7);
+ boolean var10 = false;
+ int var11 = var1.getBlockId(var6, var8, var7);
+ int var12 = Block.lightOpacity[var11];
+ if(var12 == 0) {
+ var12 = 1;
+ }
+
+ int var13 = 0;
+ if(this.field_1299_a == EnumSkyBlock.Sky) {
+ if(var1.canExistingBlockSeeTheSky(var6, var8, var7)) {
+ var13 = 15;
+ }
+ } else if(this.field_1299_a == EnumSkyBlock.Block) {
+ var13 = Block.lightValue[var11];
+ }
+
+ int var14;
+ int var20;
+ if(var12 >= 15 && var13 == 0) {
+ var20 = 0;
+ } else {
+ var14 = var1.getSavedLightValue(this.field_1299_a, var6 - 1, var8, var7);
+ int var15 = var1.getSavedLightValue(this.field_1299_a, var6 + 1, var8, var7);
+ int var16 = var1.getSavedLightValue(this.field_1299_a, var6, var8 - 1, var7);
+ int var17 = var1.getSavedLightValue(this.field_1299_a, var6, var8 + 1, var7);
+ int var18 = var1.getSavedLightValue(this.field_1299_a, var6, var8, var7 - 1);
+ int var19 = var1.getSavedLightValue(this.field_1299_a, var6, var8, var7 + 1);
+ var20 = var14;
+ if(var15 > var14) {
+ var20 = var15;
+ }
+
+ if(var16 > var20) {
+ var20 = var16;
+ }
+
+ if(var17 > var20) {
+ var20 = var17;
+ }
+
+ if(var18 > var20) {
+ var20 = var18;
+ }
+
+ if(var19 > var20) {
+ var20 = var19;
+ }
+
+ var20 -= var12;
+ if(var20 < 0) {
+ var20 = 0;
+ }
+
+ if(var13 > var20) {
+ var20 = var13;
+ }
+ }
+
+ if(var9 != var20) {
+ var1.setLightValue(this.field_1299_a, var6, var8, var7, var20);
+ var14 = var20 - 1;
+ if(var14 < 0) {
+ var14 = 0;
+ }
+
+ var1.neighborLightPropagationChanged(this.field_1299_a, var6 - 1, var8, var7, var14);
+ var1.neighborLightPropagationChanged(this.field_1299_a, var6, var8 - 1, var7, var14);
+ var1.neighborLightPropagationChanged(this.field_1299_a, var6, var8, var7 - 1, var14);
+ if(var6 + 1 >= this.field_1302_e) {
+ var1.neighborLightPropagationChanged(this.field_1299_a, var6 + 1, var8, var7, var14);
+ }
+
+ if(var8 + 1 >= this.field_1301_f) {
+ var1.neighborLightPropagationChanged(this.field_1299_a, var6, var8 + 1, var7, var14);
+ }
+
+ if(var7 + 1 >= this.field_1300_g) {
+ var1.neighborLightPropagationChanged(this.field_1299_a, var6, var8, var7 + 1, var14);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ }
+
+ public boolean func_866_a(int var1, int var2, int var3, int var4, int var5, int var6) {
+ if(var1 >= this.field_1298_b && var2 >= this.field_1304_c && var3 >= this.field_1303_d && var4 <= this.field_1302_e && var5 <= this.field_1301_f && var6 <= this.field_1300_g) {
+ return true;
+ } else {
+ byte var7 = 1;
+ if(var1 >= this.field_1298_b - var7 && var2 >= this.field_1304_c - var7 && var3 >= this.field_1303_d - var7 && var4 <= this.field_1302_e + var7 && var5 <= this.field_1301_f + var7 && var6 <= this.field_1300_g + var7) {
+ int var8 = this.field_1302_e - this.field_1298_b;
+ int var9 = this.field_1301_f - this.field_1304_c;
+ int var10 = this.field_1300_g - this.field_1303_d;
+ if(var1 > this.field_1298_b) {
+ var1 = this.field_1298_b;
+ }
+
+ if(var2 > this.field_1304_c) {
+ var2 = this.field_1304_c;
+ }
+
+ if(var3 > this.field_1303_d) {
+ var3 = this.field_1303_d;
+ }
+
+ if(var4 < this.field_1302_e) {
+ var4 = this.field_1302_e;
+ }
+
+ if(var5 < this.field_1301_f) {
+ var5 = this.field_1301_f;
+ }
+
+ if(var6 < this.field_1300_g) {
+ var6 = this.field_1300_g;
+ }
+
+ int var11 = var4 - var1;
+ int var12 = var5 - var2;
+ int var13 = var6 - var3;
+ int var14 = var8 * var9 * var10;
+ int var15 = var11 * var12 * var13;
+ if(var15 - var14 <= 2) {
+ this.field_1298_b = var1;
+ this.field_1304_c = var2;
+ this.field_1303_d = var3;
+ this.field_1302_e = var4;
+ this.field_1301_f = var5;
+ this.field_1300_g = var6;
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MinecartTrackLogic.java b/src/main/java/net/minecraft/src/MinecartTrackLogic.java
new file mode 100644
index 0000000..cf34e8f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MinecartTrackLogic.java
@@ -0,0 +1,323 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class MinecartTrackLogic {
+ private World worldObj;
+ private int field_1165_c;
+ private int field_1164_d;
+ private int field_1163_e;
+ private int field_1162_f;
+ private List field_1161_g;
+ final BlockMinecartTrack field_1160_a;
+
+ public MinecartTrackLogic(BlockMinecartTrack var1, World var2, int var3, int var4, int var5) {
+ this.field_1160_a = var1;
+ this.field_1161_g = new ArrayList();
+ this.worldObj = var2;
+ this.field_1165_c = var3;
+ this.field_1164_d = var4;
+ this.field_1163_e = var5;
+ this.field_1162_f = var2.getBlockMetadata(var3, var4, var5);
+ this.func_789_a();
+ }
+
+ private void func_789_a() {
+ this.field_1161_g.clear();
+ if(this.field_1162_f == 0) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1));
+ } else if(this.field_1162_f == 1) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e));
+ } else if(this.field_1162_f == 2) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d + 1, this.field_1163_e));
+ } else if(this.field_1162_f == 3) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d + 1, this.field_1163_e));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e));
+ } else if(this.field_1162_f == 4) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e - 1));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1));
+ } else if(this.field_1162_f == 5) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e + 1));
+ } else if(this.field_1162_f == 6) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1));
+ } else if(this.field_1162_f == 7) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1));
+ } else if(this.field_1162_f == 8) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1));
+ } else if(this.field_1162_f == 9) {
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e));
+ this.field_1161_g.add(new ChunkPosition(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1));
+ }
+
+ }
+
+ private void func_785_b() {
+ for(int var1 = 0; var1 < this.field_1161_g.size(); ++var1) {
+ MinecartTrackLogic var2 = this.func_795_a((ChunkPosition)this.field_1161_g.get(var1));
+ if(var2 != null && var2.func_793_b(this)) {
+ this.field_1161_g.set(var1, new ChunkPosition(var2.field_1165_c, var2.field_1164_d, var2.field_1163_e));
+ } else {
+ this.field_1161_g.remove(var1--);
+ }
+ }
+
+ }
+
+ private boolean func_784_a(int var1, int var2, int var3) {
+ return this.worldObj.getBlockId(var1, var2, var3) == this.field_1160_a.blockID ? true : (this.worldObj.getBlockId(var1, var2 + 1, var3) == this.field_1160_a.blockID ? true : this.worldObj.getBlockId(var1, var2 - 1, var3) == this.field_1160_a.blockID);
+ }
+
+ private MinecartTrackLogic func_795_a(ChunkPosition var1) {
+ return this.worldObj.getBlockId(var1.x, var1.y, var1.z) == this.field_1160_a.blockID ? new MinecartTrackLogic(this.field_1160_a, this.worldObj, var1.x, var1.y, var1.z) : (this.worldObj.getBlockId(var1.x, var1.y + 1, var1.z) == this.field_1160_a.blockID ? new MinecartTrackLogic(this.field_1160_a, this.worldObj, var1.x, var1.y + 1, var1.z) : (this.worldObj.getBlockId(var1.x, var1.y - 1, var1.z) == this.field_1160_a.blockID ? new MinecartTrackLogic(this.field_1160_a, this.worldObj, var1.x, var1.y - 1, var1.z) : null));
+ }
+
+ private boolean func_793_b(MinecartTrackLogic var1) {
+ for(int var2 = 0; var2 < this.field_1161_g.size(); ++var2) {
+ ChunkPosition var3 = (ChunkPosition)this.field_1161_g.get(var2);
+ if(var3.x == var1.field_1165_c && var3.z == var1.field_1163_e) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private boolean func_794_b(int var1, int var2, int var3) {
+ for(int var4 = 0; var4 < this.field_1161_g.size(); ++var4) {
+ ChunkPosition var5 = (ChunkPosition)this.field_1161_g.get(var4);
+ if(var5.x == var1 && var5.z == var3) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private int func_790_c() {
+ int var1 = 0;
+ if(this.func_784_a(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1)) {
+ ++var1;
+ }
+
+ if(this.func_784_a(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1)) {
+ ++var1;
+ }
+
+ if(this.func_784_a(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e)) {
+ ++var1;
+ }
+
+ if(this.func_784_a(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e)) {
+ ++var1;
+ }
+
+ return var1;
+ }
+
+ private boolean func_787_c(MinecartTrackLogic var1) {
+ if(this.func_793_b(var1)) {
+ return true;
+ } else if(this.field_1161_g.size() == 2) {
+ return false;
+ } else if(this.field_1161_g.size() == 0) {
+ return true;
+ } else {
+ ChunkPosition var2 = (ChunkPosition)this.field_1161_g.get(0);
+ return var1.field_1164_d == this.field_1164_d && var2.y == this.field_1164_d ? true : true;
+ }
+ }
+
+ private void func_788_d(MinecartTrackLogic var1) {
+ this.field_1161_g.add(new ChunkPosition(var1.field_1165_c, var1.field_1164_d, var1.field_1163_e));
+ boolean var2 = this.func_794_b(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1);
+ boolean var3 = this.func_794_b(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1);
+ boolean var4 = this.func_794_b(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e);
+ boolean var5 = this.func_794_b(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e);
+ byte var6 = -1;
+ if(var2 || var3) {
+ var6 = 0;
+ }
+
+ if(var4 || var5) {
+ var6 = 1;
+ }
+
+ if(var3 && var5 && !var2 && !var4) {
+ var6 = 6;
+ }
+
+ if(var3 && var4 && !var2 && !var5) {
+ var6 = 7;
+ }
+
+ if(var2 && var4 && !var3 && !var5) {
+ var6 = 8;
+ }
+
+ if(var2 && var5 && !var3 && !var4) {
+ var6 = 9;
+ }
+
+ if(var6 == 0) {
+ if(this.worldObj.getBlockId(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e - 1) == this.field_1160_a.blockID) {
+ var6 = 4;
+ }
+
+ if(this.worldObj.getBlockId(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e + 1) == this.field_1160_a.blockID) {
+ var6 = 5;
+ }
+ }
+
+ if(var6 == 1) {
+ if(this.worldObj.getBlockId(this.field_1165_c + 1, this.field_1164_d + 1, this.field_1163_e) == this.field_1160_a.blockID) {
+ var6 = 2;
+ }
+
+ if(this.worldObj.getBlockId(this.field_1165_c - 1, this.field_1164_d + 1, this.field_1163_e) == this.field_1160_a.blockID) {
+ var6 = 3;
+ }
+ }
+
+ if(var6 < 0) {
+ var6 = 0;
+ }
+
+ this.worldObj.setBlockMetadataWithNotify(this.field_1165_c, this.field_1164_d, this.field_1163_e, var6);
+ }
+
+ private boolean func_786_c(int var1, int var2, int var3) {
+ MinecartTrackLogic var4 = this.func_795_a(new ChunkPosition(var1, var2, var3));
+ if(var4 == null) {
+ return false;
+ } else {
+ var4.func_785_b();
+ return var4.func_787_c(this);
+ }
+ }
+
+ public void func_792_a(boolean var1) {
+ boolean var2 = this.func_786_c(this.field_1165_c, this.field_1164_d, this.field_1163_e - 1);
+ boolean var3 = this.func_786_c(this.field_1165_c, this.field_1164_d, this.field_1163_e + 1);
+ boolean var4 = this.func_786_c(this.field_1165_c - 1, this.field_1164_d, this.field_1163_e);
+ boolean var5 = this.func_786_c(this.field_1165_c + 1, this.field_1164_d, this.field_1163_e);
+ byte var6 = -1;
+ if((var2 || var3) && !var4 && !var5) {
+ var6 = 0;
+ }
+
+ if((var4 || var5) && !var2 && !var3) {
+ var6 = 1;
+ }
+
+ if(var3 && var5 && !var2 && !var4) {
+ var6 = 6;
+ }
+
+ if(var3 && var4 && !var2 && !var5) {
+ var6 = 7;
+ }
+
+ if(var2 && var4 && !var3 && !var5) {
+ var6 = 8;
+ }
+
+ if(var2 && var5 && !var3 && !var4) {
+ var6 = 9;
+ }
+
+ if(var6 == -1) {
+ if(var2 || var3) {
+ var6 = 0;
+ }
+
+ if(var4 || var5) {
+ var6 = 1;
+ }
+
+ if(var1) {
+ if(var3 && var5) {
+ var6 = 6;
+ }
+
+ if(var4 && var3) {
+ var6 = 7;
+ }
+
+ if(var5 && var2) {
+ var6 = 9;
+ }
+
+ if(var2 && var4) {
+ var6 = 8;
+ }
+ } else {
+ if(var2 && var4) {
+ var6 = 8;
+ }
+
+ if(var5 && var2) {
+ var6 = 9;
+ }
+
+ if(var4 && var3) {
+ var6 = 7;
+ }
+
+ if(var3 && var5) {
+ var6 = 6;
+ }
+ }
+ }
+
+ if(var6 == 0) {
+ if(this.worldObj.getBlockId(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e - 1) == this.field_1160_a.blockID) {
+ var6 = 4;
+ }
+
+ if(this.worldObj.getBlockId(this.field_1165_c, this.field_1164_d + 1, this.field_1163_e + 1) == this.field_1160_a.blockID) {
+ var6 = 5;
+ }
+ }
+
+ if(var6 == 1) {
+ if(this.worldObj.getBlockId(this.field_1165_c + 1, this.field_1164_d + 1, this.field_1163_e) == this.field_1160_a.blockID) {
+ var6 = 2;
+ }
+
+ if(this.worldObj.getBlockId(this.field_1165_c - 1, this.field_1164_d + 1, this.field_1163_e) == this.field_1160_a.blockID) {
+ var6 = 3;
+ }
+ }
+
+ if(var6 < 0) {
+ var6 = 0;
+ }
+
+ this.field_1162_f = var6;
+ this.func_789_a();
+ this.worldObj.setBlockMetadataWithNotify(this.field_1165_c, this.field_1164_d, this.field_1163_e, var6);
+
+ for(int var7 = 0; var7 < this.field_1161_g.size(); ++var7) {
+ MinecartTrackLogic var8 = this.func_795_a((ChunkPosition)this.field_1161_g.get(var7));
+ if(var8 != null) {
+ var8.func_785_b();
+ if(var8.func_787_c(this)) {
+ var8.func_788_d(this);
+ }
+ }
+ }
+
+ }
+
+ static int func_791_a(MinecartTrackLogic var0) {
+ return var0.func_790_c();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MinecraftError.java b/src/main/java/net/minecraft/src/MinecraftError.java
new file mode 100644
index 0000000..9a75dec
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MinecraftError.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public class MinecraftError extends Error {
+}
diff --git a/src/main/java/net/minecraft/src/MinecraftException.java b/src/main/java/net/minecraft/src/MinecraftException.java
new file mode 100644
index 0000000..07cfee7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MinecraftException.java
@@ -0,0 +1,7 @@
+package net.minecraft.src;
+
+public class MinecraftException extends RuntimeException {
+ public MinecraftException(String var1) {
+ super(var1);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MobSpawnerBase.java b/src/main/java/net/minecraft/src/MobSpawnerBase.java
new file mode 100644
index 0000000..23537da
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MobSpawnerBase.java
@@ -0,0 +1,88 @@
+package net.minecraft.src;
+
+import java.awt.Color;
+
+public class MobSpawnerBase {
+ public static final MobSpawnerBase rainforest = (new MobSpawnerBase()).func_4123_b(588342).setBiomeName("Rainforest").func_4124_a(2094168);
+ public static final MobSpawnerBase swampland = (new MobSpawnerSwamp()).func_4123_b(522674).setBiomeName("Swampland").func_4124_a(9154376);
+ public static final MobSpawnerBase seasonalForest = (new MobSpawnerBase()).func_4123_b(10215459).setBiomeName("Seasonal Forest");
+ public static final MobSpawnerBase forest = (new MobSpawnerBase()).func_4123_b(353825).setBiomeName("Forest").func_4124_a(5159473);
+ public static final MobSpawnerBase savanna = (new MobSpawnerDesert()).func_4123_b(14278691).setBiomeName("Savanna");
+ public static final MobSpawnerBase shrubland = (new MobSpawnerBase()).func_4123_b(10595616).setBiomeName("Shrubland");
+ public static final MobSpawnerBase taiga = (new MobSpawnerBase()).func_4123_b(3060051).setBiomeName("Taiga").func_4122_b().func_4124_a(8107825);
+ public static final MobSpawnerBase desert = (new MobSpawnerDesert()).func_4123_b(16421912).setBiomeName("Desert");
+ public static final MobSpawnerBase plains = (new MobSpawnerDesert()).func_4123_b(16767248).setBiomeName("Plains");
+ public static final MobSpawnerBase iceDesert = (new MobSpawnerDesert()).func_4123_b(16772499).setBiomeName("Ice Desert").func_4122_b().func_4124_a(12899129);
+ public static final MobSpawnerBase tundra = (new MobSpawnerBase()).func_4123_b(5762041).setBiomeName("Tundra").func_4122_b().func_4124_a(12899129);
+ public static final MobSpawnerBase hell = (new MobSpawnerHell()).func_4123_b(16711680).setBiomeName("Hell");
+ public String biomeName;
+ public int field_6503_n;
+ public byte topBlock = (byte)Block.grass.blockID;
+ public byte fillerBlock = (byte)Block.dirt.blockID;
+ public int field_6502_q = 5169201;
+ protected Class[] biomeMonsters = new Class[]{EntitySpider.class, EntityZombie.class, EntitySkeleton.class, EntityCreeper.class};
+ protected Class[] biomeCreatures = new Class[]{EntitySheep.class, EntityPig.class, EntityChicken.class, EntityCow.class};
+ private static MobSpawnerBase[] biomeLookupTable = new MobSpawnerBase[4096];
+
+ public static void generateBiomeLookup() {
+ for(int var0 = 0; var0 < 64; ++var0) {
+ for(int var1 = 0; var1 < 64; ++var1) {
+ biomeLookupTable[var0 + var1 * 64] = getBiome((float)var0 / 63.0F, (float)var1 / 63.0F);
+ }
+ }
+
+ desert.topBlock = desert.fillerBlock = (byte)Block.sand.blockID;
+ iceDesert.topBlock = iceDesert.fillerBlock = (byte)Block.sand.blockID;
+ }
+
+ protected MobSpawnerBase func_4122_b() {
+ return this;
+ }
+
+ protected MobSpawnerBase setBiomeName(String var1) {
+ this.biomeName = var1;
+ return this;
+ }
+
+ protected MobSpawnerBase func_4124_a(int var1) {
+ this.field_6502_q = var1;
+ return this;
+ }
+
+ protected MobSpawnerBase func_4123_b(int var1) {
+ this.field_6503_n = var1;
+ return this;
+ }
+
+ public static MobSpawnerBase getBiomeFromLookup(double var0, double var2) {
+ int var4 = (int)(var0 * 63.0D);
+ int var5 = (int)(var2 * 63.0D);
+ return biomeLookupTable[var4 + var5 * 64];
+ }
+
+ public static MobSpawnerBase getBiome(float var0, float var1) {
+ var1 *= var0;
+ return var0 < 0.1F ? tundra : (var1 < 0.2F ? (var0 < 0.5F ? tundra : (var0 < 0.95F ? savanna : desert)) : (var1 > 0.5F && var0 < 0.7F ? swampland : (var0 < 0.5F ? taiga : (var0 < 0.97F ? (var1 < 0.35F ? shrubland : forest) : (var1 < 0.45F ? plains : (var1 < 0.9F ? seasonalForest : rainforest))))));
+ }
+
+ public int getSkyColorByTemp(float var1) {
+ var1 /= 3.0F;
+ if(var1 < -1.0F) {
+ var1 = -1.0F;
+ }
+
+ if(var1 > 1.0F) {
+ var1 = 1.0F;
+ }
+
+ return Color.getHSBColor(224.0F / 360.0F - var1 * 0.05F, 0.5F + var1 * 0.1F, 1.0F).getRGB();
+ }
+
+ public Class[] getEntitiesForType(EnumCreatureType var1) {
+ return var1 == EnumCreatureType.monster ? this.biomeMonsters : (var1 == EnumCreatureType.creature ? this.biomeCreatures : null);
+ }
+
+ static {
+ generateBiomeLookup();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MobSpawnerDesert.java b/src/main/java/net/minecraft/src/MobSpawnerDesert.java
new file mode 100644
index 0000000..cb799d2
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MobSpawnerDesert.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public class MobSpawnerDesert extends MobSpawnerBase {
+}
diff --git a/src/main/java/net/minecraft/src/MobSpawnerHell.java b/src/main/java/net/minecraft/src/MobSpawnerHell.java
new file mode 100644
index 0000000..8a0b8c0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MobSpawnerHell.java
@@ -0,0 +1,8 @@
+package net.minecraft.src;
+
+public class MobSpawnerHell extends MobSpawnerBase {
+ public MobSpawnerHell() {
+ this.biomeMonsters = new Class[]{EntityGhast.class, EntityPigZombie.class};
+ this.biomeCreatures = new Class[0];
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MobSpawnerSwamp.java b/src/main/java/net/minecraft/src/MobSpawnerSwamp.java
new file mode 100644
index 0000000..36b46a5
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MobSpawnerSwamp.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public class MobSpawnerSwamp extends MobSpawnerBase {
+}
diff --git a/src/main/java/net/minecraft/src/ModelBase.java b/src/main/java/net/minecraft/src/ModelBase.java
new file mode 100644
index 0000000..4ca3632
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelBase.java
@@ -0,0 +1,12 @@
+package net.minecraft.src;
+
+public abstract class ModelBase {
+ public float field_1244_k;
+ public boolean field_1243_l = false;
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelBiped.java b/src/main/java/net/minecraft/src/ModelBiped.java
new file mode 100644
index 0000000..5f38f26
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelBiped.java
@@ -0,0 +1,141 @@
+package net.minecraft.src;
+
+public class ModelBiped extends ModelBase {
+ public ModelRenderer bipedHead;
+ public ModelRenderer field_1285_b;
+ public ModelRenderer field_1284_c;
+ public ModelRenderer bipedRightArm;
+ public ModelRenderer bipedLeftArm;
+ public ModelRenderer bipedRightLeg;
+ public ModelRenderer bipedLeftLeg;
+ public boolean field_1279_h;
+ public boolean field_1278_i;
+ public boolean field_1277_j;
+
+ public ModelBiped() {
+ this(0.0F);
+ }
+
+ public ModelBiped(float var1) {
+ this(var1, 0.0F);
+ }
+
+ public ModelBiped(float var1, float var2) {
+ this.field_1279_h = false;
+ this.field_1278_i = false;
+ this.field_1277_j = false;
+ this.bipedHead = new ModelRenderer(0, 0);
+ this.bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1);
+ this.bipedHead.setPosition(0.0F, 0.0F + var2, 0.0F);
+ this.field_1285_b = new ModelRenderer(32, 0);
+ this.field_1285_b.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1 + 0.5F);
+ this.field_1285_b.setPosition(0.0F, 0.0F + var2, 0.0F);
+ this.field_1284_c = new ModelRenderer(16, 16);
+ this.field_1284_c.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, var1);
+ this.field_1284_c.setPosition(0.0F, 0.0F + var2, 0.0F);
+ this.bipedRightArm = new ModelRenderer(40, 16);
+ this.bipedRightArm.addBox(-3.0F, -2.0F, -2.0F, 4, 12, 4, var1);
+ this.bipedRightArm.setPosition(-5.0F, 2.0F + var2, 0.0F);
+ this.bipedLeftArm = new ModelRenderer(40, 16);
+ this.bipedLeftArm.mirror = true;
+ this.bipedLeftArm.addBox(-1.0F, -2.0F, -2.0F, 4, 12, 4, var1);
+ this.bipedLeftArm.setPosition(5.0F, 2.0F + var2, 0.0F);
+ this.bipedRightLeg = new ModelRenderer(0, 16);
+ this.bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1);
+ this.bipedRightLeg.setPosition(-2.0F, 12.0F + var2, 0.0F);
+ this.bipedLeftLeg = new ModelRenderer(0, 16);
+ this.bipedLeftLeg.mirror = true;
+ this.bipedLeftLeg.addBox(-2.0F, 0.0F, -2.0F, 4, 12, 4, var1);
+ this.bipedLeftLeg.setPosition(2.0F, 12.0F + var2, 0.0F);
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ this.bipedHead.render(var6);
+ this.field_1284_c.render(var6);
+ this.bipedRightArm.render(var6);
+ this.bipedLeftArm.render(var6);
+ this.bipedRightLeg.render(var6);
+ this.bipedLeftLeg.render(var6);
+ this.field_1285_b.render(var6);
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.bipedHead.rotateAngleY = var4 / (180.0F / (float)Math.PI);
+ this.bipedHead.rotateAngleX = var5 / (180.0F / (float)Math.PI);
+ this.field_1285_b.rotateAngleY = this.bipedHead.rotateAngleY;
+ this.field_1285_b.rotateAngleX = this.bipedHead.rotateAngleX;
+ this.bipedRightArm.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 2.0F * var2 * 0.5F;
+ this.bipedLeftArm.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 2.0F * var2 * 0.5F;
+ this.bipedRightArm.rotateAngleZ = 0.0F;
+ this.bipedLeftArm.rotateAngleZ = 0.0F;
+ this.bipedRightLeg.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2;
+ this.bipedLeftLeg.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2;
+ this.bipedRightLeg.rotateAngleY = 0.0F;
+ this.bipedLeftLeg.rotateAngleY = 0.0F;
+ if(this.field_1243_l) {
+ this.bipedRightArm.rotateAngleX += (float)Math.PI * -0.2F;
+ this.bipedLeftArm.rotateAngleX += (float)Math.PI * -0.2F;
+ this.bipedRightLeg.rotateAngleX = (float)Math.PI * -0.4F;
+ this.bipedLeftLeg.rotateAngleX = (float)Math.PI * -0.4F;
+ this.bipedRightLeg.rotateAngleY = (float)Math.PI * 0.1F;
+ this.bipedLeftLeg.rotateAngleY = (float)Math.PI * -0.1F;
+ }
+
+ if(this.field_1279_h) {
+ this.bipedLeftArm.rotateAngleX = this.bipedLeftArm.rotateAngleX * 0.5F - (float)Math.PI * 0.1F;
+ }
+
+ if(this.field_1278_i) {
+ this.bipedRightArm.rotateAngleX = this.bipedRightArm.rotateAngleX * 0.5F - (float)Math.PI * 0.1F;
+ }
+
+ this.bipedRightArm.rotateAngleY = 0.0F;
+ this.bipedLeftArm.rotateAngleY = 0.0F;
+ if(this.field_1244_k > -9990.0F) {
+ float var7 = this.field_1244_k;
+ this.field_1284_c.rotateAngleY = MathHelper.sin(MathHelper.sqrt_float(var7) * (float)Math.PI * 2.0F) * 0.2F;
+ this.bipedRightArm.offsetZ = MathHelper.sin(this.field_1284_c.rotateAngleY) * 5.0F;
+ this.bipedRightArm.offsetX = -MathHelper.cos(this.field_1284_c.rotateAngleY) * 5.0F;
+ this.bipedLeftArm.offsetZ = -MathHelper.sin(this.field_1284_c.rotateAngleY) * 5.0F;
+ this.bipedLeftArm.offsetX = MathHelper.cos(this.field_1284_c.rotateAngleY) * 5.0F;
+ this.bipedRightArm.rotateAngleY += this.field_1284_c.rotateAngleY;
+ this.bipedLeftArm.rotateAngleY += this.field_1284_c.rotateAngleY;
+ this.bipedLeftArm.rotateAngleX += this.field_1284_c.rotateAngleY;
+ var7 = 1.0F - this.field_1244_k;
+ var7 *= var7;
+ var7 *= var7;
+ var7 = 1.0F - var7;
+ float var8 = MathHelper.sin(var7 * (float)Math.PI);
+ float var9 = MathHelper.sin(this.field_1244_k * (float)Math.PI) * -(this.bipedHead.rotateAngleX - 0.7F) * (12.0F / 16.0F);
+ this.bipedRightArm.rotateAngleX = (float)((double)this.bipedRightArm.rotateAngleX - ((double)var8 * 1.2D + (double)var9));
+ this.bipedRightArm.rotateAngleY += this.field_1284_c.rotateAngleY * 2.0F;
+ this.bipedRightArm.rotateAngleZ = MathHelper.sin(this.field_1244_k * (float)Math.PI) * -0.4F;
+ }
+
+ if(this.field_1277_j) {
+ this.field_1284_c.rotateAngleX = 0.5F;
+ this.bipedRightLeg.rotateAngleX -= 0.0F;
+ this.bipedLeftLeg.rotateAngleX -= 0.0F;
+ this.bipedRightArm.rotateAngleX += 0.4F;
+ this.bipedLeftArm.rotateAngleX += 0.4F;
+ this.bipedRightLeg.offsetZ = 4.0F;
+ this.bipedLeftLeg.offsetZ = 4.0F;
+ this.bipedRightLeg.offsetY = 9.0F;
+ this.bipedLeftLeg.offsetY = 9.0F;
+ this.bipedHead.offsetY = 1.0F;
+ } else {
+ this.field_1284_c.rotateAngleX = 0.0F;
+ this.bipedRightLeg.offsetZ = 0.0F;
+ this.bipedLeftLeg.offsetZ = 0.0F;
+ this.bipedRightLeg.offsetY = 12.0F;
+ this.bipedLeftLeg.offsetY = 12.0F;
+ this.bipedHead.offsetY = 0.0F;
+ }
+
+ this.bipedRightArm.rotateAngleZ += MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F;
+ this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F;
+ this.bipedRightArm.rotateAngleX += MathHelper.sin(var3 * 0.067F) * 0.05F;
+ this.bipedLeftArm.rotateAngleX -= MathHelper.sin(var3 * 0.067F) * 0.05F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelBoat.java b/src/main/java/net/minecraft/src/ModelBoat.java
new file mode 100644
index 0000000..4368265
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelBoat.java
@@ -0,0 +1,41 @@
+package net.minecraft.src;
+
+public class ModelBoat extends ModelBase {
+ public ModelRenderer[] field_1287_a = new ModelRenderer[5];
+
+ public ModelBoat() {
+ this.field_1287_a[0] = new ModelRenderer(0, 8);
+ this.field_1287_a[1] = new ModelRenderer(0, 0);
+ this.field_1287_a[2] = new ModelRenderer(0, 0);
+ this.field_1287_a[3] = new ModelRenderer(0, 0);
+ this.field_1287_a[4] = new ModelRenderer(0, 0);
+ byte var1 = 24;
+ byte var2 = 6;
+ byte var3 = 20;
+ byte var4 = 4;
+ this.field_1287_a[0].addBox((float)(-var1 / 2), (float)(-var3 / 2 + 2), -3.0F, var1, var3 - 4, 4, 0.0F);
+ this.field_1287_a[0].setPosition(0.0F, (float)(0 + var4), 0.0F);
+ this.field_1287_a[1].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F);
+ this.field_1287_a[1].setPosition((float)(-var1 / 2 + 1), (float)(0 + var4), 0.0F);
+ this.field_1287_a[2].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F);
+ this.field_1287_a[2].setPosition((float)(var1 / 2 - 1), (float)(0 + var4), 0.0F);
+ this.field_1287_a[3].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F);
+ this.field_1287_a[3].setPosition(0.0F, (float)(0 + var4), (float)(-var3 / 2 + 1));
+ this.field_1287_a[4].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F);
+ this.field_1287_a[4].setPosition(0.0F, (float)(0 + var4), (float)(var3 / 2 - 1));
+ this.field_1287_a[0].rotateAngleX = (float)Math.PI * 0.5F;
+ this.field_1287_a[1].rotateAngleY = (float)Math.PI * 3.0F / 2.0F;
+ this.field_1287_a[2].rotateAngleY = (float)Math.PI * 0.5F;
+ this.field_1287_a[3].rotateAngleY = (float)Math.PI;
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ for(int var7 = 0; var7 < 5; ++var7) {
+ this.field_1287_a[var7].render(var6);
+ }
+
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelChicken.java b/src/main/java/net/minecraft/src/ModelChicken.java
new file mode 100644
index 0000000..4a70767
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelChicken.java
@@ -0,0 +1,66 @@
+package net.minecraft.src;
+
+public class ModelChicken extends ModelBase {
+ public ModelRenderer field_1289_a;
+ public ModelRenderer field_1288_b;
+ public ModelRenderer field_1295_c;
+ public ModelRenderer field_1294_d;
+ public ModelRenderer field_1293_e;
+ public ModelRenderer field_1292_f;
+ public ModelRenderer field_1291_g;
+ public ModelRenderer field_1290_h;
+
+ public ModelChicken() {
+ byte var1 = 16;
+ this.field_1289_a = new ModelRenderer(0, 0);
+ this.field_1289_a.addBox(-2.0F, -6.0F, -2.0F, 4, 6, 3, 0.0F);
+ this.field_1289_a.setPosition(0.0F, (float)(-1 + var1), -4.0F);
+ this.field_1291_g = new ModelRenderer(14, 0);
+ this.field_1291_g.addBox(-2.0F, -4.0F, -4.0F, 4, 2, 2, 0.0F);
+ this.field_1291_g.setPosition(0.0F, (float)(-1 + var1), -4.0F);
+ this.field_1290_h = new ModelRenderer(14, 4);
+ this.field_1290_h.addBox(-1.0F, -2.0F, -3.0F, 2, 2, 2, 0.0F);
+ this.field_1290_h.setPosition(0.0F, (float)(-1 + var1), -4.0F);
+ this.field_1288_b = new ModelRenderer(0, 9);
+ this.field_1288_b.addBox(-3.0F, -4.0F, -3.0F, 6, 8, 6, 0.0F);
+ this.field_1288_b.setPosition(0.0F, (float)(0 + var1), 0.0F);
+ this.field_1295_c = new ModelRenderer(26, 0);
+ this.field_1295_c.func_921_a(-1.0F, 0.0F, -3.0F, 3, 5, 3);
+ this.field_1295_c.setPosition(-2.0F, (float)(3 + var1), 1.0F);
+ this.field_1294_d = new ModelRenderer(26, 0);
+ this.field_1294_d.func_921_a(-1.0F, 0.0F, -3.0F, 3, 5, 3);
+ this.field_1294_d.setPosition(1.0F, (float)(3 + var1), 1.0F);
+ this.field_1293_e = new ModelRenderer(24, 13);
+ this.field_1293_e.func_921_a(0.0F, 0.0F, -3.0F, 1, 4, 6);
+ this.field_1293_e.setPosition(-4.0F, (float)(-3 + var1), 0.0F);
+ this.field_1292_f = new ModelRenderer(24, 13);
+ this.field_1292_f.func_921_a(-1.0F, 0.0F, -3.0F, 1, 4, 6);
+ this.field_1292_f.setPosition(4.0F, (float)(-3 + var1), 0.0F);
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ this.field_1289_a.render(var6);
+ this.field_1291_g.render(var6);
+ this.field_1290_h.render(var6);
+ this.field_1288_b.render(var6);
+ this.field_1295_c.render(var6);
+ this.field_1294_d.render(var6);
+ this.field_1293_e.render(var6);
+ this.field_1292_f.render(var6);
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.field_1289_a.rotateAngleX = -(var5 / (180.0F / (float)Math.PI));
+ this.field_1289_a.rotateAngleY = var4 / (180.0F / (float)Math.PI);
+ this.field_1291_g.rotateAngleX = this.field_1289_a.rotateAngleX;
+ this.field_1291_g.rotateAngleY = this.field_1289_a.rotateAngleY;
+ this.field_1290_h.rotateAngleX = this.field_1289_a.rotateAngleX;
+ this.field_1290_h.rotateAngleY = this.field_1289_a.rotateAngleY;
+ this.field_1288_b.rotateAngleX = (float)Math.PI * 0.5F;
+ this.field_1295_c.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2;
+ this.field_1294_d.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2;
+ this.field_1293_e.rotateAngleZ = var3;
+ this.field_1292_f.rotateAngleZ = -var3;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelCow.java b/src/main/java/net/minecraft/src/ModelCow.java
new file mode 100644
index 0000000..fad53c6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelCow.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+public class ModelCow extends ModelQuadraped {
+ ModelRenderer udders;
+ ModelRenderer horn1;
+ ModelRenderer horn2;
+
+ public ModelCow() {
+ super(12, 0.0F);
+ this.head = new ModelRenderer(0, 0);
+ this.head.addBox(-4.0F, -4.0F, -6.0F, 8, 8, 6, 0.0F);
+ this.head.setPosition(0.0F, 4.0F, -8.0F);
+ this.horn1 = new ModelRenderer(22, 0);
+ this.horn1.addBox(-4.0F, -5.0F, -4.0F, 1, 3, 1, 0.0F);
+ this.horn1.setPosition(0.0F, 3.0F, -7.0F);
+ this.horn2 = new ModelRenderer(22, 0);
+ this.horn2.addBox(4.0F, -5.0F, -4.0F, 1, 3, 1, 0.0F);
+ this.horn2.setPosition(0.0F, 3.0F, -7.0F);
+ this.udders = new ModelRenderer(52, 0);
+ this.udders.addBox(-2.0F, -3.0F, 0.0F, 4, 6, 2, 0.0F);
+ this.udders.setPosition(0.0F, 14.0F, 6.0F);
+ this.udders.rotateAngleX = (float)Math.PI * 0.5F;
+ this.body = new ModelRenderer(18, 4);
+ this.body.addBox(-6.0F, -10.0F, -7.0F, 12, 18, 10, 0.0F);
+ this.body.setPosition(0.0F, 5.0F, 2.0F);
+ --this.leg1.offsetX;
+ ++this.leg2.offsetX;
+ this.leg1.offsetZ += 0.0F;
+ this.leg2.offsetZ += 0.0F;
+ --this.leg3.offsetX;
+ ++this.leg4.offsetX;
+ --this.leg3.offsetZ;
+ --this.leg4.offsetZ;
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ super.render(var1, var2, var3, var4, var5, var6);
+ this.horn1.render(var6);
+ this.horn2.render(var6);
+ this.udders.render(var6);
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ super.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ this.horn1.rotateAngleY = this.head.rotateAngleY;
+ this.horn1.rotateAngleX = this.head.rotateAngleX;
+ this.horn2.rotateAngleY = this.head.rotateAngleY;
+ this.horn2.rotateAngleX = this.head.rotateAngleX;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelCreeper.java b/src/main/java/net/minecraft/src/ModelCreeper.java
new file mode 100644
index 0000000..797c6ea
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelCreeper.java
@@ -0,0 +1,56 @@
+package net.minecraft.src;
+
+public class ModelCreeper extends ModelBase {
+ public ModelRenderer head;
+ public ModelRenderer unusedModel;
+ public ModelRenderer body;
+ public ModelRenderer leg1;
+ public ModelRenderer leg2;
+ public ModelRenderer leg3;
+ public ModelRenderer leg4;
+
+ public ModelCreeper() {
+ float var1 = 0.0F;
+ byte var2 = 4;
+ this.head = new ModelRenderer(0, 0);
+ this.head.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1);
+ this.head.setPosition(0.0F, (float)var2, 0.0F);
+ this.unusedModel = new ModelRenderer(32, 0);
+ this.unusedModel.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, var1 + 0.5F);
+ this.unusedModel.setPosition(0.0F, (float)var2, 0.0F);
+ this.body = new ModelRenderer(16, 16);
+ this.body.addBox(-4.0F, 0.0F, -2.0F, 8, 12, 4, var1);
+ this.body.setPosition(0.0F, (float)var2, 0.0F);
+ this.leg1 = new ModelRenderer(0, 16);
+ this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1);
+ this.leg1.setPosition(-2.0F, (float)(12 + var2), 4.0F);
+ this.leg2 = new ModelRenderer(0, 16);
+ this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1);
+ this.leg2.setPosition(2.0F, (float)(12 + var2), 4.0F);
+ this.leg3 = new ModelRenderer(0, 16);
+ this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1);
+ this.leg3.setPosition(-2.0F, (float)(12 + var2), -4.0F);
+ this.leg4 = new ModelRenderer(0, 16);
+ this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1);
+ this.leg4.setPosition(2.0F, (float)(12 + var2), -4.0F);
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ this.head.render(var6);
+ this.body.render(var6);
+ this.leg1.render(var6);
+ this.leg2.render(var6);
+ this.leg3.render(var6);
+ this.leg4.render(var6);
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.head.rotateAngleY = var4 / (180.0F / (float)Math.PI);
+ this.head.rotateAngleX = var5 / (180.0F / (float)Math.PI);
+ this.leg1.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2;
+ this.leg2.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2;
+ this.leg3.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2;
+ this.leg4.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelGhast.java b/src/main/java/net/minecraft/src/ModelGhast.java
new file mode 100644
index 0000000..89c7732
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelGhast.java
@@ -0,0 +1,45 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class ModelGhast extends ModelBase {
+ ModelRenderer body;
+ ModelRenderer[] tentacles = new ModelRenderer[9];
+
+ public ModelGhast() {
+ byte var1 = -16;
+ this.body = new ModelRenderer(0, 0);
+ this.body.func_921_a(-8.0F, -8.0F, -8.0F, 16, 16, 16);
+ this.body.offsetY += (float)(24 + var1);
+ Random var2 = new Random(1660L);
+
+ for(int var3 = 0; var3 < this.tentacles.length; ++var3) {
+ this.tentacles[var3] = new ModelRenderer(0, 0);
+ float var4 = (((float)(var3 % 3) - (float)(var3 / 3 % 2) * 0.5F + 0.25F) / 2.0F * 2.0F - 1.0F) * 5.0F;
+ float var5 = ((float)(var3 / 3) / 2.0F * 2.0F - 1.0F) * 5.0F;
+ int var6 = var2.nextInt(7) + 8;
+ this.tentacles[var3].func_921_a(-1.0F, 0.0F, -1.0F, 2, var6, 2);
+ this.tentacles[var3].offsetX = var4;
+ this.tentacles[var3].offsetZ = var5;
+ this.tentacles[var3].offsetY = (float)(31 + var1);
+ }
+
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ for(int var7 = 0; var7 < this.tentacles.length; ++var7) {
+ this.tentacles[var7].rotateAngleX = 0.2F * MathHelper.sin(var3 * 0.3F + (float)var7) + 0.4F;
+ }
+
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ this.body.render(var6);
+
+ for(int var7 = 0; var7 < this.tentacles.length; ++var7) {
+ this.tentacles[var7].render(var6);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelMinecart.java b/src/main/java/net/minecraft/src/ModelMinecart.java
new file mode 100644
index 0000000..868524c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelMinecart.java
@@ -0,0 +1,47 @@
+package net.minecraft.src;
+
+public class ModelMinecart extends ModelBase {
+ public ModelRenderer[] field_1256_a = new ModelRenderer[7];
+
+ public ModelMinecart() {
+ this.field_1256_a[0] = new ModelRenderer(0, 10);
+ this.field_1256_a[1] = new ModelRenderer(0, 0);
+ this.field_1256_a[2] = new ModelRenderer(0, 0);
+ this.field_1256_a[3] = new ModelRenderer(0, 0);
+ this.field_1256_a[4] = new ModelRenderer(0, 0);
+ this.field_1256_a[5] = new ModelRenderer(44, 10);
+ byte var1 = 20;
+ byte var2 = 8;
+ byte var3 = 16;
+ byte var4 = 4;
+ this.field_1256_a[0].addBox((float)(-var1 / 2), (float)(-var3 / 2), -1.0F, var1, var3, 2, 0.0F);
+ this.field_1256_a[0].setPosition(0.0F, (float)(0 + var4), 0.0F);
+ this.field_1256_a[5].addBox((float)(-var1 / 2 + 1), (float)(-var3 / 2 + 1), -1.0F, var1 - 2, var3 - 2, 1, 0.0F);
+ this.field_1256_a[5].setPosition(0.0F, (float)(0 + var4), 0.0F);
+ this.field_1256_a[1].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F);
+ this.field_1256_a[1].setPosition((float)(-var1 / 2 + 1), (float)(0 + var4), 0.0F);
+ this.field_1256_a[2].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F);
+ this.field_1256_a[2].setPosition((float)(var1 / 2 - 1), (float)(0 + var4), 0.0F);
+ this.field_1256_a[3].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F);
+ this.field_1256_a[3].setPosition(0.0F, (float)(0 + var4), (float)(-var3 / 2 + 1));
+ this.field_1256_a[4].addBox((float)(-var1 / 2 + 2), (float)(-var2 - 1), -1.0F, var1 - 4, var2, 2, 0.0F);
+ this.field_1256_a[4].setPosition(0.0F, (float)(0 + var4), (float)(var3 / 2 - 1));
+ this.field_1256_a[0].rotateAngleX = (float)Math.PI * 0.5F;
+ this.field_1256_a[1].rotateAngleY = (float)Math.PI * 3.0F / 2.0F;
+ this.field_1256_a[2].rotateAngleY = (float)Math.PI * 0.5F;
+ this.field_1256_a[3].rotateAngleY = (float)Math.PI;
+ this.field_1256_a[5].rotateAngleX = (float)Math.PI * -0.5F;
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.field_1256_a[5].offsetY = 4.0F - var3;
+
+ for(int var7 = 0; var7 < 6; ++var7) {
+ this.field_1256_a[var7].render(var6);
+ }
+
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelPig.java b/src/main/java/net/minecraft/src/ModelPig.java
new file mode 100644
index 0000000..5bc7b47
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelPig.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class ModelPig extends ModelQuadraped {
+ public ModelPig() {
+ super(6, 0.0F);
+ }
+
+ public ModelPig(float var1) {
+ super(6, var1);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelQuadraped.java b/src/main/java/net/minecraft/src/ModelQuadraped.java
new file mode 100644
index 0000000..a2f2a40
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelQuadraped.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+public class ModelQuadraped extends ModelBase {
+ public ModelRenderer head = new ModelRenderer(0, 0);
+ public ModelRenderer body;
+ public ModelRenderer leg1;
+ public ModelRenderer leg2;
+ public ModelRenderer leg3;
+ public ModelRenderer leg4;
+
+ public ModelQuadraped(int var1, float var2) {
+ this.head.addBox(-4.0F, -4.0F, -8.0F, 8, 8, 8, var2);
+ this.head.setPosition(0.0F, (float)(18 - var1), -6.0F);
+ this.body = new ModelRenderer(28, 8);
+ this.body.addBox(-5.0F, -10.0F, -7.0F, 10, 16, 8, var2);
+ this.body.setPosition(0.0F, (float)(17 - var1), 2.0F);
+ this.leg1 = new ModelRenderer(0, 16);
+ this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, var2);
+ this.leg1.setPosition(-3.0F, (float)(24 - var1), 7.0F);
+ this.leg2 = new ModelRenderer(0, 16);
+ this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, var2);
+ this.leg2.setPosition(3.0F, (float)(24 - var1), 7.0F);
+ this.leg3 = new ModelRenderer(0, 16);
+ this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, var2);
+ this.leg3.setPosition(-3.0F, (float)(24 - var1), -5.0F);
+ this.leg4 = new ModelRenderer(0, 16);
+ this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, var1, 4, var2);
+ this.leg4.setPosition(3.0F, (float)(24 - var1), -5.0F);
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ this.head.render(var6);
+ this.body.render(var6);
+ this.leg1.render(var6);
+ this.leg2.render(var6);
+ this.leg3.render(var6);
+ this.leg4.render(var6);
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.head.rotateAngleX = -(var5 / (180.0F / (float)Math.PI));
+ this.head.rotateAngleY = var4 / (180.0F / (float)Math.PI);
+ this.body.rotateAngleX = (float)Math.PI * 0.5F;
+ this.leg1.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2;
+ this.leg2.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2;
+ this.leg3.rotateAngleX = MathHelper.cos(var1 * 0.6662F + (float)Math.PI) * 1.4F * var2;
+ this.leg4.rotateAngleX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelRenderer.java b/src/main/java/net/minecraft/src/ModelRenderer.java
new file mode 100644
index 0000000..96d8882
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelRenderer.java
@@ -0,0 +1,165 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class ModelRenderer {
+ private PositionTexureVertex[] corners;
+ private TexturedQuad[] faces;
+ private int textureOffsetX;
+ private int textureOffsetY;
+ public float offsetX;
+ public float offsetY;
+ public float offsetZ;
+ public float rotateAngleX;
+ public float rotateAngleY;
+ public float rotateAngleZ;
+ private boolean compiled = false;
+ private int displayList = 0;
+ public boolean mirror = false;
+ public boolean field_1403_h = true;
+ public boolean field_1402_i = false;
+
+ public ModelRenderer(int var1, int var2) {
+ this.textureOffsetX = var1;
+ this.textureOffsetY = var2;
+ }
+
+ public void func_921_a(float var1, float var2, float var3, int var4, int var5, int var6) {
+ this.addBox(var1, var2, var3, var4, var5, var6, 0.0F);
+ }
+
+ public void addBox(float var1, float var2, float var3, int var4, int var5, int var6, float var7) {
+ this.corners = new PositionTexureVertex[8];
+ this.faces = new TexturedQuad[6];
+ float var8 = var1 + (float)var4;
+ float var9 = var2 + (float)var5;
+ float var10 = var3 + (float)var6;
+ var1 -= var7;
+ var2 -= var7;
+ var3 -= var7;
+ var8 += var7;
+ var9 += var7;
+ var10 += var7;
+ if(this.mirror) {
+ float var11 = var8;
+ var8 = var1;
+ var1 = var11;
+ }
+
+ PositionTexureVertex var20 = new PositionTexureVertex(var1, var2, var3, 0.0F, 0.0F);
+ PositionTexureVertex var12 = new PositionTexureVertex(var8, var2, var3, 0.0F, 8.0F);
+ PositionTexureVertex var13 = new PositionTexureVertex(var8, var9, var3, 8.0F, 8.0F);
+ PositionTexureVertex var14 = new PositionTexureVertex(var1, var9, var3, 8.0F, 0.0F);
+ PositionTexureVertex var15 = new PositionTexureVertex(var1, var2, var10, 0.0F, 0.0F);
+ PositionTexureVertex var16 = new PositionTexureVertex(var8, var2, var10, 0.0F, 8.0F);
+ PositionTexureVertex var17 = new PositionTexureVertex(var8, var9, var10, 8.0F, 8.0F);
+ PositionTexureVertex var18 = new PositionTexureVertex(var1, var9, var10, 8.0F, 0.0F);
+ this.corners[0] = var20;
+ this.corners[1] = var12;
+ this.corners[2] = var13;
+ this.corners[3] = var14;
+ this.corners[4] = var15;
+ this.corners[5] = var16;
+ this.corners[6] = var17;
+ this.corners[7] = var18;
+ this.faces[0] = new TexturedQuad(new PositionTexureVertex[]{var16, var12, var13, var17}, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4 + var6, this.textureOffsetY + var6 + var5);
+ this.faces[1] = new TexturedQuad(new PositionTexureVertex[]{var20, var15, var18, var14}, this.textureOffsetX + 0, this.textureOffsetY + var6, this.textureOffsetX + var6, this.textureOffsetY + var6 + var5);
+ this.faces[2] = new TexturedQuad(new PositionTexureVertex[]{var16, var15, var20, var12}, this.textureOffsetX + var6, this.textureOffsetY + 0, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6);
+ this.faces[3] = new TexturedQuad(new PositionTexureVertex[]{var13, var14, var18, var17}, this.textureOffsetX + var6 + var4, this.textureOffsetY + 0, this.textureOffsetX + var6 + var4 + var4, this.textureOffsetY + var6);
+ this.faces[4] = new TexturedQuad(new PositionTexureVertex[]{var12, var20, var14, var13}, this.textureOffsetX + var6, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4, this.textureOffsetY + var6 + var5);
+ this.faces[5] = new TexturedQuad(new PositionTexureVertex[]{var15, var16, var17, var18}, this.textureOffsetX + var6 + var4 + var6, this.textureOffsetY + var6, this.textureOffsetX + var6 + var4 + var6 + var4, this.textureOffsetY + var6 + var5);
+ if(this.mirror) {
+ for(int var19 = 0; var19 < this.faces.length; ++var19) {
+ this.faces[var19].func_809_a();
+ }
+ }
+
+ }
+
+ public void setPosition(float var1, float var2, float var3) {
+ this.offsetX = var1;
+ this.offsetY = var2;
+ this.offsetZ = var3;
+ }
+
+ public void render(float var1) {
+ if(!this.field_1402_i) {
+ if(this.field_1403_h) {
+ if(!this.compiled) {
+ this.compileDisplayList(var1);
+ }
+
+ if(this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) {
+ if(this.offsetX == 0.0F && this.offsetY == 0.0F && this.offsetZ == 0.0F) {
+ GL11.glCallList(this.displayList);
+ } else {
+ GL11.glTranslatef(this.offsetX * var1, this.offsetY * var1, this.offsetZ * var1);
+ GL11.glCallList(this.displayList);
+ GL11.glTranslatef(-this.offsetX * var1, -this.offsetY * var1, -this.offsetZ * var1);
+ }
+ } else {
+ GL11.glPushMatrix();
+ GL11.glTranslatef(this.offsetX * var1, this.offsetY * var1, this.offsetZ * var1);
+ if(this.rotateAngleZ != 0.0F) {
+ GL11.glRotatef(this.rotateAngleZ * (180.0F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
+ }
+
+ if(this.rotateAngleY != 0.0F) {
+ GL11.glRotatef(this.rotateAngleY * (180.0F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
+ }
+
+ if(this.rotateAngleX != 0.0F) {
+ GL11.glRotatef(this.rotateAngleX * (180.0F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
+ }
+
+ GL11.glCallList(this.displayList);
+ GL11.glPopMatrix();
+ }
+
+ }
+ }
+ }
+
+ public void func_926_b(float var1) {
+ if(!this.field_1402_i) {
+ if(this.field_1403_h) {
+ if(!this.compiled) {
+ this.compileDisplayList(var1);
+ }
+
+ if(this.rotateAngleX == 0.0F && this.rotateAngleY == 0.0F && this.rotateAngleZ == 0.0F) {
+ if(this.offsetX != 0.0F || this.offsetY != 0.0F || this.offsetZ != 0.0F) {
+ GL11.glTranslatef(this.offsetX * var1, this.offsetY * var1, this.offsetZ * var1);
+ }
+ } else {
+ GL11.glTranslatef(this.offsetX * var1, this.offsetY * var1, this.offsetZ * var1);
+ if(this.rotateAngleZ != 0.0F) {
+ GL11.glRotatef(this.rotateAngleZ * (180.0F / (float)Math.PI), 0.0F, 0.0F, 1.0F);
+ }
+
+ if(this.rotateAngleY != 0.0F) {
+ GL11.glRotatef(this.rotateAngleY * (180.0F / (float)Math.PI), 0.0F, 1.0F, 0.0F);
+ }
+
+ if(this.rotateAngleX != 0.0F) {
+ GL11.glRotatef(this.rotateAngleX * (180.0F / (float)Math.PI), 1.0F, 0.0F, 0.0F);
+ }
+ }
+
+ }
+ }
+ }
+
+ private void compileDisplayList(float var1) {
+ this.displayList = GLAllocation.generateDisplayLists(1);
+ GL11.glNewList(this.displayList, GL11.GL_COMPILE);
+ Tessellator var2 = Tessellator.instance;
+
+ for(int var3 = 0; var3 < this.faces.length; ++var3) {
+ this.faces[var3].func_808_a(var2, var1);
+ }
+
+ GL11.glEndList();
+ this.compiled = true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelSheep1.java b/src/main/java/net/minecraft/src/ModelSheep1.java
new file mode 100644
index 0000000..6a5cb8a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelSheep1.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class ModelSheep1 extends ModelQuadraped {
+ public ModelSheep1() {
+ super(12, 0.0F);
+ this.head = new ModelRenderer(0, 0);
+ this.head.addBox(-3.0F, -4.0F, -4.0F, 6, 6, 6, 0.6F);
+ this.head.setPosition(0.0F, 6.0F, -8.0F);
+ this.body = new ModelRenderer(28, 8);
+ this.body.addBox(-4.0F, -10.0F, -7.0F, 8, 16, 6, 1.75F);
+ this.body.setPosition(0.0F, 5.0F, 2.0F);
+ float var1 = 0.5F;
+ this.leg1 = new ModelRenderer(0, 16);
+ this.leg1.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1);
+ this.leg1.setPosition(-3.0F, 12.0F, 7.0F);
+ this.leg2 = new ModelRenderer(0, 16);
+ this.leg2.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1);
+ this.leg2.setPosition(3.0F, 12.0F, 7.0F);
+ this.leg3 = new ModelRenderer(0, 16);
+ this.leg3.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1);
+ this.leg3.setPosition(-3.0F, 12.0F, -5.0F);
+ this.leg4 = new ModelRenderer(0, 16);
+ this.leg4.addBox(-2.0F, 0.0F, -2.0F, 4, 6, 4, var1);
+ this.leg4.setPosition(3.0F, 12.0F, -5.0F);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelSheep2.java b/src/main/java/net/minecraft/src/ModelSheep2.java
new file mode 100644
index 0000000..c80dd4b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelSheep2.java
@@ -0,0 +1,13 @@
+package net.minecraft.src;
+
+public class ModelSheep2 extends ModelQuadraped {
+ public ModelSheep2() {
+ super(12, 0.0F);
+ this.head = new ModelRenderer(0, 0);
+ this.head.addBox(-3.0F, -4.0F, -6.0F, 6, 6, 8, 0.0F);
+ this.head.setPosition(0.0F, 6.0F, -8.0F);
+ this.body = new ModelRenderer(28, 8);
+ this.body.addBox(-4.0F, -10.0F, -7.0F, 8, 16, 6, 0.0F);
+ this.body.setPosition(0.0F, 5.0F, 2.0F);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelSkeleton.java b/src/main/java/net/minecraft/src/ModelSkeleton.java
new file mode 100644
index 0000000..49b4c3d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelSkeleton.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+public class ModelSkeleton extends ModelZombie {
+ public ModelSkeleton() {
+ float var1 = 0.0F;
+ this.bipedRightArm = new ModelRenderer(40, 16);
+ this.bipedRightArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, var1);
+ this.bipedRightArm.setPosition(-5.0F, 2.0F, 0.0F);
+ this.bipedLeftArm = new ModelRenderer(40, 16);
+ this.bipedLeftArm.mirror = true;
+ this.bipedLeftArm.addBox(-1.0F, -2.0F, -1.0F, 2, 12, 2, var1);
+ this.bipedLeftArm.setPosition(5.0F, 2.0F, 0.0F);
+ this.bipedRightLeg = new ModelRenderer(0, 16);
+ this.bipedRightLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, var1);
+ this.bipedRightLeg.setPosition(-2.0F, 12.0F, 0.0F);
+ this.bipedLeftLeg = new ModelRenderer(0, 16);
+ this.bipedLeftLeg.mirror = true;
+ this.bipedLeftLeg.addBox(-1.0F, 0.0F, -1.0F, 2, 12, 2, var1);
+ this.bipedLeftLeg.setPosition(2.0F, 12.0F, 0.0F);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelSlime.java b/src/main/java/net/minecraft/src/ModelSlime.java
new file mode 100644
index 0000000..4c3b0be
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelSlime.java
@@ -0,0 +1,38 @@
+package net.minecraft.src;
+
+public class ModelSlime extends ModelBase {
+ ModelRenderer field_1258_a;
+ ModelRenderer field_1257_b;
+ ModelRenderer field_1260_c;
+ ModelRenderer field_1259_d;
+
+ public ModelSlime(int var1) {
+ this.field_1258_a = new ModelRenderer(0, var1);
+ this.field_1258_a.func_921_a(-4.0F, 16.0F, -4.0F, 8, 8, 8);
+ if(var1 > 0) {
+ this.field_1258_a = new ModelRenderer(0, var1);
+ this.field_1258_a.func_921_a(-3.0F, 17.0F, -3.0F, 6, 6, 6);
+ this.field_1257_b = new ModelRenderer(32, 0);
+ this.field_1257_b.func_921_a(-3.25F, 18.0F, -3.5F, 2, 2, 2);
+ this.field_1260_c = new ModelRenderer(32, 4);
+ this.field_1260_c.func_921_a(1.25F, 18.0F, -3.5F, 2, 2, 2);
+ this.field_1259_d = new ModelRenderer(32, 8);
+ this.field_1259_d.func_921_a(0.0F, 21.0F, -3.5F, 1, 1, 1);
+ }
+
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ this.field_1258_a.render(var6);
+ if(this.field_1257_b != null) {
+ this.field_1257_b.render(var6);
+ this.field_1260_c.render(var6);
+ this.field_1259_d.render(var6);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelSpider.java b/src/main/java/net/minecraft/src/ModelSpider.java
new file mode 100644
index 0000000..1495995
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelSpider.java
@@ -0,0 +1,116 @@
+package net.minecraft.src;
+
+public class ModelSpider extends ModelBase {
+ public ModelRenderer field_1255_a;
+ public ModelRenderer field_1254_b;
+ public ModelRenderer field_1253_c;
+ public ModelRenderer field_1252_d;
+ public ModelRenderer field_1251_e;
+ public ModelRenderer field_1250_f;
+ public ModelRenderer field_1249_g;
+ public ModelRenderer field_1248_h;
+ public ModelRenderer field_1247_i;
+ public ModelRenderer field_1246_j;
+ public ModelRenderer field_1245_m;
+
+ public ModelSpider() {
+ float var1 = 0.0F;
+ byte var2 = 15;
+ this.field_1255_a = new ModelRenderer(32, 4);
+ this.field_1255_a.addBox(-4.0F, -4.0F, -8.0F, 8, 8, 8, var1);
+ this.field_1255_a.setPosition(0.0F, (float)(0 + var2), -3.0F);
+ this.field_1254_b = new ModelRenderer(0, 0);
+ this.field_1254_b.addBox(-3.0F, -3.0F, -3.0F, 6, 6, 6, var1);
+ this.field_1254_b.setPosition(0.0F, (float)var2, 0.0F);
+ this.field_1253_c = new ModelRenderer(0, 12);
+ this.field_1253_c.addBox(-5.0F, -4.0F, -6.0F, 10, 8, 12, var1);
+ this.field_1253_c.setPosition(0.0F, (float)(0 + var2), 9.0F);
+ this.field_1252_d = new ModelRenderer(18, 0);
+ this.field_1252_d.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, var1);
+ this.field_1252_d.setPosition(-4.0F, (float)(0 + var2), 2.0F);
+ this.field_1251_e = new ModelRenderer(18, 0);
+ this.field_1251_e.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, var1);
+ this.field_1251_e.setPosition(4.0F, (float)(0 + var2), 2.0F);
+ this.field_1250_f = new ModelRenderer(18, 0);
+ this.field_1250_f.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, var1);
+ this.field_1250_f.setPosition(-4.0F, (float)(0 + var2), 1.0F);
+ this.field_1249_g = new ModelRenderer(18, 0);
+ this.field_1249_g.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, var1);
+ this.field_1249_g.setPosition(4.0F, (float)(0 + var2), 1.0F);
+ this.field_1248_h = new ModelRenderer(18, 0);
+ this.field_1248_h.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, var1);
+ this.field_1248_h.setPosition(-4.0F, (float)(0 + var2), 0.0F);
+ this.field_1247_i = new ModelRenderer(18, 0);
+ this.field_1247_i.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, var1);
+ this.field_1247_i.setPosition(4.0F, (float)(0 + var2), 0.0F);
+ this.field_1246_j = new ModelRenderer(18, 0);
+ this.field_1246_j.addBox(-15.0F, -1.0F, -1.0F, 16, 2, 2, var1);
+ this.field_1246_j.setPosition(-4.0F, (float)(0 + var2), -1.0F);
+ this.field_1245_m = new ModelRenderer(18, 0);
+ this.field_1245_m.addBox(-1.0F, -1.0F, -1.0F, 16, 2, 2, var1);
+ this.field_1245_m.setPosition(4.0F, (float)(0 + var2), -1.0F);
+ }
+
+ public void render(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ this.field_1255_a.render(var6);
+ this.field_1254_b.render(var6);
+ this.field_1253_c.render(var6);
+ this.field_1252_d.render(var6);
+ this.field_1251_e.render(var6);
+ this.field_1250_f.render(var6);
+ this.field_1249_g.render(var6);
+ this.field_1248_h.render(var6);
+ this.field_1247_i.render(var6);
+ this.field_1246_j.render(var6);
+ this.field_1245_m.render(var6);
+ }
+
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ this.field_1255_a.rotateAngleY = var4 / (180.0F / (float)Math.PI);
+ this.field_1255_a.rotateAngleX = var5 / (180.0F / (float)Math.PI);
+ float var7 = (float)Math.PI * 0.25F;
+ this.field_1252_d.rotateAngleZ = -var7;
+ this.field_1251_e.rotateAngleZ = var7;
+ this.field_1250_f.rotateAngleZ = -var7 * 0.74F;
+ this.field_1249_g.rotateAngleZ = var7 * 0.74F;
+ this.field_1248_h.rotateAngleZ = -var7 * 0.74F;
+ this.field_1247_i.rotateAngleZ = var7 * 0.74F;
+ this.field_1246_j.rotateAngleZ = -var7;
+ this.field_1245_m.rotateAngleZ = var7;
+ float var8 = -0.0F;
+ float var9 = (float)Math.PI * 0.125F;
+ this.field_1252_d.rotateAngleY = var9 * 2.0F + var8;
+ this.field_1251_e.rotateAngleY = -var9 * 2.0F - var8;
+ this.field_1250_f.rotateAngleY = var9 * 1.0F + var8;
+ this.field_1249_g.rotateAngleY = -var9 * 1.0F - var8;
+ this.field_1248_h.rotateAngleY = -var9 * 1.0F + var8;
+ this.field_1247_i.rotateAngleY = var9 * 1.0F - var8;
+ this.field_1246_j.rotateAngleY = -var9 * 2.0F + var8;
+ this.field_1245_m.rotateAngleY = var9 * 2.0F - var8;
+ float var10 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + 0.0F) * 0.4F) * var2;
+ float var11 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI) * 0.4F) * var2;
+ float var12 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI * 0.5F) * 0.4F) * var2;
+ float var13 = -(MathHelper.cos(var1 * 0.6662F * 2.0F + (float)Math.PI * 3.0F / 2.0F) * 0.4F) * var2;
+ float var14 = Math.abs(MathHelper.sin(var1 * 0.6662F + 0.0F) * 0.4F) * var2;
+ float var15 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI) * 0.4F) * var2;
+ float var16 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI * 0.5F) * 0.4F) * var2;
+ float var17 = Math.abs(MathHelper.sin(var1 * 0.6662F + (float)Math.PI * 3.0F / 2.0F) * 0.4F) * var2;
+ this.field_1252_d.rotateAngleY += var10;
+ this.field_1251_e.rotateAngleY += -var10;
+ this.field_1250_f.rotateAngleY += var11;
+ this.field_1249_g.rotateAngleY += -var11;
+ this.field_1248_h.rotateAngleY += var12;
+ this.field_1247_i.rotateAngleY += -var12;
+ this.field_1246_j.rotateAngleY += var13;
+ this.field_1245_m.rotateAngleY += -var13;
+ this.field_1252_d.rotateAngleZ += var14;
+ this.field_1251_e.rotateAngleZ += -var14;
+ this.field_1250_f.rotateAngleZ += var15;
+ this.field_1249_g.rotateAngleZ += -var15;
+ this.field_1248_h.rotateAngleZ += var16;
+ this.field_1247_i.rotateAngleZ += -var16;
+ this.field_1246_j.rotateAngleZ += var17;
+ this.field_1245_m.rotateAngleZ += -var17;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ModelZombie.java b/src/main/java/net/minecraft/src/ModelZombie.java
new file mode 100644
index 0000000..7d3a64c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ModelZombie.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+public class ModelZombie extends ModelBiped {
+ public void setRotationAngles(float var1, float var2, float var3, float var4, float var5, float var6) {
+ super.setRotationAngles(var1, var2, var3, var4, var5, var6);
+ float var7 = MathHelper.sin(this.field_1244_k * (float)Math.PI);
+ float var8 = MathHelper.sin((1.0F - (1.0F - this.field_1244_k) * (1.0F - this.field_1244_k)) * (float)Math.PI);
+ this.bipedRightArm.rotateAngleZ = 0.0F;
+ this.bipedLeftArm.rotateAngleZ = 0.0F;
+ this.bipedRightArm.rotateAngleY = -(0.1F - var7 * 0.6F);
+ this.bipedLeftArm.rotateAngleY = 0.1F - var7 * 0.6F;
+ this.bipedRightArm.rotateAngleX = (float)Math.PI * -0.5F;
+ this.bipedLeftArm.rotateAngleX = (float)Math.PI * -0.5F;
+ this.bipedRightArm.rotateAngleX -= var7 * 1.2F - var8 * 0.4F;
+ this.bipedLeftArm.rotateAngleX -= var7 * 1.2F - var8 * 0.4F;
+ this.bipedRightArm.rotateAngleZ += MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F;
+ this.bipedLeftArm.rotateAngleZ -= MathHelper.cos(var3 * 0.09F) * 0.05F + 0.05F;
+ this.bipedRightArm.rotateAngleX += MathHelper.sin(var3 * 0.067F) * 0.05F;
+ this.bipedLeftArm.rotateAngleX -= MathHelper.sin(var3 * 0.067F) * 0.05F;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MouseHelper.java b/src/main/java/net/minecraft/src/MouseHelper.java
new file mode 100644
index 0000000..b6175c8
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MouseHelper.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+import org.lwjgl.input.Mouse;
+
+public class MouseHelper {
+ public int field_1114_a;
+ public int field_1113_b;
+
+ public MouseHelper() {
+ }
+
+ public void func_774_a() {
+ Mouse.setGrabbed(true);
+ this.field_1114_a = 0;
+ this.field_1113_b = 0;
+ }
+
+ public void func_773_b() {
+ Mouse.setGrabbed(false);
+ }
+
+ public void func_772_c() {
+ this.field_1114_a = Mouse.getDX();
+ this.field_1113_b = Mouse.getDY();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MovementInput.java b/src/main/java/net/minecraft/src/MovementInput.java
new file mode 100644
index 0000000..b54a860
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MovementInput.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class MovementInput {
+ public float field_1174_a = 0.0F;
+ public float field_1173_b = 0.0F;
+ public boolean field_1177_c = false;
+ public boolean field_1176_d = false;
+ public boolean field_1175_e = false;
+
+ public void func_797_a(EntityPlayer var1) {
+ }
+
+ public void func_798_a() {
+ }
+
+ public void func_796_a(int var1, boolean var2) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MovementInputFromOptions.java b/src/main/java/net/minecraft/src/MovementInputFromOptions.java
new file mode 100644
index 0000000..21ace24
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MovementInputFromOptions.java
@@ -0,0 +1,77 @@
+package net.minecraft.src;
+
+public class MovementInputFromOptions extends MovementInput {
+ private boolean[] field_1179_f = new boolean[10];
+ private GameSettings field_1178_g;
+
+ public MovementInputFromOptions(GameSettings var1) {
+ this.field_1178_g = var1;
+ }
+
+ public void func_796_a(int var1, boolean var2) {
+ byte var3 = -1;
+ if(var1 == this.field_1178_g.keyBindForward.keyCode) {
+ var3 = 0;
+ }
+
+ if(var1 == this.field_1178_g.keyBindBack.keyCode) {
+ var3 = 1;
+ }
+
+ if(var1 == this.field_1178_g.keyBindLeft.keyCode) {
+ var3 = 2;
+ }
+
+ if(var1 == this.field_1178_g.keyBindRight.keyCode) {
+ var3 = 3;
+ }
+
+ if(var1 == this.field_1178_g.keyBindJump.keyCode) {
+ var3 = 4;
+ }
+
+ if(var1 == this.field_1178_g.keyBindSneak.keyCode) {
+ var3 = 5;
+ }
+
+ if(var3 >= 0) {
+ this.field_1179_f[var3] = var2;
+ }
+
+ }
+
+ public void func_798_a() {
+ for(int var1 = 0; var1 < 10; ++var1) {
+ this.field_1179_f[var1] = false;
+ }
+
+ }
+
+ public void func_797_a(EntityPlayer var1) {
+ this.field_1174_a = 0.0F;
+ this.field_1173_b = 0.0F;
+ if(this.field_1179_f[0]) {
+ ++this.field_1173_b;
+ }
+
+ if(this.field_1179_f[1]) {
+ --this.field_1173_b;
+ }
+
+ if(this.field_1179_f[2]) {
+ ++this.field_1174_a;
+ }
+
+ if(this.field_1179_f[3]) {
+ --this.field_1174_a;
+ }
+
+ this.field_1176_d = this.field_1179_f[4];
+ this.field_1175_e = this.field_1179_f[5];
+ if(this.field_1175_e) {
+ this.field_1174_a = (float)((double)this.field_1174_a * 0.3D);
+ this.field_1173_b = (float)((double)this.field_1173_b * 0.3D);
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/MovingObjectPosition.java b/src/main/java/net/minecraft/src/MovingObjectPosition.java
new file mode 100644
index 0000000..764010a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/MovingObjectPosition.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class MovingObjectPosition {
+ public int typeOfHit;
+ public int blockX;
+ public int blockY;
+ public int blockZ;
+ public int sideHit;
+ public Vec3D hitVec;
+ public Entity entityHit;
+
+ public MovingObjectPosition(int var1, int var2, int var3, int var4, Vec3D var5) {
+ this.typeOfHit = 0;
+ this.blockX = var1;
+ this.blockY = var2;
+ this.blockZ = var3;
+ this.sideHit = var4;
+ this.hitVec = Vec3D.createVector(var5.xCoord, var5.yCoord, var5.zCoord);
+ }
+
+ public MovingObjectPosition(Entity var1) {
+ this.typeOfHit = 1;
+ this.entityHit = var1;
+ this.hitVec = Vec3D.createVector(var1.posX, var1.posY, var1.posZ);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTBase.java b/src/main/java/net/minecraft/src/NBTBase.java
new file mode 100644
index 0000000..454b4e7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTBase.java
@@ -0,0 +1,102 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public abstract class NBTBase {
+ private String key = null;
+
+ abstract void writeTagContents(DataOutput var1) throws IOException;
+
+ abstract void readTagContents(DataInput var1) throws IOException;
+
+ public abstract byte getType();
+
+ public String getKey() {
+ return this.key == null ? "" : this.key;
+ }
+
+ public NBTBase setKey(String var1) {
+ this.key = var1;
+ return this;
+ }
+
+ public static NBTBase readTag(DataInput var0) throws IOException {
+ byte var1 = var0.readByte();
+ if(var1 == 0) {
+ return new NBTTagEnd();
+ } else {
+ NBTBase var2 = createTagOfType(var1);
+ var2.key = var0.readUTF();
+ var2.readTagContents(var0);
+ return var2;
+ }
+ }
+
+ public static void writeTag(NBTBase var0, DataOutput var1) throws IOException {
+ var1.writeByte(var0.getType());
+ if(var0.getType() != 0) {
+ var1.writeUTF(var0.getKey());
+ var0.writeTagContents(var1);
+ }
+ }
+
+ public static NBTBase createTagOfType(byte var0) {
+ switch(var0) {
+ case 0:
+ return new NBTTagEnd();
+ case 1:
+ return new NBTTagByte();
+ case 2:
+ return new NBTTagShort();
+ case 3:
+ return new NBTTagInt();
+ case 4:
+ return new NBTTagLong();
+ case 5:
+ return new NBTTagFloat();
+ case 6:
+ return new NBTTagDouble();
+ case 7:
+ return new NBTTagByteArray();
+ case 8:
+ return new NBTTagString();
+ case 9:
+ return new NBTTagList();
+ case 10:
+ return new NBTTagCompound();
+ default:
+ return null;
+ }
+ }
+
+ public static String getTagName(byte var0) {
+ switch(var0) {
+ case 0:
+ return "TAG_End";
+ case 1:
+ return "TAG_Byte";
+ case 2:
+ return "TAG_Short";
+ case 3:
+ return "TAG_Int";
+ case 4:
+ return "TAG_Long";
+ case 5:
+ return "TAG_Float";
+ case 6:
+ return "TAG_Double";
+ case 7:
+ return "TAG_Byte_Array";
+ case 8:
+ return "TAG_String";
+ case 9:
+ return "TAG_List";
+ case 10:
+ return "TAG_Compound";
+ default:
+ return "UNKNOWN";
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagByte.java b/src/main/java/net/minecraft/src/NBTTagByte.java
new file mode 100644
index 0000000..3260724
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagByte.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagByte extends NBTBase {
+ public byte byteValue;
+
+ public NBTTagByte() {
+ }
+
+ public NBTTagByte(byte var1) {
+ this.byteValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeByte(this.byteValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.byteValue = var1.readByte();
+ }
+
+ public byte getType() {
+ return (byte)1;
+ }
+
+ public String toString() {
+ return "" + this.byteValue;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagByteArray.java b/src/main/java/net/minecraft/src/NBTTagByteArray.java
new file mode 100644
index 0000000..0f58fe1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagByteArray.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagByteArray extends NBTBase {
+ public byte[] byteArray;
+
+ public NBTTagByteArray() {
+ }
+
+ public NBTTagByteArray(byte[] var1) {
+ this.byteArray = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeInt(this.byteArray.length);
+ var1.write(this.byteArray);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ int var2 = var1.readInt();
+ this.byteArray = new byte[var2];
+ var1.readFully(this.byteArray);
+ }
+
+ public byte getType() {
+ return (byte)7;
+ }
+
+ public String toString() {
+ return "[" + this.byteArray.length + " bytes]";
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagCompound.java b/src/main/java/net/minecraft/src/NBTTagCompound.java
new file mode 100644
index 0000000..20cea63
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagCompound.java
@@ -0,0 +1,136 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class NBTTagCompound extends NBTBase {
+ private Map tagMap = new HashMap();
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ Iterator var2 = this.tagMap.values().iterator();
+
+ while(var2.hasNext()) {
+ NBTBase var3 = (NBTBase)var2.next();
+ NBTBase.writeTag(var3, var1);
+ }
+
+ var1.writeByte(0);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.tagMap.clear();
+
+ while(true) {
+ NBTBase var2 = NBTBase.readTag(var1);
+ if(var2.getType() == 0) {
+ return;
+ }
+
+ this.tagMap.put(var2.getKey(), var2);
+ }
+ }
+
+ public byte getType() {
+ return (byte)10;
+ }
+
+ public void setTag(String var1, NBTBase var2) {
+ this.tagMap.put(var1, var2.setKey(var1));
+ }
+
+ public void setByte(String var1, byte var2) {
+ this.tagMap.put(var1, (new NBTTagByte(var2)).setKey(var1));
+ }
+
+ public void setShort(String var1, short var2) {
+ this.tagMap.put(var1, (new NBTTagShort(var2)).setKey(var1));
+ }
+
+ public void setInteger(String var1, int var2) {
+ this.tagMap.put(var1, (new NBTTagInt(var2)).setKey(var1));
+ }
+
+ public void setLong(String var1, long var2) {
+ this.tagMap.put(var1, (new NBTTagLong(var2)).setKey(var1));
+ }
+
+ public void setFloat(String var1, float var2) {
+ this.tagMap.put(var1, (new NBTTagFloat(var2)).setKey(var1));
+ }
+
+ public void setDouble(String var1, double var2) {
+ this.tagMap.put(var1, (new NBTTagDouble(var2)).setKey(var1));
+ }
+
+ public void setString(String var1, String var2) {
+ this.tagMap.put(var1, (new NBTTagString(var2)).setKey(var1));
+ }
+
+ public void setByteArray(String var1, byte[] var2) {
+ this.tagMap.put(var1, (new NBTTagByteArray(var2)).setKey(var1));
+ }
+
+ public void setCompoundTag(String var1, NBTTagCompound var2) {
+ this.tagMap.put(var1, var2.setKey(var1));
+ }
+
+ public void setBoolean(String var1, boolean var2) {
+ this.setByte(var1, (byte)(var2 ? 1 : 0));
+ }
+
+ public boolean hasKey(String var1) {
+ return this.tagMap.containsKey(var1);
+ }
+
+ public byte getByte(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagByte)this.tagMap.get(var1)).byteValue;
+ }
+
+ public short getShort(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagShort)this.tagMap.get(var1)).shortValue;
+ }
+
+ public int getInteger(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0 : ((NBTTagInt)this.tagMap.get(var1)).intValue;
+ }
+
+ public long getLong(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0L : ((NBTTagLong)this.tagMap.get(var1)).longValue;
+ }
+
+ public float getFloat(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0.0F : ((NBTTagFloat)this.tagMap.get(var1)).floatValue;
+ }
+
+ public double getDouble(String var1) {
+ return !this.tagMap.containsKey(var1) ? 0.0D : ((NBTTagDouble)this.tagMap.get(var1)).doubleValue;
+ }
+
+ public String getString(String var1) {
+ return !this.tagMap.containsKey(var1) ? "" : ((NBTTagString)this.tagMap.get(var1)).stringValue;
+ }
+
+ public byte[] getByteArray(String var1) {
+ return !this.tagMap.containsKey(var1) ? new byte[0] : ((NBTTagByteArray)this.tagMap.get(var1)).byteArray;
+ }
+
+ public NBTTagCompound getCompoundTag(String var1) {
+ return !this.tagMap.containsKey(var1) ? new NBTTagCompound() : (NBTTagCompound)this.tagMap.get(var1);
+ }
+
+ public NBTTagList getTagList(String var1) {
+ return !this.tagMap.containsKey(var1) ? new NBTTagList() : (NBTTagList)this.tagMap.get(var1);
+ }
+
+ public boolean getBoolean(String var1) {
+ return this.getByte(var1) != 0;
+ }
+
+ public String toString() {
+ return "" + this.tagMap.size() + " entries";
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagDouble.java b/src/main/java/net/minecraft/src/NBTTagDouble.java
new file mode 100644
index 0000000..cd00968
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagDouble.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagDouble extends NBTBase {
+ public double doubleValue;
+
+ public NBTTagDouble() {
+ }
+
+ public NBTTagDouble(double var1) {
+ this.doubleValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeDouble(this.doubleValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.doubleValue = var1.readDouble();
+ }
+
+ public byte getType() {
+ return (byte)6;
+ }
+
+ public String toString() {
+ return "" + this.doubleValue;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagEnd.java b/src/main/java/net/minecraft/src/NBTTagEnd.java
new file mode 100644
index 0000000..a04e7d6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagEnd.java
@@ -0,0 +1,21 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagEnd extends NBTBase {
+ void readTagContents(DataInput var1) throws IOException {
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ }
+
+ public byte getType() {
+ return (byte)0;
+ }
+
+ public String toString() {
+ return "END";
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagFloat.java b/src/main/java/net/minecraft/src/NBTTagFloat.java
new file mode 100644
index 0000000..cf59c93
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagFloat.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagFloat extends NBTBase {
+ public float floatValue;
+
+ public NBTTagFloat() {
+ }
+
+ public NBTTagFloat(float var1) {
+ this.floatValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeFloat(this.floatValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.floatValue = var1.readFloat();
+ }
+
+ public byte getType() {
+ return (byte)5;
+ }
+
+ public String toString() {
+ return "" + this.floatValue;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagInt.java b/src/main/java/net/minecraft/src/NBTTagInt.java
new file mode 100644
index 0000000..6dfdfe6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagInt.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagInt extends NBTBase {
+ public int intValue;
+
+ public NBTTagInt() {
+ }
+
+ public NBTTagInt(int var1) {
+ this.intValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeInt(this.intValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.intValue = var1.readInt();
+ }
+
+ public byte getType() {
+ return (byte)3;
+ }
+
+ public String toString() {
+ return "" + this.intValue;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagList.java b/src/main/java/net/minecraft/src/NBTTagList.java
new file mode 100644
index 0000000..3ee8caf
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagList.java
@@ -0,0 +1,62 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class NBTTagList extends NBTBase {
+ private List tagList = new ArrayList();
+ private byte tagType;
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ if(this.tagList.size() > 0) {
+ this.tagType = ((NBTBase)this.tagList.get(0)).getType();
+ } else {
+ this.tagType = 1;
+ }
+
+ var1.writeByte(this.tagType);
+ var1.writeInt(this.tagList.size());
+
+ for(int var2 = 0; var2 < this.tagList.size(); ++var2) {
+ ((NBTBase)this.tagList.get(var2)).writeTagContents(var1);
+ }
+
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.tagType = var1.readByte();
+ int var2 = var1.readInt();
+ this.tagList = new ArrayList();
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ NBTBase var4 = NBTBase.createTagOfType(this.tagType);
+ var4.readTagContents(var1);
+ this.tagList.add(var4);
+ }
+
+ }
+
+ public byte getType() {
+ return (byte)9;
+ }
+
+ public String toString() {
+ return "" + this.tagList.size() + " entries of type " + NBTBase.getTagName(this.tagType);
+ }
+
+ public void setTag(NBTBase var1) {
+ this.tagType = var1.getType();
+ this.tagList.add(var1);
+ }
+
+ public NBTBase tagAt(int var1) {
+ return (NBTBase)this.tagList.get(var1);
+ }
+
+ public int tagCount() {
+ return this.tagList.size();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagLong.java b/src/main/java/net/minecraft/src/NBTTagLong.java
new file mode 100644
index 0000000..646f80d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagLong.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagLong extends NBTBase {
+ public long longValue;
+
+ public NBTTagLong() {
+ }
+
+ public NBTTagLong(long var1) {
+ this.longValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeLong(this.longValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.longValue = var1.readLong();
+ }
+
+ public byte getType() {
+ return (byte)4;
+ }
+
+ public String toString() {
+ return "" + this.longValue;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagShort.java b/src/main/java/net/minecraft/src/NBTTagShort.java
new file mode 100644
index 0000000..3345229
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagShort.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagShort extends NBTBase {
+ public short shortValue;
+
+ public NBTTagShort() {
+ }
+
+ public NBTTagShort(short var1) {
+ this.shortValue = var1;
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeShort(this.shortValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.shortValue = var1.readShort();
+ }
+
+ public byte getType() {
+ return (byte)2;
+ }
+
+ public String toString() {
+ return "" + this.shortValue;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NBTTagString.java b/src/main/java/net/minecraft/src/NBTTagString.java
new file mode 100644
index 0000000..93fca6e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NBTTagString.java
@@ -0,0 +1,35 @@
+package net.minecraft.src;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+public class NBTTagString extends NBTBase {
+ public String stringValue;
+
+ public NBTTagString() {
+ }
+
+ public NBTTagString(String var1) {
+ this.stringValue = var1;
+ if(var1 == null) {
+ throw new IllegalArgumentException("Empty string not allowed");
+ }
+ }
+
+ void writeTagContents(DataOutput var1) throws IOException {
+ var1.writeUTF(this.stringValue);
+ }
+
+ void readTagContents(DataInput var1) throws IOException {
+ this.stringValue = var1.readUTF();
+ }
+
+ public byte getType() {
+ return (byte)8;
+ }
+
+ public String toString() {
+ return "" + this.stringValue;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NextTickListEntry.java b/src/main/java/net/minecraft/src/NextTickListEntry.java
new file mode 100644
index 0000000..3870d49
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NextTickListEntry.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+public class NextTickListEntry implements Comparable {
+ private static long nextTickEntryID = 0L;
+ public int xCoord;
+ public int yCoord;
+ public int zCoord;
+ public int blockID;
+ public long scheduledTime;
+ private long tickEntryID = nextTickEntryID++;
+
+ public NextTickListEntry(int var1, int var2, int var3, int var4) {
+ this.xCoord = var1;
+ this.yCoord = var2;
+ this.zCoord = var3;
+ this.blockID = var4;
+ }
+
+ public boolean equals(Object var1) {
+ if(!(var1 instanceof NextTickListEntry)) {
+ return false;
+ } else {
+ NextTickListEntry var2 = (NextTickListEntry)var1;
+ return this.xCoord == var2.xCoord && this.yCoord == var2.yCoord && this.zCoord == var2.zCoord && this.blockID == var2.blockID;
+ }
+ }
+
+ public int hashCode() {
+ return (this.xCoord * 128 * 1024 + this.zCoord * 128 + this.yCoord) * 256 + this.blockID;
+ }
+
+ public NextTickListEntry setScheduledTime(long var1) {
+ this.scheduledTime = var1;
+ return this;
+ }
+
+ public int a(NextTickListEntry var1) {
+ return this.scheduledTime < var1.scheduledTime ? -1 : (this.scheduledTime > var1.scheduledTime ? 1 : (this.tickEntryID < var1.tickEntryID ? -1 : (this.tickEntryID > var1.tickEntryID ? 1 : 0)));
+ }
+
+ public int compareTo(Object var1) {
+ return this.a((NextTickListEntry)var1);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NibbleArray.java b/src/main/java/net/minecraft/src/NibbleArray.java
new file mode 100644
index 0000000..28a1f67
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NibbleArray.java
@@ -0,0 +1,36 @@
+package net.minecraft.src;
+
+public class NibbleArray {
+ public final byte[] data;
+
+ public NibbleArray(int var1) {
+ this.data = new byte[var1 >> 1];
+ }
+
+ public NibbleArray(byte[] var1) {
+ this.data = var1;
+ }
+
+ public int getNibble(int var1, int var2, int var3) {
+ int var4 = var1 << 11 | var3 << 7 | var2;
+ int var5 = var4 >> 1;
+ int var6 = var4 & 1;
+ return var6 == 0 ? this.data[var5] & 15 : this.data[var5] >> 4 & 15;
+ }
+
+ public void setNibble(int var1, int var2, int var3, int var4) {
+ int var5 = var1 << 11 | var3 << 7 | var2;
+ int var6 = var5 >> 1;
+ int var7 = var5 & 1;
+ if(var7 == 0) {
+ this.data[var6] = (byte)(this.data[var6] & 240 | var4 & 15);
+ } else {
+ this.data[var6] = (byte)(this.data[var6] & 15 | (var4 & 15) << 4);
+ }
+
+ }
+
+ public boolean isValid() {
+ return this.data != null;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NoiseGenerator.java b/src/main/java/net/minecraft/src/NoiseGenerator.java
new file mode 100644
index 0000000..53e6d05
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NoiseGenerator.java
@@ -0,0 +1,4 @@
+package net.minecraft.src;
+
+public abstract class NoiseGenerator {
+}
diff --git a/src/main/java/net/minecraft/src/NoiseGenerator2.java b/src/main/java/net/minecraft/src/NoiseGenerator2.java
new file mode 100644
index 0000000..4ef2a4b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NoiseGenerator2.java
@@ -0,0 +1,114 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class NoiseGenerator2 {
+ private static int[][] field_4296_d = new int[][]{{1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1}};
+ private int[] field_4295_e;
+ public double field_4292_a;
+ public double field_4291_b;
+ public double field_4297_c;
+ private static final double field_4294_f = 0.5D * (Math.sqrt(3.0D) - 1.0D);
+ private static final double field_4293_g = (3.0D - Math.sqrt(3.0D)) / 6.0D;
+
+ public NoiseGenerator2() {
+ this(new Random());
+ }
+
+ public NoiseGenerator2(Random var1) {
+ this.field_4295_e = new int[512];
+ this.field_4292_a = var1.nextDouble() * 256.0D;
+ this.field_4291_b = var1.nextDouble() * 256.0D;
+ this.field_4297_c = var1.nextDouble() * 256.0D;
+
+ int var2;
+ for(var2 = 0; var2 < 256; this.field_4295_e[var2] = var2++) {
+ }
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ int var3 = var1.nextInt(256 - var2) + var2;
+ int var4 = this.field_4295_e[var2];
+ this.field_4295_e[var2] = this.field_4295_e[var3];
+ this.field_4295_e[var3] = var4;
+ this.field_4295_e[var2 + 256] = this.field_4295_e[var2];
+ }
+
+ }
+
+ private static int func_4155_a(double var0) {
+ return var0 > 0.0D ? (int)var0 : (int)var0 - 1;
+ }
+
+ private static double func_4156_a(int[] var0, double var1, double var3) {
+ return (double)var0[0] * var1 + (double)var0[1] * var3;
+ }
+
+ public void func_4157_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12) {
+ int var14 = 0;
+
+ for(int var15 = 0; var15 < var6; ++var15) {
+ double var16 = (var2 + (double)var15) * var8 + this.field_4292_a;
+
+ for(int var18 = 0; var18 < var7; ++var18) {
+ double var19 = (var4 + (double)var18) * var10 + this.field_4291_b;
+ double var27 = (var16 + var19) * field_4294_f;
+ int var29 = func_4155_a(var16 + var27);
+ int var30 = func_4155_a(var19 + var27);
+ double var31 = (double)(var29 + var30) * field_4293_g;
+ double var33 = (double)var29 - var31;
+ double var35 = (double)var30 - var31;
+ double var37 = var16 - var33;
+ double var39 = var19 - var35;
+ byte var41;
+ byte var42;
+ if(var37 > var39) {
+ var41 = 1;
+ var42 = 0;
+ } else {
+ var41 = 0;
+ var42 = 1;
+ }
+
+ double var43 = var37 - (double)var41 + field_4293_g;
+ double var45 = var39 - (double)var42 + field_4293_g;
+ double var47 = var37 - 1.0D + 2.0D * field_4293_g;
+ double var49 = var39 - 1.0D + 2.0D * field_4293_g;
+ int var51 = var29 & 255;
+ int var52 = var30 & 255;
+ int var53 = this.field_4295_e[var51 + this.field_4295_e[var52]] % 12;
+ int var54 = this.field_4295_e[var51 + var41 + this.field_4295_e[var52 + var42]] % 12;
+ int var55 = this.field_4295_e[var51 + 1 + this.field_4295_e[var52 + 1]] % 12;
+ double var56 = 0.5D - var37 * var37 - var39 * var39;
+ double var21;
+ if(var56 < 0.0D) {
+ var21 = 0.0D;
+ } else {
+ var56 *= var56;
+ var21 = var56 * var56 * func_4156_a(field_4296_d[var53], var37, var39);
+ }
+
+ double var58 = 0.5D - var43 * var43 - var45 * var45;
+ double var23;
+ if(var58 < 0.0D) {
+ var23 = 0.0D;
+ } else {
+ var58 *= var58;
+ var23 = var58 * var58 * func_4156_a(field_4296_d[var54], var43, var45);
+ }
+
+ double var60 = 0.5D - var47 * var47 - var49 * var49;
+ double var25;
+ if(var60 < 0.0D) {
+ var25 = 0.0D;
+ } else {
+ var60 *= var60;
+ var25 = var60 * var60 * func_4156_a(field_4296_d[var55], var47, var49);
+ }
+
+ int var10001 = var14++;
+ var1[var10001] += 70.0D * (var21 + var23 + var25) * var12;
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NoiseGeneratorOctaves.java b/src/main/java/net/minecraft/src/NoiseGeneratorOctaves.java
new file mode 100644
index 0000000..b159697
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NoiseGeneratorOctaves.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class NoiseGeneratorOctaves extends NoiseGenerator {
+ private NoiseGeneratorPerlin[] generatorCollection;
+ private int field_1191_b;
+
+ public NoiseGeneratorOctaves(Random var1, int var2) {
+ this.field_1191_b = var2;
+ this.generatorCollection = new NoiseGeneratorPerlin[var2];
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ this.generatorCollection[var3] = new NoiseGeneratorPerlin(var1);
+ }
+
+ }
+
+ public double func_806_a(double var1, double var3) {
+ double var5 = 0.0D;
+ double var7 = 1.0D;
+
+ for(int var9 = 0; var9 < this.field_1191_b; ++var9) {
+ var5 += this.generatorCollection[var9].func_801_a(var1 * var7, var3 * var7) / var7;
+ var7 /= 2.0D;
+ }
+
+ return var5;
+ }
+
+ public double[] func_807_a(double[] var1, double var2, double var4, double var6, int var8, int var9, int var10, double var11, double var13, double var15) {
+ if(var1 == null) {
+ var1 = new double[var8 * var9 * var10];
+ } else {
+ for(int var17 = 0; var17 < var1.length; ++var17) {
+ var1[var17] = 0.0D;
+ }
+ }
+
+ double var20 = 1.0D;
+
+ for(int var19 = 0; var19 < this.field_1191_b; ++var19) {
+ this.generatorCollection[var19].func_805_a(var1, var2, var4, var6, var8, var9, var10, var11 * var20, var13 * var20, var15 * var20, var20);
+ var20 /= 2.0D;
+ }
+
+ return var1;
+ }
+
+ public double[] func_4109_a(double[] var1, int var2, int var3, int var4, int var5, double var6, double var8, double var10) {
+ return this.func_807_a(var1, (double)var2, 10.0D, (double)var3, var4, 1, var5, var6, 1.0D, var8);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NoiseGeneratorOctaves2.java b/src/main/java/net/minecraft/src/NoiseGeneratorOctaves2.java
new file mode 100644
index 0000000..b8b65f4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NoiseGeneratorOctaves2.java
@@ -0,0 +1,45 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class NoiseGeneratorOctaves2 extends NoiseGenerator {
+ private NoiseGenerator2[] field_4234_a;
+ private int field_4233_b;
+
+ public NoiseGeneratorOctaves2(Random var1, int var2) {
+ this.field_4233_b = var2;
+ this.field_4234_a = new NoiseGenerator2[var2];
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ this.field_4234_a[var3] = new NoiseGenerator2(var1);
+ }
+
+ }
+
+ public double[] func_4112_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12) {
+ return this.func_4111_a(var1, var2, var4, var6, var7, var8, var10, var12, 0.5D);
+ }
+
+ public double[] func_4111_a(double[] var1, double var2, double var4, int var6, int var7, double var8, double var10, double var12, double var14) {
+ var8 /= 1.5D;
+ var10 /= 1.5D;
+ if(var1 != null && var1.length >= var6 * var7) {
+ for(int var16 = 0; var16 < var1.length; ++var16) {
+ var1[var16] = 0.0D;
+ }
+ } else {
+ var1 = new double[var6 * var7];
+ }
+
+ double var21 = 1.0D;
+ double var18 = 1.0D;
+
+ for(int var20 = 0; var20 < this.field_4233_b; ++var20) {
+ this.field_4234_a[var20].func_4157_a(var1, var2, var4, var6, var7, var8 * var18, var10 * var18, 0.55D / var21);
+ var18 *= var12;
+ var21 *= var14;
+ }
+
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/NoiseGeneratorPerlin.java b/src/main/java/net/minecraft/src/NoiseGeneratorPerlin.java
new file mode 100644
index 0000000..1a159fe
--- /dev/null
+++ b/src/main/java/net/minecraft/src/NoiseGeneratorPerlin.java
@@ -0,0 +1,221 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class NoiseGeneratorPerlin extends NoiseGenerator {
+ private int[] permutations;
+ public double xCoord;
+ public double yCoord;
+ public double zCoord;
+
+ public NoiseGeneratorPerlin() {
+ this(new Random());
+ }
+
+ public NoiseGeneratorPerlin(Random var1) {
+ this.permutations = new int[512];
+ this.xCoord = var1.nextDouble() * 256.0D;
+ this.yCoord = var1.nextDouble() * 256.0D;
+ this.zCoord = var1.nextDouble() * 256.0D;
+
+ int var2;
+ for(var2 = 0; var2 < 256; this.permutations[var2] = var2++) {
+ }
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ int var3 = var1.nextInt(256 - var2) + var2;
+ int var4 = this.permutations[var2];
+ this.permutations[var2] = this.permutations[var3];
+ this.permutations[var3] = var4;
+ this.permutations[var2 + 256] = this.permutations[var2];
+ }
+
+ }
+
+ public double generateNoise(double var1, double var3, double var5) {
+ double var7 = var1 + this.xCoord;
+ double var9 = var3 + this.yCoord;
+ double var11 = var5 + this.zCoord;
+ int var13 = (int)var7;
+ int var14 = (int)var9;
+ int var15 = (int)var11;
+ if(var7 < (double)var13) {
+ --var13;
+ }
+
+ if(var9 < (double)var14) {
+ --var14;
+ }
+
+ if(var11 < (double)var15) {
+ --var15;
+ }
+
+ int var16 = var13 & 255;
+ int var17 = var14 & 255;
+ int var18 = var15 & 255;
+ var7 -= (double)var13;
+ var9 -= (double)var14;
+ var11 -= (double)var15;
+ double var19 = var7 * var7 * var7 * (var7 * (var7 * 6.0D - 15.0D) + 10.0D);
+ double var21 = var9 * var9 * var9 * (var9 * (var9 * 6.0D - 15.0D) + 10.0D);
+ double var23 = var11 * var11 * var11 * (var11 * (var11 * 6.0D - 15.0D) + 10.0D);
+ int var25 = this.permutations[var16] + var17;
+ int var26 = this.permutations[var25] + var18;
+ int var27 = this.permutations[var25 + 1] + var18;
+ int var28 = this.permutations[var16 + 1] + var17;
+ int var29 = this.permutations[var28] + var18;
+ int var30 = this.permutations[var28 + 1] + var18;
+ return this.lerp(var23, this.lerp(var21, this.lerp(var19, this.grad(this.permutations[var26], var7, var9, var11), this.grad(this.permutations[var29], var7 - 1.0D, var9, var11)), this.lerp(var19, this.grad(this.permutations[var27], var7, var9 - 1.0D, var11), this.grad(this.permutations[var30], var7 - 1.0D, var9 - 1.0D, var11))), this.lerp(var21, this.lerp(var19, this.grad(this.permutations[var26 + 1], var7, var9, var11 - 1.0D), this.grad(this.permutations[var29 + 1], var7 - 1.0D, var9, var11 - 1.0D)), this.lerp(var19, this.grad(this.permutations[var27 + 1], var7, var9 - 1.0D, var11 - 1.0D), this.grad(this.permutations[var30 + 1], var7 - 1.0D, var9 - 1.0D, var11 - 1.0D))));
+ }
+
+ public final double lerp(double var1, double var3, double var5) {
+ return var3 + var1 * (var5 - var3);
+ }
+
+ public final double func_4110_a(int var1, double var2, double var4) {
+ int var6 = var1 & 15;
+ double var7 = (double)(1 - ((var6 & 8) >> 3)) * var2;
+ double var9 = var6 < 4 ? 0.0D : (var6 != 12 && var6 != 14 ? var4 : var2);
+ return ((var6 & 1) == 0 ? var7 : -var7) + ((var6 & 2) == 0 ? var9 : -var9);
+ }
+
+ public final double grad(int var1, double var2, double var4, double var6) {
+ int var8 = var1 & 15;
+ double var9 = var8 < 8 ? var2 : var4;
+ double var11 = var8 < 4 ? var4 : (var8 != 12 && var8 != 14 ? var6 : var2);
+ return ((var8 & 1) == 0 ? var9 : -var9) + ((var8 & 2) == 0 ? var11 : -var11);
+ }
+
+ public double func_801_a(double var1, double var3) {
+ return this.generateNoise(var1, var3, 0.0D);
+ }
+
+ public void func_805_a(double[] var1, double var2, double var4, double var6, int var8, int var9, int var10, double var11, double var13, double var15, double var17) {
+ int var10001;
+ int var19;
+ int var22;
+ double var31;
+ double var35;
+ int var37;
+ double var38;
+ int var40;
+ int var41;
+ double var42;
+ int var75;
+ if(var9 == 1) {
+ boolean var64 = false;
+ boolean var65 = false;
+ boolean var21 = false;
+ boolean var68 = false;
+ double var70 = 0.0D;
+ double var73 = 0.0D;
+ var75 = 0;
+ double var77 = 1.0D / var17;
+
+ for(int var30 = 0; var30 < var8; ++var30) {
+ var31 = (var2 + (double)var30) * var11 + this.xCoord;
+ int var78 = (int)var31;
+ if(var31 < (double)var78) {
+ --var78;
+ }
+
+ int var34 = var78 & 255;
+ var31 -= (double)var78;
+ var35 = var31 * var31 * var31 * (var31 * (var31 * 6.0D - 15.0D) + 10.0D);
+
+ for(var37 = 0; var37 < var10; ++var37) {
+ var38 = (var6 + (double)var37) * var15 + this.zCoord;
+ var40 = (int)var38;
+ if(var38 < (double)var40) {
+ --var40;
+ }
+
+ var41 = var40 & 255;
+ var38 -= (double)var40;
+ var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D);
+ var19 = this.permutations[var34] + 0;
+ int var66 = this.permutations[var19] + var41;
+ int var67 = this.permutations[var34 + 1] + 0;
+ var22 = this.permutations[var67] + var41;
+ var70 = this.lerp(var35, this.func_4110_a(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38));
+ var73 = this.lerp(var35, this.grad(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D));
+ double var79 = this.lerp(var42, var70, var73);
+ var10001 = var75++;
+ var1[var10001] += var79 * var77;
+ }
+ }
+
+ } else {
+ var19 = 0;
+ double var20 = 1.0D / var17;
+ var22 = -1;
+ boolean var23 = false;
+ boolean var24 = false;
+ boolean var25 = false;
+ boolean var26 = false;
+ boolean var27 = false;
+ boolean var28 = false;
+ double var29 = 0.0D;
+ var31 = 0.0D;
+ double var33 = 0.0D;
+ var35 = 0.0D;
+
+ for(var37 = 0; var37 < var8; ++var37) {
+ var38 = (var2 + (double)var37) * var11 + this.xCoord;
+ var40 = (int)var38;
+ if(var38 < (double)var40) {
+ --var40;
+ }
+
+ var41 = var40 & 255;
+ var38 -= (double)var40;
+ var42 = var38 * var38 * var38 * (var38 * (var38 * 6.0D - 15.0D) + 10.0D);
+
+ for(int var44 = 0; var44 < var10; ++var44) {
+ double var45 = (var6 + (double)var44) * var15 + this.zCoord;
+ int var47 = (int)var45;
+ if(var45 < (double)var47) {
+ --var47;
+ }
+
+ int var48 = var47 & 255;
+ var45 -= (double)var47;
+ double var49 = var45 * var45 * var45 * (var45 * (var45 * 6.0D - 15.0D) + 10.0D);
+
+ for(int var51 = 0; var51 < var9; ++var51) {
+ double var52 = (var4 + (double)var51) * var13 + this.yCoord;
+ int var54 = (int)var52;
+ if(var52 < (double)var54) {
+ --var54;
+ }
+
+ int var55 = var54 & 255;
+ var52 -= (double)var54;
+ double var56 = var52 * var52 * var52 * (var52 * (var52 * 6.0D - 15.0D) + 10.0D);
+ if(var51 == 0 || var55 != var22) {
+ var22 = var55;
+ int var69 = this.permutations[var41] + var55;
+ int var71 = this.permutations[var69] + var48;
+ int var72 = this.permutations[var69 + 1] + var48;
+ int var74 = this.permutations[var41 + 1] + var55;
+ var75 = this.permutations[var74] + var48;
+ int var76 = this.permutations[var74 + 1] + var48;
+ var29 = this.lerp(var42, this.grad(this.permutations[var71], var38, var52, var45), this.grad(this.permutations[var75], var38 - 1.0D, var52, var45));
+ var31 = this.lerp(var42, this.grad(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45));
+ var33 = this.lerp(var42, this.grad(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D));
+ var35 = this.lerp(var42, this.grad(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D));
+ }
+
+ double var58 = this.lerp(var56, var29, var31);
+ double var60 = this.lerp(var56, var33, var35);
+ double var62 = this.lerp(var49, var58, var60);
+ var10001 = var19++;
+ var1[var10001] += var62 * var20;
+ }
+ }
+ }
+
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Path.java b/src/main/java/net/minecraft/src/Path.java
new file mode 100644
index 0000000..ce289f0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Path.java
@@ -0,0 +1,119 @@
+package net.minecraft.src;
+
+public class Path {
+ private PathPoint[] pathPoints = new PathPoint[1024];
+ private int count = 0;
+
+ public PathPoint addPoint(PathPoint var1) {
+ if(var1.index >= 0) {
+ throw new IllegalStateException("OW KNOWS!");
+ } else {
+ if(this.count == this.pathPoints.length) {
+ PathPoint[] var2 = new PathPoint[this.count << 1];
+ System.arraycopy(this.pathPoints, 0, var2, 0, this.count);
+ this.pathPoints = var2;
+ }
+
+ this.pathPoints[this.count] = var1;
+ var1.index = this.count;
+ this.sortBack(this.count++);
+ return var1;
+ }
+ }
+
+ public void clearPath() {
+ this.count = 0;
+ }
+
+ public PathPoint dequeue() {
+ PathPoint var1 = this.pathPoints[0];
+ this.pathPoints[0] = this.pathPoints[--this.count];
+ this.pathPoints[this.count] = null;
+ if(this.count > 0) {
+ this.sortForward(0);
+ }
+
+ var1.index = -1;
+ return var1;
+ }
+
+ public void changeDistance(PathPoint var1, float var2) {
+ float var3 = var1.distanceToTarget;
+ var1.distanceToTarget = var2;
+ if(var2 < var3) {
+ this.sortBack(var1.index);
+ } else {
+ this.sortForward(var1.index);
+ }
+
+ }
+
+ private void sortBack(int var1) {
+ PathPoint var2 = this.pathPoints[var1];
+
+ int var4;
+ for(float var3 = var2.distanceToTarget; var1 > 0; var1 = var4) {
+ var4 = var1 - 1 >> 1;
+ PathPoint var5 = this.pathPoints[var4];
+ if(var3 >= var5.distanceToTarget) {
+ break;
+ }
+
+ this.pathPoints[var1] = var5;
+ var5.index = var1;
+ }
+
+ this.pathPoints[var1] = var2;
+ var2.index = var1;
+ }
+
+ private void sortForward(int var1) {
+ PathPoint var2 = this.pathPoints[var1];
+ float var3 = var2.distanceToTarget;
+
+ while(true) {
+ int var4 = 1 + (var1 << 1);
+ int var5 = var4 + 1;
+ if(var4 >= this.count) {
+ break;
+ }
+
+ PathPoint var6 = this.pathPoints[var4];
+ float var7 = var6.distanceToTarget;
+ PathPoint var8;
+ float var9;
+ if(var5 >= this.count) {
+ var8 = null;
+ var9 = Float.POSITIVE_INFINITY;
+ } else {
+ var8 = this.pathPoints[var5];
+ var9 = var8.distanceToTarget;
+ }
+
+ if(var7 < var9) {
+ if(var7 >= var3) {
+ break;
+ }
+
+ this.pathPoints[var1] = var6;
+ var6.index = var1;
+ var1 = var4;
+ } else {
+ if(var9 >= var3) {
+ break;
+ }
+
+ this.pathPoints[var1] = var8;
+ var8.index = var1;
+ var1 = var5;
+ }
+ }
+
+ this.pathPoints[var1] = var2;
+ var2.index = var1;
+ }
+
+ public boolean isPathEmpty() {
+ return this.count == 0;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/PathEntity.java b/src/main/java/net/minecraft/src/PathEntity.java
new file mode 100644
index 0000000..74eacc6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/PathEntity.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+public class PathEntity {
+ private final PathPoint[] points;
+ public final int pathLength;
+ private int pathIndex;
+
+ public PathEntity(PathPoint[] var1) {
+ this.points = var1;
+ this.pathLength = var1.length;
+ }
+
+ public void incrementPathIndex() {
+ ++this.pathIndex;
+ }
+
+ public boolean isFinished() {
+ return this.pathIndex >= this.points.length;
+ }
+
+ public Vec3D getPosition(Entity var1) {
+ double var2 = (double)this.points[this.pathIndex].xCoord + (double)((int)(var1.width + 1.0F)) * 0.5D;
+ double var4 = (double)this.points[this.pathIndex].yCoord;
+ double var6 = (double)this.points[this.pathIndex].zCoord + (double)((int)(var1.width + 1.0F)) * 0.5D;
+ return Vec3D.createVector(var2, var4, var6);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/PathPoint.java b/src/main/java/net/minecraft/src/PathPoint.java
new file mode 100644
index 0000000..7df70dd
--- /dev/null
+++ b/src/main/java/net/minecraft/src/PathPoint.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+public class PathPoint {
+ public final int xCoord;
+ public final int yCoord;
+ public final int zCoord;
+ public final int hash;
+ int index = -1;
+ float totalPathDistance;
+ float distanceToNext;
+ float distanceToTarget;
+ PathPoint previous;
+ public boolean isFirst = false;
+
+ public PathPoint(int var1, int var2, int var3) {
+ this.xCoord = var1;
+ this.yCoord = var2;
+ this.zCoord = var3;
+ this.hash = var1 | var2 << 10 | var3 << 20;
+ }
+
+ public float distanceTo(PathPoint var1) {
+ float var2 = (float)(var1.xCoord - this.xCoord);
+ float var3 = (float)(var1.yCoord - this.yCoord);
+ float var4 = (float)(var1.zCoord - this.zCoord);
+ return MathHelper.sqrt_float(var2 * var2 + var3 * var3 + var4 * var4);
+ }
+
+ public boolean equals(Object var1) {
+ return ((PathPoint)var1).hash == this.hash;
+ }
+
+ public int hashCode() {
+ return this.hash;
+ }
+
+ public boolean isAssigned() {
+ return this.index >= 0;
+ }
+
+ public String toString() {
+ return this.xCoord + ", " + this.yCoord + ", " + this.zCoord;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Pathfinder.java b/src/main/java/net/minecraft/src/Pathfinder.java
new file mode 100644
index 0000000..8ae9b07
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Pathfinder.java
@@ -0,0 +1,193 @@
+package net.minecraft.src;
+
+public class Pathfinder {
+ private IBlockAccess worldMap;
+ private Path path = new Path();
+ private MCHashTable pointMap = new MCHashTable();
+ private PathPoint[] pathOptions = new PathPoint[32];
+
+ public Pathfinder(IBlockAccess var1) {
+ this.worldMap = var1;
+ }
+
+ public PathEntity createEntityPathTo(Entity var1, Entity var2, float var3) {
+ return this.createEntityPathTo(var1, var2.posX, var2.boundingBox.minY, var2.posZ, var3);
+ }
+
+ public PathEntity createEntityPathTo(Entity var1, int var2, int var3, int var4, float var5) {
+ return this.createEntityPathTo(var1, (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), (double)((float)var4 + 0.5F), var5);
+ }
+
+ private PathEntity createEntityPathTo(Entity var1, double var2, double var4, double var6, float var8) {
+ this.path.clearPath();
+ this.pointMap.clearMap();
+ PathPoint var9 = this.openPoint(MathHelper.floor_double(var1.boundingBox.minX), MathHelper.floor_double(var1.boundingBox.minY), MathHelper.floor_double(var1.boundingBox.minZ));
+ PathPoint var10 = this.openPoint(MathHelper.floor_double(var2 - (double)(var1.width / 2.0F)), MathHelper.floor_double(var4), MathHelper.floor_double(var6 - (double)(var1.width / 2.0F)));
+ PathPoint var11 = new PathPoint(MathHelper.floor_float(var1.width + 1.0F), MathHelper.floor_float(var1.height + 1.0F), MathHelper.floor_float(var1.width + 1.0F));
+ PathEntity var12 = this.addToPath(var1, var9, var10, var11, var8);
+ return var12;
+ }
+
+ private PathEntity addToPath(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) {
+ var2.totalPathDistance = 0.0F;
+ var2.distanceToNext = var2.distanceTo(var3);
+ var2.distanceToTarget = var2.distanceToNext;
+ this.path.clearPath();
+ this.path.addPoint(var2);
+ PathPoint var6 = var2;
+
+ while(!this.path.isPathEmpty()) {
+ PathPoint var7 = this.path.dequeue();
+ if(var7.hash == var3.hash) {
+ return this.createEntityPath(var2, var3);
+ }
+
+ if(var7.distanceTo(var3) < var6.distanceTo(var3)) {
+ var6 = var7;
+ }
+
+ var7.isFirst = true;
+ int var8 = this.findPathOptions(var1, var7, var4, var3, var5);
+
+ for(int var9 = 0; var9 < var8; ++var9) {
+ PathPoint var10 = this.pathOptions[var9];
+ float var11 = var7.totalPathDistance + var7.distanceTo(var10);
+ if(!var10.isAssigned() || var11 < var10.totalPathDistance) {
+ var10.previous = var7;
+ var10.totalPathDistance = var11;
+ var10.distanceToNext = var10.distanceTo(var3);
+ if(var10.isAssigned()) {
+ this.path.changeDistance(var10, var10.totalPathDistance + var10.distanceToNext);
+ } else {
+ var10.distanceToTarget = var10.totalPathDistance + var10.distanceToNext;
+ this.path.addPoint(var10);
+ }
+ }
+ }
+ }
+
+ if(var6 == var2) {
+ return null;
+ } else {
+ return this.createEntityPath(var2, var6);
+ }
+ }
+
+ private int findPathOptions(Entity var1, PathPoint var2, PathPoint var3, PathPoint var4, float var5) {
+ int var6 = 0;
+ byte var7 = 0;
+ if(this.getVerticalOffset(var1, var2.xCoord, var2.yCoord + 1, var2.zCoord, var3) > 0) {
+ var7 = 1;
+ }
+
+ PathPoint var8 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord + 1, var3, var7);
+ PathPoint var9 = this.getSafePoint(var1, var2.xCoord - 1, var2.yCoord, var2.zCoord, var3, var7);
+ PathPoint var10 = this.getSafePoint(var1, var2.xCoord + 1, var2.yCoord, var2.zCoord, var3, var7);
+ PathPoint var11 = this.getSafePoint(var1, var2.xCoord, var2.yCoord, var2.zCoord - 1, var3, var7);
+ if(var8 != null && !var8.isFirst && var8.distanceTo(var4) < var5) {
+ this.pathOptions[var6++] = var8;
+ }
+
+ if(var9 != null && !var9.isFirst && var9.distanceTo(var4) < var5) {
+ this.pathOptions[var6++] = var9;
+ }
+
+ if(var10 != null && !var10.isFirst && var10.distanceTo(var4) < var5) {
+ this.pathOptions[var6++] = var10;
+ }
+
+ if(var11 != null && !var11.isFirst && var11.distanceTo(var4) < var5) {
+ this.pathOptions[var6++] = var11;
+ }
+
+ return var6;
+ }
+
+ private PathPoint getSafePoint(Entity var1, int var2, int var3, int var4, PathPoint var5, int var6) {
+ PathPoint var7 = null;
+ if(this.getVerticalOffset(var1, var2, var3, var4, var5) > 0) {
+ var7 = this.openPoint(var2, var3, var4);
+ }
+
+ if(var7 == null && this.getVerticalOffset(var1, var2, var3 + var6, var4, var5) > 0) {
+ var7 = this.openPoint(var2, var3 + var6, var4);
+ var3 += var6;
+ }
+
+ if(var7 != null) {
+ int var8 = 0;
+
+ for(boolean var9 = false; var3 > 0; --var3) {
+ int var10 = this.getVerticalOffset(var1, var2, var3 - 1, var4, var5);
+ if(var10 <= 0) {
+ break;
+ }
+
+ if(var10 < 0) {
+ return null;
+ }
+
+ ++var8;
+ if(var8 >= 4) {
+ return null;
+ }
+ }
+
+ if(var3 > 0) {
+ var7 = this.openPoint(var2, var3, var4);
+ }
+ }
+
+ return var7;
+ }
+
+ private final PathPoint openPoint(int var1, int var2, int var3) {
+ int var4 = var1 | var2 << 10 | var3 << 20;
+ PathPoint var5 = (PathPoint)this.pointMap.lookup(var4);
+ if(var5 == null) {
+ var5 = new PathPoint(var1, var2, var3);
+ this.pointMap.addKey(var4, var5);
+ }
+
+ return var5;
+ }
+
+ private int getVerticalOffset(Entity var1, int var2, int var3, int var4, PathPoint var5) {
+ for(int var6 = var2; var6 < var2 + var5.xCoord; ++var6) {
+ for(int var7 = var3; var7 < var3 + var5.yCoord; ++var7) {
+ for(int var8 = var4; var8 < var4 + var5.zCoord; ++var8) {
+ Material var9 = this.worldMap.getBlockMaterial(var2, var3, var4);
+ if(var9.func_880_c()) {
+ return 0;
+ }
+
+ if(var9 == Material.water || var9 == Material.lava) {
+ return -1;
+ }
+ }
+ }
+ }
+
+ return 1;
+ }
+
+ private PathEntity createEntityPath(PathPoint var1, PathPoint var2) {
+ int var3 = 1;
+
+ PathPoint var4;
+ for(var4 = var2; var4.previous != null; var4 = var4.previous) {
+ ++var3;
+ }
+
+ PathPoint[] var5 = new PathPoint[var3];
+ var4 = var2;
+ --var3;
+
+ for(var5[var3] = var2; var4.previous != null; var5[var3] = var4) {
+ var4 = var4.previous;
+ --var3;
+ }
+
+ return new PathEntity(var5);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/PlayerController.java b/src/main/java/net/minecraft/src/PlayerController.java
new file mode 100644
index 0000000..ea0f00b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/PlayerController.java
@@ -0,0 +1,90 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+
+public class PlayerController {
+ protected final Minecraft mc;
+ public boolean field_1064_b = false;
+
+ public PlayerController(Minecraft var1) {
+ this.mc = var1;
+ }
+
+ public void func_717_a(World var1) {
+ }
+
+ public void clickBlock(int var1, int var2, int var3, int var4) {
+ this.sendBlockRemoved(var1, var2, var3, var4);
+ }
+
+ public boolean sendBlockRemoved(int var1, int var2, int var3, int var4) {
+ this.mc.field_6321_h.func_1186_a(var1, var2, var3);
+ World var5 = this.mc.theWorld;
+ Block var6 = Block.blocksList[var5.getBlockId(var1, var2, var3)];
+ int var7 = var5.getBlockMetadata(var1, var2, var3);
+ boolean var8 = var5.setBlockWithNotify(var1, var2, var3, 0);
+ if(var6 != null && var8) {
+ var6.onBlockDestroyedByPlayer(var5, var1, var2, var3, var7);
+ }
+
+ return var8;
+ }
+
+ public void sendBlockRemoving(int var1, int var2, int var3, int var4) {
+ }
+
+ public void func_6468_a() {
+ }
+
+ public void func_6467_a(float var1) {
+ }
+
+ public float getBlockReachDistance() {
+ return 5.0F;
+ }
+
+ public boolean sendUseItem(EntityPlayer var1, World var2, ItemStack var3) {
+ int var4 = var3.stackSize;
+ ItemStack var5 = var3.useItemRightClick(var2, var1);
+ if(var5 != var3 || var5 != null && var5.stackSize != var4) {
+ var1.inventory.mainInventory[var1.inventory.currentItem] = var5;
+ if(var5.stackSize == 0) {
+ var1.inventory.mainInventory[var1.inventory.currentItem] = null;
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void flipPlayer(EntityPlayer var1) {
+ }
+
+ public void func_6474_c() {
+ }
+
+ public boolean func_6469_d() {
+ return true;
+ }
+
+ public void func_6473_b(EntityPlayer var1) {
+ }
+
+ public boolean sendPlaceBlock(EntityPlayer var1, World var2, ItemStack var3, int var4, int var5, int var6, int var7) {
+ int var8 = var2.getBlockId(var4, var5, var6);
+ return var8 > 0 && Block.blocksList[var8].blockActivated(var2, var4, var5, var6, var1) ? true : (var3 == null ? false : var3.useItem(var1, var2, var4, var5, var6, var7));
+ }
+
+ public EntityPlayer func_4087_b(World var1) {
+ return new EntityPlayerSP(this.mc, var1, this.mc.field_6320_i, var1.worldProvider.field_4218_e);
+ }
+
+ public void func_6475_a(EntityPlayer var1, Entity var2) {
+ var1.func_6415_a_(var2);
+ }
+
+ public void func_6472_b(EntityPlayer var1, Entity var2) {
+ var1.attackTargetEntityWithCurrentItem(var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/PlayerControllerSP.java b/src/main/java/net/minecraft/src/PlayerControllerSP.java
new file mode 100644
index 0000000..16d31a0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/PlayerControllerSP.java
@@ -0,0 +1,116 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+
+public class PlayerControllerSP extends PlayerController {
+ private int field_1074_c = -1;
+ private int field_1073_d = -1;
+ private int field_1072_e = -1;
+ private float field_1071_f = 0.0F;
+ private float field_1070_g = 0.0F;
+ private float field_1069_h = 0.0F;
+ private int field_1068_i = 0;
+
+ public PlayerControllerSP(Minecraft var1) {
+ super(var1);
+ }
+
+ public void flipPlayer(EntityPlayer var1) {
+ var1.rotationYaw = -180.0F;
+ }
+
+ public boolean sendBlockRemoved(int var1, int var2, int var3, int var4) {
+ int var5 = this.mc.theWorld.getBlockId(var1, var2, var3);
+ int var6 = this.mc.theWorld.getBlockMetadata(var1, var2, var3);
+ boolean var7 = super.sendBlockRemoved(var1, var2, var3, var4);
+ ItemStack var8 = this.mc.thePlayer.getCurrentEquippedItem();
+ boolean var9 = this.mc.thePlayer.canHarvestBlock(Block.blocksList[var5]);
+ if(var8 != null) {
+ var8.hitBlock(var5, var1, var2, var3);
+ if(var8.stackSize == 0) {
+ var8.func_1097_a(this.mc.thePlayer);
+ this.mc.thePlayer.destroyCurrentEquippedItem();
+ }
+ }
+
+ if(var7 && var9) {
+ Block.blocksList[var5].harvestBlock(this.mc.theWorld, var1, var2, var3, var6);
+ }
+
+ return var7;
+ }
+
+ public void clickBlock(int var1, int var2, int var3, int var4) {
+ int var5 = this.mc.theWorld.getBlockId(var1, var2, var3);
+ if(var5 > 0 && this.field_1071_f == 0.0F) {
+ Block.blocksList[var5].onBlockClicked(this.mc.theWorld, var1, var2, var3, this.mc.thePlayer);
+ }
+
+ if(var5 > 0 && Block.blocksList[var5].func_225_a(this.mc.thePlayer) >= 1.0F) {
+ this.sendBlockRemoved(var1, var2, var3, var4);
+ }
+
+ }
+
+ public void func_6468_a() {
+ this.field_1071_f = 0.0F;
+ this.field_1068_i = 0;
+ }
+
+ public void sendBlockRemoving(int var1, int var2, int var3, int var4) {
+ if(this.field_1068_i > 0) {
+ --this.field_1068_i;
+ } else {
+ if(var1 == this.field_1074_c && var2 == this.field_1073_d && var3 == this.field_1072_e) {
+ int var5 = this.mc.theWorld.getBlockId(var1, var2, var3);
+ if(var5 == 0) {
+ return;
+ }
+
+ Block var6 = Block.blocksList[var5];
+ this.field_1071_f += var6.func_225_a(this.mc.thePlayer);
+
+ ++this.field_1069_h;
+ if(this.field_1071_f >= 1.0F) {
+ this.sendBlockRemoved(var1, var2, var3, var4);
+ this.field_1071_f = 0.0F;
+ this.field_1070_g = 0.0F;
+ this.field_1069_h = 0.0F;
+ this.field_1068_i = 5;
+ }
+ } else {
+ this.field_1071_f = 0.0F;
+ this.field_1070_g = 0.0F;
+ this.field_1069_h = 0.0F;
+ this.field_1074_c = var1;
+ this.field_1073_d = var2;
+ this.field_1072_e = var3;
+ }
+
+ }
+ }
+
+ public void func_6467_a(float var1) {
+ if(this.field_1071_f <= 0.0F) {
+ this.mc.ingameGUI.field_6446_b = 0.0F;
+ this.mc.field_6323_f.field_1450_i = 0.0F;
+ } else {
+ float var2 = this.field_1070_g + (this.field_1071_f - this.field_1070_g) * var1;
+ this.mc.ingameGUI.field_6446_b = var2;
+ this.mc.field_6323_f.field_1450_i = var2;
+ }
+
+ }
+
+ public float getBlockReachDistance() {
+ return 4.0F;
+ }
+
+ public void func_717_a(World var1) {
+ super.func_717_a(var1);
+ }
+
+ public void func_6474_c() {
+ this.field_1070_g = this.field_1071_f;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/PlayerControllerTest.java b/src/main/java/net/minecraft/src/PlayerControllerTest.java
new file mode 100644
index 0000000..f731076
--- /dev/null
+++ b/src/main/java/net/minecraft/src/PlayerControllerTest.java
@@ -0,0 +1,32 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+
+public class PlayerControllerTest extends PlayerController {
+ public PlayerControllerTest(Minecraft var1) {
+ super(var1);
+ this.field_1064_b = true;
+ }
+
+ public void func_6473_b(EntityPlayer var1) {
+ for(int var2 = 0; var2 < 9; ++var2) {
+ if(var1.inventory.mainInventory[var2] == null) {
+ this.mc.thePlayer.inventory.mainInventory[var2] = new ItemStack(((Block)Session.registeredBlocksList.get(var2)).blockID);
+ } else {
+ this.mc.thePlayer.inventory.mainInventory[var2].stackSize = 1;
+ }
+ }
+
+ }
+
+ public boolean func_6469_d() {
+ return false;
+ }
+
+ public void func_717_a(World var1) {
+ super.func_717_a(var1);
+ }
+
+ public void func_6474_c() {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/PositionTexureVertex.java b/src/main/java/net/minecraft/src/PositionTexureVertex.java
new file mode 100644
index 0000000..381f550
--- /dev/null
+++ b/src/main/java/net/minecraft/src/PositionTexureVertex.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+public class PositionTexureVertex {
+ public Vec3D vector3D;
+ public float texturePositionX;
+ public float texturePositionY;
+
+ public PositionTexureVertex(float var1, float var2, float var3, float var4, float var5) {
+ this(Vec3D.createVectorHelper((double)var1, (double)var2, (double)var3), var4, var5);
+ }
+
+ public PositionTexureVertex setTexturePosition(float var1, float var2) {
+ return new PositionTexureVertex(this, var1, var2);
+ }
+
+ public PositionTexureVertex(PositionTexureVertex var1, float var2, float var3) {
+ this.vector3D = var1.vector3D;
+ this.texturePositionX = var2;
+ this.texturePositionY = var3;
+ }
+
+ public PositionTexureVertex(Vec3D var1, float var2, float var3) {
+ this.vector3D = var1;
+ this.texturePositionX = var2;
+ this.texturePositionY = var3;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RecipeSorter.java b/src/main/java/net/minecraft/src/RecipeSorter.java
new file mode 100644
index 0000000..c5f3f52
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RecipeSorter.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+import java.util.Comparator;
+
+class RecipeSorter implements Comparator {
+ final CraftingManager field_1557_a;
+
+ RecipeSorter(CraftingManager var1) {
+ this.field_1557_a = var1;
+ }
+
+ public int a(CraftingRecipe var1, CraftingRecipe var2) {
+ return var2.getRecipeSize() < var1.getRecipeSize() ? -1 : (var2.getRecipeSize() > var1.getRecipeSize() ? 1 : 0);
+ }
+
+ public int compare(Object var1, Object var2) {
+ return this.a((CraftingRecipe)var1, (CraftingRecipe)var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RecipesArmor.java b/src/main/java/net/minecraft/src/RecipesArmor.java
new file mode 100644
index 0000000..f461301
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RecipesArmor.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class RecipesArmor {
+ private String[][] field_1681_a = new String[][]{{"XXX", "X X"}, {"X X", "XXX", "XXX"}, {"XXX", "X X", "X X"}, {"X X", "X X"}};
+ private Object[][] field_1680_b = new Object[][]{{Item.leather, Block.fire, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.helmetLeather, Item.helmetChain, Item.helmetSteel, Item.helmetDiamond, Item.helmetGold}, {Item.plateLeather, Item.plateChain, Item.plateSteel, Item.plateDiamond, Item.plateGold}, {Item.legsLeather, Item.legsChain, Item.legsSteel, Item.legsDiamond, Item.legsGold}, {Item.bootsLeather, Item.bootsChain, Item.bootsSteel, Item.bootsDiamond, Item.bootsGold}};
+
+ public void func_1148_a(CraftingManager var1) {
+ for(int var2 = 0; var2 < this.field_1680_b[0].length; ++var2) {
+ Object var3 = this.field_1680_b[0][var2];
+
+ for(int var4 = 0; var4 < this.field_1680_b.length - 1; ++var4) {
+ Item var5 = (Item)this.field_1680_b[var4 + 1][var2];
+ var1.addRecipe(new ItemStack(var5), new Object[]{this.field_1681_a[var4], Character.valueOf('X'), var3});
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RecipesCrafting.java b/src/main/java/net/minecraft/src/RecipesCrafting.java
new file mode 100644
index 0000000..a2e08d2
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RecipesCrafting.java
@@ -0,0 +1,9 @@
+package net.minecraft.src;
+
+public class RecipesCrafting {
+ public void func_1051_a(CraftingManager var1) {
+ var1.addRecipe(new ItemStack(Block.crate), new Object[]{"###", "# #", "###", Character.valueOf('#'), Block.planks});
+ var1.addRecipe(new ItemStack(Block.stoneOvenIdle), new Object[]{"###", "# #", "###", Character.valueOf('#'), Block.cobblestone});
+ var1.addRecipe(new ItemStack(Block.workbench), new Object[]{"##", "##", Character.valueOf('#'), Block.planks});
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RecipesFood.java b/src/main/java/net/minecraft/src/RecipesFood.java
new file mode 100644
index 0000000..2dedf59
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RecipesFood.java
@@ -0,0 +1,8 @@
+package net.minecraft.src;
+
+public class RecipesFood {
+ public void func_976_a(CraftingManager var1) {
+ var1.addRecipe(new ItemStack(Item.bowlSoup), new Object[]{"Y", "X", "#", Character.valueOf('X'), Block.mushroomBrown, Character.valueOf('Y'), Block.mushroomRed, Character.valueOf('#'), Item.bowlEmpty});
+ var1.addRecipe(new ItemStack(Item.bowlSoup), new Object[]{"Y", "X", "#", Character.valueOf('X'), Block.mushroomRed, Character.valueOf('Y'), Block.mushroomBrown, Character.valueOf('#'), Item.bowlEmpty});
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RecipesIngots.java b/src/main/java/net/minecraft/src/RecipesIngots.java
new file mode 100644
index 0000000..3add041
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RecipesIngots.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+public class RecipesIngots {
+ private Object[][] field_1198_a = new Object[][]{{Block.blockGold, Item.ingotGold}, {Block.blockSteel, Item.ingotIron}, {Block.blockDiamond, Item.diamond}};
+
+ public void func_810_a(CraftingManager var1) {
+ for(int var2 = 0; var2 < this.field_1198_a.length; ++var2) {
+ Block var3 = (Block)this.field_1198_a[var2][0];
+ Item var4 = (Item)this.field_1198_a[var2][1];
+ var1.addRecipe(new ItemStack(var3), new Object[]{"###", "###", "###", Character.valueOf('#'), var4});
+ var1.addRecipe(new ItemStack(var4, 9), new Object[]{"#", Character.valueOf('#'), var3});
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RecipesTools.java b/src/main/java/net/minecraft/src/RecipesTools.java
new file mode 100644
index 0000000..773706b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RecipesTools.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+public class RecipesTools {
+ private String[][] field_1665_a = new String[][]{{"XXX", " # ", " # "}, {"X", "#", "#"}, {"XX", "X#", " #"}, {"XX", " #", " #"}};
+ private Object[][] field_1664_b = new Object[][]{{Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.pickaxeWood, Item.pickaxeStone, Item.pickaxeSteel, Item.pickaxeDiamond, Item.pickaxeGold}, {Item.shovelWood, Item.shovelStone, Item.shovelSteel, Item.shovelDiamond, Item.shovelGold}, {Item.axeWood, Item.axeStone, Item.axeSteel, Item.axeDiamond, Item.axeGold}, {Item.hoeWood, Item.hoeStone, Item.hoeSteel, Item.hoeDiamond, Item.hoeGold}};
+
+ public void func_1122_a(CraftingManager var1) {
+ for(int var2 = 0; var2 < this.field_1664_b[0].length; ++var2) {
+ Object var3 = this.field_1664_b[0][var2];
+
+ for(int var4 = 0; var4 < this.field_1664_b.length - 1; ++var4) {
+ Item var5 = (Item)this.field_1664_b[var4 + 1][var2];
+ var1.addRecipe(new ItemStack(var5), new Object[]{this.field_1665_a[var4], Character.valueOf('#'), Item.stick, Character.valueOf('X'), var3});
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RecipesWeapons.java b/src/main/java/net/minecraft/src/RecipesWeapons.java
new file mode 100644
index 0000000..e2a6bd7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RecipesWeapons.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+public class RecipesWeapons {
+ private String[][] field_1100_a = new String[][]{{"X", "X", "#"}};
+ private Object[][] field_1099_b = new Object[][]{{Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold}, {Item.swordWood, Item.swordStone, Item.swordSteel, Item.swordDiamond, Item.swordGold}};
+
+ public void func_766_a(CraftingManager var1) {
+ for(int var2 = 0; var2 < this.field_1099_b[0].length; ++var2) {
+ Object var3 = this.field_1099_b[0][var2];
+
+ for(int var4 = 0; var4 < this.field_1099_b.length - 1; ++var4) {
+ Item var5 = (Item)this.field_1099_b[var4 + 1][var2];
+ var1.addRecipe(new ItemStack(var5), new Object[]{this.field_1100_a[var4], Character.valueOf('#'), Item.stick, Character.valueOf('X'), var3});
+ }
+ }
+
+ var1.addRecipe(new ItemStack(Item.bow, 1), new Object[]{" #X", "# X", " #X", Character.valueOf('X'), Item.silk, Character.valueOf('#'), Item.stick});
+ var1.addRecipe(new ItemStack(Item.arrow, 4), new Object[]{"X", "#", "Y", Character.valueOf('Y'), Item.feather, Character.valueOf('X'), Item.flint, Character.valueOf('#'), Item.stick});
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RedstoneUpdateInfo.java b/src/main/java/net/minecraft/src/RedstoneUpdateInfo.java
new file mode 100644
index 0000000..b987ecb
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RedstoneUpdateInfo.java
@@ -0,0 +1,15 @@
+package net.minecraft.src;
+
+class RedstoneUpdateInfo {
+ int x;
+ int y;
+ int z;
+ long updateTime;
+
+ public RedstoneUpdateInfo(int var1, int var2, int var3, long var4) {
+ this.x = var1;
+ this.y = var2;
+ this.z = var3;
+ this.updateTime = var4;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Render.java b/src/main/java/net/minecraft/src/Render.java
new file mode 100644
index 0000000..71f9dea
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Render.java
@@ -0,0 +1,228 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public abstract class Render {
+ protected RenderManager renderManager;
+ private ModelBase unusedModelBiped = new ModelBiped();
+ private RenderBlocks unusedRenderBlocks = new RenderBlocks();
+ protected float field_9246_c = 0.0F;
+ protected float field_194_c = 1.0F;
+
+ public abstract void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9);
+
+ protected void loadTexture(String var1) {
+ RenderEngine var2 = this.renderManager.renderEngine;
+ var2.bindTexture(var2.getTexture(var1));
+ }
+
+ protected void func_140_a(String var1, String var2) {
+ RenderEngine var3 = this.renderManager.renderEngine;
+ var3.bindTexture(var3.getTextureForDownloadableImage(var1, var2));
+ }
+
+ private void renderEntityOnFire(Entity var1, double var2, double var4, double var6, float var8) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ int var9 = Block.fire.blockIndexInTexture;
+ int var10 = (var9 & 15) << 4;
+ int var11 = var9 & 240;
+ float var12 = (float)var10 / 256.0F;
+ float var13 = ((float)var10 + 15.99F) / 256.0F;
+ float var14 = (float)var11 / 256.0F;
+ float var15 = ((float)var11 + 15.99F) / 256.0F;
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ float var16 = var1.width * 1.4F;
+ GL11.glScalef(var16, var16, var16);
+ this.loadTexture("/terrain.png");
+ Tessellator var17 = Tessellator.instance;
+ float var18 = 1.0F;
+ float var19 = 0.5F;
+ float var20 = 0.0F;
+ float var21 = var1.height / var1.width;
+ GL11.glRotatef(-this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(0.0F, 0.0F, -0.4F + (float)((int)var21) * 0.02F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ var17.startDrawingQuads();
+
+ while(var21 > 0.0F) {
+ var17.addVertexWithUV((double)(var18 - var19), (double)(0.0F - var20), 0.0D, (double)var13, (double)var15);
+ var17.addVertexWithUV((double)(0.0F - var19), (double)(0.0F - var20), 0.0D, (double)var12, (double)var15);
+ var17.addVertexWithUV((double)(0.0F - var19), (double)(1.4F - var20), 0.0D, (double)var12, (double)var14);
+ var17.addVertexWithUV((double)(var18 - var19), (double)(1.4F - var20), 0.0D, (double)var13, (double)var14);
+ --var21;
+ --var20;
+ var18 *= 0.9F;
+ GL11.glTranslatef(0.0F, 0.0F, -0.04F);
+ }
+
+ var17.draw();
+ GL11.glPopMatrix();
+ GL11.glEnable(GL11.GL_LIGHTING);
+ }
+
+ private void renderShadow(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ RenderEngine var10 = this.renderManager.renderEngine;
+ var10.bindTexture(var10.getTexture("%clamp%/misc/shadow.png"));
+ World var11 = this.getWorldFromRenderManager();
+ GL11.glDepthMask(false);
+ float var12 = this.field_9246_c;
+ double var13 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var9;
+ double var15 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var9 + (double)var1.func_392_h_();
+ double var17 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var9;
+ int var19 = MathHelper.floor_double(var13 - (double)var12);
+ int var20 = MathHelper.floor_double(var13 + (double)var12);
+ int var21 = MathHelper.floor_double(var15 - (double)var12);
+ int var22 = MathHelper.floor_double(var15);
+ int var23 = MathHelper.floor_double(var17 - (double)var12);
+ int var24 = MathHelper.floor_double(var17 + (double)var12);
+ double var25 = var2 - var13;
+ double var27 = var4 - var15;
+ double var29 = var6 - var17;
+ Tessellator var31 = Tessellator.instance;
+ var31.startDrawingQuads();
+
+ for(int var32 = var19; var32 <= var20; ++var32) {
+ for(int var33 = var21; var33 <= var22; ++var33) {
+ for(int var34 = var23; var34 <= var24; ++var34) {
+ int var35 = var11.getBlockId(var32, var33 - 1, var34);
+ if(var35 > 0 && var11.getBlockLightValue(var32, var33, var34) > 3) {
+ this.renderShadowOnBlock(Block.blocksList[var35], var2, var4 + (double)var1.func_392_h_(), var6, var32, var33, var34, var8, var12, var25, var27 + (double)var1.func_392_h_(), var29);
+ }
+ }
+ }
+ }
+
+ var31.draw();
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDepthMask(true);
+ }
+
+ private World getWorldFromRenderManager() {
+ return this.renderManager.worldObj;
+ }
+
+ private void renderShadowOnBlock(Block var1, double var2, double var4, double var6, int var8, int var9, int var10, float var11, float var12, double var13, double var15, double var17) {
+ Tessellator var19 = Tessellator.instance;
+ if(var1.renderAsNormalBlock()) {
+ double var20 = ((double)var11 - (var4 - ((double)var9 + var15)) / 2.0D) * 0.5D * (double)this.getWorldFromRenderManager().getLightBrightness(var8, var9, var10);
+ if(var20 >= 0.0D) {
+ if(var20 > 1.0D) {
+ var20 = 1.0D;
+ }
+
+ var19.setColorRGBA_F(1.0F, 1.0F, 1.0F, (float)var20);
+ double var22 = (double)var8 + var1.field_370_bf + var13;
+ double var24 = (double)var8 + var1.maxX + var13;
+ double var26 = (double)var9 + var1.minY + var15 + 1.0D / 64.0D;
+ double var28 = (double)var10 + var1.minZ + var17;
+ double var30 = (double)var10 + var1.maxZ + var17;
+ float var32 = (float)((var2 - var22) / 2.0D / (double)var12 + 0.5D);
+ float var33 = (float)((var2 - var24) / 2.0D / (double)var12 + 0.5D);
+ float var34 = (float)((var6 - var28) / 2.0D / (double)var12 + 0.5D);
+ float var35 = (float)((var6 - var30) / 2.0D / (double)var12 + 0.5D);
+ var19.addVertexWithUV(var22, var26, var28, (double)var32, (double)var34);
+ var19.addVertexWithUV(var22, var26, var30, (double)var32, (double)var35);
+ var19.addVertexWithUV(var24, var26, var30, (double)var33, (double)var35);
+ var19.addVertexWithUV(var24, var26, var28, (double)var33, (double)var34);
+ }
+ }
+ }
+
+ public static void renderOffsetAABB(AxisAlignedBB var0, double var1, double var3, double var5) {
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ Tessellator var7 = Tessellator.instance;
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ var7.startDrawingQuads();
+ var7.setTranslationD(var1, var3, var5);
+ var7.setNormal(0.0F, 0.0F, -1.0F);
+ var7.addVertex(var0.minX, var0.maxY, var0.minZ);
+ var7.addVertex(var0.maxX, var0.maxY, var0.minZ);
+ var7.addVertex(var0.maxX, var0.minY, var0.minZ);
+ var7.addVertex(var0.minX, var0.minY, var0.minZ);
+ var7.setNormal(0.0F, 0.0F, 1.0F);
+ var7.addVertex(var0.minX, var0.minY, var0.maxZ);
+ var7.addVertex(var0.maxX, var0.minY, var0.maxZ);
+ var7.addVertex(var0.maxX, var0.maxY, var0.maxZ);
+ var7.addVertex(var0.minX, var0.maxY, var0.maxZ);
+ var7.setNormal(0.0F, -1.0F, 0.0F);
+ var7.addVertex(var0.minX, var0.minY, var0.minZ);
+ var7.addVertex(var0.maxX, var0.minY, var0.minZ);
+ var7.addVertex(var0.maxX, var0.minY, var0.maxZ);
+ var7.addVertex(var0.minX, var0.minY, var0.maxZ);
+ var7.setNormal(0.0F, 1.0F, 0.0F);
+ var7.addVertex(var0.minX, var0.maxY, var0.maxZ);
+ var7.addVertex(var0.maxX, var0.maxY, var0.maxZ);
+ var7.addVertex(var0.maxX, var0.maxY, var0.minZ);
+ var7.addVertex(var0.minX, var0.maxY, var0.minZ);
+ var7.setNormal(-1.0F, 0.0F, 0.0F);
+ var7.addVertex(var0.minX, var0.minY, var0.maxZ);
+ var7.addVertex(var0.minX, var0.maxY, var0.maxZ);
+ var7.addVertex(var0.minX, var0.maxY, var0.minZ);
+ var7.addVertex(var0.minX, var0.minY, var0.minZ);
+ var7.setNormal(1.0F, 0.0F, 0.0F);
+ var7.addVertex(var0.maxX, var0.minY, var0.minZ);
+ var7.addVertex(var0.maxX, var0.maxY, var0.minZ);
+ var7.addVertex(var0.maxX, var0.maxY, var0.maxZ);
+ var7.addVertex(var0.maxX, var0.minY, var0.maxZ);
+ var7.setTranslationD(0.0D, 0.0D, 0.0D);
+ var7.draw();
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ public static void renderAABB(AxisAlignedBB var0) {
+ Tessellator var1 = Tessellator.instance;
+ var1.startDrawingQuads();
+ var1.addVertex(var0.minX, var0.maxY, var0.minZ);
+ var1.addVertex(var0.maxX, var0.maxY, var0.minZ);
+ var1.addVertex(var0.maxX, var0.minY, var0.minZ);
+ var1.addVertex(var0.minX, var0.minY, var0.minZ);
+ var1.addVertex(var0.minX, var0.minY, var0.maxZ);
+ var1.addVertex(var0.maxX, var0.minY, var0.maxZ);
+ var1.addVertex(var0.maxX, var0.maxY, var0.maxZ);
+ var1.addVertex(var0.minX, var0.maxY, var0.maxZ);
+ var1.addVertex(var0.minX, var0.minY, var0.minZ);
+ var1.addVertex(var0.maxX, var0.minY, var0.minZ);
+ var1.addVertex(var0.maxX, var0.minY, var0.maxZ);
+ var1.addVertex(var0.minX, var0.minY, var0.maxZ);
+ var1.addVertex(var0.minX, var0.maxY, var0.maxZ);
+ var1.addVertex(var0.maxX, var0.maxY, var0.maxZ);
+ var1.addVertex(var0.maxX, var0.maxY, var0.minZ);
+ var1.addVertex(var0.minX, var0.maxY, var0.minZ);
+ var1.addVertex(var0.minX, var0.minY, var0.maxZ);
+ var1.addVertex(var0.minX, var0.maxY, var0.maxZ);
+ var1.addVertex(var0.minX, var0.maxY, var0.minZ);
+ var1.addVertex(var0.minX, var0.minY, var0.minZ);
+ var1.addVertex(var0.maxX, var0.minY, var0.minZ);
+ var1.addVertex(var0.maxX, var0.maxY, var0.minZ);
+ var1.addVertex(var0.maxX, var0.maxY, var0.maxZ);
+ var1.addVertex(var0.maxX, var0.minY, var0.maxZ);
+ var1.draw();
+ }
+
+ public void setRenderManager(RenderManager var1) {
+ this.renderManager = var1;
+ }
+
+ public void doRenderShadowAndFire(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ if(this.renderManager.options.fancyGraphics && this.field_9246_c > 0.0F) {
+ double var10 = this.renderManager.func_851_a(var1.posX, var1.posY, var1.posZ);
+ float var12 = (float)((1.0D - var10 / 256.0D) * (double)this.field_194_c);
+ if(var12 > 0.0F) {
+ this.renderShadow(var1, var2, var4, var6, var12, var9);
+ }
+ }
+
+ if(var1.fire > 0 || var1.field_9299_bv) {
+ this.renderEntityOnFire(var1, var2, var4, var6, var9);
+ }
+
+ }
+
+ public FontRenderer getFontRendererFromRenderManager() {
+ return this.renderManager.getFontRenderer();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderArrow.java b/src/main/java/net/minecraft/src/RenderArrow.java
new file mode 100644
index 0000000..6a50043
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderArrow.java
@@ -0,0 +1,67 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class RenderArrow extends Render {
+ public void a(EntityArrow var1, double var2, double var4, double var6, float var8, float var9) {
+ this.loadTexture("/item/arrows.png");
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ GL11.glRotatef(var1.prevRotationYaw + (var1.rotationYaw - var1.prevRotationYaw) * var9 - 90.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(var1.prevRotationPitch + (var1.rotationPitch - var1.prevRotationPitch) * var9, 0.0F, 0.0F, 1.0F);
+ Tessellator var10 = Tessellator.instance;
+ byte var11 = 0;
+ float var12 = 0.0F;
+ float var13 = 0.5F;
+ float var14 = (float)(0 + var11 * 10) / 32.0F;
+ float var15 = (float)(5 + var11 * 10) / 32.0F;
+ float var16 = 0.0F;
+ float var17 = 0.15625F;
+ float var18 = (float)(5 + var11 * 10) / 32.0F;
+ float var19 = (float)(10 + var11 * 10) / 32.0F;
+ float var20 = 0.05625F;
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ float var21 = (float)var1.arrowShake - var9;
+ if(var21 > 0.0F) {
+ float var22 = -MathHelper.sin(var21 * 3.0F) * var21;
+ GL11.glRotatef(var22, 0.0F, 0.0F, 1.0F);
+ }
+
+ GL11.glRotatef(45.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glScalef(var20, var20, var20);
+ GL11.glTranslatef(-4.0F, 0.0F, 0.0F);
+ GL11.glNormal3f(var20, 0.0F, 0.0F);
+ var10.startDrawingQuads();
+ var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)var16, (double)var18);
+ var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)var17, (double)var18);
+ var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)var17, (double)var19);
+ var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)var16, (double)var19);
+ var10.draw();
+ GL11.glNormal3f(-var20, 0.0F, 0.0F);
+ var10.startDrawingQuads();
+ var10.addVertexWithUV(-7.0D, 2.0D, -2.0D, (double)var16, (double)var18);
+ var10.addVertexWithUV(-7.0D, 2.0D, 2.0D, (double)var17, (double)var18);
+ var10.addVertexWithUV(-7.0D, -2.0D, 2.0D, (double)var17, (double)var19);
+ var10.addVertexWithUV(-7.0D, -2.0D, -2.0D, (double)var16, (double)var19);
+ var10.draw();
+
+ for(int var23 = 0; var23 < 4; ++var23) {
+ GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glNormal3f(0.0F, 0.0F, var20);
+ var10.startDrawingQuads();
+ var10.addVertexWithUV(-8.0D, -2.0D, 0.0D, (double)var12, (double)var14);
+ var10.addVertexWithUV(8.0D, -2.0D, 0.0D, (double)var13, (double)var14);
+ var10.addVertexWithUV(8.0D, 2.0D, 0.0D, (double)var13, (double)var15);
+ var10.addVertexWithUV(-8.0D, 2.0D, 0.0D, (double)var12, (double)var15);
+ var10.draw();
+ }
+
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityArrow)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderBiped.java b/src/main/java/net/minecraft/src/RenderBiped.java
new file mode 100644
index 0000000..9e9ec8e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderBiped.java
@@ -0,0 +1,47 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderBiped extends RenderLiving {
+ protected ModelBiped field_4013_a;
+
+ public RenderBiped(ModelBiped var1, float var2) {
+ super(var1, var2);
+ this.field_4013_a = var1;
+ }
+
+ protected void func_6331_b(EntityLiving var1, float var2) {
+ ItemStack var3 = var1.getHeldItem();
+ if(var3 != null) {
+ GL11.glPushMatrix();
+ this.field_4013_a.bipedRightArm.func_926_b(1.0F / 16.0F);
+ GL11.glTranslatef(-(1.0F / 16.0F), 7.0F / 16.0F, 1.0F / 16.0F);
+ float var4;
+ if(var3.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var3.itemID].getRenderType())) {
+ var4 = 0.5F;
+ GL11.glTranslatef(0.0F, 3.0F / 16.0F, -(5.0F / 16.0F));
+ var4 *= 12.0F / 16.0F;
+ GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glScalef(var4, -var4, var4);
+ } else if(Item.itemsList[var3.itemID].isFull3D()) {
+ var4 = 10.0F / 16.0F;
+ GL11.glTranslatef(0.0F, 3.0F / 16.0F, 0.0F);
+ GL11.glScalef(var4, -var4, var4);
+ GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
+ } else {
+ var4 = 6.0F / 16.0F;
+ GL11.glTranslatef(0.25F, 3.0F / 16.0F, -(3.0F / 16.0F));
+ GL11.glScalef(var4, var4, var4);
+ GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F);
+ }
+
+ this.renderManager.field_4236_f.renderItem(var3);
+ GL11.glPopMatrix();
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderBlocks.java b/src/main/java/net/minecraft/src/RenderBlocks.java
new file mode 100644
index 0000000..8e33f94
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderBlocks.java
@@ -0,0 +1,1908 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderBlocks {
+ private IBlockAccess blockAccess;
+ private int overrideBlockTexture = -1;
+ private boolean flipTexture = false;
+ private boolean renderAllFaces = false;
+
+ public RenderBlocks(IBlockAccess var1) {
+ this.blockAccess = var1;
+ }
+
+ public RenderBlocks() {
+ }
+
+ public void renderBlockUsingTexture(Block var1, int var2, int var3, int var4, int var5) {
+ this.overrideBlockTexture = var5;
+ this.renderBlockByRenderType(var1, var2, var3, var4);
+ this.overrideBlockTexture = -1;
+ }
+
+ public boolean renderBlockByRenderType(Block var1, int var2, int var3, int var4) {
+ int var5 = var1.getRenderType();
+ var1.setBlockBoundsBasedOnState(this.blockAccess, var2, var3, var4);
+ return var5 == 0 ? this.renderStandardBlock(var1, var2, var3, var4) : (var5 == 4 ? this.renderBlockFluids(var1, var2, var3, var4) : (var5 == 13 ? this.renderBlockCactus(var1, var2, var3, var4) : (var5 == 1 ? this.renderBlockReed(var1, var2, var3, var4) : (var5 == 6 ? this.renderBlockCrops(var1, var2, var3, var4) : (var5 == 2 ? this.renderBlockTorch(var1, var2, var3, var4) : (var5 == 3 ? this.renderBlockFire(var1, var2, var3, var4) : (var5 == 5 ? this.renderBlockRedstoneWire(var1, var2, var3, var4) : (var5 == 8 ? this.renderBlockLadder(var1, var2, var3, var4) : (var5 == 7 ? this.renderBlockDoor(var1, var2, var3, var4) : (var5 == 9 ? this.renderBlockMinecartTrack(var1, var2, var3, var4) : (var5 == 10 ? this.renderBlockStairs(var1, var2, var3, var4) : (var5 == 11 ? this.renderBlockFence(var1, var2, var3, var4) : (var5 == 12 ? this.renderBlockLever(var1, var2, var3, var4) : false)))))))))))));
+ }
+
+ public boolean renderBlockTorch(Block var1, int var2, int var3, int var4) {
+ int var5 = this.blockAccess.getBlockMetadata(var2, var3, var4);
+ Tessellator var6 = Tessellator.instance;
+ float var7 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ if(Block.lightValue[var1.blockID] > 0) {
+ var7 = 1.0F;
+ }
+
+ var6.setColorOpaque_F(var7, var7, var7);
+ double var8 = (double)0.4F;
+ double var10 = 0.5D - var8;
+ double var12 = (double)0.2F;
+ if(var5 == 1) {
+ this.renderTorchAtAngle(var1, (double)var2 - var10, (double)var3 + var12, (double)var4, -var8, 0.0D);
+ } else if(var5 == 2) {
+ this.renderTorchAtAngle(var1, (double)var2 + var10, (double)var3 + var12, (double)var4, var8, 0.0D);
+ } else if(var5 == 3) {
+ this.renderTorchAtAngle(var1, (double)var2, (double)var3 + var12, (double)var4 - var10, 0.0D, -var8);
+ } else if(var5 == 4) {
+ this.renderTorchAtAngle(var1, (double)var2, (double)var3 + var12, (double)var4 + var10, 0.0D, var8);
+ } else {
+ this.renderTorchAtAngle(var1, (double)var2, (double)var3, (double)var4, 0.0D, 0.0D);
+ }
+
+ return true;
+ }
+
+ public boolean renderBlockLever(Block var1, int var2, int var3, int var4) {
+ int var5 = this.blockAccess.getBlockMetadata(var2, var3, var4);
+ int var6 = var5 & 7;
+ boolean var7 = (var5 & 8) > 0;
+ Tessellator var8 = Tessellator.instance;
+ boolean var9 = this.overrideBlockTexture >= 0;
+ if(!var9) {
+ this.overrideBlockTexture = Block.cobblestone.blockIndexInTexture;
+ }
+
+ float var10 = 0.25F;
+ float var11 = 3.0F / 16.0F;
+ float var12 = 3.0F / 16.0F;
+ if(var6 == 5) {
+ var1.setBlockBounds(0.5F - var11, 0.0F, 0.5F - var10, 0.5F + var11, var12, 0.5F + var10);
+ } else if(var6 == 6) {
+ var1.setBlockBounds(0.5F - var10, 0.0F, 0.5F - var11, 0.5F + var10, var12, 0.5F + var11);
+ } else if(var6 == 4) {
+ var1.setBlockBounds(0.5F - var11, 0.5F - var10, 1.0F - var12, 0.5F + var11, 0.5F + var10, 1.0F);
+ } else if(var6 == 3) {
+ var1.setBlockBounds(0.5F - var11, 0.5F - var10, 0.0F, 0.5F + var11, 0.5F + var10, var12);
+ } else if(var6 == 2) {
+ var1.setBlockBounds(1.0F - var12, 0.5F - var10, 0.5F - var11, 1.0F, 0.5F + var10, 0.5F + var11);
+ } else if(var6 == 1) {
+ var1.setBlockBounds(0.0F, 0.5F - var10, 0.5F - var11, var12, 0.5F + var10, 0.5F + var11);
+ }
+
+ this.renderStandardBlock(var1, var2, var3, var4);
+ if(!var9) {
+ this.overrideBlockTexture = -1;
+ }
+
+ float var13 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ if(Block.lightValue[var1.blockID] > 0) {
+ var13 = 1.0F;
+ }
+
+ var8.setColorOpaque_F(var13, var13, var13);
+ int var14 = var1.getBlockTextureFromSide(0);
+ if(this.overrideBlockTexture >= 0) {
+ var14 = this.overrideBlockTexture;
+ }
+
+ int var15 = (var14 & 15) << 4;
+ int var16 = var14 & 240;
+ float var17 = (float)var15 / 256.0F;
+ float var18 = ((float)var15 + 15.99F) / 256.0F;
+ float var19 = (float)var16 / 256.0F;
+ float var20 = ((float)var16 + 15.99F) / 256.0F;
+ Vec3D[] var21 = new Vec3D[8];
+ float var22 = 1.0F / 16.0F;
+ float var23 = 1.0F / 16.0F;
+ float var24 = 10.0F / 16.0F;
+ var21[0] = Vec3D.createVector((double)(-var22), 0.0D, (double)(-var23));
+ var21[1] = Vec3D.createVector((double)var22, 0.0D, (double)(-var23));
+ var21[2] = Vec3D.createVector((double)var22, 0.0D, (double)var23);
+ var21[3] = Vec3D.createVector((double)(-var22), 0.0D, (double)var23);
+ var21[4] = Vec3D.createVector((double)(-var22), (double)var24, (double)(-var23));
+ var21[5] = Vec3D.createVector((double)var22, (double)var24, (double)(-var23));
+ var21[6] = Vec3D.createVector((double)var22, (double)var24, (double)var23);
+ var21[7] = Vec3D.createVector((double)(-var22), (double)var24, (double)var23);
+
+ for(int var25 = 0; var25 < 8; ++var25) {
+ if(var7) {
+ var21[var25].zCoord -= 1.0D / 16.0D;
+ var21[var25].rotateAroundX((float)Math.PI * 2.0F / 9.0F);
+ } else {
+ var21[var25].zCoord += 1.0D / 16.0D;
+ var21[var25].rotateAroundX(-((float)Math.PI * 2.0F / 9.0F));
+ }
+
+ if(var6 == 6) {
+ var21[var25].rotateAroundY((float)Math.PI * 0.5F);
+ }
+
+ if(var6 < 5) {
+ var21[var25].yCoord -= 0.375D;
+ var21[var25].rotateAroundX((float)Math.PI * 0.5F);
+ if(var6 == 4) {
+ var21[var25].rotateAroundY(0.0F);
+ }
+
+ if(var6 == 3) {
+ var21[var25].rotateAroundY((float)Math.PI);
+ }
+
+ if(var6 == 2) {
+ var21[var25].rotateAroundY((float)Math.PI * 0.5F);
+ }
+
+ if(var6 == 1) {
+ var21[var25].rotateAroundY((float)Math.PI * -0.5F);
+ }
+
+ var21[var25].xCoord += (double)var2 + 0.5D;
+ var21[var25].yCoord += (double)((float)var3 + 0.5F);
+ var21[var25].zCoord += (double)var4 + 0.5D;
+ } else {
+ var21[var25].xCoord += (double)var2 + 0.5D;
+ var21[var25].yCoord += (double)((float)var3 + 2.0F / 16.0F);
+ var21[var25].zCoord += (double)var4 + 0.5D;
+ }
+ }
+
+ Vec3D var30 = null;
+ Vec3D var26 = null;
+ Vec3D var27 = null;
+ Vec3D var28 = null;
+
+ for(int var29 = 0; var29 < 6; ++var29) {
+ if(var29 == 0) {
+ var17 = (float)(var15 + 7) / 256.0F;
+ var18 = ((float)(var15 + 9) - 0.01F) / 256.0F;
+ var19 = (float)(var16 + 6) / 256.0F;
+ var20 = ((float)(var16 + 8) - 0.01F) / 256.0F;
+ } else if(var29 == 2) {
+ var17 = (float)(var15 + 7) / 256.0F;
+ var18 = ((float)(var15 + 9) - 0.01F) / 256.0F;
+ var19 = (float)(var16 + 6) / 256.0F;
+ var20 = ((float)(var16 + 16) - 0.01F) / 256.0F;
+ }
+
+ if(var29 == 0) {
+ var30 = var21[0];
+ var26 = var21[1];
+ var27 = var21[2];
+ var28 = var21[3];
+ } else if(var29 == 1) {
+ var30 = var21[7];
+ var26 = var21[6];
+ var27 = var21[5];
+ var28 = var21[4];
+ } else if(var29 == 2) {
+ var30 = var21[1];
+ var26 = var21[0];
+ var27 = var21[4];
+ var28 = var21[5];
+ } else if(var29 == 3) {
+ var30 = var21[2];
+ var26 = var21[1];
+ var27 = var21[5];
+ var28 = var21[6];
+ } else if(var29 == 4) {
+ var30 = var21[3];
+ var26 = var21[2];
+ var27 = var21[6];
+ var28 = var21[7];
+ } else if(var29 == 5) {
+ var30 = var21[0];
+ var26 = var21[3];
+ var27 = var21[7];
+ var28 = var21[4];
+ }
+
+ var8.addVertexWithUV(var30.xCoord, var30.yCoord, var30.zCoord, (double)var17, (double)var20);
+ var8.addVertexWithUV(var26.xCoord, var26.yCoord, var26.zCoord, (double)var18, (double)var20);
+ var8.addVertexWithUV(var27.xCoord, var27.yCoord, var27.zCoord, (double)var18, (double)var19);
+ var8.addVertexWithUV(var28.xCoord, var28.yCoord, var28.zCoord, (double)var17, (double)var19);
+ }
+
+ return true;
+ }
+
+ public boolean renderBlockFire(Block var1, int var2, int var3, int var4) {
+ Tessellator var5 = Tessellator.instance;
+ int var6 = var1.getBlockTextureFromSide(0);
+ if(this.overrideBlockTexture >= 0) {
+ var6 = this.overrideBlockTexture;
+ }
+
+ float var7 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ var5.setColorOpaque_F(var7, var7, var7);
+ int var8 = (var6 & 15) << 4;
+ int var9 = var6 & 240;
+ double var10 = (double)((float)var8 / 256.0F);
+ double var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ double var14 = (double)((float)var9 / 256.0F);
+ double var16 = (double)(((float)var9 + 15.99F) / 256.0F);
+ float var18 = 1.4F;
+ double var21;
+ double var23;
+ double var25;
+ double var27;
+ double var29;
+ double var31;
+ double var33;
+ if(!this.blockAccess.isBlockOpaqueCube(var2, var3 - 1, var4) && !Block.fire.canBlockCatchFire(this.blockAccess, var2, var3 - 1, var4)) {
+ float var37 = 0.2F;
+ float var20 = 1.0F / 16.0F;
+ if((var2 + var3 + var4 & 1) == 1) {
+ var10 = (double)((float)var8 / 256.0F);
+ var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ var14 = (double)((float)(var9 + 16) / 256.0F);
+ var16 = (double)(((float)var9 + 15.99F + 16.0F) / 256.0F);
+ }
+
+ if((var2 / 2 + var3 / 2 + var4 / 2 & 1) == 1) {
+ var21 = var12;
+ var12 = var10;
+ var10 = var21;
+ }
+
+ if(Block.fire.canBlockCatchFire(this.blockAccess, var2 - 1, var3, var4)) {
+ var5.addVertexWithUV((double)((float)var2 + var37), (double)((float)var3 + var18 + var20), (double)(var4 + 1), var12, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1), var12, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV((double)((float)var2 + var37), (double)((float)var3 + var18 + var20), (double)(var4 + 0), var10, var14);
+ var5.addVertexWithUV((double)((float)var2 + var37), (double)((float)var3 + var18 + var20), (double)(var4 + 0), var10, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1), var12, var16);
+ var5.addVertexWithUV((double)((float)var2 + var37), (double)((float)var3 + var18 + var20), (double)(var4 + 1), var12, var14);
+ }
+
+ if(Block.fire.canBlockCatchFire(this.blockAccess, var2 + 1, var3, var4)) {
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var37), (double)((float)var3 + var18 + var20), (double)(var4 + 0), var10, var14);
+ var5.addVertexWithUV((double)(var2 + 1 - 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV((double)(var2 + 1 - 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1), var12, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var37), (double)((float)var3 + var18 + var20), (double)(var4 + 1), var12, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var37), (double)((float)var3 + var18 + var20), (double)(var4 + 1), var12, var14);
+ var5.addVertexWithUV((double)(var2 + 1 - 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1), var12, var16);
+ var5.addVertexWithUV((double)(var2 + 1 - 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var37), (double)((float)var3 + var18 + var20), (double)(var4 + 0), var10, var14);
+ }
+
+ if(Block.fire.canBlockCatchFire(this.blockAccess, var2, var3, var4 - 1)) {
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18 + var20), (double)((float)var4 + var37), var12, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var12, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18 + var20), (double)((float)var4 + var37), var10, var14);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18 + var20), (double)((float)var4 + var37), var10, var14);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 0), var12, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18 + var20), (double)((float)var4 + var37), var12, var14);
+ }
+
+ if(Block.fire.canBlockCatchFire(this.blockAccess, var2, var3, var4 + 1)) {
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18 + var20), (double)((float)(var4 + 1) - var37), var10, var14);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)(var3 + 0) + var20), (double)(var4 + 1 - 0), var10, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1 - 0), var12, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18 + var20), (double)((float)(var4 + 1) - var37), var12, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18 + var20), (double)((float)(var4 + 1) - var37), var12, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)(var3 + 0) + var20), (double)(var4 + 1 - 0), var12, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)(var3 + 0) + var20), (double)(var4 + 1 - 0), var10, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18 + var20), (double)((float)(var4 + 1) - var37), var10, var14);
+ }
+
+ if(Block.fire.canBlockCatchFire(this.blockAccess, var2, var3 + 1, var4)) {
+ var21 = (double)var2 + 0.5D + 0.5D;
+ var23 = (double)var2 + 0.5D - 0.5D;
+ var25 = (double)var4 + 0.5D + 0.5D;
+ var27 = (double)var4 + 0.5D - 0.5D;
+ var29 = (double)var2 + 0.5D - 0.5D;
+ var31 = (double)var2 + 0.5D + 0.5D;
+ var33 = (double)var4 + 0.5D - 0.5D;
+ double var35 = (double)var4 + 0.5D + 0.5D;
+ var10 = (double)((float)var8 / 256.0F);
+ var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ var14 = (double)((float)var9 / 256.0F);
+ var16 = (double)(((float)var9 + 15.99F) / 256.0F);
+ ++var3;
+ var18 = -0.2F;
+ if((var2 + var3 + var4 & 1) == 0) {
+ var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 0), var12, var14);
+ var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 0), var12, var16);
+ var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 1), var10, var16);
+ var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 1), var10, var14);
+ var10 = (double)((float)var8 / 256.0F);
+ var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ var14 = (double)((float)(var9 + 16) / 256.0F);
+ var16 = (double)(((float)var9 + 15.99F + 16.0F) / 256.0F);
+ var5.addVertexWithUV(var31, (double)((float)var3 + var18), (double)(var4 + 1), var12, var14);
+ var5.addVertexWithUV(var23, (double)(var3 + 0), (double)(var4 + 1), var12, var16);
+ var5.addVertexWithUV(var23, (double)(var3 + 0), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV(var31, (double)((float)var3 + var18), (double)(var4 + 0), var10, var14);
+ } else {
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var35, var12, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var27, var12, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var27, var10, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var35, var10, var14);
+ var10 = (double)((float)var8 / 256.0F);
+ var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ var14 = (double)((float)(var9 + 16) / 256.0F);
+ var16 = (double)(((float)var9 + 15.99F + 16.0F) / 256.0F);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var33, var12, var14);
+ var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var25, var12, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var25, var10, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var33, var10, var14);
+ }
+ }
+ } else {
+ double var19 = (double)var2 + 0.5D + 0.2D;
+ var21 = (double)var2 + 0.5D - 0.2D;
+ var23 = (double)var4 + 0.5D + 0.2D;
+ var25 = (double)var4 + 0.5D - 0.2D;
+ var27 = (double)var2 + 0.5D - 0.3D;
+ var29 = (double)var2 + 0.5D + 0.3D;
+ var31 = (double)var4 + 0.5D - 0.3D;
+ var33 = (double)var4 + 0.5D + 0.3D;
+ var5.addVertexWithUV(var27, (double)((float)var3 + var18), (double)(var4 + 1), var12, var14);
+ var5.addVertexWithUV(var19, (double)(var3 + 0), (double)(var4 + 1), var12, var16);
+ var5.addVertexWithUV(var19, (double)(var3 + 0), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV(var27, (double)((float)var3 + var18), (double)(var4 + 0), var10, var14);
+ var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 0), var12, var14);
+ var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 0), var12, var16);
+ var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 1), var10, var16);
+ var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 1), var10, var14);
+ var10 = (double)((float)var8 / 256.0F);
+ var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ var14 = (double)((float)(var9 + 16) / 256.0F);
+ var16 = (double)(((float)var9 + 15.99F + 16.0F) / 256.0F);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var33, var12, var14);
+ var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var25, var12, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var25, var10, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var33, var10, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var31, var12, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var23, var12, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var23, var10, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var31, var10, var14);
+ var19 = (double)var2 + 0.5D - 0.5D;
+ var21 = (double)var2 + 0.5D + 0.5D;
+ var23 = (double)var4 + 0.5D - 0.5D;
+ var25 = (double)var4 + 0.5D + 0.5D;
+ var27 = (double)var2 + 0.5D - 0.4D;
+ var29 = (double)var2 + 0.5D + 0.4D;
+ var31 = (double)var4 + 0.5D - 0.4D;
+ var33 = (double)var4 + 0.5D + 0.4D;
+ var5.addVertexWithUV(var27, (double)((float)var3 + var18), (double)(var4 + 0), var10, var14);
+ var5.addVertexWithUV(var19, (double)(var3 + 0), (double)(var4 + 0), var10, var16);
+ var5.addVertexWithUV(var19, (double)(var3 + 0), (double)(var4 + 1), var12, var16);
+ var5.addVertexWithUV(var27, (double)((float)var3 + var18), (double)(var4 + 1), var12, var14);
+ var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 1), var10, var14);
+ var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 1), var10, var16);
+ var5.addVertexWithUV(var21, (double)(var3 + 0), (double)(var4 + 0), var12, var16);
+ var5.addVertexWithUV(var29, (double)((float)var3 + var18), (double)(var4 + 0), var12, var14);
+ var10 = (double)((float)var8 / 256.0F);
+ var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ var14 = (double)((float)var9 / 256.0F);
+ var16 = (double)(((float)var9 + 15.99F) / 256.0F);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var33, var10, var14);
+ var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var25, var10, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var25, var12, var16);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var33, var12, var14);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var18), var31, var10, var14);
+ var5.addVertexWithUV((double)(var2 + 1), (double)(var3 + 0), var23, var10, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)(var3 + 0), var23, var12, var16);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var18), var31, var12, var14);
+ }
+
+ return true;
+ }
+
+ public boolean renderBlockRedstoneWire(Block var1, int var2, int var3, int var4) {
+ Tessellator var5 = Tessellator.instance;
+ int var6 = var1.getBlockTextureFromSideAndMetadata(1, this.blockAccess.getBlockMetadata(var2, var3, var4));
+ if(this.overrideBlockTexture >= 0) {
+ var6 = this.overrideBlockTexture;
+ }
+
+ float var7 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ var5.setColorOpaque_F(var7, var7, var7);
+ int var8 = (var6 & 15) << 4;
+ int var9 = var6 & 240;
+ double var10 = (double)((float)var8 / 256.0F);
+ double var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ double var14 = (double)((float)var9 / 256.0F);
+ double var16 = (double)(((float)var9 + 15.99F) / 256.0F);
+ float var18 = 0.0F;
+ float var19 = 0.03125F;
+ boolean var20 = BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 - 1, var3, var4) || !this.blockAccess.isBlockOpaqueCube(var2 - 1, var3, var4) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 - 1, var3 - 1, var4);
+ boolean var21 = BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 + 1, var3, var4) || !this.blockAccess.isBlockOpaqueCube(var2 + 1, var3, var4) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 + 1, var3 - 1, var4);
+ boolean var22 = BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3, var4 - 1) || !this.blockAccess.isBlockOpaqueCube(var2, var3, var4 - 1) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3 - 1, var4 - 1);
+ boolean var23 = BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3, var4 + 1) || !this.blockAccess.isBlockOpaqueCube(var2, var3, var4 + 1) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3 - 1, var4 + 1);
+ if(!this.blockAccess.isBlockOpaqueCube(var2, var3 + 1, var4)) {
+ if(this.blockAccess.isBlockOpaqueCube(var2 - 1, var3, var4) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 - 1, var3 + 1, var4)) {
+ var20 = true;
+ }
+
+ if(this.blockAccess.isBlockOpaqueCube(var2 + 1, var3, var4) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2 + 1, var3 + 1, var4)) {
+ var21 = true;
+ }
+
+ if(this.blockAccess.isBlockOpaqueCube(var2, var3, var4 - 1) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3 + 1, var4 - 1)) {
+ var22 = true;
+ }
+
+ if(this.blockAccess.isBlockOpaqueCube(var2, var3, var4 + 1) && BlockRedstoneWire.isPowerProviderOrWire(this.blockAccess, var2, var3 + 1, var4 + 1)) {
+ var23 = true;
+ }
+ }
+
+ float var24 = 5.0F / 16.0F;
+ float var25 = (float)(var2 + 0);
+ float var26 = (float)(var2 + 1);
+ float var27 = (float)(var4 + 0);
+ float var28 = (float)(var4 + 1);
+ byte var29 = 0;
+ if((var20 || var21) && !var22 && !var23) {
+ var29 = 1;
+ }
+
+ if((var22 || var23) && !var21 && !var20) {
+ var29 = 2;
+ }
+
+ if(var29 != 0) {
+ var10 = (double)((float)(var8 + 16) / 256.0F);
+ var12 = (double)(((float)(var8 + 16) + 15.99F) / 256.0F);
+ var14 = (double)((float)var9 / 256.0F);
+ var16 = (double)(((float)var9 + 15.99F) / 256.0F);
+ }
+
+ if(var29 == 0) {
+ if(var21 || var22 || var23 || var20) {
+ if(!var20) {
+ var25 += var24;
+ }
+
+ if(!var20) {
+ var10 += (double)(var24 / 16.0F);
+ }
+
+ if(!var21) {
+ var26 -= var24;
+ }
+
+ if(!var21) {
+ var12 -= (double)(var24 / 16.0F);
+ }
+
+ if(!var22) {
+ var27 += var24;
+ }
+
+ if(!var22) {
+ var14 += (double)(var24 / 16.0F);
+ }
+
+ if(!var23) {
+ var28 -= var24;
+ }
+
+ if(!var23) {
+ var16 -= (double)(var24 / 16.0F);
+ }
+ }
+
+ var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var28 + var18), var12, var16);
+ var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var27 - var18), var12, var14);
+ var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var27 - var18), var10, var14);
+ var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var28 + var18), var10, var16);
+ }
+
+ if(var29 == 1) {
+ var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var28 + var18), var12, var16);
+ var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var27 - var18), var12, var14);
+ var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var27 - var18), var10, var14);
+ var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var28 + var18), var10, var16);
+ }
+
+ if(var29 == 2) {
+ var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var28 + var18), var12, var16);
+ var5.addVertexWithUV((double)(var26 + var18), (double)((float)var3 + var19), (double)(var27 - var18), var10, var16);
+ var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var27 - var18), var10, var14);
+ var5.addVertexWithUV((double)(var25 - var18), (double)((float)var3 + var19), (double)(var28 + var18), var12, var14);
+ }
+
+ var10 = (double)((float)(var8 + 16) / 256.0F);
+ var12 = (double)(((float)(var8 + 16) + 15.99F) / 256.0F);
+ var14 = (double)((float)var9 / 256.0F);
+ var16 = (double)(((float)var9 + 15.99F) / 256.0F);
+ if(!this.blockAccess.isBlockOpaqueCube(var2, var3 + 1, var4)) {
+ if(this.blockAccess.isBlockOpaqueCube(var2 - 1, var3, var4) && this.blockAccess.getBlockId(var2 - 1, var3 + 1, var4) == Block.redstoneWire.blockID) {
+ var5.addVertexWithUV((double)((float)var2 + var19), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 1) + var18), var12, var14);
+ var5.addVertexWithUV((double)((float)var2 + var19), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 1) + var18), var10, var14);
+ var5.addVertexWithUV((double)((float)var2 + var19), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 0) - var18), var10, var16);
+ var5.addVertexWithUV((double)((float)var2 + var19), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 0) - var18), var12, var16);
+ }
+
+ if(this.blockAccess.isBlockOpaqueCube(var2 + 1, var3, var4) && this.blockAccess.getBlockId(var2 + 1, var3 + 1, var4) == Block.redstoneWire.blockID) {
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var19), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 1) + var18), var10, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var19), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 1) + var18), var12, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var19), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 0) - var18), var12, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var19), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 0) - var18), var10, var14);
+ }
+
+ if(this.blockAccess.isBlockOpaqueCube(var2, var3, var4 - 1) && this.blockAccess.getBlockId(var2, var3 + 1, var4 - 1) == Block.redstoneWire.blockID) {
+ var5.addVertexWithUV((double)((float)(var2 + 1) + var18), (double)((float)(var3 + 0) - var18), (double)((float)var4 + var19), var10, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 1) + var18), (double)((float)(var3 + 1) + var18), (double)((float)var4 + var19), var12, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 0) - var18), (double)((float)(var3 + 1) + var18), (double)((float)var4 + var19), var12, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 0) - var18), (double)((float)(var3 + 0) - var18), (double)((float)var4 + var19), var10, var14);
+ }
+
+ if(this.blockAccess.isBlockOpaqueCube(var2, var3, var4 + 1) && this.blockAccess.getBlockId(var2, var3 + 1, var4 + 1) == Block.redstoneWire.blockID) {
+ var5.addVertexWithUV((double)((float)(var2 + 1) + var18), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 1) - var19), var12, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 1) + var18), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 1) - var19), var10, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 0) - var18), (double)((float)(var3 + 0) - var18), (double)((float)(var4 + 1) - var19), var10, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 0) - var18), (double)((float)(var3 + 1) + var18), (double)((float)(var4 + 1) - var19), var12, var16);
+ }
+ }
+
+ return true;
+ }
+
+ public boolean renderBlockMinecartTrack(Block var1, int var2, int var3, int var4) {
+ Tessellator var5 = Tessellator.instance;
+ int var6 = this.blockAccess.getBlockMetadata(var2, var3, var4);
+ int var7 = var1.getBlockTextureFromSideAndMetadata(0, var6);
+ if(this.overrideBlockTexture >= 0) {
+ var7 = this.overrideBlockTexture;
+ }
+
+ float var8 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ var5.setColorOpaque_F(var8, var8, var8);
+ int var9 = (var7 & 15) << 4;
+ int var10 = var7 & 240;
+ double var11 = (double)((float)var9 / 256.0F);
+ double var13 = (double)(((float)var9 + 15.99F) / 256.0F);
+ double var15 = (double)((float)var10 / 256.0F);
+ double var17 = (double)(((float)var10 + 15.99F) / 256.0F);
+ float var19 = 1.0F / 16.0F;
+ float var20 = (float)(var2 + 1);
+ float var21 = (float)(var2 + 1);
+ float var22 = (float)(var2 + 0);
+ float var23 = (float)(var2 + 0);
+ float var24 = (float)(var4 + 0);
+ float var25 = (float)(var4 + 1);
+ float var26 = (float)(var4 + 1);
+ float var27 = (float)(var4 + 0);
+ float var28 = (float)var3 + var19;
+ float var29 = (float)var3 + var19;
+ float var30 = (float)var3 + var19;
+ float var31 = (float)var3 + var19;
+ if(var6 != 1 && var6 != 2 && var6 != 3 && var6 != 7) {
+ if(var6 == 8) {
+ var21 = (float)(var2 + 0);
+ var20 = var21;
+ var23 = (float)(var2 + 1);
+ var22 = var23;
+ var27 = (float)(var4 + 1);
+ var24 = var27;
+ var26 = (float)(var4 + 0);
+ var25 = var26;
+ } else if(var6 == 9) {
+ var23 = (float)(var2 + 0);
+ var20 = var23;
+ var22 = (float)(var2 + 1);
+ var21 = var22;
+ var25 = (float)(var4 + 0);
+ var24 = var25;
+ var27 = (float)(var4 + 1);
+ var26 = var27;
+ }
+ } else {
+ var23 = (float)(var2 + 1);
+ var20 = var23;
+ var22 = (float)(var2 + 0);
+ var21 = var22;
+ var25 = (float)(var4 + 1);
+ var24 = var25;
+ var27 = (float)(var4 + 0);
+ var26 = var27;
+ }
+
+ if(var6 != 2 && var6 != 4) {
+ if(var6 == 3 || var6 == 5) {
+ ++var29;
+ ++var30;
+ }
+ } else {
+ ++var28;
+ ++var31;
+ }
+
+ var5.addVertexWithUV((double)var20, (double)var28, (double)var24, var13, var15);
+ var5.addVertexWithUV((double)var21, (double)var29, (double)var25, var13, var17);
+ var5.addVertexWithUV((double)var22, (double)var30, (double)var26, var11, var17);
+ var5.addVertexWithUV((double)var23, (double)var31, (double)var27, var11, var15);
+ var5.addVertexWithUV((double)var23, (double)var31, (double)var27, var11, var15);
+ var5.addVertexWithUV((double)var22, (double)var30, (double)var26, var11, var17);
+ var5.addVertexWithUV((double)var21, (double)var29, (double)var25, var13, var17);
+ var5.addVertexWithUV((double)var20, (double)var28, (double)var24, var13, var15);
+ return true;
+ }
+
+ public boolean renderBlockLadder(Block var1, int var2, int var3, int var4) {
+ Tessellator var5 = Tessellator.instance;
+ int var6 = var1.getBlockTextureFromSide(0);
+ if(this.overrideBlockTexture >= 0) {
+ var6 = this.overrideBlockTexture;
+ }
+
+ float var7 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ var5.setColorOpaque_F(var7, var7, var7);
+ int var8 = (var6 & 15) << 4;
+ int var9 = var6 & 240;
+ double var10 = (double)((float)var8 / 256.0F);
+ double var12 = (double)(((float)var8 + 15.99F) / 256.0F);
+ double var14 = (double)((float)var9 / 256.0F);
+ double var16 = (double)(((float)var9 + 15.99F) / 256.0F);
+ int var18 = this.blockAccess.getBlockMetadata(var2, var3, var4);
+ float var19 = 0.0F;
+ float var20 = 0.05F;
+ if(var18 == 5) {
+ var5.addVertexWithUV((double)((float)var2 + var20), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 1) + var19), var10, var14);
+ var5.addVertexWithUV((double)((float)var2 + var20), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 1) + var19), var10, var16);
+ var5.addVertexWithUV((double)((float)var2 + var20), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 0) - var19), var12, var16);
+ var5.addVertexWithUV((double)((float)var2 + var20), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 0) - var19), var12, var14);
+ }
+
+ if(var18 == 4) {
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var20), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 1) + var19), var12, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var20), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 1) + var19), var12, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var20), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 0) - var19), var10, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 1) - var20), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 0) - var19), var10, var16);
+ }
+
+ if(var18 == 3) {
+ var5.addVertexWithUV((double)((float)(var2 + 1) + var19), (double)((float)(var3 + 0) - var19), (double)((float)var4 + var20), var12, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 1) + var19), (double)((float)(var3 + 1) + var19), (double)((float)var4 + var20), var12, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 0) - var19), (double)((float)(var3 + 1) + var19), (double)((float)var4 + var20), var10, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 0) - var19), (double)((float)(var3 + 0) - var19), (double)((float)var4 + var20), var10, var16);
+ }
+
+ if(var18 == 2) {
+ var5.addVertexWithUV((double)((float)(var2 + 1) + var19), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 1) - var20), var10, var14);
+ var5.addVertexWithUV((double)((float)(var2 + 1) + var19), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 1) - var20), var10, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 0) - var19), (double)((float)(var3 + 0) - var19), (double)((float)(var4 + 1) - var20), var12, var16);
+ var5.addVertexWithUV((double)((float)(var2 + 0) - var19), (double)((float)(var3 + 1) + var19), (double)((float)(var4 + 1) - var20), var12, var14);
+ }
+
+ return true;
+ }
+
+ public boolean renderBlockReed(Block var1, int var2, int var3, int var4) {
+ Tessellator var5 = Tessellator.instance;
+ float var6 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ var5.setColorOpaque_F(var6, var6, var6);
+ this.func_1239_a(var1, this.blockAccess.getBlockMetadata(var2, var3, var4), (double)var2, (double)var3, (double)var4);
+ return true;
+ }
+
+ public boolean renderBlockCrops(Block var1, int var2, int var3, int var4) {
+ Tessellator var5 = Tessellator.instance;
+ float var6 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ var5.setColorOpaque_F(var6, var6, var6);
+ this.func_1245_b(var1, this.blockAccess.getBlockMetadata(var2, var3, var4), (double)var2, (double)((float)var3 - 1.0F / 16.0F), (double)var4);
+ return true;
+ }
+
+ public void renderTorchAtAngle(Block var1, double var2, double var4, double var6, double var8, double var10) {
+ Tessellator var12 = Tessellator.instance;
+ int var13 = var1.getBlockTextureFromSide(0);
+ if(this.overrideBlockTexture >= 0) {
+ var13 = this.overrideBlockTexture;
+ }
+
+ int var14 = (var13 & 15) << 4;
+ int var15 = var13 & 240;
+ float var16 = (float)var14 / 256.0F;
+ float var17 = ((float)var14 + 15.99F) / 256.0F;
+ float var18 = (float)var15 / 256.0F;
+ float var19 = ((float)var15 + 15.99F) / 256.0F;
+ double var20 = (double)var16 + 1.75D / 64.0D;
+ double var22 = (double)var18 + 6.0D / 256.0D;
+ double var24 = (double)var16 + 9.0D / 256.0D;
+ double var26 = (double)var18 + 1.0D / 32.0D;
+ var2 += 0.5D;
+ var6 += 0.5D;
+ double var28 = var2 - 0.5D;
+ double var30 = var2 + 0.5D;
+ double var32 = var6 - 0.5D;
+ double var34 = var6 + 0.5D;
+ double var36 = 1.0D / 16.0D;
+ double var38 = 0.625D;
+ var12.addVertexWithUV(var2 + var8 * (1.0D - var38) - var36, var4 + var38, var6 + var10 * (1.0D - var38) - var36, var20, var22);
+ var12.addVertexWithUV(var2 + var8 * (1.0D - var38) - var36, var4 + var38, var6 + var10 * (1.0D - var38) + var36, var20, var26);
+ var12.addVertexWithUV(var2 + var8 * (1.0D - var38) + var36, var4 + var38, var6 + var10 * (1.0D - var38) + var36, var24, var26);
+ var12.addVertexWithUV(var2 + var8 * (1.0D - var38) + var36, var4 + var38, var6 + var10 * (1.0D - var38) - var36, var24, var22);
+ var12.addVertexWithUV(var2 - var36, var4 + 1.0D, var32, (double)var16, (double)var18);
+ var12.addVertexWithUV(var2 - var36 + var8, var4 + 0.0D, var32 + var10, (double)var16, (double)var19);
+ var12.addVertexWithUV(var2 - var36 + var8, var4 + 0.0D, var34 + var10, (double)var17, (double)var19);
+ var12.addVertexWithUV(var2 - var36, var4 + 1.0D, var34, (double)var17, (double)var18);
+ var12.addVertexWithUV(var2 + var36, var4 + 1.0D, var34, (double)var16, (double)var18);
+ var12.addVertexWithUV(var2 + var8 + var36, var4 + 0.0D, var34 + var10, (double)var16, (double)var19);
+ var12.addVertexWithUV(var2 + var8 + var36, var4 + 0.0D, var32 + var10, (double)var17, (double)var19);
+ var12.addVertexWithUV(var2 + var36, var4 + 1.0D, var32, (double)var17, (double)var18);
+ var12.addVertexWithUV(var28, var4 + 1.0D, var6 + var36, (double)var16, (double)var18);
+ var12.addVertexWithUV(var28 + var8, var4 + 0.0D, var6 + var36 + var10, (double)var16, (double)var19);
+ var12.addVertexWithUV(var30 + var8, var4 + 0.0D, var6 + var36 + var10, (double)var17, (double)var19);
+ var12.addVertexWithUV(var30, var4 + 1.0D, var6 + var36, (double)var17, (double)var18);
+ var12.addVertexWithUV(var30, var4 + 1.0D, var6 - var36, (double)var16, (double)var18);
+ var12.addVertexWithUV(var30 + var8, var4 + 0.0D, var6 - var36 + var10, (double)var16, (double)var19);
+ var12.addVertexWithUV(var28 + var8, var4 + 0.0D, var6 - var36 + var10, (double)var17, (double)var19);
+ var12.addVertexWithUV(var28, var4 + 1.0D, var6 - var36, (double)var17, (double)var18);
+ }
+
+ public void func_1239_a(Block var1, int var2, double var3, double var5, double var7) {
+ Tessellator var9 = Tessellator.instance;
+ int var10 = var1.getBlockTextureFromSideAndMetadata(0, var2);
+ if(this.overrideBlockTexture >= 0) {
+ var10 = this.overrideBlockTexture;
+ }
+
+ int var11 = (var10 & 15) << 4;
+ int var12 = var10 & 240;
+ double var13 = (double)((float)var11 / 256.0F);
+ double var15 = (double)(((float)var11 + 15.99F) / 256.0F);
+ double var17 = (double)((float)var12 / 256.0F);
+ double var19 = (double)(((float)var12 + 15.99F) / 256.0F);
+ double var21 = var3 + 0.5D - (double)0.45F;
+ double var23 = var3 + 0.5D + (double)0.45F;
+ double var25 = var7 + 0.5D - (double)0.45F;
+ double var27 = var7 + 0.5D + (double)0.45F;
+ var9.addVertexWithUV(var21, var5 + 1.0D, var25, var13, var17);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var25, var13, var19);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var27, var15, var19);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var27, var15, var17);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var27, var13, var17);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var27, var13, var19);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var25, var15, var19);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var25, var15, var17);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var27, var13, var17);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var27, var13, var19);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var25, var15, var19);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var25, var15, var17);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var25, var13, var17);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var25, var13, var19);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var27, var15, var19);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var27, var15, var17);
+ }
+
+ public void func_1245_b(Block var1, int var2, double var3, double var5, double var7) {
+ Tessellator var9 = Tessellator.instance;
+ int var10 = var1.getBlockTextureFromSideAndMetadata(0, var2);
+ if(this.overrideBlockTexture >= 0) {
+ var10 = this.overrideBlockTexture;
+ }
+
+ int var11 = (var10 & 15) << 4;
+ int var12 = var10 & 240;
+ double var13 = (double)((float)var11 / 256.0F);
+ double var15 = (double)(((float)var11 + 15.99F) / 256.0F);
+ double var17 = (double)((float)var12 / 256.0F);
+ double var19 = (double)(((float)var12 + 15.99F) / 256.0F);
+ double var21 = var3 + 0.5D - 0.25D;
+ double var23 = var3 + 0.5D + 0.25D;
+ double var25 = var7 + 0.5D - 0.5D;
+ double var27 = var7 + 0.5D + 0.5D;
+ var9.addVertexWithUV(var21, var5 + 1.0D, var25, var13, var17);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var25, var13, var19);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var27, var15, var19);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var27, var15, var17);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var27, var13, var17);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var27, var13, var19);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var25, var15, var19);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var25, var15, var17);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var27, var13, var17);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var27, var13, var19);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var25, var15, var19);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var25, var15, var17);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var25, var13, var17);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var25, var13, var19);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var27, var15, var19);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var27, var15, var17);
+ var21 = var3 + 0.5D - 0.5D;
+ var23 = var3 + 0.5D + 0.5D;
+ var25 = var7 + 0.5D - 0.25D;
+ var27 = var7 + 0.5D + 0.25D;
+ var9.addVertexWithUV(var21, var5 + 1.0D, var25, var13, var17);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var25, var13, var19);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var25, var15, var19);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var25, var15, var17);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var25, var13, var17);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var25, var13, var19);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var25, var15, var19);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var25, var15, var17);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var27, var13, var17);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var27, var13, var19);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var27, var15, var19);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var27, var15, var17);
+ var9.addVertexWithUV(var21, var5 + 1.0D, var27, var13, var17);
+ var9.addVertexWithUV(var21, var5 + 0.0D, var27, var13, var19);
+ var9.addVertexWithUV(var23, var5 + 0.0D, var27, var15, var19);
+ var9.addVertexWithUV(var23, var5 + 1.0D, var27, var15, var17);
+ }
+
+ public boolean renderBlockFluids(Block var1, int var2, int var3, int var4) {
+ Tessellator var5 = Tessellator.instance;
+ boolean var6 = var1.shouldSideBeRendered(this.blockAccess, var2, var3 + 1, var4, 1);
+ boolean var7 = var1.shouldSideBeRendered(this.blockAccess, var2, var3 - 1, var4, 0);
+ boolean[] var8 = new boolean[]{var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 - 1, 2), var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 + 1, 3), var1.shouldSideBeRendered(this.blockAccess, var2 - 1, var3, var4, 4), var1.shouldSideBeRendered(this.blockAccess, var2 + 1, var3, var4, 5)};
+ if(!var6 && !var7 && !var8[0] && !var8[1] && !var8[2] && !var8[3]) {
+ return false;
+ } else {
+ boolean var9 = false;
+ float var10 = 0.5F;
+ float var11 = 1.0F;
+ float var12 = 0.8F;
+ float var13 = 0.6F;
+ double var14 = 0.0D;
+ double var16 = 1.0D;
+ Material var18 = var1.blockMaterial;
+ int var19 = this.blockAccess.getBlockMetadata(var2, var3, var4);
+ float var20 = this.func_1224_a(var2, var3, var4, var18);
+ float var21 = this.func_1224_a(var2, var3, var4 + 1, var18);
+ float var22 = this.func_1224_a(var2 + 1, var3, var4 + 1, var18);
+ float var23 = this.func_1224_a(var2 + 1, var3, var4, var18);
+ int var24;
+ int var27;
+ float var32;
+ float var33;
+ float var34;
+ if(this.renderAllFaces || var6) {
+ var9 = true;
+ var24 = var1.getBlockTextureFromSideAndMetadata(1, var19);
+ float var25 = (float)BlockFluids.func_293_a(this.blockAccess, var2, var3, var4, var18);
+ if(var25 > -999.0F) {
+ var24 = var1.getBlockTextureFromSideAndMetadata(2, var19);
+ }
+
+ int var26 = (var24 & 15) << 4;
+ var27 = var24 & 240;
+ double var28 = ((double)var26 + 8.0D) / 256.0D;
+ double var30 = ((double)var27 + 8.0D) / 256.0D;
+ if(var25 < -999.0F) {
+ var25 = 0.0F;
+ } else {
+ var28 = (double)((float)(var26 + 16) / 256.0F);
+ var30 = (double)((float)(var27 + 16) / 256.0F);
+ }
+
+ var32 = MathHelper.sin(var25) * 8.0F / 256.0F;
+ var33 = MathHelper.cos(var25) * 8.0F / 256.0F;
+ var34 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ var5.setColorOpaque_F(var11 * var34, var11 * var34, var11 * var34);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var20), (double)(var4 + 0), var28 - (double)var33 - (double)var32, var30 - (double)var33 + (double)var32);
+ var5.addVertexWithUV((double)(var2 + 0), (double)((float)var3 + var21), (double)(var4 + 1), var28 - (double)var33 + (double)var32, var30 + (double)var33 + (double)var32);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var22), (double)(var4 + 1), var28 + (double)var33 + (double)var32, var30 + (double)var33 - (double)var32);
+ var5.addVertexWithUV((double)(var2 + 1), (double)((float)var3 + var23), (double)(var4 + 0), var28 + (double)var33 - (double)var32, var30 - (double)var33 - (double)var32);
+ }
+
+ if(this.renderAllFaces || var7) {
+ float var48 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4);
+ var5.setColorOpaque_F(var10 * var48, var10 * var48, var10 * var48);
+ this.renderBottomFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTextureFromSide(0));
+ var9 = true;
+ }
+
+ for(var24 = 0; var24 < 4; ++var24) {
+ int var49 = var2;
+ var27 = var4;
+ if(var24 == 0) {
+ var27 = var4 - 1;
+ }
+
+ if(var24 == 1) {
+ ++var27;
+ }
+
+ if(var24 == 2) {
+ var49 = var2 - 1;
+ }
+
+ if(var24 == 3) {
+ ++var49;
+ }
+
+ int var50 = var1.getBlockTextureFromSideAndMetadata(var24 + 2, var19);
+ int var29 = (var50 & 15) << 4;
+ int var51 = var50 & 240;
+ if(this.renderAllFaces || var8[var24]) {
+ float var31;
+ float var35;
+ float var36;
+ if(var24 == 0) {
+ var31 = var20;
+ var32 = var23;
+ var33 = (float)var2;
+ var35 = (float)(var2 + 1);
+ var34 = (float)var4;
+ var36 = (float)var4;
+ } else if(var24 == 1) {
+ var31 = var22;
+ var32 = var21;
+ var33 = (float)(var2 + 1);
+ var35 = (float)var2;
+ var34 = (float)(var4 + 1);
+ var36 = (float)(var4 + 1);
+ } else if(var24 == 2) {
+ var31 = var21;
+ var32 = var20;
+ var33 = (float)var2;
+ var35 = (float)var2;
+ var34 = (float)(var4 + 1);
+ var36 = (float)var4;
+ } else {
+ var31 = var23;
+ var32 = var22;
+ var33 = (float)(var2 + 1);
+ var35 = (float)(var2 + 1);
+ var34 = (float)var4;
+ var36 = (float)(var4 + 1);
+ }
+
+ var9 = true;
+ double var37 = (double)((float)(var29 + 0) / 256.0F);
+ double var39 = ((double)(var29 + 16) - 0.01D) / 256.0D;
+ double var41 = (double)(((float)var51 + (1.0F - var31) * 16.0F) / 256.0F);
+ double var43 = (double)(((float)var51 + (1.0F - var32) * 16.0F) / 256.0F);
+ double var45 = ((double)(var51 + 16) - 0.01D) / 256.0D;
+ float var47 = var1.getBlockBrightness(this.blockAccess, var49, var3, var27);
+ if(var24 < 2) {
+ var47 *= var12;
+ } else {
+ var47 *= var13;
+ }
+
+ var5.setColorOpaque_F(var11 * var47, var11 * var47, var11 * var47);
+ var5.addVertexWithUV((double)var33, (double)((float)var3 + var31), (double)var34, var37, var41);
+ var5.addVertexWithUV((double)var35, (double)((float)var3 + var32), (double)var36, var39, var43);
+ var5.addVertexWithUV((double)var35, (double)(var3 + 0), (double)var36, var39, var45);
+ var5.addVertexWithUV((double)var33, (double)(var3 + 0), (double)var34, var37, var45);
+ }
+ }
+
+ var1.minY = var14;
+ var1.maxY = var16;
+ return var9;
+ }
+ }
+
+ private float func_1224_a(int var1, int var2, int var3, Material var4) {
+ int var5 = 0;
+ float var6 = 0.0F;
+
+ for(int var7 = 0; var7 < 4; ++var7) {
+ int var8 = var1 - (var7 & 1);
+ int var10 = var3 - (var7 >> 1 & 1);
+ if(this.blockAccess.getBlockMaterial(var8, var2 + 1, var10) == var4) {
+ return 1.0F;
+ }
+
+ Material var11 = this.blockAccess.getBlockMaterial(var8, var2, var10);
+ if(var11 != var4) {
+ if(!var11.func_878_a()) {
+ ++var6;
+ ++var5;
+ }
+ } else {
+ int var12 = this.blockAccess.getBlockMetadata(var8, var2, var10);
+ if(var12 >= 8 || var12 == 0) {
+ var6 += BlockFluids.func_288_b(var12) * 10.0F;
+ var5 += 10;
+ }
+
+ var6 += BlockFluids.func_288_b(var12);
+ ++var5;
+ }
+ }
+
+ return 1.0F - var6 / (float)var5;
+ }
+
+ public void func_1243_a(Block var1, World var2, int var3, int var4, int var5) {
+ float var6 = 0.5F;
+ float var7 = 1.0F;
+ float var8 = 0.8F;
+ float var9 = 0.6F;
+ Tessellator var10 = Tessellator.instance;
+ var10.startDrawingQuads();
+ float var11 = var1.getBlockBrightness(var2, var3, var4, var5);
+ float var12 = var1.getBlockBrightness(var2, var3, var4 - 1, var5);
+ if(var12 < var11) {
+ var12 = var11;
+ }
+
+ var10.setColorOpaque_F(var6 * var12, var6 * var12, var6 * var12);
+ this.renderBottomFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(0));
+ var12 = var1.getBlockBrightness(var2, var3, var4 + 1, var5);
+ if(var12 < var11) {
+ var12 = var11;
+ }
+
+ var10.setColorOpaque_F(var7 * var12, var7 * var12, var7 * var12);
+ this.renderTopFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(1));
+ var12 = var1.getBlockBrightness(var2, var3, var4, var5 - 1);
+ if(var12 < var11) {
+ var12 = var11;
+ }
+
+ var10.setColorOpaque_F(var8 * var12, var8 * var12, var8 * var12);
+ this.renderEastFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(2));
+ var12 = var1.getBlockBrightness(var2, var3, var4, var5 + 1);
+ if(var12 < var11) {
+ var12 = var11;
+ }
+
+ var10.setColorOpaque_F(var8 * var12, var8 * var12, var8 * var12);
+ this.renderWestFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(3));
+ var12 = var1.getBlockBrightness(var2, var3 - 1, var4, var5);
+ if(var12 < var11) {
+ var12 = var11;
+ }
+
+ var10.setColorOpaque_F(var9 * var12, var9 * var12, var9 * var12);
+ this.renderNorthFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(4));
+ var12 = var1.getBlockBrightness(var2, var3 + 1, var4, var5);
+ if(var12 < var11) {
+ var12 = var11;
+ }
+
+ var10.setColorOpaque_F(var9 * var12, var9 * var12, var9 * var12);
+ this.renderSouthFace(var1, -0.5D, -0.5D, -0.5D, var1.getBlockTextureFromSide(5));
+ var10.draw();
+ }
+
+ public boolean renderStandardBlock(Block var1, int var2, int var3, int var4) {
+ int var5 = var1.colorMultiplier(this.blockAccess, var2, var3, var4);
+ float var6 = (float)(var5 >> 16 & 255) / 255.0F;
+ float var7 = (float)(var5 >> 8 & 255) / 255.0F;
+ float var8 = (float)(var5 & 255) / 255.0F;
+ return this.renderStandardBlockWithColorMultiplier(var1, var2, var3, var4, var6, var7, var8);
+ }
+
+ public boolean renderStandardBlockWithColorMultiplier(Block var1, int var2, int var3, int var4, float var5, float var6, float var7) {
+ Tessellator var8 = Tessellator.instance;
+ boolean var9 = false;
+ float var10 = 0.5F;
+ float var11 = 1.0F;
+ float var12 = 0.8F;
+ float var13 = 0.6F;
+ float var14 = var11 * var5;
+ float var15 = var11 * var6;
+ float var16 = var11 * var7;
+ if(var1 == Block.grass) {
+ var7 = 1.0F;
+ var6 = var7;
+ var5 = var7;
+ }
+
+ float var17 = var10 * var5;
+ float var18 = var12 * var5;
+ float var19 = var13 * var5;
+ float var20 = var10 * var6;
+ float var21 = var12 * var6;
+ float var22 = var13 * var6;
+ float var23 = var10 * var7;
+ float var24 = var12 * var7;
+ float var25 = var13 * var7;
+ float var26 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ float var27;
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 - 1, var4, 0)) {
+ var27 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4);
+ var8.setColorOpaque_F(var17 * var27, var20 * var27, var23 * var27);
+ this.renderBottomFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 0));
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 + 1, var4, 1)) {
+ var27 = var1.getBlockBrightness(this.blockAccess, var2, var3 + 1, var4);
+ if(var1.maxY != 1.0D && !var1.blockMaterial.getIsLiquid()) {
+ var27 = var26;
+ }
+
+ var8.setColorOpaque_F(var14 * var27, var15 * var27, var16 * var27);
+ this.renderTopFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 1));
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 - 1, 2)) {
+ var27 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 - 1);
+ if(var1.minZ > 0.0D) {
+ var27 = var26;
+ }
+
+ var8.setColorOpaque_F(var18 * var27, var21 * var27, var24 * var27);
+ this.renderEastFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 2));
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 + 1, 3)) {
+ var27 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 + 1);
+ if(var1.maxZ < 1.0D) {
+ var27 = var26;
+ }
+
+ var8.setColorOpaque_F(var18 * var27, var21 * var27, var24 * var27);
+ this.renderWestFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 3));
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 - 1, var3, var4, 4)) {
+ var27 = var1.getBlockBrightness(this.blockAccess, var2 - 1, var3, var4);
+ if(var1.field_370_bf > 0.0D) {
+ var27 = var26;
+ }
+
+ var8.setColorOpaque_F(var19 * var27, var22 * var27, var25 * var27);
+ this.renderNorthFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 4));
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 + 1, var3, var4, 5)) {
+ var27 = var1.getBlockBrightness(this.blockAccess, var2 + 1, var3, var4);
+ if(var1.maxX < 1.0D) {
+ var27 = var26;
+ }
+
+ var8.setColorOpaque_F(var19 * var27, var22 * var27, var25 * var27);
+ this.renderSouthFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 5));
+ var9 = true;
+ }
+
+ return var9;
+ }
+
+ public boolean renderBlockCactus(Block var1, int var2, int var3, int var4) {
+ int var5 = var1.colorMultiplier(this.blockAccess, var2, var3, var4);
+ float var6 = (float)(var5 >> 16 & 255) / 255.0F;
+ float var7 = (float)(var5 >> 8 & 255) / 255.0F;
+ float var8 = (float)(var5 & 255) / 255.0F;
+ return this.func_1230_b(var1, var2, var3, var4, var6, var7, var8);
+ }
+
+ public boolean func_1230_b(Block var1, int var2, int var3, int var4, float var5, float var6, float var7) {
+ Tessellator var8 = Tessellator.instance;
+ boolean var9 = false;
+ float var10 = 0.5F;
+ float var11 = 1.0F;
+ float var12 = 0.8F;
+ float var13 = 0.6F;
+ float var14 = var10 * var5;
+ float var15 = var11 * var5;
+ float var16 = var12 * var5;
+ float var17 = var13 * var5;
+ float var18 = var10 * var6;
+ float var19 = var11 * var6;
+ float var20 = var12 * var6;
+ float var21 = var13 * var6;
+ float var22 = var10 * var7;
+ float var23 = var11 * var7;
+ float var24 = var12 * var7;
+ float var25 = var13 * var7;
+ float var26 = 1.0F / 16.0F;
+ float var27 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ float var28;
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 - 1, var4, 0)) {
+ var28 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4);
+ var8.setColorOpaque_F(var14 * var28, var18 * var28, var22 * var28);
+ this.renderBottomFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 0));
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3 + 1, var4, 1)) {
+ var28 = var1.getBlockBrightness(this.blockAccess, var2, var3 + 1, var4);
+ if(var1.maxY != 1.0D && !var1.blockMaterial.getIsLiquid()) {
+ var28 = var27;
+ }
+
+ var8.setColorOpaque_F(var15 * var28, var19 * var28, var23 * var28);
+ this.renderTopFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 1));
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 - 1, 2)) {
+ var28 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 - 1);
+ if(var1.minZ > 0.0D) {
+ var28 = var27;
+ }
+
+ var8.setColorOpaque_F(var16 * var28, var20 * var28, var24 * var28);
+ var8.setTranslationF(0.0F, 0.0F, var26);
+ this.renderEastFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 2));
+ var8.setTranslationF(0.0F, 0.0F, -var26);
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2, var3, var4 + 1, 3)) {
+ var28 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 + 1);
+ if(var1.maxZ < 1.0D) {
+ var28 = var27;
+ }
+
+ var8.setColorOpaque_F(var16 * var28, var20 * var28, var24 * var28);
+ var8.setTranslationF(0.0F, 0.0F, -var26);
+ this.renderWestFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 3));
+ var8.setTranslationF(0.0F, 0.0F, var26);
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 - 1, var3, var4, 4)) {
+ var28 = var1.getBlockBrightness(this.blockAccess, var2 - 1, var3, var4);
+ if(var1.field_370_bf > 0.0D) {
+ var28 = var27;
+ }
+
+ var8.setColorOpaque_F(var17 * var28, var21 * var28, var25 * var28);
+ var8.setTranslationF(var26, 0.0F, 0.0F);
+ this.renderNorthFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 4));
+ var8.setTranslationF(-var26, 0.0F, 0.0F);
+ var9 = true;
+ }
+
+ if(this.renderAllFaces || var1.shouldSideBeRendered(this.blockAccess, var2 + 1, var3, var4, 5)) {
+ var28 = var1.getBlockBrightness(this.blockAccess, var2 + 1, var3, var4);
+ if(var1.maxX < 1.0D) {
+ var28 = var27;
+ }
+
+ var8.setColorOpaque_F(var17 * var28, var21 * var28, var25 * var28);
+ var8.setTranslationF(-var26, 0.0F, 0.0F);
+ this.renderSouthFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 5));
+ var8.setTranslationF(var26, 0.0F, 0.0F);
+ var9 = true;
+ }
+
+ return var9;
+ }
+
+ public boolean renderBlockFence(Block var1, int var2, int var3, int var4) {
+ boolean var5 = false;
+ float var6 = 6.0F / 16.0F;
+ float var7 = 10.0F / 16.0F;
+ var1.setBlockBounds(var6, 0.0F, var6, var7, 1.0F, var7);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ boolean var8 = false;
+ boolean var9 = false;
+ if(this.blockAccess.getBlockId(var2 - 1, var3, var4) == var1.blockID || this.blockAccess.getBlockId(var2 + 1, var3, var4) == var1.blockID) {
+ var8 = true;
+ }
+
+ if(this.blockAccess.getBlockId(var2, var3, var4 - 1) == var1.blockID || this.blockAccess.getBlockId(var2, var3, var4 + 1) == var1.blockID) {
+ var9 = true;
+ }
+
+ boolean var10 = this.blockAccess.getBlockId(var2 - 1, var3, var4) == var1.blockID;
+ boolean var11 = this.blockAccess.getBlockId(var2 + 1, var3, var4) == var1.blockID;
+ boolean var12 = this.blockAccess.getBlockId(var2, var3, var4 - 1) == var1.blockID;
+ boolean var13 = this.blockAccess.getBlockId(var2, var3, var4 + 1) == var1.blockID;
+ if(!var8 && !var9) {
+ var8 = true;
+ }
+
+ var6 = 7.0F / 16.0F;
+ var7 = 9.0F / 16.0F;
+ float var14 = 12.0F / 16.0F;
+ float var15 = 15.0F / 16.0F;
+ float var16 = var10 ? 0.0F : var6;
+ float var17 = var11 ? 1.0F : var7;
+ float var18 = var12 ? 0.0F : var6;
+ float var19 = var13 ? 1.0F : var7;
+ if(var8) {
+ var1.setBlockBounds(var16, var14, var6, var17, var15, var7);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ }
+
+ if(var9) {
+ var1.setBlockBounds(var6, var14, var18, var7, var15, var19);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ }
+
+ var14 = 6.0F / 16.0F;
+ var15 = 9.0F / 16.0F;
+ if(var8) {
+ var1.setBlockBounds(var16, var14, var6, var17, var15, var7);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ }
+
+ if(var9) {
+ var1.setBlockBounds(var6, var14, var18, var7, var15, var19);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ }
+
+ var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ return var5;
+ }
+
+ public boolean renderBlockStairs(Block var1, int var2, int var3, int var4) {
+ boolean var5 = false;
+ int var6 = this.blockAccess.getBlockMetadata(var2, var3, var4);
+ if(var6 == 0) {
+ var1.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 0.5F, 1.0F);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ var1.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ } else if(var6 == 1) {
+ var1.setBlockBounds(0.0F, 0.0F, 0.0F, 0.5F, 1.0F, 1.0F);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ var1.setBlockBounds(0.5F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ } else if(var6 == 2) {
+ var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 0.5F);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ var1.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 1.0F, 1.0F);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ } else if(var6 == 3) {
+ var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5F);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ var1.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 0.5F, 1.0F);
+ this.renderStandardBlock(var1, var2, var3, var4);
+ }
+
+ var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ return var5;
+ }
+
+ public boolean renderBlockDoor(Block var1, int var2, int var3, int var4) {
+ Tessellator var5 = Tessellator.instance;
+ BlockDoor var6 = (BlockDoor)var1;
+ boolean var7 = false;
+ float var8 = 0.5F;
+ float var9 = 1.0F;
+ float var10 = 0.8F;
+ float var11 = 0.6F;
+ float var12 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4);
+ float var13 = var1.getBlockBrightness(this.blockAccess, var2, var3 - 1, var4);
+ if(var6.minY > 0.0D) {
+ var13 = var12;
+ }
+
+ if(Block.lightValue[var1.blockID] > 0) {
+ var13 = 1.0F;
+ }
+
+ var5.setColorOpaque_F(var8 * var13, var8 * var13, var8 * var13);
+ this.renderBottomFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 0));
+ var7 = true;
+ var13 = var1.getBlockBrightness(this.blockAccess, var2, var3 + 1, var4);
+ if(var6.maxY < 1.0D) {
+ var13 = var12;
+ }
+
+ if(Block.lightValue[var1.blockID] > 0) {
+ var13 = 1.0F;
+ }
+
+ var5.setColorOpaque_F(var9 * var13, var9 * var13, var9 * var13);
+ this.renderTopFace(var1, (double)var2, (double)var3, (double)var4, var1.getBlockTexture(this.blockAccess, var2, var3, var4, 1));
+ var7 = true;
+ var13 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 - 1);
+ if(var6.minZ > 0.0D) {
+ var13 = var12;
+ }
+
+ if(Block.lightValue[var1.blockID] > 0) {
+ var13 = 1.0F;
+ }
+
+ var5.setColorOpaque_F(var10 * var13, var10 * var13, var10 * var13);
+ int var14 = var1.getBlockTexture(this.blockAccess, var2, var3, var4, 2);
+ if(var14 < 0) {
+ this.flipTexture = true;
+ var14 = -var14;
+ }
+
+ this.renderEastFace(var1, (double)var2, (double)var3, (double)var4, var14);
+ var7 = true;
+ this.flipTexture = false;
+ var13 = var1.getBlockBrightness(this.blockAccess, var2, var3, var4 + 1);
+ if(var6.maxZ < 1.0D) {
+ var13 = var12;
+ }
+
+ if(Block.lightValue[var1.blockID] > 0) {
+ var13 = 1.0F;
+ }
+
+ var5.setColorOpaque_F(var10 * var13, var10 * var13, var10 * var13);
+ var14 = var1.getBlockTexture(this.blockAccess, var2, var3, var4, 3);
+ if(var14 < 0) {
+ this.flipTexture = true;
+ var14 = -var14;
+ }
+
+ this.renderWestFace(var1, (double)var2, (double)var3, (double)var4, var14);
+ var7 = true;
+ this.flipTexture = false;
+ var13 = var1.getBlockBrightness(this.blockAccess, var2 - 1, var3, var4);
+ if(var6.field_370_bf > 0.0D) {
+ var13 = var12;
+ }
+
+ if(Block.lightValue[var1.blockID] > 0) {
+ var13 = 1.0F;
+ }
+
+ var5.setColorOpaque_F(var11 * var13, var11 * var13, var11 * var13);
+ var14 = var1.getBlockTexture(this.blockAccess, var2, var3, var4, 4);
+ if(var14 < 0) {
+ this.flipTexture = true;
+ var14 = -var14;
+ }
+
+ this.renderNorthFace(var1, (double)var2, (double)var3, (double)var4, var14);
+ var7 = true;
+ this.flipTexture = false;
+ var13 = var1.getBlockBrightness(this.blockAccess, var2 + 1, var3, var4);
+ if(var6.maxX < 1.0D) {
+ var13 = var12;
+ }
+
+ if(Block.lightValue[var1.blockID] > 0) {
+ var13 = 1.0F;
+ }
+
+ var5.setColorOpaque_F(var11 * var13, var11 * var13, var11 * var13);
+ var14 = var1.getBlockTexture(this.blockAccess, var2, var3, var4, 5);
+ if(var14 < 0) {
+ this.flipTexture = true;
+ var14 = -var14;
+ }
+
+ this.renderSouthFace(var1, (double)var2, (double)var3, (double)var4, var14);
+ var7 = true;
+ this.flipTexture = false;
+ return var7;
+ }
+
+ public void renderBottomFace(Block var1, double var2, double var4, double var6, int var8) {
+ Tessellator var9 = Tessellator.instance;
+ if(this.overrideBlockTexture >= 0) {
+ var8 = this.overrideBlockTexture;
+ }
+
+ int var10 = (var8 & 15) << 4;
+ int var11 = var8 & 240;
+ double var12 = ((double)var10 + var1.field_370_bf * 16.0D) / 256.0D;
+ double var14 = ((double)var10 + var1.maxX * 16.0D - 0.01D) / 256.0D;
+ double var16 = ((double)var11 + var1.minZ * 16.0D) / 256.0D;
+ double var18 = ((double)var11 + var1.maxZ * 16.0D - 0.01D) / 256.0D;
+ if(var1.field_370_bf < 0.0D || var1.maxX > 1.0D) {
+ var12 = (double)(((float)var10 + 0.0F) / 256.0F);
+ var14 = (double)(((float)var10 + 15.99F) / 256.0F);
+ }
+
+ if(var1.minZ < 0.0D || var1.maxZ > 1.0D) {
+ var16 = (double)(((float)var11 + 0.0F) / 256.0F);
+ var18 = (double)(((float)var11 + 15.99F) / 256.0F);
+ }
+
+ double var20 = var2 + var1.field_370_bf;
+ double var22 = var2 + var1.maxX;
+ double var24 = var4 + var1.minY;
+ double var26 = var6 + var1.minZ;
+ double var28 = var6 + var1.maxZ;
+ var9.addVertexWithUV(var20, var24, var28, var12, var18);
+ var9.addVertexWithUV(var20, var24, var26, var12, var16);
+ var9.addVertexWithUV(var22, var24, var26, var14, var16);
+ var9.addVertexWithUV(var22, var24, var28, var14, var18);
+ }
+
+ public void renderTopFace(Block var1, double var2, double var4, double var6, int var8) {
+ Tessellator var9 = Tessellator.instance;
+ if(this.overrideBlockTexture >= 0) {
+ var8 = this.overrideBlockTexture;
+ }
+
+ int var10 = (var8 & 15) << 4;
+ int var11 = var8 & 240;
+ double var12 = ((double)var10 + var1.field_370_bf * 16.0D) / 256.0D;
+ double var14 = ((double)var10 + var1.maxX * 16.0D - 0.01D) / 256.0D;
+ double var16 = ((double)var11 + var1.minZ * 16.0D) / 256.0D;
+ double var18 = ((double)var11 + var1.maxZ * 16.0D - 0.01D) / 256.0D;
+ if(var1.field_370_bf < 0.0D || var1.maxX > 1.0D) {
+ var12 = (double)(((float)var10 + 0.0F) / 256.0F);
+ var14 = (double)(((float)var10 + 15.99F) / 256.0F);
+ }
+
+ if(var1.minZ < 0.0D || var1.maxZ > 1.0D) {
+ var16 = (double)(((float)var11 + 0.0F) / 256.0F);
+ var18 = (double)(((float)var11 + 15.99F) / 256.0F);
+ }
+
+ double var20 = var2 + var1.field_370_bf;
+ double var22 = var2 + var1.maxX;
+ double var24 = var4 + var1.maxY;
+ double var26 = var6 + var1.minZ;
+ double var28 = var6 + var1.maxZ;
+ var9.addVertexWithUV(var22, var24, var28, var14, var18);
+ var9.addVertexWithUV(var22, var24, var26, var14, var16);
+ var9.addVertexWithUV(var20, var24, var26, var12, var16);
+ var9.addVertexWithUV(var20, var24, var28, var12, var18);
+ }
+
+ public void renderEastFace(Block var1, double var2, double var4, double var6, int var8) {
+ Tessellator var9 = Tessellator.instance;
+ if(this.overrideBlockTexture >= 0) {
+ var8 = this.overrideBlockTexture;
+ }
+
+ int var10 = (var8 & 15) << 4;
+ int var11 = var8 & 240;
+ double var12 = ((double)var10 + var1.field_370_bf * 16.0D) / 256.0D;
+ double var14 = ((double)var10 + var1.maxX * 16.0D - 0.01D) / 256.0D;
+ double var16 = ((double)var11 + var1.minY * 16.0D) / 256.0D;
+ double var18 = ((double)var11 + var1.maxY * 16.0D - 0.01D) / 256.0D;
+ double var20;
+ if(this.flipTexture) {
+ var20 = var12;
+ var12 = var14;
+ var14 = var20;
+ }
+
+ if(var1.field_370_bf < 0.0D || var1.maxX > 1.0D) {
+ var12 = (double)(((float)var10 + 0.0F) / 256.0F);
+ var14 = (double)(((float)var10 + 15.99F) / 256.0F);
+ }
+
+ if(var1.minY < 0.0D || var1.maxY > 1.0D) {
+ var16 = (double)(((float)var11 + 0.0F) / 256.0F);
+ var18 = (double)(((float)var11 + 15.99F) / 256.0F);
+ }
+
+ var20 = var2 + var1.field_370_bf;
+ double var22 = var2 + var1.maxX;
+ double var24 = var4 + var1.minY;
+ double var26 = var4 + var1.maxY;
+ double var28 = var6 + var1.minZ;
+ var9.addVertexWithUV(var20, var26, var28, var14, var16);
+ var9.addVertexWithUV(var22, var26, var28, var12, var16);
+ var9.addVertexWithUV(var22, var24, var28, var12, var18);
+ var9.addVertexWithUV(var20, var24, var28, var14, var18);
+ }
+
+ public void renderWestFace(Block var1, double var2, double var4, double var6, int var8) {
+ Tessellator var9 = Tessellator.instance;
+ if(this.overrideBlockTexture >= 0) {
+ var8 = this.overrideBlockTexture;
+ }
+
+ int var10 = (var8 & 15) << 4;
+ int var11 = var8 & 240;
+ double var12 = ((double)var10 + var1.field_370_bf * 16.0D) / 256.0D;
+ double var14 = ((double)var10 + var1.maxX * 16.0D - 0.01D) / 256.0D;
+ double var16 = ((double)var11 + var1.minY * 16.0D) / 256.0D;
+ double var18 = ((double)var11 + var1.maxY * 16.0D - 0.01D) / 256.0D;
+ double var20;
+ if(this.flipTexture) {
+ var20 = var12;
+ var12 = var14;
+ var14 = var20;
+ }
+
+ if(var1.field_370_bf < 0.0D || var1.maxX > 1.0D) {
+ var12 = (double)(((float)var10 + 0.0F) / 256.0F);
+ var14 = (double)(((float)var10 + 15.99F) / 256.0F);
+ }
+
+ if(var1.minY < 0.0D || var1.maxY > 1.0D) {
+ var16 = (double)(((float)var11 + 0.0F) / 256.0F);
+ var18 = (double)(((float)var11 + 15.99F) / 256.0F);
+ }
+
+ var20 = var2 + var1.field_370_bf;
+ double var22 = var2 + var1.maxX;
+ double var24 = var4 + var1.minY;
+ double var26 = var4 + var1.maxY;
+ double var28 = var6 + var1.maxZ;
+ var9.addVertexWithUV(var20, var26, var28, var12, var16);
+ var9.addVertexWithUV(var20, var24, var28, var12, var18);
+ var9.addVertexWithUV(var22, var24, var28, var14, var18);
+ var9.addVertexWithUV(var22, var26, var28, var14, var16);
+ }
+
+ public void renderNorthFace(Block var1, double var2, double var4, double var6, int var8) {
+ Tessellator var9 = Tessellator.instance;
+ if(this.overrideBlockTexture >= 0) {
+ var8 = this.overrideBlockTexture;
+ }
+
+ int var10 = (var8 & 15) << 4;
+ int var11 = var8 & 240;
+ double var12 = ((double)var10 + var1.minZ * 16.0D) / 256.0D;
+ double var14 = ((double)var10 + var1.maxZ * 16.0D - 0.01D) / 256.0D;
+ double var16 = ((double)var11 + var1.minY * 16.0D) / 256.0D;
+ double var18 = ((double)var11 + var1.maxY * 16.0D - 0.01D) / 256.0D;
+ double var20;
+ if(this.flipTexture) {
+ var20 = var12;
+ var12 = var14;
+ var14 = var20;
+ }
+
+ if(var1.minZ < 0.0D || var1.maxZ > 1.0D) {
+ var12 = (double)(((float)var10 + 0.0F) / 256.0F);
+ var14 = (double)(((float)var10 + 15.99F) / 256.0F);
+ }
+
+ if(var1.minY < 0.0D || var1.maxY > 1.0D) {
+ var16 = (double)(((float)var11 + 0.0F) / 256.0F);
+ var18 = (double)(((float)var11 + 15.99F) / 256.0F);
+ }
+
+ var20 = var2 + var1.field_370_bf;
+ double var22 = var4 + var1.minY;
+ double var24 = var4 + var1.maxY;
+ double var26 = var6 + var1.minZ;
+ double var28 = var6 + var1.maxZ;
+ var9.addVertexWithUV(var20, var24, var28, var14, var16);
+ var9.addVertexWithUV(var20, var24, var26, var12, var16);
+ var9.addVertexWithUV(var20, var22, var26, var12, var18);
+ var9.addVertexWithUV(var20, var22, var28, var14, var18);
+ }
+
+ public void renderSouthFace(Block var1, double var2, double var4, double var6, int var8) {
+ Tessellator var9 = Tessellator.instance;
+ if(this.overrideBlockTexture >= 0) {
+ var8 = this.overrideBlockTexture;
+ }
+
+ int var10 = (var8 & 15) << 4;
+ int var11 = var8 & 240;
+ double var12 = ((double)var10 + var1.minZ * 16.0D) / 256.0D;
+ double var14 = ((double)var10 + var1.maxZ * 16.0D - 0.01D) / 256.0D;
+ double var16 = ((double)var11 + var1.minY * 16.0D) / 256.0D;
+ double var18 = ((double)var11 + var1.maxY * 16.0D - 0.01D) / 256.0D;
+ double var20;
+ if(this.flipTexture) {
+ var20 = var12;
+ var12 = var14;
+ var14 = var20;
+ }
+
+ if(var1.minZ < 0.0D || var1.maxZ > 1.0D) {
+ var12 = (double)(((float)var10 + 0.0F) / 256.0F);
+ var14 = (double)(((float)var10 + 15.99F) / 256.0F);
+ }
+
+ if(var1.minY < 0.0D || var1.maxY > 1.0D) {
+ var16 = (double)(((float)var11 + 0.0F) / 256.0F);
+ var18 = (double)(((float)var11 + 15.99F) / 256.0F);
+ }
+
+ var20 = var2 + var1.maxX;
+ double var22 = var4 + var1.minY;
+ double var24 = var4 + var1.maxY;
+ double var26 = var6 + var1.minZ;
+ double var28 = var6 + var1.maxZ;
+ var9.addVertexWithUV(var20, var22, var28, var12, var18);
+ var9.addVertexWithUV(var20, var22, var26, var14, var18);
+ var9.addVertexWithUV(var20, var24, var26, var14, var16);
+ var9.addVertexWithUV(var20, var24, var28, var12, var16);
+ }
+
+ public void func_1238_a(Block var1, float var2) {
+ int var3 = var1.getRenderType();
+ Tessellator var4 = Tessellator.instance;
+ if(var3 == 0) {
+ var1.func_237_e();
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ float var5 = 0.5F;
+ float var6 = 1.0F;
+ float var7 = 0.8F;
+ float var8 = 0.6F;
+ var4.startDrawingQuads();
+ var4.setColorRGBA_F(var6, var6, var6, var2);
+ this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0));
+ var4.setColorRGBA_F(var5, var5, var5, var2);
+ this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1));
+ var4.setColorRGBA_F(var7, var7, var7, var2);
+ this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2));
+ this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3));
+ var4.setColorRGBA_F(var8, var8, var8, var2);
+ this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4));
+ this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5));
+ var4.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+
+ }
+
+ public void func_1227_a(Block var1) {
+ byte var2 = -1;
+ Tessellator var3 = Tessellator.instance;
+ int var4 = var1.getRenderType();
+ if(var4 == 0) {
+ var1.func_237_e();
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, -1.0F, 0.0F);
+ this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 1.0F, 0.0F);
+ this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 0.0F, -1.0F);
+ this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 0.0F, 1.0F);
+ this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(-1.0F, 0.0F, 0.0F);
+ this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(1.0F, 0.0F, 0.0F);
+ this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5));
+ var3.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ } else if(var4 == 1) {
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, -1.0F, 0.0F);
+ this.func_1239_a(var1, var2, -0.5D, -0.5D, -0.5D);
+ var3.draw();
+ } else if(var4 == 13) {
+ var1.func_237_e();
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ float var5 = 1.0F / 16.0F;
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, -1.0F, 0.0F);
+ this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 1.0F, 0.0F);
+ this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 0.0F, -1.0F);
+ var3.setTranslationF(0.0F, 0.0F, var5);
+ this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2));
+ var3.setTranslationF(0.0F, 0.0F, -var5);
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 0.0F, 1.0F);
+ var3.setTranslationF(0.0F, 0.0F, -var5);
+ this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3));
+ var3.setTranslationF(0.0F, 0.0F, var5);
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(-1.0F, 0.0F, 0.0F);
+ var3.setTranslationF(var5, 0.0F, 0.0F);
+ this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4));
+ var3.setTranslationF(-var5, 0.0F, 0.0F);
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(1.0F, 0.0F, 0.0F);
+ var3.setTranslationF(-var5, 0.0F, 0.0F);
+ this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5));
+ var3.setTranslationF(var5, 0.0F, 0.0F);
+ var3.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ } else if(var4 == 6) {
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, -1.0F, 0.0F);
+ this.func_1245_b(var1, var2, -0.5D, -0.5D, -0.5D);
+ var3.draw();
+ } else if(var4 == 2) {
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, -1.0F, 0.0F);
+ this.renderTorchAtAngle(var1, -0.5D, -0.5D, -0.5D, 0.0D, 0.0D);
+ var3.draw();
+ } else {
+ int var7;
+ if(var4 == 10) {
+ for(var7 = 0; var7 < 2; ++var7) {
+ if(var7 == 0) {
+ var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.5F);
+ }
+
+ if(var7 == 1) {
+ var1.setBlockBounds(0.0F, 0.0F, 0.5F, 1.0F, 0.5F, 1.0F);
+ }
+
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, -1.0F, 0.0F);
+ this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 1.0F, 0.0F);
+ this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 0.0F, -1.0F);
+ this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 0.0F, 1.0F);
+ this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(-1.0F, 0.0F, 0.0F);
+ this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(1.0F, 0.0F, 0.0F);
+ this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5));
+ var3.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+ } else if(var4 == 11) {
+ for(var7 = 0; var7 < 4; ++var7) {
+ float var6 = 2.0F / 16.0F;
+ if(var7 == 0) {
+ var1.setBlockBounds(0.5F - var6, 0.0F, 0.0F, 0.5F + var6, 1.0F, var6 * 2.0F);
+ }
+
+ if(var7 == 1) {
+ var1.setBlockBounds(0.5F - var6, 0.0F, 1.0F - var6 * 2.0F, 0.5F + var6, 1.0F, 1.0F);
+ }
+
+ var6 = 1.0F / 16.0F;
+ if(var7 == 2) {
+ var1.setBlockBounds(0.5F - var6, 1.0F - var6 * 3.0F, -var6 * 2.0F, 0.5F + var6, 1.0F - var6, 1.0F + var6 * 2.0F);
+ }
+
+ if(var7 == 3) {
+ var1.setBlockBounds(0.5F - var6, 0.5F - var6 * 3.0F, -var6 * 2.0F, 0.5F + var6, 0.5F - var6, 1.0F + var6 * 2.0F);
+ }
+
+ GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, -1.0F, 0.0F);
+ this.renderBottomFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(0));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 1.0F, 0.0F);
+ this.renderTopFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(1));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 0.0F, -1.0F);
+ this.renderEastFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(2));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(0.0F, 0.0F, 1.0F);
+ this.renderWestFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(3));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(-1.0F, 0.0F, 0.0F);
+ this.renderNorthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(4));
+ var3.draw();
+ var3.startDrawingQuads();
+ var3.setNormal(1.0F, 0.0F, 0.0F);
+ this.renderSouthFace(var1, 0.0D, 0.0D, 0.0D, var1.getBlockTextureFromSide(5));
+ var3.draw();
+ GL11.glTranslatef(0.5F, 0.5F, 0.5F);
+ }
+
+ var1.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+ }
+ }
+
+ }
+
+ public static boolean func_1219_a(int var0) {
+ return var0 == 0 ? true : (var0 == 13 ? true : (var0 == 10 ? true : var0 == 11));
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderBoat.java b/src/main/java/net/minecraft/src/RenderBoat.java
new file mode 100644
index 0000000..0ddb923
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderBoat.java
@@ -0,0 +1,40 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderBoat extends Render {
+ protected ModelBase field_198_d;
+
+ public RenderBoat() {
+ this.field_9246_c = 0.5F;
+ this.field_198_d = new ModelBoat();
+ }
+
+ public void a(EntityBoat var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ GL11.glRotatef(180.0F - var8, 0.0F, 1.0F, 0.0F);
+ float var10 = (float)var1.field_806_b - var9;
+ float var11 = (float)var1.field_807_a - var9;
+ if(var11 < 0.0F) {
+ var11 = 0.0F;
+ }
+
+ if(var10 > 0.0F) {
+ GL11.glRotatef(MathHelper.sin(var10) * var10 * var11 / 10.0F * (float)var1.field_808_c, 1.0F, 0.0F, 0.0F);
+ }
+
+ this.loadTexture("/terrain.png");
+ float var12 = 12.0F / 16.0F;
+ GL11.glScalef(var12, var12, var12);
+ GL11.glScalef(1.0F / var12, 1.0F / var12, 1.0F / var12);
+ this.loadTexture("/item/boat.png");
+ GL11.glScalef(-1.0F, -1.0F, 1.0F);
+ this.field_198_d.render(0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 1.0F / 16.0F);
+ GL11.glPopMatrix();
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityBoat)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderChicken.java b/src/main/java/net/minecraft/src/RenderChicken.java
new file mode 100644
index 0000000..ae161a4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderChicken.java
@@ -0,0 +1,29 @@
+package net.minecraft.src;
+
+public class RenderChicken extends RenderLiving {
+ public RenderChicken(ModelBase var1, float var2) {
+ super(var1, var2);
+ }
+
+ public void a(EntityChicken var1, double var2, double var4, double var6, float var8, float var9) {
+ super.a(var1, var2, var4, var6, var8, var9);
+ }
+
+ protected float a(EntityChicken var1, float var2) {
+ float var3 = var1.field_756_e + (var1.field_752_b - var1.field_756_e) * var2;
+ float var4 = var1.field_757_d + (var1.field_758_c - var1.field_757_d) * var2;
+ return (MathHelper.sin(var3) + 1.0F) * var4;
+ }
+
+ protected float func_170_d(EntityLiving var1, float var2) {
+ return this.a((EntityChicken)var1, var2);
+ }
+
+ public void a(EntityLiving var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityChicken)var1, var2, var4, var6, var8, var9);
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityChicken)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderCow.java b/src/main/java/net/minecraft/src/RenderCow.java
new file mode 100644
index 0000000..dcd104a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderCow.java
@@ -0,0 +1,19 @@
+package net.minecraft.src;
+
+public class RenderCow extends RenderLiving {
+ public RenderCow(ModelBase var1, float var2) {
+ super(var1, var2);
+ }
+
+ public void a(EntityCow var1, double var2, double var4, double var6, float var8, float var9) {
+ super.a(var1, var2, var4, var6, var8, var9);
+ }
+
+ public void a(EntityLiving var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityCow)var1, var2, var4, var6, var8, var9);
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityCow)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderCreeper.java b/src/main/java/net/minecraft/src/RenderCreeper.java
new file mode 100644
index 0000000..08c349a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderCreeper.java
@@ -0,0 +1,56 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderCreeper extends RenderLiving {
+ public RenderCreeper() {
+ super(new ModelCreeper(), 0.5F);
+ }
+
+ protected void a(EntityCreeper var1, float var2) {
+ float var4 = var1.func_440_b(var2);
+ float var5 = 1.0F + MathHelper.sin(var4 * 100.0F) * var4 * 0.01F;
+ if(var4 < 0.0F) {
+ var4 = 0.0F;
+ }
+
+ if(var4 > 1.0F) {
+ var4 = 1.0F;
+ }
+
+ var4 *= var4;
+ var4 *= var4;
+ float var6 = (1.0F + var4 * 0.4F) * var5;
+ float var7 = (1.0F + var4 * 0.1F) / var5;
+ GL11.glScalef(var6, var7, var6);
+ }
+
+ protected int a(EntityCreeper var1, float var2, float var3) {
+ float var5 = var1.func_440_b(var3);
+ if((int)(var5 * 10.0F) % 2 == 0) {
+ return 0;
+ } else {
+ int var6 = (int)(var5 * 0.2F * 255.0F);
+ if(var6 < 0) {
+ var6 = 0;
+ }
+
+ if(var6 > 255) {
+ var6 = 255;
+ }
+
+ short var7 = 255;
+ short var8 = 255;
+ short var9 = 255;
+ return var6 << 24 | var7 << 16 | var8 << 8 | var9;
+ }
+ }
+
+ protected void func_6330_a(EntityLiving var1, float var2) {
+ this.a((EntityCreeper)var1, var2);
+ }
+
+ protected int func_173_a(EntityLiving var1, float var2, float var3) {
+ return this.a((EntityCreeper)var1, var2, var3);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderEngine.java b/src/main/java/net/minecraft/src/RenderEngine.java
new file mode 100644
index 0000000..a23a08e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderEngine.java
@@ -0,0 +1,195 @@
+package net.minecraft.src;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.lwjgl.opengl.GL11;
+
+import net.lax1dude.eaglercraft.EaglerImage;
+
+public class RenderEngine {
+
+ public RenderEngine(GameSettings gamesettings) {
+ textureMap = new HashMap();
+ textureNameToImageMap = new HashMap();
+ singleIntBuffer = GLAllocation.createDirectIntBuffer(1);
+ imageDataB1 = GLAllocation.createDirectByteBuffer(0x100000);
+ imageDataB2 = GLAllocation.createDirectByteBuffer(0x100000);
+ textureList = new ArrayList();
+ clampTexture = false;
+ blurTexture = false;
+ options = gamesettings;
+ }
+
+ public int getTexture(String s) {
+ Integer integer = (Integer) textureMap.get(s);
+ if (integer != null) {
+ return integer.intValue();
+ }
+ try {
+ singleIntBuffer.clear();
+ GLAllocation.generateTextureNames(singleIntBuffer);
+ int i = singleIntBuffer.get(0);
+ if (s.startsWith("%%")) {
+ clampTexture = true;
+ setupTexture(readTextureImage(GL11.loadResourceBytes(s.substring(7))), i);
+ clampTexture = false;
+ } else {
+ useMipmaps = true;
+ setupTexture(readTextureImage(GL11.loadResourceBytes(s)), i);
+ useMipmaps = false;
+ }
+ textureMap.put(s, Integer.valueOf(i));
+ return i;
+ } catch (IOException ioexception) {
+ throw new RuntimeException("!!");
+ }
+ }
+
+ public int allocateAndSetupTexture(EaglerImage bufferedimage) {
+ singleIntBuffer.clear();
+ GLAllocation.generateTextureNames(singleIntBuffer);
+ int i = singleIntBuffer.get(0);
+ setupTexture(bufferedimage, i);
+ textureNameToImageMap.put(Integer.valueOf(i), bufferedimage);
+ return i;
+ }
+
+ public int allocateAndSetupTexture(byte[] data, int w, int h) {
+ int i = GL11.glGenTextures();
+ bindTexture(i);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10241 /* GL_TEXTURE_MIN_FILTER */, 9729 /* GL_LINEAR */);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10240 /* GL_TEXTURE_MAG_FILTER */, 9728 /* GL_NEAREST */);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10242 /* GL_TEXTURE_WRAP_S */, 10497 /* GL_REPEAT */);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10243 /* GL_TEXTURE_WRAP_T */, 10497 /* GL_REPEAT */);
+ imageDataB1.clear();
+ imageDataB1.put(data);
+ imageDataB1.position(0).limit(data.length);
+ GL11.glTexImage2D(3553 /* GL_TEXTURE_2D */, 0, 6408 /* GL_RGBA */, w, h, 0, 6408 /* GL_RGBA */,
+ 5121 /* GL_UNSIGNED_BYTE */, imageDataB1);
+ return i;
+ }
+
+ public void setupTexture(EaglerImage bufferedimage, int i) {
+ bindTexture(i);
+ if (useMipmaps) {
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10241 /* GL_TEXTURE_MIN_FILTER */, GL11.GL_NEAREST_MIPMAP_LINEAR);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10240 /* GL_TEXTURE_MAG_FILTER */, GL11.GL_NEAREST /* GL_LINEAR */);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, GL11.GL_TEXTURE_MAX_LEVEL, 4);
+ } else {
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10241 /* GL_TEXTURE_MIN_FILTER */, 9728 /* GL_NEAREST */);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10240 /* GL_TEXTURE_MAG_FILTER */, 9728 /* GL_NEAREST */);
+ }
+ if (blurTexture) {
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10241 /* GL_TEXTURE_MIN_FILTER */, 9729 /* GL_LINEAR */);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10240 /* GL_TEXTURE_MAG_FILTER */, 9729 /* GL_LINEAR */);
+ }
+ if (clampTexture) {
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10242 /* GL_TEXTURE_WRAP_S */, 10496 /* GL_CLAMP */);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10243 /* GL_TEXTURE_WRAP_T */, 10496 /* GL_CLAMP */);
+ } else {
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10242 /* GL_TEXTURE_WRAP_S */, 10497 /* GL_REPEAT */);
+ GL11.glTexParameteri(3553 /* GL_TEXTURE_2D */, 10243 /* GL_TEXTURE_WRAP_T */, 10497 /* GL_REPEAT */);
+ }
+ int j = bufferedimage.w;
+ int k = bufferedimage.h;
+ int ai[] = bufferedimage.data;
+ byte abyte0[] = new byte[j * k * 4];
+ for (int l = 0; l < ai.length; l++) {
+ int j1 = ai[l] >> 24 & 0xff;
+ int l1 = ai[l] >> 16 & 0xff;
+ int j2 = ai[l] >> 8 & 0xff;
+ int l2 = ai[l] >> 0 & 0xff;
+ if (options != null && options.anaglyph) {
+ int j3 = (l1 * 30 + j2 * 59 + l2 * 11) / 100;
+ int l3 = (l1 * 30 + j2 * 70) / 100;
+ int j4 = (l1 * 30 + l2 * 70) / 100;
+ l1 = j3;
+ j2 = l3;
+ l2 = j4;
+ }
+ abyte0[l * 4 + 0] = (byte) l1;
+ abyte0[l * 4 + 1] = (byte) j2;
+ abyte0[l * 4 + 2] = (byte) l2;
+ abyte0[l * 4 + 3] = (byte) j1;
+ }
+ imageDataB1.clear();
+ imageDataB1.put(abyte0);
+ imageDataB1.position(0).limit(abyte0.length);
+ GL11.glTexImage2D(3553 /* GL_TEXTURE_2D */, 0, 6408 /* GL_RGBA */, j, k, 0, 6408 /* GL_RGBA */,
+ 5121 /* GL_UNSIGNED_BYTE */, imageDataB1);
+ if (useMipmaps) {
+ for (int i1 = 1; i1 <= 4; i1++) {
+ int k1 = j >> i1 - 1;
+ int i2 = j >> i1;
+ int k2 = k >> i1;
+ imageDataB2.clear();
+ for (int i3 = 0; i3 < i2; i3++) {
+ for (int k3 = 0; k3 < k2; k3++) {
+ int i4 = imageDataB1.getInt((i3 * 2 + 0 + (k3 * 2 + 0) * k1) * 4);
+ int k4 = imageDataB1.getInt((i3 * 2 + 1 + (k3 * 2 + 0) * k1) * 4);
+ int l4 = imageDataB1.getInt((i3 * 2 + 1 + (k3 * 2 + 1) * k1) * 4);
+ int i5 = imageDataB1.getInt((i3 * 2 + 0 + (k3 * 2 + 1) * k1) * 4);
+ int j5 = averageColor(averageColor(i4, k4), averageColor(l4, i5));
+ imageDataB2.putInt((i3 + k3 * i2) * 4, j5);
+ }
+
+ }
+
+ GL11.glTexImage2D(3553 /* GL_TEXTURE_2D */, i1, 6408 /* GL_RGBA */, i2, k2, 0, 6408 /* GL_RGBA */,
+ 5121 /* GL_UNSIGNED_BYTE */, imageDataB2);
+ ByteBuffer tmp = imageDataB1;
+ imageDataB1 = imageDataB2;
+ imageDataB2 = tmp;
+ }
+
+ }
+ }
+
+ public void deleteTexture(int i) {
+ GL11.glDeleteTextures(i);
+ }
+
+ public void registerTextureFX(TextureFX texturefx) {
+ textureList.add(texturefx);
+ texturefx.func_783_a();
+ }
+
+ private int averageColor(int i, int j) {
+ int k = (i & 0xff000000) >> 24 & 0xff;
+ int l = (j & 0xff000000) >> 24 & 0xff;
+ return ((k + l >> 1) << 24) + ((i & 0xfefefe) + (j & 0xfefefe) >> 1);
+
+ }
+
+ private EaglerImage readTextureImage(byte[] inputstream) throws IOException {
+ return GL11.loadPNG(inputstream);
+ }
+
+ public void bindTexture(int i) {
+ if (i < 0) {
+ return;
+ } else {
+ GL11.glBindTexture(3553 /* GL_TEXTURE_2D */, i);
+ return;
+ }
+ }
+
+ public int getTextureForDownloadableImage(String s, String s1) {
+ return getTexture(s1);
+ }
+
+ public static boolean useMipmaps = false;
+ private static HashMap textureMap;
+ private HashMap textureNameToImageMap;
+ private IntBuffer singleIntBuffer;
+ private ByteBuffer imageDataB1;
+ private ByteBuffer imageDataB2;
+ private java.util.List textureList;
+ private GameSettings options;
+ private boolean clampTexture;
+ private boolean blurTexture;
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/src/RenderEntity.java b/src/main/java/net/minecraft/src/RenderEntity.java
new file mode 100644
index 0000000..52836e9
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderEntity.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderEntity extends Render {
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ renderOffsetAABB(var1.boundingBox, var2 - var1.lastTickPosX, var4 - var1.lastTickPosY, var6 - var1.lastTickPosZ);
+ GL11.glPopMatrix();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderFallingSand.java b/src/main/java/net/minecraft/src/RenderFallingSand.java
new file mode 100644
index 0000000..07fefad
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderFallingSand.java
@@ -0,0 +1,27 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderFallingSand extends Render {
+ private RenderBlocks field_197_d = new RenderBlocks();
+
+ public RenderFallingSand() {
+ this.field_9246_c = 0.5F;
+ }
+
+ public void a(EntityFallingSand var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ this.loadTexture("/terrain.png");
+ Block var10 = Block.blocksList[var1.field_799_a];
+ World var11 = var1.func_465_i();
+ GL11.glDisable(GL11.GL_LIGHTING);
+ this.field_197_d.func_1243_a(var10, var11, MathHelper.floor_double(var1.posX), MathHelper.floor_double(var1.posY), MathHelper.floor_double(var1.posZ));
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glPopMatrix();
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityFallingSand)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderFireball.java b/src/main/java/net/minecraft/src/RenderFireball.java
new file mode 100644
index 0000000..3461192
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderFireball.java
@@ -0,0 +1,39 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class RenderFireball extends Render {
+ public void a(EntityFireball var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ float var10 = 2.0F;
+ GL11.glScalef(var10 / 1.0F, var10 / 1.0F, var10 / 1.0F);
+ int var11 = Item.snowball.getIconIndex((ItemStack)null);
+ this.loadTexture("/gui/items.png");
+ Tessellator var12 = Tessellator.instance;
+ float var13 = (float)(var11 % 16 * 16 + 0) / 256.0F;
+ float var14 = (float)(var11 % 16 * 16 + 16) / 256.0F;
+ float var15 = (float)(var11 / 16 * 16 + 0) / 256.0F;
+ float var16 = (float)(var11 / 16 * 16 + 16) / 256.0F;
+ float var17 = 1.0F;
+ float var18 = 0.5F;
+ float var19 = 0.25F;
+ GL11.glRotatef(180.0F - this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-this.renderManager.field_1224_j, 1.0F, 0.0F, 0.0F);
+ var12.startDrawingQuads();
+ var12.setNormal(0.0F, 1.0F, 0.0F);
+ var12.addVertexWithUV((double)(0.0F - var18), (double)(0.0F - var19), 0.0D, (double)var13, (double)var16);
+ var12.addVertexWithUV((double)(var17 - var18), (double)(0.0F - var19), 0.0D, (double)var14, (double)var16);
+ var12.addVertexWithUV((double)(var17 - var18), (double)(1.0F - var19), 0.0D, (double)var14, (double)var15);
+ var12.addVertexWithUV((double)(0.0F - var18), (double)(1.0F - var19), 0.0D, (double)var13, (double)var15);
+ var12.draw();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityFireball)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderFish.java b/src/main/java/net/minecraft/src/RenderFish.java
new file mode 100644
index 0000000..2516387
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderFish.java
@@ -0,0 +1,80 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class RenderFish extends Render {
+ public void a(EntityFish var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glScalef(0.5F, 0.5F, 0.5F);
+ byte var10 = 1;
+ byte var11 = 2;
+ this.loadTexture("/particles.png");
+ Tessellator var12 = Tessellator.instance;
+ float var13 = (float)(var10 * 8 + 0) / 128.0F;
+ float var14 = (float)(var10 * 8 + 8) / 128.0F;
+ float var15 = (float)(var11 * 8 + 0) / 128.0F;
+ float var16 = (float)(var11 * 8 + 8) / 128.0F;
+ float var17 = 1.0F;
+ float var18 = 0.5F;
+ float var19 = 0.5F;
+ GL11.glRotatef(180.0F - this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-this.renderManager.field_1224_j, 1.0F, 0.0F, 0.0F);
+ var12.startDrawingQuads();
+ var12.setNormal(0.0F, 1.0F, 0.0F);
+ var12.addVertexWithUV((double)(0.0F - var18), (double)(0.0F - var19), 0.0D, (double)var13, (double)var16);
+ var12.addVertexWithUV((double)(var17 - var18), (double)(0.0F - var19), 0.0D, (double)var14, (double)var16);
+ var12.addVertexWithUV((double)(var17 - var18), (double)(1.0F - var19), 0.0D, (double)var14, (double)var15);
+ var12.addVertexWithUV((double)(0.0F - var18), (double)(1.0F - var19), 0.0D, (double)var13, (double)var15);
+ var12.draw();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ if(var1.field_4097_b != null) {
+ float var20 = (var1.field_4097_b.prevRotationYaw + (var1.field_4097_b.rotationYaw - var1.field_4097_b.prevRotationYaw) * var9) * (float)Math.PI / 180.0F;
+ float var21 = (var1.field_4097_b.prevRotationPitch + (var1.field_4097_b.rotationPitch - var1.field_4097_b.prevRotationPitch) * var9) * (float)Math.PI / 180.0F;
+ double var22 = (double)MathHelper.sin(var20);
+ double var24 = (double)MathHelper.cos(var20);
+ double var26 = (double)MathHelper.sin(var21);
+ double var28 = (double)MathHelper.cos(var21);
+ double var30 = var1.field_4097_b.prevPosX + (var1.field_4097_b.posX - var1.field_4097_b.prevPosX) * (double)var9 - var24 * 0.7D - var22 * 0.5D * var28;
+ double var32 = var1.field_4097_b.prevPosY + (var1.field_4097_b.posY - var1.field_4097_b.prevPosY) * (double)var9 - var26 * 0.5D;
+ double var34 = var1.field_4097_b.prevPosZ + (var1.field_4097_b.posZ - var1.field_4097_b.prevPosZ) * (double)var9 - var22 * 0.7D + var24 * 0.5D * var28;
+ if(this.renderManager.options.thirdPersonView) {
+ var20 = (var1.field_4097_b.field_734_o + (var1.field_4097_b.field_735_n - var1.field_4097_b.field_734_o) * var9) * (float)Math.PI / 180.0F;
+ var22 = (double)MathHelper.sin(var20);
+ var24 = (double)MathHelper.cos(var20);
+ var30 = var1.field_4097_b.prevPosX + (var1.field_4097_b.posX - var1.field_4097_b.prevPosX) * (double)var9 - var24 * 0.35D - var22 * 0.85D;
+ var32 = var1.field_4097_b.prevPosY + (var1.field_4097_b.posY - var1.field_4097_b.prevPosY) * (double)var9 - 0.45D;
+ var34 = var1.field_4097_b.prevPosZ + (var1.field_4097_b.posZ - var1.field_4097_b.prevPosZ) * (double)var9 - var22 * 0.35D + var24 * 0.85D;
+ }
+
+ double var36 = var1.prevPosX + (var1.posX - var1.prevPosX) * (double)var9;
+ double var38 = var1.prevPosY + (var1.posY - var1.prevPosY) * (double)var9 + 0.25D;
+ double var40 = var1.prevPosZ + (var1.posZ - var1.prevPosZ) * (double)var9;
+ double var42 = (double)((float)(var30 - var36));
+ double var44 = (double)((float)(var32 - var38));
+ double var46 = (double)((float)(var34 - var40));
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ var12.startDrawing(3);
+ var12.setColorOpaque_I(0);
+ byte var48 = 16;
+
+ for(int var49 = 0; var49 <= var48; ++var49) {
+ float var50 = (float)var49 / (float)var48;
+ var12.addVertex(var2 + var42 * (double)var50, var4 + var44 * (double)(var50 * var50 + var50) * 0.5D + 0.25D, var6 + var46 * (double)var50);
+ }
+
+ var12.draw();
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityFish)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderGhast.java b/src/main/java/net/minecraft/src/RenderGhast.java
new file mode 100644
index 0000000..c75efc2
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderGhast.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderGhast extends RenderLiving {
+ public RenderGhast() {
+ super(new ModelGhast(), 0.5F);
+ }
+
+ protected void a(EntityGhast var1, float var2) {
+ float var4 = ((float)var1.field_4125_e + (float)(var1.field_4124_f - var1.field_4125_e) * var2) / 20.0F;
+ if(var4 < 0.0F) {
+ var4 = 0.0F;
+ }
+
+ var4 = 1.0F / (var4 * var4 * var4 * var4 * var4 * 2.0F + 1.0F);
+ float var5 = (8.0F + var4) / 2.0F;
+ float var6 = (8.0F + 1.0F / var4) / 2.0F;
+ GL11.glScalef(var6, var5, var6);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ protected void func_6330_a(EntityLiving var1, float var2) {
+ this.a((EntityGhast)var1, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderGlobal.java b/src/main/java/net/minecraft/src/RenderGlobal.java
new file mode 100644
index 0000000..4514826
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderGlobal.java
@@ -0,0 +1,1023 @@
+package net.minecraft.src;
+
+import java.nio.IntBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import net.minecraft.client.Minecraft;
+import org.lwjgl.opengl.GL11;
+
+public class RenderGlobal implements IWorldAccess {
+ public List field_1458_a = new ArrayList();
+ private World worldObj;
+ private RenderEngine renderEngine;
+ private List field_1446_m = new ArrayList();
+ private WorldRenderer[] field_1445_n;
+ private WorldRenderer[] field_1444_o;
+ private int field_1443_p;
+ private int field_1442_q;
+ private int field_1441_r;
+ private int field_1440_s;
+ private Minecraft mc;
+ private RenderBlocks field_1438_u;
+ private IntBuffer field_1437_v;
+ private int field_1435_x = 0;
+ private int field_1434_y;
+ private int field_1433_z;
+ private int field_1432_A;
+ private int field_1431_B;
+ private int field_1430_C;
+ private int field_1429_D;
+ private int field_1428_E;
+ private int field_1427_F;
+ private int field_1426_G;
+ private int field_1425_H = -1;
+ private int field_1424_I = 2;
+ private int field_1423_J;
+ private int field_1422_K;
+ private int field_1421_L;
+ int[] field_1457_b = new int['\uc350'];
+ IntBuffer field_1456_c = GLAllocation.createDirectIntBuffer(64);
+ private int field_1420_M;
+ private int field_1419_N;
+ private int field_1418_O;
+ private int field_1417_P;
+ private int field_1416_Q;
+ private List field_1415_R = new ArrayList();
+ private RenderList[] field_1414_S = new RenderList[]{new RenderList(), new RenderList(), new RenderList(), new RenderList()};
+ int field_1455_d = 0;
+ int field_1454_e = GLAllocation.generateDisplayLists(1);
+ double field_1453_f = -9999.0D;
+ double field_1452_g = -9999.0D;
+ double field_1451_h = -9999.0D;
+ public float field_1450_i;
+ int field_1449_j = 0;
+
+ public RenderGlobal(Minecraft var1, RenderEngine var2) {
+ this.mc = var1;
+ this.renderEngine = var2;
+ byte var3 = 64;
+ this.field_1440_s = GLAllocation.generateDisplayLists(var3 * var3 * var3 * 3);
+ this.field_1434_y = GLAllocation.generateDisplayLists(3);
+ GL11.glPushMatrix();
+ GL11.glNewList(this.field_1434_y, GL11.GL_COMPILE);
+ this.func_950_f();
+ GL11.glEndList();
+ GL11.glPopMatrix();
+ Tessellator var4 = Tessellator.instance;
+ this.field_1433_z = this.field_1434_y + 1;
+ GL11.glNewList(this.field_1433_z, GL11.GL_COMPILE);
+ byte var6 = 64;
+ int var7 = 256 / var6 + 2;
+ float var5 = 16.0F;
+
+ int var8;
+ int var9;
+ for(var8 = -var6 * var7; var8 <= var6 * var7; var8 += var6) {
+ for(var9 = -var6 * var7; var9 <= var6 * var7; var9 += var6) {
+ var4.startDrawingQuads();
+ var4.addVertex((double)(var8 + 0), (double)var5, (double)(var9 + 0));
+ var4.addVertex((double)(var8 + var6), (double)var5, (double)(var9 + 0));
+ var4.addVertex((double)(var8 + var6), (double)var5, (double)(var9 + var6));
+ var4.addVertex((double)(var8 + 0), (double)var5, (double)(var9 + var6));
+ var4.draw();
+ }
+ }
+
+ GL11.glEndList();
+ this.field_1432_A = this.field_1434_y + 2;
+ GL11.glNewList(this.field_1432_A, GL11.GL_COMPILE);
+ var5 = -16.0F;
+ var4.startDrawingQuads();
+
+ for(var8 = -var6 * var7; var8 <= var6 * var7; var8 += var6) {
+ for(var9 = -var6 * var7; var9 <= var6 * var7; var9 += var6) {
+ var4.addVertex((double)(var8 + var6), (double)var5, (double)(var9 + 0));
+ var4.addVertex((double)(var8 + 0), (double)var5, (double)(var9 + 0));
+ var4.addVertex((double)(var8 + 0), (double)var5, (double)(var9 + var6));
+ var4.addVertex((double)(var8 + var6), (double)var5, (double)(var9 + var6));
+ }
+ }
+
+ var4.draw();
+ GL11.glEndList();
+ }
+
+ private void func_950_f() {
+ Random var1 = new Random(10842L);
+ Tessellator var2 = Tessellator.instance;
+ var2.startDrawingQuads();
+
+ for(int var3 = 0; var3 < 1500; ++var3) {
+ double var4 = (double)(var1.nextFloat() * 2.0F - 1.0F);
+ double var6 = (double)(var1.nextFloat() * 2.0F - 1.0F);
+ double var8 = (double)(var1.nextFloat() * 2.0F - 1.0F);
+ double var10 = (double)(0.25F + var1.nextFloat() * 0.25F);
+ double var12 = var4 * var4 + var6 * var6 + var8 * var8;
+ if(var12 < 1.0D && var12 > 0.01D) {
+ var12 = 1.0D / Math.sqrt(var12);
+ var4 *= var12;
+ var6 *= var12;
+ var8 *= var12;
+ double var14 = var4 * 100.0D;
+ double var16 = var6 * 100.0D;
+ double var18 = var8 * 100.0D;
+ double var20 = Math.atan2(var4, var8);
+ double var22 = Math.sin(var20);
+ double var24 = Math.cos(var20);
+ double var26 = Math.atan2(Math.sqrt(var4 * var4 + var8 * var8), var6);
+ double var28 = Math.sin(var26);
+ double var30 = Math.cos(var26);
+ double var32 = var1.nextDouble() * Math.PI * 2.0D;
+ double var34 = Math.sin(var32);
+ double var36 = Math.cos(var32);
+
+ for(int var38 = 0; var38 < 4; ++var38) {
+ double var39 = 0.0D;
+ double var41 = (double)((var38 & 2) - 1) * var10;
+ double var43 = (double)((var38 + 1 & 2) - 1) * var10;
+ double var47 = var41 * var36 - var43 * var34;
+ double var49 = var43 * var36 + var41 * var34;
+ double var53 = var47 * var28 + var39 * var30;
+ double var55 = var39 * var28 - var47 * var30;
+ double var57 = var55 * var22 - var49 * var24;
+ double var61 = var49 * var22 + var55 * var24;
+ var2.addVertex(var14 + var57, var16 + var53, var18 + var61);
+ }
+ }
+ }
+
+ var2.draw();
+ }
+
+ public void func_946_a(World var1) {
+ if(this.worldObj != null) {
+ this.worldObj.removeWorldAccess(this);
+ }
+
+ this.field_1453_f = -9999.0D;
+ this.field_1452_g = -9999.0D;
+ this.field_1451_h = -9999.0D;
+ RenderManager.instance.func_852_a(var1);
+ this.worldObj = var1;
+ this.field_1438_u = new RenderBlocks(var1);
+ if(var1 != null) {
+ var1.addWorldAccess(this);
+ this.func_958_a();
+ }
+
+ }
+
+ public void func_958_a() {
+ Block.leaves.setGraphicsLevel(this.mc.gameSettings.fancyGraphics);
+ this.field_1425_H = this.mc.gameSettings.renderDistance;
+ int var1;
+ if(this.field_1444_o != null) {
+ for(var1 = 0; var1 < this.field_1444_o.length; ++var1) {
+ this.field_1444_o[var1].func_1204_c();
+ }
+ }
+
+ var1 = 64 << 3 - this.field_1425_H;
+ if(var1 > 400) {
+ var1 = 400;
+ }
+
+ this.field_1443_p = var1 / 16 + 1;
+ this.field_1442_q = 8;
+ this.field_1441_r = var1 / 16 + 1;
+ this.field_1444_o = new WorldRenderer[this.field_1443_p * this.field_1442_q * this.field_1441_r];
+ this.field_1445_n = new WorldRenderer[this.field_1443_p * this.field_1442_q * this.field_1441_r];
+ int var2 = 0;
+ int var3 = 0;
+ this.field_1431_B = 0;
+ this.field_1430_C = 0;
+ this.field_1429_D = 0;
+ this.field_1428_E = this.field_1443_p;
+ this.field_1427_F = this.field_1442_q;
+ this.field_1426_G = this.field_1441_r;
+
+ int var4;
+ for(var4 = 0; var4 < this.field_1446_m.size(); ++var4) {
+ ((WorldRenderer)this.field_1446_m.get(var4)).needsUpdate = false;
+ }
+
+ this.field_1446_m.clear();
+ this.field_1458_a.clear();
+
+ for(var4 = 0; var4 < this.field_1443_p; ++var4) {
+ for(int var5 = 0; var5 < this.field_1442_q; ++var5) {
+ for(int var6 = 0; var6 < this.field_1441_r; ++var6) {
+ this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4] = new WorldRenderer(this.worldObj, this.field_1458_a, var4 * 16, var5 * 16, var6 * 16, 16, this.field_1440_s + var2);
+ this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].field_1733_y = false;
+ this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].field_1734_x = true;
+ this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].field_1749_o = true;
+ this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].field_1735_w = var3++;
+ this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4].MarkDirty();
+ this.field_1445_n[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4] = this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4];
+ this.field_1446_m.add(this.field_1444_o[(var6 * this.field_1442_q + var5) * this.field_1443_p + var4]);
+ var2 += 3;
+ }
+ }
+ }
+
+ if(this.worldObj != null) {
+ EntityPlayerSP var7 = this.mc.thePlayer;
+ this.func_956_b(MathHelper.floor_double(var7.posX), MathHelper.floor_double(var7.posY), MathHelper.floor_double(var7.posZ));
+ Arrays.sort(this.field_1445_n, new EntitySorter(var7));
+ }
+
+ this.field_1424_I = 2;
+ }
+
+ public void func_951_a(Vec3D var1, ICamera var2, float var3) {
+ if(this.field_1424_I > 0) {
+ --this.field_1424_I;
+ } else {
+ TileEntityRenderer.instance.setRenderingContext(this.worldObj, this.renderEngine, this.mc.fontRenderer, this.mc.thePlayer, var3);
+ RenderManager.instance.func_857_a(this.worldObj, this.renderEngine, this.mc.fontRenderer, this.mc.thePlayer, this.mc.gameSettings, var3);
+ this.field_1423_J = 0;
+ this.field_1422_K = 0;
+ this.field_1421_L = 0;
+ EntityPlayerSP var4 = this.mc.thePlayer;
+ RenderManager.field_1232_b = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)var3;
+ RenderManager.field_1231_c = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)var3;
+ RenderManager.field_1230_d = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)var3;
+ TileEntityRenderer.staticPlayerX = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)var3;
+ TileEntityRenderer.staticPlayerY = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)var3;
+ TileEntityRenderer.staticPlayerZ = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)var3;
+ List var5 = this.worldObj.func_658_i();
+ this.field_1423_J = var5.size();
+
+ int var6;
+ for(var6 = 0; var6 < var5.size(); ++var6) {
+ Entity var7 = (Entity)var5.get(var6);
+ if(var7.func_390_a(var1) && var2.func_342_a(var7.boundingBox) && (var7 != this.mc.thePlayer || this.mc.gameSettings.thirdPersonView)) {
+ ++this.field_1422_K;
+ RenderManager.instance.func_854_a(var7, var3);
+ }
+ }
+
+ for(var6 = 0; var6 < this.field_1458_a.size(); ++var6) {
+ TileEntityRenderer.instance.renderTileEntity((TileEntity)this.field_1458_a.get(var6), var3);
+ }
+
+ }
+ }
+
+ public String func_953_b() {
+ return "C: " + this.field_1417_P + "/" + this.field_1420_M + ". F: " + this.field_1419_N + ", O: " + this.field_1418_O + ", E: " + this.field_1416_Q;
+ }
+
+ public String func_957_c() {
+ return "E: " + this.field_1422_K + "/" + this.field_1423_J + ". B: " + this.field_1421_L + ", I: " + (this.field_1423_J - this.field_1421_L - this.field_1422_K);
+ }
+
+ private void func_956_b(int var1, int var2, int var3) {
+ var1 -= 8;
+ var2 -= 8;
+ var3 -= 8;
+ this.field_1431_B = Integer.MAX_VALUE;
+ this.field_1430_C = Integer.MAX_VALUE;
+ this.field_1429_D = Integer.MAX_VALUE;
+ this.field_1428_E = Integer.MIN_VALUE;
+ this.field_1427_F = Integer.MIN_VALUE;
+ this.field_1426_G = Integer.MIN_VALUE;
+ int var4 = this.field_1443_p * 16;
+ int var5 = var4 / 2;
+
+ for(int var6 = 0; var6 < this.field_1443_p; ++var6) {
+ int var7 = var6 * 16;
+ int var8 = var7 + var5 - var1;
+ if(var8 < 0) {
+ var8 -= var4 - 1;
+ }
+
+ var8 /= var4;
+ var7 -= var8 * var4;
+ if(var7 < this.field_1431_B) {
+ this.field_1431_B = var7;
+ }
+
+ if(var7 > this.field_1428_E) {
+ this.field_1428_E = var7;
+ }
+
+ for(int var9 = 0; var9 < this.field_1441_r; ++var9) {
+ int var10 = var9 * 16;
+ int var11 = var10 + var5 - var3;
+ if(var11 < 0) {
+ var11 -= var4 - 1;
+ }
+
+ var11 /= var4;
+ var10 -= var11 * var4;
+ if(var10 < this.field_1429_D) {
+ this.field_1429_D = var10;
+ }
+
+ if(var10 > this.field_1426_G) {
+ this.field_1426_G = var10;
+ }
+
+ for(int var12 = 0; var12 < this.field_1442_q; ++var12) {
+ int var13 = var12 * 16;
+ if(var13 < this.field_1430_C) {
+ this.field_1430_C = var13;
+ }
+
+ if(var13 > this.field_1427_F) {
+ this.field_1427_F = var13;
+ }
+
+ WorldRenderer var14 = this.field_1444_o[(var9 * this.field_1442_q + var12) * this.field_1443_p + var6];
+ boolean var15 = var14.needsUpdate;
+ var14.func_1197_a(var7, var13, var10);
+ if(!var15 && var14.needsUpdate) {
+ this.field_1446_m.add(var14);
+ }
+ }
+ }
+ }
+
+ }
+
+ public int func_943_a(EntityPlayer var1, int var2, double var3) {
+ if(this.mc.gameSettings.renderDistance != this.field_1425_H) {
+ this.func_958_a();
+ }
+
+ if(var2 == 0) {
+ this.field_1420_M = 0;
+ this.field_1419_N = 0;
+ this.field_1418_O = 0;
+ this.field_1417_P = 0;
+ this.field_1416_Q = 0;
+ }
+
+ double var5 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * var3;
+ double var7 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * var3;
+ double var9 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * var3;
+ double var11 = var1.posX - this.field_1453_f;
+ double var13 = var1.posY - this.field_1452_g;
+ double var15 = var1.posZ - this.field_1451_h;
+ if(var11 * var11 + var13 * var13 + var15 * var15 > 16.0D) {
+ this.field_1453_f = var1.posX;
+ this.field_1452_g = var1.posY;
+ this.field_1451_h = var1.posZ;
+ this.func_956_b(MathHelper.floor_double(var1.posX), MathHelper.floor_double(var1.posY), MathHelper.floor_double(var1.posZ));
+ Arrays.sort(this.field_1445_n, new EntitySorter(var1));
+ }
+
+ byte var17 = 0;
+ int var33 = var17 + this.func_952_a(0, this.field_1445_n.length, var2, var3);
+ return var33;
+ }
+
+ private int func_952_a(int var1, int var2, int var3, double var4) {
+ this.field_1415_R.clear();
+ int var6 = 0;
+
+ for(int var7 = var1; var7 < var2; ++var7) {
+ if(var3 == 0) {
+ ++this.field_1420_M;
+ if(this.field_1445_n[var7].field_1748_p[var3]) {
+ ++this.field_1416_Q;
+ } else if(!this.field_1445_n[var7].field_1749_o) {
+ ++this.field_1419_N;
+ } else {
+ ++this.field_1417_P;
+ }
+ }
+
+ if(!this.field_1445_n[var7].field_1748_p[var3] && this.field_1445_n[var7].field_1749_o && this.field_1445_n[var7].field_1734_x) {
+ int var8 = this.field_1445_n[var7].func_1200_a(var3);
+ if(var8 >= 0) {
+ this.field_1415_R.add(this.field_1445_n[var7]);
+ ++var6;
+ }
+ }
+ }
+
+ EntityPlayerSP var19 = this.mc.thePlayer;
+ double var20 = var19.lastTickPosX + (var19.posX - var19.lastTickPosX) * var4;
+ double var10 = var19.lastTickPosY + (var19.posY - var19.lastTickPosY) * var4;
+ double var12 = var19.lastTickPosZ + (var19.posZ - var19.lastTickPosZ) * var4;
+ int var14 = 0;
+
+ int var15;
+ for(var15 = 0; var15 < this.field_1414_S.length; ++var15) {
+ this.field_1414_S[var15].func_859_b();
+ }
+
+ for(var15 = 0; var15 < this.field_1415_R.size(); ++var15) {
+ WorldRenderer var16 = (WorldRenderer)this.field_1415_R.get(var15);
+ int var17 = -1;
+
+ for(int var18 = 0; var18 < var14; ++var18) {
+ if(this.field_1414_S[var18].func_862_a(var16.field_1755_i, var16.field_1754_j, var16.field_1753_k)) {
+ var17 = var18;
+ }
+ }
+
+ if(var17 < 0) {
+ var17 = var14++;
+ this.field_1414_S[var17].func_861_a(var16.field_1755_i, var16.field_1754_j, var16.field_1753_k, var20, var10, var12);
+ }
+
+ this.field_1414_S[var17].func_858_a(var16.func_1200_a(var3));
+ }
+
+ this.func_944_a(var3, var4);
+ return var6;
+ }
+
+ public void func_944_a(int var1, double var2) {
+ for(int var4 = 0; var4 < this.field_1414_S.length; ++var4) {
+ this.field_1414_S[var4].func_860_a();
+ }
+
+ }
+
+ public void func_945_d() {
+ ++this.field_1435_x;
+ }
+
+ public void func_4142_a(float var1) {
+ if(!this.mc.theWorld.worldProvider.field_4220_c) {
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ Vec3D var2 = this.worldObj.func_4079_a(this.mc.thePlayer, var1);
+ float var3 = (float)var2.xCoord;
+ float var4 = (float)var2.yCoord;
+ float var5 = (float)var2.zCoord;
+ float var7;
+ float var8;
+ if(this.mc.gameSettings.anaglyph) {
+ float var6 = (var3 * 30.0F + var4 * 59.0F + var5 * 11.0F) / 100.0F;
+ var7 = (var3 * 30.0F + var4 * 70.0F) / 100.0F;
+ var8 = (var3 * 30.0F + var5 * 70.0F) / 100.0F;
+ var3 = var6;
+ var4 = var7;
+ var5 = var8;
+ }
+
+ GL11.glColor3f(var3, var4, var5);
+ Tessellator var14 = Tessellator.instance;
+ GL11.glDepthMask(false);
+ GL11.glEnable(GL11.GL_FOG);
+ GL11.glColor3f(var3, var4, var5);
+ GL11.glCallList(this.field_1433_z);
+ GL11.glDisable(GL11.GL_FOG);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ float[] var15 = this.worldObj.worldProvider.func_4097_b(this.worldObj.getCelestialAngle(var1), var1);
+ float var11;
+ if(var15 != null) {
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glShadeModel(GL11.GL_SMOOTH);
+ GL11.glPushMatrix();
+ GL11.glRotatef(90.0F, 1.0F, 0.0F, 0.0F);
+ var8 = this.worldObj.getCelestialAngle(var1);
+ GL11.glRotatef(var8 > 0.5F ? 180.0F : 0.0F, 0.0F, 0.0F, 1.0F);
+ var14.startDrawing(6);
+ var14.setColorRGBA_F(var15[0], var15[1], var15[2], var15[3]);
+ var14.addVertex(0.0D, 100.0D, 0.0D);
+ byte var9 = 16;
+ var14.setColorRGBA_F(var15[0], var15[1], var15[2], 0.0F);
+
+ for(int var10 = 0; var10 <= var9; ++var10) {
+ var11 = (float)var10 * (float)Math.PI * 2.0F / (float)var9;
+ float var12 = MathHelper.sin(var11);
+ float var13 = MathHelper.cos(var11);
+ var14.addVertex((double)(var12 * 120.0F), (double)(var13 * 120.0F), (double)(-var13 * 40.0F * var15[3]));
+ }
+
+ var14.draw();
+ GL11.glPopMatrix();
+ GL11.glShadeModel(GL11.GL_FLAT);
+ }
+
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+ GL11.glPushMatrix();
+ var7 = 0.0F;
+ var8 = 0.0F;
+ float var16 = 0.0F;
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glTranslatef(var7, var8, var16);
+ GL11.glRotatef(0.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(this.worldObj.getCelestialAngle(var1) * 360.0F, 1.0F, 0.0F, 0.0F);
+ float var17 = 30.0F;
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/sun.png"));
+ var14.startDrawingQuads();
+ var14.addVertexWithUV((double)(-var17), 100.0D, (double)(-var17), 0.0D, 0.0D);
+ var14.addVertexWithUV((double)var17, 100.0D, (double)(-var17), 1.0D, 0.0D);
+ var14.addVertexWithUV((double)var17, 100.0D, (double)var17, 1.0D, 1.0D);
+ var14.addVertexWithUV((double)(-var17), 100.0D, (double)var17, 0.0D, 1.0D);
+ var14.draw();
+ var17 = 20.0F;
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/terrain/moon.png"));
+ var14.startDrawingQuads();
+ var14.addVertexWithUV((double)(-var17), -100.0D, (double)var17, 1.0D, 1.0D);
+ var14.addVertexWithUV((double)var17, -100.0D, (double)var17, 0.0D, 1.0D);
+ var14.addVertexWithUV((double)var17, -100.0D, (double)(-var17), 0.0D, 0.0D);
+ var14.addVertexWithUV((double)(-var17), -100.0D, (double)(-var17), 1.0D, 0.0D);
+ var14.draw();
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ var11 = this.worldObj.func_679_f(var1);
+ if(var11 > 0.0F) {
+ GL11.glColor4f(var11, var11, var11, var11);
+ GL11.glCallList(this.field_1434_y);
+ }
+
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glEnable(GL11.GL_FOG);
+ GL11.glPopMatrix();
+ GL11.glColor3f(var3 * 0.2F + 0.04F, var4 * 0.2F + 0.04F, var5 * 0.6F + 0.1F);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glCallList(this.field_1432_A);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ GL11.glDepthMask(true);
+ }
+ }
+
+ public void func_4141_b(float var1) {
+ if(!this.mc.theWorld.worldProvider.field_4220_c) {
+ if(this.mc.gameSettings.fancyGraphics) {
+ this.func_6510_c(var1);
+ } else {
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ float var2 = (float)(this.mc.thePlayer.lastTickPosY + (this.mc.thePlayer.posY - this.mc.thePlayer.lastTickPosY) * (double)var1);
+ byte var3 = 32;
+ int var4 = 256 / var3;
+ Tessellator var5 = Tessellator.instance;
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/environment/clouds.png"));
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ Vec3D var6 = this.worldObj.func_628_d(var1);
+ float var7 = (float)var6.xCoord;
+ float var8 = (float)var6.yCoord;
+ float var9 = (float)var6.zCoord;
+ float var10;
+ if(this.mc.gameSettings.anaglyph) {
+ var10 = (var7 * 30.0F + var8 * 59.0F + var9 * 11.0F) / 100.0F;
+ float var11 = (var7 * 30.0F + var8 * 70.0F) / 100.0F;
+ float var12 = (var7 * 30.0F + var9 * 70.0F) / 100.0F;
+ var7 = var10;
+ var8 = var11;
+ var9 = var12;
+ }
+
+ var10 = 0.5F / 1024.0F;
+ double var22 = this.mc.thePlayer.prevPosX + (this.mc.thePlayer.posX - this.mc.thePlayer.prevPosX) * (double)var1 + (double)(((float)this.field_1435_x + var1) * 0.03F);
+ double var13 = this.mc.thePlayer.prevPosZ + (this.mc.thePlayer.posZ - this.mc.thePlayer.prevPosZ) * (double)var1;
+ int var15 = MathHelper.floor_double(var22 / 2048.0D);
+ int var16 = MathHelper.floor_double(var13 / 2048.0D);
+ var22 -= (double)(var15 * 2048);
+ var13 -= (double)(var16 * 2048);
+ float var17 = 120.0F - var2 + 0.33F;
+ float var18 = (float)(var22 * (double)var10);
+ float var19 = (float)(var13 * (double)var10);
+ var5.startDrawingQuads();
+ var5.setColorRGBA_F(var7, var8, var9, 0.8F);
+
+ for(int var20 = -var3 * var4; var20 < var3 * var4; var20 += var3) {
+ for(int var21 = -var3 * var4; var21 < var3 * var4; var21 += var3) {
+ var5.addVertexWithUV((double)(var20 + 0), (double)var17, (double)(var21 + var3), (double)((float)(var20 + 0) * var10 + var18), (double)((float)(var21 + var3) * var10 + var19));
+ var5.addVertexWithUV((double)(var20 + var3), (double)var17, (double)(var21 + var3), (double)((float)(var20 + var3) * var10 + var18), (double)((float)(var21 + var3) * var10 + var19));
+ var5.addVertexWithUV((double)(var20 + var3), (double)var17, (double)(var21 + 0), (double)((float)(var20 + var3) * var10 + var18), (double)((float)(var21 + 0) * var10 + var19));
+ var5.addVertexWithUV((double)(var20 + 0), (double)var17, (double)(var21 + 0), (double)((float)(var20 + 0) * var10 + var18), (double)((float)(var21 + 0) * var10 + var19));
+ }
+ }
+
+ var5.draw();
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ }
+ }
+ }
+
+ public void func_6510_c(float var1) {
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ float var2 = (float)(this.mc.thePlayer.lastTickPosY + (this.mc.thePlayer.posY - this.mc.thePlayer.lastTickPosY) * (double)var1);
+ Tessellator var3 = Tessellator.instance;
+ float var4 = 12.0F;
+ float var5 = 4.0F;
+ double var6 = (this.mc.thePlayer.prevPosX + (this.mc.thePlayer.posX - this.mc.thePlayer.prevPosX) * (double)var1 + (double)(((float)this.field_1435_x + var1) * 0.03F)) / (double)var4;
+ double var8 = (this.mc.thePlayer.prevPosZ + (this.mc.thePlayer.posZ - this.mc.thePlayer.prevPosZ) * (double)var1) / (double)var4 + (double)0.33F;
+ float var10 = 108.0F - var2 + 0.33F;
+ int var11 = MathHelper.floor_double(var6 / 2048.0D);
+ int var12 = MathHelper.floor_double(var8 / 2048.0D);
+ var6 -= (double)(var11 * 2048);
+ var8 -= (double)(var12 * 2048);
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.renderEngine.getTexture("/environment/clouds.png"));
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ Vec3D var13 = this.worldObj.func_628_d(var1);
+ float var14 = (float)var13.xCoord;
+ float var15 = (float)var13.yCoord;
+ float var16 = (float)var13.zCoord;
+ float var17;
+ float var18;
+ float var19;
+ if(this.mc.gameSettings.anaglyph) {
+ var17 = (var14 * 30.0F + var15 * 59.0F + var16 * 11.0F) / 100.0F;
+ var18 = (var14 * 30.0F + var15 * 70.0F) / 100.0F;
+ var19 = (var14 * 30.0F + var16 * 70.0F) / 100.0F;
+ var14 = var17;
+ var15 = var18;
+ var16 = var19;
+ }
+
+ var17 = (float)(var6 * 0.0D);
+ var18 = (float)(var8 * 0.0D);
+ var19 = 0.00390625F;
+ var17 = (float)MathHelper.floor_double(var6) * var19;
+ var18 = (float)MathHelper.floor_double(var8) * var19;
+ float var20 = (float)(var6 - (double)MathHelper.floor_double(var6));
+ float var21 = (float)(var8 - (double)MathHelper.floor_double(var8));
+ byte var22 = 8;
+ byte var23 = 3;
+ float var24 = 1.0F / 1024.0F;
+ GL11.glScalef(var4, 1.0F, var4);
+
+ for(int var25 = 0; var25 < 2; ++var25) {
+ if(var25 == 0) {
+ GL11.glColorMask(false, false, false, false);
+ } else {
+ GL11.glColorMask(true, true, true, true);
+ }
+
+ for(int var26 = -var23 + 1; var26 <= var23; ++var26) {
+ for(int var27 = -var23 + 1; var27 <= var23; ++var27) {
+ var3.startDrawingQuads();
+ float var28 = (float)(var26 * var22);
+ float var29 = (float)(var27 * var22);
+ float var30 = var28 - var20;
+ float var31 = var29 - var21;
+ if(var10 > -var5 - 1.0F) {
+ var3.setColorRGBA_F(var14 * 0.7F, var15 * 0.7F, var16 * 0.7F, 0.8F);
+ var3.setNormal(0.0F, -1.0F, 0.0F);
+ var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + (float)var22), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + 0.0F), (double)(var31 + (float)var22), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + 0.0F), (double)(var31 + 0.0F), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + 0.0F), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18));
+ }
+
+ if(var10 <= var5 + 1.0F) {
+ var3.setColorRGBA_F(var14, var15, var16, 0.8F);
+ var3.setNormal(0.0F, 1.0F, 0.0F);
+ var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + var5 - var24), (double)(var31 + (float)var22), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + var5 - var24), (double)(var31 + (float)var22), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + var5 - var24), (double)(var31 + 0.0F), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + var5 - var24), (double)(var31 + 0.0F), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18));
+ }
+
+ var3.setColorRGBA_F(var14 * 0.9F, var15 * 0.9F, var16 * 0.9F, 0.8F);
+ int var32;
+ if(var26 > -1) {
+ var3.setNormal(-1.0F, 0.0F, 0.0F);
+
+ for(var32 = 0; var32 < var22; ++var32) {
+ var3.addVertexWithUV((double)(var30 + (float)var32 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + (float)var22), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var32 + 0.0F), (double)(var10 + var5), (double)(var31 + (float)var22), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var32 + 0.0F), (double)(var10 + var5), (double)(var31 + 0.0F), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var32 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + 0.0F), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18));
+ }
+ }
+
+ if(var26 <= 1) {
+ var3.setNormal(1.0F, 0.0F, 0.0F);
+
+ for(var32 = 0; var32 < var22; ++var32) {
+ var3.addVertexWithUV((double)(var30 + (float)var32 + 1.0F - var24), (double)(var10 + 0.0F), (double)(var31 + (float)var22), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var32 + 1.0F - var24), (double)(var10 + var5), (double)(var31 + (float)var22), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + (float)var22) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var32 + 1.0F - var24), (double)(var10 + var5), (double)(var31 + 0.0F), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var32 + 1.0F - var24), (double)(var10 + 0.0F), (double)(var31 + 0.0F), (double)((var28 + (float)var32 + 0.5F) * var19 + var17), (double)((var29 + 0.0F) * var19 + var18));
+ }
+ }
+
+ var3.setColorRGBA_F(var14 * 0.8F, var15 * 0.8F, var16 * 0.8F, 0.8F);
+ if(var27 > -1) {
+ var3.setNormal(0.0F, 0.0F, -1.0F);
+
+ for(var32 = 0; var32 < var22; ++var32) {
+ var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + var5), (double)(var31 + (float)var32 + 0.0F), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + var5), (double)(var31 + (float)var32 + 0.0F), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + 0.0F), (double)(var31 + (float)var32 + 0.0F), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + (float)var32 + 0.0F), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18));
+ }
+ }
+
+ if(var27 <= 1) {
+ var3.setNormal(0.0F, 0.0F, 1.0F);
+
+ for(var32 = 0; var32 < var22; ++var32) {
+ var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + var5), (double)(var31 + (float)var32 + 1.0F - var24), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + var5), (double)(var31 + (float)var32 + 1.0F - var24), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + (float)var22), (double)(var10 + 0.0F), (double)(var31 + (float)var32 + 1.0F - var24), (double)((var28 + (float)var22) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18));
+ var3.addVertexWithUV((double)(var30 + 0.0F), (double)(var10 + 0.0F), (double)(var31 + (float)var32 + 1.0F - var24), (double)((var28 + 0.0F) * var19 + var17), (double)((var29 + (float)var32 + 0.5F) * var19 + var18));
+ }
+ }
+
+ var3.draw();
+ }
+ }
+ }
+
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ }
+
+ public boolean func_948_a(EntityPlayer var1, boolean var2) {
+ Collections.sort(this.field_1446_m, new RenderSorter(var1));
+ int var3 = this.field_1446_m.size() - 1;
+ int var4 = this.field_1446_m.size();
+
+ for(int var5 = 0; var5 < var4; ++var5) {
+ WorldRenderer var6 = (WorldRenderer)this.field_1446_m.get(var3 - var5);
+ if(!var2) {
+ if(var6.func_1202_a(var1) > 1024.0F) {
+ if(var6.field_1749_o) {
+ if(var5 >= 3) {
+ return false;
+ }
+ } else if(var5 >= 1) {
+ return false;
+ }
+ }
+ } else if(!var6.field_1749_o) {
+ continue;
+ }
+
+ var6.func_1198_a();
+ this.field_1446_m.remove(var6);
+ var6.needsUpdate = false;
+ }
+
+ return this.field_1446_m.size() == 0;
+ }
+
+ public void func_959_a(EntityPlayer var1, MovingObjectPosition var2, int var3, ItemStack var4, float var5) {
+ Tessellator var6 = Tessellator.instance;
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, (MathHelper.sin((float)System.currentTimeMillis() / 100.0F) * 0.2F + 0.4F) * 0.5F);
+ int var8;
+ if(var3 == 0) {
+ if(this.field_1450_i > 0.0F) {
+ GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR);
+ int var7 = this.renderEngine.getTexture("/terrain.png");
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var7);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F);
+ GL11.glPushMatrix();
+ var8 = this.worldObj.getBlockId(var2.blockX, var2.blockY, var2.blockZ);
+ Block var9 = var8 > 0 ? Block.blocksList[var8] : null;
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glPolygonOffset(-3.0F, -3.0F);
+ GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL);
+ var6.startDrawingQuads();
+ double var10 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var5;
+ double var12 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var5;
+ double var14 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var5;
+ var6.setTranslationD(-var10, -var12, -var14);
+ var6.disableColor();
+ if(var9 == null) {
+ var9 = Block.stone;
+ }
+
+ this.field_1438_u.renderBlockUsingTexture(var9, var2.blockX, var2.blockY, var2.blockZ, 240 + (int)(this.field_1450_i * 10.0F));
+ var6.draw();
+ var6.setTranslationD(0.0D, 0.0D, 0.0D);
+ GL11.glPolygonOffset(0.0F, 0.0F);
+ GL11.glDisable(GL11.GL_POLYGON_OFFSET_FILL);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glDepthMask(true);
+ GL11.glPopMatrix();
+ }
+ } else if(var4 != null) {
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ float var16 = MathHelper.sin((float)System.currentTimeMillis() / 100.0F) * 0.2F + 0.8F;
+ GL11.glColor4f(var16, var16, var16, MathHelper.sin((float)System.currentTimeMillis() / 200.0F) * 0.2F + 0.5F);
+ var8 = this.renderEngine.getTexture("/terrain.png");
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var8);
+ int var17 = var2.blockX;
+ int var18 = var2.blockY;
+ int var11 = var2.blockZ;
+ if(var2.sideHit == 0) {
+ --var18;
+ }
+
+ if(var2.sideHit == 1) {
+ ++var18;
+ }
+
+ if(var2.sideHit == 2) {
+ --var11;
+ }
+
+ if(var2.sideHit == 3) {
+ ++var11;
+ }
+
+ if(var2.sideHit == 4) {
+ --var17;
+ }
+
+ if(var2.sideHit == 5) {
+ ++var17;
+ }
+ }
+
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ }
+
+ public void drawSelectionBox(EntityPlayer var1, MovingObjectPosition var2, int var3, ItemStack var4, float var5) {
+ if(var3 == 0 && var2.typeOfHit == 0) {
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F);
+ GL11.glLineWidth(2.0F);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glDepthMask(false);
+ float var6 = 0.002F;
+ int var7 = this.worldObj.getBlockId(var2.blockX, var2.blockY, var2.blockZ);
+ if(var7 > 0) {
+ Block.blocksList[var7].setBlockBoundsBasedOnState(this.worldObj, var2.blockX, var2.blockY, var2.blockZ);
+ double var8 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var5;
+ double var10 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var5;
+ double var12 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var5;
+ this.drawOutlinedBoundingBox(Block.blocksList[var7].getSelectedBoundingBoxFromPool(this.worldObj, var2.blockX, var2.blockY, var2.blockZ).expands((double)var6, (double)var6, (double)var6).getOffsetBoundingBox(-var8, -var10, -var12));
+ }
+
+ GL11.glDepthMask(true);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ GL11.glDisable(GL11.GL_BLEND);
+ }
+
+ }
+
+ private void drawOutlinedBoundingBox(AxisAlignedBB var1) {
+ Tessellator var2 = Tessellator.instance;
+ var2.startDrawing(3);
+ var2.addVertex(var1.minX, var1.minY, var1.minZ);
+ var2.addVertex(var1.maxX, var1.minY, var1.minZ);
+ var2.addVertex(var1.maxX, var1.minY, var1.maxZ);
+ var2.addVertex(var1.minX, var1.minY, var1.maxZ);
+ var2.addVertex(var1.minX, var1.minY, var1.minZ);
+ var2.draw();
+ var2.startDrawing(3);
+ var2.addVertex(var1.minX, var1.maxY, var1.minZ);
+ var2.addVertex(var1.maxX, var1.maxY, var1.minZ);
+ var2.addVertex(var1.maxX, var1.maxY, var1.maxZ);
+ var2.addVertex(var1.minX, var1.maxY, var1.maxZ);
+ var2.addVertex(var1.minX, var1.maxY, var1.minZ);
+ var2.draw();
+ var2.startDrawing(1);
+ var2.addVertex(var1.minX, var1.minY, var1.minZ);
+ var2.addVertex(var1.minX, var1.maxY, var1.minZ);
+ var2.addVertex(var1.maxX, var1.minY, var1.minZ);
+ var2.addVertex(var1.maxX, var1.maxY, var1.minZ);
+ var2.addVertex(var1.maxX, var1.minY, var1.maxZ);
+ var2.addVertex(var1.maxX, var1.maxY, var1.maxZ);
+ var2.addVertex(var1.minX, var1.minY, var1.maxZ);
+ var2.addVertex(var1.minX, var1.maxY, var1.maxZ);
+ var2.draw();
+ }
+
+ public void func_949_a(int var1, int var2, int var3, int var4, int var5, int var6) {
+ int var7 = MathHelper.bucketInt(var1, 16);
+ int var8 = MathHelper.bucketInt(var2, 16);
+ int var9 = MathHelper.bucketInt(var3, 16);
+ int var10 = MathHelper.bucketInt(var4, 16);
+ int var11 = MathHelper.bucketInt(var5, 16);
+ int var12 = MathHelper.bucketInt(var6, 16);
+
+ for(int var13 = var7; var13 <= var10; ++var13) {
+ int var14 = var13 % this.field_1443_p;
+ if(var14 < 0) {
+ var14 += this.field_1443_p;
+ }
+
+ for(int var15 = var8; var15 <= var11; ++var15) {
+ int var16 = var15 % this.field_1442_q;
+ if(var16 < 0) {
+ var16 += this.field_1442_q;
+ }
+
+ for(int var17 = var9; var17 <= var12; ++var17) {
+ int var18 = var17 % this.field_1441_r;
+ if(var18 < 0) {
+ var18 += this.field_1441_r;
+ }
+
+ int var19 = (var18 * this.field_1442_q + var16) * this.field_1443_p + var14;
+ WorldRenderer var20 = this.field_1444_o[var19];
+ if(!var20.needsUpdate) {
+ this.field_1446_m.add(var20);
+ }
+
+ var20.MarkDirty();
+ }
+ }
+ }
+
+ }
+
+ public void func_934_a(int var1, int var2, int var3) {
+ this.func_949_a(var1 - 1, var2 - 1, var3 - 1, var1 + 1, var2 + 1, var3 + 1);
+ }
+
+ public void func_937_b(int var1, int var2, int var3, int var4, int var5, int var6) {
+ this.func_949_a(var1 - 1, var2 - 1, var3 - 1, var4 + 1, var5 + 1, var6 + 1);
+ }
+
+ public void func_960_a(ICamera var1, float var2) {
+ for(int var3 = 0; var3 < this.field_1444_o.length; ++var3) {
+ if(!this.field_1444_o[var3].func_1196_e() && (!this.field_1444_o[var3].field_1749_o || (var3 + this.field_1449_j & 15) == 0)) {
+ this.field_1444_o[var3].func_1199_a(var1);
+ }
+ }
+
+ ++this.field_1449_j;
+ }
+
+ public void playRecord(String var1, int var2, int var3, int var4) {
+ if(var1 != null) {
+ this.mc.ingameGUI.func_553_b("C418 - " + var1);
+ }
+
+ }
+
+ public void playSound(String var1, double var2, double var4, double var6, float var8, float var9) {
+ float var10 = 16.0F;
+ if(var8 > 1.0F) {
+ var10 *= var8;
+ }
+ }
+
+ public void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ double var14 = this.mc.thePlayer.posX - var2;
+ double var16 = this.mc.thePlayer.posY - var4;
+ double var18 = this.mc.thePlayer.posZ - var6;
+ if(var14 * var14 + var16 * var16 + var18 * var18 <= 256.0D) {
+ if(var1 == "bubble") {
+ this.mc.field_6321_h.func_1192_a(new EntityBubbleFX(this.worldObj, var2, var4, var6, var8, var10, var12));
+ } else if(var1 == "smoke") {
+ this.mc.field_6321_h.func_1192_a(new EntitySmokeFX(this.worldObj, var2, var4, var6));
+ } else if(var1 == "portal") {
+ this.mc.field_6321_h.func_1192_a(new EntityPortalFX(this.worldObj, var2, var4, var6, var8, var10, var12));
+ } else if(var1 == "explode") {
+ this.mc.field_6321_h.func_1192_a(new EntityExplodeFX(this.worldObj, var2, var4, var6, var8, var10, var12));
+ } else if(var1 == "flame") {
+ this.mc.field_6321_h.func_1192_a(new EntityFlameFX(this.worldObj, var2, var4, var6, var8, var10, var12));
+ } else if(var1 == "lava") {
+ this.mc.field_6321_h.func_1192_a(new EntityLavaFX(this.worldObj, var2, var4, var6));
+ } else if(var1 == "splash") {
+ this.mc.field_6321_h.func_1192_a(new EntitySplashFX(this.worldObj, var2, var4, var6, var8, var10, var12));
+ } else if(var1 == "largesmoke") {
+ this.mc.field_6321_h.func_1192_a(new EntitySmokeFX(this.worldObj, var2, var4, var6, 2.5F));
+ } else if(var1 == "reddust") {
+ this.mc.field_6321_h.func_1192_a(new EntityReddustFX(this.worldObj, var2, var4, var6));
+ } else if(var1 == "snowballpoof") {
+ this.mc.field_6321_h.func_1192_a(new EntitySlimeFX(this.worldObj, var2, var4, var6, Item.snowball));
+ } else if(var1 == "slime") {
+ this.mc.field_6321_h.func_1192_a(new EntitySlimeFX(this.worldObj, var2, var4, var6, Item.slimeBall));
+ }
+
+ }
+ }
+
+ public void obtainEntitySkin(Entity var1) {
+
+ }
+
+ public void releaseEntitySkin(Entity var1) {
+
+ }
+
+ public void func_936_e() {
+ for(int var1 = 0; var1 < this.field_1444_o.length; ++var1) {
+ if(this.field_1444_o[var1].field_1747_A) {
+ if(!this.field_1444_o[var1].needsUpdate) {
+ this.field_1446_m.add(this.field_1444_o[var1]);
+ }
+
+ this.field_1444_o[var1].MarkDirty();
+ }
+ }
+
+ }
+
+ public void func_935_a(int var1, int var2, int var3, TileEntity var4) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderHelper.java b/src/main/java/net/minecraft/src/RenderHelper.java
new file mode 100644
index 0000000..c93e990
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderHelper.java
@@ -0,0 +1,49 @@
+package net.minecraft.src;
+
+import java.nio.FloatBuffer;
+import org.lwjgl.opengl.GL11;
+
+public class RenderHelper {
+ private static FloatBuffer field_1695_a = GLAllocation.createDirectFloatBuffer(16);
+
+ public static void disableStandardItemLighting() {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_LIGHT0);
+ GL11.glDisable(GL11.GL_LIGHT1);
+ GL11.glDisable(GL11.GL_COLOR_MATERIAL);
+ }
+
+ public static void enableStandardItemLighting() {
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_LIGHT0);
+ GL11.glEnable(GL11.GL_LIGHT1);
+ GL11.glEnable(GL11.GL_COLOR_MATERIAL);
+ GL11.glColorMaterial(GL11.GL_FRONT_AND_BACK, GL11.GL_AMBIENT_AND_DIFFUSE);
+ float var0 = 0.4F;
+ float var1 = 0.6F;
+ float var2 = 0.0F;
+ Vec3D var3 = Vec3D.createVector((double)0.2F, 1.0D, (double)-0.7F).normalize();
+ GL11.glLight(GL11.GL_LIGHT0, GL11.GL_POSITION, func_1157_a(var3.xCoord, var3.yCoord, var3.zCoord, 0.0D));
+ GL11.glLight(GL11.GL_LIGHT0, GL11.GL_DIFFUSE, func_1156_a(var1, var1, var1, 1.0F));
+ GL11.glLight(GL11.GL_LIGHT0, GL11.GL_AMBIENT, func_1156_a(0.0F, 0.0F, 0.0F, 1.0F));
+ GL11.glLight(GL11.GL_LIGHT0, GL11.GL_SPECULAR, func_1156_a(var2, var2, var2, 1.0F));
+ var3 = Vec3D.createVector((double)-0.2F, 1.0D, (double)0.7F).normalize();
+ GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, func_1157_a(var3.xCoord, var3.yCoord, var3.zCoord, 0.0D));
+ GL11.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, func_1156_a(var1, var1, var1, 1.0F));
+ GL11.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, func_1156_a(0.0F, 0.0F, 0.0F, 1.0F));
+ GL11.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR, func_1156_a(var2, var2, var2, 1.0F));
+ GL11.glShadeModel(GL11.GL_FLAT);
+ GL11.glLightModel(GL11.GL_LIGHT_MODEL_AMBIENT, func_1156_a(var0, var0, var0, 1.0F));
+ }
+
+ private static FloatBuffer func_1157_a(double var0, double var2, double var4, double var6) {
+ return func_1156_a((float)var0, (float)var2, (float)var4, (float)var6);
+ }
+
+ private static FloatBuffer func_1156_a(float var0, float var1, float var2, float var3) {
+ field_1695_a.clear();
+ field_1695_a.put(var0).put(var1).put(var2).put(var3);
+ field_1695_a.flip();
+ return field_1695_a;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderItem.java b/src/main/java/net/minecraft/src/RenderItem.java
new file mode 100644
index 0000000..2d20c35
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderItem.java
@@ -0,0 +1,195 @@
+package net.minecraft.src;
+
+import java.util.Random;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class RenderItem extends Render {
+ private RenderBlocks renderBlocks = new RenderBlocks();
+ private Random random = new Random();
+
+ public RenderItem() {
+ this.field_9246_c = 0.15F;
+ this.field_194_c = 12.0F / 16.0F;
+ }
+
+ public void a(EntityItem var1, double var2, double var4, double var6, float var8, float var9) {
+ this.random.setSeed(187L);
+ ItemStack var10 = var1.item;
+ GL11.glPushMatrix();
+ float var11 = MathHelper.sin(((float)var1.age + var9) / 10.0F + var1.field_804_d) * 0.1F + 0.1F;
+ float var12 = (((float)var1.age + var9) / 20.0F + var1.field_804_d) * (180.0F / (float)Math.PI);
+ byte var13 = 1;
+ if(var1.item.stackSize > 1) {
+ var13 = 2;
+ }
+
+ if(var1.item.stackSize > 5) {
+ var13 = 3;
+ }
+
+ if(var1.item.stackSize > 20) {
+ var13 = 4;
+ }
+
+ GL11.glTranslatef((float)var2, (float)var4 + var11, (float)var6);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ float var16;
+ float var17;
+ float var18;
+ if(var10.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var10.itemID].getRenderType())) {
+ GL11.glRotatef(var12, 0.0F, 1.0F, 0.0F);
+ this.loadTexture("/terrain.png");
+ float var27 = 0.25F;
+ if(!Block.blocksList[var10.itemID].renderAsNormalBlock() && var10.itemID != Block.stairSingle.blockID) {
+ var27 = 0.5F;
+ }
+
+ GL11.glScalef(var27, var27, var27);
+
+ for(int var28 = 0; var28 < var13; ++var28) {
+ GL11.glPushMatrix();
+ if(var28 > 0) {
+ var16 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var27;
+ var17 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var27;
+ var18 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.2F / var27;
+ GL11.glTranslatef(var16, var17, var18);
+ }
+
+ this.renderBlocks.func_1227_a(Block.blocksList[var10.itemID]);
+ GL11.glPopMatrix();
+ }
+ } else {
+ GL11.glScalef(0.5F, 0.5F, 0.5F);
+ int var14 = var10.getIconIndex();
+ if(var10.itemID < 256) {
+ this.loadTexture("/terrain.png");
+ } else {
+ this.loadTexture("/gui/items.png");
+ }
+
+ Tessellator var15 = Tessellator.instance;
+ var16 = (float)(var14 % 16 * 16 + 0) / 256.0F;
+ var17 = (float)(var14 % 16 * 16 + 16) / 256.0F;
+ var18 = (float)(var14 / 16 * 16 + 0) / 256.0F;
+ float var19 = (float)(var14 / 16 * 16 + 16) / 256.0F;
+ float var20 = 1.0F;
+ float var21 = 0.5F;
+ float var22 = 0.25F;
+
+ for(int var23 = 0; var23 < var13; ++var23) {
+ GL11.glPushMatrix();
+ if(var23 > 0) {
+ float var24 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F;
+ float var25 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F;
+ float var26 = (this.random.nextFloat() * 2.0F - 1.0F) * 0.3F;
+ GL11.glTranslatef(var24, var25, var26);
+ }
+
+ GL11.glRotatef(180.0F - this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F);
+ var15.startDrawingQuads();
+ var15.setNormal(0.0F, 1.0F, 0.0F);
+ var15.addVertexWithUV((double)(0.0F - var21), (double)(0.0F - var22), 0.0D, (double)var16, (double)var19);
+ var15.addVertexWithUV((double)(var20 - var21), (double)(0.0F - var22), 0.0D, (double)var17, (double)var19);
+ var15.addVertexWithUV((double)(var20 - var21), (double)(1.0F - var22), 0.0D, (double)var17, (double)var18);
+ var15.addVertexWithUV((double)(0.0F - var21), (double)(1.0F - var22), 0.0D, (double)var16, (double)var18);
+ var15.draw();
+ GL11.glPopMatrix();
+ }
+ }
+
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ }
+
+ public void renderItemIntoGUI(FontRenderer var1, RenderEngine var2, ItemStack var3, int var4, int var5) {
+ if(var3 != null) {
+ if(var3.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var3.itemID].getRenderType())) {
+ int var6 = var3.itemID;
+ var2.bindTexture(var2.getTexture("/terrain.png"));
+ Block var7 = Block.blocksList[var6];
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)(var4 - 2), (float)(var5 + 3), 0.0F);
+ GL11.glScalef(10.0F, 10.0F, 10.0F);
+ GL11.glTranslatef(1.0F, 0.5F, 8.0F);
+ GL11.glRotatef(210.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glScalef(1.0F, 1.0F, 1.0F);
+ this.renderBlocks.func_1227_a(var7);
+ GL11.glPopMatrix();
+ } else if(var3.getIconIndex() >= 0) {
+ GL11.glDisable(GL11.GL_LIGHTING);
+ if(var3.itemID < 256) {
+ var2.bindTexture(var2.getTexture("/terrain.png"));
+ } else {
+ var2.bindTexture(var2.getTexture("/gui/items.png"));
+ }
+
+ this.renderTexturedQuad(var4, var5, var3.getIconIndex() % 16 * 16, var3.getIconIndex() / 16 * 16, 16, 16);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ }
+
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ }
+ }
+
+ public void renderItemOverlayIntoGUI(FontRenderer var1, RenderEngine var2, ItemStack var3, int var4, int var5) {
+ if(var3 != null) {
+ if(var3.stackSize > 1) {
+ String var6 = "" + var3.stackSize;
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ var1.drawStringWithShadow(var6, var4 + 19 - 2 - var1.getStringWidth(var6), var5 + 6 + 3, 16777215);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ }
+
+ if(var3.itemDamage > 0) {
+ int var11 = 13 - var3.itemDamage * 13 / var3.getMaxDamage();
+ int var7 = 255 - var3.itemDamage * 255 / var3.getMaxDamage();
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ Tessellator var8 = Tessellator.instance;
+ int var9 = 255 - var7 << 16 | var7 << 8;
+ int var10 = (255 - var7) / 4 << 16 | 16128;
+ this.renderQuad(var8, var4 + 2, var5 + 13, 13, 2, 0);
+ this.renderQuad(var8, var4 + 2, var5 + 13, 12, 1, var10);
+ this.renderQuad(var8, var4 + 2, var5 + 13, var11, 1, var9);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ }
+ }
+
+ private void renderQuad(Tessellator var1, int var2, int var3, int var4, int var5, int var6) {
+ var1.startDrawingQuads();
+ var1.setColorOpaque_I(var6);
+ var1.addVertex((double)(var2 + 0), (double)(var3 + 0), 0.0D);
+ var1.addVertex((double)(var2 + 0), (double)(var3 + var5), 0.0D);
+ var1.addVertex((double)(var2 + var4), (double)(var3 + var5), 0.0D);
+ var1.addVertex((double)(var2 + var4), (double)(var3 + 0), 0.0D);
+ var1.draw();
+ }
+
+ public void renderTexturedQuad(int var1, int var2, int var3, int var4, int var5, int var6) {
+ float var7 = 0.0F;
+ float var8 = 0.00390625F;
+ float var9 = 0.00390625F;
+ Tessellator var10 = Tessellator.instance;
+ var10.startDrawingQuads();
+ var10.addVertexWithUV((double)(var1 + 0), (double)(var2 + var6), (double)var7, (double)((float)(var3 + 0) * var8), (double)((float)(var4 + var6) * var9));
+ var10.addVertexWithUV((double)(var1 + var5), (double)(var2 + var6), (double)var7, (double)((float)(var3 + var5) * var8), (double)((float)(var4 + var6) * var9));
+ var10.addVertexWithUV((double)(var1 + var5), (double)(var2 + 0), (double)var7, (double)((float)(var3 + var5) * var8), (double)((float)(var4 + 0) * var9));
+ var10.addVertexWithUV((double)(var1 + 0), (double)(var2 + 0), (double)var7, (double)((float)(var3 + 0) * var8), (double)((float)(var4 + 0) * var9));
+ var10.draw();
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityItem)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderList.java b/src/main/java/net/minecraft/src/RenderList.java
new file mode 100644
index 0000000..5b68a1c
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderList.java
@@ -0,0 +1,61 @@
+package net.minecraft.src;
+
+import java.nio.IntBuffer;
+import org.lwjgl.opengl.GL11;
+
+public class RenderList {
+ private int field_1242_a;
+ private int field_1241_b;
+ private int field_1240_c;
+ private float field_1239_d;
+ private float field_1238_e;
+ private float field_1237_f;
+ private IntBuffer field_1236_g = GLAllocation.createDirectIntBuffer(65536);
+ private boolean field_1235_h = false;
+ private boolean field_1234_i = false;
+
+ public void func_861_a(int var1, int var2, int var3, double var4, double var6, double var8) {
+ this.field_1235_h = true;
+ this.field_1236_g.clear();
+ this.field_1242_a = var1;
+ this.field_1241_b = var2;
+ this.field_1240_c = var3;
+ this.field_1239_d = (float)var4;
+ this.field_1238_e = (float)var6;
+ this.field_1237_f = (float)var8;
+ }
+
+ public boolean func_862_a(int var1, int var2, int var3) {
+ return !this.field_1235_h ? false : var1 == this.field_1242_a && var2 == this.field_1241_b && var3 == this.field_1240_c;
+ }
+
+ public void func_858_a(int var1) {
+ this.field_1236_g.put(var1);
+ if(this.field_1236_g.remaining() == 0) {
+ this.func_860_a();
+ }
+
+ }
+
+ public void func_860_a() {
+ if(this.field_1235_h) {
+ if(!this.field_1234_i) {
+ this.field_1236_g.flip();
+ this.field_1234_i = true;
+ }
+
+ if(this.field_1236_g.remaining() > 0) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)this.field_1242_a - this.field_1239_d, (float)this.field_1241_b - this.field_1238_e, (float)this.field_1240_c - this.field_1237_f);
+ GL11.glCallLists(this.field_1236_g);
+ GL11.glPopMatrix();
+ }
+
+ }
+ }
+
+ public void func_859_b() {
+ this.field_1235_h = false;
+ this.field_1234_i = false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderLiving.java b/src/main/java/net/minecraft/src/RenderLiving.java
new file mode 100644
index 0000000..f5dc5f3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderLiving.java
@@ -0,0 +1,150 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class RenderLiving extends Render {
+ protected ModelBase e;
+ protected ModelBase field_6332_f;
+
+ public RenderLiving(ModelBase var1, float var2) {
+ this.e = var1;
+ this.field_9246_c = var2;
+ }
+
+ public void func_4013_a(ModelBase var1) {
+ this.field_6332_f = var1;
+ }
+
+ public void a(EntityLiving var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ GL11.glDisable(GL11.GL_CULL_FACE);
+ this.e.field_1244_k = this.func_167_c(var1, var9);
+ this.e.field_1243_l = var1.ridingEntity != null || var1.field_9300_bu;
+ if(this.field_6332_f != null) {
+ this.field_6332_f.field_1243_l = this.e.field_1243_l;
+ }
+
+ try {
+ float var10 = var1.field_734_o + (var1.field_735_n - var1.field_734_o) * var9;
+ float var11 = var1.prevRotationYaw + (var1.rotationYaw - var1.prevRotationYaw) * var9;
+ float var12 = var1.prevRotationPitch + (var1.rotationPitch - var1.prevRotationPitch) * var9;
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ float var13 = this.func_170_d(var1, var9);
+ GL11.glRotatef(180.0F - var10, 0.0F, 1.0F, 0.0F);
+ float var14;
+ if(var1.deathTime > 0) {
+ var14 = ((float)var1.deathTime + var9 - 1.0F) / 20.0F * 1.6F;
+ var14 = MathHelper.sqrt_float(var14);
+ if(var14 > 1.0F) {
+ var14 = 1.0F;
+ }
+
+ GL11.glRotatef(var14 * this.func_172_a(var1), 0.0F, 0.0F, 1.0F);
+ }
+
+ var14 = 1.0F / 16.0F;
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glScalef(-1.0F, -1.0F, 1.0F);
+ this.func_6330_a(var1, var9);
+ GL11.glTranslatef(0.0F, -24.0F * var14 - 0.0078125F, 0.0F);
+ float var15 = var1.field_705_Q + (var1.field_704_R - var1.field_705_Q) * var9;
+ float var16 = var1.field_703_S - var1.field_704_R * (1.0F - var9);
+ if(var15 > 1.0F) {
+ var15 = 1.0F;
+ }
+
+ this.func_140_a(var1.skinUrl, var1.getEntityTexture());
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ this.e.render(var16, var15, var13, var11 - var10, var12, var14);
+
+ for(int var17 = 0; var17 < 4; ++var17) {
+ if(this.func_166_a(var1, var17)) {
+ this.field_6332_f.render(var16, var15, var13, var11 - var10, var12, var14);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ }
+ }
+
+ this.func_6331_b(var1, var9);
+ float var25 = var1.getEntityBrightness(var9);
+ int var18 = this.func_173_a(var1, var25, var9);
+ if((var18 >> 24 & 255) > 0 || var1.hurtTime > 0 || var1.deathTime > 0) {
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glDepthFunc(GL11.GL_EQUAL);
+ if(var1.hurtTime > 0 || var1.deathTime > 0) {
+ GL11.glColor4f(var25, 0.0F, 0.0F, 0.4F);
+ this.e.render(var16, var15, var13, var11 - var10, var12, var14);
+
+ for(int var19 = 0; var19 < 4; ++var19) {
+ if(this.func_166_a(var1, var19)) {
+ GL11.glColor4f(var25, 0.0F, 0.0F, 0.4F);
+ this.field_6332_f.render(var16, var15, var13, var11 - var10, var12, var14);
+ }
+ }
+ }
+
+ if((var18 >> 24 & 255) > 0) {
+ float var26 = (float)(var18 >> 16 & 255) / 255.0F;
+ float var20 = (float)(var18 >> 8 & 255) / 255.0F;
+ float var21 = (float)(var18 & 255) / 255.0F;
+ float var22 = (float)(var18 >> 24 & 255) / 255.0F;
+ GL11.glColor4f(var26, var20, var21, var22);
+ this.e.render(var16, var15, var13, var11 - var10, var12, var14);
+
+ for(int var23 = 0; var23 < 4; ++var23) {
+ if(this.func_166_a(var1, var23)) {
+ GL11.glColor4f(var26, var20, var21, var22);
+ this.field_6332_f.render(var16, var15, var13, var11 - var10, var12, var14);
+ }
+ }
+ }
+
+ GL11.glDepthFunc(GL11.GL_LEQUAL);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_ALPHA_TEST);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ } catch (Exception var24) {
+ var24.printStackTrace();
+ }
+
+ GL11.glEnable(GL11.GL_CULL_FACE);
+ GL11.glPopMatrix();
+ }
+
+ protected float func_167_c(EntityLiving var1, float var2) {
+ return var1.getSwingProgress(var2);
+ }
+
+ protected float func_170_d(EntityLiving var1, float var2) {
+ return (float)var1.field_9311_be + var2;
+ }
+
+ protected void func_6331_b(EntityLiving var1, float var2) {
+ }
+
+ protected boolean func_166_a(EntityLiving var1, int var2) {
+ return false;
+ }
+
+ protected float func_172_a(EntityLiving var1) {
+ return 90.0F;
+ }
+
+ protected int func_173_a(EntityLiving var1, float var2, float var3) {
+ return 0;
+ }
+
+ protected void func_6330_a(EntityLiving var1, float var2) {
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityLiving)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderManager.java b/src/main/java/net/minecraft/src/RenderManager.java
new file mode 100644
index 0000000..696db98
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderManager.java
@@ -0,0 +1,120 @@
+package net.minecraft.src;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.lwjgl.opengl.GL11;
+
+public class RenderManager {
+ private Map entityRenderMap = new HashMap();
+ public static RenderManager instance = new RenderManager();
+ private FontRenderer field_1218_p;
+ public static double field_1232_b;
+ public static double field_1231_c;
+ public static double field_1230_d;
+ public RenderEngine renderEngine;
+ public ItemRenderer field_4236_f;
+ public World worldObj;
+ public EntityPlayer field_1226_h;
+ public float field_1225_i;
+ public float field_1224_j;
+ public GameSettings options;
+ public double field_1222_l;
+ public double field_1221_m;
+ public double field_1220_n;
+
+ private RenderManager() {
+ this.entityRenderMap.put(EntitySpider.class, new RenderSpider());
+ this.entityRenderMap.put(EntityPig.class, new RenderPig(new ModelPig(), new ModelPig(0.5F), 0.7F));
+ this.entityRenderMap.put(EntitySheep.class, new RenderSheep(new ModelSheep2(), new ModelSheep1(), 0.7F));
+ this.entityRenderMap.put(EntityCow.class, new RenderCow(new ModelCow(), 0.7F));
+ this.entityRenderMap.put(EntityChicken.class, new RenderChicken(new ModelChicken(), 0.3F));
+ this.entityRenderMap.put(EntityCreeper.class, new RenderCreeper());
+ this.entityRenderMap.put(EntitySkeleton.class, new RenderBiped(new ModelSkeleton(), 0.5F));
+ this.entityRenderMap.put(EntityZombie.class, new RenderBiped(new ModelZombie(), 0.5F));
+ this.entityRenderMap.put(EntitySlime.class, new RenderSlime(new ModelSlime(16), new ModelSlime(0), 0.25F));
+ this.entityRenderMap.put(EntityPlayer.class, new RenderPlayer());
+ this.entityRenderMap.put(EntityZombieSimple.class, new RenderZombieSimple(new ModelZombie(), 0.5F, 6.0F));
+ this.entityRenderMap.put(EntityGhast.class, new RenderGhast());
+ this.entityRenderMap.put(EntityLiving.class, new RenderLiving(new ModelBiped(), 0.5F));
+ this.entityRenderMap.put(Entity.class, new RenderEntity());
+ this.entityRenderMap.put(EntityPainting.class, new RenderPainting());
+ this.entityRenderMap.put(EntityArrow.class, new RenderArrow());
+ this.entityRenderMap.put(EntitySnowball.class, new RenderSnowball());
+ this.entityRenderMap.put(EntityFireball.class, new RenderFireball());
+ this.entityRenderMap.put(EntityItem.class, new RenderItem());
+ this.entityRenderMap.put(EntityTNTPrimed.class, new RenderTNTPrimed());
+ this.entityRenderMap.put(EntityFallingSand.class, new RenderFallingSand());
+ this.entityRenderMap.put(EntityMinecart.class, new RenderMinecart());
+ this.entityRenderMap.put(EntityBoat.class, new RenderBoat());
+ this.entityRenderMap.put(EntityFish.class, new RenderFish());
+ Iterator var1 = this.entityRenderMap.values().iterator();
+
+ while(var1.hasNext()) {
+ Render var2 = (Render)var1.next();
+ var2.setRenderManager(this);
+ }
+
+ }
+
+ public Render func_4117_a(Class var1) {
+ Render var2 = (Render)this.entityRenderMap.get(var1);
+ if(var2 == null && var1 != Entity.class) {
+ var2 = this.func_4117_a(var1.getSuperclass());
+ this.entityRenderMap.put(var1, var2);
+ }
+
+ return var2;
+ }
+
+ public Render func_855_a(Entity var1) {
+ return this.func_4117_a(var1.getClass());
+ }
+
+ public void func_857_a(World var1, RenderEngine var2, FontRenderer var3, EntityPlayer var4, GameSettings var5, float var6) {
+ this.worldObj = var1;
+ this.renderEngine = var2;
+ this.options = var5;
+ this.field_1226_h = var4;
+ this.field_1218_p = var3;
+ this.field_1225_i = var4.prevRotationYaw + (var4.rotationYaw - var4.prevRotationYaw) * var6;
+ this.field_1224_j = var4.prevRotationPitch + (var4.rotationPitch - var4.prevRotationPitch) * var6;
+ this.field_1222_l = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)var6;
+ this.field_1221_m = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)var6;
+ this.field_1220_n = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)var6;
+ }
+
+ public void func_854_a(Entity var1, float var2) {
+ double var3 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var2;
+ double var5 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var2;
+ double var7 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var2;
+ float var9 = var1.prevRotationYaw + (var1.rotationYaw - var1.prevRotationYaw) * var2;
+ float var10 = var1.getEntityBrightness(var2);
+ GL11.glColor3f(var10, var10, var10);
+ this.func_853_a(var1, var3 - field_1232_b, var5 - field_1231_c, var7 - field_1230_d, var9, var2);
+ }
+
+ public void func_853_a(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ Render var10 = this.func_855_a(var1);
+ if(var10 != null) {
+ var10.doRender(var1, var2, var4, var6, var8, var9);
+ var10.doRenderShadowAndFire(var1, var2, var4, var6, var8, var9);
+ }
+
+ }
+
+ public void func_852_a(World var1) {
+ this.worldObj = var1;
+ }
+
+ public double func_851_a(double var1, double var3, double var5) {
+ double var7 = var1 - this.field_1222_l;
+ double var9 = var3 - this.field_1221_m;
+ double var11 = var5 - this.field_1220_n;
+ return var7 * var7 + var9 * var9 + var11 * var11;
+ }
+
+ public FontRenderer getFontRenderer() {
+ return this.field_1218_p;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderMinecart.java b/src/main/java/net/minecraft/src/RenderMinecart.java
new file mode 100644
index 0000000..f6b2c8f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderMinecart.java
@@ -0,0 +1,82 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderMinecart extends Render {
+ protected ModelBase a;
+
+ public RenderMinecart() {
+ this.field_9246_c = 0.5F;
+ this.a = new ModelMinecart();
+ }
+
+ public void a(EntityMinecart var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ double var10 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var9;
+ double var12 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var9;
+ double var14 = var1.lastTickPosZ + (var1.posZ - var1.lastTickPosZ) * (double)var9;
+ double var16 = (double)0.3F;
+ Vec3D var18 = var1.func_514_g(var10, var12, var14);
+ float var19 = var1.prevRotationPitch + (var1.rotationPitch - var1.prevRotationPitch) * var9;
+ if(var18 != null) {
+ Vec3D var20 = var1.func_515_a(var10, var12, var14, var16);
+ Vec3D var21 = var1.func_515_a(var10, var12, var14, -var16);
+ if(var20 == null) {
+ var20 = var18;
+ }
+
+ if(var21 == null) {
+ var21 = var18;
+ }
+
+ var2 += var18.xCoord - var10;
+ var4 += (var20.yCoord + var21.yCoord) / 2.0D - var12;
+ var6 += var18.zCoord - var14;
+ Vec3D var22 = var21.addVector(-var20.xCoord, -var20.yCoord, -var20.zCoord);
+ if(var22.lengthVector() != 0.0D) {
+ var22 = var22.normalize();
+ var8 = (float)(Math.atan2(var22.zCoord, var22.xCoord) * 180.0D / Math.PI);
+ var19 = (float)(Math.atan(var22.yCoord) * 73.0D);
+ }
+ }
+
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ GL11.glRotatef(180.0F - var8, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-var19, 0.0F, 0.0F, 1.0F);
+ float var23 = (float)var1.b - var9;
+ float var24 = (float)var1.a - var9;
+ if(var24 < 0.0F) {
+ var24 = 0.0F;
+ }
+
+ if(var23 > 0.0F) {
+ GL11.glRotatef(MathHelper.sin(var23) * var23 * var24 / 10.0F * (float)var1.c, 1.0F, 0.0F, 0.0F);
+ }
+
+ if(var1.d != 0) {
+ this.loadTexture("/terrain.png");
+ float var25 = 12.0F / 16.0F;
+ GL11.glScalef(var25, var25, var25);
+ GL11.glTranslatef(0.0F, 5.0F / 16.0F, 0.0F);
+ GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F);
+ if(var1.d == 1) {
+ (new RenderBlocks()).func_1227_a(Block.crate);
+ } else if(var1.d == 2) {
+ (new RenderBlocks()).func_1227_a(Block.stoneOvenIdle);
+ }
+
+ GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(0.0F, -(5.0F / 16.0F), 0.0F);
+ GL11.glScalef(1.0F / var25, 1.0F / var25, 1.0F / var25);
+ }
+
+ this.loadTexture("/item/cart.png");
+ GL11.glScalef(-1.0F, -1.0F, 1.0F);
+ this.a.render(0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 1.0F / 16.0F);
+ GL11.glPopMatrix();
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityMinecart)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderPainting.java b/src/main/java/net/minecraft/src/RenderPainting.java
new file mode 100644
index 0000000..3ee1545
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderPainting.java
@@ -0,0 +1,119 @@
+package net.minecraft.src;
+
+import java.util.Random;
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class RenderPainting extends Render {
+ private Random rand = new Random();
+
+ public void a(EntityPainting var1, double var2, double var4, double var6, float var8, float var9) {
+ this.rand.setSeed(187L);
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ GL11.glRotatef(var8, 0.0F, 1.0F, 0.0F);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ this.loadTexture("/art/kz.png");
+ EnumArt var10 = var1.field_690_b;
+ float var11 = 1.0F / 16.0F;
+ GL11.glScalef(var11, var11, var11);
+ this.func_159_a(var1, var10.field_1623_z, var10.field_1636_A, var10.field_1634_B, var10.field_1632_C);
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ }
+
+ private void func_159_a(EntityPainting var1, int var2, int var3, int var4, int var5) {
+ float var6 = (float)(-var2) / 2.0F;
+ float var7 = (float)(-var3) / 2.0F;
+ float var8 = -0.5F;
+ float var9 = 0.5F;
+
+ for(int var10 = 0; var10 < var2 / 16; ++var10) {
+ for(int var11 = 0; var11 < var3 / 16; ++var11) {
+ float var12 = var6 + (float)((var10 + 1) * 16);
+ float var13 = var6 + (float)(var10 * 16);
+ float var14 = var7 + (float)((var11 + 1) * 16);
+ float var15 = var7 + (float)(var11 * 16);
+ this.func_160_a(var1, (var12 + var13) / 2.0F, (var14 + var15) / 2.0F);
+ float var16 = (float)(var4 + var2 - var10 * 16) / 256.0F;
+ float var17 = (float)(var4 + var2 - (var10 + 1) * 16) / 256.0F;
+ float var18 = (float)(var5 + var3 - var11 * 16) / 256.0F;
+ float var19 = (float)(var5 + var3 - (var11 + 1) * 16) / 256.0F;
+ float var20 = 12.0F / 16.0F;
+ float var21 = 13.0F / 16.0F;
+ float var22 = 0.0F;
+ float var23 = 1.0F / 16.0F;
+ float var24 = 12.0F / 16.0F;
+ float var25 = 13.0F / 16.0F;
+ float var26 = 0.001953125F;
+ float var27 = 0.001953125F;
+ float var28 = 385.0F / 512.0F;
+ float var29 = 385.0F / 512.0F;
+ float var30 = 0.0F;
+ float var31 = 1.0F / 16.0F;
+ Tessellator var32 = Tessellator.instance;
+ var32.startDrawingQuads();
+ var32.setNormal(0.0F, 0.0F, -1.0F);
+ var32.addVertexWithUV((double)var12, (double)var15, (double)var8, (double)var17, (double)var18);
+ var32.addVertexWithUV((double)var13, (double)var15, (double)var8, (double)var16, (double)var18);
+ var32.addVertexWithUV((double)var13, (double)var14, (double)var8, (double)var16, (double)var19);
+ var32.addVertexWithUV((double)var12, (double)var14, (double)var8, (double)var17, (double)var19);
+ var32.setNormal(0.0F, 0.0F, 1.0F);
+ var32.addVertexWithUV((double)var12, (double)var14, (double)var9, (double)var20, (double)var22);
+ var32.addVertexWithUV((double)var13, (double)var14, (double)var9, (double)var21, (double)var22);
+ var32.addVertexWithUV((double)var13, (double)var15, (double)var9, (double)var21, (double)var23);
+ var32.addVertexWithUV((double)var12, (double)var15, (double)var9, (double)var20, (double)var23);
+ var32.setNormal(0.0F, -1.0F, 0.0F);
+ var32.addVertexWithUV((double)var12, (double)var14, (double)var8, (double)var24, (double)var26);
+ var32.addVertexWithUV((double)var13, (double)var14, (double)var8, (double)var25, (double)var26);
+ var32.addVertexWithUV((double)var13, (double)var14, (double)var9, (double)var25, (double)var27);
+ var32.addVertexWithUV((double)var12, (double)var14, (double)var9, (double)var24, (double)var27);
+ var32.setNormal(0.0F, 1.0F, 0.0F);
+ var32.addVertexWithUV((double)var12, (double)var15, (double)var9, (double)var24, (double)var26);
+ var32.addVertexWithUV((double)var13, (double)var15, (double)var9, (double)var25, (double)var26);
+ var32.addVertexWithUV((double)var13, (double)var15, (double)var8, (double)var25, (double)var27);
+ var32.addVertexWithUV((double)var12, (double)var15, (double)var8, (double)var24, (double)var27);
+ var32.setNormal(-1.0F, 0.0F, 0.0F);
+ var32.addVertexWithUV((double)var12, (double)var14, (double)var9, (double)var29, (double)var30);
+ var32.addVertexWithUV((double)var12, (double)var15, (double)var9, (double)var29, (double)var31);
+ var32.addVertexWithUV((double)var12, (double)var15, (double)var8, (double)var28, (double)var31);
+ var32.addVertexWithUV((double)var12, (double)var14, (double)var8, (double)var28, (double)var30);
+ var32.setNormal(1.0F, 0.0F, 0.0F);
+ var32.addVertexWithUV((double)var13, (double)var14, (double)var8, (double)var29, (double)var30);
+ var32.addVertexWithUV((double)var13, (double)var15, (double)var8, (double)var29, (double)var31);
+ var32.addVertexWithUV((double)var13, (double)var15, (double)var9, (double)var28, (double)var31);
+ var32.addVertexWithUV((double)var13, (double)var14, (double)var9, (double)var28, (double)var30);
+ var32.draw();
+ }
+ }
+
+ }
+
+ private void func_160_a(EntityPainting var1, float var2, float var3) {
+ int var4 = MathHelper.floor_double(var1.posX);
+ int var5 = MathHelper.floor_double(var1.posY + (double)(var3 / 16.0F));
+ int var6 = MathHelper.floor_double(var1.posZ);
+ if(var1.field_691_a == 0) {
+ var4 = MathHelper.floor_double(var1.posX + (double)(var2 / 16.0F));
+ }
+
+ if(var1.field_691_a == 1) {
+ var6 = MathHelper.floor_double(var1.posZ - (double)(var2 / 16.0F));
+ }
+
+ if(var1.field_691_a == 2) {
+ var4 = MathHelper.floor_double(var1.posX - (double)(var2 / 16.0F));
+ }
+
+ if(var1.field_691_a == 3) {
+ var6 = MathHelper.floor_double(var1.posZ + (double)(var2 / 16.0F));
+ }
+
+ float var7 = this.renderManager.worldObj.getLightBrightness(var4, var5, var6);
+ GL11.glColor3f(var7, var7, var7);
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityPainting)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderPig.java b/src/main/java/net/minecraft/src/RenderPig.java
new file mode 100644
index 0000000..0eb8b38
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderPig.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class RenderPig extends RenderLiving {
+ public RenderPig(ModelBase var1, ModelBase var2, float var3) {
+ super(var1, var3);
+ this.func_4013_a(var2);
+ }
+
+ protected boolean a(EntityPig var1, int var2) {
+ this.loadTexture("/mob/saddle.png");
+ return var2 == 0 && var1.rideable;
+ }
+
+ protected boolean func_166_a(EntityLiving var1, int var2) {
+ return this.a((EntityPig)var1, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderPlayer.java b/src/main/java/net/minecraft/src/RenderPlayer.java
new file mode 100644
index 0000000..7eddfa9
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderPlayer.java
@@ -0,0 +1,207 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderPlayer extends RenderLiving {
+ private ModelBiped field_209_f = (ModelBiped)this.e;
+ private ModelBiped field_208_g = new ModelBiped(1.0F);
+ private ModelBiped field_207_h = new ModelBiped(0.5F);
+ private static final String[] armorFilenamePrefix = new String[]{"cloth", "chain", "iron", "diamond", "gold"};
+
+ public RenderPlayer() {
+ super(new ModelBiped(0.0F), 0.5F);
+ }
+
+ protected boolean a(EntityPlayer var1, int var2) {
+ ItemStack var3 = var1.inventory.armorItemInSlot(3 - var2);
+ if(var3 != null) {
+ Item var4 = var3.getItem();
+ if(var4 instanceof ItemArmor) {
+ ItemArmor var5 = (ItemArmor)var4;
+ this.loadTexture("/armor/" + armorFilenamePrefix[var5.renderIndex] + "_" + (var2 == 2 ? 2 : 1) + ".png");
+ ModelBiped var6 = var2 == 2 ? this.field_207_h : this.field_208_g;
+ var6.bipedHead.field_1403_h = var2 == 0;
+ var6.field_1285_b.field_1403_h = var2 == 0;
+ var6.field_1284_c.field_1403_h = var2 == 1 || var2 == 2;
+ var6.bipedRightArm.field_1403_h = var2 == 1;
+ var6.bipedLeftArm.field_1403_h = var2 == 1;
+ var6.bipedRightLeg.field_1403_h = var2 == 2 || var2 == 3;
+ var6.bipedLeftLeg.field_1403_h = var2 == 2 || var2 == 3;
+ this.func_4013_a(var6);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public void a(EntityPlayer var1, double var2, double var4, double var6, float var8, float var9) {
+ ItemStack var10 = var1.inventory.getCurrentItem();
+ this.field_208_g.field_1278_i = this.field_207_h.field_1278_i = this.field_209_f.field_1278_i = var10 != null;
+ this.field_208_g.field_1277_j = this.field_207_h.field_1277_j = this.field_209_f.field_1277_j = var1.func_381_o();
+ double var11 = var4 - (double)var1.yOffset;
+ if(var1.field_12240_bw) {
+ var11 -= 0.125D;
+ }
+
+ super.a(var1, var2, var11, var6, var8, var9);
+ this.field_208_g.field_1277_j = this.field_207_h.field_1277_j = this.field_209_f.field_1277_j = false;
+ this.field_208_g.field_1278_i = this.field_207_h.field_1278_i = this.field_209_f.field_1278_i = false;
+ float var13 = 1.6F;
+ float var14 = (float)(1.0D / 60.0D) * var13;
+ float var15 = var1.getDistanceToEntity(this.renderManager.field_1226_h);
+ float var16 = var1.func_381_o() ? 32.0F : 64.0F;
+ if(var15 < var16) {
+ var14 = (float)((double)var14 * (Math.sqrt((double)var15) / 2.0D));
+ FontRenderer var17 = this.getFontRendererFromRenderManager();
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2 + 0.0F, (float)var4 + 2.3F, (float)var6);
+ GL11.glNormal3f(0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(this.renderManager.field_1224_j, 1.0F, 0.0F, 0.0F);
+ GL11.glScalef(-var14, -var14, var14);
+ String var18 = var1.field_771_i;
+ GL11.glDisable(GL11.GL_LIGHTING);
+ Tessellator var19;
+ int var20;
+ if(!var1.func_381_o()) {
+ GL11.glDepthMask(false);
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ var19 = Tessellator.instance;
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ var19.startDrawingQuads();
+ var20 = var17.getStringWidth(var18) / 2;
+ var19.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);
+ var19.addVertex((double)(-var20 - 1), -1.0D, 0.0D);
+ var19.addVertex((double)(-var20 - 1), 8.0D, 0.0D);
+ var19.addVertex((double)(var20 + 1), 8.0D, 0.0D);
+ var19.addVertex((double)(var20 + 1), -1.0D, 0.0D);
+ var19.draw();
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ var17.drawString(var18, -var17.getStringWidth(var18) / 2, 0, 553648127);
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GL11.glDepthMask(true);
+ var17.drawString(var18, -var17.getStringWidth(var18) / 2, 0, -1);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glPopMatrix();
+ } else {
+ GL11.glTranslatef(0.0F, 0.25F / var14, 0.0F);
+ GL11.glDepthMask(false);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ var19 = Tessellator.instance;
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ var19.startDrawingQuads();
+ var20 = var17.getStringWidth(var18) / 2;
+ var19.setColorRGBA_F(0.0F, 0.0F, 0.0F, 0.25F);
+ var19.addVertex((double)(-var20 - 1), -1.0D, 0.0D);
+ var19.addVertex((double)(-var20 - 1), 8.0D, 0.0D);
+ var19.addVertex((double)(var20 + 1), 8.0D, 0.0D);
+ var19.addVertex((double)(var20 + 1), -1.0D, 0.0D);
+ var19.draw();
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ GL11.glDepthMask(true);
+ var17.drawString(var18, -var17.getStringWidth(var18) / 2, 0, 553648127);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glPopMatrix();
+ }
+ }
+
+ }
+
+ protected void a(EntityPlayer var1, float var2) {
+ ItemStack var3 = var1.inventory.armorItemInSlot(3);
+ if(var3 != null && var3.getItem().shiftedIndex < 256) {
+ GL11.glPushMatrix();
+ this.field_209_f.bipedHead.func_926_b(1.0F / 16.0F);
+ if(RenderBlocks.func_1219_a(Block.blocksList[var3.itemID].getRenderType())) {
+ float var4 = 10.0F / 16.0F;
+ GL11.glTranslatef(0.0F, -0.25F, 0.0F);
+ GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glScalef(var4, -var4, var4);
+ }
+
+ this.renderManager.field_4236_f.renderItem(var3);
+ GL11.glPopMatrix();
+ }
+
+ ItemStack var6 = var1.inventory.getCurrentItem();
+ if(var6 != null) {
+ GL11.glPushMatrix();
+ this.field_209_f.bipedRightArm.func_926_b(1.0F / 16.0F);
+ GL11.glTranslatef(-(1.0F / 16.0F), 7.0F / 16.0F, 1.0F / 16.0F);
+ if(var1.fishEntity != null) {
+ var6 = new ItemStack(Item.stick.shiftedIndex);
+ }
+
+ float var5;
+ if(var6.itemID < 256 && RenderBlocks.func_1219_a(Block.blocksList[var6.itemID].getRenderType())) {
+ var5 = 0.5F;
+ GL11.glTranslatef(0.0F, 3.0F / 16.0F, -(5.0F / 16.0F));
+ var5 *= 12.0F / 16.0F;
+ GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glScalef(var5, -var5, var5);
+ } else if(Item.itemsList[var6.itemID].isFull3D()) {
+ var5 = 10.0F / 16.0F;
+ if(Item.itemsList[var6.itemID].shouldRotateAroundWhenRendering()) {
+ GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glTranslatef(0.0F, -(2.0F / 16.0F), 0.0F);
+ }
+
+ GL11.glTranslatef(0.0F, 3.0F / 16.0F, 0.0F);
+ GL11.glScalef(var5, -var5, var5);
+ GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
+ } else {
+ var5 = 6.0F / 16.0F;
+ GL11.glTranslatef(0.25F, 3.0F / 16.0F, -(3.0F / 16.0F));
+ GL11.glScalef(var5, var5, var5);
+ GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F);
+ GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F);
+ }
+
+ this.renderManager.field_4236_f.renderItem(var6);
+ GL11.glPopMatrix();
+ }
+
+ }
+
+ protected void b(EntityPlayer var1, float var2) {
+ float var3 = 15.0F / 16.0F;
+ GL11.glScalef(var3, var3, var3);
+ }
+
+ public void drawFirstPersonHand() {
+ this.field_209_f.field_1244_k = 0.0F;
+ this.field_209_f.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 1.0F / 16.0F);
+ this.field_209_f.bipedRightArm.render(1.0F / 16.0F);
+ }
+
+ protected void func_6330_a(EntityLiving var1, float var2) {
+ this.b((EntityPlayer)var1, var2);
+ }
+
+ protected boolean func_166_a(EntityLiving var1, int var2) {
+ return this.a((EntityPlayer)var1, var2);
+ }
+
+ protected void func_6331_b(EntityLiving var1, float var2) {
+ this.a((EntityPlayer)var1, var2);
+ }
+
+ public void a(EntityLiving var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityPlayer)var1, var2, var4, var6, var8, var9);
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityPlayer)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderSheep.java b/src/main/java/net/minecraft/src/RenderSheep.java
new file mode 100644
index 0000000..7758c59
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderSheep.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class RenderSheep extends RenderLiving {
+ public RenderSheep(ModelBase var1, ModelBase var2, float var3) {
+ super(var1, var3);
+ this.func_4013_a(var2);
+ }
+
+ protected boolean a(EntitySheep var1, int var2) {
+ this.loadTexture("/mob/sheep_fur.png");
+ return var2 == 0 && !var1.sheared;
+ }
+
+ protected boolean func_166_a(EntityLiving var1, int var2) {
+ return this.a((EntitySheep)var1, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderSlime.java b/src/main/java/net/minecraft/src/RenderSlime.java
new file mode 100644
index 0000000..da4aed6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderSlime.java
@@ -0,0 +1,44 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderSlime extends RenderLiving {
+ private ModelBase field_205_f;
+
+ public RenderSlime(ModelBase var1, ModelBase var2, float var3) {
+ super(var1, var3);
+ this.field_205_f = var2;
+ }
+
+ protected boolean a(EntitySlime var1, int var2) {
+ if(var2 == 0) {
+ this.func_4013_a(this.field_205_f);
+ GL11.glEnable(GL11.GL_NORMALIZE);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ return true;
+ } else {
+ if(var2 == 1) {
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ }
+
+ return false;
+ }
+ }
+
+ protected void a(EntitySlime var1, float var2) {
+ float var3 = (var1.field_767_b + (var1.field_768_a - var1.field_767_b) * var2) / ((float)var1.field_770_c * 0.5F + 1.0F);
+ float var4 = 1.0F / (var3 + 1.0F);
+ float var5 = (float)var1.field_770_c;
+ GL11.glScalef(var4 * var5, 1.0F / var4 * var5, var4 * var5);
+ }
+
+ protected void func_6330_a(EntityLiving var1, float var2) {
+ this.a((EntitySlime)var1, var2);
+ }
+
+ protected boolean func_166_a(EntityLiving var1, int var2) {
+ return this.a((EntitySlime)var1, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderSnowball.java b/src/main/java/net/minecraft/src/RenderSnowball.java
new file mode 100644
index 0000000..09cfde3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderSnowball.java
@@ -0,0 +1,38 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL12;
+
+public class RenderSnowball extends Render {
+ public void a(EntitySnowball var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ GL11.glEnable(GL12.GL_RESCALE_NORMAL);
+ GL11.glScalef(0.5F, 0.5F, 0.5F);
+ int var10 = Item.snowball.getIconIndex((ItemStack)null);
+ this.loadTexture("/gui/items.png");
+ Tessellator var11 = Tessellator.instance;
+ float var12 = (float)(var10 % 16 * 16 + 0) / 256.0F;
+ float var13 = (float)(var10 % 16 * 16 + 16) / 256.0F;
+ float var14 = (float)(var10 / 16 * 16 + 0) / 256.0F;
+ float var15 = (float)(var10 / 16 * 16 + 16) / 256.0F;
+ float var16 = 1.0F;
+ float var17 = 0.5F;
+ float var18 = 0.25F;
+ GL11.glRotatef(180.0F - this.renderManager.field_1225_i, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-this.renderManager.field_1224_j, 1.0F, 0.0F, 0.0F);
+ var11.startDrawingQuads();
+ var11.setNormal(0.0F, 1.0F, 0.0F);
+ var11.addVertexWithUV((double)(0.0F - var17), (double)(0.0F - var18), 0.0D, (double)var12, (double)var15);
+ var11.addVertexWithUV((double)(var16 - var17), (double)(0.0F - var18), 0.0D, (double)var13, (double)var15);
+ var11.addVertexWithUV((double)(var16 - var17), (double)(1.0F - var18), 0.0D, (double)var13, (double)var14);
+ var11.addVertexWithUV((double)(0.0F - var17), (double)(1.0F - var18), 0.0D, (double)var12, (double)var14);
+ var11.draw();
+ GL11.glDisable(GL12.GL_RESCALE_NORMAL);
+ GL11.glPopMatrix();
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntitySnowball)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderSorter.java b/src/main/java/net/minecraft/src/RenderSorter.java
new file mode 100644
index 0000000..d8681a4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderSorter.java
@@ -0,0 +1,29 @@
+package net.minecraft.src;
+
+import java.util.Comparator;
+
+public class RenderSorter implements Comparator {
+ private EntityPlayer field_4274_a;
+
+ public RenderSorter(EntityPlayer var1) {
+ this.field_4274_a = var1;
+ }
+
+ public int a(WorldRenderer var1, WorldRenderer var2) {
+ boolean var3 = var1.field_1749_o;
+ boolean var4 = var2.field_1749_o;
+ if(var3 && !var4) {
+ return 1;
+ } else if(var4 && !var3) {
+ return -1;
+ } else {
+ double var5 = (double)var1.func_1202_a(this.field_4274_a);
+ double var7 = (double)var2.func_1202_a(this.field_4274_a);
+ return var5 < var7 ? 1 : (var5 > var7 ? -1 : (var1.field_1735_w < var2.field_1735_w ? 1 : -1));
+ }
+ }
+
+ public int compare(Object var1, Object var2) {
+ return this.a((WorldRenderer)var1, (WorldRenderer)var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderSpider.java b/src/main/java/net/minecraft/src/RenderSpider.java
new file mode 100644
index 0000000..bae9d17
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderSpider.java
@@ -0,0 +1,38 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderSpider extends RenderLiving {
+ public RenderSpider() {
+ super(new ModelSpider(), 1.0F);
+ this.func_4013_a(new ModelSpider());
+ }
+
+ protected float a(EntitySpider var1) {
+ return 180.0F;
+ }
+
+ protected boolean a(EntitySpider var1, int var2) {
+ if(var2 != 0) {
+ return false;
+ } else if(var2 != 0) {
+ return false;
+ } else {
+ this.loadTexture("/mob/spider_eyes.png");
+ float var3 = (1.0F - var1.getEntityBrightness(1.0F)) * 0.5F;
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glDisable(GL11.GL_ALPHA_TEST);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, var3);
+ return true;
+ }
+ }
+
+ protected float func_172_a(EntityLiving var1) {
+ return this.a((EntitySpider)var1);
+ }
+
+ protected boolean func_166_a(EntityLiving var1, int var2) {
+ return this.a((EntitySpider)var1, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderTNTPrimed.java b/src/main/java/net/minecraft/src/RenderTNTPrimed.java
new file mode 100644
index 0000000..d726ea0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderTNTPrimed.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderTNTPrimed extends Render {
+ private RenderBlocks field_196_d = new RenderBlocks();
+
+ public RenderTNTPrimed() {
+ this.field_9246_c = 0.5F;
+ }
+
+ public void a(EntityTNTPrimed var1, double var2, double var4, double var6, float var8, float var9) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2, (float)var4, (float)var6);
+ float var10;
+ if((float)var1.fuse - var9 + 1.0F < 10.0F) {
+ var10 = 1.0F - ((float)var1.fuse - var9 + 1.0F) / 10.0F;
+ if(var10 < 0.0F) {
+ var10 = 0.0F;
+ }
+
+ if(var10 > 1.0F) {
+ var10 = 1.0F;
+ }
+
+ var10 *= var10;
+ var10 *= var10;
+ float var11 = 1.0F + var10 * 0.3F;
+ GL11.glScalef(var11, var11, var11);
+ }
+
+ var10 = (1.0F - ((float)var1.fuse - var9 + 1.0F) / 100.0F) * 0.8F;
+ this.loadTexture("/terrain.png");
+ this.field_196_d.func_1227_a(Block.tnt);
+ if(var1.fuse / 5 % 2 == 0) {
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_BLEND);
+ GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, var10);
+ this.field_196_d.func_1227_a(Block.tnt);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glDisable(GL11.GL_BLEND);
+ GL11.glEnable(GL11.GL_LIGHTING);
+ GL11.glEnable(GL11.GL_TEXTURE_2D);
+ }
+
+ GL11.glPopMatrix();
+ }
+
+ public void doRender(Entity var1, double var2, double var4, double var6, float var8, float var9) {
+ this.a((EntityTNTPrimed)var1, var2, var4, var6, var8, var9);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/RenderZombieSimple.java b/src/main/java/net/minecraft/src/RenderZombieSimple.java
new file mode 100644
index 0000000..81df327
--- /dev/null
+++ b/src/main/java/net/minecraft/src/RenderZombieSimple.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class RenderZombieSimple extends RenderLiving {
+ private float field_204_f;
+
+ public RenderZombieSimple(ModelBase var1, float var2, float var3) {
+ super(var1, var2 * var3);
+ this.field_204_f = var3;
+ }
+
+ protected void a(EntityZombieSimple var1, float var2) {
+ GL11.glScalef(this.field_204_f, this.field_204_f, this.field_204_f);
+ }
+
+ protected void func_6330_a(EntityLiving var1, float var2) {
+ this.a((EntityZombieSimple)var1, var2);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ScaledResolution.java b/src/main/java/net/minecraft/src/ScaledResolution.java
new file mode 100644
index 0000000..d5ee8b8
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ScaledResolution.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class ScaledResolution {
+ private int scaledWidth;
+ private int scaledHeight;
+ public int scaleFactor;
+
+ public ScaledResolution(int var1, int var2) {
+ this.scaledWidth = var1;
+ this.scaledHeight = var2;
+
+ for(this.scaleFactor = 1; this.scaledWidth / (this.scaleFactor + 1) >= 320 && this.scaledHeight / (this.scaleFactor + 1) >= 240; ++this.scaleFactor) {
+ }
+
+ this.scaledWidth /= this.scaleFactor;
+ this.scaledHeight /= this.scaleFactor;
+ }
+
+ public int getScaledWidth() {
+ return this.scaledWidth;
+ }
+
+ public int getScaledHeight() {
+ return this.scaledHeight;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Session.java b/src/main/java/net/minecraft/src/Session.java
new file mode 100644
index 0000000..3f7ba86
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Session.java
@@ -0,0 +1,46 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Session {
+ public static List registeredBlocksList = new ArrayList();
+ public String inventory;
+ public String field_6542_d;
+
+ public Session(String var1) {
+ this.inventory = var1;
+ }
+
+ static {
+ registeredBlocksList.add(Block.stone);
+ registeredBlocksList.add(Block.cobblestone);
+ registeredBlocksList.add(Block.brick);
+ registeredBlocksList.add(Block.dirt);
+ registeredBlocksList.add(Block.planks);
+ registeredBlocksList.add(Block.wood);
+ registeredBlocksList.add(Block.leaves);
+ registeredBlocksList.add(Block.torchWood);
+ registeredBlocksList.add(Block.stairSingle);
+ registeredBlocksList.add(Block.glass);
+ registeredBlocksList.add(Block.cobblestoneMossy);
+ registeredBlocksList.add(Block.sapling);
+ registeredBlocksList.add(Block.plantYellow);
+ registeredBlocksList.add(Block.plantRed);
+ registeredBlocksList.add(Block.mushroomBrown);
+ registeredBlocksList.add(Block.mushroomRed);
+ registeredBlocksList.add(Block.sand);
+ registeredBlocksList.add(Block.gravel);
+ registeredBlocksList.add(Block.sponge);
+ registeredBlocksList.add(Block.cloth);
+ registeredBlocksList.add(Block.oreCoal);
+ registeredBlocksList.add(Block.oreIron);
+ registeredBlocksList.add(Block.oreGold);
+ registeredBlocksList.add(Block.blockSteel);
+ registeredBlocksList.add(Block.blockGold);
+ registeredBlocksList.add(Block.bookShelf);
+ registeredBlocksList.add(Block.tnt);
+ registeredBlocksList.add(Block.obsidian);
+ System.out.println(registeredBlocksList.size());
+ }
+}
diff --git a/src/main/java/net/minecraft/src/SignModel.java b/src/main/java/net/minecraft/src/SignModel.java
new file mode 100644
index 0000000..927b6dc
--- /dev/null
+++ b/src/main/java/net/minecraft/src/SignModel.java
@@ -0,0 +1,17 @@
+package net.minecraft.src;
+
+public class SignModel {
+ public ModelRenderer field_1346_a = new ModelRenderer(0, 0);
+ public ModelRenderer field_1345_b;
+
+ public SignModel() {
+ this.field_1346_a.addBox(-12.0F, -14.0F, -1.0F, 24, 12, 2, 0.0F);
+ this.field_1345_b = new ModelRenderer(0, 14);
+ this.field_1345_b.addBox(-1.0F, -2.0F, -1.0F, 2, 14, 2, 0.0F);
+ }
+
+ public void func_887_a() {
+ this.field_1346_a.render(1.0F / 16.0F);
+ this.field_1345_b.render(1.0F / 16.0F);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Slot.java b/src/main/java/net/minecraft/src/Slot.java
new file mode 100644
index 0000000..3bc7e95
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Slot.java
@@ -0,0 +1,40 @@
+package net.minecraft.src;
+
+public class Slot {
+ public final int slotIndex;
+ public final IInventory inventory;
+
+ public Slot(IInventory var1, int var2) {
+ this.inventory = var1;
+ this.slotIndex = var2;
+ }
+
+ public void onPickupFromSlot() {
+ this.onSlotChanged();
+ }
+
+ public boolean isItemValid(ItemStack var1) {
+ return true;
+ }
+
+ public ItemStack getStack() {
+ return this.inventory.getStackInSlot(this.slotIndex);
+ }
+
+ public void putStack(ItemStack var1) {
+ this.inventory.setInventorySlotContents(this.slotIndex, var1);
+ this.onSlotChanged();
+ }
+
+ public int func_775_c() {
+ return -1;
+ }
+
+ public void onSlotChanged() {
+ this.inventory.onInventoryChanged();
+ }
+
+ public int getSlotStackLimit() {
+ return this.inventory.getInventoryStackLimit();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/SlotArmor.java b/src/main/java/net/minecraft/src/SlotArmor.java
new file mode 100644
index 0000000..9e45e94
--- /dev/null
+++ b/src/main/java/net/minecraft/src/SlotArmor.java
@@ -0,0 +1,29 @@
+package net.minecraft.src;
+
+class SlotArmor extends SlotInventory {
+ final int field_1124_c;
+ final GuiInventory field_1123_d;
+
+ SlotArmor(GuiInventory var1, GuiContainer var2, IInventory var3, int var4, int var5, int var6, int var7) {
+ super(var2, var3, var4, var5, var6);
+ this.field_1123_d = var1;
+ this.field_1124_c = var7;
+ }
+
+ public int getSlotStackLimit() {
+ return 1;
+ }
+
+ public boolean isItemValid(ItemStack var1) {
+ if(var1.getItem() instanceof ItemArmor) {
+ return ((ItemArmor)var1.getItem()).armorType == this.field_1124_c;
+ } else {
+ System.out.println(var1.getItem().shiftedIndex + ", " + this.field_1124_c);
+ return var1.getItem().shiftedIndex == Block.pumpkin.blockID ? this.field_1124_c == 0 : false;
+ }
+ }
+
+ public int func_775_c() {
+ return 15 + this.field_1124_c * 16;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/SlotCrafting.java b/src/main/java/net/minecraft/src/SlotCrafting.java
new file mode 100644
index 0000000..82c363d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/SlotCrafting.java
@@ -0,0 +1,23 @@
+package net.minecraft.src;
+
+public class SlotCrafting extends SlotInventory {
+ private final IInventory craftMatrix;
+
+ public SlotCrafting(GuiContainer var1, IInventory var2, IInventory var3, int var4, int var5, int var6) {
+ super(var1, var3, var4, var5, var6);
+ this.craftMatrix = var2;
+ }
+
+ public boolean isItemValid(ItemStack var1) {
+ return false;
+ }
+
+ public void onPickupFromSlot() {
+ for(int var1 = 0; var1 < this.craftMatrix.getSizeInventory(); ++var1) {
+ if(this.craftMatrix.getStackInSlot(var1) != null) {
+ this.craftMatrix.decrStackSize(var1, 1);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/SlotInventory.java b/src/main/java/net/minecraft/src/SlotInventory.java
new file mode 100644
index 0000000..1a25104
--- /dev/null
+++ b/src/main/java/net/minecraft/src/SlotInventory.java
@@ -0,0 +1,22 @@
+package net.minecraft.src;
+
+public class SlotInventory extends Slot {
+ private final GuiContainer guiHandler;
+ public final int xPos;
+ public final int yPos;
+
+ public SlotInventory(GuiContainer var1, IInventory var2, int var3, int var4, int var5) {
+ super(var2, var3);
+ this.guiHandler = var1;
+ this.xPos = var4;
+ this.yPos = var5;
+ }
+
+ public boolean isAtCursorPos(int var1, int var2) {
+ int var3 = (this.guiHandler.width - this.guiHandler.xSize) / 2;
+ int var4 = (this.guiHandler.height - this.guiHandler.ySize) / 2;
+ var1 -= var3;
+ var2 -= var4;
+ return var1 >= this.xPos - 1 && var1 < this.xPos + 16 + 1 && var2 >= this.yPos - 1 && var2 < this.yPos + 16 + 1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/SpawnerAnimals.java b/src/main/java/net/minecraft/src/SpawnerAnimals.java
new file mode 100644
index 0000000..e562ce6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/SpawnerAnimals.java
@@ -0,0 +1,133 @@
+package net.minecraft.src;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+public final class SpawnerAnimals {
+ private static Set eligibleChunksForSpawning = new HashSet();
+
+ protected static ChunkPosition getRandomSpawningPointInChunk(World var0, int var1, int var2) {
+ int var3 = var1 + var0.rand.nextInt(16);
+ int var4 = var0.rand.nextInt(128);
+ int var5 = var2 + var0.rand.nextInt(16);
+ return new ChunkPosition(var3, var4, var5);
+ }
+
+ public static final int performSpawning(World var0) {
+ eligibleChunksForSpawning.clear();
+
+ int var1;
+ for(var1 = 0; var1 < var0.playerEntities.size(); ++var1) {
+ EntityPlayer var2 = (EntityPlayer)var0.playerEntities.get(var1);
+ int var3 = MathHelper.floor_double(var2.posX / 16.0D);
+ int var4 = MathHelper.floor_double(var2.posZ / 16.0D);
+ byte var5 = 8;
+
+ for(int var6 = -var5; var6 <= var5; ++var6) {
+ for(int var7 = -var5; var7 <= var5; ++var7) {
+ eligibleChunksForSpawning.add(new ChunkCoordIntPair(var6 + var3, var7 + var4));
+ }
+ }
+ }
+
+ var1 = 0;
+
+ label113:
+ for(int var28 = 0; var28 < EnumCreatureType.values().length; ++var28) {
+ EnumCreatureType var29 = EnumCreatureType.values()[var28];
+ if(var0.countEntities(var29.field_4278_c) <= var29.maxNumberOfEntityType * eligibleChunksForSpawning.size() / 256) {
+ Iterator var30 = eligibleChunksForSpawning.iterator();
+
+ label110:
+ while(true) {
+ int var8;
+ int var10;
+ int var11;
+ int var12;
+ Class[] var33;
+ do {
+ do {
+ ChunkCoordIntPair var31;
+ do {
+ do {
+ do {
+ if(!var30.hasNext()) {
+ continue label113;
+ }
+
+ var31 = (ChunkCoordIntPair)var30.next();
+ } while(var0.rand.nextInt(50) != 0);
+
+ MobSpawnerBase var32 = var0.func_4075_a().func_4074_a(var31);
+ var33 = var32.getEntitiesForType(var29);
+ } while(var33 == null);
+ } while(var33.length == 0);
+
+ var8 = var0.rand.nextInt(var33.length);
+ ChunkPosition var9 = getRandomSpawningPointInChunk(var0, var31.chunkXPos * 16, var31.chunkZPos * 16);
+ var10 = var9.x;
+ var11 = var9.y;
+ var12 = var9.z;
+ } while(var0.isBlockOpaqueCube(var10, var11, var12));
+ } while(var0.getBlockMaterial(var10, var11, var12) != Material.air);
+
+ int var13 = 0;
+
+ for(int var14 = 0; var14 < 3; ++var14) {
+ int var15 = var10;
+ int var16 = var11;
+ int var17 = var12;
+ byte var18 = 6;
+
+ for(int var19 = 0; var19 < 4; ++var19) {
+ var15 += var0.rand.nextInt(var18) - var0.rand.nextInt(var18);
+ var16 += var0.rand.nextInt(1) - var0.rand.nextInt(1);
+ var17 += var0.rand.nextInt(var18) - var0.rand.nextInt(var18);
+ if(var0.isBlockOpaqueCube(var15, var16 - 1, var17) && !var0.isBlockOpaqueCube(var15, var16, var17) && !var0.getBlockMaterial(var15, var16, var17).getIsLiquid() && !var0.isBlockOpaqueCube(var15, var16 + 1, var17)) {
+ float var20 = (float)var15 + 0.5F;
+ float var21 = (float)var16;
+ float var22 = (float)var17 + 0.5F;
+ if(var0.getClosestPlayer((double)var20, (double)var21, (double)var22, 24.0D) == null) {
+ float var23 = var20 - (float)var0.spawnX;
+ float var24 = var21 - (float)var0.spawnY;
+ float var25 = var22 - (float)var0.spawnZ;
+ float var26 = var23 * var23 + var24 * var24 + var25 * var25;
+ if(var26 >= 576.0F) {
+ EntityLiving var34;
+ try {
+ var34 = (EntityLiving)var33[var8].getConstructor(new Class[]{World.class}).newInstance(new Object[]{var0});
+ } catch (Exception var27) {
+ var27.printStackTrace();
+ return var1;
+ }
+
+ var34.setLocationAndAngles((double)var20, (double)var21, (double)var22, var0.rand.nextFloat() * 360.0F, 0.0F);
+ if(var34.getCanSpawnHere()) {
+ ++var13;
+ var0.entityJoinedWorld(var34);
+ if(var34 instanceof EntitySpider && var0.rand.nextInt(100) == 0) {
+ EntitySkeleton var35 = new EntitySkeleton(var0);
+ var35.setLocationAndAngles((double)var20, (double)var21, (double)var22, var34.rotationYaw, 0.0F);
+ var0.entityJoinedWorld(var35);
+ var35.mountEntity(var34);
+ }
+
+ if(var13 >= var34.func_6391_i()) {
+ continue label110;
+ }
+ }
+
+ var1 += var13;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/StepSound.java b/src/main/java/net/minecraft/src/StepSound.java
new file mode 100644
index 0000000..1f27cbe
--- /dev/null
+++ b/src/main/java/net/minecraft/src/StepSound.java
@@ -0,0 +1,29 @@
+package net.minecraft.src;
+
+public class StepSound {
+ public final String field_1678_a;
+ public final float field_1677_b;
+ public final float field_1679_c;
+
+ public StepSound(String var1, float var2, float var3) {
+ this.field_1678_a = var1;
+ this.field_1677_b = var2;
+ this.field_1679_c = var3;
+ }
+
+ public float func_1147_b() {
+ return this.field_1677_b;
+ }
+
+ public float func_1144_c() {
+ return this.field_1679_c;
+ }
+
+ public String func_1146_a() {
+ return "step." + this.field_1678_a;
+ }
+
+ public String func_1145_d() {
+ return "step." + this.field_1678_a;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/StepSoundSand.java b/src/main/java/net/minecraft/src/StepSoundSand.java
new file mode 100644
index 0000000..04ecafa
--- /dev/null
+++ b/src/main/java/net/minecraft/src/StepSoundSand.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+final class StepSoundSand extends StepSound {
+ StepSoundSand(String var1, float var2, float var3) {
+ super(var1, var2, var3);
+ }
+
+ public String func_1146_a() {
+ return "step.gravel";
+ }
+}
diff --git a/src/main/java/net/minecraft/src/StepSoundStone.java b/src/main/java/net/minecraft/src/StepSoundStone.java
new file mode 100644
index 0000000..992cb3d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/StepSoundStone.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+final class StepSoundStone extends StepSound {
+ StepSoundStone(String var1, float var2, float var3) {
+ super(var1, var2, var3);
+ }
+
+ public String func_1146_a() {
+ return "random.glass";
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Teleporter.java b/src/main/java/net/minecraft/src/Teleporter.java
new file mode 100644
index 0000000..71860bd
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Teleporter.java
@@ -0,0 +1,262 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class Teleporter {
+ private Random field_4232_a = new Random();
+
+ public void func_4107_a(World var1, Entity var2) {
+ if(!this.func_4106_b(var1, var2)) {
+ this.func_4108_c(var1, var2);
+ this.func_4106_b(var1, var2);
+ }
+ }
+
+ public boolean func_4106_b(World var1, Entity var2) {
+ short var3 = 128;
+ double var4 = -1.0D;
+ int var6 = 0;
+ int var7 = 0;
+ int var8 = 0;
+ int var9 = MathHelper.floor_double(var2.posX);
+ int var10 = MathHelper.floor_double(var2.posZ);
+
+ double var18;
+ for(int var11 = var9 - var3; var11 <= var9 + var3; ++var11) {
+ double var12 = (double)var11 + 0.5D - var2.posX;
+
+ for(int var14 = var10 - var3; var14 <= var10 + var3; ++var14) {
+ double var15 = (double)var14 + 0.5D - var2.posZ;
+
+ for(int var17 = 127; var17 >= 0; --var17) {
+ if(var1.getBlockId(var11, var17, var14) == Block.portal.blockID) {
+ while(var1.getBlockId(var11, var17 - 1, var14) == Block.portal.blockID) {
+ --var17;
+ }
+
+ var18 = (double)var17 + 0.5D - var2.posY;
+ double var20 = var12 * var12 + var18 * var18 + var15 * var15;
+ if(var4 < 0.0D || var20 < var4) {
+ var4 = var20;
+ var6 = var11;
+ var7 = var17;
+ var8 = var14;
+ }
+ }
+ }
+ }
+ }
+
+ if(var4 >= 0.0D) {
+ double var22 = (double)var6 + 0.5D;
+ double var16 = (double)var7 + 0.5D;
+ var18 = (double)var8 + 0.5D;
+ if(var1.getBlockId(var6 - 1, var7, var8) == Block.portal.blockID) {
+ var22 -= 0.5D;
+ }
+
+ if(var1.getBlockId(var6 + 1, var7, var8) == Block.portal.blockID) {
+ var22 += 0.5D;
+ }
+
+ if(var1.getBlockId(var6, var7, var8 - 1) == Block.portal.blockID) {
+ var18 -= 0.5D;
+ }
+
+ if(var1.getBlockId(var6, var7, var8 + 1) == Block.portal.blockID) {
+ var18 += 0.5D;
+ }
+
+ System.out.println("Teleporting to " + var22 + ", " + var16 + ", " + var18);
+ var2.setLocationAndAngles(var22, var16, var18, var2.rotationYaw, 0.0F);
+ var2.motionX = var2.motionY = var2.motionZ = 0.0D;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean func_4108_c(World var1, Entity var2) {
+ byte var3 = 16;
+ double var4 = -1.0D;
+ int var6 = MathHelper.floor_double(var2.posX);
+ int var7 = MathHelper.floor_double(var2.posY);
+ int var8 = MathHelper.floor_double(var2.posZ);
+ int var9 = var6;
+ int var10 = var7;
+ int var11 = var8;
+ int var12 = 0;
+ int var13 = this.field_4232_a.nextInt(4);
+
+ int var14;
+ double var15;
+ int var17;
+ double var18;
+ int var20;
+ int var21;
+ int var22;
+ int var23;
+ int var24;
+ int var25;
+ int var26;
+ int var27;
+ int var28;
+ double var32;
+ double var33;
+ for(var14 = var6 - var3; var14 <= var6 + var3; ++var14) {
+ var15 = (double)var14 + 0.5D - var2.posX;
+
+ for(var17 = var8 - var3; var17 <= var8 + var3; ++var17) {
+ var18 = (double)var17 + 0.5D - var2.posZ;
+
+ label293:
+ for(var20 = 127; var20 >= 0; --var20) {
+ if(var1.getBlockId(var14, var20, var17) == 0) {
+ while(var20 > 0 && var1.getBlockId(var14, var20 - 1, var17) == 0) {
+ --var20;
+ }
+
+ for(var21 = var13; var21 < var13 + 4; ++var21) {
+ var22 = var21 % 2;
+ var23 = 1 - var22;
+ if(var21 % 4 >= 2) {
+ var22 = -var22;
+ var23 = -var23;
+ }
+
+ for(var24 = 0; var24 < 3; ++var24) {
+ for(var25 = 0; var25 < 4; ++var25) {
+ for(var26 = -1; var26 < 4; ++var26) {
+ var27 = var14 + (var25 - 1) * var22 + var24 * var23;
+ var28 = var20 + var26;
+ int var29 = var17 + (var25 - 1) * var23 - var24 * var22;
+ if(var26 < 0 && !var1.getBlockMaterial(var27, var28, var29).func_878_a() || var26 >= 0 && var1.getBlockId(var27, var28, var29) != 0) {
+ continue label293;
+ }
+ }
+ }
+ }
+
+ var32 = (double)var20 + 0.5D - var2.posY;
+ var33 = var15 * var15 + var32 * var32 + var18 * var18;
+ if(var4 < 0.0D || var33 < var4) {
+ var4 = var33;
+ var9 = var14;
+ var10 = var20;
+ var11 = var17;
+ var12 = var21 % 4;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(var4 < 0.0D) {
+ for(var14 = var6 - var3; var14 <= var6 + var3; ++var14) {
+ var15 = (double)var14 + 0.5D - var2.posX;
+
+ for(var17 = var8 - var3; var17 <= var8 + var3; ++var17) {
+ var18 = (double)var17 + 0.5D - var2.posZ;
+
+ label231:
+ for(var20 = 127; var20 >= 0; --var20) {
+ if(var1.getBlockId(var14, var20, var17) == 0) {
+ while(var1.getBlockId(var14, var20 - 1, var17) == 0) {
+ --var20;
+ }
+
+ for(var21 = var13; var21 < var13 + 2; ++var21) {
+ var22 = var21 % 2;
+ var23 = 1 - var22;
+
+ for(var24 = 0; var24 < 4; ++var24) {
+ for(var25 = -1; var25 < 4; ++var25) {
+ var26 = var14 + (var24 - 1) * var22;
+ var27 = var20 + var25;
+ var28 = var17 + (var24 - 1) * var23;
+ if(var25 < 0 && !var1.getBlockMaterial(var26, var27, var28).func_878_a() || var25 >= 0 && var1.getBlockId(var26, var27, var28) != 0) {
+ continue label231;
+ }
+ }
+ }
+
+ var32 = (double)var20 + 0.5D - var2.posY;
+ var33 = var15 * var15 + var32 * var32 + var18 * var18;
+ if(var4 < 0.0D || var33 < var4) {
+ var4 = var33;
+ var9 = var14;
+ var10 = var20;
+ var11 = var17;
+ var12 = var21 % 2;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ int var30 = var9;
+ int var16 = var10;
+ var17 = var11;
+ int var31 = var12 % 2;
+ int var19 = 1 - var31;
+ if(var12 % 4 >= 2) {
+ var31 = -var31;
+ var19 = -var19;
+ }
+
+ boolean var34;
+ if(var4 < 0.0D) {
+ if(var10 < 70) {
+ var10 = 70;
+ }
+
+ if(var10 > 118) {
+ var10 = 118;
+ }
+
+ var16 = var10;
+
+ for(var20 = -1; var20 <= 1; ++var20) {
+ for(var21 = 1; var21 < 3; ++var21) {
+ for(var22 = -1; var22 < 3; ++var22) {
+ var23 = var30 + (var21 - 1) * var31 + var20 * var19;
+ var24 = var16 + var22;
+ var25 = var17 + (var21 - 1) * var19 - var20 * var31;
+ var34 = var22 < 0;
+ var1.setBlockWithNotify(var23, var24, var25, var34 ? Block.obsidian.blockID : 0);
+ }
+ }
+ }
+ }
+
+ for(var20 = 0; var20 < 4; ++var20) {
+ var1.field_1043_h = true;
+
+ for(var21 = 0; var21 < 4; ++var21) {
+ for(var22 = -1; var22 < 4; ++var22) {
+ var23 = var30 + (var21 - 1) * var31;
+ var24 = var16 + var22;
+ var25 = var17 + (var21 - 1) * var19;
+ var34 = var21 == 0 || var21 == 3 || var22 == -1 || var22 == 3;
+ var1.setBlockWithNotify(var23, var24, var25, var34 ? Block.obsidian.blockID : Block.portal.blockID);
+ }
+ }
+
+ var1.field_1043_h = false;
+
+ for(var21 = 0; var21 < 4; ++var21) {
+ for(var22 = -1; var22 < 4; ++var22) {
+ var23 = var30 + (var21 - 1) * var31;
+ var24 = var16 + var22;
+ var25 = var17 + (var21 - 1) * var19;
+ var1.notifyBlocksOfNeighborChange(var23, var24, var25, var1.getBlockId(var23, var24, var25));
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TerrainTextureManager.java b/src/main/java/net/minecraft/src/TerrainTextureManager.java
new file mode 100644
index 0000000..6e1b295
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TerrainTextureManager.java
@@ -0,0 +1,87 @@
+package net.minecraft.src;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.Arrays;
+import javax.imageio.ImageIO;
+
+public class TerrainTextureManager {
+ private float[] field_1181_a = new float[768];
+ private int[] field_1180_b = new int[5120];
+ private int[] field_1186_c = new int[5120];
+ private int[] field_1185_d = new int[5120];
+ private int[] field_1184_e = new int[5120];
+ private int[] field_1183_f = new int[34];
+ private int[] field_1182_g = new int[768];
+
+ public TerrainTextureManager() {
+ try {
+ BufferedImage var1 = ImageIO.read(TerrainTextureManager.class.getResource("/terrain.png"));
+ int[] var2 = new int[65536];
+ var1.getRGB(0, 0, 256, 256, var2, 0, 256);
+
+ for(int var3 = 0; var3 < 256; ++var3) {
+ int var4 = 0;
+ int var5 = 0;
+ int var6 = 0;
+ int var7 = var3 % 16 * 16;
+ int var8 = var3 / 16 * 16;
+ int var9 = 0;
+
+ for(int var10 = 0; var10 < 16; ++var10) {
+ for(int var11 = 0; var11 < 16; ++var11) {
+ int var12 = var2[var11 + var7 + (var10 + var8) * 256];
+ int var13 = var12 >> 24 & 255;
+ if(var13 > 128) {
+ var4 += var12 >> 16 & 255;
+ var5 += var12 >> 8 & 255;
+ var6 += var12 & 255;
+ ++var9;
+ }
+ }
+
+ if(var9 == 0) {
+ ++var9;
+ }
+
+ this.field_1181_a[var3 * 3 + 0] = (float)(var4 / var9);
+ this.field_1181_a[var3 * 3 + 1] = (float)(var5 / var9);
+ this.field_1181_a[var3 * 3 + 2] = (float)(var6 / var9);
+ }
+ }
+ } catch (IOException var14) {
+ var14.printStackTrace();
+ }
+
+ for(int var15 = 0; var15 < 256; ++var15) {
+ if(Block.blocksList[var15] != null) {
+ this.field_1182_g[var15 * 3 + 0] = Block.blocksList[var15].getBlockTextureFromSide(1);
+ this.field_1182_g[var15 * 3 + 1] = Block.blocksList[var15].getBlockTextureFromSide(2);
+ this.field_1182_g[var15 * 3 + 2] = Block.blocksList[var15].getBlockTextureFromSide(3);
+ }
+ }
+
+ }
+
+ private void func_800_a() {
+ for(int var1 = 0; var1 < 32; ++var1) {
+ for(int var2 = 0; var2 < 160; ++var2) {
+ int var3 = var1 + var2 * 32;
+ if(this.field_1186_c[var3] == 0) {
+ this.field_1180_b[var3] = 0;
+ }
+
+ if(this.field_1185_d[var3] > this.field_1186_c[var3]) {
+ int var4 = this.field_1180_b[var3] >> 24 & 255;
+ this.field_1180_b[var3] = ((this.field_1180_b[var3] & 16711422) >> 1) + this.field_1184_e[var3];
+ if(var4 < 128) {
+ this.field_1180_b[var3] = Integer.MIN_VALUE + this.field_1184_e[var3] * 2;
+ } else {
+ this.field_1180_b[var3] |= -16777216;
+ }
+ }
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Tessellator.java b/src/main/java/net/minecraft/src/Tessellator.java
new file mode 100644
index 0000000..b5605a4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Tessellator.java
@@ -0,0 +1,268 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+import org.teavm.jso.typedarrays.ArrayBuffer;
+import org.teavm.jso.typedarrays.Float32Array;
+import org.teavm.jso.typedarrays.Int32Array;
+
+public class Tessellator {
+
+ private Int32Array intBuffer;
+ private Float32Array floatBuffer;
+ private int vertexCount = 0;
+ private float textureU;
+ private float textureV;
+ private int color;
+ private boolean hasColor = false;
+ private boolean hasTexture = false;
+ private int rawBufferIndex = 0;
+ private int addedVertices = 0;
+ private boolean isColorDisabled = false;
+ private int drawMode;
+ private double xOffset;
+ private double yOffset;
+ private double zOffset;
+ public static final Tessellator instance = new Tessellator(524288);
+ private boolean isDrawing = false;
+
+ private Tessellator(int par1) {
+ ArrayBuffer a = ArrayBuffer.create(par1 * 4);
+ this.intBuffer = Int32Array.create(a);
+ this.floatBuffer = Float32Array.create(a);
+ }
+
+ /**
+ * Draws the data set up in this tessellator and resets the state to prepare for
+ * new drawing.
+ */
+ public int draw() {
+ if (!this.isDrawing) {
+ return 0;
+ } else {
+ this.isDrawing = false;
+
+ if (this.vertexCount > 0) {
+
+ if (this.hasTexture) {
+ GL11.glEnableVertexAttrib(GL11.GL_TEXTURE_COORD_ARRAY);
+ }
+
+ if (this.hasColor) {
+ GL11.glEnableVertexAttrib(GL11.GL_COLOR_ARRAY);
+ }
+
+ GL11.glDrawArrays(this.drawMode, 0, this.vertexCount, Int32Array.create(intBuffer.getBuffer(), 0, this.vertexCount * 7));
+
+ if (this.hasTexture) {
+ GL11.glDisableVertexAttrib(GL11.GL_TEXTURE_COORD_ARRAY);
+ }
+
+ if (this.hasColor) {
+ GL11.glDisableVertexAttrib(GL11.GL_COLOR_ARRAY);
+ }
+ }
+
+ int var1 = this.rawBufferIndex * 4;
+ this.reset();
+ return var1;
+ }
+ }
+
+ /**
+ * Clears the tessellator state in preparation for new drawing.
+ */
+ private void reset() {
+ this.vertexCount = 0;
+ //this.byteBuffer.clear();
+ this.rawBufferIndex = 0;
+ this.addedVertices = 0;
+ }
+
+ /**
+ * Sets draw mode in the tessellator to draw quads.
+ */
+ public void startDrawingQuads() {
+ this.startDrawing(GL11.GL_QUADS);
+ }
+
+ /**
+ * Resets tessellator state and prepares for drawing (with the specified draw
+ * mode).
+ */
+ public void startDrawing(int par1) {
+ if (this.isDrawing) {
+ this.draw();
+ }
+ this.isDrawing = true;
+ this.reset();
+ this.drawMode = par1;
+ this.hasColor = false;
+ this.hasTexture = false;
+ this.isColorDisabled = false;
+ }
+
+ /**
+ * Sets the texture coordinates.
+ */
+ public void setTextureUV(double par1, double par3) {
+ this.hasTexture = true;
+ this.textureU = (float) par1;
+ this.textureV = (float) par3;
+ }
+
+ /**
+ * Sets the RGB values as specified, converting from floats between 0 and 1 to
+ * integers from 0-255.
+ */
+ public void setColorOpaque_F(float par1, float par2, float par3) {
+ this.setColorOpaque((int) (par1 * 255.0F), (int) (par2 * 255.0F), (int) (par3 * 255.0F));
+ }
+
+ /**
+ * Sets the RGBA values for the color, converting from floats between 0 and 1 to
+ * integers from 0-255.
+ */
+ public void setColorRGBA_F(float par1, float par2, float par3, float par4) {
+ this.setColorRGBA((int) (par1 * 255.0F), (int) (par2 * 255.0F), (int) (par3 * 255.0F), (int) (par4 * 255.0F));
+ }
+
+ /**
+ * Sets the RGB values as specified, and sets alpha to opaque.
+ */
+ public void setColorOpaque(int par1, int par2, int par3) {
+ this.setColorRGBA(par1, par2, par3, 255);
+ }
+
+ /**
+ * Sets the RGBA values for the color. Also clamps them to 0-255.
+ */
+ public void setColorRGBA(int par1, int par2, int par3, int par4) {
+ if (!this.isColorDisabled) {
+ if (par1 > 255) {
+ par1 = 255;
+ }
+
+ if (par2 > 255) {
+ par2 = 255;
+ }
+
+ if (par3 > 255) {
+ par3 = 255;
+ }
+
+ if (par4 > 255) {
+ par4 = 255;
+ }
+
+ if (par1 < 0) {
+ par1 = 0;
+ }
+
+ if (par2 < 0) {
+ par2 = 0;
+ }
+
+ if (par3 < 0) {
+ par3 = 0;
+ }
+
+ if (par4 < 0) {
+ par4 = 0;
+ }
+
+ this.hasColor = true;
+ this.color = par4 << 24 | par3 << 16 | par2 << 8 | par1;
+ }
+ }
+
+ /**
+ * Adds a vertex specifying both x,y,z and the texture u,v for it.
+ */
+ public void addVertexWithUV(double par1, double par3, double par5, double par7, double par9) {
+ this.setTextureUV(par7, par9);
+ this.addVertex(par1, par3, par5);
+ }
+
+ /**
+ * Adds a vertex with the specified x,y,z to the current draw call. It will
+ * trigger a draw() if the buffer gets full.
+ */
+ public void addVertex(double par1, double par3, double par5) {
+ if(this.addedVertices > 65534) return;
+ ++this.addedVertices;
+ ++this.vertexCount;
+
+ int bufferIndex = this.rawBufferIndex;
+ Int32Array intBuffer0 = intBuffer;
+ Float32Array floatBuffer0 = floatBuffer;
+
+ floatBuffer0.set(bufferIndex + 0, (float) (par1 + this.xOffset));
+ floatBuffer0.set(bufferIndex + 1, (float) (par3 + this.yOffset));
+ floatBuffer0.set(bufferIndex + 2, (float) (par5 + this.zOffset));
+
+ if (this.hasTexture) {
+ floatBuffer0.set(bufferIndex + 3, this.textureU);
+ floatBuffer0.set(bufferIndex + 4, this.textureV);
+ }
+
+ if (this.hasColor) {
+ intBuffer0.set(bufferIndex + 5, this.color);
+ }
+
+ this.rawBufferIndex += 7;
+ }
+
+ /**
+ * Sets the color to the given opaque value (stored as byte values packed in an
+ * integer).
+ */
+ public void setColorOpaque_I(int par1) {
+ int var2 = par1 >> 16 & 255;
+ int var3 = par1 >> 8 & 255;
+ int var4 = par1 & 255;
+ this.setColorOpaque(var2, var3, var4);
+ }
+
+ /**
+ * Sets the color to the given color (packed as bytes in integer) and alpha
+ * values.
+ */
+ public void setColorRGBA_I(int par1, int par2) {
+ int var3 = par1 >> 16 & 255;
+ int var4 = par1 >> 8 & 255;
+ int var5 = par1 & 255;
+ this.setColorRGBA(var3, var4, var5, par2);
+ }
+
+ /**
+ * Disables colors for the current draw call.
+ */
+ public void disableColor() {
+ this.isColorDisabled = true;
+ }
+
+ /**
+ * Sets the normal for the current draw call.
+ */
+ public void setNormal(float par1, float par2, float par3) {
+ GL11.glNormal3f(par1, par2, par3);
+ }
+
+ /**
+ * Sets the translation for all vertices in the current draw call.
+ */
+ public void setTranslationD(double par1, double par3, double par5) {
+ this.xOffset = par1;
+ this.yOffset = par3;
+ this.zOffset = par5;
+ }
+
+ /**
+ * Offsets the translation for all vertices in the current draw call.
+ */
+ public void setTranslationF(float par1, float par2, float par3) {
+ this.xOffset += (float) par1;
+ this.yOffset += (float) par2;
+ this.zOffset += (float) par3;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/src/TextureCompassFX.java b/src/main/java/net/minecraft/src/TextureCompassFX.java
new file mode 100644
index 0000000..6bd1afd
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TextureCompassFX.java
@@ -0,0 +1,142 @@
+package net.minecraft.src;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import net.minecraft.client.Minecraft;
+
+public class TextureCompassFX extends TextureFX {
+ private Minecraft mc;
+ private int[] field_4230_h = new int[256];
+ private double field_4229_i;
+ private double field_4228_j;
+
+ public TextureCompassFX(Minecraft var1) {
+ super(Item.compass.getIconIndex((ItemStack)null));
+ this.mc = var1;
+ this.field_1128_f = 1;
+
+ try {
+ BufferedImage var2 = ImageIO.read(Minecraft.class.getResource("/gui/items.png"));
+ int var3 = this.field_1126_b % 16 * 16;
+ int var4 = this.field_1126_b / 16 * 16;
+ var2.getRGB(var3, var4, 16, 16, this.field_4230_h, 0, 16);
+ } catch (IOException var5) {
+ var5.printStackTrace();
+ }
+
+ }
+
+ public void func_783_a() {
+ for(int var1 = 0; var1 < 256; ++var1) {
+ int var2 = this.field_4230_h[var1] >> 24 & 255;
+ int var3 = this.field_4230_h[var1] >> 16 & 255;
+ int var4 = this.field_4230_h[var1] >> 8 & 255;
+ int var5 = this.field_4230_h[var1] >> 0 & 255;
+ if(this.field_1131_c) {
+ int var6 = (var3 * 30 + var4 * 59 + var5 * 11) / 100;
+ int var7 = (var3 * 30 + var4 * 70) / 100;
+ int var8 = (var3 * 30 + var5 * 70) / 100;
+ var3 = var6;
+ var4 = var7;
+ var5 = var8;
+ }
+
+ this.field_1127_a[var1 * 4 + 0] = (byte)var3;
+ this.field_1127_a[var1 * 4 + 1] = (byte)var4;
+ this.field_1127_a[var1 * 4 + 2] = (byte)var5;
+ this.field_1127_a[var1 * 4 + 3] = (byte)var2;
+ }
+
+ double var20 = 0.0D;
+ double var21;
+ double var22;
+ if(this.mc.theWorld != null && this.mc.thePlayer != null) {
+ var21 = (double)this.mc.theWorld.spawnX - this.mc.thePlayer.posX;
+ var22 = (double)this.mc.theWorld.spawnZ - this.mc.thePlayer.posZ;
+ var20 = (double)(this.mc.thePlayer.rotationYaw - 90.0F) * Math.PI / 180.0D - Math.atan2(var22, var21);
+ if(this.mc.theWorld.worldProvider.field_4220_c) {
+ var20 = Math.random() * (double)((float)Math.PI) * 2.0D;
+ }
+ }
+
+ for(var21 = var20 - this.field_4229_i; var21 < -Math.PI; var21 += Math.PI * 2.0D) {
+ }
+
+ while(var21 >= Math.PI) {
+ var21 -= Math.PI * 2.0D;
+ }
+
+ if(var21 < -1.0D) {
+ var21 = -1.0D;
+ }
+
+ if(var21 > 1.0D) {
+ var21 = 1.0D;
+ }
+
+ this.field_4228_j += var21 * 0.1D;
+ this.field_4228_j *= 0.8D;
+ this.field_4229_i += this.field_4228_j;
+ var22 = Math.sin(this.field_4229_i);
+ double var23 = Math.cos(this.field_4229_i);
+
+ int var9;
+ int var10;
+ int var11;
+ int var12;
+ int var13;
+ int var14;
+ int var15;
+ short var16;
+ int var17;
+ int var18;
+ int var19;
+ for(var9 = -4; var9 <= 4; ++var9) {
+ var10 = (int)(8.5D + var23 * (double)var9 * 0.3D);
+ var11 = (int)(7.5D - var22 * (double)var9 * 0.3D * 0.5D);
+ var12 = var11 * 16 + var10;
+ var13 = 100;
+ var14 = 100;
+ var15 = 100;
+ var16 = 255;
+ if(this.field_1131_c) {
+ var17 = (var13 * 30 + var14 * 59 + var15 * 11) / 100;
+ var18 = (var13 * 30 + var14 * 70) / 100;
+ var19 = (var13 * 30 + var15 * 70) / 100;
+ var13 = var17;
+ var14 = var18;
+ var15 = var19;
+ }
+
+ this.field_1127_a[var12 * 4 + 0] = (byte)var13;
+ this.field_1127_a[var12 * 4 + 1] = (byte)var14;
+ this.field_1127_a[var12 * 4 + 2] = (byte)var15;
+ this.field_1127_a[var12 * 4 + 3] = (byte)var16;
+ }
+
+ for(var9 = -8; var9 <= 16; ++var9) {
+ var10 = (int)(8.5D + var22 * (double)var9 * 0.3D);
+ var11 = (int)(7.5D + var23 * (double)var9 * 0.3D * 0.5D);
+ var12 = var11 * 16 + var10;
+ var13 = var9 >= 0 ? 255 : 100;
+ var14 = var9 >= 0 ? 20 : 100;
+ var15 = var9 >= 0 ? 20 : 100;
+ var16 = 255;
+ if(this.field_1131_c) {
+ var17 = (var13 * 30 + var14 * 59 + var15 * 11) / 100;
+ var18 = (var13 * 30 + var14 * 70) / 100;
+ var19 = (var13 * 30 + var15 * 70) / 100;
+ var13 = var17;
+ var14 = var18;
+ var15 = var19;
+ }
+
+ this.field_1127_a[var12 * 4 + 0] = (byte)var13;
+ this.field_1127_a[var12 * 4 + 1] = (byte)var14;
+ this.field_1127_a[var12 * 4 + 2] = (byte)var15;
+ this.field_1127_a[var12 * 4 + 3] = (byte)var16;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TextureFX.java b/src/main/java/net/minecraft/src/TextureFX.java
new file mode 100644
index 0000000..a203af8
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TextureFX.java
@@ -0,0 +1,28 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class TextureFX {
+ public byte[] field_1127_a = new byte[1024];
+ public int field_1126_b;
+ public boolean field_1131_c = false;
+ public int field_1130_d = 0;
+ public int field_1129_e = 1;
+ public int field_1128_f = 0;
+
+ public TextureFX(int var1) {
+ this.field_1126_b = var1;
+ }
+
+ public void func_783_a() {
+ }
+
+ public void func_782_a(RenderEngine var1) {
+ if(this.field_1128_f == 0) {
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var1.getTexture("/terrain.png"));
+ } else if(this.field_1128_f == 1) {
+ GL11.glBindTexture(GL11.GL_TEXTURE_2D, var1.getTexture("/gui/items.png"));
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TextureFlamesFX.java b/src/main/java/net/minecraft/src/TextureFlamesFX.java
new file mode 100644
index 0000000..4b529e5
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TextureFlamesFX.java
@@ -0,0 +1,77 @@
+package net.minecraft.src;
+
+public class TextureFlamesFX extends TextureFX {
+ protected float[] field_1133_g = new float[320];
+ protected float[] field_1132_h = new float[320];
+
+ public TextureFlamesFX(int var1) {
+ super(Block.fire.blockIndexInTexture + var1 * 16);
+ }
+
+ public void func_783_a() {
+ int var2;
+ float var4;
+ int var5;
+ int var6;
+ for(int var1 = 0; var1 < 16; ++var1) {
+ for(var2 = 0; var2 < 20; ++var2) {
+ int var3 = 18;
+ var4 = this.field_1133_g[var1 + (var2 + 1) % 20 * 16] * (float)var3;
+
+ for(var5 = var1 - 1; var5 <= var1 + 1; ++var5) {
+ for(var6 = var2; var6 <= var2 + 1; ++var6) {
+ if(var5 >= 0 && var6 >= 0 && var5 < 16 && var6 < 20) {
+ var4 += this.field_1133_g[var5 + var6 * 16];
+ }
+
+ ++var3;
+ }
+ }
+
+ this.field_1132_h[var1 + var2 * 16] = var4 / ((float)var3 * 1.06F);
+ if(var2 >= 19) {
+ this.field_1132_h[var1 + var2 * 16] = (float)(Math.random() * Math.random() * Math.random() * 4.0D + Math.random() * (double)0.1F + (double)0.2F);
+ }
+ }
+ }
+
+ float[] var12 = this.field_1132_h;
+ this.field_1132_h = this.field_1133_g;
+ this.field_1133_g = var12;
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ float var13 = this.field_1133_g[var2] * 1.8F;
+ if(var13 > 1.0F) {
+ var13 = 1.0F;
+ }
+
+ if(var13 < 0.0F) {
+ var13 = 0.0F;
+ }
+
+ var5 = (int)(var13 * 155.0F + 100.0F);
+ var6 = (int)(var13 * var13 * 255.0F);
+ int var7 = (int)(var13 * var13 * var13 * var13 * var13 * var13 * var13 * var13 * var13 * var13 * 255.0F);
+ short var8 = 255;
+ if(var13 < 0.5F) {
+ var8 = 0;
+ }
+
+ var4 = (var13 - 0.5F) * 2.0F;
+ if(this.field_1131_c) {
+ int var9 = (var5 * 30 + var6 * 59 + var7 * 11) / 100;
+ int var10 = (var5 * 30 + var6 * 70) / 100;
+ int var11 = (var5 * 30 + var7 * 70) / 100;
+ var5 = var9;
+ var6 = var10;
+ var7 = var11;
+ }
+
+ this.field_1127_a[var2 * 4 + 0] = (byte)var5;
+ this.field_1127_a[var2 * 4 + 1] = (byte)var6;
+ this.field_1127_a[var2 * 4 + 2] = (byte)var7;
+ this.field_1127_a[var2 * 4 + 3] = (byte)var8;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TextureLavaFX.java b/src/main/java/net/minecraft/src/TextureLavaFX.java
new file mode 100644
index 0000000..cd21f29
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TextureLavaFX.java
@@ -0,0 +1,81 @@
+package net.minecraft.src;
+
+public class TextureLavaFX extends TextureFX {
+ protected float[] field_1147_g = new float[256];
+ protected float[] field_1146_h = new float[256];
+ protected float[] field_1145_i = new float[256];
+ protected float[] field_1144_j = new float[256];
+
+ public TextureLavaFX() {
+ super(Block.lavaStill.blockIndexInTexture);
+ }
+
+ public void func_783_a() {
+ int var2;
+ float var3;
+ int var5;
+ int var6;
+ int var7;
+ int var8;
+ int var9;
+ for(int var1 = 0; var1 < 16; ++var1) {
+ for(var2 = 0; var2 < 16; ++var2) {
+ var3 = 0.0F;
+ int var4 = (int)(MathHelper.sin((float)var2 * (float)Math.PI * 2.0F / 16.0F) * 1.2F);
+ var5 = (int)(MathHelper.sin((float)var1 * (float)Math.PI * 2.0F / 16.0F) * 1.2F);
+
+ for(var6 = var1 - 1; var6 <= var1 + 1; ++var6) {
+ for(var7 = var2 - 1; var7 <= var2 + 1; ++var7) {
+ var8 = var6 + var4 & 15;
+ var9 = var7 + var5 & 15;
+ var3 += this.field_1147_g[var8 + var9 * 16];
+ }
+ }
+
+ this.field_1146_h[var1 + var2 * 16] = var3 / 10.0F + (this.field_1145_i[(var1 + 0 & 15) + (var2 + 0 & 15) * 16] + this.field_1145_i[(var1 + 1 & 15) + (var2 + 0 & 15) * 16] + this.field_1145_i[(var1 + 1 & 15) + (var2 + 1 & 15) * 16] + this.field_1145_i[(var1 + 0 & 15) + (var2 + 1 & 15) * 16]) / 4.0F * 0.8F;
+ this.field_1145_i[var1 + var2 * 16] += this.field_1144_j[var1 + var2 * 16] * 0.01F;
+ if(this.field_1145_i[var1 + var2 * 16] < 0.0F) {
+ this.field_1145_i[var1 + var2 * 16] = 0.0F;
+ }
+
+ this.field_1144_j[var1 + var2 * 16] -= 0.06F;
+ if(Math.random() < 0.005D) {
+ this.field_1144_j[var1 + var2 * 16] = 1.5F;
+ }
+ }
+ }
+
+ float[] var11 = this.field_1146_h;
+ this.field_1146_h = this.field_1147_g;
+ this.field_1147_g = var11;
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ var3 = this.field_1147_g[var2] * 2.0F;
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ var5 = (int)(var3 * 100.0F + 155.0F);
+ var6 = (int)(var3 * var3 * 255.0F);
+ var7 = (int)(var3 * var3 * var3 * var3 * 128.0F);
+ if(this.field_1131_c) {
+ var8 = (var5 * 30 + var6 * 59 + var7 * 11) / 100;
+ var9 = (var5 * 30 + var6 * 70) / 100;
+ int var10 = (var5 * 30 + var7 * 70) / 100;
+ var5 = var8;
+ var6 = var9;
+ var7 = var10;
+ }
+
+ this.field_1127_a[var2 * 4 + 0] = (byte)var5;
+ this.field_1127_a[var2 * 4 + 1] = (byte)var6;
+ this.field_1127_a[var2 * 4 + 2] = (byte)var7;
+ this.field_1127_a[var2 * 4 + 3] = -1;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TextureLavaFlowFX.java b/src/main/java/net/minecraft/src/TextureLavaFlowFX.java
new file mode 100644
index 0000000..82379f4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TextureLavaFlowFX.java
@@ -0,0 +1,85 @@
+package net.minecraft.src;
+
+public class TextureLavaFlowFX extends TextureFX {
+ protected float[] field_1143_g = new float[256];
+ protected float[] field_1142_h = new float[256];
+ protected float[] field_1141_i = new float[256];
+ protected float[] field_1140_j = new float[256];
+ int field_1139_k = 0;
+
+ public TextureLavaFlowFX() {
+ super(Block.lavaStill.blockIndexInTexture + 1);
+ this.field_1129_e = 2;
+ }
+
+ public void func_783_a() {
+ ++this.field_1139_k;
+
+ int var2;
+ float var3;
+ int var5;
+ int var6;
+ int var7;
+ int var8;
+ int var9;
+ for(int var1 = 0; var1 < 16; ++var1) {
+ for(var2 = 0; var2 < 16; ++var2) {
+ var3 = 0.0F;
+ int var4 = (int)(MathHelper.sin((float)var2 * (float)Math.PI * 2.0F / 16.0F) * 1.2F);
+ var5 = (int)(MathHelper.sin((float)var1 * (float)Math.PI * 2.0F / 16.0F) * 1.2F);
+
+ for(var6 = var1 - 1; var6 <= var1 + 1; ++var6) {
+ for(var7 = var2 - 1; var7 <= var2 + 1; ++var7) {
+ var8 = var6 + var4 & 15;
+ var9 = var7 + var5 & 15;
+ var3 += this.field_1143_g[var8 + var9 * 16];
+ }
+ }
+
+ this.field_1142_h[var1 + var2 * 16] = var3 / 10.0F + (this.field_1141_i[(var1 + 0 & 15) + (var2 + 0 & 15) * 16] + this.field_1141_i[(var1 + 1 & 15) + (var2 + 0 & 15) * 16] + this.field_1141_i[(var1 + 1 & 15) + (var2 + 1 & 15) * 16] + this.field_1141_i[(var1 + 0 & 15) + (var2 + 1 & 15) * 16]) / 4.0F * 0.8F;
+ this.field_1141_i[var1 + var2 * 16] += this.field_1140_j[var1 + var2 * 16] * 0.01F;
+ if(this.field_1141_i[var1 + var2 * 16] < 0.0F) {
+ this.field_1141_i[var1 + var2 * 16] = 0.0F;
+ }
+
+ this.field_1140_j[var1 + var2 * 16] -= 0.06F;
+ if(Math.random() < 0.005D) {
+ this.field_1140_j[var1 + var2 * 16] = 1.5F;
+ }
+ }
+ }
+
+ float[] var11 = this.field_1142_h;
+ this.field_1142_h = this.field_1143_g;
+ this.field_1143_g = var11;
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ var3 = this.field_1143_g[var2 - this.field_1139_k / 3 * 16 & 255] * 2.0F;
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ var5 = (int)(var3 * 100.0F + 155.0F);
+ var6 = (int)(var3 * var3 * 255.0F);
+ var7 = (int)(var3 * var3 * var3 * var3 * 128.0F);
+ if(this.field_1131_c) {
+ var8 = (var5 * 30 + var6 * 59 + var7 * 11) / 100;
+ var9 = (var5 * 30 + var6 * 70) / 100;
+ int var10 = (var5 * 30 + var7 * 70) / 100;
+ var5 = var8;
+ var6 = var9;
+ var7 = var10;
+ }
+
+ this.field_1127_a[var2 * 4 + 0] = (byte)var5;
+ this.field_1127_a[var2 * 4 + 1] = (byte)var6;
+ this.field_1127_a[var2 * 4 + 2] = (byte)var7;
+ this.field_1127_a[var2 * 4 + 3] = -1;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TexturePortalFX.java b/src/main/java/net/minecraft/src/TexturePortalFX.java
new file mode 100644
index 0000000..3cf2d95
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TexturePortalFX.java
@@ -0,0 +1,88 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class TexturePortalFX extends TextureFX {
+ private int field_4227_g = 0;
+ private byte[][] field_4226_h = new byte[32][1024];
+
+ public TexturePortalFX() {
+ super(Block.portal.blockIndexInTexture);
+ Random var1 = new Random(100L);
+
+ for(int var2 = 0; var2 < 32; ++var2) {
+ for(int var3 = 0; var3 < 16; ++var3) {
+ for(int var4 = 0; var4 < 16; ++var4) {
+ float var5 = 0.0F;
+
+ int var6;
+ for(var6 = 0; var6 < 2; ++var6) {
+ float var7 = (float)(var6 * 8);
+ float var8 = (float)(var6 * 8);
+ float var9 = ((float)var3 - var7) / 16.0F * 2.0F;
+ float var10 = ((float)var4 - var8) / 16.0F * 2.0F;
+ if(var9 < -1.0F) {
+ var9 += 2.0F;
+ }
+
+ if(var9 >= 1.0F) {
+ var9 -= 2.0F;
+ }
+
+ if(var10 < -1.0F) {
+ var10 += 2.0F;
+ }
+
+ if(var10 >= 1.0F) {
+ var10 -= 2.0F;
+ }
+
+ float var11 = var9 * var9 + var10 * var10;
+ float var12 = (float)Math.atan2((double)var10, (double)var9) + ((float)var2 / 32.0F * (float)Math.PI * 2.0F - var11 * 10.0F + (float)(var6 * 2)) * (float)(var6 * 2 - 1);
+ var12 = (MathHelper.sin(var12) + 1.0F) / 2.0F;
+ var12 /= var11 + 1.0F;
+ var5 += var12 * 0.5F;
+ }
+
+ var5 += var1.nextFloat() * 0.1F;
+ var6 = (int)(var5 * 100.0F + 155.0F);
+ int var13 = (int)(var5 * var5 * 200.0F + 55.0F);
+ int var14 = (int)(var5 * var5 * var5 * var5 * 255.0F);
+ int var15 = (int)(var5 * 100.0F + 155.0F);
+ int var16 = var4 * 16 + var3;
+ this.field_4226_h[var2][var16 * 4 + 0] = (byte)var13;
+ this.field_4226_h[var2][var16 * 4 + 1] = (byte)var14;
+ this.field_4226_h[var2][var16 * 4 + 2] = (byte)var6;
+ this.field_4226_h[var2][var16 * 4 + 3] = (byte)var15;
+ }
+ }
+ }
+
+ }
+
+ public void func_783_a() {
+ ++this.field_4227_g;
+ byte[] var1 = this.field_4226_h[this.field_4227_g & 31];
+
+ for(int var2 = 0; var2 < 256; ++var2) {
+ int var3 = var1[var2 * 4 + 0] & 255;
+ int var4 = var1[var2 * 4 + 1] & 255;
+ int var5 = var1[var2 * 4 + 2] & 255;
+ int var6 = var1[var2 * 4 + 3] & 255;
+ if(this.field_1131_c) {
+ int var7 = (var3 * 30 + var4 * 59 + var5 * 11) / 100;
+ int var8 = (var3 * 30 + var4 * 70) / 100;
+ int var9 = (var3 * 30 + var5 * 70) / 100;
+ var3 = var7;
+ var4 = var8;
+ var5 = var9;
+ }
+
+ this.field_1127_a[var2 * 4 + 0] = (byte)var3;
+ this.field_1127_a[var2 * 4 + 1] = (byte)var4;
+ this.field_1127_a[var2 * 4 + 2] = (byte)var5;
+ this.field_1127_a[var2 * 4 + 3] = (byte)var6;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TextureWatchFX.java b/src/main/java/net/minecraft/src/TextureWatchFX.java
new file mode 100644
index 0000000..8386887
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TextureWatchFX.java
@@ -0,0 +1,99 @@
+package net.minecraft.src;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import net.minecraft.client.Minecraft;
+
+public class TextureWatchFX extends TextureFX {
+ private Minecraft field_4225_g;
+ private int[] field_4224_h = new int[256];
+ private int[] field_4223_i = new int[256];
+ private double field_4222_j;
+ private double field_4221_k;
+
+ public TextureWatchFX(Minecraft var1) {
+ super(Item.pocketSundial.getIconIndex((ItemStack)null));
+ this.field_4225_g = var1;
+ this.field_1128_f = 1;
+
+ try {
+ BufferedImage var2 = ImageIO.read(Minecraft.class.getResource("/gui/items.png"));
+ int var3 = this.field_1126_b % 16 * 16;
+ int var4 = this.field_1126_b / 16 * 16;
+ var2.getRGB(var3, var4, 16, 16, this.field_4224_h, 0, 16);
+ var2 = ImageIO.read(Minecraft.class.getResource("/misc/dial.png"));
+ var2.getRGB(0, 0, 16, 16, this.field_4223_i, 0, 16);
+ } catch (IOException var5) {
+ var5.printStackTrace();
+ }
+
+ }
+
+ public void func_783_a() {
+ double var1 = 0.0D;
+ if(this.field_4225_g.theWorld != null && this.field_4225_g.thePlayer != null) {
+ float var3 = this.field_4225_g.theWorld.getCelestialAngle(1.0F);
+ var1 = (double)(-var3 * (float)Math.PI * 2.0F);
+ if(this.field_4225_g.theWorld.worldProvider.field_4220_c) {
+ var1 = Math.random() * (double)((float)Math.PI) * 2.0D;
+ }
+ }
+
+ double var22;
+ for(var22 = var1 - this.field_4222_j; var22 < -Math.PI; var22 += Math.PI * 2.0D) {
+ }
+
+ while(var22 >= Math.PI) {
+ var22 -= Math.PI * 2.0D;
+ }
+
+ if(var22 < -1.0D) {
+ var22 = -1.0D;
+ }
+
+ if(var22 > 1.0D) {
+ var22 = 1.0D;
+ }
+
+ this.field_4221_k += var22 * 0.1D;
+ this.field_4221_k *= 0.8D;
+ this.field_4222_j += this.field_4221_k;
+ double var5 = Math.sin(this.field_4222_j);
+ double var7 = Math.cos(this.field_4222_j);
+
+ for(int var9 = 0; var9 < 256; ++var9) {
+ int var10 = this.field_4224_h[var9] >> 24 & 255;
+ int var11 = this.field_4224_h[var9] >> 16 & 255;
+ int var12 = this.field_4224_h[var9] >> 8 & 255;
+ int var13 = this.field_4224_h[var9] >> 0 & 255;
+ if(var11 == var13 && var12 == 0 && var13 > 0) {
+ double var14 = -((double)(var9 % 16) / 15.0D - 0.5D);
+ double var16 = (double)(var9 / 16) / 15.0D - 0.5D;
+ int var18 = var11;
+ int var19 = (int)((var14 * var7 + var16 * var5 + 0.5D) * 16.0D);
+ int var20 = (int)((var16 * var7 - var14 * var5 + 0.5D) * 16.0D);
+ int var21 = (var19 & 15) + (var20 & 15) * 16;
+ var10 = this.field_4223_i[var21] >> 24 & 255;
+ var11 = (this.field_4223_i[var21] >> 16 & 255) * var11 / 255;
+ var12 = (this.field_4223_i[var21] >> 8 & 255) * var18 / 255;
+ var13 = (this.field_4223_i[var21] >> 0 & 255) * var18 / 255;
+ }
+
+ if(this.field_1131_c) {
+ int var23 = (var11 * 30 + var12 * 59 + var13 * 11) / 100;
+ int var15 = (var11 * 30 + var12 * 70) / 100;
+ int var24 = (var11 * 30 + var13 * 70) / 100;
+ var11 = var23;
+ var12 = var15;
+ var13 = var24;
+ }
+
+ this.field_1127_a[var9 * 4 + 0] = (byte)var11;
+ this.field_1127_a[var9 * 4 + 1] = (byte)var12;
+ this.field_1127_a[var9 * 4 + 2] = (byte)var13;
+ this.field_1127_a[var9 * 4 + 3] = (byte)var10;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TextureWaterFX.java b/src/main/java/net/minecraft/src/TextureWaterFX.java
new file mode 100644
index 0000000..435a2c0
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TextureWaterFX.java
@@ -0,0 +1,85 @@
+package net.minecraft.src;
+
+public class TextureWaterFX extends TextureFX {
+ protected float[] field_1158_g = new float[256];
+ protected float[] field_1157_h = new float[256];
+ protected float[] field_1156_i = new float[256];
+ protected float[] field_1155_j = new float[256];
+ private int tickCounter = 0;
+
+ public TextureWaterFX() {
+ super(Block.waterStill.blockIndexInTexture);
+ }
+
+ public void func_783_a() {
+ ++this.tickCounter;
+
+ int var1;
+ int var2;
+ float var3;
+ int var5;
+ int var6;
+ for(var1 = 0; var1 < 16; ++var1) {
+ for(var2 = 0; var2 < 16; ++var2) {
+ var3 = 0.0F;
+
+ for(int var4 = var1 - 1; var4 <= var1 + 1; ++var4) {
+ var5 = var4 & 15;
+ var6 = var2 & 15;
+ var3 += this.field_1158_g[var5 + var6 * 16];
+ }
+
+ this.field_1157_h[var1 + var2 * 16] = var3 / 3.3F + this.field_1156_i[var1 + var2 * 16] * 0.8F;
+ }
+ }
+
+ for(var1 = 0; var1 < 16; ++var1) {
+ for(var2 = 0; var2 < 16; ++var2) {
+ this.field_1156_i[var1 + var2 * 16] += this.field_1155_j[var1 + var2 * 16] * 0.05F;
+ if(this.field_1156_i[var1 + var2 * 16] < 0.0F) {
+ this.field_1156_i[var1 + var2 * 16] = 0.0F;
+ }
+
+ this.field_1155_j[var1 + var2 * 16] -= 0.1F;
+ if(Math.random() < 0.05D) {
+ this.field_1155_j[var1 + var2 * 16] = 0.5F;
+ }
+ }
+ }
+
+ float[] var12 = this.field_1157_h;
+ this.field_1157_h = this.field_1158_g;
+ this.field_1158_g = var12;
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ var3 = this.field_1158_g[var2];
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ float var13 = var3 * var3;
+ var5 = (int)(32.0F + var13 * 32.0F);
+ var6 = (int)(50.0F + var13 * 64.0F);
+ int var7 = 255;
+ int var8 = (int)(146.0F + var13 * 50.0F);
+ if(this.field_1131_c) {
+ int var9 = (var5 * 30 + var6 * 59 + var7 * 11) / 100;
+ int var10 = (var5 * 30 + var6 * 70) / 100;
+ int var11 = (var5 * 30 + var7 * 70) / 100;
+ var5 = var9;
+ var6 = var10;
+ var7 = var11;
+ }
+
+ this.field_1127_a[var2 * 4 + 0] = (byte)var5;
+ this.field_1127_a[var2 * 4 + 1] = (byte)var6;
+ this.field_1127_a[var2 * 4 + 2] = (byte)var7;
+ this.field_1127_a[var2 * 4 + 3] = (byte)var8;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TexturedQuad.java b/src/main/java/net/minecraft/src/TexturedQuad.java
new file mode 100644
index 0000000..ef3d8f7
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TexturedQuad.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+public class TexturedQuad {
+ public PositionTexureVertex[] field_1195_a;
+ public int field_1194_b;
+ private boolean field_1196_c;
+
+ public TexturedQuad(PositionTexureVertex[] var1) {
+ this.field_1194_b = 0;
+ this.field_1196_c = false;
+ this.field_1195_a = var1;
+ this.field_1194_b = var1.length;
+ }
+
+ public TexturedQuad(PositionTexureVertex[] var1, int var2, int var3, int var4, int var5) {
+ this(var1);
+ float var6 = 0.0015625F;
+ float var7 = 0.003125F;
+ var1[0] = var1[0].setTexturePosition((float)var4 / 64.0F - var6, (float)var3 / 32.0F + var7);
+ var1[1] = var1[1].setTexturePosition((float)var2 / 64.0F + var6, (float)var3 / 32.0F + var7);
+ var1[2] = var1[2].setTexturePosition((float)var2 / 64.0F + var6, (float)var5 / 32.0F - var7);
+ var1[3] = var1[3].setTexturePosition((float)var4 / 64.0F - var6, (float)var5 / 32.0F - var7);
+ }
+
+ public void func_809_a() {
+ PositionTexureVertex[] var1 = new PositionTexureVertex[this.field_1195_a.length];
+
+ for(int var2 = 0; var2 < this.field_1195_a.length; ++var2) {
+ var1[var2] = this.field_1195_a[this.field_1195_a.length - var2 - 1];
+ }
+
+ this.field_1195_a = var1;
+ }
+
+ public void func_808_a(Tessellator var1, float var2) {
+ Vec3D var3 = this.field_1195_a[1].vector3D.func_1262_a(this.field_1195_a[0].vector3D);
+ Vec3D var4 = this.field_1195_a[1].vector3D.func_1262_a(this.field_1195_a[2].vector3D);
+ Vec3D var5 = var4.crossProduct(var3).normalize();
+ var1.startDrawingQuads();
+ if(this.field_1196_c) {
+ var1.setNormal(-((float)var5.xCoord), -((float)var5.yCoord), -((float)var5.zCoord));
+ } else {
+ var1.setNormal((float)var5.xCoord, (float)var5.yCoord, (float)var5.zCoord);
+ }
+
+ for(int var6 = 0; var6 < 4; ++var6) {
+ PositionTexureVertex var7 = this.field_1195_a[var6];
+ var1.addVertexWithUV((double)((float)var7.vector3D.xCoord * var2), (double)((float)var7.vector3D.yCoord * var2), (double)((float)var7.vector3D.zCoord * var2), (double)var7.texturePositionX, (double)var7.texturePositionY);
+ }
+
+ var1.draw();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TexureWaterFlowFX.java b/src/main/java/net/minecraft/src/TexureWaterFlowFX.java
new file mode 100644
index 0000000..79b5520
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TexureWaterFlowFX.java
@@ -0,0 +1,86 @@
+package net.minecraft.src;
+
+public class TexureWaterFlowFX extends TextureFX {
+ protected float[] field_1138_g = new float[256];
+ protected float[] field_1137_h = new float[256];
+ protected float[] field_1136_i = new float[256];
+ protected float[] field_1135_j = new float[256];
+ private int field_1134_k = 0;
+
+ public TexureWaterFlowFX() {
+ super(Block.waterStill.blockIndexInTexture + 1);
+ this.field_1129_e = 2;
+ }
+
+ public void func_783_a() {
+ ++this.field_1134_k;
+
+ int var1;
+ int var2;
+ float var3;
+ int var5;
+ int var6;
+ for(var1 = 0; var1 < 16; ++var1) {
+ for(var2 = 0; var2 < 16; ++var2) {
+ var3 = 0.0F;
+
+ for(int var4 = var2 - 2; var4 <= var2; ++var4) {
+ var5 = var1 & 15;
+ var6 = var4 & 15;
+ var3 += this.field_1138_g[var5 + var6 * 16];
+ }
+
+ this.field_1137_h[var1 + var2 * 16] = var3 / 3.2F + this.field_1136_i[var1 + var2 * 16] * 0.8F;
+ }
+ }
+
+ for(var1 = 0; var1 < 16; ++var1) {
+ for(var2 = 0; var2 < 16; ++var2) {
+ this.field_1136_i[var1 + var2 * 16] += this.field_1135_j[var1 + var2 * 16] * 0.05F;
+ if(this.field_1136_i[var1 + var2 * 16] < 0.0F) {
+ this.field_1136_i[var1 + var2 * 16] = 0.0F;
+ }
+
+ this.field_1135_j[var1 + var2 * 16] -= 0.3F;
+ if(Math.random() < 0.2D) {
+ this.field_1135_j[var1 + var2 * 16] = 0.5F;
+ }
+ }
+ }
+
+ float[] var12 = this.field_1137_h;
+ this.field_1137_h = this.field_1138_g;
+ this.field_1138_g = var12;
+
+ for(var2 = 0; var2 < 256; ++var2) {
+ var3 = this.field_1138_g[var2 - this.field_1134_k * 16 & 255];
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ float var13 = var3 * var3;
+ var5 = (int)(32.0F + var13 * 32.0F);
+ var6 = (int)(50.0F + var13 * 64.0F);
+ int var7 = 255;
+ int var8 = (int)(146.0F + var13 * 50.0F);
+ if(this.field_1131_c) {
+ int var9 = (var5 * 30 + var6 * 59 + var7 * 11) / 100;
+ int var10 = (var5 * 30 + var6 * 70) / 100;
+ int var11 = (var5 * 30 + var7 * 70) / 100;
+ var5 = var9;
+ var6 = var10;
+ var7 = var11;
+ }
+
+ this.field_1127_a[var2 * 4 + 0] = (byte)var5;
+ this.field_1127_a[var2 * 4 + 1] = (byte)var6;
+ this.field_1127_a[var2 * 4 + 2] = (byte)var7;
+ this.field_1127_a[var2 * 4 + 3] = (byte)var8;
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/ThreadSleepForever.java b/src/main/java/net/minecraft/src/ThreadSleepForever.java
new file mode 100644
index 0000000..fa88a2a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/ThreadSleepForever.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+import net.minecraft.client.Minecraft;
+
+public class ThreadSleepForever extends Thread {
+ final Minecraft mc;
+
+ public ThreadSleepForever(Minecraft var1, String var2) {
+ super(var2);
+ this.mc = var1;
+ this.setDaemon(true);
+ this.start();
+ }
+
+ public void run() {
+ while(this.mc.running) {
+ try {
+ Thread.sleep(2147483647L);
+ } catch (InterruptedException var2) {
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntity.java b/src/main/java/net/minecraft/src/TileEntity.java
new file mode 100644
index 0000000..92ae45e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntity.java
@@ -0,0 +1,90 @@
+package net.minecraft.src;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TileEntity {
+ private static Map nameToClassMap = new HashMap();
+ private static Map classToNameMap = new HashMap();
+ public World worldObj;
+ public int xCoord;
+ public int yCoord;
+ public int zCoord;
+
+ private static void addMapping(Class var0, String var1) {
+ if(classToNameMap.containsKey(var1)) {
+ throw new IllegalArgumentException("Duplicate id: " + var1);
+ } else {
+ nameToClassMap.put(var1, var0);
+ classToNameMap.put(var0, var1);
+ }
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ this.xCoord = var1.getInteger("x");
+ this.yCoord = var1.getInteger("y");
+ this.zCoord = var1.getInteger("z");
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ String var2 = (String)classToNameMap.get(this.getClass());
+ if(var2 == null) {
+ throw new RuntimeException(this.getClass() + " is missing a mapping! This is a bug!");
+ } else {
+ var1.setString("id", var2);
+ var1.setInteger("x", this.xCoord);
+ var1.setInteger("y", this.yCoord);
+ var1.setInteger("z", this.zCoord);
+ }
+ }
+
+ public void updateEntity() {
+ }
+
+ public static TileEntity createAndLoadEntity(NBTTagCompound var0) {
+ TileEntity var1 = null;
+
+ try {
+ Class var2 = (Class)nameToClassMap.get(var0.getString("id"));
+ if(var2 != null) {
+ var1 = (TileEntity)var2.newInstance();
+ }
+ } catch (Exception var3) {
+ var3.printStackTrace();
+ }
+
+ if(var1 != null) {
+ var1.readFromNBT(var0);
+ } else {
+ System.out.println("Skipping TileEntity with id " + var0.getString("id"));
+ }
+
+ return var1;
+ }
+
+ public int getBlockMetadata() {
+ return this.worldObj.getBlockMetadata(this.xCoord, this.yCoord, this.zCoord);
+ }
+
+ public void onInventoryChanged() {
+ this.worldObj.func_698_b(this.xCoord, this.yCoord, this.zCoord, this);
+ }
+
+ public double getDistanceFrom(double var1, double var3, double var5) {
+ double var7 = (double)this.xCoord + 0.5D - var1;
+ double var9 = (double)this.yCoord + 0.5D - var3;
+ double var11 = (double)this.zCoord + 0.5D - var5;
+ return var7 * var7 + var9 * var9 + var11 * var11;
+ }
+
+ public Block getBlockType() {
+ return Block.blocksList[this.worldObj.getBlockId(this.xCoord, this.yCoord, this.zCoord)];
+ }
+
+ static {
+ addMapping(TileEntityFurnace.class, "Furnace");
+ addMapping(TileEntityChest.class, "Chest");
+ addMapping(TileEntitySign.class, "Sign");
+ addMapping(TileEntityMobSpawner.class, "MobSpawner");
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntityChest.java b/src/main/java/net/minecraft/src/TileEntityChest.java
new file mode 100644
index 0000000..66da840
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntityChest.java
@@ -0,0 +1,83 @@
+package net.minecraft.src;
+
+public class TileEntityChest extends TileEntity implements IInventory {
+ private ItemStack[] field_827_a = new ItemStack[36];
+
+ public int getSizeInventory() {
+ return 27;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.field_827_a[var1];
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.field_827_a[var1] != null) {
+ ItemStack var3;
+ if(this.field_827_a[var1].stackSize <= var2) {
+ var3 = this.field_827_a[var1];
+ this.field_827_a[var1] = null;
+ this.onInventoryChanged();
+ return var3;
+ } else {
+ var3 = this.field_827_a[var1].splitStack(var2);
+ if(this.field_827_a[var1].stackSize == 0) {
+ this.field_827_a[var1] = null;
+ }
+
+ this.onInventoryChanged();
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.field_827_a[var1] = var2;
+ if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) {
+ var2.stackSize = this.getInventoryStackLimit();
+ }
+
+ this.onInventoryChanged();
+ }
+
+ public String getInvName() {
+ return "Chest";
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ NBTTagList var2 = var1.getTagList("Items");
+ this.field_827_a = new ItemStack[this.getSizeInventory()];
+
+ for(int var3 = 0; var3 < var2.tagCount(); ++var3) {
+ NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+ int var5 = var4.getByte("Slot") & 255;
+ if(var5 >= 0 && var5 < this.field_827_a.length) {
+ this.field_827_a[var5] = new ItemStack(var4);
+ }
+ }
+
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ NBTTagList var2 = new NBTTagList();
+
+ for(int var3 = 0; var3 < this.field_827_a.length; ++var3) {
+ if(this.field_827_a[var3] != null) {
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setByte("Slot", (byte)var3);
+ this.field_827_a[var3].writeToNBT(var4);
+ var2.setTag(var4);
+ }
+ }
+
+ var1.setTag("Items", var2);
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntityFurnace.java b/src/main/java/net/minecraft/src/TileEntityFurnace.java
new file mode 100644
index 0000000..9b94876
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntityFurnace.java
@@ -0,0 +1,187 @@
+package net.minecraft.src;
+
+public class TileEntityFurnace extends TileEntity implements IInventory {
+ private ItemStack[] furnaceItemStacks = new ItemStack[3];
+ private int furnaceBurnTime = 0;
+ private int currentItemBurnTime = 0;
+ private int furnaceCookTime = 0;
+
+ public int getSizeInventory() {
+ return this.furnaceItemStacks.length;
+ }
+
+ public ItemStack getStackInSlot(int var1) {
+ return this.furnaceItemStacks[var1];
+ }
+
+ public ItemStack decrStackSize(int var1, int var2) {
+ if(this.furnaceItemStacks[var1] != null) {
+ ItemStack var3;
+ if(this.furnaceItemStacks[var1].stackSize <= var2) {
+ var3 = this.furnaceItemStacks[var1];
+ this.furnaceItemStacks[var1] = null;
+ return var3;
+ } else {
+ var3 = this.furnaceItemStacks[var1].splitStack(var2);
+ if(this.furnaceItemStacks[var1].stackSize == 0) {
+ this.furnaceItemStacks[var1] = null;
+ }
+
+ return var3;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void setInventorySlotContents(int var1, ItemStack var2) {
+ this.furnaceItemStacks[var1] = var2;
+ if(var2 != null && var2.stackSize > this.getInventoryStackLimit()) {
+ var2.stackSize = this.getInventoryStackLimit();
+ }
+
+ }
+
+ public String getInvName() {
+ return "Chest";
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ NBTTagList var2 = var1.getTagList("Items");
+ this.furnaceItemStacks = new ItemStack[this.getSizeInventory()];
+
+ for(int var3 = 0; var3 < var2.tagCount(); ++var3) {
+ NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
+ byte var5 = var4.getByte("Slot");
+ if(var5 >= 0 && var5 < this.furnaceItemStacks.length) {
+ this.furnaceItemStacks[var5] = new ItemStack(var4);
+ }
+ }
+
+ this.furnaceBurnTime = var1.getShort("BurnTime");
+ this.furnaceCookTime = var1.getShort("CookTime");
+ this.currentItemBurnTime = this.getItemBurnTime(this.furnaceItemStacks[1]);
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ var1.setShort("BurnTime", (short)this.furnaceBurnTime);
+ var1.setShort("CookTime", (short)this.furnaceCookTime);
+ NBTTagList var2 = new NBTTagList();
+
+ for(int var3 = 0; var3 < this.furnaceItemStacks.length; ++var3) {
+ if(this.furnaceItemStacks[var3] != null) {
+ NBTTagCompound var4 = new NBTTagCompound();
+ var4.setByte("Slot", (byte)var3);
+ this.furnaceItemStacks[var3].writeToNBT(var4);
+ var2.setTag(var4);
+ }
+ }
+
+ var1.setTag("Items", var2);
+ }
+
+ public int getInventoryStackLimit() {
+ return 64;
+ }
+
+ public int getCookProgressScaled(int var1) {
+ return this.furnaceCookTime * var1 / 200;
+ }
+
+ public int getBurnTimeRemainingScaled(int var1) {
+ if(this.currentItemBurnTime == 0) {
+ this.currentItemBurnTime = 200;
+ }
+
+ return this.furnaceBurnTime * var1 / this.currentItemBurnTime;
+ }
+
+ public boolean isBurning() {
+ return this.furnaceBurnTime > 0;
+ }
+
+ public void updateEntity() {
+ boolean var1 = this.furnaceBurnTime > 0;
+ boolean var2 = false;
+ if(this.furnaceBurnTime > 0) {
+ --this.furnaceBurnTime;
+ }
+
+ //if(!this.worldObj.multiplayerWorld) {
+ if(this.furnaceBurnTime == 0 && this.canSmelt()) {
+ this.currentItemBurnTime = this.furnaceBurnTime = this.getItemBurnTime(this.furnaceItemStacks[1]);
+ if(this.furnaceBurnTime > 0) {
+ var2 = true;
+ if(this.furnaceItemStacks[1] != null) {
+ --this.furnaceItemStacks[1].stackSize;
+ if(this.furnaceItemStacks[1].stackSize == 0) {
+ this.furnaceItemStacks[1] = null;
+ }
+ }
+ }
+ }
+
+ if(this.isBurning() && this.canSmelt()) {
+ ++this.furnaceCookTime;
+ if(this.furnaceCookTime == 200) {
+ this.furnaceCookTime = 0;
+ this.smeltItem();
+ var2 = true;
+ }
+ } else {
+ this.furnaceCookTime = 0;
+ }
+
+ if(var1 != this.furnaceBurnTime > 0) {
+ var2 = true;
+ BlockFurnace.updateFurnaceBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
+ }
+ //}
+
+ if(var2) {
+ this.onInventoryChanged();
+ }
+
+ }
+
+ private boolean canSmelt() {
+ if(this.furnaceItemStacks[0] == null) {
+ return false;
+ } else {
+ int var1 = this.getSmeltingResultItem(this.furnaceItemStacks[0].getItem().shiftedIndex);
+ return var1 < 0 ? false : (this.furnaceItemStacks[2] == null ? true : (this.furnaceItemStacks[2].itemID != var1 ? false : (this.furnaceItemStacks[2].stackSize < this.getInventoryStackLimit() && this.furnaceItemStacks[2].stackSize < this.furnaceItemStacks[2].getMaxStackSize() ? true : this.furnaceItemStacks[2].stackSize < Item.itemsList[var1].getItemStackLimit())));
+ }
+ }
+
+ public void smeltItem() {
+ if(this.canSmelt()) {
+ int var1 = this.getSmeltingResultItem(this.furnaceItemStacks[0].getItem().shiftedIndex);
+ if(this.furnaceItemStacks[2] == null) {
+ this.furnaceItemStacks[2] = new ItemStack(var1, 1);
+ } else if(this.furnaceItemStacks[2].itemID == var1) {
+ ++this.furnaceItemStacks[2].stackSize;
+ }
+
+ --this.furnaceItemStacks[0].stackSize;
+ if(this.furnaceItemStacks[0].stackSize <= 0) {
+ this.furnaceItemStacks[0] = null;
+ }
+
+ }
+ }
+
+ private int getSmeltingResultItem(int var1) {
+ return var1 == Block.oreIron.blockID ? Item.ingotIron.shiftedIndex : (var1 == Block.oreGold.blockID ? Item.ingotGold.shiftedIndex : (var1 == Block.oreDiamond.blockID ? Item.diamond.shiftedIndex : (var1 == Block.sand.blockID ? Block.glass.blockID : (var1 == Item.porkRaw.shiftedIndex ? Item.porkCooked.shiftedIndex : (var1 == Item.fishRaw.shiftedIndex ? Item.fishCooked.shiftedIndex : (var1 == Block.cobblestone.blockID ? Block.stone.blockID : (var1 == Item.clay.shiftedIndex ? Item.brick.shiftedIndex : -1)))))));
+ }
+
+ private int getItemBurnTime(ItemStack var1) {
+ if(var1 == null) {
+ return 0;
+ } else {
+ int var2 = var1.getItem().shiftedIndex;
+ return var2 < 256 && Block.blocksList[var2].blockMaterial == Material.wood ? 300 : (var2 == Item.stick.shiftedIndex ? 100 : (var2 == Item.coal.shiftedIndex ? 1600 : (var2 == Item.bucketLava.shiftedIndex ? 20000 : 0)));
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntityMobSpawner.java b/src/main/java/net/minecraft/src/TileEntityMobSpawner.java
new file mode 100644
index 0000000..d35ab2f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntityMobSpawner.java
@@ -0,0 +1,93 @@
+package net.minecraft.src;
+
+public class TileEntityMobSpawner extends TileEntity {
+ public int delay = -1;
+ public String entityID = "Pig";
+ public double field_831_c;
+ public double field_830_d = 0.0D;
+
+ public TileEntityMobSpawner() {
+ this.delay = 20;
+ }
+
+ public boolean anyPlayerInRange() {
+ return this.worldObj.getClosestPlayer((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D, 16.0D) != null;
+ }
+
+ public void updateEntity() {
+ this.field_830_d = this.field_831_c;
+ if(this.anyPlayerInRange()) {
+ double var1 = (double)((float)this.xCoord + this.worldObj.rand.nextFloat());
+ double var3 = (double)((float)this.yCoord + this.worldObj.rand.nextFloat());
+ double var5 = (double)((float)this.zCoord + this.worldObj.rand.nextFloat());
+ this.worldObj.spawnParticle("smoke", var1, var3, var5, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle("flame", var1, var3, var5, 0.0D, 0.0D, 0.0D);
+
+ for(this.field_831_c += (double)(1000.0F / ((float)this.delay + 200.0F)); this.field_831_c > 360.0D; this.field_830_d -= 360.0D) {
+ this.field_831_c -= 360.0D;
+ }
+
+ if(this.delay == -1) {
+ this.updateDelay();
+ }
+
+ if(this.delay > 0) {
+ --this.delay;
+ } else {
+ byte var7 = 4;
+
+ for(int var8 = 0; var8 < var7; ++var8) {
+ EntityLiving var9 = (EntityLiving)((EntityLiving)EntityList.createEntityInWorld(this.entityID, this.worldObj));
+ if(var9 == null) {
+ return;
+ }
+
+ int var10 = this.worldObj.getEntitiesWithinAABB(var9.getClass(), AxisAlignedBB.getBoundingBoxFromPool((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 1), (double)(this.zCoord + 1)).expands(8.0D, 4.0D, 8.0D)).size();
+ if(var10 >= 6) {
+ this.updateDelay();
+ return;
+ }
+
+ if(var9 != null) {
+ double var11 = (double)this.xCoord + (this.worldObj.rand.nextDouble() - this.worldObj.rand.nextDouble()) * 4.0D;
+ double var13 = (double)(this.yCoord + this.worldObj.rand.nextInt(3) - 1);
+ double var15 = (double)this.zCoord + (this.worldObj.rand.nextDouble() - this.worldObj.rand.nextDouble()) * 4.0D;
+ var9.setLocationAndAngles(var11, var13, var15, this.worldObj.rand.nextFloat() * 360.0F, 0.0F);
+ if(var9.getCanSpawnHere()) {
+ this.worldObj.entityJoinedWorld(var9);
+
+ for(int var17 = 0; var17 < 20; ++var17) {
+ var1 = (double)this.xCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D;
+ var3 = (double)this.yCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D;
+ var5 = (double)this.zCoord + 0.5D + ((double)this.worldObj.rand.nextFloat() - 0.5D) * 2.0D;
+ this.worldObj.spawnParticle("smoke", var1, var3, var5, 0.0D, 0.0D, 0.0D);
+ this.worldObj.spawnParticle("flame", var1, var3, var5, 0.0D, 0.0D, 0.0D);
+ }
+
+ var9.spawnExplosionParticle();
+ this.updateDelay();
+ }
+ }
+ }
+
+ super.updateEntity();
+ }
+ }
+ }
+
+ private void updateDelay() {
+ this.delay = 200 + this.worldObj.rand.nextInt(600);
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+ this.entityID = var1.getString("EntityId");
+ this.delay = var1.getShort("Delay");
+ }
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ var1.setString("EntityId", this.entityID);
+ var1.setShort("Delay", (short)this.delay);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java b/src/main/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java
new file mode 100644
index 0000000..66420a8
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntityMobSpawnerRenderer.java
@@ -0,0 +1,37 @@
+package net.minecraft.src;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.lwjgl.opengl.GL11;
+
+public class TileEntityMobSpawnerRenderer extends TileEntitySpecialRenderer {
+ private Map field_1412_b = new HashMap();
+
+ public void a(TileEntityMobSpawner var1, double var2, double var4, double var6, float var8) {
+ GL11.glPushMatrix();
+ GL11.glTranslatef((float)var2 + 0.5F, (float)var4, (float)var6 + 0.5F);
+ Entity var9 = (Entity)this.field_1412_b.get(var1.entityID);
+ if(var9 == null) {
+ var9 = EntityList.createEntityInWorld(var1.entityID, (World)null);
+ this.field_1412_b.put(var1.entityID, var9);
+ }
+
+ if(var9 != null) {
+ var9.setWorld(var1.worldObj);
+ float var10 = 7.0F / 16.0F;
+ GL11.glTranslatef(0.0F, 0.4F, 0.0F);
+ GL11.glRotatef((float)(var1.field_830_d + (var1.field_831_c - var1.field_830_d) * (double)var8) * 10.0F, 0.0F, 1.0F, 0.0F);
+ GL11.glRotatef(-30.0F, 1.0F, 0.0F, 0.0F);
+ GL11.glTranslatef(0.0F, -0.4F, 0.0F);
+ GL11.glScalef(var10, var10, var10);
+ var9.setLocationAndAngles(var2, var4, var6, 0.0F, 0.0F);
+ RenderManager.instance.func_853_a(var9, 0.0D, 0.0D, 0.0D, 0.0F, var8);
+ }
+
+ GL11.glPopMatrix();
+ }
+
+ public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) {
+ this.a((TileEntityMobSpawner)var1, var2, var4, var6, var8);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntityRenderer.java b/src/main/java/net/minecraft/src/TileEntityRenderer.java
new file mode 100644
index 0000000..fa2fdb3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntityRenderer.java
@@ -0,0 +1,86 @@
+package net.minecraft.src;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import org.lwjgl.opengl.GL11;
+
+public class TileEntityRenderer {
+ private Map specialRendererMap = new HashMap();
+ public static TileEntityRenderer instance = new TileEntityRenderer();
+ private FontRenderer fontRenderer;
+ public static double staticPlayerX;
+ public static double staticPlayerY;
+ public static double staticPlayerZ;
+ public RenderEngine renderEngine;
+ public World worldObj;
+ public EntityPlayer entityPlayer;
+ public float playerYaw;
+ public float playerPitch;
+ public double playerX;
+ public double playerY;
+ public double playerZ;
+
+ private TileEntityRenderer() {
+ this.specialRendererMap.put(TileEntitySign.class, new TileEntitySignRenderer());
+ this.specialRendererMap.put(TileEntityMobSpawner.class, new TileEntityMobSpawnerRenderer());
+ Iterator var1 = this.specialRendererMap.values().iterator();
+
+ while(var1.hasNext()) {
+ TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer)var1.next();
+ var2.setTileEntityRenderer(this);
+ }
+
+ }
+
+ public TileEntitySpecialRenderer getSpecialRendererForClass(Class var1) {
+ TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer)this.specialRendererMap.get(var1);
+ if(var2 == null && var1 != TileEntity.class) {
+ var2 = this.getSpecialRendererForClass(var1.getSuperclass());
+ this.specialRendererMap.put(var1, var2);
+ }
+
+ return var2;
+ }
+
+ public boolean hasSpecialRenderer(TileEntity var1) {
+ return this.getSpecialRendererForEntity(var1) != null;
+ }
+
+ public TileEntitySpecialRenderer getSpecialRendererForEntity(TileEntity var1) {
+ return var1 == null ? null : this.getSpecialRendererForClass(var1.getClass());
+ }
+
+ public void setRenderingContext(World var1, RenderEngine var2, FontRenderer var3, EntityPlayer var4, float var5) {
+ this.worldObj = var1;
+ this.renderEngine = var2;
+ this.entityPlayer = var4;
+ this.fontRenderer = var3;
+ this.playerYaw = var4.prevRotationYaw + (var4.rotationYaw - var4.prevRotationYaw) * var5;
+ this.playerPitch = var4.prevRotationPitch + (var4.rotationPitch - var4.prevRotationPitch) * var5;
+ this.playerX = var4.lastTickPosX + (var4.posX - var4.lastTickPosX) * (double)var5;
+ this.playerY = var4.lastTickPosY + (var4.posY - var4.lastTickPosY) * (double)var5;
+ this.playerZ = var4.lastTickPosZ + (var4.posZ - var4.lastTickPosZ) * (double)var5;
+ }
+
+ public void renderTileEntity(TileEntity var1, float var2) {
+ if(var1.getDistanceFrom(this.playerX, this.playerY, this.playerZ) < 4096.0D) {
+ float var3 = this.worldObj.getLightBrightness(var1.xCoord, var1.yCoord, var1.zCoord);
+ GL11.glColor3f(var3, var3, var3);
+ this.renderTileEntityAt(var1, (double)var1.xCoord - staticPlayerX, (double)var1.yCoord - staticPlayerY, (double)var1.zCoord - staticPlayerZ, var2);
+ }
+
+ }
+
+ public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) {
+ TileEntitySpecialRenderer var9 = this.getSpecialRendererForEntity(var1);
+ if(var9 != null) {
+ var9.renderTileEntityAt(var1, var2, var4, var6, var8);
+ }
+
+ }
+
+ public FontRenderer getFontRenderer() {
+ return this.fontRenderer;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntitySign.java b/src/main/java/net/minecraft/src/TileEntitySign.java
new file mode 100644
index 0000000..69f2787
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntitySign.java
@@ -0,0 +1,26 @@
+package net.minecraft.src;
+
+public class TileEntitySign extends TileEntity {
+ public String[] signText = new String[]{"", "", "", ""};
+ public int lineBeingEdited = -1;
+
+ public void writeToNBT(NBTTagCompound var1) {
+ super.writeToNBT(var1);
+ var1.setString("Text1", this.signText[0]);
+ var1.setString("Text2", this.signText[1]);
+ var1.setString("Text3", this.signText[2]);
+ var1.setString("Text4", this.signText[3]);
+ }
+
+ public void readFromNBT(NBTTagCompound var1) {
+ super.readFromNBT(var1);
+
+ for(int var2 = 0; var2 < 4; ++var2) {
+ this.signText[var2] = var1.getString("Text" + (var2 + 1));
+ if(this.signText[var2].length() > 15) {
+ this.signText[var2] = this.signText[var2].substring(0, 15);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntitySignRenderer.java b/src/main/java/net/minecraft/src/TileEntitySignRenderer.java
new file mode 100644
index 0000000..44e369f
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntitySignRenderer.java
@@ -0,0 +1,70 @@
+package net.minecraft.src;
+
+import org.lwjgl.opengl.GL11;
+
+public class TileEntitySignRenderer extends TileEntitySpecialRenderer {
+ private SignModel signModel = new SignModel();
+
+ public void a(TileEntitySign var1, double var2, double var4, double var6, float var8) {
+ Block var9 = var1.getBlockType();
+ GL11.glPushMatrix();
+ float var10 = 2.0F / 3.0F;
+ float var12;
+ if(var9 == Block.signPost) {
+ GL11.glTranslatef((float)var2 + 0.5F, (float)var4 + 12.0F / 16.0F * var10, (float)var6 + 0.5F);
+ float var11 = (float)(var1.getBlockMetadata() * 360) / 16.0F;
+ GL11.glRotatef(-var11, 0.0F, 1.0F, 0.0F);
+ this.signModel.field_1345_b.field_1403_h = true;
+ } else {
+ int var16 = var1.getBlockMetadata();
+ var12 = 0.0F;
+ if(var16 == 2) {
+ var12 = 180.0F;
+ }
+
+ if(var16 == 4) {
+ var12 = 90.0F;
+ }
+
+ if(var16 == 5) {
+ var12 = -90.0F;
+ }
+
+ GL11.glTranslatef((float)var2 + 0.5F, (float)var4 + 12.0F / 16.0F * var10, (float)var6 + 0.5F);
+ GL11.glRotatef(-var12, 0.0F, 1.0F, 0.0F);
+ GL11.glTranslatef(0.0F, -(5.0F / 16.0F), -(7.0F / 16.0F));
+ this.signModel.field_1345_b.field_1403_h = false;
+ }
+
+ this.bindTextureByName("/item/sign.png");
+ GL11.glPushMatrix();
+ GL11.glScalef(var10, -var10, -var10);
+ this.signModel.func_887_a();
+ GL11.glPopMatrix();
+ FontRenderer var17 = this.getFontRenderer();
+ var12 = (float)(1.0D / 60.0D) * var10;
+ GL11.glTranslatef(0.0F, 0.5F * var10, 0.07F * var10);
+ GL11.glScalef(var12, -var12, var12);
+ GL11.glNormal3f(0.0F, 0.0F, -1.0F * var12);
+ GL11.glDepthMask(false);
+ byte var13 = 0;
+
+ for(int var14 = 0; var14 < var1.signText.length; ++var14) {
+ String var15 = var1.signText[var14];
+ if(var14 == var1.lineBeingEdited) {
+ var15 = "> " + var15 + " <";
+ var17.drawString(var15, -var17.getStringWidth(var15) / 2, var14 * 10 - var1.signText.length * 5, var13);
+ } else {
+ var17.drawString(var15, -var17.getStringWidth(var15) / 2, var14 * 10 - var1.signText.length * 5, var13);
+ }
+ }
+
+ GL11.glDepthMask(true);
+ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+ GL11.glPopMatrix();
+ }
+
+ public void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8) {
+ this.a((TileEntitySign)var1, var2, var4, var6, var8);
+ }
+}
diff --git a/src/main/java/net/minecraft/src/TileEntitySpecialRenderer.java b/src/main/java/net/minecraft/src/TileEntitySpecialRenderer.java
new file mode 100644
index 0000000..828b86e
--- /dev/null
+++ b/src/main/java/net/minecraft/src/TileEntitySpecialRenderer.java
@@ -0,0 +1,20 @@
+package net.minecraft.src;
+
+public abstract class TileEntitySpecialRenderer {
+ protected TileEntityRenderer tileEntityRenderer;
+
+ public abstract void renderTileEntityAt(TileEntity var1, double var2, double var4, double var6, float var8);
+
+ protected void bindTextureByName(String var1) {
+ RenderEngine var2 = this.tileEntityRenderer.renderEngine;
+ var2.bindTexture(var2.getTexture(var1));
+ }
+
+ public void setTileEntityRenderer(TileEntityRenderer var1) {
+ this.tileEntityRenderer = var1;
+ }
+
+ public FontRenderer getFontRenderer() {
+ return this.tileEntityRenderer.getFontRenderer();
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Timer.java b/src/main/java/net/minecraft/src/Timer.java
new file mode 100644
index 0000000..4924f75
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Timer.java
@@ -0,0 +1,58 @@
+package net.minecraft.src;
+
+public class Timer {
+ public float ticksPerSecond;
+ private double lastHRTime;
+ public int elapsedTicks;
+ public float renderPartialTicks;
+ public float timerSpeed = 1.0F;
+ public float elapsedPartialTicks = 0.0F;
+ private long lastSyncSysClock;
+ private long lastSyncHRClock;
+ private double timeSyncAdjustment = 1.0D;
+
+ public Timer(float var1) {
+ this.ticksPerSecond = var1;
+ this.lastSyncSysClock = System.currentTimeMillis();
+ this.lastSyncHRClock = System.nanoTime() / 1000000L;
+ }
+
+ public void updateTimer() {
+ long var1 = System.currentTimeMillis();
+ long var3 = var1 - this.lastSyncSysClock;
+ long var5 = System.nanoTime() / 1000000L;
+ double var9;
+ if(var3 > 1000L) {
+ long var7 = var5 - this.lastSyncHRClock;
+ var9 = (double)var3 / (double)var7;
+ this.timeSyncAdjustment += (var9 - this.timeSyncAdjustment) * (double)0.2F;
+ this.lastSyncSysClock = var1;
+ this.lastSyncHRClock = var5;
+ }
+
+ if(var3 < 0L) {
+ this.lastSyncSysClock = var1;
+ this.lastSyncHRClock = var5;
+ }
+
+ double var11 = (double)var5 / 1000.0D;
+ var9 = (var11 - this.lastHRTime) * this.timeSyncAdjustment;
+ this.lastHRTime = var11;
+ if(var9 < 0.0D) {
+ var9 = 0.0D;
+ }
+
+ if(var9 > 1.0D) {
+ var9 = 1.0D;
+ }
+
+ this.elapsedPartialTicks = (float)((double)this.elapsedPartialTicks + var9 * (double)this.timerSpeed * (double)this.ticksPerSecond);
+ this.elapsedTicks = (int)this.elapsedPartialTicks;
+ this.elapsedPartialTicks -= (float)this.elapsedTicks;
+ if(this.elapsedTicks > 10) {
+ this.elapsedTicks = 10;
+ }
+
+ this.renderPartialTicks = this.elapsedPartialTicks;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/UnexpectedThrowable.java b/src/main/java/net/minecraft/src/UnexpectedThrowable.java
new file mode 100644
index 0000000..6f42003
--- /dev/null
+++ b/src/main/java/net/minecraft/src/UnexpectedThrowable.java
@@ -0,0 +1,11 @@
+package net.minecraft.src;
+
+public class UnexpectedThrowable {
+ public final String description;
+ public final Throwable exception;
+
+ public UnexpectedThrowable(String var1, Throwable var2) {
+ this.description = var1;
+ this.exception = var2;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/Vec3D.java b/src/main/java/net/minecraft/src/Vec3D.java
new file mode 100644
index 0000000..eff3a40
--- /dev/null
+++ b/src/main/java/net/minecraft/src/Vec3D.java
@@ -0,0 +1,157 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Vec3D {
+ private static List vectorList = new ArrayList();
+ private static int nextVector = 0;
+ public double xCoord;
+ public double yCoord;
+ public double zCoord;
+
+ public static Vec3D createVectorHelper(double var0, double var2, double var4) {
+ return new Vec3D(var0, var2, var4);
+ }
+
+ public static void initialize() {
+ nextVector = 0;
+ }
+
+ public static Vec3D createVector(double var0, double var2, double var4) {
+ if(nextVector >= vectorList.size()) {
+ vectorList.add(createVectorHelper(0.0D, 0.0D, 0.0D));
+ }
+
+ return ((Vec3D)vectorList.get(nextVector++)).setComponents(var0, var2, var4);
+ }
+
+ private Vec3D(double var1, double var3, double var5) {
+ if(var1 == -0.0D) {
+ var1 = 0.0D;
+ }
+
+ if(var3 == -0.0D) {
+ var3 = 0.0D;
+ }
+
+ if(var5 == -0.0D) {
+ var5 = 0.0D;
+ }
+
+ this.xCoord = var1;
+ this.yCoord = var3;
+ this.zCoord = var5;
+ }
+
+ private Vec3D setComponents(double var1, double var3, double var5) {
+ this.xCoord = var1;
+ this.yCoord = var3;
+ this.zCoord = var5;
+ return this;
+ }
+
+ public Vec3D func_1262_a(Vec3D var1) {
+ return createVector(var1.xCoord - this.xCoord, var1.yCoord - this.yCoord, var1.zCoord - this.zCoord);
+ }
+
+ public Vec3D normalize() {
+ double var1 = (double)MathHelper.sqrt_double(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord);
+ return var1 < 1.0E-4D ? createVector(0.0D, 0.0D, 0.0D) : createVector(this.xCoord / var1, this.yCoord / var1, this.zCoord / var1);
+ }
+
+ public Vec3D crossProduct(Vec3D var1) {
+ return createVector(this.yCoord * var1.zCoord - this.zCoord * var1.yCoord, this.zCoord * var1.xCoord - this.xCoord * var1.zCoord, this.xCoord * var1.yCoord - this.yCoord * var1.xCoord);
+ }
+
+ public Vec3D addVector(double var1, double var3, double var5) {
+ return createVector(this.xCoord + var1, this.yCoord + var3, this.zCoord + var5);
+ }
+
+ public double distanceTo(Vec3D var1) {
+ double var2 = var1.xCoord - this.xCoord;
+ double var4 = var1.yCoord - this.yCoord;
+ double var6 = var1.zCoord - this.zCoord;
+ return (double)MathHelper.sqrt_double(var2 * var2 + var4 * var4 + var6 * var6);
+ }
+
+ public double squareDistanceTo(Vec3D var1) {
+ double var2 = var1.xCoord - this.xCoord;
+ double var4 = var1.yCoord - this.yCoord;
+ double var6 = var1.zCoord - this.zCoord;
+ return var2 * var2 + var4 * var4 + var6 * var6;
+ }
+
+ public double squareDistanceTo(double var1, double var3, double var5) {
+ double var7 = var1 - this.xCoord;
+ double var9 = var3 - this.yCoord;
+ double var11 = var5 - this.zCoord;
+ return var7 * var7 + var9 * var9 + var11 * var11;
+ }
+
+ public double lengthVector() {
+ return (double)MathHelper.sqrt_double(this.xCoord * this.xCoord + this.yCoord * this.yCoord + this.zCoord * this.zCoord);
+ }
+
+ public Vec3D getIntermediateWithXValue(Vec3D var1, double var2) {
+ double var4 = var1.xCoord - this.xCoord;
+ double var6 = var1.yCoord - this.yCoord;
+ double var8 = var1.zCoord - this.zCoord;
+ if(var4 * var4 < (double)1.0E-7F) {
+ return null;
+ } else {
+ double var10 = (var2 - this.xCoord) / var4;
+ return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null;
+ }
+ }
+
+ public Vec3D getIntermediateWithYValue(Vec3D var1, double var2) {
+ double var4 = var1.xCoord - this.xCoord;
+ double var6 = var1.yCoord - this.yCoord;
+ double var8 = var1.zCoord - this.zCoord;
+ if(var6 * var6 < (double)1.0E-7F) {
+ return null;
+ } else {
+ double var10 = (var2 - this.yCoord) / var6;
+ return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null;
+ }
+ }
+
+ public Vec3D getIntermediateWithZValue(Vec3D var1, double var2) {
+ double var4 = var1.xCoord - this.xCoord;
+ double var6 = var1.yCoord - this.yCoord;
+ double var8 = var1.zCoord - this.zCoord;
+ if(var8 * var8 < (double)1.0E-7F) {
+ return null;
+ } else {
+ double var10 = (var2 - this.zCoord) / var8;
+ return var10 >= 0.0D && var10 <= 1.0D ? createVector(this.xCoord + var4 * var10, this.yCoord + var6 * var10, this.zCoord + var8 * var10) : null;
+ }
+ }
+
+ public String toString() {
+ return "(" + this.xCoord + ", " + this.yCoord + ", " + this.zCoord + ")";
+ }
+
+ public void rotateAroundX(float var1) {
+ float var2 = MathHelper.cos(var1);
+ float var3 = MathHelper.sin(var1);
+ double var4 = this.xCoord;
+ double var6 = this.yCoord * (double)var2 + this.zCoord * (double)var3;
+ double var8 = this.zCoord * (double)var2 - this.yCoord * (double)var3;
+ this.xCoord = var4;
+ this.yCoord = var6;
+ this.zCoord = var8;
+ }
+
+ public void rotateAroundY(float var1) {
+ float var2 = MathHelper.cos(var1);
+ float var3 = MathHelper.sin(var1);
+ double var4 = this.xCoord * (double)var2 + this.zCoord * (double)var3;
+ double var6 = this.yCoord;
+ double var8 = this.zCoord * (double)var2 - this.xCoord * (double)var3;
+ this.xCoord = var4;
+ this.yCoord = var6;
+ this.zCoord = var8;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/World.java b/src/main/java/net/minecraft/src/World.java
new file mode 100644
index 0000000..bb42061
--- /dev/null
+++ b/src/main/java/net/minecraft/src/World.java
@@ -0,0 +1,2047 @@
+package net.minecraft.src;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.TreeSet;
+
+public class World implements IBlockAccess {
+ public boolean field_4214_a;
+ private List field_1051_z;
+ public List loadedEntityList;
+ private List field_1024_A;
+ private TreeSet scheduledTickTreeSet;
+ private Set scheduledTickSet;
+ public List loadedTileEntityList;
+ public List playerEntities;
+ public long worldTime;
+ private long field_1019_F;
+ public int skylightSubtracted;
+ protected int field_9437_g;
+ protected int field_9436_h;
+ public boolean field_1043_h;
+ private long field_1054_E;
+ protected int autosavePeriod;
+ public int difficultySetting;
+ public Random rand;
+ public int spawnX;
+ public int spawnY;
+ public int spawnZ;
+ public boolean field_1033_r;
+ public final WorldProvider worldProvider;
+ protected List worldAccesses;
+ private IChunkProvider chunkProvider;
+ public File field_9433_s;
+ public File field_9432_t;
+ public long randomSeed;
+ private NBTTagCompound nbtCompoundPlayer;
+ public long sizeOnDisk;
+ public final String field_9431_w;
+ public boolean field_9430_x;
+ private ArrayList field_9428_I;
+ private int field_4204_J;
+ static int field_9429_y = 0;
+ private Set field_9427_K;
+ private int field_9426_L;
+ private List field_1012_M;
+
+ public static NBTTagCompound func_629_a(File var0, String var1) {
+ File var2 = new File(var0, "saves");
+ File var3 = new File(var2, var1);
+ if(!var3.exists()) {
+ return null;
+ } else {
+ File var4 = new File(var3, "level.dat");
+ if(var4.exists()) {
+ try {
+ NBTTagCompound var5 = CompressedStreamTools.func_1138_a(new FileInputStream(var4));
+ NBTTagCompound var6 = var5.getCompoundTag("Data");
+ return var6;
+ } catch (Exception var7) {
+ var7.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+ }
+
+ public static void deleteWorld(File var0, String var1) {
+ File var2 = new File(var0, "saves");
+ File var3 = new File(var2, var1);
+ if(var3.exists()) {
+ deleteFiles(var3.listFiles());
+ var3.delete();
+ }
+ }
+
+ private static void deleteFiles(File[] var0) {
+ for(int var1 = 0; var1 < var0.length; ++var1) {
+ if(var0[var1].isDirectory()) {
+ deleteFiles(var0[var1].listFiles());
+ }
+
+ var0[var1].delete();
+ }
+
+ }
+
+ public WorldChunkManager func_4075_a() {
+ return this.worldProvider.worldChunkMgr;
+ }
+
+ public World(File var1, String var2) {
+ this(var1, var2, (new Random()).nextLong());
+ }
+
+ public World(String var1, WorldProvider var2, long var3) {
+ this.field_4214_a = false;
+ this.field_1051_z = new ArrayList();
+ this.loadedEntityList = new ArrayList();
+ this.field_1024_A = new ArrayList();
+ this.scheduledTickTreeSet = new TreeSet();
+ this.scheduledTickSet = new HashSet();
+ this.loadedTileEntityList = new ArrayList();
+ this.playerEntities = new ArrayList();
+ this.worldTime = 0L;
+ this.field_1019_F = 16777215L;
+ this.skylightSubtracted = 0;
+ this.field_9437_g = (new Random()).nextInt();
+ this.field_9436_h = 1013904223;
+ this.field_1043_h = false;
+ this.field_1054_E = System.currentTimeMillis();
+ this.autosavePeriod = 40;
+ this.rand = new Random();
+ this.field_1033_r = false;
+ this.worldAccesses = new ArrayList();
+ this.randomSeed = 0L;
+ this.sizeOnDisk = 0L;
+ this.field_9428_I = new ArrayList();
+ this.field_4204_J = 0;
+ this.field_9427_K = new HashSet();
+ this.field_9426_L = this.rand.nextInt(12000);
+ this.field_1012_M = new ArrayList();
+ this.field_9431_w = var1;
+ this.randomSeed = var3;
+ this.worldProvider = var2;
+ var2.registerWorld(this);
+ this.chunkProvider = this.func_4081_a(this.field_9432_t);
+ this.calculateInitialSkylight();
+ }
+
+ public World(World var1, WorldProvider var2) {
+ this.field_4214_a = false;
+ this.field_1051_z = new ArrayList();
+ this.loadedEntityList = new ArrayList();
+ this.field_1024_A = new ArrayList();
+ this.scheduledTickTreeSet = new TreeSet();
+ this.scheduledTickSet = new HashSet();
+ this.loadedTileEntityList = new ArrayList();
+ this.playerEntities = new ArrayList();
+ this.worldTime = 0L;
+ this.field_1019_F = 16777215L;
+ this.skylightSubtracted = 0;
+ this.field_9437_g = (new Random()).nextInt();
+ this.field_9436_h = 1013904223;
+ this.field_1043_h = false;
+ this.field_1054_E = System.currentTimeMillis();
+ this.autosavePeriod = 40;
+ this.rand = new Random();
+ this.field_1033_r = false;
+ this.worldAccesses = new ArrayList();
+ this.randomSeed = 0L;
+ this.sizeOnDisk = 0L;
+ this.field_9428_I = new ArrayList();
+ this.field_4204_J = 0;
+ this.field_9427_K = new HashSet();
+ this.field_9426_L = this.rand.nextInt(12000);
+ this.field_1012_M = new ArrayList();
+ this.field_1054_E = var1.field_1054_E;
+ this.field_9433_s = var1.field_9433_s;
+ this.field_9432_t = var1.field_9432_t;
+ this.field_9431_w = var1.field_9431_w;
+ this.randomSeed = var1.randomSeed;
+ this.worldTime = var1.worldTime;
+ this.spawnX = var1.spawnX;
+ this.spawnY = var1.spawnY;
+ this.spawnZ = var1.spawnZ;
+ this.sizeOnDisk = var1.sizeOnDisk;
+ this.worldProvider = var2;
+ var2.registerWorld(this);
+ this.chunkProvider = this.func_4081_a(this.field_9432_t);
+ this.calculateInitialSkylight();
+ }
+
+ public World(File var1, String var2, long var3) {
+ this(var1, var2, var3, (WorldProvider)null);
+ }
+
+ public World(File var1, String var2, long var3, WorldProvider var5) {
+ this.field_4214_a = false;
+ this.field_1051_z = new ArrayList();
+ this.loadedEntityList = new ArrayList();
+ this.field_1024_A = new ArrayList();
+ this.scheduledTickTreeSet = new TreeSet();
+ this.scheduledTickSet = new HashSet();
+ this.loadedTileEntityList = new ArrayList();
+ this.playerEntities = new ArrayList();
+ this.worldTime = 0L;
+ this.field_1019_F = 16777215L;
+ this.skylightSubtracted = 0;
+ this.field_9437_g = (new Random()).nextInt();
+ this.field_9436_h = 1013904223;
+ this.field_1043_h = false;
+ this.field_1054_E = System.currentTimeMillis();
+ this.autosavePeriod = 40;
+ this.rand = new Random();
+ this.field_1033_r = false;
+ this.worldAccesses = new ArrayList();
+ this.randomSeed = 0L;
+ this.sizeOnDisk = 0L;
+ this.field_9428_I = new ArrayList();
+ this.field_4204_J = 0;
+ this.field_9427_K = new HashSet();
+ this.field_9426_L = this.rand.nextInt(12000);
+ this.field_1012_M = new ArrayList();
+ this.field_9433_s = var1;
+ this.field_9431_w = var2;
+ var1.mkdirs();
+ this.field_9432_t = new File(var1, var2);
+ this.field_9432_t.mkdirs();
+
+ try {
+ File var6 = new File(this.field_9432_t, "session.lock");
+ DataOutputStream var7 = new DataOutputStream(new FileOutputStream(var6));
+
+ try {
+ var7.writeLong(this.field_1054_E);
+ } finally {
+ var7.close();
+ }
+ } catch (IOException var16) {
+ var16.printStackTrace();
+ throw new RuntimeException("Failed to check session lock, aborting");
+ }
+
+ Object var17 = new WorldProvider();
+ File var18 = new File(this.field_9432_t, "level.dat");
+ this.field_1033_r = !var18.exists();
+ if(var18.exists()) {
+ try {
+ NBTTagCompound var8 = CompressedStreamTools.func_1138_a(new FileInputStream(var18));
+ NBTTagCompound var9 = var8.getCompoundTag("Data");
+ this.randomSeed = var9.getLong("RandomSeed");
+ this.spawnX = var9.getInteger("SpawnX");
+ this.spawnY = var9.getInteger("SpawnY");
+ this.spawnZ = var9.getInteger("SpawnZ");
+ this.worldTime = var9.getLong("Time");
+ this.sizeOnDisk = var9.getLong("SizeOnDisk");
+ if(var9.hasKey("Player")) {
+ this.nbtCompoundPlayer = var9.getCompoundTag("Player");
+ int var10 = this.nbtCompoundPlayer.getInteger("Dimension");
+ if(var10 == -1) {
+ var17 = new WorldProviderHell();
+ }
+ }
+ } catch (Exception var14) {
+ var14.printStackTrace();
+ }
+ }
+
+ if(var5 != null) {
+ var17 = var5;
+ }
+
+ boolean var19 = false;
+ if(this.randomSeed == 0L) {
+ this.randomSeed = var3;
+ var19 = true;
+ }
+
+ this.worldProvider = (WorldProvider)var17;
+ this.worldProvider.registerWorld(this);
+ this.chunkProvider = this.func_4081_a(this.field_9432_t);
+ if(var19) {
+ this.field_9430_x = true;
+ this.spawnX = 0;
+ this.spawnY = 64;
+
+ for(this.spawnZ = 0; !this.worldProvider.canCoordinateBeSpawn(this.spawnX, this.spawnZ); this.spawnZ += this.rand.nextInt(64) - this.rand.nextInt(64)) {
+ this.spawnX += this.rand.nextInt(64) - this.rand.nextInt(64);
+ }
+
+ this.field_9430_x = false;
+ }
+
+ this.calculateInitialSkylight();
+ }
+
+ protected IChunkProvider func_4081_a(File var1) {
+ return new ChunkProviderLoadOrGenerate(this, this.worldProvider.getChunkLoader(var1), this.worldProvider.getChunkProvider());
+ }
+
+ public void func_4076_b() {
+ if(this.spawnY <= 0) {
+ this.spawnY = 64;
+ }
+
+ while(this.func_614_g(this.spawnX, this.spawnZ) == 0) {
+ this.spawnX += this.rand.nextInt(8) - this.rand.nextInt(8);
+ this.spawnZ += this.rand.nextInt(8) - this.rand.nextInt(8);
+ }
+
+ }
+
+ public int func_614_g(int var1, int var2) {
+ int var3;
+ for(var3 = 63; this.getBlockId(var1, var3 + 1, var2) != 0; ++var3) {
+ }
+
+ return this.getBlockId(var1, var3, var2);
+ }
+
+ public void func_6464_c() {
+ }
+
+ public void func_608_a(EntityPlayer var1) {
+ try {
+ if(this.nbtCompoundPlayer != null) {
+ var1.readFromNBT(this.nbtCompoundPlayer);
+ this.nbtCompoundPlayer = null;
+ }
+
+ this.entityJoinedWorld(var1);
+ } catch (Exception var3) {
+ var3.printStackTrace();
+ }
+
+ }
+
+ public void saveWorld(boolean var1, IProgressUpdate var2) {
+ if(this.chunkProvider.func_536_b()) {
+ if(var2 != null) {
+ var2.func_594_b("Saving level");
+ }
+
+ this.saveLevel();
+ if(var2 != null) {
+ var2.displayLoadingString("Saving chunks");
+ }
+
+ this.chunkProvider.saveChunks(var1, var2);
+ }
+ }
+
+ private void saveLevel() {
+ this.func_663_l();
+ NBTTagCompound var1 = new NBTTagCompound();
+ var1.setLong("RandomSeed", this.randomSeed);
+ var1.setInteger("SpawnX", this.spawnX);
+ var1.setInteger("SpawnY", this.spawnY);
+ var1.setInteger("SpawnZ", this.spawnZ);
+ var1.setLong("Time", this.worldTime);
+ var1.setLong("SizeOnDisk", this.sizeOnDisk);
+ var1.setLong("LastPlayed", System.currentTimeMillis());
+ EntityPlayer var2 = null;
+ if(this.playerEntities.size() > 0) {
+ var2 = (EntityPlayer)this.playerEntities.get(0);
+ }
+
+ NBTTagCompound var3;
+ if(var2 != null) {
+ var3 = new NBTTagCompound();
+ var2.writeToNBT(var3);
+ var1.setCompoundTag("Player", var3);
+ }
+
+ var3 = new NBTTagCompound();
+ var3.setTag("Data", var1);
+
+ try {
+ File var4 = new File(this.field_9432_t, "level.dat_new");
+ File var5 = new File(this.field_9432_t, "level.dat_old");
+ File var6 = new File(this.field_9432_t, "level.dat");
+ CompressedStreamTools.writeGzippedCompoundToOutputStream(var3, new FileOutputStream(var4));
+ if(var5.exists()) {
+ var5.delete();
+ }
+
+ var6.renameTo(var5);
+ if(var6.exists()) {
+ var6.delete();
+ }
+
+ var4.renameTo(var6);
+ if(var4.exists()) {
+ var4.delete();
+ }
+ } catch (Exception var7) {
+ var7.printStackTrace();
+ }
+
+ }
+
+ public boolean func_650_a(int var1) {
+ if(!this.chunkProvider.func_536_b()) {
+ return true;
+ } else {
+ if(var1 == 0) {
+ this.saveLevel();
+ }
+
+ return this.chunkProvider.saveChunks(false, (IProgressUpdate)null);
+ }
+ }
+
+ public int getBlockId(int var1, int var2, int var3) {
+ return var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000 ? (var2 < 0 ? 0 : (var2 >= 128 ? 0 : this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4).getBlockID(var1 & 15, var2, var3 & 15))) : 0;
+ }
+
+ public boolean blockExists(int var1, int var2, int var3) {
+ return var2 >= 0 && var2 < 128 ? this.chunkExists(var1 >> 4, var3 >> 4) : false;
+ }
+
+ public boolean checkChunksExist(int var1, int var2, int var3, int var4, int var5, int var6) {
+ if(var5 >= 0 && var2 < 128) {
+ var1 >>= 4;
+ var2 >>= 4;
+ var3 >>= 4;
+ var4 >>= 4;
+ var5 >>= 4;
+ var6 >>= 4;
+
+ for(int var7 = var1; var7 <= var4; ++var7) {
+ for(int var8 = var3; var8 <= var6; ++var8) {
+ if(!this.chunkExists(var7, var8)) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private boolean chunkExists(int var1, int var2) {
+ return this.chunkProvider.chunkExists(var1, var2);
+ }
+
+ public Chunk getChunkFromBlockCoords(int var1, int var2) {
+ return this.getChunkFromChunkCoords(var1 >> 4, var2 >> 4);
+ }
+
+ public Chunk getChunkFromChunkCoords(int var1, int var2) {
+ return this.chunkProvider.provideChunk(var1, var2);
+ }
+
+ public boolean setBlockAndMetadata(int var1, int var2, int var3, int var4, int var5) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return false;
+ } else if(var2 >= 128) {
+ return false;
+ } else {
+ Chunk var6 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ return var6.setBlockIDWithMetadata(var1 & 15, var2, var3 & 15, var4, var5);
+ }
+ } else {
+ return false;
+ }
+ }
+
+ public boolean setBlock(int var1, int var2, int var3, int var4) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return false;
+ } else if(var2 >= 128) {
+ return false;
+ } else {
+ Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ return var5.setBlockID(var1 & 15, var2, var3 & 15, var4);
+ }
+ } else {
+ return false;
+ }
+ }
+
+ public Material getBlockMaterial(int var1, int var2, int var3) {
+ int var4 = this.getBlockId(var1, var2, var3);
+ return var4 == 0 ? Material.air : Block.blocksList[var4].blockMaterial;
+ }
+
+ public int getBlockMetadata(int var1, int var2, int var3) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return 0;
+ } else if(var2 >= 128) {
+ return 0;
+ } else {
+ Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ var1 &= 15;
+ var3 &= 15;
+ return var4.getBlockMetadata(var1, var2, var3);
+ }
+ } else {
+ return 0;
+ }
+ }
+
+ public void setBlockMetadataWithNotify(int var1, int var2, int var3, int var4) {
+ if(this.setBlockMetadata(var1, var2, var3, var4)) {
+ this.notifyBlockChange(var1, var2, var3, this.getBlockId(var1, var2, var3));
+ }
+
+ }
+
+ public boolean setBlockMetadata(int var1, int var2, int var3, int var4) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return false;
+ } else if(var2 >= 128) {
+ return false;
+ } else {
+ Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ var1 &= 15;
+ var3 &= 15;
+ var5.setBlockMetadata(var1, var2, var3, var4);
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ public boolean setBlockWithNotify(int var1, int var2, int var3, int var4) {
+ if(this.setBlock(var1, var2, var3, var4)) {
+ this.notifyBlockChange(var1, var2, var3, var4);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean setBlockAndMetadataWithNotify(int var1, int var2, int var3, int var4, int var5) {
+ if(this.setBlockAndMetadata(var1, var2, var3, var4, var5)) {
+ this.notifyBlockChange(var1, var2, var3, var4);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void func_665_h(int var1, int var2, int var3) {
+ for(int var4 = 0; var4 < this.worldAccesses.size(); ++var4) {
+ ((IWorldAccess)this.worldAccesses.get(var4)).func_934_a(var1, var2, var3);
+ }
+
+ }
+
+ protected void notifyBlockChange(int var1, int var2, int var3, int var4) {
+ this.func_665_h(var1, var2, var3);
+ this.notifyBlocksOfNeighborChange(var1, var2, var3, var4);
+ }
+
+ public void func_680_f(int var1, int var2, int var3, int var4) {
+ if(var3 > var4) {
+ int var5 = var4;
+ var4 = var3;
+ var3 = var5;
+ }
+
+ this.func_701_b(var1, var3, var2, var1, var4, var2);
+ }
+
+ public void func_701_b(int var1, int var2, int var3, int var4, int var5, int var6) {
+ for(int var7 = 0; var7 < this.worldAccesses.size(); ++var7) {
+ ((IWorldAccess)this.worldAccesses.get(var7)).func_937_b(var1, var2, var3, var4, var5, var6);
+ }
+
+ }
+
+ public void notifyBlocksOfNeighborChange(int var1, int var2, int var3, int var4) {
+ this.notifyBlockOfNeighborChange(var1 - 1, var2, var3, var4);
+ this.notifyBlockOfNeighborChange(var1 + 1, var2, var3, var4);
+ this.notifyBlockOfNeighborChange(var1, var2 - 1, var3, var4);
+ this.notifyBlockOfNeighborChange(var1, var2 + 1, var3, var4);
+ this.notifyBlockOfNeighborChange(var1, var2, var3 - 1, var4);
+ this.notifyBlockOfNeighborChange(var1, var2, var3 + 1, var4);
+ }
+
+ private void notifyBlockOfNeighborChange(int var1, int var2, int var3, int var4) {
+ if(!this.field_1043_h) {
+ Block var5 = Block.blocksList[this.getBlockId(var1, var2, var3)];
+ if(var5 != null) {
+ var5.onNeighborBlockChange(this, var1, var2, var3, var4);
+ }
+
+ }
+ }
+
+ public boolean canBlockSeeTheSky(int var1, int var2, int var3) {
+ return this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4).canBlockSeeTheSky(var1 & 15, var2, var3 & 15);
+ }
+
+ public int getBlockLightValue(int var1, int var2, int var3) {
+ return this.getBlockLightValue(var1, var2, var3, true);
+ }
+
+ public int getBlockLightValue(int var1, int var2, int var3, boolean var4) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ int var5;
+ if(var4) {
+ var5 = this.getBlockId(var1, var2, var3);
+ if(var5 == Block.stairSingle.blockID || var5 == Block.tilledField.blockID) {
+ int var6 = this.getBlockLightValue(var1, var2 + 1, var3, false);
+ int var7 = this.getBlockLightValue(var1 + 1, var2, var3, false);
+ int var8 = this.getBlockLightValue(var1 - 1, var2, var3, false);
+ int var9 = this.getBlockLightValue(var1, var2, var3 + 1, false);
+ int var10 = this.getBlockLightValue(var1, var2, var3 - 1, false);
+ if(var7 > var6) {
+ var6 = var7;
+ }
+
+ if(var8 > var6) {
+ var6 = var8;
+ }
+
+ if(var9 > var6) {
+ var6 = var9;
+ }
+
+ if(var10 > var6) {
+ var6 = var10;
+ }
+
+ return var6;
+ }
+ }
+
+ if(var2 < 0) {
+ return 0;
+ } else if(var2 >= 128) {
+ var5 = 15 - this.skylightSubtracted;
+ if(var5 < 0) {
+ var5 = 0;
+ }
+
+ return var5;
+ } else {
+ Chunk var11 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ var1 &= 15;
+ var3 &= 15;
+ return var11.getBlockLightValue(var1, var2, var3, this.skylightSubtracted);
+ }
+ } else {
+ return 15;
+ }
+ }
+
+ public boolean canExistingBlockSeeTheSky(int var1, int var2, int var3) {
+ if(var1 >= -32000000 && var3 >= -32000000 && var1 < 32000000 && var3 <= 32000000) {
+ if(var2 < 0) {
+ return false;
+ } else if(var2 >= 128) {
+ return true;
+ } else if(!this.chunkExists(var1 >> 4, var3 >> 4)) {
+ return false;
+ } else {
+ Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ var1 &= 15;
+ var3 &= 15;
+ return var4.canBlockSeeTheSky(var1, var2, var3);
+ }
+ } else {
+ return false;
+ }
+ }
+
+ public int getHeightValue(int var1, int var2) {
+ if(var1 >= -32000000 && var2 >= -32000000 && var1 < 32000000 && var2 <= 32000000) {
+ if(!this.chunkExists(var1 >> 4, var2 >> 4)) {
+ return 0;
+ } else {
+ Chunk var3 = this.getChunkFromChunkCoords(var1 >> 4, var2 >> 4);
+ return var3.getHeightValue(var1 & 15, var2 & 15);
+ }
+ } else {
+ return 0;
+ }
+ }
+
+ public void neighborLightPropagationChanged(EnumSkyBlock var1, int var2, int var3, int var4, int var5) {
+ if(!this.worldProvider.field_6478_e || var1 != EnumSkyBlock.Sky) {
+ if(this.blockExists(var2, var3, var4)) {
+ if(var1 == EnumSkyBlock.Sky) {
+ if(this.canExistingBlockSeeTheSky(var2, var3, var4)) {
+ var5 = 15;
+ }
+ } else if(var1 == EnumSkyBlock.Block) {
+ int var6 = this.getBlockId(var2, var3, var4);
+ if(Block.lightValue[var6] > var5) {
+ var5 = Block.lightValue[var6];
+ }
+ }
+
+ if(this.getSavedLightValue(var1, var2, var3, var4) != var5) {
+ this.func_616_a(var1, var2, var3, var4, var2, var3, var4);
+ }
+
+ }
+ }
+ }
+
+ public int getSavedLightValue(EnumSkyBlock var1, int var2, int var3, int var4) {
+ if(var3 >= 0 && var3 < 128 && var2 >= -32000000 && var4 >= -32000000 && var2 < 32000000 && var4 <= 32000000) {
+ int var5 = var2 >> 4;
+ int var6 = var4 >> 4;
+ if(!this.chunkExists(var5, var6)) {
+ return 0;
+ } else {
+ Chunk var7 = this.getChunkFromChunkCoords(var5, var6);
+ return var7.getSavedLightValue(var1, var2 & 15, var3, var4 & 15);
+ }
+ } else {
+ return var1.field_1722_c;
+ }
+ }
+
+ public void setLightValue(EnumSkyBlock var1, int var2, int var3, int var4, int var5) {
+ if(var2 >= -32000000 && var4 >= -32000000 && var2 < 32000000 && var4 <= 32000000) {
+ if(var3 >= 0) {
+ if(var3 < 128) {
+ if(this.chunkExists(var2 >> 4, var4 >> 4)) {
+ Chunk var6 = this.getChunkFromChunkCoords(var2 >> 4, var4 >> 4);
+ var6.setLightValue(var1, var2 & 15, var3, var4 & 15, var5);
+
+ for(int var7 = 0; var7 < this.worldAccesses.size(); ++var7) {
+ ((IWorldAccess)this.worldAccesses.get(var7)).func_934_a(var2, var3, var4);
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+ public float getLightBrightness(int var1, int var2, int var3) {
+ return this.worldProvider.lightBrightnessTable[this.getBlockLightValue(var1, var2, var3)];
+ }
+
+ public boolean isDaytime() {
+ return this.skylightSubtracted < 4;
+ }
+
+ public MovingObjectPosition rayTraceBlocks(Vec3D var1, Vec3D var2) {
+ return this.rayTraceBlocks(var1, var2, false);
+ }
+
+ public MovingObjectPosition rayTraceBlocks(Vec3D var1, Vec3D var2, boolean var3) {
+ if(!Double.isNaN(var1.xCoord) && !Double.isNaN(var1.yCoord) && !Double.isNaN(var1.zCoord)) {
+ if(!Double.isNaN(var2.xCoord) && !Double.isNaN(var2.yCoord) && !Double.isNaN(var2.zCoord)) {
+ int var4 = MathHelper.floor_double(var2.xCoord);
+ int var5 = MathHelper.floor_double(var2.yCoord);
+ int var6 = MathHelper.floor_double(var2.zCoord);
+ int var7 = MathHelper.floor_double(var1.xCoord);
+ int var8 = MathHelper.floor_double(var1.yCoord);
+ int var9 = MathHelper.floor_double(var1.zCoord);
+ int var10 = 200;
+
+ while(var10-- >= 0) {
+ if(Double.isNaN(var1.xCoord) || Double.isNaN(var1.yCoord) || Double.isNaN(var1.zCoord)) {
+ return null;
+ }
+
+ if(var7 == var4 && var8 == var5 && var9 == var6) {
+ return null;
+ }
+
+ double var11 = 999.0D;
+ double var13 = 999.0D;
+ double var15 = 999.0D;
+ if(var4 > var7) {
+ var11 = (double)var7 + 1.0D;
+ }
+
+ if(var4 < var7) {
+ var11 = (double)var7 + 0.0D;
+ }
+
+ if(var5 > var8) {
+ var13 = (double)var8 + 1.0D;
+ }
+
+ if(var5 < var8) {
+ var13 = (double)var8 + 0.0D;
+ }
+
+ if(var6 > var9) {
+ var15 = (double)var9 + 1.0D;
+ }
+
+ if(var6 < var9) {
+ var15 = (double)var9 + 0.0D;
+ }
+
+ double var17 = 999.0D;
+ double var19 = 999.0D;
+ double var21 = 999.0D;
+ double var23 = var2.xCoord - var1.xCoord;
+ double var25 = var2.yCoord - var1.yCoord;
+ double var27 = var2.zCoord - var1.zCoord;
+ if(var11 != 999.0D) {
+ var17 = (var11 - var1.xCoord) / var23;
+ }
+
+ if(var13 != 999.0D) {
+ var19 = (var13 - var1.yCoord) / var25;
+ }
+
+ if(var15 != 999.0D) {
+ var21 = (var15 - var1.zCoord) / var27;
+ }
+
+ boolean var29 = false;
+ byte var35;
+ if(var17 < var19 && var17 < var21) {
+ if(var4 > var7) {
+ var35 = 4;
+ } else {
+ var35 = 5;
+ }
+
+ var1.xCoord = var11;
+ var1.yCoord += var25 * var17;
+ var1.zCoord += var27 * var17;
+ } else if(var19 < var21) {
+ if(var5 > var8) {
+ var35 = 0;
+ } else {
+ var35 = 1;
+ }
+
+ var1.xCoord += var23 * var19;
+ var1.yCoord = var13;
+ var1.zCoord += var27 * var19;
+ } else {
+ if(var6 > var9) {
+ var35 = 2;
+ } else {
+ var35 = 3;
+ }
+
+ var1.xCoord += var23 * var21;
+ var1.yCoord += var25 * var21;
+ var1.zCoord = var15;
+ }
+
+ Vec3D var30 = Vec3D.createVector(var1.xCoord, var1.yCoord, var1.zCoord);
+ var7 = (int)(var30.xCoord = (double)MathHelper.floor_double(var1.xCoord));
+ if(var35 == 5) {
+ --var7;
+ ++var30.xCoord;
+ }
+
+ var8 = (int)(var30.yCoord = (double)MathHelper.floor_double(var1.yCoord));
+ if(var35 == 1) {
+ --var8;
+ ++var30.yCoord;
+ }
+
+ var9 = (int)(var30.zCoord = (double)MathHelper.floor_double(var1.zCoord));
+ if(var35 == 3) {
+ --var9;
+ ++var30.zCoord;
+ }
+
+ int var31 = this.getBlockId(var7, var8, var9);
+ int var32 = this.getBlockMetadata(var7, var8, var9);
+ Block var33 = Block.blocksList[var31];
+ if(var31 > 0 && var33.canCollideCheck(var32, var3)) {
+ MovingObjectPosition var34 = var33.collisionRayTrace(this, var7, var8, var9, var1, var2);
+ if(var34 != null) {
+ return var34;
+ }
+ }
+ }
+
+ return null;
+ } else {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ public void playSoundAtEntity(Entity var1, String var2, float var3, float var4) {
+ for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) {
+ ((IWorldAccess)this.worldAccesses.get(var5)).playSound(var2, var1.posX, var1.posY - (double)var1.yOffset, var1.posZ, var3, var4);
+ }
+
+ }
+
+ public void playSoundEffect(double var1, double var3, double var5, String var7, float var8, float var9) {
+ for(int var10 = 0; var10 < this.worldAccesses.size(); ++var10) {
+ ((IWorldAccess)this.worldAccesses.get(var10)).playSound(var7, var1, var3, var5, var8, var9);
+ }
+
+ }
+
+ public void playRecord(String var1, int var2, int var3, int var4) {
+ for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) {
+ ((IWorldAccess)this.worldAccesses.get(var5)).playRecord(var1, var2, var3, var4);
+ }
+
+ }
+
+ public void spawnParticle(String var1, double var2, double var4, double var6, double var8, double var10, double var12) {
+ for(int var14 = 0; var14 < this.worldAccesses.size(); ++var14) {
+ ((IWorldAccess)this.worldAccesses.get(var14)).spawnParticle(var1, var2, var4, var6, var8, var10, var12);
+ }
+
+ }
+
+ public boolean entityJoinedWorld(Entity var1) {
+ int var2 = MathHelper.floor_double(var1.posX / 16.0D);
+ int var3 = MathHelper.floor_double(var1.posZ / 16.0D);
+ boolean var4 = false;
+ if(var1 instanceof EntityPlayer) {
+ var4 = true;
+ }
+
+ if(!var4 && !this.chunkExists(var2, var3)) {
+ return false;
+ } else {
+ if(var1 instanceof EntityPlayer) {
+ this.playerEntities.add((EntityPlayer)var1);
+ System.out.println("Player count: " + this.playerEntities.size());
+ }
+
+ this.getChunkFromChunkCoords(var2, var3).addEntity(var1);
+ this.loadedEntityList.add(var1);
+ this.obtainEntitySkin(var1);
+ return true;
+ }
+ }
+
+ protected void obtainEntitySkin(Entity var1) {
+ for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) {
+ ((IWorldAccess)this.worldAccesses.get(var2)).obtainEntitySkin(var1);
+ }
+
+ }
+
+ protected void releaseEntitySkin(Entity var1) {
+ for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) {
+ ((IWorldAccess)this.worldAccesses.get(var2)).releaseEntitySkin(var1);
+ }
+
+ }
+
+ public void setEntityDead(Entity var1) {
+ var1.setEntityDead();
+ if(var1 instanceof EntityPlayer) {
+ this.playerEntities.remove((EntityPlayer)var1);
+ }
+
+ }
+
+ public void addWorldAccess(IWorldAccess var1) {
+ this.worldAccesses.add(var1);
+ }
+
+ public void removeWorldAccess(IWorldAccess var1) {
+ this.worldAccesses.remove(var1);
+ }
+
+ public List getCollidingBoundingBoxes(Entity var1, AxisAlignedBB var2) {
+ this.field_9428_I.clear();
+ int var3 = MathHelper.floor_double(var2.minX);
+ int var4 = MathHelper.floor_double(var2.maxX + 1.0D);
+ int var5 = MathHelper.floor_double(var2.minY);
+ int var6 = MathHelper.floor_double(var2.maxY + 1.0D);
+ int var7 = MathHelper.floor_double(var2.minZ);
+ int var8 = MathHelper.floor_double(var2.maxZ + 1.0D);
+
+ for(int var9 = var3; var9 < var4; ++var9) {
+ for(int var10 = var7; var10 < var8; ++var10) {
+ if(this.blockExists(var9, 64, var10)) {
+ for(int var11 = var5 - 1; var11 < var6; ++var11) {
+ Block var12 = Block.blocksList[this.getBlockId(var9, var11, var10)];
+ if(var12 != null) {
+ var12.getCollidingBoundingBoxes(this, var9, var11, var10, var2, this.field_9428_I);
+ }
+ }
+ }
+ }
+ }
+
+ double var14 = 0.25D;
+ List var15 = this.getEntitiesWithinAABBExcludingEntity(var1, var2.expands(var14, var14, var14));
+
+ for(int var16 = 0; var16 < var15.size(); ++var16) {
+ AxisAlignedBB var13 = ((Entity)var15.get(var16)).func_372_f_();
+ if(var13 != null && var13.intersectsWith(var2)) {
+ this.field_9428_I.add(var13);
+ }
+
+ var13 = var1.func_383_b_((Entity)var15.get(var16));
+ if(var13 != null && var13.intersectsWith(var2)) {
+ this.field_9428_I.add(var13);
+ }
+ }
+
+ return this.field_9428_I;
+ }
+
+ public int calculateSkylightSubtracted(float var1) {
+ float var2 = this.getCelestialAngle(var1);
+ float var3 = 1.0F - (MathHelper.cos(var2 * (float)Math.PI * 2.0F) * 2.0F + 0.5F);
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ return (int)(var3 * 11.0F);
+ }
+
+ public Vec3D func_4079_a(Entity var1, float var2) {
+ float var3 = this.getCelestialAngle(var2);
+ float var4 = MathHelper.cos(var3 * (float)Math.PI * 2.0F) * 2.0F + 0.5F;
+ if(var4 < 0.0F) {
+ var4 = 0.0F;
+ }
+
+ if(var4 > 1.0F) {
+ var4 = 1.0F;
+ }
+
+ int var5 = MathHelper.floor_double(var1.posX);
+ int var6 = MathHelper.floor_double(var1.posZ);
+ float var7 = (float)this.func_4075_a().func_4072_b(var5, var6);
+ int var8 = this.func_4075_a().func_4073_a(var5, var6).getSkyColorByTemp(var7);
+ float var9 = (float)(var8 >> 16 & 255) / 255.0F;
+ float var10 = (float)(var8 >> 8 & 255) / 255.0F;
+ float var11 = (float)(var8 & 255) / 255.0F;
+ var9 *= var4;
+ var10 *= var4;
+ var11 *= var4;
+ return Vec3D.createVector((double)var9, (double)var10, (double)var11);
+ }
+
+ public float getCelestialAngle(float var1) {
+ return this.worldProvider.calculateCelestialAngle(this.worldTime, var1);
+ }
+
+ public Vec3D func_628_d(float var1) {
+ float var2 = this.getCelestialAngle(var1);
+ float var3 = MathHelper.cos(var2 * (float)Math.PI * 2.0F) * 2.0F + 0.5F;
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ float var4 = (float)(this.field_1019_F >> 16 & 255L) / 255.0F;
+ float var5 = (float)(this.field_1019_F >> 8 & 255L) / 255.0F;
+ float var6 = (float)(this.field_1019_F & 255L) / 255.0F;
+ var4 *= var3 * 0.9F + 0.1F;
+ var5 *= var3 * 0.9F + 0.1F;
+ var6 *= var3 * 0.85F + 0.15F;
+ return Vec3D.createVector((double)var4, (double)var5, (double)var6);
+ }
+
+ public Vec3D func_4082_d(float var1) {
+ float var2 = this.getCelestialAngle(var1);
+ return this.worldProvider.func_4096_a(var2, var1);
+ }
+
+ public int func_4083_e(int var1, int var2) {
+ Chunk var3 = this.getChunkFromBlockCoords(var1, var2);
+
+ int var4;
+ for(var4 = 127; this.getBlockMaterial(var1, var4, var2).func_880_c() && var4 > 0; --var4) {
+ }
+
+ var1 &= 15;
+
+ for(var2 &= 15; var4 > 0; --var4) {
+ int var5 = var3.getBlockID(var1, var4, var2);
+ if(var5 != 0 && (Block.blocksList[var5].blockMaterial.func_880_c() || Block.blocksList[var5].blockMaterial.getIsLiquid())) {
+ return var4 + 1;
+ }
+ }
+
+ return -1;
+ }
+
+ public int func_696_e(int var1, int var2) {
+ return this.getChunkFromBlockCoords(var1, var2).getHeightValue(var1 & 15, var2 & 15);
+ }
+
+ public float func_679_f(float var1) {
+ float var2 = this.getCelestialAngle(var1);
+ float var3 = 1.0F - (MathHelper.cos(var2 * (float)Math.PI * 2.0F) * 2.0F + 12.0F / 16.0F);
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ return var3 * var3 * 0.5F;
+ }
+
+ public void scheduleBlockUpdate(int var1, int var2, int var3, int var4) {
+ NextTickListEntry var5 = new NextTickListEntry(var1, var2, var3, var4);
+ byte var6 = 8;
+ if(this.field_4214_a) {
+ if(this.checkChunksExist(var5.xCoord - var6, var5.yCoord - var6, var5.zCoord - var6, var5.xCoord + var6, var5.yCoord + var6, var5.zCoord + var6)) {
+ int var7 = this.getBlockId(var5.xCoord, var5.yCoord, var5.zCoord);
+ if(var7 == var5.blockID && var7 > 0) {
+ Block.blocksList[var7].updateTick(this, var5.xCoord, var5.yCoord, var5.zCoord, this.rand);
+ }
+ }
+
+ } else {
+ if(this.checkChunksExist(var1 - var6, var2 - var6, var3 - var6, var1 + var6, var2 + var6, var3 + var6)) {
+ if(var4 > 0) {
+ var5.setScheduledTime((long)Block.blocksList[var4].tickRate() + this.worldTime);
+ }
+
+ if(!this.scheduledTickSet.contains(var5)) {
+ this.scheduledTickSet.add(var5);
+ this.scheduledTickTreeSet.add(var5);
+ }
+ }
+
+ }
+ }
+
+ public void func_633_c() {
+ this.loadedEntityList.removeAll(this.field_1024_A);
+
+ int var1;
+ Entity var2;
+ int var3;
+ int var4;
+ for(var1 = 0; var1 < this.field_1024_A.size(); ++var1) {
+ var2 = (Entity)this.field_1024_A.get(var1);
+ var3 = var2.field_657_ba;
+ var4 = var2.field_654_bc;
+ if(var2.field_621_aZ && this.chunkExists(var3, var4)) {
+ this.getChunkFromChunkCoords(var3, var4).func_1015_b(var2);
+ }
+ }
+
+ for(var1 = 0; var1 < this.field_1024_A.size(); ++var1) {
+ this.releaseEntitySkin((Entity)this.field_1024_A.get(var1));
+ }
+
+ this.field_1024_A.clear();
+
+ for(var1 = 0; var1 < this.loadedEntityList.size(); ++var1) {
+ var2 = (Entity)this.loadedEntityList.get(var1);
+ if(var2.ridingEntity != null) {
+ if(!var2.ridingEntity.isDead && var2.ridingEntity.riddenByEntity == var2) {
+ continue;
+ }
+
+ var2.ridingEntity.riddenByEntity = null;
+ var2.ridingEntity = null;
+ }
+
+ if(!var2.isDead) {
+ this.func_667_e(var2);
+ }
+
+ if(var2.isDead) {
+ var3 = var2.field_657_ba;
+ var4 = var2.field_654_bc;
+ if(var2.field_621_aZ && this.chunkExists(var3, var4)) {
+ this.getChunkFromChunkCoords(var3, var4).func_1015_b(var2);
+ }
+
+ this.loadedEntityList.remove(var1--);
+ this.releaseEntitySkin(var2);
+ }
+ }
+
+ for(var1 = 0; var1 < this.loadedTileEntityList.size(); ++var1) {
+ TileEntity var5 = (TileEntity)this.loadedTileEntityList.get(var1);
+ var5.updateEntity();
+ }
+
+ }
+
+ public void func_667_e(Entity var1) {
+ this.func_4084_a(var1, true);
+ }
+
+ public void func_4084_a(Entity var1, boolean var2) {
+ int var3 = MathHelper.floor_double(var1.posX);
+ int var4 = MathHelper.floor_double(var1.posZ);
+ byte var5 = 16;
+ if(var2 || this.checkChunksExist(var3 - var5, 0, var4 - var5, var3 + var5, 128, var4 + var5)) {
+ var1.lastTickPosX = var1.posX;
+ var1.lastTickPosY = var1.posY;
+ var1.lastTickPosZ = var1.posZ;
+ var1.prevRotationYaw = var1.rotationYaw;
+ var1.prevRotationPitch = var1.rotationPitch;
+ if(var2 && var1.field_621_aZ) {
+ if(var1.ridingEntity != null) {
+ var1.func_350_p();
+ } else {
+ var1.onUpdate();
+ }
+ }
+
+ if(Double.isNaN(var1.posX) || Double.isInfinite(var1.posX)) {
+ var1.posX = var1.lastTickPosX;
+ }
+
+ if(Double.isNaN(var1.posY) || Double.isInfinite(var1.posY)) {
+ var1.posY = var1.lastTickPosY;
+ }
+
+ if(Double.isNaN(var1.posZ) || Double.isInfinite(var1.posZ)) {
+ var1.posZ = var1.lastTickPosZ;
+ }
+
+ if(Double.isNaN((double)var1.rotationPitch) || Double.isInfinite((double)var1.rotationPitch)) {
+ var1.rotationPitch = var1.prevRotationPitch;
+ }
+
+ if(Double.isNaN((double)var1.rotationYaw) || Double.isInfinite((double)var1.rotationYaw)) {
+ var1.rotationYaw = var1.prevRotationYaw;
+ }
+
+ int var6 = MathHelper.floor_double(var1.posX / 16.0D);
+ int var7 = MathHelper.floor_double(var1.posY / 16.0D);
+ int var8 = MathHelper.floor_double(var1.posZ / 16.0D);
+ if(!var1.field_621_aZ || var1.field_657_ba != var6 || var1.field_656_bb != var7 || var1.field_654_bc != var8) {
+ if(var1.field_621_aZ && this.chunkExists(var1.field_657_ba, var1.field_654_bc)) {
+ this.getChunkFromChunkCoords(var1.field_657_ba, var1.field_654_bc).func_1016_a(var1, var1.field_656_bb);
+ }
+
+ if(this.chunkExists(var6, var8)) {
+ var1.field_621_aZ = true;
+ this.getChunkFromChunkCoords(var6, var8).addEntity(var1);
+ } else {
+ var1.field_621_aZ = false;
+ }
+ }
+
+ if(var2 && var1.field_621_aZ && var1.riddenByEntity != null) {
+ if(!var1.riddenByEntity.isDead && var1.riddenByEntity.ridingEntity == var1) {
+ this.func_667_e(var1.riddenByEntity);
+ } else {
+ var1.riddenByEntity.ridingEntity = null;
+ var1.riddenByEntity = null;
+ }
+ }
+
+ }
+ }
+
+ public boolean checkIfAABBIsClear(AxisAlignedBB var1) {
+ List var2 = this.getEntitiesWithinAABBExcludingEntity((Entity)null, var1);
+
+ for(int var3 = 0; var3 < var2.size(); ++var3) {
+ Entity var4 = (Entity)var2.get(var3);
+ if(!var4.isDead && var4.field_618_ad) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public boolean getIsAnyLiquid(AxisAlignedBB var1) {
+ int var2 = MathHelper.floor_double(var1.minX);
+ int var3 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var4 = MathHelper.floor_double(var1.minY);
+ int var5 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var6 = MathHelper.floor_double(var1.minZ);
+ int var7 = MathHelper.floor_double(var1.maxZ + 1.0D);
+ if(var1.minX < 0.0D) {
+ --var2;
+ }
+
+ if(var1.minY < 0.0D) {
+ --var4;
+ }
+
+ if(var1.minZ < 0.0D) {
+ --var6;
+ }
+
+ for(int var8 = var2; var8 < var3; ++var8) {
+ for(int var9 = var4; var9 < var5; ++var9) {
+ for(int var10 = var6; var10 < var7; ++var10) {
+ Block var11 = Block.blocksList[this.getBlockId(var8, var9, var10)];
+ if(var11 != null && var11.blockMaterial.getIsLiquid()) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public boolean isBoundingBoxBurning(AxisAlignedBB var1) {
+ int var2 = MathHelper.floor_double(var1.minX);
+ int var3 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var4 = MathHelper.floor_double(var1.minY);
+ int var5 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var6 = MathHelper.floor_double(var1.minZ);
+ int var7 = MathHelper.floor_double(var1.maxZ + 1.0D);
+
+ for(int var8 = var2; var8 < var3; ++var8) {
+ for(int var9 = var4; var9 < var5; ++var9) {
+ for(int var10 = var6; var10 < var7; ++var10) {
+ int var11 = this.getBlockId(var8, var9, var10);
+ if(var11 == Block.fire.blockID || var11 == Block.lavaStill.blockID || var11 == Block.lavaMoving.blockID) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public boolean func_682_a(AxisAlignedBB var1, Material var2, Entity var3) {
+ int var4 = MathHelper.floor_double(var1.minX);
+ int var5 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var6 = MathHelper.floor_double(var1.minY);
+ int var7 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var8 = MathHelper.floor_double(var1.minZ);
+ int var9 = MathHelper.floor_double(var1.maxZ + 1.0D);
+ boolean var10 = false;
+ Vec3D var11 = Vec3D.createVector(0.0D, 0.0D, 0.0D);
+
+ for(int var12 = var4; var12 < var5; ++var12) {
+ for(int var13 = var6; var13 < var7; ++var13) {
+ for(int var14 = var8; var14 < var9; ++var14) {
+ Block var15 = Block.blocksList[this.getBlockId(var12, var13, var14)];
+ if(var15 != null && var15.blockMaterial == var2) {
+ double var16 = (double)((float)(var13 + 1) - BlockFluids.func_288_b(this.getBlockMetadata(var12, var13, var14)));
+ if((double)var7 >= var16) {
+ var10 = true;
+ var15.velocityToAddToEntity(this, var12, var13, var14, var3, var11);
+ }
+ }
+ }
+ }
+ }
+
+ if(var11.lengthVector() > 0.0D) {
+ var11 = var11.normalize();
+ double var18 = 0.004D;
+ var3.motionX += var11.xCoord * var18;
+ var3.motionY += var11.yCoord * var18;
+ var3.motionZ += var11.zCoord * var18;
+ }
+
+ return var10;
+ }
+
+ public boolean func_689_a(AxisAlignedBB var1, Material var2) {
+ int var3 = MathHelper.floor_double(var1.minX);
+ int var4 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var5 = MathHelper.floor_double(var1.minY);
+ int var6 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var7 = MathHelper.floor_double(var1.minZ);
+ int var8 = MathHelper.floor_double(var1.maxZ + 1.0D);
+
+ for(int var9 = var3; var9 < var4; ++var9) {
+ for(int var10 = var5; var10 < var6; ++var10) {
+ for(int var11 = var7; var11 < var8; ++var11) {
+ Block var12 = Block.blocksList[this.getBlockId(var9, var10, var11)];
+ if(var12 != null && var12.blockMaterial == var2) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public boolean func_707_b(AxisAlignedBB var1, Material var2) {
+ int var3 = MathHelper.floor_double(var1.minX);
+ int var4 = MathHelper.floor_double(var1.maxX + 1.0D);
+ int var5 = MathHelper.floor_double(var1.minY);
+ int var6 = MathHelper.floor_double(var1.maxY + 1.0D);
+ int var7 = MathHelper.floor_double(var1.minZ);
+ int var8 = MathHelper.floor_double(var1.maxZ + 1.0D);
+
+ for(int var9 = var3; var9 < var4; ++var9) {
+ for(int var10 = var5; var10 < var6; ++var10) {
+ for(int var11 = var7; var11 < var8; ++var11) {
+ Block var12 = Block.blocksList[this.getBlockId(var9, var10, var11)];
+ if(var12 != null && var12.blockMaterial == var2) {
+ int var13 = this.getBlockMetadata(var9, var10, var11);
+ double var14 = (double)(var10 + 1);
+ if(var13 < 8) {
+ var14 = (double)(var10 + 1) - (double)var13 / 8.0D;
+ }
+
+ if(var14 >= var1.minY) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public Explosion func_12243_a(Entity var1, double var2, double var4, double var6, float var8) {
+ return this.func_12244_a(var1, var2, var4, var6, var8, false);
+ }
+
+ public Explosion func_12244_a(Entity var1, double var2, double var4, double var6, float var8, boolean var9) {
+ Explosion var10 = new Explosion(this, var1, var2, var4, var6, var8);
+ var10.field_12257_a = var9;
+ var10.func_12248_a();
+ var10.func_12247_b();
+ return var10;
+ }
+
+ public float func_675_a(Vec3D var1, AxisAlignedBB var2) {
+ double var3 = 1.0D / ((var2.maxX - var2.minX) * 2.0D + 1.0D);
+ double var5 = 1.0D / ((var2.maxY - var2.minY) * 2.0D + 1.0D);
+ double var7 = 1.0D / ((var2.maxZ - var2.minZ) * 2.0D + 1.0D);
+ int var9 = 0;
+ int var10 = 0;
+
+ for(float var11 = 0.0F; var11 <= 1.0F; var11 = (float)((double)var11 + var3)) {
+ for(float var12 = 0.0F; var12 <= 1.0F; var12 = (float)((double)var12 + var5)) {
+ for(float var13 = 0.0F; var13 <= 1.0F; var13 = (float)((double)var13 + var7)) {
+ double var14 = var2.minX + (var2.maxX - var2.minX) * (double)var11;
+ double var16 = var2.minY + (var2.maxY - var2.minY) * (double)var12;
+ double var18 = var2.minZ + (var2.maxZ - var2.minZ) * (double)var13;
+ if(this.rayTraceBlocks(Vec3D.createVector(var14, var16, var18), var1) == null) {
+ ++var9;
+ }
+
+ ++var10;
+ }
+ }
+ }
+
+ return (float)var9 / (float)var10;
+ }
+
+ public void onBlockHit(int var1, int var2, int var3, int var4) {
+ if(var4 == 0) {
+ --var2;
+ }
+
+ if(var4 == 1) {
+ ++var2;
+ }
+
+ if(var4 == 2) {
+ --var3;
+ }
+
+ if(var4 == 3) {
+ ++var3;
+ }
+
+ if(var4 == 4) {
+ --var1;
+ }
+
+ if(var4 == 5) {
+ ++var1;
+ }
+
+ if(this.getBlockId(var1, var2, var3) == Block.fire.blockID) {
+ this.playSoundEffect((double)((float)var1 + 0.5F), (double)((float)var2 + 0.5F), (double)((float)var3 + 0.5F), "random.fizz", 0.5F, 2.6F + (this.rand.nextFloat() - this.rand.nextFloat()) * 0.8F);
+ this.setBlockWithNotify(var1, var2, var3, 0);
+ }
+
+ }
+
+ public Entity func_4085_a(Class var1) {
+ return null;
+ }
+
+ public String func_687_d() {
+ return "All: " + this.loadedEntityList.size();
+ }
+
+ public TileEntity getBlockTileEntity(int var1, int var2, int var3) {
+ Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ return var4 != null ? var4.getChunkBlockTileEntity(var1 & 15, var2, var3 & 15) : null;
+ }
+
+ public void setBlockTileEntity(int var1, int var2, int var3, TileEntity var4) {
+ Chunk var5 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ if(var5 != null) {
+ var5.setChunkBlockTileEntity(var1 & 15, var2, var3 & 15, var4);
+ }
+
+ }
+
+ public void removeBlockTileEntity(int var1, int var2, int var3) {
+ Chunk var4 = this.getChunkFromChunkCoords(var1 >> 4, var3 >> 4);
+ if(var4 != null) {
+ var4.removeChunkBlockTileEntity(var1 & 15, var2, var3 & 15);
+ }
+
+ }
+
+ public boolean isBlockOpaqueCube(int var1, int var2, int var3) {
+ Block var4 = Block.blocksList[this.getBlockId(var1, var2, var3)];
+ return var4 == null ? false : var4.isOpaqueCube();
+ }
+
+ public void func_651_a(IProgressUpdate var1) {
+ this.saveWorld(true, var1);
+ }
+
+ public boolean func_6465_g() {
+ if(this.field_4204_J >= 50) {
+ return false;
+ } else {
+ ++this.field_4204_J;
+
+ boolean var2;
+ try {
+ int var1 = 5000;
+
+ while(this.field_1051_z.size() > 0) {
+ --var1;
+ if(var1 <= 0) {
+ var2 = true;
+ return var2;
+ }
+
+ ((MetadataChunkBlock)this.field_1051_z.remove(this.field_1051_z.size() - 1)).func_4127_a(this);
+ }
+
+ var2 = false;
+ } finally {
+ --this.field_4204_J;
+ }
+
+ return var2;
+ }
+ }
+
+ public void func_616_a(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7) {
+ this.func_627_a(var1, var2, var3, var4, var5, var6, var7, true);
+ }
+
+ public void func_627_a(EnumSkyBlock var1, int var2, int var3, int var4, int var5, int var6, int var7, boolean var8) {
+ if(!this.worldProvider.field_6478_e || var1 != EnumSkyBlock.Sky) {
+ ++field_9429_y;
+ if(field_9429_y == 50) {
+ --field_9429_y;
+ } else {
+ int var9 = (var5 + var2) / 2;
+ int var10 = (var7 + var4) / 2;
+ if(!this.blockExists(var9, 64, var10)) {
+ --field_9429_y;
+ } else {
+ int var11 = this.field_1051_z.size();
+ if(var8) {
+ int var12 = 4;
+ if(var12 > var11) {
+ var12 = var11;
+ }
+
+ for(int var13 = 0; var13 < var12; ++var13) {
+ MetadataChunkBlock var14 = (MetadataChunkBlock)this.field_1051_z.get(this.field_1051_z.size() - var13 - 1);
+ if(var14.field_1299_a == var1 && var14.func_866_a(var2, var3, var4, var5, var6, var7)) {
+ --field_9429_y;
+ return;
+ }
+ }
+ }
+
+ this.field_1051_z.add(new MetadataChunkBlock(var1, var2, var3, var4, var5, var6, var7));
+ if(this.field_1051_z.size() > 100000) {
+ this.field_1051_z.clear();
+ }
+
+ --field_9429_y;
+ }
+ }
+ }
+ }
+
+ public void calculateInitialSkylight() {
+ int var1 = this.calculateSkylightSubtracted(1.0F);
+ if(var1 != this.skylightSubtracted) {
+ this.skylightSubtracted = var1;
+ }
+
+ }
+
+ public void tick() {
+ SpawnerAnimals.performSpawning(this);
+ this.chunkProvider.func_532_a();
+ int var1 = this.calculateSkylightSubtracted(1.0F);
+ if(var1 != this.skylightSubtracted) {
+ this.skylightSubtracted = var1;
+
+ for(int var2 = 0; var2 < this.worldAccesses.size(); ++var2) {
+ ((IWorldAccess)this.worldAccesses.get(var2)).func_936_e();
+ }
+ }
+
+ ++this.worldTime;
+ if(this.worldTime % (long)this.autosavePeriod == 0L) {
+ this.saveWorld(false, (IProgressUpdate)null);
+ }
+
+ this.TickUpdates(false);
+ this.func_4080_j();
+ }
+
+ protected void func_4080_j() {
+ this.field_9427_K.clear();
+
+ int var3;
+ int var4;
+ int var6;
+ int var7;
+ for(int var1 = 0; var1 < this.playerEntities.size(); ++var1) {
+ EntityPlayer var2 = (EntityPlayer)this.playerEntities.get(var1);
+ var3 = MathHelper.floor_double(var2.posX / 16.0D);
+ var4 = MathHelper.floor_double(var2.posZ / 16.0D);
+ byte var5 = 9;
+
+ for(var6 = -var5; var6 <= var5; ++var6) {
+ for(var7 = -var5; var7 <= var5; ++var7) {
+ this.field_9427_K.add(new ChunkCoordIntPair(var6 + var3, var7 + var4));
+ }
+ }
+ }
+
+ if(this.field_9426_L > 0) {
+ --this.field_9426_L;
+ }
+
+ Iterator var12 = this.field_9427_K.iterator();
+
+ while(var12.hasNext()) {
+ ChunkCoordIntPair var13 = (ChunkCoordIntPair)var12.next();
+ var3 = var13.chunkXPos * 16;
+ var4 = var13.chunkZPos * 16;
+ Chunk var14 = this.getChunkFromChunkCoords(var13.chunkXPos, var13.chunkZPos);
+ int var8;
+ int var9;
+ int var10;
+ if(this.field_9426_L == 0) {
+ this.field_9437_g = this.field_9437_g * 3 + this.field_9436_h;
+ var6 = this.field_9437_g >> 2;
+ var7 = var6 & 15;
+ var8 = var6 >> 8 & 15;
+ var9 = var6 >> 16 & 127;
+ var10 = var14.getBlockID(var7, var9, var8);
+ var7 += var3;
+ var8 += var4;
+ if(var10 == 0 && this.getBlockLightValue(var7, var9, var8) <= this.rand.nextInt(8) && this.getSavedLightValue(EnumSkyBlock.Sky, var7, var9, var8) <= 0) {
+ EntityPlayer var11 = this.getClosestPlayer((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D, 8.0D);
+ if(var11 != null && var11.getDistanceSq((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D) > 4.0D) {
+ this.playSoundEffect((double)var7 + 0.5D, (double)var9 + 0.5D, (double)var8 + 0.5D, "ambient.cave.cave", 0.7F, 0.8F + this.rand.nextFloat() * 0.2F);
+ this.field_9426_L = this.rand.nextInt(12000) + 6000;
+ }
+ }
+ }
+
+ for(var6 = 0; var6 < 80; ++var6) {
+ this.field_9437_g = this.field_9437_g * 3 + this.field_9436_h;
+ var7 = this.field_9437_g >> 2;
+ var8 = var7 & 15;
+ var9 = var7 >> 8 & 15;
+ var10 = var7 >> 16 & 127;
+ byte var15 = var14.blocks[var8 << 11 | var9 << 7 | var10];
+ if(Block.tickOnLoad[var15]) {
+ Block.blocksList[var15].updateTick(this, var8 + var3, var10, var9 + var4, this.rand);
+ }
+ }
+ }
+
+ }
+
+ public boolean TickUpdates(boolean var1) {
+ int var2 = this.scheduledTickTreeSet.size();
+ if(var2 != this.scheduledTickSet.size()) {
+ throw new IllegalStateException("TickNextTick list out of synch");
+ } else {
+ if(var2 > 1000) {
+ var2 = 1000;
+ }
+
+ for(int var3 = 0; var3 < var2; ++var3) {
+ NextTickListEntry var4 = (NextTickListEntry)this.scheduledTickTreeSet.first();
+ if(!var1 && var4.scheduledTime > this.worldTime) {
+ break;
+ }
+
+ this.scheduledTickTreeSet.remove(var4);
+ this.scheduledTickSet.remove(var4);
+ byte var5 = 8;
+ if(this.checkChunksExist(var4.xCoord - var5, var4.yCoord - var5, var4.zCoord - var5, var4.xCoord + var5, var4.yCoord + var5, var4.zCoord + var5)) {
+ int var6 = this.getBlockId(var4.xCoord, var4.yCoord, var4.zCoord);
+ if(var6 == var4.blockID && var6 > 0) {
+ Block.blocksList[var6].updateTick(this, var4.xCoord, var4.yCoord, var4.zCoord, this.rand);
+ }
+ }
+ }
+
+ return this.scheduledTickTreeSet.size() != 0;
+ }
+ }
+
+ public void randomDisplayUpdates(int var1, int var2, int var3) {
+ byte var4 = 16;
+ Random var5 = new Random();
+
+ for(int var6 = 0; var6 < 1000; ++var6) {
+ int var7 = var1 + this.rand.nextInt(var4) - this.rand.nextInt(var4);
+ int var8 = var2 + this.rand.nextInt(var4) - this.rand.nextInt(var4);
+ int var9 = var3 + this.rand.nextInt(var4) - this.rand.nextInt(var4);
+ int var10 = this.getBlockId(var7, var8, var9);
+ if(var10 > 0) {
+ Block.blocksList[var10].randomDisplayTick(this, var7, var8, var9, var5);
+ }
+ }
+
+ }
+
+ public List getEntitiesWithinAABBExcludingEntity(Entity var1, AxisAlignedBB var2) {
+ this.field_1012_M.clear();
+ int var3 = MathHelper.floor_double((var2.minX - 2.0D) / 16.0D);
+ int var4 = MathHelper.floor_double((var2.maxX + 2.0D) / 16.0D);
+ int var5 = MathHelper.floor_double((var2.minZ - 2.0D) / 16.0D);
+ int var6 = MathHelper.floor_double((var2.maxZ + 2.0D) / 16.0D);
+
+ for(int var7 = var3; var7 <= var4; ++var7) {
+ for(int var8 = var5; var8 <= var6; ++var8) {
+ if(this.chunkExists(var7, var8)) {
+ this.getChunkFromChunkCoords(var7, var8).getEntitiesWithinAABBForEntity(var1, var2, this.field_1012_M);
+ }
+ }
+ }
+
+ return this.field_1012_M;
+ }
+
+ public List getEntitiesWithinAABB(Class var1, AxisAlignedBB var2) {
+ int var3 = MathHelper.floor_double((var2.minX - 2.0D) / 16.0D);
+ int var4 = MathHelper.floor_double((var2.maxX + 2.0D) / 16.0D);
+ int var5 = MathHelper.floor_double((var2.minZ - 2.0D) / 16.0D);
+ int var6 = MathHelper.floor_double((var2.maxZ + 2.0D) / 16.0D);
+ ArrayList var7 = new ArrayList();
+
+ for(int var8 = var3; var8 <= var4; ++var8) {
+ for(int var9 = var5; var9 <= var6; ++var9) {
+ if(this.chunkExists(var8, var9)) {
+ this.getChunkFromChunkCoords(var8, var9).getEntitiesOfTypeWithinAAAB(var1, var2, var7);
+ }
+ }
+ }
+
+ return var7;
+ }
+
+ public List func_658_i() {
+ return this.loadedEntityList;
+ }
+
+ public void func_698_b(int var1, int var2, int var3, TileEntity var4) {
+ if(this.blockExists(var1, var2, var3)) {
+ this.getChunkFromBlockCoords(var1, var3).setChunkModified();
+ }
+
+ for(int var5 = 0; var5 < this.worldAccesses.size(); ++var5) {
+ ((IWorldAccess)this.worldAccesses.get(var5)).func_935_a(var1, var2, var3, var4);
+ }
+
+ }
+
+ public int countEntities(Class var1) {
+ int var2 = 0;
+
+ for(int var3 = 0; var3 < this.loadedEntityList.size(); ++var3) {
+ Entity var4 = (Entity)this.loadedEntityList.get(var3);
+ if(var1.isAssignableFrom(var4.getClass())) {
+ ++var2;
+ }
+ }
+
+ return var2;
+ }
+
+ public void func_636_a(List var1) {
+ this.loadedEntityList.addAll(var1);
+
+ for(int var2 = 0; var2 < var1.size(); ++var2) {
+ this.obtainEntitySkin((Entity)var1.get(var2));
+ }
+
+ }
+
+ public void func_632_b(List var1) {
+ this.field_1024_A.addAll(var1);
+ }
+
+ public void func_656_j() {
+ while(this.chunkProvider.func_532_a()) {
+ }
+
+ }
+
+ public boolean canBlockBePlacedAt(int var1, int var2, int var3, int var4, boolean var5) {
+ int var6 = this.getBlockId(var2, var3, var4);
+ Block var7 = Block.blocksList[var6];
+ Block var8 = Block.blocksList[var1];
+ AxisAlignedBB var9 = var8.getCollisionBoundingBoxFromPool(this, var2, var3, var4);
+ if(var5) {
+ var9 = null;
+ }
+
+ return var9 != null && !this.checkIfAABBIsClear(var9) ? false : (var7 != Block.waterStill && var7 != Block.waterMoving && var7 != Block.lavaStill && var7 != Block.lavaMoving && var7 != Block.fire && var7 != Block.snow ? var1 > 0 && var7 == null && var8.canPlaceBlockAt(this, var2, var3, var4) : true);
+ }
+
+ public PathEntity getPathToEntity(Entity var1, Entity var2, float var3) {
+ int var4 = MathHelper.floor_double(var1.posX);
+ int var5 = MathHelper.floor_double(var1.posY);
+ int var6 = MathHelper.floor_double(var1.posZ);
+ int var7 = (int)(var3 + 16.0F);
+ int var8 = var4 - var7;
+ int var9 = var5 - var7;
+ int var10 = var6 - var7;
+ int var11 = var4 + var7;
+ int var12 = var5 + var7;
+ int var13 = var6 + var7;
+ ChunkCache var14 = new ChunkCache(this, var8, var9, var10, var11, var12, var13);
+ return (new Pathfinder(var14)).createEntityPathTo(var1, var2, var3);
+ }
+
+ public PathEntity getEntityPathToXYZ(Entity var1, int var2, int var3, int var4, float var5) {
+ int var6 = MathHelper.floor_double(var1.posX);
+ int var7 = MathHelper.floor_double(var1.posY);
+ int var8 = MathHelper.floor_double(var1.posZ);
+ int var9 = (int)(var5 + 8.0F);
+ int var10 = var6 - var9;
+ int var11 = var7 - var9;
+ int var12 = var8 - var9;
+ int var13 = var6 + var9;
+ int var14 = var7 + var9;
+ int var15 = var8 + var9;
+ ChunkCache var16 = new ChunkCache(this, var10, var11, var12, var13, var14, var15);
+ return (new Pathfinder(var16)).createEntityPathTo(var1, var2, var3, var4, var5);
+ }
+
+ public boolean isBlockProvidingPowerTo(int var1, int var2, int var3, int var4) {
+ int var5 = this.getBlockId(var1, var2, var3);
+ return var5 == 0 ? false : Block.blocksList[var5].isIndirectlyPoweringTo(this, var1, var2, var3, var4);
+ }
+
+ public boolean isBlockGettingPowered(int var1, int var2, int var3) {
+ return this.isBlockProvidingPowerTo(var1, var2 - 1, var3, 0) ? true : (this.isBlockProvidingPowerTo(var1, var2 + 1, var3, 1) ? true : (this.isBlockProvidingPowerTo(var1, var2, var3 - 1, 2) ? true : (this.isBlockProvidingPowerTo(var1, var2, var3 + 1, 3) ? true : (this.isBlockProvidingPowerTo(var1 - 1, var2, var3, 4) ? true : this.isBlockProvidingPowerTo(var1 + 1, var2, var3, 5)))));
+ }
+
+ public boolean isBlockIndirectlyProvidingPowerTo(int var1, int var2, int var3, int var4) {
+ if(this.isBlockOpaqueCube(var1, var2, var3)) {
+ return this.isBlockGettingPowered(var1, var2, var3);
+ } else {
+ int var5 = this.getBlockId(var1, var2, var3);
+ return var5 == 0 ? false : Block.blocksList[var5].isPoweringTo(this, var1, var2, var3, var4);
+ }
+ }
+
+ public boolean isBlockIndirectlyGettingPowered(int var1, int var2, int var3) {
+ return this.isBlockIndirectlyProvidingPowerTo(var1, var2 - 1, var3, 0) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2 + 1, var3, 1) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2, var3 - 1, 2) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1, var2, var3 + 1, 3) ? true : (this.isBlockIndirectlyProvidingPowerTo(var1 - 1, var2, var3, 4) ? true : this.isBlockIndirectlyProvidingPowerTo(var1 + 1, var2, var3, 5)))));
+ }
+
+ public EntityPlayer getClosestPlayerToEntity(Entity var1, double var2) {
+ return this.getClosestPlayer(var1.posX, var1.posY, var1.posZ, var2);
+ }
+
+ public EntityPlayer getClosestPlayer(double var1, double var3, double var5, double var7) {
+ double var9 = -1.0D;
+ EntityPlayer var11 = null;
+
+ for(int var12 = 0; var12 < this.playerEntities.size(); ++var12) {
+ EntityPlayer var13 = (EntityPlayer)this.playerEntities.get(var12);
+ double var14 = var13.getDistanceSq(var1, var3, var5);
+ if((var7 < 0.0D || var14 < var7 * var7) && (var9 == -1.0D || var14 < var9)) {
+ var9 = var14;
+ var11 = var13;
+ }
+ }
+
+ return var11;
+ }
+
+ public void func_693_a(int var1, int var2, int var3, int var4, int var5, int var6, byte[] var7) {
+ int var8 = var1 >> 4;
+ int var9 = var3 >> 4;
+ int var10 = var1 + var4 - 1 >> 4;
+ int var11 = var3 + var6 - 1 >> 4;
+ int var12 = 0;
+ int var13 = var2;
+ int var14 = var2 + var5;
+ if(var2 < 0) {
+ var13 = 0;
+ }
+
+ if(var14 > 128) {
+ var14 = 128;
+ }
+
+ for(int var15 = var8; var15 <= var10; ++var15) {
+ int var16 = var1 - var15 * 16;
+ int var17 = var1 + var4 - var15 * 16;
+ if(var16 < 0) {
+ var16 = 0;
+ }
+
+ if(var17 > 16) {
+ var17 = 16;
+ }
+
+ for(int var18 = var9; var18 <= var11; ++var18) {
+ int var19 = var3 - var18 * 16;
+ int var20 = var3 + var6 - var18 * 16;
+ if(var19 < 0) {
+ var19 = 0;
+ }
+
+ if(var20 > 16) {
+ var20 = 16;
+ }
+
+ var12 = this.getChunkFromChunkCoords(var15, var18).func_1004_a(var7, var16, var13, var19, var17, var14, var20, var12);
+ this.func_701_b(var15 * 16 + var16, var13, var18 * 16 + var19, var15 * 16 + var17, var14, var18 * 16 + var20);
+ }
+ }
+
+ }
+
+ public void sendQuittingDisconnectingPacket() {
+ }
+
+ public void func_663_l() {
+ try {
+ File var1 = new File(this.field_9432_t, "session.lock");
+ DataInputStream var2 = new DataInputStream(new FileInputStream(var1));
+
+ try {
+ if(var2.readLong() != this.field_1054_E) {
+ throw new MinecraftException("The save is being accessed from another location, aborting");
+ }
+ } finally {
+ var2.close();
+ }
+
+ } catch (IOException var7) {
+ throw new MinecraftException("Failed to check session lock, aborting");
+ }
+ }
+
+ public void setWorldTime(long var1) {
+ this.worldTime = var1;
+ }
+
+ public void func_705_f(Entity var1) {
+ int var2 = MathHelper.floor_double(var1.posX / 16.0D);
+ int var3 = MathHelper.floor_double(var1.posZ / 16.0D);
+ byte var4 = 2;
+
+ for(int var5 = var2 - var4; var5 <= var2 + var4; ++var5) {
+ for(int var6 = var3 - var4; var6 <= var3 + var4; ++var6) {
+ this.getChunkFromChunkCoords(var5, var6);
+ }
+ }
+
+ if(!this.loadedEntityList.contains(var1)) {
+ this.loadedEntityList.add(var1);
+ }
+
+ }
+
+ public boolean func_6466_a(EntityPlayer var1, int var2, int var3, int var4) {
+ return true;
+ }
+
+ public void func_9425_a(Entity var1, byte var2) {
+ }
+
+ public void func_9424_o() {
+ this.loadedEntityList.removeAll(this.field_1024_A);
+
+ int var1;
+ Entity var2;
+ int var3;
+ int var4;
+ for(var1 = 0; var1 < this.field_1024_A.size(); ++var1) {
+ var2 = (Entity)this.field_1024_A.get(var1);
+ var3 = var2.field_657_ba;
+ var4 = var2.field_654_bc;
+ if(var2.field_621_aZ && this.chunkExists(var3, var4)) {
+ this.getChunkFromChunkCoords(var3, var4).func_1015_b(var2);
+ }
+ }
+
+ for(var1 = 0; var1 < this.field_1024_A.size(); ++var1) {
+ this.releaseEntitySkin((Entity)this.field_1024_A.get(var1));
+ }
+
+ this.field_1024_A.clear();
+
+ for(var1 = 0; var1 < this.loadedEntityList.size(); ++var1) {
+ var2 = (Entity)this.loadedEntityList.get(var1);
+ if(var2.ridingEntity != null) {
+ if(!var2.ridingEntity.isDead && var2.ridingEntity.riddenByEntity == var2) {
+ continue;
+ }
+
+ var2.ridingEntity.riddenByEntity = null;
+ var2.ridingEntity = null;
+ }
+
+ if(var2.isDead) {
+ var3 = var2.field_657_ba;
+ var4 = var2.field_654_bc;
+ if(var2.field_621_aZ && this.chunkExists(var3, var4)) {
+ this.getChunkFromChunkCoords(var3, var4).func_1015_b(var2);
+ }
+
+ this.loadedEntityList.remove(var1--);
+ this.releaseEntitySkin(var2);
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldChunkManager.java b/src/main/java/net/minecraft/src/WorldChunkManager.java
new file mode 100644
index 0000000..4132420
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldChunkManager.java
@@ -0,0 +1,117 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldChunkManager {
+ private NoiseGeneratorOctaves2 field_4194_e;
+ private NoiseGeneratorOctaves2 field_4193_f;
+ private NoiseGeneratorOctaves2 field_4192_g;
+ public double[] temperature;
+ public double[] humidity;
+ public double[] field_4196_c;
+ public MobSpawnerBase[] field_4195_d;
+
+ protected WorldChunkManager() {
+ }
+
+ public WorldChunkManager(World var1) {
+ this.field_4194_e = new NoiseGeneratorOctaves2(new Random(var1.randomSeed * 9871L), 4);
+ this.field_4193_f = new NoiseGeneratorOctaves2(new Random(var1.randomSeed * 39811L), 4);
+ this.field_4192_g = new NoiseGeneratorOctaves2(new Random(var1.randomSeed * 543321L), 2);
+ }
+
+ public MobSpawnerBase func_4074_a(ChunkCoordIntPair var1) {
+ return this.func_4073_a(var1.chunkXPos, var1.chunkZPos);
+ }
+
+ public MobSpawnerBase func_4073_a(int var1, int var2) {
+ return this.func_4069_a(var1, var2, 1, 1)[0];
+ }
+
+ public double func_4072_b(int var1, int var2) {
+ this.temperature = this.field_4194_e.func_4112_a(this.temperature, (double)var1, (double)var2, 1, 1, (double)0.025F, (double)0.025F, 0.5D);
+ return this.temperature[0];
+ }
+
+ public MobSpawnerBase[] func_4069_a(int var1, int var2, int var3, int var4) {
+ this.field_4195_d = this.loadBlockGeneratorData(this.field_4195_d, var1, var2, var3, var4);
+ return this.field_4195_d;
+ }
+
+ public double[] getTemperatures(double[] var1, int var2, int var3, int var4, int var5) {
+ if(var1 == null || var1.length < var4 * var5) {
+ var1 = new double[var4 * var5];
+ }
+
+ var1 = this.field_4194_e.func_4112_a(var1, (double)var2, (double)var3, var4, var4, (double)0.025F, (double)0.025F, 0.25D);
+ this.field_4196_c = this.field_4192_g.func_4112_a(this.field_4196_c, (double)var2, (double)var3, var4, var4, 0.25D, 0.25D, 0.5882352941176471D);
+ int var6 = 0;
+
+ for(int var7 = 0; var7 < var4; ++var7) {
+ for(int var8 = 0; var8 < var5; ++var8) {
+ double var9 = this.field_4196_c[var6] * 1.1D + 0.5D;
+ double var11 = 0.01D;
+ double var13 = 1.0D - var11;
+ double var15 = (var1[var6] * 0.15D + 0.7D) * var13 + var9 * var11;
+ var15 = 1.0D - (1.0D - var15) * (1.0D - var15);
+ if(var15 < 0.0D) {
+ var15 = 0.0D;
+ }
+
+ if(var15 > 1.0D) {
+ var15 = 1.0D;
+ }
+
+ var1[var6] = var15;
+ ++var6;
+ }
+ }
+
+ return var1;
+ }
+
+ public MobSpawnerBase[] loadBlockGeneratorData(MobSpawnerBase[] var1, int var2, int var3, int var4, int var5) {
+ if(var1 == null || var1.length < var4 * var5) {
+ var1 = new MobSpawnerBase[var4 * var5];
+ }
+
+ this.temperature = this.field_4194_e.func_4112_a(this.temperature, (double)var2, (double)var3, var4, var4, (double)0.025F, (double)0.025F, 0.25D);
+ this.humidity = this.field_4193_f.func_4112_a(this.humidity, (double)var2, (double)var3, var4, var4, (double)0.05F, (double)0.05F, 1.0D / 3.0D);
+ this.field_4196_c = this.field_4192_g.func_4112_a(this.field_4196_c, (double)var2, (double)var3, var4, var4, 0.25D, 0.25D, 0.5882352941176471D);
+ int var6 = 0;
+
+ for(int var7 = 0; var7 < var4; ++var7) {
+ for(int var8 = 0; var8 < var5; ++var8) {
+ double var9 = this.field_4196_c[var6] * 1.1D + 0.5D;
+ double var11 = 0.01D;
+ double var13 = 1.0D - var11;
+ double var15 = (this.temperature[var6] * 0.15D + 0.7D) * var13 + var9 * var11;
+ var11 = 0.002D;
+ var13 = 1.0D - var11;
+ double var17 = (this.humidity[var6] * 0.15D + 0.5D) * var13 + var9 * var11;
+ var15 = 1.0D - (1.0D - var15) * (1.0D - var15);
+ if(var15 < 0.0D) {
+ var15 = 0.0D;
+ }
+
+ if(var17 < 0.0D) {
+ var17 = 0.0D;
+ }
+
+ if(var15 > 1.0D) {
+ var15 = 1.0D;
+ }
+
+ if(var17 > 1.0D) {
+ var17 = 1.0D;
+ }
+
+ this.temperature[var6] = var15;
+ this.humidity[var6] = var17;
+ var1[var6++] = MobSpawnerBase.getBiomeFromLookup(var15, var17);
+ }
+ }
+
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldChunkManagerHell.java b/src/main/java/net/minecraft/src/WorldChunkManagerHell.java
new file mode 100644
index 0000000..c93f1b4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldChunkManagerHell.java
@@ -0,0 +1,54 @@
+package net.minecraft.src;
+
+import java.util.Arrays;
+
+public class WorldChunkManagerHell extends WorldChunkManager {
+ private MobSpawnerBase field_4201_e;
+ private double field_4200_f;
+ private double field_4199_g;
+
+ public WorldChunkManagerHell(MobSpawnerBase var1, double var2, double var4) {
+ this.field_4201_e = var1;
+ this.field_4200_f = var2;
+ this.field_4199_g = var4;
+ }
+
+ public MobSpawnerBase func_4074_a(ChunkCoordIntPair var1) {
+ return this.field_4201_e;
+ }
+
+ public MobSpawnerBase func_4073_a(int var1, int var2) {
+ return this.field_4201_e;
+ }
+
+ public double func_4072_b(int var1, int var2) {
+ return this.field_4200_f;
+ }
+
+ public MobSpawnerBase[] func_4069_a(int var1, int var2, int var3, int var4) {
+ this.field_4195_d = this.loadBlockGeneratorData(this.field_4195_d, var1, var2, var3, var4);
+ return this.field_4195_d;
+ }
+
+ public double[] getTemperatures(double[] var1, int var2, int var3, int var4, int var5) {
+ if(var1 == null || var1.length < var4 * var5) {
+ var1 = new double[var4 * var5];
+ }
+
+ Arrays.fill(var1, 0, var4 * var5, this.field_4200_f);
+ return var1;
+ }
+
+ public MobSpawnerBase[] loadBlockGeneratorData(MobSpawnerBase[] var1, int var2, int var3, int var4, int var5) {
+ if(var1 == null || var1.length < var4 * var5) {
+ var1 = new MobSpawnerBase[var4 * var5];
+ this.temperature = new double[var4 * var5];
+ this.humidity = new double[var4 * var5];
+ }
+
+ Arrays.fill(var1, 0, var4 * var5, this.field_4201_e);
+ Arrays.fill(this.humidity, 0, var4 * var5, this.field_4199_g);
+ Arrays.fill(this.temperature, 0, var4 * var5, this.field_4200_f);
+ return var1;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenBigTree.java b/src/main/java/net/minecraft/src/WorldGenBigTree.java
new file mode 100644
index 0000000..84c15be
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenBigTree.java
@@ -0,0 +1,348 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenBigTree extends WorldGenerator {
+ static final byte[] field_882_a = new byte[]{(byte)2, (byte)0, (byte)0, (byte)1, (byte)2, (byte)1};
+ Random field_881_b = new Random();
+ World worldObj;
+ int[] field_879_d = new int[]{0, 0, 0};
+ int field_878_e = 0;
+ int field_877_f;
+ double field_876_g = 0.618D;
+ double field_875_h = 1.0D;
+ double field_874_i = 0.381D;
+ double field_873_j = 1.0D;
+ double field_872_k = 1.0D;
+ int field_871_l = 1;
+ int field_870_m = 12;
+ int field_869_n = 4;
+ int[][] field_868_o;
+
+ void func_521_a() {
+ this.field_877_f = (int)((double)this.field_878_e * this.field_876_g);
+ if(this.field_877_f >= this.field_878_e) {
+ this.field_877_f = this.field_878_e - 1;
+ }
+
+ int var1 = (int)(1.382D + Math.pow(this.field_872_k * (double)this.field_878_e / 13.0D, 2.0D));
+ if(var1 < 1) {
+ var1 = 1;
+ }
+
+ int[][] var2 = new int[var1 * this.field_878_e][4];
+ int var3 = this.field_879_d[1] + this.field_878_e - this.field_869_n;
+ int var4 = 1;
+ int var5 = this.field_879_d[1] + this.field_877_f;
+ int var6 = var3 - this.field_879_d[1];
+ var2[0][0] = this.field_879_d[0];
+ var2[0][1] = var3;
+ var2[0][2] = this.field_879_d[2];
+ var2[0][3] = var5;
+ --var3;
+
+ while(true) {
+ while(var6 >= 0) {
+ int var7 = 0;
+ float var8 = this.func_528_a(var6);
+ if(var8 < 0.0F) {
+ --var3;
+ --var6;
+ } else {
+ for(double var9 = 0.5D; var7 < var1; ++var7) {
+ double var11 = this.field_873_j * (double)var8 * ((double)this.field_881_b.nextFloat() + 0.328D);
+ double var13 = (double)this.field_881_b.nextFloat() * 2.0D * 3.14159D;
+ int var15 = (int)(var11 * Math.sin(var13) + (double)this.field_879_d[0] + var9);
+ int var16 = (int)(var11 * Math.cos(var13) + (double)this.field_879_d[2] + var9);
+ int[] var17 = new int[]{var15, var3, var16};
+ int[] var18 = new int[]{var15, var3 + this.field_869_n, var16};
+ if(this.func_524_a(var17, var18) == -1) {
+ int[] var19 = new int[]{this.field_879_d[0], this.field_879_d[1], this.field_879_d[2]};
+ double var20 = Math.sqrt(Math.pow((double)Math.abs(this.field_879_d[0] - var17[0]), 2.0D) + Math.pow((double)Math.abs(this.field_879_d[2] - var17[2]), 2.0D));
+ double var22 = var20 * this.field_874_i;
+ if((double)var17[1] - var22 > (double)var5) {
+ var19[1] = var5;
+ } else {
+ var19[1] = (int)((double)var17[1] - var22);
+ }
+
+ if(this.func_524_a(var19, var17) == -1) {
+ var2[var4][0] = var15;
+ var2[var4][1] = var3;
+ var2[var4][2] = var16;
+ var2[var4][3] = var19[1];
+ ++var4;
+ }
+ }
+ }
+
+ --var3;
+ --var6;
+ }
+ }
+
+ this.field_868_o = new int[var4][4];
+ System.arraycopy(var2, 0, this.field_868_o, 0, var4);
+ return;
+ }
+ }
+
+ void func_523_a(int var1, int var2, int var3, float var4, byte var5, int var6) {
+ int var7 = (int)((double)var4 + 0.618D);
+ byte var8 = field_882_a[var5];
+ byte var9 = field_882_a[var5 + 3];
+ int[] var10 = new int[]{var1, var2, var3};
+ int[] var11 = new int[]{0, 0, 0};
+ int var12 = -var7;
+ int var13 = -var7;
+
+ label32:
+ for(var11[var5] = var10[var5]; var12 <= var7; ++var12) {
+ var11[var8] = var10[var8] + var12;
+ var13 = -var7;
+
+ while(true) {
+ while(true) {
+ if(var13 > var7) {
+ continue label32;
+ }
+
+ double var15 = Math.sqrt(Math.pow((double)Math.abs(var12) + 0.5D, 2.0D) + Math.pow((double)Math.abs(var13) + 0.5D, 2.0D));
+ if(var15 > (double)var4) {
+ ++var13;
+ } else {
+ var11[var9] = var10[var9] + var13;
+ int var14 = this.worldObj.getBlockId(var11[0], var11[1], var11[2]);
+ if(var14 != 0 && var14 != 18) {
+ ++var13;
+ } else {
+ this.worldObj.setBlock(var11[0], var11[1], var11[2], var6);
+ ++var13;
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ float func_528_a(int var1) {
+ if((double)var1 < (double)((float)this.field_878_e) * 0.3D) {
+ return -1.618F;
+ } else {
+ float var2 = (float)this.field_878_e / 2.0F;
+ float var3 = (float)this.field_878_e / 2.0F - (float)var1;
+ float var4;
+ if(var3 == 0.0F) {
+ var4 = var2;
+ } else if(Math.abs(var3) >= var2) {
+ var4 = 0.0F;
+ } else {
+ var4 = (float)Math.sqrt(Math.pow((double)Math.abs(var2), 2.0D) - Math.pow((double)Math.abs(var3), 2.0D));
+ }
+
+ var4 *= 0.5F;
+ return var4;
+ }
+ }
+
+ float func_526_b(int var1) {
+ return var1 >= 0 && var1 < this.field_869_n ? (var1 != 0 && var1 != this.field_869_n - 1 ? 3.0F : 2.0F) : -1.0F;
+ }
+
+ void func_520_a(int var1, int var2, int var3) {
+ int var4 = var2;
+
+ for(int var5 = var2 + this.field_869_n; var4 < var5; ++var4) {
+ float var6 = this.func_526_b(var4 - var2);
+ this.func_523_a(var1, var4, var3, var6, (byte)1, 18);
+ }
+
+ }
+
+ void func_522_a(int[] var1, int[] var2, int var3) {
+ int[] var4 = new int[]{0, 0, 0};
+ byte var5 = 0;
+
+ byte var6;
+ for(var6 = 0; var5 < 3; ++var5) {
+ var4[var5] = var2[var5] - var1[var5];
+ if(Math.abs(var4[var5]) > Math.abs(var4[var6])) {
+ var6 = var5;
+ }
+ }
+
+ if(var4[var6] != 0) {
+ byte var7 = field_882_a[var6];
+ byte var8 = field_882_a[var6 + 3];
+ byte var9;
+ if(var4[var6] > 0) {
+ var9 = 1;
+ } else {
+ var9 = -1;
+ }
+
+ double var10 = (double)var4[var7] / (double)var4[var6];
+ double var12 = (double)var4[var8] / (double)var4[var6];
+ int[] var14 = new int[]{0, 0, 0};
+ int var15 = 0;
+
+ for(int var16 = var4[var6] + var9; var15 != var16; var15 += var9) {
+ var14[var6] = MathHelper.floor_double((double)(var1[var6] + var15) + 0.5D);
+ var14[var7] = MathHelper.floor_double((double)var1[var7] + (double)var15 * var10 + 0.5D);
+ var14[var8] = MathHelper.floor_double((double)var1[var8] + (double)var15 * var12 + 0.5D);
+ this.worldObj.setBlock(var14[0], var14[1], var14[2], var3);
+ }
+
+ }
+ }
+
+ void func_518_b() {
+ int var1 = 0;
+
+ for(int var2 = this.field_868_o.length; var1 < var2; ++var1) {
+ int var3 = this.field_868_o[var1][0];
+ int var4 = this.field_868_o[var1][1];
+ int var5 = this.field_868_o[var1][2];
+ this.func_520_a(var3, var4, var5);
+ }
+
+ }
+
+ boolean func_527_c(int var1) {
+ return (double)var1 >= (double)this.field_878_e * 0.2D;
+ }
+
+ void func_529_c() {
+ int var1 = this.field_879_d[0];
+ int var2 = this.field_879_d[1];
+ int var3 = this.field_879_d[1] + this.field_877_f;
+ int var4 = this.field_879_d[2];
+ int[] var5 = new int[]{var1, var2, var4};
+ int[] var6 = new int[]{var1, var3, var4};
+ this.func_522_a(var5, var6, 17);
+ if(this.field_871_l == 2) {
+ ++var5[0];
+ ++var6[0];
+ this.func_522_a(var5, var6, 17);
+ ++var5[2];
+ ++var6[2];
+ this.func_522_a(var5, var6, 17);
+ var5[0] += -1;
+ var6[0] += -1;
+ this.func_522_a(var5, var6, 17);
+ }
+
+ }
+
+ void func_525_d() {
+ int var1 = 0;
+ int var2 = this.field_868_o.length;
+
+ for(int[] var3 = new int[]{this.field_879_d[0], this.field_879_d[1], this.field_879_d[2]}; var1 < var2; ++var1) {
+ int[] var4 = this.field_868_o[var1];
+ int[] var5 = new int[]{var4[0], var4[1], var4[2]};
+ var3[1] = var4[3];
+ int var6 = var3[1] - this.field_879_d[1];
+ if(this.func_527_c(var6)) {
+ this.func_522_a(var3, var5, 17);
+ }
+ }
+
+ }
+
+ int func_524_a(int[] var1, int[] var2) {
+ int[] var3 = new int[]{0, 0, 0};
+ byte var4 = 0;
+
+ byte var5;
+ for(var5 = 0; var4 < 3; ++var4) {
+ var3[var4] = var2[var4] - var1[var4];
+ if(Math.abs(var3[var4]) > Math.abs(var3[var5])) {
+ var5 = var4;
+ }
+ }
+
+ if(var3[var5] == 0) {
+ return -1;
+ } else {
+ byte var6 = field_882_a[var5];
+ byte var7 = field_882_a[var5 + 3];
+ byte var8;
+ if(var3[var5] > 0) {
+ var8 = 1;
+ } else {
+ var8 = -1;
+ }
+
+ double var9 = (double)var3[var6] / (double)var3[var5];
+ double var11 = (double)var3[var7] / (double)var3[var5];
+ int[] var13 = new int[]{0, 0, 0};
+ int var14 = 0;
+
+ int var15;
+ for(var15 = var3[var5] + var8; var14 != var15; var14 += var8) {
+ var13[var5] = var1[var5] + var14;
+ var13[var6] = (int)((double)var1[var6] + (double)var14 * var9);
+ var13[var7] = (int)((double)var1[var7] + (double)var14 * var11);
+ int var16 = this.worldObj.getBlockId(var13[0], var13[1], var13[2]);
+ if(var16 != 0 && var16 != 18) {
+ break;
+ }
+ }
+
+ return var14 == var15 ? -1 : Math.abs(var14);
+ }
+ }
+
+ boolean func_519_e() {
+ int[] var1 = new int[]{this.field_879_d[0], this.field_879_d[1], this.field_879_d[2]};
+ int[] var2 = new int[]{this.field_879_d[0], this.field_879_d[1] + this.field_878_e - 1, this.field_879_d[2]};
+ int var3 = this.worldObj.getBlockId(this.field_879_d[0], this.field_879_d[1] - 1, this.field_879_d[2]);
+ if(var3 != 2 && var3 != 3) {
+ return false;
+ } else {
+ int var4 = this.func_524_a(var1, var2);
+ if(var4 == -1) {
+ return true;
+ } else if(var4 < 6) {
+ return false;
+ } else {
+ this.field_878_e = var4;
+ return true;
+ }
+ }
+ }
+
+ public void func_517_a(double var1, double var3, double var5) {
+ this.field_870_m = (int)(var1 * 12.0D);
+ if(var1 > 0.5D) {
+ this.field_869_n = 5;
+ }
+
+ this.field_873_j = var3;
+ this.field_872_k = var5;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ this.worldObj = var1;
+ long var6 = var2.nextLong();
+ this.field_881_b.setSeed(var6);
+ this.field_879_d[0] = var3;
+ this.field_879_d[1] = var4;
+ this.field_879_d[2] = var5;
+ if(this.field_878_e == 0) {
+ this.field_878_e = 5 + this.field_881_b.nextInt(this.field_870_m);
+ }
+
+ if(!this.func_519_e()) {
+ return false;
+ } else {
+ this.func_521_a();
+ this.func_518_b();
+ this.func_529_c();
+ this.func_525_d();
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenCactus.java b/src/main/java/net/minecraft/src/WorldGenCactus.java
new file mode 100644
index 0000000..a5eb25d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenCactus.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenCactus extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 10; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.getBlockId(var7, var8, var9) == 0) {
+ int var10 = 1 + var2.nextInt(var2.nextInt(3) + 1);
+
+ for(int var11 = 0; var11 < var10; ++var11) {
+ if(Block.cactus.canBlockStay(var1, var7, var8 + var11, var9)) {
+ var1.setBlock(var7, var8 + var11, var9, Block.cactus.blockID);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenClay.java b/src/main/java/net/minecraft/src/WorldGenClay.java
new file mode 100644
index 0000000..241f0e1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenClay.java
@@ -0,0 +1,53 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenClay extends WorldGenerator {
+ private int clayBlockId = Block.blockClay.blockID;
+ private int numberOfBlocks;
+
+ public WorldGenClay(int var1) {
+ this.numberOfBlocks = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(var1.getBlockMaterial(var3, var4, var5) != Material.water) {
+ return false;
+ } else {
+ float var6 = var2.nextFloat() * (float)Math.PI;
+ double var7 = (double)((float)(var3 + 8) + MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var9 = (double)((float)(var3 + 8) - MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var11 = (double)((float)(var5 + 8) + MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var13 = (double)((float)(var5 + 8) - MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var15 = (double)(var4 + var2.nextInt(3) + 2);
+ double var17 = (double)(var4 + var2.nextInt(3) + 2);
+
+ for(int var19 = 0; var19 <= this.numberOfBlocks; ++var19) {
+ double var20 = var7 + (var9 - var7) * (double)var19 / (double)this.numberOfBlocks;
+ double var22 = var15 + (var17 - var15) * (double)var19 / (double)this.numberOfBlocks;
+ double var24 = var11 + (var13 - var11) * (double)var19 / (double)this.numberOfBlocks;
+ double var26 = var2.nextDouble() * (double)this.numberOfBlocks / 16.0D;
+ double var28 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
+ double var30 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
+
+ for(int var32 = (int)(var20 - var28 / 2.0D); var32 <= (int)(var20 + var28 / 2.0D); ++var32) {
+ for(int var33 = (int)(var22 - var30 / 2.0D); var33 <= (int)(var22 + var30 / 2.0D); ++var33) {
+ for(int var34 = (int)(var24 - var28 / 2.0D); var34 <= (int)(var24 + var28 / 2.0D); ++var34) {
+ double var35 = ((double)var32 + 0.5D - var20) / (var28 / 2.0D);
+ double var37 = ((double)var33 + 0.5D - var22) / (var30 / 2.0D);
+ double var39 = ((double)var34 + 0.5D - var24) / (var28 / 2.0D);
+ if(var35 * var35 + var37 * var37 + var39 * var39 < 1.0D) {
+ int var41 = var1.getBlockId(var32, var33, var34);
+ if(var41 == Block.sand.blockID) {
+ var1.setBlock(var32, var33, var34, this.clayBlockId);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenDungeons.java b/src/main/java/net/minecraft/src/WorldGenDungeons.java
new file mode 100644
index 0000000..f458f50
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenDungeons.java
@@ -0,0 +1,116 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenDungeons extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ byte var6 = 3;
+ int var7 = var2.nextInt(2) + 2;
+ int var8 = var2.nextInt(2) + 2;
+ int var9 = 0;
+
+ int var10;
+ int var11;
+ int var12;
+ for(var10 = var3 - var7 - 1; var10 <= var3 + var7 + 1; ++var10) {
+ for(var11 = var4 - 1; var11 <= var4 + var6 + 1; ++var11) {
+ for(var12 = var5 - var8 - 1; var12 <= var5 + var8 + 1; ++var12) {
+ Material var13 = var1.getBlockMaterial(var10, var11, var12);
+ if(var11 == var4 - 1 && !var13.func_878_a()) {
+ return false;
+ }
+
+ if(var11 == var4 + var6 + 1 && !var13.func_878_a()) {
+ return false;
+ }
+
+ if((var10 == var3 - var7 - 1 || var10 == var3 + var7 + 1 || var12 == var5 - var8 - 1 || var12 == var5 + var8 + 1) && var11 == var4 && var1.getBlockId(var10, var11, var12) == 0 && var1.getBlockId(var10, var11 + 1, var12) == 0) {
+ ++var9;
+ }
+ }
+ }
+ }
+
+ if(var9 >= 1 && var9 <= 5) {
+ for(var10 = var3 - var7 - 1; var10 <= var3 + var7 + 1; ++var10) {
+ for(var11 = var4 + var6; var11 >= var4 - 1; --var11) {
+ for(var12 = var5 - var8 - 1; var12 <= var5 + var8 + 1; ++var12) {
+ if(var10 != var3 - var7 - 1 && var11 != var4 - 1 && var12 != var5 - var8 - 1 && var10 != var3 + var7 + 1 && var11 != var4 + var6 + 1 && var12 != var5 + var8 + 1) {
+ var1.setBlockWithNotify(var10, var11, var12, 0);
+ } else if(var11 >= 0 && !var1.getBlockMaterial(var10, var11 - 1, var12).func_878_a()) {
+ var1.setBlockWithNotify(var10, var11, var12, 0);
+ } else if(var1.getBlockMaterial(var10, var11, var12).func_878_a()) {
+ if(var11 == var4 - 1 && var2.nextInt(4) != 0) {
+ var1.setBlockWithNotify(var10, var11, var12, Block.cobblestoneMossy.blockID);
+ } else {
+ var1.setBlockWithNotify(var10, var11, var12, Block.cobblestone.blockID);
+ }
+ }
+ }
+ }
+ }
+
+ label110:
+ for(var10 = 0; var10 < 2; ++var10) {
+ for(var11 = 0; var11 < 3; ++var11) {
+ var12 = var3 + var2.nextInt(var7 * 2 + 1) - var7;
+ int var14 = var5 + var2.nextInt(var8 * 2 + 1) - var8;
+ if(var1.getBlockId(var12, var4, var14) == 0) {
+ int var15 = 0;
+ if(var1.getBlockMaterial(var12 - 1, var4, var14).func_878_a()) {
+ ++var15;
+ }
+
+ if(var1.getBlockMaterial(var12 + 1, var4, var14).func_878_a()) {
+ ++var15;
+ }
+
+ if(var1.getBlockMaterial(var12, var4, var14 - 1).func_878_a()) {
+ ++var15;
+ }
+
+ if(var1.getBlockMaterial(var12, var4, var14 + 1).func_878_a()) {
+ ++var15;
+ }
+
+ if(var15 == 1) {
+ var1.setBlockWithNotify(var12, var4, var14, Block.crate.blockID);
+ TileEntityChest var16 = (TileEntityChest)var1.getBlockTileEntity(var12, var4, var14);
+ int var17 = 0;
+
+ while(true) {
+ if(var17 >= 8) {
+ continue label110;
+ }
+
+ ItemStack var18 = this.pickCheckLootItem(var2);
+ if(var18 != null) {
+ var16.setInventorySlotContents(var2.nextInt(var16.getSizeInventory()), var18);
+ }
+
+ ++var17;
+ }
+ }
+ }
+ }
+ }
+
+ var1.setBlockWithNotify(var3, var4, var5, Block.mobSpawner.blockID);
+ TileEntityMobSpawner var19 = (TileEntityMobSpawner)var1.getBlockTileEntity(var3, var4, var5);
+ var19.entityID = this.pickMobSpawner(var2);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private ItemStack pickCheckLootItem(Random var1) {
+ int var2 = var1.nextInt(11);
+ return var2 == 0 ? new ItemStack(Item.saddle) : (var2 == 1 ? new ItemStack(Item.ingotIron, var1.nextInt(4) + 1) : (var2 == 2 ? new ItemStack(Item.bread) : (var2 == 3 ? new ItemStack(Item.wheat, var1.nextInt(4) + 1) : (var2 == 4 ? new ItemStack(Item.gunpowder, var1.nextInt(4) + 1) : (var2 == 5 ? new ItemStack(Item.silk, var1.nextInt(4) + 1) : (var2 == 6 ? new ItemStack(Item.bucketEmpty) : (var2 == 7 && var1.nextInt(100) == 0 ? new ItemStack(Item.appleGold) : (var2 == 8 && var1.nextInt(2) == 0 ? new ItemStack(Item.redstone, var1.nextInt(4) + 1) : (var2 == 9 && var1.nextInt(10) == 0 ? new ItemStack(Item.itemsList[Item.record13.shiftedIndex + var1.nextInt(2)]) : null)))))))));
+ }
+
+ private String pickMobSpawner(Random var1) {
+ int var2 = var1.nextInt(4);
+ return var2 == 0 ? "Skeleton" : (var2 == 1 ? "Zombie" : (var2 == 2 ? "Zombie" : (var2 == 3 ? "Spider" : "")));
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenFire.java b/src/main/java/net/minecraft/src/WorldGenFire.java
new file mode 100644
index 0000000..be41986
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenFire.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenFire extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 64; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.getBlockId(var7, var8, var9) == 0 && var1.getBlockId(var7, var8 - 1, var9) == Block.bloodStone.blockID) {
+ var1.setBlockWithNotify(var7, var8, var9, Block.fire.blockID);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenFlowers.java b/src/main/java/net/minecraft/src/WorldGenFlowers.java
new file mode 100644
index 0000000..f01a0f1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenFlowers.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenFlowers extends WorldGenerator {
+ private int plantBlockId;
+
+ public WorldGenFlowers(int var1) {
+ this.plantBlockId = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 64; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.getBlockId(var7, var8, var9) == 0 && ((BlockFlower)Block.blocksList[this.plantBlockId]).canBlockStay(var1, var7, var8, var9)) {
+ var1.setBlock(var7, var8, var9, this.plantBlockId);
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenHellLava.java b/src/main/java/net/minecraft/src/WorldGenHellLava.java
new file mode 100644
index 0000000..4ce5cd1
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenHellLava.java
@@ -0,0 +1,70 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenHellLava extends WorldGenerator {
+ private int field_4158_a;
+
+ public WorldGenHellLava(int var1) {
+ this.field_4158_a = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) {
+ return false;
+ } else if(var1.getBlockId(var3, var4, var5) != 0 && var1.getBlockId(var3, var4, var5) != Block.bloodStone.blockID) {
+ return false;
+ } else {
+ int var6 = 0;
+ if(var1.getBlockId(var3 - 1, var4, var5) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3 + 1, var4, var5) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 - 1) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 + 1) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4 - 1, var5) == Block.bloodStone.blockID) {
+ ++var6;
+ }
+
+ int var7 = 0;
+ if(var1.getBlockId(var3 - 1, var4, var5) == 0) {
+ ++var7;
+ }
+
+ if(var1.getBlockId(var3 + 1, var4, var5) == 0) {
+ ++var7;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 - 1) == 0) {
+ ++var7;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 + 1) == 0) {
+ ++var7;
+ }
+
+ if(var1.getBlockId(var3, var4 - 1, var5) == 0) {
+ ++var7;
+ }
+
+ if(var6 == 4 && var7 == 1) {
+ var1.setBlockWithNotify(var3, var4, var5, this.field_4158_a);
+ var1.field_4214_a = true;
+ Block.blocksList[this.field_4158_a].updateTick(var1, var3, var4, var5, var2);
+ var1.field_4214_a = false;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenLakes.java b/src/main/java/net/minecraft/src/WorldGenLakes.java
new file mode 100644
index 0000000..2f55561
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenLakes.java
@@ -0,0 +1,88 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenLakes extends WorldGenerator {
+ private int field_15235_a;
+
+ public WorldGenLakes(int var1) {
+ this.field_15235_a = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ var3 -= 8;
+
+ for(var5 -= 8; var4 > 0 && var1.getBlockId(var3, var4, var5) == 0; --var4) {
+ }
+
+ var4 -= 4;
+ boolean[] var6 = new boolean[2048];
+ int var7 = var2.nextInt(4) + 4;
+
+ int var8;
+ for(var8 = 0; var8 < var7; ++var8) {
+ double var9 = var2.nextDouble() * 6.0D + 3.0D;
+ double var11 = var2.nextDouble() * 4.0D + 2.0D;
+ double var13 = var2.nextDouble() * 6.0D + 3.0D;
+ double var15 = var2.nextDouble() * (16.0D - var9 - 2.0D) + 1.0D + var9 / 2.0D;
+ double var17 = var2.nextDouble() * (8.0D - var11 - 4.0D) + 2.0D + var11 / 2.0D;
+ double var19 = var2.nextDouble() * (16.0D - var13 - 2.0D) + 1.0D + var13 / 2.0D;
+
+ for(int var21 = 1; var21 < 15; ++var21) {
+ for(int var22 = 1; var22 < 15; ++var22) {
+ for(int var23 = 1; var23 < 7; ++var23) {
+ double var24 = ((double)var21 - var15) / (var9 / 2.0D);
+ double var26 = ((double)var23 - var17) / (var11 / 2.0D);
+ double var28 = ((double)var22 - var19) / (var13 / 2.0D);
+ double var30 = var24 * var24 + var26 * var26 + var28 * var28;
+ if(var30 < 1.0D) {
+ var6[(var21 * 16 + var22) * 8 + var23] = true;
+ }
+ }
+ }
+ }
+ }
+
+ int var10;
+ int var32;
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var32 = 0; var32 < 16; ++var32) {
+ for(var10 = 0; var10 < 8; ++var10) {
+ boolean var33 = !var6[(var8 * 16 + var32) * 8 + var10] && (var8 < 15 && var6[((var8 + 1) * 16 + var32) * 8 + var10] || var8 > 0 && var6[((var8 - 1) * 16 + var32) * 8 + var10] || var32 < 15 && var6[(var8 * 16 + var32 + 1) * 8 + var10] || var32 > 0 && var6[(var8 * 16 + (var32 - 1)) * 8 + var10] || var10 < 7 && var6[(var8 * 16 + var32) * 8 + var10 + 1] || var10 > 0 && var6[(var8 * 16 + var32) * 8 + (var10 - 1)]);
+ if(var33) {
+ Material var12 = var1.getBlockMaterial(var3 + var8, var4 + var10, var5 + var32);
+ if(var10 >= 4 && var12.getIsLiquid()) {
+ return false;
+ }
+
+ if(var10 < 4 && !var12.func_878_a() && var1.getBlockId(var3 + var8, var4 + var10, var5 + var32) != this.field_15235_a) {
+ return false;
+ }
+ }
+ }
+ }
+ }
+
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var32 = 0; var32 < 16; ++var32) {
+ for(var10 = 0; var10 < 8; ++var10) {
+ if(var6[(var8 * 16 + var32) * 8 + var10]) {
+ var1.setBlockWithNotify(var3 + var8, var4 + var10, var5 + var32, var10 >= 4 ? 0 : this.field_15235_a);
+ }
+ }
+ }
+ }
+
+ for(var8 = 0; var8 < 16; ++var8) {
+ for(var32 = 0; var32 < 16; ++var32) {
+ for(var10 = 4; var10 < 8; ++var10) {
+ if(var6[(var8 * 16 + var32) * 8 + var10] && var1.getBlockId(var3 + var8, var4 + var10 - 1, var5 + var32) == Block.dirt.blockID && var1.getSavedLightValue(EnumSkyBlock.Sky, var3 + var8, var4 + var10, var5 + var32) > 0) {
+ var1.setBlockWithNotify(var3 + var8, var4 + var10 - 1, var5 + var32, Block.grass.blockID);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenLightStone1.java b/src/main/java/net/minecraft/src/WorldGenLightStone1.java
new file mode 100644
index 0000000..e9c940d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenLightStone1.java
@@ -0,0 +1,61 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenLightStone1 extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var3, var4, var5) != 0) {
+ return false;
+ } else if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) {
+ return false;
+ } else {
+ var1.setBlockWithNotify(var3, var4, var5, Block.lightStone.blockID);
+
+ for(int var6 = 0; var6 < 1500; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 - var2.nextInt(12);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.getBlockId(var7, var8, var9) == 0) {
+ int var10 = 0;
+
+ for(int var11 = 0; var11 < 6; ++var11) {
+ int var12 = 0;
+ if(var11 == 0) {
+ var12 = var1.getBlockId(var7 - 1, var8, var9);
+ }
+
+ if(var11 == 1) {
+ var12 = var1.getBlockId(var7 + 1, var8, var9);
+ }
+
+ if(var11 == 2) {
+ var12 = var1.getBlockId(var7, var8 - 1, var9);
+ }
+
+ if(var11 == 3) {
+ var12 = var1.getBlockId(var7, var8 + 1, var9);
+ }
+
+ if(var11 == 4) {
+ var12 = var1.getBlockId(var7, var8, var9 - 1);
+ }
+
+ if(var11 == 5) {
+ var12 = var1.getBlockId(var7, var8, var9 + 1);
+ }
+
+ if(var12 == Block.lightStone.blockID) {
+ ++var10;
+ }
+ }
+
+ if(var10 == 1) {
+ var1.setBlockWithNotify(var7, var8, var9, Block.lightStone.blockID);
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenLightStone2.java b/src/main/java/net/minecraft/src/WorldGenLightStone2.java
new file mode 100644
index 0000000..14017b4
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenLightStone2.java
@@ -0,0 +1,61 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenLightStone2 extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var3, var4, var5) != 0) {
+ return false;
+ } else if(var1.getBlockId(var3, var4 + 1, var5) != Block.bloodStone.blockID) {
+ return false;
+ } else {
+ var1.setBlockWithNotify(var3, var4, var5, Block.lightStone.blockID);
+
+ for(int var6 = 0; var6 < 1500; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 - var2.nextInt(12);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.getBlockId(var7, var8, var9) == 0) {
+ int var10 = 0;
+
+ for(int var11 = 0; var11 < 6; ++var11) {
+ int var12 = 0;
+ if(var11 == 0) {
+ var12 = var1.getBlockId(var7 - 1, var8, var9);
+ }
+
+ if(var11 == 1) {
+ var12 = var1.getBlockId(var7 + 1, var8, var9);
+ }
+
+ if(var11 == 2) {
+ var12 = var1.getBlockId(var7, var8 - 1, var9);
+ }
+
+ if(var11 == 3) {
+ var12 = var1.getBlockId(var7, var8 + 1, var9);
+ }
+
+ if(var11 == 4) {
+ var12 = var1.getBlockId(var7, var8, var9 - 1);
+ }
+
+ if(var11 == 5) {
+ var12 = var1.getBlockId(var7, var8, var9 + 1);
+ }
+
+ if(var12 == Block.lightStone.blockID) {
+ ++var10;
+ }
+ }
+
+ if(var10 == 1) {
+ var1.setBlockWithNotify(var7, var8, var9, Block.lightStone.blockID);
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenLiquids.java b/src/main/java/net/minecraft/src/WorldGenLiquids.java
new file mode 100644
index 0000000..a50d90d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenLiquids.java
@@ -0,0 +1,64 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenLiquids extends WorldGenerator {
+ private int liquidBlockId;
+
+ public WorldGenLiquids(int var1) {
+ this.liquidBlockId = var1;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ if(var1.getBlockId(var3, var4 + 1, var5) != Block.stone.blockID) {
+ return false;
+ } else if(var1.getBlockId(var3, var4 - 1, var5) != Block.stone.blockID) {
+ return false;
+ } else if(var1.getBlockId(var3, var4, var5) != 0 && var1.getBlockId(var3, var4, var5) != Block.stone.blockID) {
+ return false;
+ } else {
+ int var6 = 0;
+ if(var1.getBlockId(var3 - 1, var4, var5) == Block.stone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3 + 1, var4, var5) == Block.stone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 - 1) == Block.stone.blockID) {
+ ++var6;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 + 1) == Block.stone.blockID) {
+ ++var6;
+ }
+
+ int var7 = 0;
+ if(var1.getBlockId(var3 - 1, var4, var5) == 0) {
+ ++var7;
+ }
+
+ if(var1.getBlockId(var3 + 1, var4, var5) == 0) {
+ ++var7;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 - 1) == 0) {
+ ++var7;
+ }
+
+ if(var1.getBlockId(var3, var4, var5 + 1) == 0) {
+ ++var7;
+ }
+
+ if(var6 == 3 && var7 == 1) {
+ var1.setBlockWithNotify(var3, var4, var5, this.liquidBlockId);
+ var1.field_4214_a = true;
+ Block.blocksList[this.liquidBlockId].updateTick(var1, var3, var4, var5, var2);
+ var1.field_4214_a = false;
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenMinable.java b/src/main/java/net/minecraft/src/WorldGenMinable.java
new file mode 100644
index 0000000..652dd5a
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenMinable.java
@@ -0,0 +1,47 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenMinable extends WorldGenerator {
+ private int minableBlockId;
+ private int numberOfBlocks;
+
+ public WorldGenMinable(int var1, int var2) {
+ this.minableBlockId = var1;
+ this.numberOfBlocks = var2;
+ }
+
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ float var6 = var2.nextFloat() * (float)Math.PI;
+ double var7 = (double)((float)(var3 + 8) + MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var9 = (double)((float)(var3 + 8) - MathHelper.sin(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var11 = (double)((float)(var5 + 8) + MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var13 = (double)((float)(var5 + 8) - MathHelper.cos(var6) * (float)this.numberOfBlocks / 8.0F);
+ double var15 = (double)(var4 + var2.nextInt(3) + 2);
+ double var17 = (double)(var4 + var2.nextInt(3) + 2);
+
+ for(int var19 = 0; var19 <= this.numberOfBlocks; ++var19) {
+ double var20 = var7 + (var9 - var7) * (double)var19 / (double)this.numberOfBlocks;
+ double var22 = var15 + (var17 - var15) * (double)var19 / (double)this.numberOfBlocks;
+ double var24 = var11 + (var13 - var11) * (double)var19 / (double)this.numberOfBlocks;
+ double var26 = var2.nextDouble() * (double)this.numberOfBlocks / 16.0D;
+ double var28 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
+ double var30 = (double)(MathHelper.sin((float)var19 * (float)Math.PI / (float)this.numberOfBlocks) + 1.0F) * var26 + 1.0D;
+
+ for(int var32 = (int)(var20 - var28 / 2.0D); var32 <= (int)(var20 + var28 / 2.0D); ++var32) {
+ for(int var33 = (int)(var22 - var30 / 2.0D); var33 <= (int)(var22 + var30 / 2.0D); ++var33) {
+ for(int var34 = (int)(var24 - var28 / 2.0D); var34 <= (int)(var24 + var28 / 2.0D); ++var34) {
+ double var35 = ((double)var32 + 0.5D - var20) / (var28 / 2.0D);
+ double var37 = ((double)var33 + 0.5D - var22) / (var30 / 2.0D);
+ double var39 = ((double)var34 + 0.5D - var24) / (var28 / 2.0D);
+ if(var35 * var35 + var37 * var37 + var39 * var39 < 1.0D && var1.getBlockId(var32, var33, var34) == Block.stone.blockID) {
+ var1.setBlock(var32, var33, var34, this.minableBlockId);
+ }
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenPumpkin.java b/src/main/java/net/minecraft/src/WorldGenPumpkin.java
new file mode 100644
index 0000000..63cc80d
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenPumpkin.java
@@ -0,0 +1,18 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenPumpkin extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 64; ++var6) {
+ int var7 = var3 + var2.nextInt(8) - var2.nextInt(8);
+ int var8 = var4 + var2.nextInt(4) - var2.nextInt(4);
+ int var9 = var5 + var2.nextInt(8) - var2.nextInt(8);
+ if(var1.getBlockId(var7, var8, var9) == 0 && var1.getBlockId(var7, var8 - 1, var9) == Block.grass.blockID && Block.pumpkin.canPlaceBlockAt(var1, var7, var8, var9)) {
+ var1.setBlockAndMetadata(var7, var8, var9, Block.pumpkin.blockID, var2.nextInt(4));
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenReed.java b/src/main/java/net/minecraft/src/WorldGenReed.java
new file mode 100644
index 0000000..c10f34b
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenReed.java
@@ -0,0 +1,24 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenReed extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ for(int var6 = 0; var6 < 20; ++var6) {
+ int var7 = var3 + var2.nextInt(4) - var2.nextInt(4);
+ int var8 = var4;
+ int var9 = var5 + var2.nextInt(4) - var2.nextInt(4);
+ if(var1.getBlockId(var7, var4, var9) == 0 && (var1.getBlockMaterial(var7 - 1, var4 - 1, var9) == Material.water || var1.getBlockMaterial(var7 + 1, var4 - 1, var9) == Material.water || var1.getBlockMaterial(var7, var4 - 1, var9 - 1) == Material.water || var1.getBlockMaterial(var7, var4 - 1, var9 + 1) == Material.water)) {
+ int var10 = 2 + var2.nextInt(var2.nextInt(3) + 1);
+
+ for(int var11 = 0; var11 < var10; ++var11) {
+ if(Block.reed.canBlockStay(var1, var7, var8 + var11, var9)) {
+ var1.setBlock(var7, var8 + var11, var9, Block.reed.blockID);
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenTrees.java b/src/main/java/net/minecraft/src/WorldGenTrees.java
new file mode 100644
index 0000000..631e379
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenTrees.java
@@ -0,0 +1,78 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public class WorldGenTrees extends WorldGenerator {
+ public boolean generate(World var1, Random var2, int var3, int var4, int var5) {
+ int var6 = var2.nextInt(3) + 4;
+ boolean var7 = true;
+ if(var4 >= 1 && var4 + var6 + 1 <= 128) {
+ int var8;
+ int var10;
+ int var11;
+ int var12;
+ for(var8 = var4; var8 <= var4 + 1 + var6; ++var8) {
+ byte var9 = 1;
+ if(var8 == var4) {
+ var9 = 0;
+ }
+
+ if(var8 >= var4 + 1 + var6 - 2) {
+ var9 = 2;
+ }
+
+ for(var10 = var3 - var9; var10 <= var3 + var9 && var7; ++var10) {
+ for(var11 = var5 - var9; var11 <= var5 + var9 && var7; ++var11) {
+ if(var8 >= 0 && var8 < 128) {
+ var12 = var1.getBlockId(var10, var8, var11);
+ if(var12 != 0 && var12 != Block.leaves.blockID) {
+ var7 = false;
+ }
+ } else {
+ var7 = false;
+ }
+ }
+ }
+ }
+
+ if(!var7) {
+ return false;
+ } else {
+ var8 = var1.getBlockId(var3, var4 - 1, var5);
+ if((var8 == Block.grass.blockID || var8 == Block.dirt.blockID) && var4 < 128 - var6 - 1) {
+ var1.setBlock(var3, var4 - 1, var5, Block.dirt.blockID);
+
+ int var16;
+ for(var16 = var4 - 3 + var6; var16 <= var4 + var6; ++var16) {
+ var10 = var16 - (var4 + var6);
+ var11 = 1 - var10 / 2;
+
+ for(var12 = var3 - var11; var12 <= var3 + var11; ++var12) {
+ int var13 = var12 - var3;
+
+ for(int var14 = var5 - var11; var14 <= var5 + var11; ++var14) {
+ int var15 = var14 - var5;
+ if((Math.abs(var13) != var11 || Math.abs(var15) != var11 || var2.nextInt(2) != 0 && var10 != 0) && !Block.opaqueCubeLookup[var1.getBlockId(var12, var16, var14)]) {
+ var1.setBlock(var12, var16, var14, Block.leaves.blockID);
+ }
+ }
+ }
+ }
+
+ for(var16 = 0; var16 < var6; ++var16) {
+ var10 = var1.getBlockId(var3, var4 + var16, var5);
+ if(var10 == 0 || var10 == Block.leaves.blockID) {
+ var1.setBlock(var3, var4 + var16, var5, Block.wood.blockID);
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldGenerator.java b/src/main/java/net/minecraft/src/WorldGenerator.java
new file mode 100644
index 0000000..c4cfb05
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldGenerator.java
@@ -0,0 +1,10 @@
+package net.minecraft.src;
+
+import java.util.Random;
+
+public abstract class WorldGenerator {
+ public abstract boolean generate(World var1, Random var2, int var3, int var4, int var5);
+
+ public void func_517_a(double var1, double var3, double var5) {
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldProvider.java b/src/main/java/net/minecraft/src/WorldProvider.java
new file mode 100644
index 0000000..bd168ff
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldProvider.java
@@ -0,0 +1,109 @@
+package net.minecraft.src;
+
+import java.io.File;
+
+public class WorldProvider {
+ public World worldObj;
+ public WorldChunkManager worldChunkMgr;
+ public boolean field_4220_c = false;
+ public boolean field_6479_d = false;
+ public boolean field_6478_e = false;
+ public float[] lightBrightnessTable = new float[16];
+ public int field_4218_e = 0;
+ private float[] field_4217_f = new float[4];
+
+ public final void registerWorld(World var1) {
+ this.worldObj = var1;
+ this.registerWorldChunkManager();
+ this.generateLightBrightnessTable();
+ }
+
+ protected void generateLightBrightnessTable() {
+ float var1 = 0.05F;
+
+ for(int var2 = 0; var2 <= 15; ++var2) {
+ float var3 = 1.0F - (float)var2 / 15.0F;
+ this.lightBrightnessTable[var2] = (1.0F - var3) / (var3 * 3.0F + 1.0F) * (1.0F - var1) + var1;
+ }
+
+ }
+
+ protected void registerWorldChunkManager() {
+ this.worldChunkMgr = new WorldChunkManager(this.worldObj);
+ }
+
+ public IChunkProvider getChunkProvider() {
+ return new ChunkProviderGenerate(this.worldObj, this.worldObj.randomSeed);
+ }
+
+ public IChunkLoader getChunkLoader(File var1) {
+ return new ChunkLoader(var1, true);
+ }
+
+ public boolean canCoordinateBeSpawn(int var1, int var2) {
+ int var3 = this.worldObj.func_614_g(var1, var2);
+ return var3 == Block.sand.blockID;
+ }
+
+ public float calculateCelestialAngle(long var1, float var3) {
+ int var4 = (int)(var1 % 24000L);
+ float var5 = ((float)var4 + var3) / 24000.0F - 0.25F;
+ if(var5 < 0.0F) {
+ ++var5;
+ }
+
+ if(var5 > 1.0F) {
+ --var5;
+ }
+
+ float var6 = var5;
+ var5 = 1.0F - (float)((Math.cos((double)var5 * Math.PI) + 1.0D) / 2.0D);
+ var5 = var6 + (var5 - var6) / 3.0F;
+ return var5;
+ }
+
+ public float[] func_4097_b(float var1, float var2) {
+ float var3 = 0.4F;
+ float var4 = MathHelper.cos(var1 * (float)Math.PI * 2.0F) - 0.0F;
+ float var5 = -0.0F;
+ if(var4 >= var5 - var3 && var4 <= var5 + var3) {
+ float var6 = (var4 - var5) / var3 * 0.5F + 0.5F;
+ float var7 = 1.0F - (1.0F - MathHelper.sin(var6 * (float)Math.PI)) * 0.99F;
+ var7 *= var7;
+ this.field_4217_f[0] = var6 * 0.3F + 0.7F;
+ this.field_4217_f[1] = var6 * var6 * 0.7F + 0.2F;
+ this.field_4217_f[2] = var6 * var6 * 0.0F + 0.2F;
+ this.field_4217_f[3] = var7;
+ return this.field_4217_f;
+ } else {
+ return null;
+ }
+ }
+
+ public Vec3D func_4096_a(float var1, float var2) {
+ float var3 = MathHelper.cos(var1 * (float)Math.PI * 2.0F) * 2.0F + 0.5F;
+ if(var3 < 0.0F) {
+ var3 = 0.0F;
+ }
+
+ if(var3 > 1.0F) {
+ var3 = 1.0F;
+ }
+
+ float var4 = 192.0F / 255.0F;
+ float var5 = 216.0F / 255.0F;
+ float var6 = 1.0F;
+ var4 *= var3 * 0.94F + 0.06F;
+ var5 *= var3 * 0.94F + 0.06F;
+ var6 *= var3 * 0.91F + 0.09F;
+ return Vec3D.createVector((double)var4, (double)var5, (double)var6);
+ }
+
+ public boolean func_6477_d() {
+ return true;
+ }
+
+ public static WorldProvider func_4101_a(int var0) {
+ return (WorldProvider)(var0 == 0 ? new WorldProvider() : (var0 == -1 ? new WorldProviderHell() : null));
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldProviderHell.java b/src/main/java/net/minecraft/src/WorldProviderHell.java
new file mode 100644
index 0000000..a2fcfa3
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldProviderHell.java
@@ -0,0 +1,50 @@
+package net.minecraft.src;
+
+import java.io.File;
+
+public class WorldProviderHell extends WorldProvider {
+ public void registerWorldChunkManager() {
+ this.worldChunkMgr = new WorldChunkManagerHell(MobSpawnerBase.hell, 1.0D, 0.0D);
+ this.field_4220_c = true;
+ this.field_6479_d = true;
+ this.field_6478_e = true;
+ this.field_4218_e = -1;
+ }
+
+ public Vec3D func_4096_a(float var1, float var2) {
+ return Vec3D.createVector((double)0.2F, (double)0.03F, (double)0.03F);
+ }
+
+ protected void generateLightBrightnessTable() {
+ float var1 = 0.1F;
+
+ for(int var2 = 0; var2 <= 15; ++var2) {
+ float var3 = 1.0F - (float)var2 / 15.0F;
+ this.lightBrightnessTable[var2] = (1.0F - var3) / (var3 * 3.0F + 1.0F) * (1.0F - var1) + var1;
+ }
+
+ }
+
+ public IChunkProvider getChunkProvider() {
+ return new ChunkProviderHell(this.worldObj, this.worldObj.randomSeed);
+ }
+
+ public IChunkLoader getChunkLoader(File var1) {
+ File var2 = new File(var1, "DIM-1");
+ var2.mkdirs();
+ return new ChunkLoader(var2, true);
+ }
+
+ public boolean canCoordinateBeSpawn(int var1, int var2) {
+ int var3 = this.worldObj.func_614_g(var1, var2);
+ return var3 == Block.bedrock.blockID ? false : (var3 == 0 ? false : Block.opaqueCubeLookup[var3]);
+ }
+
+ public float calculateCelestialAngle(long var1, float var3) {
+ return 0.5F;
+ }
+
+ public boolean func_6477_d() {
+ return false;
+ }
+}
diff --git a/src/main/java/net/minecraft/src/WorldRenderer.java b/src/main/java/net/minecraft/src/WorldRenderer.java
new file mode 100644
index 0000000..b3152b6
--- /dev/null
+++ b/src/main/java/net/minecraft/src/WorldRenderer.java
@@ -0,0 +1,214 @@
+package net.minecraft.src;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import org.lwjgl.opengl.GL11;
+
+public class WorldRenderer {
+ public World worldObj;
+ private int field_1744_C = -1;
+ private static Tessellator field_1742_D = Tessellator.instance;
+ public static int field_1762_b = 0;
+ public int field_1761_c;
+ public int field_1760_d;
+ public int field_1759_e;
+ public int field_1758_f;
+ public int field_1757_g;
+ public int field_1756_h;
+ public int field_1755_i;
+ public int field_1754_j;
+ public int field_1753_k;
+ public int field_1752_l;
+ public int field_1751_m;
+ public int field_1750_n;
+ public boolean field_1749_o = false;
+ public boolean[] field_1748_p = new boolean[2];
+ public int field_1746_q;
+ public int field_1743_r;
+ public int field_1741_s;
+ public float field_1740_t;
+ public boolean needsUpdate;
+ public AxisAlignedBB field_1736_v;
+ public int field_1735_w;
+ public boolean field_1734_x = true;
+ public boolean field_1733_y;
+ public int field_1732_z;
+ public boolean field_1747_A;
+ private boolean field_1739_E = false;
+ public List field_1745_B = new ArrayList();
+ private List field_1737_F;
+
+ public WorldRenderer(World var1, List var2, int var3, int var4, int var5, int var6, int var7) {
+ this.worldObj = var1;
+ this.field_1737_F = var2;
+ this.field_1758_f = this.field_1757_g = this.field_1756_h = var6;
+ this.field_1740_t = MathHelper.sqrt_float((float)(this.field_1758_f * this.field_1758_f + this.field_1757_g * this.field_1757_g + this.field_1756_h * this.field_1756_h)) / 2.0F;
+ this.field_1744_C = var7;
+ this.field_1761_c = -999;
+ this.func_1197_a(var3, var4, var5);
+ this.needsUpdate = false;
+ }
+
+ public void func_1197_a(int var1, int var2, int var3) {
+ if(var1 != this.field_1761_c || var2 != this.field_1760_d || var3 != this.field_1759_e) {
+ this.func_1195_b();
+ this.field_1761_c = var1;
+ this.field_1760_d = var2;
+ this.field_1759_e = var3;
+ this.field_1746_q = var1 + this.field_1758_f / 2;
+ this.field_1743_r = var2 + this.field_1757_g / 2;
+ this.field_1741_s = var3 + this.field_1756_h / 2;
+ this.field_1752_l = var1 & 1023;
+ this.field_1751_m = var2;
+ this.field_1750_n = var3 & 1023;
+ this.field_1755_i = var1 - this.field_1752_l;
+ this.field_1754_j = var2 - this.field_1751_m;
+ this.field_1753_k = var3 - this.field_1750_n;
+ float var4 = 2.0F;
+ this.field_1736_v = AxisAlignedBB.getBoundingBox((double)((float)var1 - var4), (double)((float)var2 - var4), (double)((float)var3 - var4), (double)((float)(var1 + this.field_1758_f) + var4), (double)((float)(var2 + this.field_1757_g) + var4), (double)((float)(var3 + this.field_1756_h) + var4));
+ GL11.glNewList(this.field_1744_C + 2, GL11.GL_COMPILE);
+ RenderItem.renderAABB(AxisAlignedBB.getBoundingBoxFromPool((double)((float)this.field_1752_l - var4), (double)((float)this.field_1751_m - var4), (double)((float)this.field_1750_n - var4), (double)((float)(this.field_1752_l + this.field_1758_f) + var4), (double)((float)(this.field_1751_m + this.field_1757_g) + var4), (double)((float)(this.field_1750_n + this.field_1756_h) + var4)));
+ GL11.glEndList();
+ this.MarkDirty();
+ }
+ }
+
+ private void func_1203_g() {
+ GL11.glTranslatef((float)this.field_1752_l, (float)this.field_1751_m, (float)this.field_1750_n);
+ }
+
+ public void func_1198_a() {
+ if(this.needsUpdate) {
+ ++field_1762_b;
+ int var1 = this.field_1761_c;
+ int var2 = this.field_1760_d;
+ int var3 = this.field_1759_e;
+ int var4 = this.field_1761_c + this.field_1758_f;
+ int var5 = this.field_1760_d + this.field_1757_g;
+ int var6 = this.field_1759_e + this.field_1756_h;
+
+ for(int var7 = 0; var7 < 2; ++var7) {
+ this.field_1748_p[var7] = true;
+ }
+
+ Chunk.field_1540_a = false;
+ HashSet var21 = new HashSet();
+ var21.addAll(this.field_1745_B);
+ this.field_1745_B.clear();
+ byte var8 = 1;
+ ChunkCache var9 = new ChunkCache(this.worldObj, var1 - var8, var2 - var8, var3 - var8, var4 + var8, var5 + var8, var6 + var8);
+ RenderBlocks var10 = new RenderBlocks(var9);
+
+ for(int var11 = 0; var11 < 2; ++var11) {
+ boolean var12 = false;
+ boolean var13 = false;
+ boolean var14 = false;
+
+ for(int var15 = var2; var15 < var5; ++var15) {
+ for(int var16 = var3; var16 < var6; ++var16) {
+ for(int var17 = var1; var17 < var4; ++var17) {
+ int var18 = var9.getBlockId(var17, var15, var16);
+ if(var18 > 0) {
+ if(!var14) {
+ var14 = true;
+ GL11.glNewList(this.field_1744_C + var11, GL11.GL_COMPILE);
+ GL11.glPushMatrix();
+ this.func_1203_g();
+ float var19 = 1.000001F;
+ GL11.glTranslatef((float)(-this.field_1756_h) / 2.0F, (float)(-this.field_1757_g) / 2.0F, (float)(-this.field_1756_h) / 2.0F);
+ GL11.glScalef(var19, var19, var19);
+ GL11.glTranslatef((float)this.field_1756_h / 2.0F, (float)this.field_1757_g / 2.0F, (float)this.field_1756_h / 2.0F);
+ field_1742_D.startDrawingQuads();
+ field_1742_D.setTranslationD((double)(-this.field_1761_c), (double)(-this.field_1760_d), (double)(-this.field_1759_e));
+ }
+
+ if(var11 == 0 && Block.isBlockContainer[var18]) {
+ TileEntity var23 = var9.getBlockTileEntity(var17, var15, var16);
+ if(TileEntityRenderer.instance.hasSpecialRenderer(var23)) {
+ this.field_1745_B.add(var23);
+ }
+ }
+
+ Block var24 = Block.blocksList[var18];
+ int var20 = var24.func_234_g();
+ if(var20 != var11) {
+ var12 = true;
+ } else if(var20 == var11) {
+ var13 |= var10.renderBlockByRenderType(var24, var17, var15, var16);
+ }
+ }
+ }
+ }
+ }
+
+ if(var14) {
+ field_1742_D.draw();
+ GL11.glPopMatrix();
+ GL11.glEndList();
+ field_1742_D.setTranslationD(0.0D, 0.0D, 0.0D);
+ } else {
+ var13 = false;
+ }
+
+ if(var13) {
+ this.field_1748_p[var11] = false;
+ }
+
+ if(!var12) {
+ break;
+ }
+ }
+
+ HashSet var22 = new HashSet();
+ var22.addAll(this.field_1745_B);
+ var22.removeAll(var21);
+ this.field_1737_F.addAll(var22);
+ var21.removeAll(this.field_1745_B);
+ this.field_1737_F.removeAll(var21);
+ this.field_1747_A = Chunk.field_1540_a;
+ this.field_1739_E = true;
+ }
+ }
+
+ public float func_1202_a(Entity var1) {
+ float var2 = (float)(var1.posX - (double)this.field_1746_q);
+ float var3 = (float)(var1.posY - (double)this.field_1743_r);
+ float var4 = (float)(var1.posZ - (double)this.field_1741_s);
+ return var2 * var2 + var3 * var3 + var4 * var4;
+ }
+
+ public void func_1195_b() {
+ for(int var1 = 0; var1 < 2; ++var1) {
+ this.field_1748_p[var1] = true;
+ }
+
+ this.field_1749_o = false;
+ this.field_1739_E = false;
+ }
+
+ public void func_1204_c() {
+ this.func_1195_b();
+ this.worldObj = null;
+ }
+
+ public int func_1200_a(int var1) {
+ return !this.field_1749_o ? -1 : (!this.field_1748_p[var1] ? this.field_1744_C + var1 : -1);
+ }
+
+ public void func_1199_a(ICamera var1) {
+ this.field_1749_o = var1.func_342_a(this.field_1736_v);
+ }
+
+ public void func_1201_d() {
+ GL11.glCallList(this.field_1744_C + 2);
+ }
+
+ public boolean func_1196_e() {
+ return !this.field_1739_E ? false : this.field_1748_p[0] && this.field_1748_p[1];
+ }
+
+ public void MarkDirty() {
+ this.needsUpdate = true;
+ }
+}
diff --git a/src/main/java/org/lwjgl/input/Keyboard.java b/src/main/java/org/lwjgl/input/Keyboard.java
new file mode 100644
index 0000000..d3bd14c
--- /dev/null
+++ b/src/main/java/org/lwjgl/input/Keyboard.java
@@ -0,0 +1,15 @@
+package org.lwjgl.input;
+
+import org.lwjgl.opengl.GL11;
+
+public class Keyboard extends GL11 {
+
+ public static boolean next() {
+ return keysNext();
+ }
+
+ public static char getEventCharacter() {
+ return getEventChar();
+ }
+
+}
diff --git a/src/main/java/org/lwjgl/input/Mouse.java b/src/main/java/org/lwjgl/input/Mouse.java
new file mode 100644
index 0000000..543a991
--- /dev/null
+++ b/src/main/java/org/lwjgl/input/Mouse.java
@@ -0,0 +1,55 @@
+package org.lwjgl.input;
+
+import org.lwjgl.opengl.GL11;
+
+public class Mouse extends GL11 {
+
+ public static int getX() {
+ return mouseGetX();
+ }
+
+ public static int getY() {
+ return mouseGetY();
+ }
+
+ public static boolean next() {
+ return mouseNext();
+ }
+
+ public static boolean getEventButtonState() {
+ return mouseGetEventButtonState();
+ }
+
+ public static int getEventX() {
+ return mouseGetEventX();
+ }
+
+
+ public static int getEventY() {
+ return mouseGetEventY();
+ }
+
+ public static int getEventButton() {
+ return mouseGetEventButton();
+ }
+
+ public static int getDX() {
+ return mouseGetDX();
+ }
+
+ public static int getDY() {
+ return mouseGetDY();
+ }
+
+ public static void setGrabbed(boolean b) {
+ mouseSetGrabbed(b);
+ }
+
+ public static boolean isButtonDown(int i) {
+ return mouseIsButtonDown(i);
+ }
+
+ public static int getEventDWheel() {
+ return mouseGetEventDWheel();
+ }
+}
diff --git a/src/main/java/org/lwjgl/opengl/EaglerAdapterGL30.java b/src/main/java/org/lwjgl/opengl/EaglerAdapterGL30.java
new file mode 100644
index 0000000..3d11198
--- /dev/null
+++ b/src/main/java/org/lwjgl/opengl/EaglerAdapterGL30.java
@@ -0,0 +1,1228 @@
+package org.lwjgl.opengl;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.util.HashMap;
+
+import net.PeytonPlayz585.glemu.FixedFunctionShader;
+import net.PeytonPlayz585.glemu.GLObjectMap;
+
+import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2;
+import net.PeytonPlayz585.glemu.vector.*;
+
+public class EaglerAdapterGL30 extends EaglerAdapterImpl2 {
+
+ public static final int GL_ZERO = RealOpenGLEnums.GL_ZERO;
+ public static final int GL_ONE = RealOpenGLEnums.GL_ONE;
+ public static final int GL_TEXTURE_2D = RealOpenGLEnums.GL_TEXTURE_2D;
+ public static final int GL_SMOOTH = RealOpenGLEnums.GL_SMOOTH;
+ public static final int GL_DEPTH_TEST = RealOpenGLEnums.GL_DEPTH_TEST;
+ public static final int GL_LEQUAL = RealOpenGLEnums.GL_LEQUAL;
+ public static final int GL_ALPHA_TEST = RealOpenGLEnums.GL_ALPHA_TEST;
+ public static final int GL_GREATER = RealOpenGLEnums.GL_GREATER;
+ public static final int GL_BACK = RealOpenGLEnums.GL_BACK;
+ public static final int GL_PROJECTION = RealOpenGLEnums.GL_PROJECTION;
+ public static final int GL_MODELVIEW = RealOpenGLEnums.GL_MODELVIEW;
+ public static final int GL_COLOR_BUFFER_BIT = RealOpenGLEnums.GL_COLOR_BUFFER_BIT;
+ public static final int GL_DEPTH_BUFFER_BIT = RealOpenGLEnums.GL_DEPTH_BUFFER_BIT;
+ public static final int GL_LIGHTING = RealOpenGLEnums.GL_LIGHTING;
+ public static final int GL_FOG = RealOpenGLEnums.GL_FOG;
+ public static final int GL_COLOR_MATERIAL = RealOpenGLEnums.GL_COLOR_MATERIAL;
+ public static final int GL_BLEND = RealOpenGLEnums.GL_BLEND;
+ public static final int GL_RGBA = RealOpenGLEnums.GL_RGBA;
+ public static final int GL_UNSIGNED_BYTE = RealOpenGLEnums.GL_UNSIGNED_BYTE;
+ public static final int GL_TEXTURE_WIDTH = RealOpenGLEnums.GL_TEXTURE_WIDTH;
+ public static final int GL_LIGHT0 = RealOpenGLEnums.GL_LIGHT0;
+ public static final int GL_LIGHT1 = RealOpenGLEnums.GL_LIGHT1;
+ public static final int GL_POSITION = RealOpenGLEnums.GL_POSITION;
+ public static final int GL_DIFFUSE = RealOpenGLEnums.GL_DIFFUSE;
+ public static final int GL_SPECULAR = RealOpenGLEnums.GL_SPECULAR;
+ public static final int GL_AMBIENT = RealOpenGLEnums.GL_AMBIENT;
+ public static final int GL_FLAT = RealOpenGLEnums.GL_FLAT;
+ public static final int GL_LIGHT_MODEL_AMBIENT = RealOpenGLEnums.GL_LIGHT_MODEL_AMBIENT;
+ public static final int GL_FRONT_AND_BACK = RealOpenGLEnums.GL_FRONT_AND_BACK;
+ public static final int GL_AMBIENT_AND_DIFFUSE = RealOpenGLEnums.GL_AMBIENT_AND_DIFFUSE;
+ public static final int GL_MODELVIEW_MATRIX = RealOpenGLEnums.GL_MODELVIEW_MATRIX;
+ public static final int GL_PROJECTION_MATRIX = RealOpenGLEnums.GL_PROJECTION_MATRIX;
+ public static final int GL_VIEWPORT = RealOpenGLEnums.GL_VIEWPORT;
+ public static final int GL_RESCALE_NORMAL = RealOpenGLEnums.GL_RESCALE_NORMAL;
+ public static final int GL_SRC_ALPHA = RealOpenGLEnums.GL_SRC_ALPHA;
+ public static final int GL_ONE_MINUS_SRC_ALPHA = RealOpenGLEnums.GL_ONE_MINUS_SRC_ALPHA;
+ public static final int GL_ONE_MINUS_DST_COLOR = RealOpenGLEnums.GL_ONE_MINUS_DST_COLOR;
+ public static final int GL_ONE_MINUS_SRC_COLOR = RealOpenGLEnums.GL_ONE_MINUS_SRC_COLOR;
+ public static final int GL_CULL_FACE = RealOpenGLEnums.GL_CULL_FACE;
+ public static final int GL_TEXTURE_MIN_FILTER = RealOpenGLEnums.GL_TEXTURE_MIN_FILTER;
+ public static final int GL_TEXTURE_MAG_FILTER = RealOpenGLEnums.GL_TEXTURE_MAG_FILTER;
+ public static final int GL_LINEAR = RealOpenGLEnums.GL_LINEAR;
+ public static final int GL_COLOR_LOGIC_OP = RealOpenGLEnums.GL_COLOR_LOGIC_OP;
+ public static final int GL_OR_REVERSE = RealOpenGLEnums.GL_OR_REVERSE;
+ public static final int GL_EQUAL = RealOpenGLEnums.GL_EQUAL;
+ public static final int GL_SRC_COLOR = RealOpenGLEnums.GL_SRC_COLOR;
+ public static final int GL_TEXTURE = RealOpenGLEnums.GL_TEXTURE;
+ public static final int GL_FRONT = RealOpenGLEnums.GL_FRONT;
+ public static final int GL_COMPILE = RealOpenGLEnums.GL_COMPILE;
+ public static final int GL_NEAREST = RealOpenGLEnums.GL_NEAREST;
+ public static final int GL_CLAMP = RealOpenGLEnums.GL_CLAMP_TO_EDGE;
+ public static final int GL_TEXTURE_WRAP_S = RealOpenGLEnums.GL_TEXTURE_WRAP_S;
+ public static final int GL_TEXTURE_WRAP_T = RealOpenGLEnums.GL_TEXTURE_WRAP_T;
+ public static final int GL_REPEAT = RealOpenGLEnums.GL_REPEAT;
+ public static final int GL_BGRA = RealOpenGLEnums.GL_BGRA;
+ public static final int GL_UNSIGNED_INT_8_8_8_8_REV = RealOpenGLEnums.GL_UNSIGNED_INT_8_8_8_8_REV;
+ public static final int GL_DST_COLOR = RealOpenGLEnums.GL_DST_COLOR;
+ public static final int GL_POLYGON_OFFSET_FILL = RealOpenGLEnums.GL_POLYGON_OFFSET_FILL;
+ public static final int GL_NORMALIZE = RealOpenGLEnums.GL_NORMALIZE;
+ public static final int GL_DST_ALPHA = RealOpenGLEnums.GL_DST_ALPHA;
+ public static final int GL_FLOAT = RealOpenGLEnums.GL_FLOAT;
+ public static final int GL_TEXTURE_COORD_ARRAY = RealOpenGLEnums.GL_TEXTURE_COORD_ARRAY;
+ public static final int GL_SHORT = RealOpenGLEnums.GL_SHORT;
+ public static final int GL_COLOR_ARRAY = RealOpenGLEnums.GL_COLOR_ARRAY;
+ public static final int GL_VERTEX_ARRAY = RealOpenGLEnums.GL_VERTEX_ARRAY;
+ public static final int GL_TRIANGLES = RealOpenGLEnums.GL_TRIANGLES;
+ public static final int GL_NORMAL_ARRAY = RealOpenGLEnums.GL_NORMAL_ARRAY;
+ public static final int GL_TEXTURE_3D = RealOpenGLEnums.GL_TEXTURE_3D;
+ public static final int GL_FOG_MODE = RealOpenGLEnums.GL_FOG_MODE;
+ public static final int GL_EXP = RealOpenGLEnums.GL_EXP;
+ public static final int GL_FOG_DENSITY = RealOpenGLEnums.GL_FOG_DENSITY;
+ public static final int GL_FOG_START = RealOpenGLEnums.GL_FOG_START;
+ public static final int GL_FOG_END = RealOpenGLEnums.GL_FOG_END;
+ public static final int GL_FOG_COLOR = RealOpenGLEnums.GL_FOG_COLOR;
+ public static final int GL_TRIANGLE_STRIP = RealOpenGLEnums.GL_TRIANGLE_STRIP;
+ public static final int GL_PACK_ALIGNMENT = RealOpenGLEnums.GL_PACK_ALIGNMENT;
+ public static final int GL_UNPACK_ALIGNMENT = RealOpenGLEnums.GL_UNPACK_ALIGNMENT;
+ public static final int GL_QUADS = RealOpenGLEnums.GL_QUADS;
+ public static final int GL_INVALID_ENUM = RealOpenGLEnums.GL_INVALID_ENUM;
+ public static final int GL_INVALID_VALUE = RealOpenGLEnums.GL_INVALID_VALUE;
+ public static final int GL_INVALID_OPERATION = RealOpenGLEnums.GL_INVALID_OPERATION;
+ public static final int GL_OUT_OF_MEMORY = RealOpenGLEnums.GL_OUT_OF_MEMORY;
+ public static final int GL_CONTEXT_LOST_WEBGL = -144;
+ public static final int GL_TRIANGLE_FAN = RealOpenGLEnums.GL_TRIANGLE_FAN;
+ public static final int GL_LINE_STRIP = RealOpenGLEnums.GL_LINE_STRIP;
+ public static final int GL_LINES = RealOpenGLEnums.GL_LINES;
+ public static final int GL_NEAREST_MIPMAP_LINEAR = RealOpenGLEnums.GL_NEAREST_MIPMAP_LINEAR;
+ public static final int GL_TEXTURE_MAX_ANISOTROPY = -150;
+ public static final int GL_TEXTURE_MAX_LEVEL = RealOpenGLEnums.GL_TEXTURE_MAX_LEVEL;
+ public static final int GL_LINEAR_MIPMAP_LINEAR = RealOpenGLEnums.GL_LINEAR_MIPMAP_LINEAR;
+ public static final int GL_LINEAR_MIPMAP_NEAREST = RealOpenGLEnums.GL_LINEAR_MIPMAP_NEAREST;
+ public static final int GL_NEAREST_MIPMAP_NEAREST = RealOpenGLEnums.GL_NEAREST_MIPMAP_NEAREST;
+
+ public static final boolean isWebGL = _wisWebGL();
+
+ private static final GLObjectMap texObjects = new GLObjectMap(256);
+
+ private static boolean enableTexture2D = false;
+ private static boolean enableLighting = false;
+ private static boolean enableAlphaTest = false;
+ private static float alphaThresh = 0.1f;
+
+ private static boolean isCompilingDisplayList = false;
+ private static DisplayList compilingDisplayList = null;
+
+ private static boolean enableColorArray = false;
+ private static boolean enableNormalArray = false;
+ private static boolean enableTex0Array = false;
+
+ private static float colorR = 1.0f;
+ private static float colorG = 1.0f;
+ private static float colorB = 1.0f;
+ private static float colorA = 1.0f;
+
+ private static float normalX = 1.0f;
+ private static float normalY = 0.0f;
+ private static float normalZ = 0.0f;
+
+ private static float tex0X = 0;
+ private static float tex0Y = 0;
+
+ private static boolean enableColorMaterial = false;
+
+ private static float fogColorR = 1.0f;
+ private static float fogColorG = 1.0f;
+ private static float fogColorB = 1.0f;
+ private static float fogColorA = 1.0f;
+ private static int fogMode = 1;
+ private static boolean fogEnabled = false;
+ private static boolean fogPremultiply = false;
+ private static float fogStart = 1.0f;
+ private static float fogEnd = 1.0f;
+ private static float fogDensity = 1.0f;
+
+ private static int bytesUploaded = 0;
+ private static int vertexDrawn = 0;
+ private static int triangleDrawn = 0;
+
+ private static int matrixMode = GL_MODELVIEW;
+
+ static Matrix4f[] matModelV = new Matrix4f[32];
+ static int matModelPointer = 0;
+
+ static Matrix4f[] matProjV = new Matrix4f[6];
+ static int matProjPointer = 0;
+
+ static Matrix4f[] matTexV = new Matrix4f[16];
+ static int matTexPointer = 0;
+
+ static {
+ for (int i = 0; i < matModelV.length; ++i) {
+ matModelV[i] = new Matrix4f();
+ }
+ for (int i = 0; i < matProjV.length; ++i) {
+ matProjV[i] = new Matrix4f();
+ }
+ for (int i = 0; i < matTexV.length; ++i) {
+ matTexV[i] = new Matrix4f();
+ }
+ }
+
+ public static void glClearStack() {
+ matModelV[0].load(matModelV[matModelPointer]);
+ matModelPointer = 0;
+ matProjV[0].load(matProjV[matProjPointer]);
+ matProjPointer = 0;
+ matTexV[0].load(matTexV[matTexPointer]);
+ matTexPointer = 0;
+ }
+
+ private static BufferGL quadsToTrianglesBuffer = null;
+ private static BufferArrayGL currentArray = null;
+
+ private static class DisplayList {
+ private final int id;
+ private BufferArrayGL glarray;
+ private BufferGL glbuffer;
+ private int shaderMode;
+ private int listLength;
+
+ private DisplayList(int id) {
+ this.id = id;
+ this.glarray = null;
+ this.glbuffer = null;
+ this.shaderMode = -1;
+ this.listLength = 0;
+ }
+ }
+
+ private static final HashMap displayLists = new HashMap();
+ private static final HashMap displayListsInitialized = new HashMap();
+
+ public static final int getDisplayListCount() {
+ return displayListsInitialized.size();
+ }
+
+ public static final void glEnable(int p1) {
+ switch (p1) {
+ case GL_DEPTH_TEST:
+ _wglEnable(_wGL_DEPTH_TEST);
+ break;
+ case GL_CULL_FACE:
+ _wglEnable(_wGL_CULL_FACE);
+ break;
+ case GL_BLEND:
+ _wglEnable(_wGL_BLEND);
+ break;
+ case GL_RESCALE_NORMAL:
+ break;
+ case GL_TEXTURE_2D:
+ enableTexture2D = true;
+ break;
+ case GL_LIGHTING:
+ enableLighting = true;
+ break;
+ case GL_ALPHA_TEST:
+ enableAlphaTest = true;
+ break;
+ case GL_FOG:
+ fogEnabled = true;
+ break;
+ case GL_COLOR_MATERIAL:
+ enableColorMaterial = true;
+ break;
+ case GL_POLYGON_OFFSET_FILL:
+ _wglEnable(_wGL_POLYGON_OFFSET_FILL);
+ default:
+ break;
+ }
+ }
+
+ public static final void glShadeModel(int p1) {
+
+ }
+
+ public static final void glClearDepth(float p1) {
+ _wglClearDepth(-p1);
+ }
+
+ public static final void glDepthFunc(int p1) {
+ int f = _wGL_GEQUAL;
+ switch (p1) {
+ case GL_GREATER:
+ f = _wGL_LESS;
+ break;
+ case GL_LEQUAL:
+ f = _wGL_GEQUAL;
+ break;
+ case GL_EQUAL:
+ f = _wGL_EQUAL;
+ default:
+ break;
+ }
+ _wglDepthFunc(f);
+ }
+
+ public static final void glAlphaFunc(int p1, float p2) {
+ alphaThresh = p2;
+ }
+
+ public static final void glCullFace(int p1) {
+ _wglCullFace(p1);
+ }
+
+ public static final void glMatrixMode(int p1) {
+ matrixMode = p1;
+ }
+
+ private static final Matrix4f getMatrix() {
+ switch (matrixMode) {
+ case GL_MODELVIEW:
+ default:
+ return matModelV[matModelPointer];
+ case GL_PROJECTION:
+ return matProjV[matProjPointer];
+ case GL_TEXTURE:
+ return matTexV[matTexPointer];
+ }
+ }
+
+ public static final void glLoadIdentity() {
+ getMatrix().setIdentity();
+ }
+
+ public static final void glViewport(int p1, int p2, int p3, int p4) {
+ _wglViewport(p1, p2, p3, p4);
+ }
+
+ public static final void glClear(int p1) {
+ _wglClear(p1);
+ }
+
+ public static final void glOrtho(double left, double right, double bottom, double top, double zNear, double zFar) {
+ Matrix4f res = getMatrix();
+ res.m00 = (float) (2.0f / (right - left));
+ res.m01 = 0.0f;
+ res.m02 = 0.0f;
+ res.m03 = 0.0f;
+ res.m10 = 0.0f;
+ res.m11 = (float) (2.0f / (top - bottom));
+ res.m12 = 0.0f;
+ res.m13 = 0.0f;
+ res.m20 = 0.0f;
+ res.m21 = 0.0f;
+ res.m22 = (float) (2.0f / (zFar - zNear));
+ res.m23 = 0.0f;
+ res.m30 = (float) (-(right + left) / (right - left));
+ res.m31 = (float) (-(top + bottom) / (top - bottom));
+ res.m32 = (float) ((zFar + zNear) / (zFar - zNear));
+ res.m33 = 1.0f;
+ }
+
+ public static final void glOrtho(float left, float right, float bottom, float top, float zNear, float zFar) {
+ Matrix4f res = getMatrix();
+ res.m00 = 2.0f / (right - left);
+ res.m01 = 0.0f;
+ res.m02 = 0.0f;
+ res.m03 = 0.0f;
+ res.m10 = 0.0f;
+ res.m11 = 2.0f / (top - bottom);
+ res.m12 = 0.0f;
+ res.m13 = 0.0f;
+ res.m20 = 0.0f;
+ res.m21 = 0.0f;
+ res.m22 = 2.0f / (zFar - zNear);
+ res.m23 = 0.0f;
+ res.m30 = -(right + left) / (right - left);
+ res.m31 = -(top + bottom) / (top - bottom);
+ res.m32 = (zFar + zNear) / (zFar - zNear);
+ res.m33 = 1.0f;
+ }
+
+ private static final Vector3f deevis = new Vector3f();
+
+ public static final void glTranslatef(float p1, float p2, float p3) {
+ deevis.set(p1, p2, p3);
+ getMatrix().translate(deevis);
+ if (isCompilingDisplayList) {
+ throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead");
+ }
+ }
+
+ public static final void glClearColor(float p1, float p2, float p3, float p4) {
+ _wglClearColor(p1, p2, p3, p4);
+ }
+
+ public static final void glDisable(int p1) {
+ switch (p1) {
+ case GL_DEPTH_TEST:
+ _wglDisable(_wGL_DEPTH_TEST);
+ break;
+ case GL_CULL_FACE:
+ _wglDisable(_wGL_CULL_FACE);
+ break;
+ case GL_BLEND:
+ _wglDisable(_wGL_BLEND);
+ break;
+ case GL_RESCALE_NORMAL:
+ break;
+ case GL_TEXTURE_2D:
+ enableTexture2D = false;
+ break;
+ case GL_LIGHTING:
+ enableLighting = false;
+ break;
+ case GL_ALPHA_TEST:
+ enableAlphaTest = false;
+ break;
+ case GL_FOG:
+ fogEnabled = false;
+ break;
+ case GL_COLOR_MATERIAL:
+ enableColorMaterial = false;
+ break;
+ case GL_POLYGON_OFFSET_FILL:
+ _wglDisable(_wGL_POLYGON_OFFSET_FILL);
+ default:
+ break;
+ }
+ }
+
+ public static final void glColor4f(float p1, float p2, float p3, float p4) {
+ colorR = p1;
+ colorG = p2;
+ colorB = p3;
+ colorA = p4;
+ }
+
+ public static final int glGetError() {
+ int err = _wglGetError();
+ if (err == _wGL_CONTEXT_LOST_WEBGL)
+ return GL_CONTEXT_LOST_WEBGL;
+ return err;
+ }
+
+ public static final void glFlush() {
+ //...???
+ }
+
+ public static final void glLineWidth(float p1) {
+
+ }
+
+ public static final void glTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8,
+ ByteBuffer p9) {
+ _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGBA8, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9);
+ }
+
+ public static final void glLight(int p1, int p2, FloatBuffer p3) {
+
+ }
+
+ public static final void glLightModel(int p1, FloatBuffer p2) {
+
+ }
+
+ private static Vector4f lightPos0vec0 = new Vector4f();
+ private static Vector4f lightPos1vec0 = new Vector4f();
+ private static Vector4f lightPos0vec = new Vector4f();
+ private static Vector4f lightPos1vec = new Vector4f();
+
+ public static final void copyModelToLightMatrix() {
+ lightPos0vec0.set(lightPos0vec);
+ lightPos1vec0.set(lightPos1vec);
+ lightPos0vec.set(0.2f, 1.0f, -0.7f, 0.0f);
+ lightPos0vec.normalise();
+ lightPos1vec.set(-0.2f, 1.0f, 0.7f, 0.0f);
+ lightPos1vec.normalise();
+ Matrix4f.transform(matModelV[matModelPointer], lightPos0vec, lightPos0vec).normalise();
+ Matrix4f.transform(matModelV[matModelPointer], lightPos1vec, lightPos1vec).normalise();
+ }
+
+ public static final void flipLightMatrix() {
+ lightPos0vec.x = -lightPos0vec.x;
+ lightPos1vec.x = -lightPos1vec.x;
+ lightPos0vec.y = -lightPos0vec.y;
+ lightPos1vec.y = -lightPos1vec.y;
+ lightPos0vec.z = -lightPos0vec.z;
+ lightPos1vec.z = -lightPos1vec.z;
+ }
+
+ public static final void revertLightMatrix() {
+ lightPos0vec.set(lightPos0vec0);
+ lightPos1vec.set(lightPos1vec0);
+ }
+
+ public static final void glPushMatrix() {
+ switch (matrixMode) {
+ case GL_MODELVIEW:
+ default:
+ if (matModelPointer < matModelV.length - 1) {
+ ++matModelPointer;
+ matModelV[matModelPointer].load(matModelV[matModelPointer - 1]);
+ } else {
+ System.err.println("modelview matrix stack overflow");
+ }
+ break;
+ case GL_PROJECTION:
+ if (matProjPointer < matProjV.length - 1) {
+ ++matProjPointer;
+ matProjV[matProjPointer].load(matProjV[matProjPointer - 1]);
+ } else {
+ System.err.println("projection matrix stack overflow");
+ }
+ break;
+ case GL_TEXTURE:
+ if (matTexPointer < matTexV.length - 1) {
+ ++matTexPointer;
+ matTexV[matTexPointer].load(matTexV[matTexPointer - 1]);
+ } else {
+ System.err.println("texture matrix stack overflow");
+ }
+ break;
+ }
+ }
+
+ private static final float toRad = 0.0174532925f;
+
+ public static final void glRotatef(float p1, float p2, float p3, float p4) {
+ deevis.set(p2, p3, p4);
+ getMatrix().rotate(p1 * toRad, deevis);
+ if (isCompilingDisplayList) {
+ throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead");
+ }
+ }
+
+ public static final void glPopMatrix() {
+ switch (matrixMode) {
+ case GL_MODELVIEW:
+ default:
+ if (matModelPointer > 0) {
+ --matModelPointer;
+ } else {
+ System.err.println("modelview matrix stack underflow");
+ }
+ break;
+ case GL_PROJECTION:
+ if (matProjPointer > 0) {
+ --matProjPointer;
+ } else {
+ System.err.println("projection matrix stack underflow");
+ }
+ break;
+ case GL_TEXTURE:
+ if (matTexPointer > 0) {
+ --matTexPointer;
+ } else {
+ System.err.println("texture matrix stack underflow");
+ }
+ break;
+ }
+ }
+
+ public static final void glColorMaterial(int p1, int p2) {
+
+ }
+
+ public static final void glGetFloat(int p1, FloatBuffer p2) {
+ switch (p1) {
+ case GL_MODELVIEW_MATRIX:
+ default:
+ matModelV[matModelPointer].store(p2);
+ break;
+ case GL_PROJECTION_MATRIX:
+ matProjV[matProjPointer].store(p2);
+ break;
+ }
+ }
+
+ public static final void glGetInteger(int p1, int[] p2) {
+ if (p1 == GL_VIEWPORT) {
+ _wglGetParameter(_wGL_VIEWPORT, 4, p2);
+ }
+ }
+
+ public static final void glScalef(float p1, float p2, float p3) {
+ deevis.set(p1, p2, p3);
+ getMatrix().scale(deevis);
+ if (isCompilingDisplayList) {
+ throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead");
+ }
+ }
+
+ public static final void glBlendFunc(int p1, int p2) {
+ fogPremultiply = (p1 == GL_ONE && p2 == GL_ONE_MINUS_SRC_ALPHA);
+ _wglBlendFunc(p1, p2);
+ }
+
+ public static final void glBlendFuncSeparate(int p1, int p2, int p3, int p4) {
+ fogPremultiply = (p3 == GL_ONE && p4 == GL_ONE_MINUS_SRC_ALPHA);
+ _wglBlendFuncSeparate(p1, p2, p3, p4);
+ }
+
+ public static final void glDepthMask(boolean p1) {
+ _wglDepthMask(p1);
+ }
+
+ public static final void glColorMask(boolean p1, boolean p2, boolean p3, boolean p4) {
+ _wglColorMask(p1, p2, p3, p4);
+ }
+
+ public static final void glBindTexture(int p1, int p2) {
+ TextureGL t = texObjects.get(p2);
+ _wglBindTexture(_wGL_TEXTURE_2D, t);
+ }
+
+ public static final void glCopyTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {
+ _wglCopyTexSubImage2D(_wGL_TEXTURE_2D, p2, p3, p4, p5, p6, p7, p8);
+ }
+
+ public static final void glTexParameteri(int p1, int p2, int p3) {
+ if(p3 == RealOpenGLEnums.GL_CLAMP_TO_EDGE || p3 == 10496) {
+ p3 = _wGL_CLAMP;
+ }
+ _wglTexParameteri(p1, p2, p3);
+ }
+
+ public static final void glTexParameterf(int p1, int p2, float p3) {
+ int pp1 = 0;
+ switch (p1) {
+ default:
+ case GL_TEXTURE_2D:
+ pp1 = _wGL_TEXTURE_2D;
+ break;
+ // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break;
+ }
+ int pp2 = 0;
+ switch (p2) {
+ default:
+ case GL_TEXTURE_MAX_ANISOTROPY:
+ pp2 = _wGL_TEXTURE_MAX_ANISOTROPY;
+ break;
+ }
+ _wglTexParameterf(pp1, pp2, p3);
+ }
+
+ public static final void glLogicOp(int p1) {
+
+ }
+
+ public static final void glNormal3f(float p1, float p2, float p3) {
+ float len = (float) Math.sqrt(p1 * p1 + p2 * p2 + p3 * p3);
+ normalX = p1 / len;
+ normalY = p2 / len;
+ normalZ = p3 / len;
+ }
+
+ public static final int glGenLists(int p1) {
+ int base = displayListId + 1;
+ for (int i = 0; i < p1; i++) {
+ int id = ++displayListId;
+ displayLists.put(id, new DisplayList(id));
+ }
+ return base;
+ }
+
+ public static final void _wglBindVertexArray0(BufferArrayGL p1) {
+ currentArray = p1;
+ _wglBindVertexArray(p1);
+ }
+
+ private static int displayListId = 0;
+
+ public static final void glCallList(int p1) {
+ if (!isCompilingDisplayList) {
+ DisplayList d = displayListsInitialized.get(p1);
+ if (d != null && d.listLength > 0) {
+ bindTheShader(d.shaderMode | getShaderModeFlag1());
+ _wglBindVertexArray0(d.glarray);
+ _wglDrawQuadArrays(0, d.listLength);
+ shader.unuseProgram();
+ vertexDrawn += d.listLength * 6 / 4;
+ triangleDrawn += d.listLength / 2;
+ }
+ }
+ }
+
+ public static final void glNewList(int p1, int p2) {
+ if (!isCompilingDisplayList) {
+ compilingDisplayList = displayLists.get(p1);
+ if (compilingDisplayList != null) {
+ compilingDisplayList.shaderMode = -1;
+ compilingDisplayList.listLength = 0;
+ isCompilingDisplayList = true;
+ }
+ }
+ }
+
+ public static final void glEndList() {
+ if (isCompilingDisplayList) {
+ isCompilingDisplayList = false;
+ Object upload = _wGetLowLevelBuffersAppended();
+ int l = _wArrayByteLength(upload);
+ if (l > 0) {
+ if (compilingDisplayList.glbuffer == null) {
+ displayListsInitialized.put(compilingDisplayList.id, compilingDisplayList);
+ compilingDisplayList.glarray = _wglCreateVertexArray();
+ compilingDisplayList.glbuffer = _wglCreateBuffer();
+ FixedFunctionShader f = FixedFunctionShader.instance(compilingDisplayList.shaderMode);
+ _wglBindVertexArray0(compilingDisplayList.glarray);
+ _wglBindBuffer(_wGL_ARRAY_BUFFER, compilingDisplayList.glbuffer);
+ f.setupArrayForProgram();
+ }
+ _wglBindBuffer(_wGL_ARRAY_BUFFER, compilingDisplayList.glbuffer);
+ _wglBufferData(_wGL_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW);
+ bytesUploaded += l;
+ }
+ }
+ }
+
+ public static final void glColor3f(float p1, float p2, float p3) {
+ colorR = p1;
+ colorG = p2;
+ colorB = p3;
+ colorA = 1.0f;
+ }
+
+ public static final void glTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8,
+ IntBuffer p9) {
+ /*
+ * int pp2 = 0; switch(p3) { default: case GL_RGBA: pp2 = _wGL_RGBA; break; case
+ * GL_BGRA: pp2 = _wGL_BGRA; break; } int pp3 = 0; switch(p7) { default: case
+ * GL_RGBA: pp3 = _wGL_RGBA; break; case GL_BGRA: pp3 = _wGL_BGRA; break; }
+ */
+ bytesUploaded += p9.remaining() * 4;
+ _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGBA8, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9);
+ }
+
+ public static final void glTexImage2D_2(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8,
+ IntBuffer p9) {
+ bytesUploaded += p9.remaining() * 4;
+ _wglTexImage2D(_wGL_TEXTURE_2D, p2, _wGL_RGB8, p4, p5, p6, _wGL_RGB, _wGL_UNSIGNED_BYTE, p9);
+ }
+
+ public static final void glTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8,
+ IntBuffer p9) {
+ int pp1 = 0;
+ switch (p1) {
+ default:
+ case GL_TEXTURE_2D:
+ pp1 = _wGL_TEXTURE_2D;
+ break;
+ // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break;
+ }
+ /*
+ * int pp3 = 0; switch(p7) { default: case GL_RGBA: pp3 = _wGL_RGBA; break; case
+ * GL_BGRA: pp3 = _wGL_BGRA; break; }
+ */
+ bytesUploaded += p9.remaining() * 4;
+ _wglTexSubImage2D(pp1, p2, p3, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9);
+ }
+
+ public static final void glDeleteTextures(int p1) {
+ _wglDeleteTextures(texObjects.free(p1));
+ }
+
+ public static final void glPolygonOffset(float p1, float p2) {
+ _wglPolygonOffset(p1, p2);
+ }
+
+ public static final void glCallLists(IntBuffer p1) {
+ while (p1.hasRemaining()) {
+ glCallList(p1.get());
+ }
+ }
+
+ public static final void glEnableVertexAttrib(int p1) {
+ switch (p1) {
+ case GL_COLOR_ARRAY:
+ enableColorArray = true;
+ break;
+ case GL_NORMAL_ARRAY:
+ enableNormalArray = true;
+ break;
+ case GL_TEXTURE_COORD_ARRAY:
+ enableTex0Array = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ public static final void glDisableVertexAttrib(int p1) {
+ switch (p1) {
+ case GL_COLOR_ARRAY:
+ enableColorArray = false;
+ break;
+ case GL_NORMAL_ARRAY:
+ enableNormalArray = false;
+ break;
+ case GL_TEXTURE_COORD_ARRAY:
+ enableTex0Array = false;
+ break;
+ default:
+ break;
+ }
+ }
+
+ private static final int getShaderModeFlag0() {
+ int mode = 0;
+ mode = (mode | (enableColorArray ? FixedFunctionShader.COLOR : 0));
+ mode = (mode | (enableNormalArray ? FixedFunctionShader.NORMAL : 0));
+ mode = (mode | (enableTex0Array ? FixedFunctionShader.TEXTURE0 : 0));
+ return mode;
+ }
+
+ private static final int getShaderModeFlag1() {
+ int mode = 0;
+ mode = (mode | ((enableColorMaterial && enableLighting) ? FixedFunctionShader.LIGHTING : 0));
+ mode = (mode | (fogEnabled ? FixedFunctionShader.FOG : 0));
+ mode = (mode | (enableAlphaTest ? FixedFunctionShader.ALPHATEST : 0));
+ mode = (mode | (enableTexture2D ? FixedFunctionShader.UNIT0 : 0));
+ return mode;
+ }
+
+ private static final int getShaderModeFlag() {
+ int mode = 0;
+ mode = (mode | (enableColorArray ? FixedFunctionShader.COLOR : 0));
+ mode = (mode | (enableNormalArray ? FixedFunctionShader.NORMAL : 0));
+ mode = (mode | (enableTex0Array ? FixedFunctionShader.TEXTURE0 : 0));
+ mode = (mode | ((enableColorMaterial && enableLighting) ? FixedFunctionShader.LIGHTING : 0));
+ mode = (mode | (fogEnabled ? FixedFunctionShader.FOG : 0));
+ mode = (mode | (enableAlphaTest ? FixedFunctionShader.ALPHATEST : 0));
+ mode = (mode | (enableTexture2D ? FixedFunctionShader.UNIT0 : 0));
+ return mode;
+ }
+
+ private static FixedFunctionShader shader = null;
+
+ private static final void bindTheShader() {
+ bindTheShader(getShaderModeFlag());
+ }
+
+ private static final void bindTheShader(int mode) {
+ FixedFunctionShader s = shader = FixedFunctionShader.instance(mode);
+ s.useProgram();
+ if (enableAlphaTest) {
+ s.setAlphaTest(alphaThresh);
+ }
+ s.setColor(colorR, colorG, colorB, colorA);
+ if (fogEnabled) {
+ s.setFogMode((fogPremultiply ? 2 : 0) + fogMode);
+ s.setFogColor(fogColorR, fogColorG, fogColorB, fogColorA);
+ s.setFogDensity(fogDensity);
+ s.setFogStartEnd(fogStart, fogEnd);
+ }
+ s.setModelMatrix(matModelV[matModelPointer]);
+ s.setProjectionMatrix(matProjV[matProjPointer]);
+ s.setTextureMatrix(matTexV[matTexPointer]);
+ if (enableColorMaterial && enableLighting) {
+ s.setNormal(normalX, normalY, normalZ);
+ s.setLightPositions(lightPos0vec, lightPos1vec);
+ }
+ s.setTex0Coords(tex0X, tex0Y);
+ }
+
+ private static Object blankUploadArray = _wCreateLowLevelIntBuffer(525000);
+
+ public static final void glDrawArrays(int p1, int p2, int p3, Object buffer) {
+ if (isCompilingDisplayList) {
+ if (p1 == GL_QUADS) {
+ if (compilingDisplayList.shaderMode == -1) {
+ compilingDisplayList.shaderMode = getShaderModeFlag0();
+ } else {
+ if (compilingDisplayList.shaderMode != getShaderModeFlag0()) {
+ System.err.println("vertex format inconsistent in display list");
+ }
+ }
+ compilingDisplayList.listLength += p3;
+ _wAppendLowLevelBuffer(buffer);
+ } else {
+ System.err.println("only GL_QUADS supported in a display list");
+ }
+ } else {
+ bytesUploaded += _wArrayByteLength(buffer);
+ vertexDrawn += p3;
+
+ bindTheShader();
+
+ _wglBindVertexArray0(shader.genericArray);
+ _wglBindBuffer(_wGL_ARRAY_BUFFER, shader.genericBuffer);
+ if (!shader.bufferIsInitialized) {
+ shader.bufferIsInitialized = true;
+ _wglBufferData(_wGL_ARRAY_BUFFER, blankUploadArray, _wGL_DYNAMIC_DRAW);
+ }
+ _wglBufferSubData(_wGL_ARRAY_BUFFER, 0, buffer);
+
+ if (p1 == GL_QUADS) {
+ _wglDrawQuadArrays(p2, p3);
+ triangleDrawn += p3 / 2;
+ } else {
+ int drawMode = 0;
+ switch (p1) {
+ default:
+ case GL_TRIANGLES:
+ drawMode = _wGL_TRIANGLES;
+ triangleDrawn += p3 / 3;
+ break;
+ case GL_TRIANGLE_STRIP:
+ drawMode = _wGL_TRIANGLE_STRIP;
+ triangleDrawn += p3 - 2;
+ break;
+ case GL_TRIANGLE_FAN:
+ drawMode = _wGL_TRIANGLE_FAN;
+ triangleDrawn += p3 - 2;
+ break;
+ case GL_LINE_STRIP:
+ drawMode = _wGL_LINE_STRIP;
+ triangleDrawn += p3 - 1;
+ break;
+ case GL_LINES:
+ drawMode = _wGL_LINES;
+ triangleDrawn += p3 / 2;
+ break;
+ }
+ _wglDrawArrays(drawMode, p2, p3);
+ }
+
+ shader.unuseProgram();
+
+ }
+ }
+
+ private static final void _wglDrawQuadArrays(int p2, int p3) {
+ if (quadsToTrianglesBuffer == null) {
+ IntBuffer upload = isWebGL ? IntBuffer.wrap(new int[98400 / 2])
+ : ByteBuffer.allocateDirect(98400 * 2).order(ByteOrder.nativeOrder()).asIntBuffer();
+ for (int i = 0; i < 16384; ++i) {
+ int v1 = i * 4;
+ int v2 = i * 4 + 1;
+ int v3 = i * 4 + 2;
+ int v4 = i * 4 + 3;
+ upload.put(v1 | (v2 << 16));
+ upload.put(v4 | (v2 << 16));
+ upload.put(v3 | (v4 << 16));
+ }
+ upload.flip();
+ quadsToTrianglesBuffer = _wglCreateBuffer();
+ _wglBindBuffer(_wGL_ELEMENT_ARRAY_BUFFER, quadsToTrianglesBuffer);
+ _wglBufferData0(_wGL_ELEMENT_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW);
+ }
+ if (!currentArray.isQuadBufferBound) {
+ currentArray.isQuadBufferBound = true;
+ _wglBindBuffer(_wGL_ELEMENT_ARRAY_BUFFER, quadsToTrianglesBuffer);
+ }
+ _wglDrawElements(_wGL_TRIANGLES, p3 * 6 / 4, _wGL_UNSIGNED_SHORT, p2 * 6 / 4);
+ }
+
+ private static BufferArrayGL occlusion_vao = null;
+ private static BufferGL occlusion_vbo = null;
+ private static ProgramGL occlusion_program = null;
+ private static UniformGL occlusion_matrix_m = null;
+ private static UniformGL occlusion_matrix_p = null;
+
+ private static final void initializeOcclusionObjects() {
+ occlusion_vao = _wglCreateVertexArray();
+ occlusion_vbo = _wglCreateBuffer();
+
+ IntBuffer upload = (isWebGL ? IntBuffer.wrap(new int[108])
+ : ByteBuffer.allocateDirect(108 << 2).order(ByteOrder.nativeOrder()).asIntBuffer());
+ float[] verts = new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
+ 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f,
+ 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
+ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
+ 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f };
+ for (int i = 0; i < verts.length; i++) {
+ upload.put(Float.floatToRawIntBits(verts[i]));
+ }
+ upload.flip();
+
+ _wglBindVertexArray(occlusion_vao);
+ _wglBindBuffer(_wGL_ARRAY_BUFFER, occlusion_vbo);
+ _wglBufferData0(_wGL_ARRAY_BUFFER, upload, _wGL_STATIC_DRAW);
+ _wglEnableVertexAttribArray(0);
+ _wglVertexAttribPointer(0, 3, _wGL_FLOAT, false, 12, 0);
+
+ ShaderGL vert = _wglCreateShader(_wGL_VERTEX_SHADER);
+ ShaderGL frag = _wglCreateShader(_wGL_FRAGMENT_SHADER);
+
+ String src = fileContents("/glsl/occl.glsl");
+ _wglShaderSource(vert, _wgetShaderHeader() + "\n#define CC_VERT\n" + src);
+ _wglShaderSource(frag, _wgetShaderHeader() + "\n#define CC_FRAG\n" + src);
+
+ _wglCompileShader(vert);
+ if (!_wglGetShaderCompiled(vert))
+ System.err.println(("\n" + _wglGetShaderInfoLog(vert)).replace("\n", "\n[/glsl/occl.glsl][VERT] ") + "\n");
+
+ _wglCompileShader(frag);
+ if (!_wglGetShaderCompiled(frag))
+ System.err.println(("\n" + _wglGetShaderInfoLog(frag)).replace("\n", "\n[/glsl/occl.glsl][FRAG] ") + "\n");
+
+ occlusion_program = _wglCreateProgram();
+
+ _wglAttachShader(occlusion_program, vert);
+ _wglAttachShader(occlusion_program, frag);
+ _wglLinkProgram(occlusion_program);
+ _wglDetachShader(occlusion_program, vert);
+ _wglDetachShader(occlusion_program, frag);
+ _wglDeleteShader(vert);
+ _wglDeleteShader(frag);
+
+ if (!_wglGetProgramLinked(occlusion_program))
+ System.err.println(
+ ("\n\n" + _wglGetProgramInfoLog(occlusion_program)).replace("\n", "\n[/glsl/occl.glsl][LINKER] "));
+
+ _wglUseProgram(occlusion_program);
+ occlusion_matrix_m = _wglGetUniformLocation(occlusion_program, "matrix_m");
+ occlusion_matrix_p = _wglGetUniformLocation(occlusion_program, "matrix_p");
+
+ }
+
+ private static final GLObjectMap queryObjs = new GLObjectMap(256);
+
+ public static final int glCreateQuery() {
+ return queryObjs.register(_wglCreateQuery());
+ }
+
+ public static final void glBeginQuery(int obj) {
+ _wglBeginQuery(_wGL_ANY_SAMPLES_PASSED, queryObjs.get(obj));
+ }
+
+ public static final void glDeleteQuery(int obj) {
+ _wglDeleteQuery(queryObjs.free(obj));
+ }
+
+ private static final Matrix4f cachedOcclusionP = (Matrix4f) (new Matrix4f()).setZero();
+ private static float[] occlusionModel = new float[16];
+ private static float[] occlusionProj = new float[16];
+
+ public static final void glBindOcclusionBB() {
+ if (occlusion_vao == null)
+ initializeOcclusionObjects();
+ _wglUseProgram(occlusion_program);
+ _wglBindVertexArray(occlusion_vao);
+ if (!cachedOcclusionP.equals(matProjV[matProjPointer])) {
+ cachedOcclusionP.load(matProjV[matProjPointer]);
+ cachedOcclusionP.store(occlusionProj);
+ _wglUniformMat4fv(occlusion_matrix_p, occlusionProj);
+ }
+ }
+
+ public static final void glEndOcclusionBB() {
+
+ }
+
+ public static final void glDrawOcclusionBB(float posX, float posY, float posZ, float sizeX, float sizeY,
+ float sizeZ) {
+ glPushMatrix();
+ glTranslatef(posX - sizeX * 0.01f, posY - sizeY * 0.01f, posZ - sizeZ * 0.01f);
+ glScalef(sizeX * 1.02f, sizeY * 1.02f, sizeZ * 1.02f);
+ matModelV[matModelPointer].store(occlusionModel);
+ _wglUniformMat4fv(occlusion_matrix_m, occlusionModel);
+ _wglDrawArrays(_wGL_TRIANGLES, 0, 36);
+ glPopMatrix();
+
+ }
+
+ public static final void glEndQuery() {
+ _wglEndQuery(_wGL_ANY_SAMPLES_PASSED);
+ }
+
+ public static final boolean glGetQueryResult(int obj) {
+ QueryGL q = queryObjs.get(obj);
+ return _wglGetQueryObjecti(q, _wGL_QUERY_RESULT) > 0;
+ }
+
+ public static final boolean glGetQueryResultAvailable(int obj) {
+ QueryGL q = queryObjs.get(obj);
+ return _wglGetQueryObjecti(q, _wGL_QUERY_RESULT_AVAILABLE) > 0;
+ }
+
+ public static final int glGenTextures() {
+ return texObjects.register(_wglGenTextures());
+ }
+
+ public static final void glTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8,
+ ByteBuffer p9) {
+ int pp1 = 0;
+ switch (p1) {
+ default:
+ case GL_TEXTURE_2D:
+ pp1 = _wGL_TEXTURE_2D;
+ break;
+ // case GL_TEXTURE_3D: pp1 = _wGL_TEXTURE_3D; break;
+ }
+ /*
+ * int pp3 = 0; switch(p7) { default: case GL_RGBA: pp3 = _wGL_RGBA; break; case
+ * GL_BGRA: pp3 = _wGL_BGRA; break; }
+ */
+ bytesUploaded += p9.remaining();
+ _wglTexSubImage2D(pp1, p2, p3, p4, p5, p6, _wGL_RGBA, _wGL_UNSIGNED_BYTE, p9);
+ }
+
+ public static final void glFogi(int p1, int p2) {
+ if (p1 == GL_FOG_MODE) {
+ switch (p2) {
+ default:
+ case GL_LINEAR:
+ fogMode = 1;
+ break;
+ case GL_EXP:
+ fogMode = 2;
+ break;
+ }
+ }
+ }
+
+ public static final void glFogf(int p1, float p2) {
+ switch (p1) {
+ case GL_FOG_START:
+ fogStart = p2;
+ break;
+ case GL_FOG_END:
+ fogEnd = p2;
+ break;
+ case GL_FOG_DENSITY:
+ fogDensity = p2;
+ break;
+ default:
+ break;
+ }
+ }
+
+ public static final void glFog(int p1, FloatBuffer p2) {
+ if (p1 == GL_FOG_COLOR) {
+ fogColorR = p2.get();
+ fogColorG = p2.get();
+ fogColorB = p2.get();
+ fogColorA = p2.get();
+ }
+ }
+
+ public static final void glDeleteLists(int p1, int p2) {
+ for (int i = 0; i < p2; i++) {
+ DisplayList d = displayListsInitialized.remove(p1 + i);
+ if (d != null) {
+ _wglDeleteVertexArray(d.glarray);
+ _wglDeleteBuffer(d.glbuffer);
+ }
+ displayLists.remove(p1 + i);
+ }
+ }
+
+ public static final void glMultiTexCoord2f(int p1, float p2, float p3) {
+ tex0X = p2;
+ tex0Y = p3;
+ }
+
+ private static Matrix4f unprojA = new Matrix4f();
+ private static Matrix4f unprojB = new Matrix4f();
+ private static Vector4f unprojC = new Vector4f();
+
+ public static final void gluUnProject(float p1, float p2, float p3, FloatBuffer p4, FloatBuffer p5, int[] p6,
+ FloatBuffer p7) {
+ unprojA.load(p4);
+ unprojB.load(p5);
+ Matrix4f.mul(unprojA, unprojB, unprojB);
+ unprojB.invert();
+ unprojC.set(((p1 - (float) p6[0]) / (float) p6[2]) * 2f - 1f, ((p2 - (float) p6[1]) / (float) p6[3]) * 2f - 1f,
+ p3, 1.0f);
+ Matrix4f.transform(unprojB, unprojC, unprojC);
+ p7.put(unprojC.x / unprojC.w);
+ p7.put(unprojC.y / unprojC.w);
+ p7.put(unprojC.z / unprojC.w);
+ }
+
+ public static final void gluPerspective(float fovy, float aspect, float zNear, float zFar) {
+ Matrix4f res = getMatrix();
+ float cotangent = (float) Math.cos(fovy * toRad * 0.5f) / (float) Math.sin(fovy * toRad * 0.5f);
+ res.m00 = cotangent / aspect;
+ res.m01 = 0.0f;
+ res.m02 = 0.0f;
+ res.m03 = 0.0f;
+ res.m10 = 0.0f;
+ res.m11 = cotangent;
+ res.m12 = 0.0f;
+ res.m13 = 0.0f;
+ res.m20 = 0.0f;
+ res.m21 = 0.0f;
+ res.m22 = (zFar + zNear) / (zFar - zNear);
+ res.m23 = -1.0f;
+ res.m30 = 0.0f;
+ res.m31 = 0.0f;
+ res.m32 = 2.0f * zFar * zNear / (zFar - zNear);
+ res.m33 = 0.0f;
+ }
+
+ public static final void gluPerspectiveFlat(float fovy, float aspect, float zNear, float zFar) {
+ Matrix4f res = getMatrix();
+ float cotangent = (float) Math.cos(fovy * toRad * 0.5f) / (float) Math.sin(fovy * toRad * 0.5f);
+ res.m00 = cotangent / aspect;
+ res.m01 = 0.0f;
+ res.m02 = 0.0f;
+ res.m03 = 0.0f;
+ res.m10 = 0.0f;
+ res.m11 = cotangent;
+ res.m12 = 0.0f;
+ res.m13 = 0.0f;
+ res.m20 = 0.0f;
+ res.m21 = 0.0f;
+ res.m22 = ((zFar + zNear) / (zFar - zNear)) * 0.001f;
+ res.m23 = -1.0f;
+ res.m30 = 0.0f;
+ res.m31 = 0.0f;
+ res.m32 = 2.0f * zFar * zNear / (zFar - zNear);
+ res.m33 = 0.0f;
+ }
+
+ public static final String gluErrorString(int p1) {
+ switch (p1) {
+ case GL_INVALID_ENUM:
+ return "GL_INVALID_ENUM";
+ case GL_INVALID_VALUE:
+ return "GL_INVALID_VALUE";
+ case GL_INVALID_OPERATION:
+ return "GL_INVALID_OPERATION";
+ case GL_OUT_OF_MEMORY:
+ return "GL_OUT_OF_MEMORY";
+ case GL_CONTEXT_LOST_WEBGL:
+ return "CONTEXT_LOST_WEBGL";
+ default:
+ return "Unknown Error";
+ }
+ }
+
+ private static long lastBandwidthReset = 0l;
+ private static int lastBandwidth = 0;
+
+ public static final int getBitsPerSecond() {
+ if (System.currentTimeMillis() - lastBandwidthReset > 1000) {
+ lastBandwidthReset = System.currentTimeMillis();
+ lastBandwidth = bytesUploaded * 8;
+ bytesUploaded = 0;
+ }
+ return lastBandwidth;
+ }
+
+ public static final int getVertexesPerSecond() {
+ int ret = vertexDrawn;
+ vertexDrawn = 0;
+ return ret;
+ }
+
+ public static final int getTrianglesPerSecond() {
+ int ret = triangleDrawn;
+ triangleDrawn = 0;
+ return ret;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/lwjgl/opengl/GL11.java b/src/main/java/org/lwjgl/opengl/GL11.java
new file mode 100644
index 0000000..0205118
--- /dev/null
+++ b/src/main/java/org/lwjgl/opengl/GL11.java
@@ -0,0 +1,9 @@
+package org.lwjgl.opengl;
+
+public class GL11 extends EaglerAdapterGL30 {
+
+ public static void glPixelStorei(int glUnpackAlignment, int i) {
+ webgl.pixelStorei(glUnpackAlignment, i);
+ }
+
+}
diff --git a/src/main/java/org/lwjgl/opengl/GL12.java b/src/main/java/org/lwjgl/opengl/GL12.java
new file mode 100644
index 0000000..4b04504
--- /dev/null
+++ b/src/main/java/org/lwjgl/opengl/GL12.java
@@ -0,0 +1,5 @@
+package org.lwjgl.opengl;
+
+public class GL12 extends GL11 {
+
+}
diff --git a/src/main/java/org/lwjgl/opengl/RealOpenGLEnums.java b/src/main/java/org/lwjgl/opengl/RealOpenGLEnums.java
new file mode 100644
index 0000000..75a633b
--- /dev/null
+++ b/src/main/java/org/lwjgl/opengl/RealOpenGLEnums.java
@@ -0,0 +1,2417 @@
+package org.lwjgl.opengl;
+
+public class RealOpenGLEnums {
+
+ // Field descriptor #544 I
+ public static final int GL_ACCUM = 256;
+
+ // Field descriptor #544 I
+ public static final int GL_LOAD = 257;
+
+ // Field descriptor #544 I
+ public static final int GL_RETURN = 258;
+
+ // Field descriptor #544 I
+ public static final int GL_MULT = 259;
+
+ // Field descriptor #544 I
+ public static final int GL_ADD = 260;
+
+ // Field descriptor #544 I
+ public static final int GL_NEVER = 512;
+
+ // Field descriptor #544 I
+ public static final int GL_LESS = 513;
+
+ // Field descriptor #544 I
+ public static final int GL_EQUAL = 514;
+
+ // Field descriptor #544 I
+ public static final int GL_LEQUAL = 515;
+
+ // Field descriptor #544 I
+ public static final int GL_GREATER = 516;
+
+ // Field descriptor #544 I
+ public static final int GL_NOTEQUAL = 517;
+
+ // Field descriptor #544 I
+ public static final int GL_GEQUAL = 518;
+
+ // Field descriptor #544 I
+ public static final int GL_ALWAYS = 519;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_BIT = 1;
+
+ // Field descriptor #544 I
+ public static final int GL_POINT_BIT = 2;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_BIT = 4;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_BIT = 8;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_STIPPLE_BIT = 16;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MODE_BIT = 32;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHTING_BIT = 64;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG_BIT = 128;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_BUFFER_BIT = 256;
+
+ // Field descriptor #544 I
+ public static final int GL_ACCUM_BUFFER_BIT = 512;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_BUFFER_BIT = 1024;
+
+ // Field descriptor #544 I
+ public static final int GL_VIEWPORT_BIT = 2048;
+
+ // Field descriptor #544 I
+ public static final int GL_TRANSFORM_BIT = 4096;
+
+ // Field descriptor #544 I
+ public static final int GL_ENABLE_BIT = 8192;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_BUFFER_BIT = 16384;
+
+ // Field descriptor #544 I
+ public static final int GL_HINT_BIT = 32768;
+
+ // Field descriptor #544 I
+ public static final int GL_EVAL_BIT = 65536;
+
+ // Field descriptor #544 I
+ public static final int GL_LIST_BIT = 131072;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_BIT = 262144;
+
+ // Field descriptor #544 I
+ public static final int GL_SCISSOR_BIT = 524288;
+
+ // Field descriptor #544 I
+ public static final int GL_ALL_ATTRIB_BITS = 1048575;
+
+ // Field descriptor #544 I
+ public static final int GL_POINTS = 0;
+
+ // Field descriptor #544 I
+ public static final int GL_LINES = 1;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_LOOP = 2;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_STRIP = 3;
+
+ // Field descriptor #544 I
+ public static final int GL_TRIANGLES = 4;
+
+ // Field descriptor #544 I
+ public static final int GL_TRIANGLE_STRIP = 5;
+
+ // Field descriptor #544 I
+ public static final int GL_TRIANGLE_FAN = 6;
+
+ // Field descriptor #544 I
+ public static final int GL_QUADS = 7;
+
+ // Field descriptor #544 I
+ public static final int GL_QUAD_STRIP = 8;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON = 9;
+
+ // Field descriptor #544 I
+ public static final int GL_ZERO = 0;
+
+ // Field descriptor #544 I
+ public static final int GL_ONE = 1;
+
+ // Field descriptor #544 I
+ public static final int GL_SRC_COLOR = 768;
+
+ // Field descriptor #544 I
+ public static final int GL_ONE_MINUS_SRC_COLOR = 769;
+
+ // Field descriptor #544 I
+ public static final int GL_SRC_ALPHA = 770;
+
+ // Field descriptor #544 I
+ public static final int GL_ONE_MINUS_SRC_ALPHA = 771;
+
+ // Field descriptor #544 I
+ public static final int GL_DST_ALPHA = 772;
+
+ // Field descriptor #544 I
+ public static final int GL_ONE_MINUS_DST_ALPHA = 773;
+
+ // Field descriptor #544 I
+ public static final int GL_DST_COLOR = 774;
+
+ // Field descriptor #544 I
+ public static final int GL_ONE_MINUS_DST_COLOR = 775;
+
+ // Field descriptor #544 I
+ public static final int GL_SRC_ALPHA_SATURATE = 776;
+
+ // Field descriptor #544 I
+ public static final int GL_CONSTANT_COLOR = 32769;
+
+ // Field descriptor #544 I
+ public static final int GL_ONE_MINUS_CONSTANT_COLOR = 32770;
+
+ // Field descriptor #544 I
+ public static final int GL_CONSTANT_ALPHA = 32771;
+
+ // Field descriptor #544 I
+ public static final int GL_ONE_MINUS_CONSTANT_ALPHA = 32772;
+
+ // Field descriptor #544 I
+ public static final int GL_TRUE = 1;
+
+ // Field descriptor #544 I
+ public static final int GL_FALSE = 0;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIP_PLANE0 = 12288;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIP_PLANE1 = 12289;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIP_PLANE2 = 12290;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIP_PLANE3 = 12291;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIP_PLANE4 = 12292;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIP_PLANE5 = 12293;
+
+ // Field descriptor #544 I
+ public static final int GL_BYTE = 5120;
+
+ // Field descriptor #544 I
+ public static final int GL_UNSIGNED_BYTE = 5121;
+
+ // Field descriptor #544 I
+ public static final int GL_SHORT = 5122;
+
+ // Field descriptor #544 I
+ public static final int GL_UNSIGNED_SHORT = 5123;
+
+ // Field descriptor #544 I
+ public static final int GL_INT = 5124;
+
+ // Field descriptor #544 I
+ public static final int GL_UNSIGNED_INT = 5125;
+
+ // Field descriptor #544 I
+ public static final int GL_FLOAT = 5126;
+
+ // Field descriptor #544 I
+ public static final int GL_2_BYTES = 5127;
+
+ // Field descriptor #544 I
+ public static final int GL_3_BYTES = 5128;
+
+ // Field descriptor #544 I
+ public static final int GL_4_BYTES = 5129;
+
+ // Field descriptor #544 I
+ public static final int GL_DOUBLE = 5130;
+
+ // Field descriptor #544 I
+ public static final int GL_NONE = 0;
+
+ // Field descriptor #544 I
+ public static final int GL_FRONT_LEFT = 1024;
+
+ // Field descriptor #544 I
+ public static final int GL_FRONT_RIGHT = 1025;
+
+ // Field descriptor #544 I
+ public static final int GL_BACK_LEFT = 1026;
+
+ // Field descriptor #544 I
+ public static final int GL_BACK_RIGHT = 1027;
+
+ // Field descriptor #544 I
+ public static final int GL_FRONT = 1028;
+
+ // Field descriptor #544 I
+ public static final int GL_BACK = 1029;
+
+ // Field descriptor #544 I
+ public static final int GL_LEFT = 1030;
+
+ // Field descriptor #544 I
+ public static final int GL_RIGHT = 1031;
+
+ // Field descriptor #544 I
+ public static final int GL_FRONT_AND_BACK = 1032;
+
+ // Field descriptor #544 I
+ public static final int GL_AUX0 = 1033;
+
+ // Field descriptor #544 I
+ public static final int GL_AUX1 = 1034;
+
+ // Field descriptor #544 I
+ public static final int GL_AUX2 = 1035;
+
+ // Field descriptor #544 I
+ public static final int GL_AUX3 = 1036;
+
+ // Field descriptor #544 I
+ public static final int GL_NO_ERROR = 0;
+
+ // Field descriptor #544 I
+ public static final int GL_INVALID_ENUM = 1280;
+
+ // Field descriptor #544 I
+ public static final int GL_INVALID_VALUE = 1281;
+
+ // Field descriptor #544 I
+ public static final int GL_INVALID_OPERATION = 1282;
+
+ // Field descriptor #544 I
+ public static final int GL_STACK_OVERFLOW = 1283;
+
+ // Field descriptor #544 I
+ public static final int GL_STACK_UNDERFLOW = 1284;
+
+ // Field descriptor #544 I
+ public static final int GL_OUT_OF_MEMORY = 1285;
+
+ // Field descriptor #544 I
+ public static final int GL_2D = 1536;
+
+ // Field descriptor #544 I
+ public static final int GL_3D = 1537;
+
+ // Field descriptor #544 I
+ public static final int GL_3D_COLOR = 1538;
+
+ // Field descriptor #544 I
+ public static final int GL_3D_COLOR_TEXTURE = 1539;
+
+ // Field descriptor #544 I
+ public static final int GL_4D_COLOR_TEXTURE = 1540;
+
+ // Field descriptor #544 I
+ public static final int GL_PASS_THROUGH_TOKEN = 1792;
+
+ // Field descriptor #544 I
+ public static final int GL_POINT_TOKEN = 1793;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_TOKEN = 1794;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_TOKEN = 1795;
+
+ // Field descriptor #544 I
+ public static final int GL_BITMAP_TOKEN = 1796;
+
+ // Field descriptor #544 I
+ public static final int GL_DRAW_PIXEL_TOKEN = 1797;
+
+ // Field descriptor #544 I
+ public static final int GL_COPY_PIXEL_TOKEN = 1798;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_RESET_TOKEN = 1799;
+
+ // Field descriptor #544 I
+ public static final int GL_EXP = 2048;
+
+ // Field descriptor #544 I
+ public static final int GL_EXP2 = 2049;
+
+ // Field descriptor #544 I
+ public static final int GL_CW = 2304;
+
+ // Field descriptor #544 I
+ public static final int GL_CCW = 2305;
+
+ // Field descriptor #544 I
+ public static final int GL_COEFF = 2560;
+
+ // Field descriptor #544 I
+ public static final int GL_ORDER = 2561;
+
+ // Field descriptor #544 I
+ public static final int GL_DOMAIN = 2562;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_COLOR = 2816;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_INDEX = 2817;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_NORMAL = 2818;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_TEXTURE_COORDS = 2819;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_RASTER_COLOR = 2820;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_RASTER_INDEX = 2821;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_RASTER_TEXTURE_COORDS = 2822;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_RASTER_POSITION = 2823;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_RASTER_POSITION_VALID = 2824;
+
+ // Field descriptor #544 I
+ public static final int GL_CURRENT_RASTER_DISTANCE = 2825;
+
+ // Field descriptor #544 I
+ public static final int GL_POINT_SMOOTH = 2832;
+
+ // Field descriptor #544 I
+ public static final int GL_POINT_SIZE = 2833;
+
+ // Field descriptor #544 I
+ public static final int GL_POINT_SIZE_RANGE = 2834;
+
+ // Field descriptor #544 I
+ public static final int GL_POINT_SIZE_GRANULARITY = 2835;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_SMOOTH = 2848;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_WIDTH = 2849;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_WIDTH_RANGE = 2850;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_WIDTH_GRANULARITY = 2851;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_STIPPLE = 2852;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_STIPPLE_PATTERN = 2853;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_STIPPLE_REPEAT = 2854;
+
+ // Field descriptor #544 I
+ public static final int GL_LIST_MODE = 2864;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_LIST_NESTING = 2865;
+
+ // Field descriptor #544 I
+ public static final int GL_LIST_BASE = 2866;
+
+ // Field descriptor #544 I
+ public static final int GL_LIST_INDEX = 2867;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_MODE = 2880;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_SMOOTH = 2881;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_STIPPLE = 2882;
+
+ // Field descriptor #544 I
+ public static final int GL_EDGE_FLAG = 2883;
+
+ // Field descriptor #544 I
+ public static final int GL_CULL_FACE = 2884;
+
+ // Field descriptor #544 I
+ public static final int GL_CULL_FACE_MODE = 2885;
+
+ // Field descriptor #544 I
+ public static final int GL_FRONT_FACE = 2886;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHTING = 2896;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT_MODEL_LOCAL_VIEWER = 2897;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT_MODEL_TWO_SIDE = 2898;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT_MODEL_AMBIENT = 2899;
+
+ // Field descriptor #544 I
+ public static final int GL_SHADE_MODEL = 2900;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_MATERIAL_FACE = 2901;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_MATERIAL_PARAMETER = 2902;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_MATERIAL = 2903;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG = 2912;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG_INDEX = 2913;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG_DENSITY = 2914;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG_START = 2915;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG_END = 2916;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG_MODE = 2917;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG_COLOR = 2918;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_RANGE = 2928;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_TEST = 2929;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_WRITEMASK = 2930;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_CLEAR_VALUE = 2931;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_FUNC = 2932;
+
+ // Field descriptor #544 I
+ public static final int GL_ACCUM_CLEAR_VALUE = 2944;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_TEST = 2960;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_CLEAR_VALUE = 2961;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_FUNC = 2962;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_VALUE_MASK = 2963;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_FAIL = 2964;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_PASS_DEPTH_FAIL = 2965;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_PASS_DEPTH_PASS = 2966;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_REF = 2967;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_WRITEMASK = 2968;
+
+ // Field descriptor #544 I
+ public static final int GL_MATRIX_MODE = 2976;
+
+ // Field descriptor #544 I
+ public static final int GL_NORMALIZE = 2977;
+
+ // Field descriptor #544 I
+ public static final int GL_VIEWPORT = 2978;
+
+ // Field descriptor #544 I
+ public static final int GL_MODELVIEW_STACK_DEPTH = 2979;
+
+ // Field descriptor #544 I
+ public static final int GL_PROJECTION_STACK_DEPTH = 2980;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_STACK_DEPTH = 2981;
+
+ // Field descriptor #544 I
+ public static final int GL_MODELVIEW_MATRIX = 2982;
+
+ // Field descriptor #544 I
+ public static final int GL_PROJECTION_MATRIX = 2983;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_MATRIX = 2984;
+
+ // Field descriptor #544 I
+ public static final int GL_ATTRIB_STACK_DEPTH = 2992;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIENT_ATTRIB_STACK_DEPTH = 2993;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA_TEST = 3008;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA_TEST_FUNC = 3009;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA_TEST_REF = 3010;
+
+ // Field descriptor #544 I
+ public static final int GL_DITHER = 3024;
+
+ // Field descriptor #544 I
+ public static final int GL_BLEND_DST = 3040;
+
+ // Field descriptor #544 I
+ public static final int GL_BLEND_SRC = 3041;
+
+ // Field descriptor #544 I
+ public static final int GL_BLEND = 3042;
+
+ // Field descriptor #544 I
+ public static final int GL_LOGIC_OP_MODE = 3056;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_LOGIC_OP = 3057;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_LOGIC_OP = 3058;
+
+ // Field descriptor #544 I
+ public static final int GL_AUX_BUFFERS = 3072;
+
+ // Field descriptor #544 I
+ public static final int GL_DRAW_BUFFER = 3073;
+
+ // Field descriptor #544 I
+ public static final int GL_READ_BUFFER = 3074;
+
+ // Field descriptor #544 I
+ public static final int GL_SCISSOR_BOX = 3088;
+
+ // Field descriptor #544 I
+ public static final int GL_SCISSOR_TEST = 3089;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_CLEAR_VALUE = 3104;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_WRITEMASK = 3105;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_CLEAR_VALUE = 3106;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_WRITEMASK = 3107;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_MODE = 3120;
+
+ // Field descriptor #544 I
+ public static final int GL_RGBA_MODE = 3121;
+
+ // Field descriptor #544 I
+ public static final int GL_DOUBLEBUFFER = 3122;
+
+ // Field descriptor #544 I
+ public static final int GL_STEREO = 3123;
+
+ // Field descriptor #544 I
+ public static final int GL_RENDER_MODE = 3136;
+
+ // Field descriptor #544 I
+ public static final int GL_PERSPECTIVE_CORRECTION_HINT = 3152;
+
+ // Field descriptor #544 I
+ public static final int GL_POINT_SMOOTH_HINT = 3153;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE_SMOOTH_HINT = 3154;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_SMOOTH_HINT = 3155;
+
+ // Field descriptor #544 I
+ public static final int GL_FOG_HINT = 3156;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_GEN_S = 3168;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_GEN_T = 3169;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_GEN_R = 3170;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_GEN_Q = 3171;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_I = 3184;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_S_TO_S = 3185;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_R = 3186;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_G = 3187;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_B = 3188;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_A = 3189;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_R_TO_R = 3190;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_G_TO_G = 3191;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_B_TO_B = 3192;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_A_TO_A = 3193;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_I_SIZE = 3248;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_S_TO_S_SIZE = 3249;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_R_SIZE = 3250;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_G_SIZE = 3251;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_B_SIZE = 3252;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_I_TO_A_SIZE = 3253;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_R_TO_R_SIZE = 3254;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_G_TO_G_SIZE = 3255;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_B_TO_B_SIZE = 3256;
+
+ // Field descriptor #544 I
+ public static final int GL_PIXEL_MAP_A_TO_A_SIZE = 3257;
+
+ // Field descriptor #544 I
+ public static final int GL_UNPACK_SWAP_BYTES = 3312;
+
+ // Field descriptor #544 I
+ public static final int GL_UNPACK_LSB_FIRST = 3313;
+
+ // Field descriptor #544 I
+ public static final int GL_UNPACK_ROW_LENGTH = 3314;
+
+ // Field descriptor #544 I
+ public static final int GL_UNPACK_SKIP_ROWS = 3315;
+
+ // Field descriptor #544 I
+ public static final int GL_UNPACK_SKIP_PIXELS = 3316;
+
+ // Field descriptor #544 I
+ public static final int GL_UNPACK_ALIGNMENT = 3317;
+
+ // Field descriptor #544 I
+ public static final int GL_PACK_SWAP_BYTES = 3328;
+
+ // Field descriptor #544 I
+ public static final int GL_PACK_LSB_FIRST = 3329;
+
+ // Field descriptor #544 I
+ public static final int GL_PACK_ROW_LENGTH = 3330;
+
+ // Field descriptor #544 I
+ public static final int GL_PACK_SKIP_ROWS = 3331;
+
+ // Field descriptor #544 I
+ public static final int GL_PACK_SKIP_PIXELS = 3332;
+
+ // Field descriptor #544 I
+ public static final int GL_PACK_ALIGNMENT = 3333;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP_COLOR = 3344;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP_STENCIL = 3345;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_SHIFT = 3346;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_OFFSET = 3347;
+
+ // Field descriptor #544 I
+ public static final int GL_RED_SCALE = 3348;
+
+ // Field descriptor #544 I
+ public static final int GL_RED_BIAS = 3349;
+
+ // Field descriptor #544 I
+ public static final int GL_ZOOM_X = 3350;
+
+ // Field descriptor #544 I
+ public static final int GL_ZOOM_Y = 3351;
+
+ // Field descriptor #544 I
+ public static final int GL_GREEN_SCALE = 3352;
+
+ // Field descriptor #544 I
+ public static final int GL_GREEN_BIAS = 3353;
+
+ // Field descriptor #544 I
+ public static final int GL_BLUE_SCALE = 3354;
+
+ // Field descriptor #544 I
+ public static final int GL_BLUE_BIAS = 3355;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA_SCALE = 3356;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA_BIAS = 3357;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_SCALE = 3358;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_BIAS = 3359;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_EVAL_ORDER = 3376;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_LIGHTS = 3377;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_CLIP_PLANES = 3378;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_TEXTURE_SIZE = 3379;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_PIXEL_MAP_TABLE = 3380;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_ATTRIB_STACK_DEPTH = 3381;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_MODELVIEW_STACK_DEPTH = 3382;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_NAME_STACK_DEPTH = 3383;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_PROJECTION_STACK_DEPTH = 3384;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_TEXTURE_STACK_DEPTH = 3385;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_VIEWPORT_DIMS = 3386;
+
+ // Field descriptor #544 I
+ public static final int GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = 3387;
+
+ // Field descriptor #544 I
+ public static final int GL_SUBPIXEL_BITS = 3408;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_BITS = 3409;
+
+ // Field descriptor #544 I
+ public static final int GL_RED_BITS = 3410;
+
+ // Field descriptor #544 I
+ public static final int GL_GREEN_BITS = 3411;
+
+ // Field descriptor #544 I
+ public static final int GL_BLUE_BITS = 3412;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA_BITS = 3413;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_BITS = 3414;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_BITS = 3415;
+
+ // Field descriptor #544 I
+ public static final int GL_ACCUM_RED_BITS = 3416;
+
+ // Field descriptor #544 I
+ public static final int GL_ACCUM_GREEN_BITS = 3417;
+
+ // Field descriptor #544 I
+ public static final int GL_ACCUM_BLUE_BITS = 3418;
+
+ // Field descriptor #544 I
+ public static final int GL_ACCUM_ALPHA_BITS = 3419;
+
+ // Field descriptor #544 I
+ public static final int GL_NAME_STACK_DEPTH = 3440;
+
+ // Field descriptor #544 I
+ public static final int GL_AUTO_NORMAL = 3456;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_COLOR_4 = 3472;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_INDEX = 3473;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_NORMAL = 3474;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_TEXTURE_COORD_1 = 3475;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_TEXTURE_COORD_2 = 3476;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_TEXTURE_COORD_3 = 3477;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_TEXTURE_COORD_4 = 3478;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_VERTEX_3 = 3479;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_VERTEX_4 = 3480;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_COLOR_4 = 3504;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_INDEX = 3505;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_NORMAL = 3506;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_TEXTURE_COORD_1 = 3507;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_TEXTURE_COORD_2 = 3508;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_TEXTURE_COORD_3 = 3509;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_TEXTURE_COORD_4 = 3510;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_VERTEX_3 = 3511;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_VERTEX_4 = 3512;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_GRID_DOMAIN = 3536;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP1_GRID_SEGMENTS = 3537;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_GRID_DOMAIN = 3538;
+
+ // Field descriptor #544 I
+ public static final int GL_MAP2_GRID_SEGMENTS = 3539;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_1D = 3552;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_2D = 3553;
+
+ // Field descriptor #544 I
+ public static final int GL_FEEDBACK_BUFFER_POINTER = 3568;
+
+ // Field descriptor #544 I
+ public static final int GL_FEEDBACK_BUFFER_SIZE = 3569;
+
+ // Field descriptor #544 I
+ public static final int GL_FEEDBACK_BUFFER_TYPE = 3570;
+
+ // Field descriptor #544 I
+ public static final int GL_SELECTION_BUFFER_POINTER = 3571;
+
+ // Field descriptor #544 I
+ public static final int GL_SELECTION_BUFFER_SIZE = 3572;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_WIDTH = 4096;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_HEIGHT = 4097;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_INTERNAL_FORMAT = 4099;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_BORDER_COLOR = 4100;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_BORDER = 4101;
+
+ // Field descriptor #544 I
+ public static final int GL_DONT_CARE = 4352;
+
+ // Field descriptor #544 I
+ public static final int GL_FASTEST = 4353;
+
+ // Field descriptor #544 I
+ public static final int GL_NICEST = 4354;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT0 = 16384;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT1 = 16385;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT2 = 16386;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT3 = 16387;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT4 = 16388;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT5 = 16389;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT6 = 16390;
+
+ // Field descriptor #544 I
+ public static final int GL_LIGHT7 = 16391;
+
+ // Field descriptor #544 I
+ public static final int GL_AMBIENT = 4608;
+
+ // Field descriptor #544 I
+ public static final int GL_DIFFUSE = 4609;
+
+ // Field descriptor #544 I
+ public static final int GL_SPECULAR = 4610;
+
+ // Field descriptor #544 I
+ public static final int GL_POSITION = 4611;
+
+ // Field descriptor #544 I
+ public static final int GL_SPOT_DIRECTION = 4612;
+
+ // Field descriptor #544 I
+ public static final int GL_SPOT_EXPONENT = 4613;
+
+ // Field descriptor #544 I
+ public static final int GL_SPOT_CUTOFF = 4614;
+
+ // Field descriptor #544 I
+ public static final int GL_CONSTANT_ATTENUATION = 4615;
+
+ // Field descriptor #544 I
+ public static final int GL_LINEAR_ATTENUATION = 4616;
+
+ // Field descriptor #544 I
+ public static final int GL_QUADRATIC_ATTENUATION = 4617;
+
+ // Field descriptor #544 I
+ public static final int GL_COMPILE = 4864;
+
+ // Field descriptor #544 I
+ public static final int GL_COMPILE_AND_EXECUTE = 4865;
+
+ // Field descriptor #544 I
+ public static final int GL_CLEAR = 5376;
+
+ // Field descriptor #544 I
+ public static final int GL_AND = 5377;
+
+ // Field descriptor #544 I
+ public static final int GL_AND_REVERSE = 5378;
+
+ // Field descriptor #544 I
+ public static final int GL_COPY = 5379;
+
+ // Field descriptor #544 I
+ public static final int GL_AND_INVERTED = 5380;
+
+ // Field descriptor #544 I
+ public static final int GL_NOOP = 5381;
+
+ // Field descriptor #544 I
+ public static final int GL_XOR = 5382;
+
+ // Field descriptor #544 I
+ public static final int GL_OR = 5383;
+
+ // Field descriptor #544 I
+ public static final int GL_NOR = 5384;
+
+ // Field descriptor #544 I
+ public static final int GL_EQUIV = 5385;
+
+ // Field descriptor #544 I
+ public static final int GL_INVERT = 5386;
+
+ // Field descriptor #544 I
+ public static final int GL_OR_REVERSE = 5387;
+
+ // Field descriptor #544 I
+ public static final int GL_COPY_INVERTED = 5388;
+
+ // Field descriptor #544 I
+ public static final int GL_OR_INVERTED = 5389;
+
+ // Field descriptor #544 I
+ public static final int GL_NAND = 5390;
+
+ // Field descriptor #544 I
+ public static final int GL_SET = 5391;
+
+ // Field descriptor #544 I
+ public static final int GL_EMISSION = 5632;
+
+ // Field descriptor #544 I
+ public static final int GL_SHININESS = 5633;
+
+ // Field descriptor #544 I
+ public static final int GL_AMBIENT_AND_DIFFUSE = 5634;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_INDEXES = 5635;
+
+ // Field descriptor #544 I
+ public static final int GL_MODELVIEW = 5888;
+
+ // Field descriptor #544 I
+ public static final int GL_PROJECTION = 5889;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE = 5890;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR = 6144;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH = 6145;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL = 6146;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_INDEX = 6400;
+
+ // Field descriptor #544 I
+ public static final int GL_STENCIL_INDEX = 6401;
+
+ // Field descriptor #544 I
+ public static final int GL_DEPTH_COMPONENT = 6402;
+
+ // Field descriptor #544 I
+ public static final int GL_RED = 6403;
+
+ // Field descriptor #544 I
+ public static final int GL_GREEN = 6404;
+
+ // Field descriptor #544 I
+ public static final int GL_BLUE = 6405;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA = 6406;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB = 6407;
+
+ // Field descriptor #544 I
+ public static final int GL_RGBA = 6408;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE = 6409;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE_ALPHA = 6410;
+
+ // Field descriptor #544 I
+ public static final int GL_BITMAP = 6656;
+
+ // Field descriptor #544 I
+ public static final int GL_POINT = 6912;
+
+ // Field descriptor #544 I
+ public static final int GL_LINE = 6913;
+
+ // Field descriptor #544 I
+ public static final int GL_FILL = 6914;
+
+ // Field descriptor #544 I
+ public static final int GL_RENDER = 7168;
+
+ // Field descriptor #544 I
+ public static final int GL_FEEDBACK = 7169;
+
+ // Field descriptor #544 I
+ public static final int GL_SELECT = 7170;
+
+ // Field descriptor #544 I
+ public static final int GL_FLAT = 7424;
+
+ // Field descriptor #544 I
+ public static final int GL_SMOOTH = 7425;
+
+ // Field descriptor #544 I
+ public static final int GL_KEEP = 7680;
+
+ // Field descriptor #544 I
+ public static final int GL_REPLACE = 7681;
+
+ // Field descriptor #544 I
+ public static final int GL_INCR = 7682;
+
+ // Field descriptor #544 I
+ public static final int GL_DECR = 7683;
+
+ // Field descriptor #544 I
+ public static final int GL_VENDOR = 7936;
+
+ // Field descriptor #544 I
+ public static final int GL_RENDERER = 7937;
+
+ // Field descriptor #544 I
+ public static final int GL_VERSION = 7938;
+
+ // Field descriptor #544 I
+ public static final int GL_EXTENSIONS = 7939;
+
+ // Field descriptor #544 I
+ public static final int GL_S = 8192;
+
+ // Field descriptor #544 I
+ public static final int GL_T = 8193;
+
+ // Field descriptor #544 I
+ public static final int GL_R = 8194;
+
+ // Field descriptor #544 I
+ public static final int GL_Q = 8195;
+
+ // Field descriptor #544 I
+ public static final int GL_MODULATE = 8448;
+
+ // Field descriptor #544 I
+ public static final int GL_DECAL = 8449;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_ENV_MODE = 8704;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_ENV_COLOR = 8705;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_ENV = 8960;
+
+ // Field descriptor #544 I
+ public static final int GL_EYE_LINEAR = 9216;
+
+ // Field descriptor #544 I
+ public static final int GL_OBJECT_LINEAR = 9217;
+
+ // Field descriptor #544 I
+ public static final int GL_SPHERE_MAP = 9218;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_GEN_MODE = 9472;
+
+ // Field descriptor #544 I
+ public static final int GL_OBJECT_PLANE = 9473;
+
+ // Field descriptor #544 I
+ public static final int GL_EYE_PLANE = 9474;
+
+ // Field descriptor #544 I
+ public static final int GL_NEAREST = 9728;
+
+ // Field descriptor #544 I
+ public static final int GL_LINEAR = 9729;
+
+ // Field descriptor #544 I
+ public static final int GL_NEAREST_MIPMAP_NEAREST = 9984;
+
+ // Field descriptor #544 I
+ public static final int GL_LINEAR_MIPMAP_NEAREST = 9985;
+
+ // Field descriptor #544 I
+ public static final int GL_NEAREST_MIPMAP_LINEAR = 9986;
+
+ // Field descriptor #544 I
+ public static final int GL_LINEAR_MIPMAP_LINEAR = 9987;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_MAG_FILTER = 10240;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_MIN_FILTER = 10241;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_WRAP_S = 10242;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_WRAP_T = 10243;
+
+ // Field descriptor #544 I
+ public static final int GL_CLAMP = 10496;
+
+ // Field descriptor #544 I
+ public static final int GL_REPEAT = 10497;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIENT_PIXEL_STORE_BIT = 1;
+
+ // Field descriptor #544 I
+ public static final int GL_CLIENT_VERTEX_ARRAY_BIT = 2;
+
+ // Field descriptor #544 I
+ public static final int GL_ALL_CLIENT_ATTRIB_BITS = -1;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_OFFSET_FACTOR = 32824;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_OFFSET_UNITS = 10752;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_OFFSET_POINT = 10753;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_OFFSET_LINE = 10754;
+
+ // Field descriptor #544 I
+ public static final int GL_POLYGON_OFFSET_FILL = 32823;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA4 = 32827;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA8 = 32828;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA12 = 32829;
+
+ // Field descriptor #544 I
+ public static final int GL_ALPHA16 = 32830;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE4 = 32831;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE8 = 32832;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE12 = 32833;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE16 = 32834;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE4_ALPHA4 = 32835;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE6_ALPHA2 = 32836;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE8_ALPHA8 = 32837;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE12_ALPHA4 = 32838;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE12_ALPHA12 = 32839;
+
+ // Field descriptor #544 I
+ public static final int GL_LUMINANCE16_ALPHA16 = 32840;
+
+ // Field descriptor #544 I
+ public static final int GL_INTENSITY = 32841;
+
+ // Field descriptor #544 I
+ public static final int GL_INTENSITY4 = 32842;
+
+ // Field descriptor #544 I
+ public static final int GL_INTENSITY8 = 32843;
+
+ // Field descriptor #544 I
+ public static final int GL_INTENSITY12 = 32844;
+
+ // Field descriptor #544 I
+ public static final int GL_INTENSITY16 = 32845;
+
+ // Field descriptor #544 I
+ public static final int GL_R3_G3_B2 = 10768;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB4 = 32847;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB5 = 32848;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB8 = 32849;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB10 = 32850;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB12 = 32851;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB16 = 32852;
+
+ // Field descriptor #544 I
+ public static final int GL_RGBA2 = 32853;
+
+ // Field descriptor #544 I
+ public static final int GL_RGBA4 = 32854;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB5_A1 = 32855;
+
+ // Field descriptor #544 I
+ public static final int GL_RGBA8 = 32856;
+
+ // Field descriptor #544 I
+ public static final int GL_RGB10_A2 = 32857;
+
+ // Field descriptor #544 I
+ public static final int GL_RGBA12 = 32858;
+
+ // Field descriptor #544 I
+ public static final int GL_RGBA16 = 32859;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_RED_SIZE = 32860;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_GREEN_SIZE = 32861;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_BLUE_SIZE = 32862;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_ALPHA_SIZE = 32863;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_LUMINANCE_SIZE = 32864;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_INTENSITY_SIZE = 32865;
+
+ // Field descriptor #544 I
+ public static final int GL_PROXY_TEXTURE_1D = 32867;
+
+ // Field descriptor #544 I
+ public static final int GL_PROXY_TEXTURE_2D = 32868;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_PRIORITY = 32870;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_RESIDENT = 32871;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_BINDING_1D = 32872;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_BINDING_2D = 32873;
+
+ // Field descriptor #544 I
+ public static final int GL_VERTEX_ARRAY = 32884;
+
+ // Field descriptor #544 I
+ public static final int GL_NORMAL_ARRAY = 32885;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_ARRAY = 32886;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_ARRAY = 32887;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_COORD_ARRAY = 32888;
+
+ // Field descriptor #544 I
+ public static final int GL_EDGE_FLAG_ARRAY = 32889;
+
+ // Field descriptor #544 I
+ public static final int GL_VERTEX_ARRAY_SIZE = 32890;
+
+ // Field descriptor #544 I
+ public static final int GL_VERTEX_ARRAY_TYPE = 32891;
+
+ // Field descriptor #544 I
+ public static final int GL_VERTEX_ARRAY_STRIDE = 32892;
+
+ // Field descriptor #544 I
+ public static final int GL_NORMAL_ARRAY_TYPE = 32894;
+
+ // Field descriptor #544 I
+ public static final int GL_NORMAL_ARRAY_STRIDE = 32895;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_ARRAY_SIZE = 32897;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_ARRAY_TYPE = 32898;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_ARRAY_STRIDE = 32899;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_ARRAY_TYPE = 32901;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_ARRAY_STRIDE = 32902;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_COORD_ARRAY_SIZE = 32904;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_COORD_ARRAY_TYPE = 32905;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_COORD_ARRAY_STRIDE = 32906;
+
+ // Field descriptor #544 I
+ public static final int GL_EDGE_FLAG_ARRAY_STRIDE = 32908;
+
+ // Field descriptor #544 I
+ public static final int GL_VERTEX_ARRAY_POINTER = 32910;
+
+ // Field descriptor #544 I
+ public static final int GL_NORMAL_ARRAY_POINTER = 32911;
+
+ // Field descriptor #544 I
+ public static final int GL_COLOR_ARRAY_POINTER = 32912;
+
+ // Field descriptor #544 I
+ public static final int GL_INDEX_ARRAY_POINTER = 32913;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_COORD_ARRAY_POINTER = 32914;
+
+ // Field descriptor #544 I
+ public static final int GL_EDGE_FLAG_ARRAY_POINTER = 32915;
+
+ // Field descriptor #544 I
+ public static final int GL_V2F = 10784;
+
+ // Field descriptor #544 I
+ public static final int GL_V3F = 10785;
+
+ // Field descriptor #544 I
+ public static final int GL_C4UB_V2F = 10786;
+
+ // Field descriptor #544 I
+ public static final int GL_C4UB_V3F = 10787;
+
+ // Field descriptor #544 I
+ public static final int GL_C3F_V3F = 10788;
+
+ // Field descriptor #544 I
+ public static final int GL_N3F_V3F = 10789;
+
+ // Field descriptor #544 I
+ public static final int GL_C4F_N3F_V3F = 10790;
+
+ // Field descriptor #544 I
+ public static final int GL_T2F_V3F = 10791;
+
+ // Field descriptor #544 I
+ public static final int GL_T4F_V4F = 10792;
+
+ // Field descriptor #544 I
+ public static final int GL_T2F_C4UB_V3F = 10793;
+
+ // Field descriptor #544 I
+ public static final int GL_T2F_C3F_V3F = 10794;
+
+ // Field descriptor #544 I
+ public static final int GL_T2F_N3F_V3F = 10795;
+
+ // Field descriptor #544 I
+ public static final int GL_T2F_C4F_N3F_V3F = 10796;
+
+ // Field descriptor #544 I
+ public static final int GL_T4F_C4F_N3F_V4F = 10797;
+
+ // Field descriptor #544 I
+ public static final int GL_LOGIC_OP = 3057;
+
+ // Field descriptor #544 I
+ public static final int GL_TEXTURE_COMPONENTS = 4099;
+
+ // Field descriptor #45 I
+ public static final int GL_TEXTURE_BINDING_3D = 32874;
+
+ // Field descriptor #45 I
+ public static final int GL_PACK_SKIP_IMAGES = 32875;
+
+ // Field descriptor #45 I
+ public static final int GL_PACK_IMAGE_HEIGHT = 32876;
+
+ // Field descriptor #45 I
+ public static final int GL_UNPACK_SKIP_IMAGES = 32877;
+
+ // Field descriptor #45 I
+ public static final int GL_UNPACK_IMAGE_HEIGHT = 32878;
+
+ // Field descriptor #45 I
+ public static final int GL_TEXTURE_3D = 32879;
+
+ // Field descriptor #45 I
+ public static final int GL_PROXY_TEXTURE_3D = 32880;
+
+ // Field descriptor #45 I
+ public static final int GL_TEXTURE_DEPTH = 32881;
+
+ // Field descriptor #45 I
+ public static final int GL_TEXTURE_WRAP_R = 32882;
+
+ // Field descriptor #45 I
+ public static final int GL_MAX_3D_TEXTURE_SIZE = 32883;
+
+ // Field descriptor #45 I
+ public static final int GL_BGR = 32992;
+
+ // Field descriptor #45 I
+ public static final int GL_BGRA = 32993;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_BYTE_3_3_2 = 32818;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_BYTE_2_3_3_REV = 33634;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_SHORT_5_6_5 = 33635;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_SHORT_5_6_5_REV = 33636;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_SHORT_4_4_4_4 = 32819;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_SHORT_4_4_4_4_REV = 33637;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_SHORT_5_5_5_1 = 32820;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_SHORT_1_5_5_5_REV = 33638;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_INT_8_8_8_8 = 32821;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_INT_8_8_8_8_REV = 33639;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_INT_10_10_10_2 = 32822;
+
+ // Field descriptor #45 I
+ public static final int GL_UNSIGNED_INT_2_10_10_10_REV = 33640;
+
+ // Field descriptor #45 I
+ public static final int GL_RESCALE_NORMAL = 32826;
+
+ // Field descriptor #45 I
+ public static final int GL_LIGHT_MODEL_COLOR_CONTROL = 33272;
+
+ // Field descriptor #45 I
+ public static final int GL_SINGLE_COLOR = 33273;
+
+ // Field descriptor #45 I
+ public static final int GL_SEPARATE_SPECULAR_COLOR = 33274;
+
+ // Field descriptor #45 I
+ public static final int GL_CLAMP_TO_EDGE = 33071;
+
+ // Field descriptor #45 I
+ public static final int GL_TEXTURE_MIN_LOD = 33082;
+
+ // Field descriptor #45 I
+ public static final int GL_TEXTURE_MAX_LOD = 33083;
+
+ // Field descriptor #45 I
+ public static final int GL_TEXTURE_BASE_LEVEL = 33084;
+
+ // Field descriptor #45 I
+ public static final int GL_TEXTURE_MAX_LEVEL = 33085;
+
+ // Field descriptor #45 I
+ public static final int GL_MAX_ELEMENTS_VERTICES = 33000;
+
+ // Field descriptor #45 I
+ public static final int GL_MAX_ELEMENTS_INDICES = 33001;
+
+ // Field descriptor #45 I
+ public static final int GL_ALIASED_POINT_SIZE_RANGE = 33901;
+
+ // Field descriptor #45 I
+ public static final int GL_ALIASED_LINE_WIDTH_RANGE = 33902;
+
+ // Field descriptor #45 I
+ public static final int GL_SMOOTH_POINT_SIZE_RANGE = 2834;
+
+ // Field descriptor #45 I
+ public static final int GL_SMOOTH_POINT_SIZE_GRANULARITY = 2835;
+
+ // Field descriptor #45 I
+ public static final int GL_SMOOTH_LINE_WIDTH_RANGE = 2850;
+
+ // Field descriptor #45 I
+ public static final int GL_SMOOTH_LINE_WIDTH_GRANULARITY = 2851;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE0 = 33984;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE1 = 33985;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE2 = 33986;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE3 = 33987;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE4 = 33988;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE5 = 33989;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE6 = 33990;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE7 = 33991;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE8 = 33992;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE9 = 33993;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE10 = 33994;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE11 = 33995;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE12 = 33996;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE13 = 33997;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE14 = 33998;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE15 = 33999;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE16 = 34000;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE17 = 34001;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE18 = 34002;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE19 = 34003;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE20 = 34004;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE21 = 34005;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE22 = 34006;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE23 = 34007;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE24 = 34008;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE25 = 34009;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE26 = 34010;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE27 = 34011;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE28 = 34012;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE29 = 34013;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE30 = 34014;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE31 = 34015;
+
+ // Field descriptor #76 I
+ public static final int GL_ACTIVE_TEXTURE = 34016;
+
+ // Field descriptor #76 I
+ public static final int GL_CLIENT_ACTIVE_TEXTURE = 34017;
+
+ // Field descriptor #76 I
+ public static final int GL_MAX_TEXTURE_UNITS = 34018;
+
+ // Field descriptor #76 I
+ public static final int GL_NORMAL_MAP = 34065;
+
+ // Field descriptor #76 I
+ public static final int GL_REFLECTION_MAP = 34066;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_CUBE_MAP = 34067;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_BINDING_CUBE_MAP = 34068;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_X = 34069;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 34070;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 34071;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 34073;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074;
+
+ // Field descriptor #76 I
+ public static final int GL_PROXY_TEXTURE_CUBE_MAP = 34075;
+
+ // Field descriptor #76 I
+ public static final int GL_MAX_CUBE_MAP_TEXTURE_SIZE = 34076;
+
+ // Field descriptor #76 I
+ public static final int GL_COMPRESSED_ALPHA = 34025;
+
+ // Field descriptor #76 I
+ public static final int GL_COMPRESSED_LUMINANCE = 34026;
+
+ // Field descriptor #76 I
+ public static final int GL_COMPRESSED_LUMINANCE_ALPHA = 34027;
+
+ // Field descriptor #76 I
+ public static final int GL_COMPRESSED_INTENSITY = 34028;
+
+ // Field descriptor #76 I
+ public static final int GL_COMPRESSED_RGB = 34029;
+
+ // Field descriptor #76 I
+ public static final int GL_COMPRESSED_RGBA = 34030;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_COMPRESSION_HINT = 34031;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_COMPRESSED_IMAGE_SIZE = 34464;
+
+ // Field descriptor #76 I
+ public static final int GL_TEXTURE_COMPRESSED = 34465;
+
+ // Field descriptor #76 I
+ public static final int GL_NUM_COMPRESSED_TEXTURE_FORMATS = 34466;
+
+ // Field descriptor #76 I
+ public static final int GL_COMPRESSED_TEXTURE_FORMATS = 34467;
+
+ // Field descriptor #76 I
+ public static final int GL_MULTISAMPLE = 32925;
+
+ // Field descriptor #76 I
+ public static final int GL_SAMPLE_ALPHA_TO_COVERAGE = 32926;
+
+ // Field descriptor #76 I
+ public static final int GL_SAMPLE_ALPHA_TO_ONE = 32927;
+
+ // Field descriptor #76 I
+ public static final int GL_SAMPLE_COVERAGE = 32928;
+
+ // Field descriptor #76 I
+ public static final int GL_SAMPLE_BUFFERS = 32936;
+
+ // Field descriptor #76 I
+ public static final int GL_SAMPLES = 32937;
+
+ // Field descriptor #76 I
+ public static final int GL_SAMPLE_COVERAGE_VALUE = 32938;
+
+ // Field descriptor #76 I
+ public static final int GL_SAMPLE_COVERAGE_INVERT = 32939;
+
+ // Field descriptor #76 I
+ public static final int GL_MULTISAMPLE_BIT = 536870912;
+
+ // Field descriptor #76 I
+ public static final int GL_TRANSPOSE_MODELVIEW_MATRIX = 34019;
+
+ // Field descriptor #76 I
+ public static final int GL_TRANSPOSE_PROJECTION_MATRIX = 34020;
+
+ // Field descriptor #76 I
+ public static final int GL_TRANSPOSE_TEXTURE_MATRIX = 34021;
+
+ // Field descriptor #76 I
+ public static final int GL_TRANSPOSE_COLOR_MATRIX = 34022;
+
+ // Field descriptor #76 I
+ public static final int GL_COMBINE = 34160;
+
+ // Field descriptor #76 I
+ public static final int GL_COMBINE_RGB = 34161;
+
+ // Field descriptor #76 I
+ public static final int GL_COMBINE_ALPHA = 34162;
+
+ // Field descriptor #76 I
+ public static final int GL_SOURCE0_RGB = 34176;
+
+ // Field descriptor #76 I
+ public static final int GL_SOURCE1_RGB = 34177;
+
+ // Field descriptor #76 I
+ public static final int GL_SOURCE2_RGB = 34178;
+
+ // Field descriptor #76 I
+ public static final int GL_SOURCE0_ALPHA = 34184;
+
+ // Field descriptor #76 I
+ public static final int GL_SOURCE1_ALPHA = 34185;
+
+ // Field descriptor #76 I
+ public static final int GL_SOURCE2_ALPHA = 34186;
+
+ // Field descriptor #76 I
+ public static final int GL_OPERAND0_RGB = 34192;
+
+ // Field descriptor #76 I
+ public static final int GL_OPERAND1_RGB = 34193;
+
+ // Field descriptor #76 I
+ public static final int GL_OPERAND2_RGB = 34194;
+
+ // Field descriptor #76 I
+ public static final int GL_OPERAND0_ALPHA = 34200;
+
+ // Field descriptor #76 I
+ public static final int GL_OPERAND1_ALPHA = 34201;
+
+ // Field descriptor #76 I
+ public static final int GL_OPERAND2_ALPHA = 34202;
+
+ // Field descriptor #76 I
+ public static final int GL_RGB_SCALE = 34163;
+
+ // Field descriptor #76 I
+ public static final int GL_ADD_SIGNED = 34164;
+
+ // Field descriptor #76 I
+ public static final int GL_INTERPOLATE = 34165;
+
+ // Field descriptor #76 I
+ public static final int GL_SUBTRACT = 34023;
+
+ // Field descriptor #76 I
+ public static final int GL_CONSTANT = 34166;
+
+ // Field descriptor #76 I
+ public static final int GL_PRIMARY_COLOR = 34167;
+
+ // Field descriptor #76 I
+ public static final int GL_PREVIOUS = 34168;
+
+ // Field descriptor #76 I
+ public static final int GL_DOT3_RGB = 34478;
+
+ // Field descriptor #76 I
+ public static final int GL_DOT3_RGBA = 34479;
+
+ // Field descriptor #76 I
+ public static final int GL_CLAMP_TO_BORDER = 33069;
+
+ // Field descriptor #71 I
+ public static final int GL_ARRAY_BUFFER = 34962;
+
+ // Field descriptor #71 I
+ public static final int GL_ELEMENT_ARRAY_BUFFER = 34963;
+
+ // Field descriptor #71 I
+ public static final int GL_ARRAY_BUFFER_BINDING = 34964;
+
+ // Field descriptor #71 I
+ public static final int GL_ELEMENT_ARRAY_BUFFER_BINDING = 34965;
+
+ // Field descriptor #71 I
+ public static final int GL_VERTEX_ARRAY_BUFFER_BINDING = 34966;
+
+ // Field descriptor #71 I
+ public static final int GL_NORMAL_ARRAY_BUFFER_BINDING = 34967;
+
+ // Field descriptor #71 I
+ public static final int GL_COLOR_ARRAY_BUFFER_BINDING = 34968;
+
+ // Field descriptor #71 I
+ public static final int GL_INDEX_ARRAY_BUFFER_BINDING = 34969;
+
+ // Field descriptor #71 I
+ public static final int GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = 34970;
+
+ // Field descriptor #71 I
+ public static final int GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = 34971;
+
+ // Field descriptor #71 I
+ public static final int GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = 34972;
+
+ // Field descriptor #71 I
+ public static final int GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = 34973;
+
+ // Field descriptor #71 I
+ public static final int GL_WEIGHT_ARRAY_BUFFER_BINDING = 34974;
+
+ // Field descriptor #71 I
+ public static final int GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975;
+
+ // Field descriptor #71 I
+ public static final int GL_STREAM_DRAW = 35040;
+
+ // Field descriptor #71 I
+ public static final int GL_STREAM_READ = 35041;
+
+ // Field descriptor #71 I
+ public static final int GL_STREAM_COPY = 35042;
+
+ // Field descriptor #71 I
+ public static final int GL_STATIC_DRAW = 35044;
+
+ // Field descriptor #71 I
+ public static final int GL_STATIC_READ = 35045;
+
+ // Field descriptor #71 I
+ public static final int GL_STATIC_COPY = 35046;
+
+ // Field descriptor #71 I
+ public static final int GL_DYNAMIC_DRAW = 35048;
+
+ // Field descriptor #71 I
+ public static final int GL_DYNAMIC_READ = 35049;
+
+ // Field descriptor #71 I
+ public static final int GL_DYNAMIC_COPY = 35050;
+
+ // Field descriptor #71 I
+ public static final int GL_READ_ONLY = 35000;
+
+ // Field descriptor #71 I
+ public static final int GL_WRITE_ONLY = 35001;
+
+ // Field descriptor #71 I
+ public static final int GL_READ_WRITE = 35002;
+
+ // Field descriptor #71 I
+ public static final int GL_BUFFER_SIZE = 34660;
+
+ // Field descriptor #71 I
+ public static final int GL_BUFFER_USAGE = 34661;
+
+ // Field descriptor #71 I
+ public static final int GL_BUFFER_ACCESS = 35003;
+
+ // Field descriptor #71 I
+ public static final int GL_BUFFER_MAPPED = 35004;
+
+ // Field descriptor #71 I
+ public static final int GL_BUFFER_MAP_POINTER = 35005;
+
+ // Field descriptor #71 I
+ public static final int GL_FOG_COORD_SRC = 33872;
+
+ // Field descriptor #71 I
+ public static final int GL_FOG_COORD = 33873;
+
+ // Field descriptor #71 I
+ public static final int GL_CURRENT_FOG_COORD = 33875;
+
+ // Field descriptor #71 I
+ public static final int GL_FOG_COORD_ARRAY_TYPE = 33876;
+
+ // Field descriptor #71 I
+ public static final int GL_FOG_COORD_ARRAY_STRIDE = 33877;
+
+ // Field descriptor #71 I
+ public static final int GL_FOG_COORD_ARRAY_POINTER = 33878;
+
+ // Field descriptor #71 I
+ public static final int GL_FOG_COORD_ARRAY = 33879;
+
+ // Field descriptor #71 I
+ public static final int GL_FOG_COORD_ARRAY_BUFFER_BINDING = 34973;
+
+ // Field descriptor #71 I
+ public static final int GL_SRC0_RGB = 34176;
+
+ // Field descriptor #71 I
+ public static final int GL_SRC1_RGB = 34177;
+
+ // Field descriptor #71 I
+ public static final int GL_SRC2_RGB = 34178;
+
+ // Field descriptor #71 I
+ public static final int GL_SRC0_ALPHA = 34184;
+
+ // Field descriptor #71 I
+ public static final int GL_SRC1_ALPHA = 34185;
+
+ // Field descriptor #71 I
+ public static final int GL_SRC2_ALPHA = 34186;
+
+ // Field descriptor #71 I
+ public static final int GL_SAMPLES_PASSED = 35092;
+
+ // Field descriptor #71 I
+ public static final int GL_QUERY_COUNTER_BITS = 34916;
+
+ // Field descriptor #71 I
+ public static final int GL_CURRENT_QUERY = 34917;
+
+ // Field descriptor #71 I
+ public static final int GL_QUERY_RESULT = 34918;
+
+ // Field descriptor #71 I
+ public static final int GL_QUERY_RESULT_AVAILABLE = 34919;
+
+ // Field descriptor #194 I
+ public static final int GL_SHADING_LANGUAGE_VERSION = 35724;
+
+ // Field descriptor #194 I
+ public static final int GL_CURRENT_PROGRAM = 35725;
+
+ // Field descriptor #194 I
+ public static final int GL_SHADER_TYPE = 35663;
+
+ // Field descriptor #194 I
+ public static final int GL_DELETE_STATUS = 35712;
+
+ // Field descriptor #194 I
+ public static final int GL_COMPILE_STATUS = 35713;
+
+ // Field descriptor #194 I
+ public static final int GL_LINK_STATUS = 35714;
+
+ // Field descriptor #194 I
+ public static final int GL_VALIDATE_STATUS = 35715;
+
+ // Field descriptor #194 I
+ public static final int GL_INFO_LOG_LENGTH = 35716;
+
+ // Field descriptor #194 I
+ public static final int GL_ATTACHED_SHADERS = 35717;
+
+ // Field descriptor #194 I
+ public static final int GL_ACTIVE_UNIFORMS = 35718;
+
+ // Field descriptor #194 I
+ public static final int GL_ACTIVE_UNIFORM_MAX_LENGTH = 35719;
+
+ // Field descriptor #194 I
+ public static final int GL_ACTIVE_ATTRIBUTES = 35721;
+
+ // Field descriptor #194 I
+ public static final int GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = 35722;
+
+ // Field descriptor #194 I
+ public static final int GL_SHADER_SOURCE_LENGTH = 35720;
+
+ // Field descriptor #194 I
+ public static final int GL_SHADER_OBJECT = 35656;
+
+ // Field descriptor #194 I
+ public static final int GL_FLOAT_VEC2 = 35664;
+
+ // Field descriptor #194 I
+ public static final int GL_FLOAT_VEC3 = 35665;
+
+ // Field descriptor #194 I
+ public static final int GL_FLOAT_VEC4 = 35666;
+
+ // Field descriptor #194 I
+ public static final int GL_INT_VEC2 = 35667;
+
+ // Field descriptor #194 I
+ public static final int GL_INT_VEC3 = 35668;
+
+ // Field descriptor #194 I
+ public static final int GL_INT_VEC4 = 35669;
+
+ // Field descriptor #194 I
+ public static final int GL_BOOL = 35670;
+
+ // Field descriptor #194 I
+ public static final int GL_BOOL_VEC2 = 35671;
+
+ // Field descriptor #194 I
+ public static final int GL_BOOL_VEC3 = 35672;
+
+ // Field descriptor #194 I
+ public static final int GL_BOOL_VEC4 = 35673;
+
+ // Field descriptor #194 I
+ public static final int GL_FLOAT_MAT2 = 35674;
+
+ // Field descriptor #194 I
+ public static final int GL_FLOAT_MAT3 = 35675;
+
+ // Field descriptor #194 I
+ public static final int GL_FLOAT_MAT4 = 35676;
+
+ // Field descriptor #194 I
+ public static final int GL_SAMPLER_1D = 35677;
+
+ // Field descriptor #194 I
+ public static final int GL_SAMPLER_2D = 35678;
+
+ // Field descriptor #194 I
+ public static final int GL_SAMPLER_3D = 35679;
+
+ // Field descriptor #194 I
+ public static final int GL_SAMPLER_CUBE = 35680;
+
+ // Field descriptor #194 I
+ public static final int GL_SAMPLER_1D_SHADOW = 35681;
+
+ // Field descriptor #194 I
+ public static final int GL_SAMPLER_2D_SHADOW = 35682;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_SHADER = 35633;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_VERTEX_UNIFORM_COMPONENTS = 35658;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_VARYING_FLOATS = 35659;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_VERTEX_ATTRIBS = 34921;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_TEXTURE_IMAGE_UNITS = 34930;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_TEXTURE_COORDS = 34929;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_PROGRAM_POINT_SIZE = 34370;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_PROGRAM_TWO_SIDE = 34371;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_ATTRIB_ARRAY_ENABLED = 34338;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_ATTRIB_ARRAY_SIZE = 34339;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_ATTRIB_ARRAY_STRIDE = 34340;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_ATTRIB_ARRAY_TYPE = 34341;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922;
+
+ // Field descriptor #194 I
+ public static final int GL_CURRENT_VERTEX_ATTRIB = 34342;
+
+ // Field descriptor #194 I
+ public static final int GL_VERTEX_ATTRIB_ARRAY_POINTER = 34373;
+
+ // Field descriptor #194 I
+ public static final int GL_FRAGMENT_SHADER = 35632;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = 35657;
+
+ // Field descriptor #194 I
+ public static final int GL_FRAGMENT_SHADER_DERIVATIVE_HINT = 35723;
+
+ // Field descriptor #194 I
+ public static final int GL_MAX_DRAW_BUFFERS = 34852;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER0 = 34853;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER1 = 34854;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER2 = 34855;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER3 = 34856;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER4 = 34857;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER5 = 34858;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER6 = 34859;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER7 = 34860;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER8 = 34861;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER9 = 34862;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER10 = 34863;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER11 = 34864;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER12 = 34865;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER13 = 34866;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER14 = 34867;
+
+ // Field descriptor #194 I
+ public static final int GL_DRAW_BUFFER15 = 34868;
+
+ // Field descriptor #194 I
+ public static final int GL_POINT_SPRITE = 34913;
+
+ // Field descriptor #194 I
+ public static final int GL_COORD_REPLACE = 34914;
+
+ // Field descriptor #194 I
+ public static final int GL_POINT_SPRITE_COORD_ORIGIN = 36000;
+
+ // Field descriptor #194 I
+ public static final int GL_LOWER_LEFT = 36001;
+
+ // Field descriptor #194 I
+ public static final int GL_UPPER_LEFT = 36002;
+
+ // Field descriptor #194 I
+ public static final int GL_STENCIL_BACK_FUNC = 34816;
+
+ // Field descriptor #194 I
+ public static final int GL_STENCIL_BACK_FAIL = 34817;
+
+ // Field descriptor #194 I
+ public static final int GL_STENCIL_BACK_PASS_DEPTH_FAIL = 34818;
+
+ // Field descriptor #194 I
+ public static final int GL_STENCIL_BACK_PASS_DEPTH_PASS = 34819;
+
+ // Field descriptor #194 I
+ public static final int GL_STENCIL_BACK_REF = 36003;
+
+ // Field descriptor #194 I
+ public static final int GL_STENCIL_BACK_VALUE_MASK = 36004;
+
+ // Field descriptor #194 I
+ public static final int GL_STENCIL_BACK_WRITEMASK = 36005;
+
+ // Field descriptor #194 I
+ public static final int GL_BLEND_EQUATION_RGB = 32777;
+
+ // Field descriptor #194 I
+ public static final int GL_BLEND_EQUATION_ALPHA = 34877;
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/lwjgl/util/glu/GLU.java b/src/main/java/org/lwjgl/util/glu/GLU.java
new file mode 100644
index 0000000..c4fae41
--- /dev/null
+++ b/src/main/java/org/lwjgl/util/glu/GLU.java
@@ -0,0 +1,7 @@
+package org.lwjgl.util.glu;
+
+import org.lwjgl.opengl.GL11;
+
+public class GLU extends GL11 {
+
+}