Got Custom Items working (Kinda)
This commit is contained in:
parent
c8dddcdd1f
commit
ab3bf15fec
|
@ -7,6 +7,8 @@ import net.lax1dude.eaglercraft.v1_8.internal.buffer.IntBuffer;
|
||||||
|
|
||||||
import static org.lwjgl.opengles.GLES30.*;
|
import static org.lwjgl.opengles.GLES30.*;
|
||||||
|
|
||||||
|
import org.lwjgl.opengles.GLES31;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
* Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
|
||||||
*
|
*
|
||||||
|
@ -527,4 +529,8 @@ public class PlatformOpenGL {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int _wglGetTexLevelParameteri(int glTexture2d, int i, int glTextureWidth) {
|
||||||
|
return GLES31.glGetTexLevelParameteri(glTexture2d, i, glTextureWidth);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* 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.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Writer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes a sequence of translators one after the other. Execution ends whenever
|
||||||
|
* the first translator consumes code points from the input.
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
* @deprecated As of 3.6, use Apache Commons Text
|
||||||
|
* <a href="https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/translate/AggregateTranslator.html">
|
||||||
|
* AggregateTranslator</a> instead
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public class AggregateTranslator extends CharSequenceTranslator {
|
||||||
|
|
||||||
|
private final CharSequenceTranslator[] translators;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify the translators to be used at creation time.
|
||||||
|
*
|
||||||
|
* @param translators CharSequenceTranslator array to aggregate
|
||||||
|
*/
|
||||||
|
public AggregateTranslator(final CharSequenceTranslator... translators) {
|
||||||
|
this.translators = ArrayUtils.clone(translators);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The first translator to consume code points from the input is the 'winner'.
|
||||||
|
* Execution stops with the number of consumed code points being returned.
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
|
||||||
|
for (final CharSequenceTranslator translator : translators) {
|
||||||
|
final int consumed = translator.translate(input, index, out);
|
||||||
|
if (consumed != 0) {
|
||||||
|
return consumed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
360
src/main/java/net/PeytonPlayz585/shadow/ArrayUtils.java
Normal file
360
src/main/java/net/PeytonPlayz585/shadow/ArrayUtils.java
Normal file
|
@ -0,0 +1,360 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class ArrayUtils {
|
||||||
|
/**
|
||||||
|
* Clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param array the array to clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static boolean[] clone(final boolean[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param array the array to clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static byte[] clone(final byte[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param array the array to clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static char[] clone(final char[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param array the array to clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static double[] clone(final double[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param array the array to clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static float[] clone(final float[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param array the array to clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static int[] clone(final int[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param array the array to clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static long[] clone(final long[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param array the array to clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static short[] clone(final short[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shallow clones an array or returns {@code null}.
|
||||||
|
* <p>
|
||||||
|
* The objects in the array are not cloned, thus there is no special handling for multi-dimensional arrays.
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* This method returns {@code null} for a {@code null} input array.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param <T> the component type of the array
|
||||||
|
* @param array the array to shallow clone, may be {@code null}
|
||||||
|
* @return the cloned array, {@code null} if {@code null} input
|
||||||
|
*/
|
||||||
|
public static <T> T[] clone(final T[] array) {
|
||||||
|
return array != null ? array.clone() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A fluent version of {@link System#arraycopy(Object, int, Object, int, int)} that returns the destination array.
|
||||||
|
*
|
||||||
|
* @param <T> the type.
|
||||||
|
* @param source the source array.
|
||||||
|
* @param sourcePos starting position in the source array.
|
||||||
|
* @param destPos starting position in the destination data.
|
||||||
|
* @param length the number of array elements to be copied.
|
||||||
|
* @param allocator allocates the array to populate and return.
|
||||||
|
* @return dest
|
||||||
|
* @throws IndexOutOfBoundsException if copying would cause access of data outside array bounds.
|
||||||
|
* @throws ArrayStoreException if an element in the <code>src</code> array could not be stored into the <code>dest</code> array because of a type
|
||||||
|
* mismatch.
|
||||||
|
* @throws NullPointerException if either <code>src</code> or <code>dest</code> is <code>null</code>.
|
||||||
|
* @since 3.15.0
|
||||||
|
*/
|
||||||
|
public static <T> T arraycopy(final T source, final int sourcePos, final int destPos, final int length, final Function<Integer, T> allocator) {
|
||||||
|
return arraycopy(source, sourcePos, allocator.apply(length), destPos, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A fluent version of {@link System#arraycopy(Object, int, Object, int, int)} that returns the destination array.
|
||||||
|
*
|
||||||
|
* @param <T> the type.
|
||||||
|
* @param source the source array.
|
||||||
|
* @param sourcePos starting position in the source array.
|
||||||
|
* @param destPos starting position in the destination data.
|
||||||
|
* @param length the number of array elements to be copied.
|
||||||
|
* @param allocator allocates the array to populate and return.
|
||||||
|
* @return dest
|
||||||
|
* @throws IndexOutOfBoundsException if copying would cause access of data outside array bounds.
|
||||||
|
* @throws ArrayStoreException if an element in the <code>src</code> array could not be stored into the <code>dest</code> array because of a type
|
||||||
|
* mismatch.
|
||||||
|
* @throws NullPointerException if either <code>src</code> or <code>dest</code> is <code>null</code>.
|
||||||
|
* @since 3.15.0
|
||||||
|
*/
|
||||||
|
public static <T> T arraycopy(final T source, final int sourcePos, final int destPos, final int length, final Supplier<T> allocator) {
|
||||||
|
return arraycopy(source, sourcePos, allocator.get(), destPos, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A fluent version of {@link System#arraycopy(Object, int, Object, int, int)} that returns the destination array.
|
||||||
|
*
|
||||||
|
* @param <T> the type
|
||||||
|
* @param source the source array.
|
||||||
|
* @param sourcePos starting position in the source array.
|
||||||
|
* @param dest the destination array.
|
||||||
|
* @param destPos starting position in the destination data.
|
||||||
|
* @param length the number of array elements to be copied.
|
||||||
|
* @return dest
|
||||||
|
* @throws IndexOutOfBoundsException if copying would cause access of data outside array bounds.
|
||||||
|
* @throws ArrayStoreException if an element in the <code>src</code> array could not be stored into the <code>dest</code> array because of a type
|
||||||
|
* mismatch.
|
||||||
|
* @throws NullPointerException if either <code>src</code> or <code>dest</code> is <code>null</code>.
|
||||||
|
* @since 3.15.0
|
||||||
|
*/
|
||||||
|
public static <T> T arraycopy(final T source, final int sourcePos, final T dest, final int destPos, final int length) {
|
||||||
|
System.arraycopy(source, sourcePos, dest, destPos, length);
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToString(boolean[] arr, String separator)
|
||||||
|
{
|
||||||
|
if (arr == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringBuffer stringbuffer = new StringBuffer(arr.length * 5);
|
||||||
|
|
||||||
|
for (int i = 0; i < arr.length; ++i)
|
||||||
|
{
|
||||||
|
boolean flag = arr[i];
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
stringbuffer.append(separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append(String.valueOf(flag));
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToString(float[] arr)
|
||||||
|
{
|
||||||
|
return arrayToString(arr, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToString(float[] arr, String separator)
|
||||||
|
{
|
||||||
|
if (arr == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringBuffer stringbuffer = new StringBuffer(arr.length * 5);
|
||||||
|
|
||||||
|
for (int i = 0; i < arr.length; ++i)
|
||||||
|
{
|
||||||
|
float f = arr[i];
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
stringbuffer.append(separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append(String.valueOf(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToString(float[] arr, String separator, String format)
|
||||||
|
{
|
||||||
|
if (arr == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringBuffer stringbuffer = new StringBuffer(arr.length * 5);
|
||||||
|
|
||||||
|
for (int i = 0; i < arr.length; ++i)
|
||||||
|
{
|
||||||
|
float f = arr[i];
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
stringbuffer.append(separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append(String.format(format, new Object[] {Float.valueOf(f)}));
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToString(int[] arr)
|
||||||
|
{
|
||||||
|
return arrayToString(arr, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToString(int[] arr, String separator)
|
||||||
|
{
|
||||||
|
if (arr == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringBuffer stringbuffer = new StringBuffer(arr.length * 5);
|
||||||
|
|
||||||
|
for (int i = 0; i < arr.length; ++i)
|
||||||
|
{
|
||||||
|
int j = arr[i];
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
stringbuffer.append(separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append(String.valueOf(j));
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToHexString(int[] arr, String separator)
|
||||||
|
{
|
||||||
|
if (arr == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringBuffer stringbuffer = new StringBuffer(arr.length * 5);
|
||||||
|
|
||||||
|
for (int i = 0; i < arr.length; ++i)
|
||||||
|
{
|
||||||
|
int j = arr[i];
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
stringbuffer.append(separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append("0x");
|
||||||
|
stringbuffer.append(Integer.toHexString(j));
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToString(Object[] arr)
|
||||||
|
{
|
||||||
|
return arrayToString(arr, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String arrayToString(Object[] arr, String separator)
|
||||||
|
{
|
||||||
|
if (arr == null)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StringBuffer stringbuffer = new StringBuffer(arr.length * 5);
|
||||||
|
|
||||||
|
for (int i = 0; i < arr.length; ++i)
|
||||||
|
{
|
||||||
|
Object object = arr[i];
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
stringbuffer.append(separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append(String.valueOf(object));
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
* 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.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.io.UncheckedIOException;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An API for translating text.
|
||||||
|
* Its core use is to escape and unescape text. Because escaping and unescaping
|
||||||
|
* is completely contextual, the API does not present two separate signatures.
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
* @deprecated As of 3.6, use Apache Commons Text
|
||||||
|
* <a href="https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/translate/CharSequenceTranslator.html">
|
||||||
|
* CharSequenceTranslator</a> instead
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public abstract class CharSequenceTranslator {
|
||||||
|
|
||||||
|
static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an upper case hexadecimal {@link String} for the given
|
||||||
|
* character.
|
||||||
|
*
|
||||||
|
* @param codePoint The code point to convert.
|
||||||
|
* @return An upper case hexadecimal {@link String}
|
||||||
|
*/
|
||||||
|
public static String hex(final int codePoint) {
|
||||||
|
return Integer.toHexString(codePoint).toUpperCase(Locale.ENGLISH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for non-Writer usage.
|
||||||
|
* @param input CharSequence to be translated
|
||||||
|
* @return String output of translation
|
||||||
|
*/
|
||||||
|
public final String translate(final CharSequence input) {
|
||||||
|
if (input == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
final StringWriter writer = new StringWriter(input.length() * 2);
|
||||||
|
translate(input, writer);
|
||||||
|
return writer.toString();
|
||||||
|
} catch (final IOException ioe) {
|
||||||
|
// this should never ever happen while writing to a StringWriter
|
||||||
|
throw new UncheckedIOException(ioe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translate a set of code points, represented by an int index into a CharSequence,
|
||||||
|
* into another set of code points. The number of code points consumed must be returned,
|
||||||
|
* and the only IOExceptions thrown must be from interacting with the Writer so that
|
||||||
|
* the top level API may reliably ignore StringWriter IOExceptions.
|
||||||
|
*
|
||||||
|
* @param input CharSequence that is being translated
|
||||||
|
* @param index int representing the current point of translation
|
||||||
|
* @param out Writer to translate the text to
|
||||||
|
* @return int count of code points consumed
|
||||||
|
* @throws IOException if and only if the Writer produces an IOException
|
||||||
|
*/
|
||||||
|
public abstract int translate(CharSequence input, int index, Writer out) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translate an input onto a Writer. This is intentionally final as its algorithm is
|
||||||
|
* tightly coupled with the abstract method of this class.
|
||||||
|
*
|
||||||
|
* @param input CharSequence that is being translated
|
||||||
|
* @param writer Writer to translate the text to
|
||||||
|
* @throws IOException if and only if the Writer produces an IOException
|
||||||
|
*/
|
||||||
|
public final void translate(final CharSequence input, final Writer writer) throws IOException {
|
||||||
|
Objects.requireNonNull(writer, "writer");
|
||||||
|
if (input == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int pos = 0;
|
||||||
|
final int len = input.length();
|
||||||
|
while (pos < len) {
|
||||||
|
final int consumed = translate(input, pos, writer);
|
||||||
|
if (consumed == 0) {
|
||||||
|
// inlined implementation of Character.toChars(Character.codePointAt(input, pos))
|
||||||
|
// avoids allocating temp char arrays and duplicate checks
|
||||||
|
final char c1 = input.charAt(pos);
|
||||||
|
writer.write(c1);
|
||||||
|
pos++;
|
||||||
|
if (Character.isHighSurrogate(c1) && pos < len) {
|
||||||
|
final char c2 = input.charAt(pos);
|
||||||
|
if (Character.isLowSurrogate(c2)) {
|
||||||
|
writer.write(c2);
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// contract with translators is that they have to understand code points
|
||||||
|
// and they just took care of a surrogate pair
|
||||||
|
for (int pt = 0; pt < consumed; pt++) {
|
||||||
|
pos += Character.charCount(Character.codePointAt(input, pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to create a merger of this translator with another set of
|
||||||
|
* translators. Useful in customizing the standard functionality.
|
||||||
|
*
|
||||||
|
* @param translators CharSequenceTranslator array of translators to merge with this one
|
||||||
|
* @return CharSequenceTranslator merging this translator with the others
|
||||||
|
*/
|
||||||
|
public final CharSequenceTranslator with(final CharSequenceTranslator... translators) {
|
||||||
|
final CharSequenceTranslator[] newArray = new CharSequenceTranslator[translators.length + 1];
|
||||||
|
newArray[0] = this;
|
||||||
|
return new AggregateTranslator(ArrayUtils.arraycopy(translators, 0, newArray, 1, translators.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -3,12 +3,14 @@ package net.PeytonPlayz585.shadow;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.reflect.Reflector;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||||
|
@ -298,6 +300,10 @@ public class Config {
|
||||||
}
|
}
|
||||||
return !isDynamicLights() ? false : true;
|
return !isDynamicLights() ? false : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isCustomItems() {
|
||||||
|
return gameSettings.ofCustomItems;
|
||||||
|
}
|
||||||
|
|
||||||
public static int limit(int p_limit_0_, int p_limit_1_, int p_limit_2_) {
|
public static int limit(int p_limit_0_, int p_limit_1_, int p_limit_2_) {
|
||||||
return p_limit_0_ < p_limit_1_ ? p_limit_1_ : (p_limit_0_ > p_limit_2_ ? p_limit_2_ : p_limit_0_);
|
return p_limit_0_ < p_limit_1_ ? p_limit_1_ : (p_limit_0_ > p_limit_2_ ? p_limit_2_ : p_limit_0_);
|
||||||
|
@ -410,7 +416,7 @@ public class Config {
|
||||||
public static DefaultResourcePack getDefaultResourcePack() {
|
public static DefaultResourcePack getDefaultResourcePack() {
|
||||||
if (defaultResourcePackLazy == null) {
|
if (defaultResourcePackLazy == null) {
|
||||||
Minecraft minecraft = Minecraft.getMinecraft();
|
Minecraft minecraft = Minecraft.getMinecraft();
|
||||||
defaultResourcePackLazy = (DefaultResourcePack)Minecraft.getMinecraft().mcDefaultResourcePack;
|
defaultResourcePackLazy = (DefaultResourcePack)Reflector.getFieldValue(minecraft, Reflector.Minecraft_defaultResourcePack);
|
||||||
|
|
||||||
if (defaultResourcePackLazy == null) {
|
if (defaultResourcePackLazy == null) {
|
||||||
ResourcePackRepository resourcepackrepository = minecraft.getResourcePackRepository();
|
ResourcePackRepository resourcepackrepository = minecraft.getResourcePackRepository();
|
||||||
|
@ -452,8 +458,9 @@ public class Config {
|
||||||
List list = resourcepackrepository.getRepositoryEntries();
|
List list = resourcepackrepository.getRepositoryEntries();
|
||||||
List list1 = new ArrayList();
|
List list1 = new ArrayList();
|
||||||
|
|
||||||
for (Object resourcepackrepository$entry : list) {
|
for (Object resourcepackrepository$entry0 : list) {
|
||||||
list1.add(((ResourcePackRepository.Entry) resourcepackrepository$entry).getResourcePack());
|
ResourcePackRepository.Entry resourcepackrepository$entry = (ResourcePackRepository.Entry) resourcepackrepository$entry0;
|
||||||
|
list1.add(resourcepackrepository$entry.getResourcePack());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resourcepackrepository.getResourcePackInstance() != null) {
|
if (resourcepackrepository.getResourcePackInstance() != null) {
|
||||||
|
@ -595,4 +602,31 @@ public class Config {
|
||||||
return stringbuffer.toString();
|
return stringbuffer.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Object[] addObjectsToArray(Object[] p_addObjectsToArray_0_, Object[] p_addObjectsToArray_1_) {
|
||||||
|
if (p_addObjectsToArray_0_ == null) {
|
||||||
|
throw new NullPointerException("The given array is NULL");
|
||||||
|
} else if (p_addObjectsToArray_1_.length == 0) {
|
||||||
|
return p_addObjectsToArray_0_;
|
||||||
|
} else {
|
||||||
|
int i = p_addObjectsToArray_0_.length;
|
||||||
|
int j = i + p_addObjectsToArray_1_.length;
|
||||||
|
Object[] aobject = (Object[])((Object[])Array.newInstance(p_addObjectsToArray_0_.getClass().getComponentType(), j));
|
||||||
|
System.arraycopy(p_addObjectsToArray_0_, 0, aobject, 0, i);
|
||||||
|
System.arraycopy(p_addObjectsToArray_1_, 0, aobject, i, p_addObjectsToArray_1_.length);
|
||||||
|
return aobject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean equals(Object p_equals_0_, Object p_equals_1_) {
|
||||||
|
return p_equals_0_ == p_equals_1_ ? true : (p_equals_0_ == null ? false : p_equals_0_.equals(p_equals_1_));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void error(String s, Throwable t) {
|
||||||
|
LOGGER.error("[Shadow Client] " + s, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void warn(String s, Throwable t) {
|
||||||
|
LOGGER.warn("[Shadow Client] " + s, t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,968 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums;
|
||||||
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||||
|
import net.minecraft.client.renderer.block.model.BlockPart;
|
||||||
|
import net.minecraft.client.renderer.block.model.BlockPartFace;
|
||||||
|
import net.minecraft.client.renderer.block.model.FaceBakery;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemModelGenerator;
|
||||||
|
import net.minecraft.client.renderer.block.model.ModelBlock;
|
||||||
|
import net.minecraft.client.renderer.texture.ITextureObject;
|
||||||
|
import net.minecraft.client.renderer.texture.TextureManager;
|
||||||
|
import net.minecraft.client.renderer.texture.TextureMap;
|
||||||
|
import net.minecraft.client.resources.model.IBakedModel;
|
||||||
|
import net.minecraft.client.resources.model.ModelBakery;
|
||||||
|
import net.minecraft.client.resources.model.ModelManager;
|
||||||
|
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||||
|
import net.minecraft.client.resources.model.ModelRotation;
|
||||||
|
import net.minecraft.client.resources.model.SimpleBakedModel;
|
||||||
|
import net.minecraft.init.Items;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemArmor;
|
||||||
|
import net.minecraft.util.EnumFacing;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
public class CustomItemProperties {
|
||||||
|
public String name = null;
|
||||||
|
public String basePath = null;
|
||||||
|
public int type = 1;
|
||||||
|
public int[] items = null;
|
||||||
|
public String texture = null;
|
||||||
|
public Map < String, String > mapTextures = null;
|
||||||
|
public String model = null;
|
||||||
|
public Map < String, String > mapModels = null;
|
||||||
|
public RangeListInt damage = null;
|
||||||
|
public boolean damagePercent = false;
|
||||||
|
public int damageMask = 0;
|
||||||
|
public RangeListInt stackSize = null;
|
||||||
|
public RangeListInt enchantmentIds = null;
|
||||||
|
public RangeListInt enchantmentLevels = null;
|
||||||
|
public NbtTagValue[] nbtTagValues = null;
|
||||||
|
public int hand = 0;
|
||||||
|
public int blend = 1;
|
||||||
|
public float speed = 0.0F;
|
||||||
|
public float rotation = 0.0F;
|
||||||
|
public int layer = 0;
|
||||||
|
public float duration = 1.0F;
|
||||||
|
public int weight = 0;
|
||||||
|
public ResourceLocation textureLocation = null;
|
||||||
|
public Map mapTextureLocations = null;
|
||||||
|
public EaglerTextureAtlasSprite sprite = null;
|
||||||
|
public Map mapSprites = null;
|
||||||
|
public IBakedModel bakedModelTexture = null;
|
||||||
|
public Map < String, IBakedModel > mapBakedModelsTexture = null;
|
||||||
|
public IBakedModel bakedModelFull = null;
|
||||||
|
public Map < String, IBakedModel > mapBakedModelsFull = null;
|
||||||
|
private int textureWidth = 0;
|
||||||
|
private int textureHeight = 0;
|
||||||
|
public static final int TYPE_UNKNOWN = 0;
|
||||||
|
public static final int TYPE_ITEM = 1;
|
||||||
|
public static final int TYPE_ENCHANTMENT = 2;
|
||||||
|
public static final int TYPE_ARMOR = 3;
|
||||||
|
public static final int HAND_ANY = 0;
|
||||||
|
public static final int HAND_MAIN = 1;
|
||||||
|
public static final int HAND_OFF = 2;
|
||||||
|
public static final String INVENTORY = "inventory";
|
||||||
|
|
||||||
|
public CustomItemProperties(Properties props, String path) {
|
||||||
|
this.name = parseName(path);
|
||||||
|
this.basePath = parseBasePath(path);
|
||||||
|
this.type = this.parseType(props.getProperty("type"));
|
||||||
|
this.items = this.parseItems(props.getProperty("items"), props.getProperty("matchItems"));
|
||||||
|
this.mapModels = parseModels(props, this.basePath);
|
||||||
|
this.model = parseModel(props.getProperty("model"), path, this.basePath, this.type, this.mapModels);
|
||||||
|
this.mapTextures = parseTextures(props, this.basePath);
|
||||||
|
boolean flag = this.mapModels == null && this.model == null;
|
||||||
|
this.texture = parseTexture(props.getProperty("texture"), props.getProperty("tile"), props.getProperty("source"), path, this.basePath, this.type, this.mapTextures, flag);
|
||||||
|
String s = props.getProperty("damage");
|
||||||
|
|
||||||
|
if (s != null) {
|
||||||
|
this.damagePercent = s.contains("%");
|
||||||
|
s = s.replace("%", "");
|
||||||
|
this.damage = this.parseRangeListInt(s);
|
||||||
|
this.damageMask = this.parseInt(props.getProperty("damageMask"), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.stackSize = this.parseRangeListInt(props.getProperty("stackSize"));
|
||||||
|
this.enchantmentIds = this.parseRangeListInt(props.getProperty("enchantmentIDs"), new ParserEnchantmentId());
|
||||||
|
this.enchantmentLevels = this.parseRangeListInt(props.getProperty("enchantmentLevels"));
|
||||||
|
this.nbtTagValues = this.parseNbtTagValues(props);
|
||||||
|
this.hand = this.parseHand(props.getProperty("hand"));
|
||||||
|
this.blend = Blender.parseBlend(props.getProperty("blend"));
|
||||||
|
this.speed = this.parseFloat(props.getProperty("speed"), 0.0F);
|
||||||
|
this.rotation = this.parseFloat(props.getProperty("rotation"), 0.0F);
|
||||||
|
this.layer = this.parseInt(props.getProperty("layer"), 0);
|
||||||
|
this.weight = this.parseInt(props.getProperty("weight"), 0);
|
||||||
|
this.duration = this.parseFloat(props.getProperty("duration"), 1.0F);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String parseName(String path) {
|
||||||
|
String s = path;
|
||||||
|
int i = path.lastIndexOf(47);
|
||||||
|
|
||||||
|
if (i >= 0) {
|
||||||
|
s = path.substring(i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int j = s.lastIndexOf(46);
|
||||||
|
|
||||||
|
if (j >= 0) {
|
||||||
|
s = s.substring(0, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String parseBasePath(String path) {
|
||||||
|
int i = path.lastIndexOf(47);
|
||||||
|
return i < 0 ? "" : path.substring(0, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int parseType(String str) {
|
||||||
|
if (str == null) {
|
||||||
|
return 1;
|
||||||
|
} else if (str.equals("item")) {
|
||||||
|
return 1;
|
||||||
|
} else if (str.equals("enchantment")) {
|
||||||
|
return 2;
|
||||||
|
} else if (str.equals("armor")) {
|
||||||
|
return 3;
|
||||||
|
} else {
|
||||||
|
Config.warn("Unknown method: " + str);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[] parseItems(String str, String str2) {
|
||||||
|
if (str == null) {
|
||||||
|
str = str2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
str = str.trim();
|
||||||
|
Set set = new TreeSet();
|
||||||
|
String[] astring = Config.tokenize(str, " ");
|
||||||
|
label45:
|
||||||
|
|
||||||
|
for (int i = 0; i < astring.length; ++i) {
|
||||||
|
String s = astring[i];
|
||||||
|
int j = Config.parseInt(s, -1);
|
||||||
|
|
||||||
|
if (j >= 0) {
|
||||||
|
set.add(new Integer(j));
|
||||||
|
} else {
|
||||||
|
if (s.contains("-")) {
|
||||||
|
String[] astring1 = Config.tokenize(s, "-");
|
||||||
|
|
||||||
|
if (astring1.length == 2) {
|
||||||
|
int k = Config.parseInt(astring1[0], -1);
|
||||||
|
int l = Config.parseInt(astring1[1], -1);
|
||||||
|
|
||||||
|
if (k >= 0 && l >= 0) {
|
||||||
|
int i1 = Math.min(k, l);
|
||||||
|
int j1 = Math.max(k, l);
|
||||||
|
int k1 = i1;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (k1 > j1) {
|
||||||
|
continue label45;
|
||||||
|
}
|
||||||
|
|
||||||
|
set.add(new Integer(k1));
|
||||||
|
++k1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item item = Item.getByNameOrId(s);
|
||||||
|
|
||||||
|
if (item == null) {
|
||||||
|
Config.warn("Item not found: " + s);
|
||||||
|
} else {
|
||||||
|
int i2 = Item.getIdFromItem(item);
|
||||||
|
|
||||||
|
if (i2 <= 0) {
|
||||||
|
Config.warn("Item not found: " + s);
|
||||||
|
} else {
|
||||||
|
set.add(new Integer(i2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Integer[] ainteger = (Integer[])((Integer[]) set.toArray(new Integer[set.size()]));
|
||||||
|
int[] aint = new int[ainteger.length];
|
||||||
|
|
||||||
|
for (int l1 = 0; l1 < aint.length; ++l1) {
|
||||||
|
aint[l1] = ainteger[l1].intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
return aint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String parseTexture(String texStr, String texStr2, String texStr3, String path, String basePath, int type, Map < String, String > mapTexs, boolean textureFromPath) {
|
||||||
|
if (texStr == null) {
|
||||||
|
texStr = texStr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (texStr == null) {
|
||||||
|
texStr = texStr3;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (texStr != null) {
|
||||||
|
String s2 = ".png";
|
||||||
|
|
||||||
|
if (texStr.endsWith(s2)) {
|
||||||
|
texStr = texStr.substring(0, texStr.length() - s2.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
texStr = fixTextureName(texStr, basePath);
|
||||||
|
return texStr;
|
||||||
|
} else if (type == 3) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
if (mapTexs != null) {
|
||||||
|
String s = (String) mapTexs.get("texture.bow_standby");
|
||||||
|
|
||||||
|
if (s != null) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!textureFromPath) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
String s1 = path;
|
||||||
|
int i = path.lastIndexOf(47);
|
||||||
|
|
||||||
|
if (i >= 0) {
|
||||||
|
s1 = path.substring(i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int j = s1.lastIndexOf(46);
|
||||||
|
|
||||||
|
if (j >= 0) {
|
||||||
|
s1 = s1.substring(0, j);
|
||||||
|
}
|
||||||
|
|
||||||
|
s1 = fixTextureName(s1, basePath);
|
||||||
|
return s1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map parseTextures(Properties props, String basePath) {
|
||||||
|
String s = "texture.";
|
||||||
|
Map map = getMatchingProperties(props, s);
|
||||||
|
|
||||||
|
if (map.size() <= 0) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
Set set = map.keySet();
|
||||||
|
Map map1 = new LinkedHashMap();
|
||||||
|
|
||||||
|
for (Object e: set) {
|
||||||
|
String s1 = (String) e;
|
||||||
|
String s2 = (String) map.get(s1);
|
||||||
|
s2 = fixTextureName(s2, basePath);
|
||||||
|
map1.put(s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return map1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String fixTextureName(String iconName, String basePath) {
|
||||||
|
iconName = TextureUtils.fixResourcePath(iconName, basePath);
|
||||||
|
|
||||||
|
if (!iconName.startsWith(basePath) && !iconName.startsWith("textures/") && !iconName.startsWith("mcpatcher/")) {
|
||||||
|
iconName = basePath + "/" + iconName;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iconName.endsWith(".png")) {
|
||||||
|
iconName = iconName.substring(0, iconName.length() - 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iconName.startsWith("/")) {
|
||||||
|
iconName = iconName.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return iconName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String parseModel(String modelStr, String path, String basePath, int type, Map < String, String > mapModelNames) {
|
||||||
|
if (modelStr != null) {
|
||||||
|
String s1 = ".json";
|
||||||
|
|
||||||
|
if (modelStr.endsWith(s1)) {
|
||||||
|
modelStr = modelStr.substring(0, modelStr.length() - s1.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
modelStr = fixModelName(modelStr, basePath);
|
||||||
|
return modelStr;
|
||||||
|
} else if (type == 3) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
if (mapModelNames != null) {
|
||||||
|
String s = (String) mapModelNames.get("model.bow_standby");
|
||||||
|
|
||||||
|
if (s != null) {
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return modelStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map parseModels(Properties props, String basePath) {
|
||||||
|
String s = "model.";
|
||||||
|
Map map = getMatchingProperties(props, s);
|
||||||
|
|
||||||
|
if (map.size() <= 0) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
Set set = map.keySet();
|
||||||
|
Map map1 = new LinkedHashMap();
|
||||||
|
|
||||||
|
for (Object e: set) {
|
||||||
|
String s1 = (String) e;
|
||||||
|
String s2 = (String) map.get(s1);
|
||||||
|
s2 = fixModelName(s2, basePath);
|
||||||
|
map1.put(s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return map1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String fixModelName(String modelName, String basePath) {
|
||||||
|
modelName = TextureUtils.fixResourcePath(modelName, basePath);
|
||||||
|
boolean flag = modelName.startsWith("block/") || modelName.startsWith("item/");
|
||||||
|
|
||||||
|
if (!modelName.startsWith(basePath) && !flag && !modelName.startsWith("mcpatcher/")) {
|
||||||
|
modelName = basePath + "/" + modelName;
|
||||||
|
}
|
||||||
|
|
||||||
|
String s = ".json";
|
||||||
|
|
||||||
|
if (modelName.endsWith(s)) {
|
||||||
|
modelName = modelName.substring(0, modelName.length() - s.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modelName.startsWith("/")) {
|
||||||
|
modelName = modelName.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return modelName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int parseInt(String str, int defVal) {
|
||||||
|
if (str == null) {
|
||||||
|
return defVal;
|
||||||
|
} else {
|
||||||
|
str = str.trim();
|
||||||
|
int i = Config.parseInt(str, Integer.MIN_VALUE);
|
||||||
|
|
||||||
|
if (i == Integer.MIN_VALUE) {
|
||||||
|
Config.warn("Invalid integer: " + str);
|
||||||
|
return defVal;
|
||||||
|
} else {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private float parseFloat(String str, float defVal) {
|
||||||
|
if (str == null) {
|
||||||
|
return defVal;
|
||||||
|
} else {
|
||||||
|
str = str.trim();
|
||||||
|
float f = Config.parseFloat(str, Float.MIN_VALUE);
|
||||||
|
|
||||||
|
if (f == Float.MIN_VALUE) {
|
||||||
|
Config.warn("Invalid float: " + str);
|
||||||
|
return defVal;
|
||||||
|
} else {
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private RangeListInt parseRangeListInt(String str) {
|
||||||
|
return this.parseRangeListInt(str, (IParserInt) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private RangeListInt parseRangeListInt(String str, IParserInt parser) {
|
||||||
|
if (str == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
String[] astring = Config.tokenize(str, " ");
|
||||||
|
RangeListInt rangelistint = new RangeListInt();
|
||||||
|
|
||||||
|
for (int i = 0; i < astring.length; ++i) {
|
||||||
|
String s = astring[i];
|
||||||
|
|
||||||
|
if (parser != null) {
|
||||||
|
int j = parser.parse(s, Integer.MIN_VALUE);
|
||||||
|
|
||||||
|
if (j != Integer.MIN_VALUE) {
|
||||||
|
rangelistint.addRange(new RangeInt(j, j));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RangeInt rangeint = this.parseRangeInt(s);
|
||||||
|
|
||||||
|
if (rangeint == null) {
|
||||||
|
Config.warn("Invalid range list: " + str);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
rangelistint.addRange(rangeint);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rangelistint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private RangeInt parseRangeInt(String str) {
|
||||||
|
if (str == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
str = str.trim();
|
||||||
|
int i = str.length() - str.replace("-", "").length();
|
||||||
|
|
||||||
|
if (i > 1) {
|
||||||
|
Config.warn("Invalid range: " + str);
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
String[] astring = Config.tokenize(str, "- ");
|
||||||
|
int[] aint = new int[astring.length];
|
||||||
|
|
||||||
|
for (int j = 0; j < astring.length; ++j) {
|
||||||
|
String s = astring[j];
|
||||||
|
int k = Config.parseInt(s, -1);
|
||||||
|
|
||||||
|
if (k < 0) {
|
||||||
|
Config.warn("Invalid range: " + str);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
aint[j] = k;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aint.length == 1) {
|
||||||
|
int i1 = aint[0];
|
||||||
|
|
||||||
|
if (str.startsWith("-")) {
|
||||||
|
return new RangeInt(0, i1);
|
||||||
|
} else if (str.endsWith("-")) {
|
||||||
|
return new RangeInt(i1, 65535);
|
||||||
|
} else {
|
||||||
|
return new RangeInt(i1, i1);
|
||||||
|
}
|
||||||
|
} else if (aint.length == 2) {
|
||||||
|
int l = Math.min(aint[0], aint[1]);
|
||||||
|
int j1 = Math.max(aint[0], aint[1]);
|
||||||
|
return new RangeInt(l, j1);
|
||||||
|
} else {
|
||||||
|
Config.warn("Invalid range: " + str);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private NbtTagValue[] parseNbtTagValues(Properties props) {
|
||||||
|
String s = "nbt.";
|
||||||
|
Map map = getMatchingProperties(props, s);
|
||||||
|
|
||||||
|
if (map.size() <= 0) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
List list = new ArrayList();
|
||||||
|
|
||||||
|
for (Object e: map.keySet()) {
|
||||||
|
String s1 = (String) e;
|
||||||
|
String s2 = (String) map.get(s1);
|
||||||
|
String s3 = s1.substring(s.length());
|
||||||
|
NbtTagValue nbttagvalue = new NbtTagValue(s3, s2);
|
||||||
|
list.add(nbttagvalue);
|
||||||
|
}
|
||||||
|
|
||||||
|
NbtTagValue[] anbttagvalue = (NbtTagValue[])((NbtTagValue[]) list.toArray(new NbtTagValue[list.size()]));
|
||||||
|
return anbttagvalue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map getMatchingProperties(Properties props, String keyPrefix) {
|
||||||
|
Map map = new LinkedHashMap();
|
||||||
|
|
||||||
|
for (Object e: props.keySet()) {
|
||||||
|
String s = (String) e;
|
||||||
|
String s1 = props.getProperty(s);
|
||||||
|
|
||||||
|
if (s.startsWith(keyPrefix)) {
|
||||||
|
map.put(s, s1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int parseHand(String str) {
|
||||||
|
if (str == null) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
str = str.toLowerCase();
|
||||||
|
|
||||||
|
if (str.equals("any")) {
|
||||||
|
return 0;
|
||||||
|
} else if (str.equals("main")) {
|
||||||
|
return 1;
|
||||||
|
} else if (str.equals("off")) {
|
||||||
|
return 2;
|
||||||
|
} else {
|
||||||
|
Config.warn("Invalid hand: " + str);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isValid(String path) {
|
||||||
|
if (this.name != null && this.name.length() > 0) {
|
||||||
|
if (this.basePath == null) {
|
||||||
|
Config.warn("No base path found: " + path);
|
||||||
|
return false;
|
||||||
|
} else if (this.type == 0) {
|
||||||
|
Config.warn("No type defined: " + path);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
if (this.type == 1 || this.type == 3) {
|
||||||
|
if (this.items == null) {
|
||||||
|
this.items = this.detectItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.items == null) {
|
||||||
|
Config.warn("No items defined: " + path);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.texture == null && this.mapTextures == null && this.model == null && this.mapModels == null) {
|
||||||
|
Config.warn("No texture or model specified: " + path);
|
||||||
|
return false;
|
||||||
|
} else if (this.type == 2 && this.enchantmentIds == null) {
|
||||||
|
Config.warn("No enchantmentIDs specified: " + path);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Config.warn("No name found: " + path);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[] detectItems() {
|
||||||
|
Item item = Item.getByNameOrId(this.name);
|
||||||
|
|
||||||
|
if (item == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
int i = Item.getIdFromItem(item);
|
||||||
|
return i <= 0 ? null : new int[] {
|
||||||
|
i
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateIcons(TextureMap textureMap) {
|
||||||
|
if (this.texture != null) {
|
||||||
|
this.textureLocation = this.getTextureLocation(this.texture);
|
||||||
|
|
||||||
|
if (this.type == 1) {
|
||||||
|
ResourceLocation resourcelocation = this.getSpriteLocation(this.textureLocation);
|
||||||
|
this.sprite = textureMap.registerSprite(resourcelocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.mapTextures != null) {
|
||||||
|
this.mapTextureLocations = new HashMap();
|
||||||
|
this.mapSprites = new HashMap();
|
||||||
|
|
||||||
|
for (String s: this.mapTextures.keySet()) {
|
||||||
|
String s1 = (String) this.mapTextures.get(s);
|
||||||
|
ResourceLocation resourcelocation1 = this.getTextureLocation(s1);
|
||||||
|
this.mapTextureLocations.put(s, resourcelocation1);
|
||||||
|
|
||||||
|
if (this.type == 1) {
|
||||||
|
ResourceLocation resourcelocation2 = this.getSpriteLocation(resourcelocation1);
|
||||||
|
EaglerTextureAtlasSprite textureatlassprite = textureMap.registerSprite(resourcelocation2);
|
||||||
|
this.mapSprites.put(s, textureatlassprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResourceLocation getTextureLocation(String texName) {
|
||||||
|
if (texName == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
ResourceLocation resourcelocation = new ResourceLocation(texName);
|
||||||
|
String s = resourcelocation.getResourceDomain();
|
||||||
|
String s1 = resourcelocation.getResourcePath();
|
||||||
|
|
||||||
|
if (!s1.contains("/")) {
|
||||||
|
s1 = "textures/items/" + s1;
|
||||||
|
}
|
||||||
|
|
||||||
|
String s2 = s1 + ".png";
|
||||||
|
ResourceLocation resourcelocation1 = new ResourceLocation(s, s2);
|
||||||
|
boolean flag = Config.hasResource(resourcelocation1);
|
||||||
|
|
||||||
|
if (!flag) {
|
||||||
|
Config.warn("File not found: " + s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return resourcelocation1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResourceLocation getSpriteLocation(ResourceLocation resLoc) {
|
||||||
|
String s = resLoc.getResourcePath();
|
||||||
|
s = StrUtils.removePrefix(s, "textures/");
|
||||||
|
s = StrUtils.removeSuffix(s, ".png");
|
||||||
|
ResourceLocation resourcelocation = new ResourceLocation(resLoc.getResourceDomain(), s);
|
||||||
|
return resourcelocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateModelTexture(TextureMap textureMap, ItemModelGenerator itemModelGenerator) {
|
||||||
|
if (this.texture != null || this.mapTextures != null) {
|
||||||
|
String[] astring = this.getModelTextures();
|
||||||
|
boolean flag = this.isUseTint();
|
||||||
|
this.bakedModelTexture = makeBakedModel(textureMap, itemModelGenerator, astring, flag);
|
||||||
|
|
||||||
|
if (this.type == 1 && this.mapTextures != null) {
|
||||||
|
for (String s: this.mapTextures.keySet()) {
|
||||||
|
String s1 = (String) this.mapTextures.get(s);
|
||||||
|
String s2 = StrUtils.removePrefix(s, "texture.");
|
||||||
|
|
||||||
|
if (s2.startsWith("bow") || s2.startsWith("fishing_rod") || s2.startsWith("shield")) {
|
||||||
|
String[] astring1 = new String[] {
|
||||||
|
s1
|
||||||
|
};
|
||||||
|
IBakedModel ibakedmodel = makeBakedModel(textureMap, itemModelGenerator, astring1, flag);
|
||||||
|
|
||||||
|
if (this.mapBakedModelsTexture == null) {
|
||||||
|
this.mapBakedModelsTexture = new HashMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.mapBakedModelsTexture.put(s2, ibakedmodel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isUseTint() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IBakedModel makeBakedModel(TextureMap textureMap, ItemModelGenerator itemModelGenerator, String[] textures, boolean useTint) {
|
||||||
|
String[] astring = new String[textures.length];
|
||||||
|
|
||||||
|
for (int i = 0; i < astring.length; ++i) {
|
||||||
|
String s = textures[i];
|
||||||
|
astring[i] = StrUtils.removePrefix(s, "textures/");
|
||||||
|
}
|
||||||
|
|
||||||
|
ModelBlock modelblock = makeModelBlock(astring);
|
||||||
|
ModelBlock modelblock1 = itemModelGenerator.makeItemModel(textureMap, modelblock);
|
||||||
|
IBakedModel ibakedmodel = bakeModel(textureMap, modelblock1, useTint);
|
||||||
|
return ibakedmodel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] getModelTextures() {
|
||||||
|
if (this.type == 1 && this.items.length == 1) {
|
||||||
|
Item item = Item.getItemById(this.items[0]);
|
||||||
|
|
||||||
|
if (item == Items.potionitem && this.damage != null && this.damage.getCountRanges() > 0) {
|
||||||
|
RangeInt rangeint = this.damage.getRange(0);
|
||||||
|
int i = rangeint.getMin();
|
||||||
|
boolean flag = (i & 16384) != 0;
|
||||||
|
String s5 = this.getMapTexture(this.mapTextures, "texture.potion_overlay", "items/potion_overlay");
|
||||||
|
String s6 = null;
|
||||||
|
|
||||||
|
if (flag) {
|
||||||
|
s6 = this.getMapTexture(this.mapTextures, "texture.potion_bottle_splash", "items/potion_bottle_splash");
|
||||||
|
} else {
|
||||||
|
s6 = this.getMapTexture(this.mapTextures, "texture.potion_bottle_drinkable", "items/potion_bottle_drinkable");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new String[] {
|
||||||
|
s5,
|
||||||
|
s6
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item instanceof ItemArmor) {
|
||||||
|
ItemArmor itemarmor = (ItemArmor) item;
|
||||||
|
|
||||||
|
if (itemarmor.getArmorMaterial() == ItemArmor.ArmorMaterial.LEATHER) {
|
||||||
|
String s = "leather";
|
||||||
|
String s1 = "helmet";
|
||||||
|
|
||||||
|
if (itemarmor.armorType == 0) {
|
||||||
|
s1 = "helmet";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemarmor.armorType == 1) {
|
||||||
|
s1 = "chestplate";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemarmor.armorType == 2) {
|
||||||
|
s1 = "leggings";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemarmor.armorType == 3) {
|
||||||
|
s1 = "boots";
|
||||||
|
}
|
||||||
|
|
||||||
|
String s2 = s + "_" + s1;
|
||||||
|
String s3 = this.getMapTexture(this.mapTextures, "texture." + s2, "items/" + s2);
|
||||||
|
String s4 = this.getMapTexture(this.mapTextures, "texture." + s2 + "_overlay", "items/" + s2 + "_overlay");
|
||||||
|
return new String[] {
|
||||||
|
s3,
|
||||||
|
s4
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new String[] {
|
||||||
|
this.texture
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getMapTexture(Map < String, String > map, String key, String def) {
|
||||||
|
if (map == null) {
|
||||||
|
return def;
|
||||||
|
} else {
|
||||||
|
String s = (String) map.get(key);
|
||||||
|
return s == null ? def : s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ModelBlock makeModelBlock(String[] modelTextures) {
|
||||||
|
StringBuffer stringbuffer = new StringBuffer();
|
||||||
|
stringbuffer.append("{\"parent\": \"builtin/generated\",\"textures\": {");
|
||||||
|
|
||||||
|
for (int i = 0; i < modelTextures.length; ++i) {
|
||||||
|
String s = modelTextures[i];
|
||||||
|
|
||||||
|
if (i > 0) {
|
||||||
|
stringbuffer.append(", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append("\"layer" + i + "\": \"" + s + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append("}}");
|
||||||
|
String s1 = stringbuffer.toString();
|
||||||
|
ModelBlock modelblock = ModelBlock.deserialize(s1);
|
||||||
|
return modelblock;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IBakedModel bakeModel(TextureMap textureMap, ModelBlock modelBlockIn, boolean useTint) {
|
||||||
|
ModelRotation modelrotation = ModelRotation.X0_Y0;
|
||||||
|
boolean flag = false;
|
||||||
|
String s = modelBlockIn.resolveTextureName("particle");
|
||||||
|
EaglerTextureAtlasSprite textureatlassprite = textureMap.getAtlasSprite((new ResourceLocation(s)).toString());
|
||||||
|
SimpleBakedModel.Builder simplebakedmodel$builder = (new SimpleBakedModel.Builder(modelBlockIn)).setTexture(textureatlassprite);
|
||||||
|
|
||||||
|
for (BlockPart blockpart: modelBlockIn.getElements()) {
|
||||||
|
for (EnumFacing enumfacing: blockpart.mapFaces.keySet()) {
|
||||||
|
BlockPartFace blockpartface = (BlockPartFace) blockpart.mapFaces.get(enumfacing);
|
||||||
|
|
||||||
|
if (!useTint) {
|
||||||
|
blockpartface = new BlockPartFace(blockpartface.cullFace, -1, blockpartface.texture, blockpartface.blockFaceUV);
|
||||||
|
}
|
||||||
|
|
||||||
|
String s1 = modelBlockIn.resolveTextureName(blockpartface.texture);
|
||||||
|
EaglerTextureAtlasSprite textureatlassprite1 = textureMap.getAtlasSprite((new ResourceLocation(s1)).toString());
|
||||||
|
BakedQuad bakedquad = makeBakedQuad(blockpart, blockpartface, textureatlassprite1, enumfacing, modelrotation, flag);
|
||||||
|
|
||||||
|
if (blockpartface.cullFace == null) {
|
||||||
|
simplebakedmodel$builder.addGeneralQuad(bakedquad);
|
||||||
|
} else {
|
||||||
|
simplebakedmodel$builder.addFaceQuad(modelrotation.rotateFace(blockpartface.cullFace), bakedquad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return simplebakedmodel$builder.makeBakedModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BakedQuad makeBakedQuad(BlockPart blockPart, BlockPartFace blockPartFace, EaglerTextureAtlasSprite textureAtlasSprite, EnumFacing enumFacing, ModelRotation modelRotation, boolean uvLocked) {
|
||||||
|
FaceBakery facebakery = new FaceBakery();
|
||||||
|
return facebakery.makeBakedQuad(blockPart.positionFrom, blockPart.positionTo, blockPartFace, textureAtlasSprite, enumFacing, modelRotation, blockPart.partRotation, uvLocked, blockPart.shade);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "" + this.basePath + "/" + this.name + ", type: " + this.type + ", items: [" + Config.arrayToString(this.items) + "], textture: " + this.texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getTextureWidth(TextureManager textureManager) {
|
||||||
|
if (this.textureWidth <= 0) {
|
||||||
|
if (this.textureLocation != null) {
|
||||||
|
ITextureObject itextureobject = textureManager.getTexture(this.textureLocation);
|
||||||
|
int i = itextureobject.getGlTextureId();
|
||||||
|
int j = GlStateManager.getBoundTexture();
|
||||||
|
GlStateManager.bindTexture(i);
|
||||||
|
this.textureWidth = EaglercraftGPU.glGetTexLevelParameteri(RealOpenGLEnums.GL_TEXTURE_2D, 0, RealOpenGLEnums.GL_TEXTURE_WIDTH);
|
||||||
|
GlStateManager.bindTexture(j);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.textureWidth <= 0) {
|
||||||
|
this.textureWidth = 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (float) this.textureWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getTextureHeight(TextureManager textureManager) {
|
||||||
|
if (this.textureHeight <= 0) {
|
||||||
|
if (this.textureLocation != null) {
|
||||||
|
ITextureObject itextureobject = textureManager.getTexture(this.textureLocation);
|
||||||
|
int i = itextureobject.getGlTextureId();
|
||||||
|
int j = GlStateManager.getBoundTexture();
|
||||||
|
GlStateManager.bindTexture(i);
|
||||||
|
this.textureHeight = EaglercraftGPU.glGetTexLevelParameteri(RealOpenGLEnums.GL_TEXTURE_2D, 0, RealOpenGLEnums.GL_TEXTURE_HEIGHT);
|
||||||
|
GlStateManager.bindTexture(j);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.textureHeight <= 0) {
|
||||||
|
this.textureHeight = 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (float) this.textureHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBakedModel getBakedModel(ResourceLocation modelLocation, boolean fullModel) {
|
||||||
|
IBakedModel ibakedmodel;
|
||||||
|
Map < String, IBakedModel > map;
|
||||||
|
|
||||||
|
if (fullModel) {
|
||||||
|
ibakedmodel = this.bakedModelFull;
|
||||||
|
map = this.mapBakedModelsFull;
|
||||||
|
} else {
|
||||||
|
ibakedmodel = this.bakedModelTexture;
|
||||||
|
map = this.mapBakedModelsTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modelLocation != null && map != null) {
|
||||||
|
String s = modelLocation.getResourcePath();
|
||||||
|
IBakedModel ibakedmodel1 = (IBakedModel) map.get(s);
|
||||||
|
|
||||||
|
if (ibakedmodel1 != null) {
|
||||||
|
return ibakedmodel1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ibakedmodel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadModels(ModelBakery modelBakery) {
|
||||||
|
if (this.model != null) {
|
||||||
|
loadItemModel(modelBakery, this.model);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.type == 1 && this.mapModels != null) {
|
||||||
|
for (String s: this.mapModels.keySet()) {
|
||||||
|
String s1 = (String) this.mapModels.get(s);
|
||||||
|
String s2 = StrUtils.removePrefix(s, "model.");
|
||||||
|
|
||||||
|
if (s2.startsWith("bow") || s2.startsWith("fishing_rod") || s2.startsWith("shield")) {
|
||||||
|
loadItemModel(modelBakery, s1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateModelsFull() {
|
||||||
|
ModelManager modelmanager = Config.getModelManager();
|
||||||
|
IBakedModel ibakedmodel = modelmanager.getMissingModel();
|
||||||
|
|
||||||
|
if (this.model != null) {
|
||||||
|
ResourceLocation resourcelocation = getModelLocation(this.model);
|
||||||
|
ModelResourceLocation modelresourcelocation = new ModelResourceLocation(resourcelocation, "inventory");
|
||||||
|
this.bakedModelFull = modelmanager.getModel(modelresourcelocation);
|
||||||
|
|
||||||
|
if (this.bakedModelFull == ibakedmodel) {
|
||||||
|
Config.warn("Custom Items: Model not found " + modelresourcelocation.getResourcePath());
|
||||||
|
this.bakedModelFull = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.type == 1 && this.mapModels != null) {
|
||||||
|
for (String s: this.mapModels.keySet()) {
|
||||||
|
String s1 = (String) this.mapModels.get(s);
|
||||||
|
String s2 = StrUtils.removePrefix(s, "model.");
|
||||||
|
|
||||||
|
if (s2.startsWith("bow") || s2.startsWith("fishing_rod") || s2.startsWith("shield")) {
|
||||||
|
ResourceLocation resourcelocation1 = getModelLocation(s1);
|
||||||
|
ModelResourceLocation modelresourcelocation1 = new ModelResourceLocation(resourcelocation1, "inventory");
|
||||||
|
IBakedModel ibakedmodel1 = modelmanager.getModel(modelresourcelocation1);
|
||||||
|
|
||||||
|
if (ibakedmodel1 == ibakedmodel) {
|
||||||
|
Config.warn("Custom Items: Model not found " + modelresourcelocation1.getResourcePath());
|
||||||
|
} else {
|
||||||
|
if (this.mapBakedModelsFull == null) {
|
||||||
|
this.mapBakedModelsFull = new HashMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.mapBakedModelsFull.put(s2, ibakedmodel1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void loadItemModel(ModelBakery modelBakery, String model) {
|
||||||
|
ResourceLocation resourcelocation = getModelLocation(model);
|
||||||
|
ModelResourceLocation modelresourcelocation = new ModelResourceLocation(resourcelocation, "inventory");
|
||||||
|
modelBakery.loadItemModel(resourcelocation.toString(), modelresourcelocation, resourcelocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void checkNull(Object obj, String msg) throws NullPointerException {
|
||||||
|
if (obj == null) {
|
||||||
|
throw new NullPointerException(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ResourceLocation getModelLocation(String modelName) {
|
||||||
|
return new ResourceLocation(modelName);
|
||||||
|
}
|
||||||
|
}
|
841
src/main/java/net/PeytonPlayz585/shadow/CustomItems.java
Normal file
841
src/main/java/net/PeytonPlayz585/shadow/CustomItems.java
Normal file
|
@ -0,0 +1,841 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.model.ModelBase;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemModelGenerator;
|
||||||
|
import net.minecraft.client.renderer.entity.RenderItem;
|
||||||
|
import net.minecraft.client.renderer.texture.TextureManager;
|
||||||
|
import net.minecraft.client.renderer.texture.TextureMap;
|
||||||
|
import net.minecraft.client.resources.IResourcePack;
|
||||||
|
import net.minecraft.client.resources.model.IBakedModel;
|
||||||
|
import net.minecraft.client.resources.model.ModelBakery;
|
||||||
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
|
import net.minecraft.init.Items;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemArmor;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraft.potion.Potion;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
public class CustomItems {
|
||||||
|
private static CustomItemProperties[][] itemProperties = (CustomItemProperties[][]) null;
|
||||||
|
private static CustomItemProperties[][] enchantmentProperties = (CustomItemProperties[][]) null;
|
||||||
|
private static Map mapPotionIds = null;
|
||||||
|
private static ItemModelGenerator itemModelGenerator = new ItemModelGenerator();
|
||||||
|
private static boolean useGlint = true;
|
||||||
|
private static boolean renderOffHand = false;
|
||||||
|
public static final int MASK_POTION_SPLASH = 16384;
|
||||||
|
public static final int MASK_POTION_NAME = 63;
|
||||||
|
public static final int MASK_POTION_EXTENDED = 64;
|
||||||
|
public static final String KEY_TEXTURE_OVERLAY = "texture.potion_overlay";
|
||||||
|
public static final String KEY_TEXTURE_SPLASH = "texture.potion_bottle_splash";
|
||||||
|
public static final String KEY_TEXTURE_DRINKABLE = "texture.potion_bottle_drinkable";
|
||||||
|
public static final String DEFAULT_TEXTURE_OVERLAY = "items/potion_overlay";
|
||||||
|
public static final String DEFAULT_TEXTURE_SPLASH = "items/potion_bottle_splash";
|
||||||
|
public static final String DEFAULT_TEXTURE_DRINKABLE = "items/potion_bottle_drinkable";
|
||||||
|
private static final int[][] EMPTY_INT2_ARRAY = new int[0][];
|
||||||
|
private static final String TYPE_POTION_NORMAL = "normal";
|
||||||
|
private static final String TYPE_POTION_SPLASH = "splash";
|
||||||
|
private static final String TYPE_POTION_LINGER = "linger";
|
||||||
|
|
||||||
|
public static void update() {
|
||||||
|
itemProperties = (CustomItemProperties[][]) null;
|
||||||
|
enchantmentProperties = (CustomItemProperties[][]) null;
|
||||||
|
useGlint = true;
|
||||||
|
|
||||||
|
if (Config.isCustomItems()) {
|
||||||
|
readCitProperties("mcpatcher/cit.properties");
|
||||||
|
IResourcePack[] airesourcepack = Config.getResourcePacks();
|
||||||
|
|
||||||
|
for (int i = airesourcepack.length - 1; i >= 0; --i) {
|
||||||
|
IResourcePack iresourcepack = airesourcepack[i];
|
||||||
|
update(iresourcepack);
|
||||||
|
}
|
||||||
|
|
||||||
|
update(Config.getDefaultResourcePack());
|
||||||
|
|
||||||
|
if (itemProperties.length <= 0) {
|
||||||
|
itemProperties = (CustomItemProperties[][]) null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enchantmentProperties.length <= 0) {
|
||||||
|
enchantmentProperties = (CustomItemProperties[][]) null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void readCitProperties(String fileName) {
|
||||||
|
try {
|
||||||
|
ResourceLocation resourcelocation = new ResourceLocation(fileName);
|
||||||
|
InputStream inputstream = Config.getResourceStream(resourcelocation);
|
||||||
|
|
||||||
|
if (inputstream == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.dbg("CustomItems: Loading " + fileName);
|
||||||
|
Properties properties = new PropertiesOrdered();
|
||||||
|
properties.load(inputstream);
|
||||||
|
inputstream.close();
|
||||||
|
useGlint = Config.parseBoolean(properties.getProperty("useGlint"), true);
|
||||||
|
} catch (FileNotFoundException var4) {
|
||||||
|
return;
|
||||||
|
} catch (IOException ioexception) {
|
||||||
|
ioexception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void update(IResourcePack rp) {
|
||||||
|
String[] astring = ResUtils.collectFiles(rp, (String)
|
||||||
|
"mcpatcher/cit/", (String)
|
||||||
|
".properties", (String[]) null);
|
||||||
|
Map map = makeAutoImageProperties(rp);
|
||||||
|
|
||||||
|
if (map.size() > 0) {
|
||||||
|
Set set = map.keySet();
|
||||||
|
String[] astring1 = (String[])((String[]) set.toArray(new String[set.size()]));
|
||||||
|
astring = (String[])((String[]) Config.addObjectsToArray(astring, astring1));
|
||||||
|
}
|
||||||
|
|
||||||
|
Arrays.sort((Object[]) astring);
|
||||||
|
List list = makePropertyList(itemProperties);
|
||||||
|
List list1 = makePropertyList(enchantmentProperties);
|
||||||
|
|
||||||
|
for (int i = 0; i < astring.length; ++i) {
|
||||||
|
String s = astring[i];
|
||||||
|
Config.dbg("CustomItems: " + s);
|
||||||
|
|
||||||
|
try {
|
||||||
|
CustomItemProperties customitemproperties = null;
|
||||||
|
|
||||||
|
if (map.containsKey(s)) {
|
||||||
|
customitemproperties = (CustomItemProperties) map.get(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (customitemproperties == null) {
|
||||||
|
ResourceLocation resourcelocation = new ResourceLocation(s);
|
||||||
|
InputStream inputstream = rp.getInputStream(resourcelocation);
|
||||||
|
|
||||||
|
if (inputstream == null) {
|
||||||
|
Config.warn("CustomItems file not found: " + s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Properties properties = new PropertiesOrdered();
|
||||||
|
properties.load(inputstream);
|
||||||
|
inputstream.close();
|
||||||
|
customitemproperties = new CustomItemProperties(properties, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (customitemproperties.isValid(s)) {
|
||||||
|
addToItemList(customitemproperties, list);
|
||||||
|
addToEnchantmentList(customitemproperties, list1);
|
||||||
|
}
|
||||||
|
} catch (FileNotFoundException var11) {
|
||||||
|
Config.warn("CustomItems file not found: " + s);
|
||||||
|
} catch (Exception exception) {
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
itemProperties = propertyListToArray(list);
|
||||||
|
enchantmentProperties = propertyListToArray(list1);
|
||||||
|
Comparator comparator = getPropertiesComparator();
|
||||||
|
|
||||||
|
for (int j = 0; j < itemProperties.length; ++j) {
|
||||||
|
CustomItemProperties[] acustomitemproperties = itemProperties[j];
|
||||||
|
|
||||||
|
if (acustomitemproperties != null) {
|
||||||
|
Arrays.sort(acustomitemproperties, comparator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int k = 0; k < enchantmentProperties.length; ++k) {
|
||||||
|
CustomItemProperties[] acustomitemproperties1 = enchantmentProperties[k];
|
||||||
|
|
||||||
|
if (acustomitemproperties1 != null) {
|
||||||
|
Arrays.sort(acustomitemproperties1, comparator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Comparator getPropertiesComparator() {
|
||||||
|
Comparator comparator = new Comparator() {
|
||||||
|
public int compare(Object o1, Object o2) {
|
||||||
|
CustomItemProperties customitemproperties = (CustomItemProperties) o1;
|
||||||
|
CustomItemProperties customitemproperties1 = (CustomItemProperties) o2;
|
||||||
|
return customitemproperties.layer != customitemproperties1.layer ? customitemproperties.layer - customitemproperties1.layer : (customitemproperties.weight != customitemproperties1.weight ? customitemproperties1.weight - customitemproperties.weight : (!customitemproperties.basePath.equals(customitemproperties1.basePath) ? customitemproperties.basePath.compareTo(customitemproperties1.basePath) : customitemproperties.name.compareTo(customitemproperties1.name)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return comparator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateIcons(TextureMap textureMap) {
|
||||||
|
for (CustomItemProperties customitemproperties: getAllProperties()) {
|
||||||
|
customitemproperties.updateIcons(textureMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void loadModels(ModelBakery modelBakery) {
|
||||||
|
for (CustomItemProperties customitemproperties: getAllProperties()) {
|
||||||
|
customitemproperties.loadModels(modelBakery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateModels() {
|
||||||
|
for (CustomItemProperties customitemproperties: getAllProperties()) {
|
||||||
|
if (customitemproperties.type == 1) {
|
||||||
|
TextureMap texturemap = Minecraft.getMinecraft().getTextureMapBlocks();
|
||||||
|
customitemproperties.updateModelTexture(texturemap, itemModelGenerator);
|
||||||
|
customitemproperties.updateModelsFull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List < CustomItemProperties > getAllProperties() {
|
||||||
|
List < CustomItemProperties > list = new ArrayList();
|
||||||
|
addAll(itemProperties, list);
|
||||||
|
addAll(enchantmentProperties, list);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addAll(CustomItemProperties[][] cipsArr, List < CustomItemProperties > list) {
|
||||||
|
if (cipsArr != null) {
|
||||||
|
for (int i = 0; i < cipsArr.length; ++i) {
|
||||||
|
CustomItemProperties[] acustomitemproperties = cipsArr[i];
|
||||||
|
|
||||||
|
if (acustomitemproperties != null) {
|
||||||
|
for (int j = 0; j < acustomitemproperties.length; ++j) {
|
||||||
|
CustomItemProperties customitemproperties = acustomitemproperties[j];
|
||||||
|
|
||||||
|
if (customitemproperties != null) {
|
||||||
|
list.add(customitemproperties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map makeAutoImageProperties(IResourcePack rp) {
|
||||||
|
Map map = new HashMap();
|
||||||
|
map.putAll(makePotionImageProperties(rp, "normal", Item.getIdFromItem(Items.potionitem)));
|
||||||
|
map.putAll(makePotionImageProperties(rp, "splash", Item.getIdFromItem(Items.potionitem)));
|
||||||
|
map.putAll(makePotionImageProperties(rp, "linger", Item.getIdFromItem(Items.potionitem)));
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map makePotionImageProperties(IResourcePack rp, String type, int itemId) {
|
||||||
|
Map map = new HashMap();
|
||||||
|
String s = type + "/";
|
||||||
|
String[] astring = new String[] {
|
||||||
|
"mcpatcher/cit/potion/" + s, "mcpatcher/cit/Potion/" + s
|
||||||
|
};
|
||||||
|
String[] astring1 = new String[] {
|
||||||
|
".png"
|
||||||
|
};
|
||||||
|
String[] astring2 = ResUtils.collectFiles(rp, astring, astring1);
|
||||||
|
|
||||||
|
for (int i = 0; i < astring2.length; ++i) {
|
||||||
|
String s1 = astring2[i];
|
||||||
|
String name = StrUtils.removePrefixSuffix(s1, astring, astring1);
|
||||||
|
Properties properties = makePotionProperties(name, type, itemId, s1);
|
||||||
|
|
||||||
|
if (properties != null) {
|
||||||
|
String s3 = StrUtils.removeSuffix(s1, astring1) + ".properties";
|
||||||
|
CustomItemProperties customitemproperties = new CustomItemProperties(properties, s3);
|
||||||
|
map.put(s3, customitemproperties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Properties makePotionProperties(String name, String type, int itemId, String path) {
|
||||||
|
if (StrUtils.endsWith(name, new String[] {
|
||||||
|
"_n",
|
||||||
|
"_s"
|
||||||
|
})) {
|
||||||
|
return null;
|
||||||
|
} else if (name.equals("empty") && type.equals("normal")) {
|
||||||
|
itemId = Item.getIdFromItem(Items.glass_bottle);
|
||||||
|
Properties properties = new PropertiesOrdered();
|
||||||
|
properties.put("type", "item");
|
||||||
|
properties.put("items", "" + itemId);
|
||||||
|
return properties;
|
||||||
|
} else {
|
||||||
|
int[] aint = (int[])((int[]) getMapPotionIds().get(name));
|
||||||
|
|
||||||
|
if (aint == null) {
|
||||||
|
Config.warn("Potion not found for image: " + path);
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
StringBuffer stringbuffer = new StringBuffer();
|
||||||
|
|
||||||
|
for (int i = 0; i < aint.length; ++i) {
|
||||||
|
int j = aint[i];
|
||||||
|
|
||||||
|
if (type.equals("splash")) {
|
||||||
|
j |= 16384;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i > 0) {
|
||||||
|
stringbuffer.append(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append(j);
|
||||||
|
}
|
||||||
|
|
||||||
|
int k = 16447;
|
||||||
|
|
||||||
|
if (name.equals("water") || name.equals("mundane")) {
|
||||||
|
k |= 64;
|
||||||
|
}
|
||||||
|
|
||||||
|
Properties properties1 = new PropertiesOrdered();
|
||||||
|
properties1.put("type", "item");
|
||||||
|
properties1.put("items", "" + itemId);
|
||||||
|
properties1.put("damage", "" + stringbuffer.toString());
|
||||||
|
properties1.put("damageMask", "" + k);
|
||||||
|
|
||||||
|
if (type.equals("splash")) {
|
||||||
|
properties1.put("texture.potion_bottle_splash", name);
|
||||||
|
} else {
|
||||||
|
properties1.put("texture.potion_bottle_drinkable", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return properties1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map getMapPotionIds() {
|
||||||
|
if (mapPotionIds == null) {
|
||||||
|
mapPotionIds = new LinkedHashMap();
|
||||||
|
mapPotionIds.put("water", getPotionId(0, 0));
|
||||||
|
mapPotionIds.put("awkward", getPotionId(0, 1));
|
||||||
|
mapPotionIds.put("thick", getPotionId(0, 2));
|
||||||
|
mapPotionIds.put("potent", getPotionId(0, 3));
|
||||||
|
mapPotionIds.put("regeneration", getPotionIds(1));
|
||||||
|
mapPotionIds.put("movespeed", getPotionIds(2));
|
||||||
|
mapPotionIds.put("fireresistance", getPotionIds(3));
|
||||||
|
mapPotionIds.put("poison", getPotionIds(4));
|
||||||
|
mapPotionIds.put("heal", getPotionIds(5));
|
||||||
|
mapPotionIds.put("nightvision", getPotionIds(6));
|
||||||
|
mapPotionIds.put("clear", getPotionId(7, 0));
|
||||||
|
mapPotionIds.put("bungling", getPotionId(7, 1));
|
||||||
|
mapPotionIds.put("charming", getPotionId(7, 2));
|
||||||
|
mapPotionIds.put("rank", getPotionId(7, 3));
|
||||||
|
mapPotionIds.put("weakness", getPotionIds(8));
|
||||||
|
mapPotionIds.put("damageboost", getPotionIds(9));
|
||||||
|
mapPotionIds.put("moveslowdown", getPotionIds(10));
|
||||||
|
mapPotionIds.put("leaping", getPotionIds(11));
|
||||||
|
mapPotionIds.put("harm", getPotionIds(12));
|
||||||
|
mapPotionIds.put("waterbreathing", getPotionIds(13));
|
||||||
|
mapPotionIds.put("invisibility", getPotionIds(14));
|
||||||
|
mapPotionIds.put("thin", getPotionId(15, 0));
|
||||||
|
mapPotionIds.put("debonair", getPotionId(15, 1));
|
||||||
|
mapPotionIds.put("sparkling", getPotionId(15, 2));
|
||||||
|
mapPotionIds.put("stinky", getPotionId(15, 3));
|
||||||
|
mapPotionIds.put("mundane", getPotionId(0, 4));
|
||||||
|
mapPotionIds.put("speed", mapPotionIds.get("movespeed"));
|
||||||
|
mapPotionIds.put("fire_resistance", mapPotionIds.get("fireresistance"));
|
||||||
|
mapPotionIds.put("instant_health", mapPotionIds.get("heal"));
|
||||||
|
mapPotionIds.put("night_vision", mapPotionIds.get("nightvision"));
|
||||||
|
mapPotionIds.put("strength", mapPotionIds.get("damageboost"));
|
||||||
|
mapPotionIds.put("slowness", mapPotionIds.get("moveslowdown"));
|
||||||
|
mapPotionIds.put("instant_damage", mapPotionIds.get("harm"));
|
||||||
|
mapPotionIds.put("water_breathing", mapPotionIds.get("waterbreathing"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return mapPotionIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int[] getPotionIds(int baseId) {
|
||||||
|
return new int[] {
|
||||||
|
baseId,
|
||||||
|
baseId + 16,
|
||||||
|
baseId + 32,
|
||||||
|
baseId + 48
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int[] getPotionId(int baseId, int subId) {
|
||||||
|
return new int[] {
|
||||||
|
baseId + subId * 16
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getPotionNameDamage(String name) {
|
||||||
|
String s = "potion." + name;
|
||||||
|
Potion[] apotion = Potion.potionTypes;
|
||||||
|
|
||||||
|
for (int i = 0; i < apotion.length; ++i) {
|
||||||
|
Potion potion = apotion[i];
|
||||||
|
|
||||||
|
if (potion != null) {
|
||||||
|
String s1 = potion.getName();
|
||||||
|
|
||||||
|
if (s.equals(s1)) {
|
||||||
|
return potion.getId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List makePropertyList(CustomItemProperties[][] propsArr) {
|
||||||
|
List list = new ArrayList();
|
||||||
|
|
||||||
|
if (propsArr != null) {
|
||||||
|
for (int i = 0; i < propsArr.length; ++i) {
|
||||||
|
CustomItemProperties[] acustomitemproperties = propsArr[i];
|
||||||
|
List list1 = null;
|
||||||
|
|
||||||
|
if (acustomitemproperties != null) {
|
||||||
|
list1 = new ArrayList(Arrays.asList(acustomitemproperties));
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add(list1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static CustomItemProperties[][] propertyListToArray(List list) {
|
||||||
|
CustomItemProperties[][] acustomitemproperties = new CustomItemProperties[list.size()][];
|
||||||
|
|
||||||
|
for (int i = 0; i < list.size(); ++i) {
|
||||||
|
List list1 = (List) list.get(i);
|
||||||
|
|
||||||
|
if (list1 != null) {
|
||||||
|
CustomItemProperties[] acustomitemproperties1 = (CustomItemProperties[])((CustomItemProperties[]) list1.toArray(new CustomItemProperties[list1.size()]));
|
||||||
|
Arrays.sort(acustomitemproperties1, new CustomItemsComparator());
|
||||||
|
acustomitemproperties[i] = acustomitemproperties1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return acustomitemproperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addToItemList(CustomItemProperties cp, List itemList) {
|
||||||
|
if (cp.items != null) {
|
||||||
|
for (int i = 0; i < cp.items.length; ++i) {
|
||||||
|
int j = cp.items[i];
|
||||||
|
|
||||||
|
if (j <= 0) {
|
||||||
|
Config.warn("Invalid item ID: " + j);
|
||||||
|
} else {
|
||||||
|
addToList(cp, itemList, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addToEnchantmentList(CustomItemProperties cp, List enchantmentList) {
|
||||||
|
if (cp.type == 2) {
|
||||||
|
if (cp.enchantmentIds != null) {
|
||||||
|
for (int i = 0; i < 256; ++i) {
|
||||||
|
if (cp.enchantmentIds.isInRange(i)) {
|
||||||
|
addToList(cp, enchantmentList, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addToList(CustomItemProperties cp, List list, int id) {
|
||||||
|
while (id >= list.size()) {
|
||||||
|
list.add(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
List list1 = (List) list.get(id);
|
||||||
|
|
||||||
|
if (list1 == null) {
|
||||||
|
list1 = new ArrayList();
|
||||||
|
list.set(id, list1);
|
||||||
|
}
|
||||||
|
|
||||||
|
list1.add(cp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IBakedModel getCustomItemModel(ItemStack itemStack, IBakedModel model, ResourceLocation modelLocation, boolean fullModel) {
|
||||||
|
if (!fullModel && model.isGui3d()) {
|
||||||
|
return model;
|
||||||
|
} else if (itemProperties == null) {
|
||||||
|
return model;
|
||||||
|
} else {
|
||||||
|
CustomItemProperties customitemproperties = getCustomItemProperties(itemStack, 1);
|
||||||
|
|
||||||
|
if (customitemproperties == null) {
|
||||||
|
return model;
|
||||||
|
} else {
|
||||||
|
IBakedModel ibakedmodel = customitemproperties.getBakedModel(modelLocation, fullModel);
|
||||||
|
return ibakedmodel != null ? ibakedmodel : model;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean bindCustomArmorTexture(ItemStack itemStack, int layer, String overlay) {
|
||||||
|
if (itemProperties == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
ResourceLocation resourcelocation = getCustomArmorLocation(itemStack, layer, overlay);
|
||||||
|
|
||||||
|
if (resourcelocation == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
Config.getTextureManager().bindTexture(resourcelocation);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ResourceLocation getCustomArmorLocation(ItemStack itemStack, int layer, String overlay) {
|
||||||
|
CustomItemProperties customitemproperties = getCustomItemProperties(itemStack, 3);
|
||||||
|
|
||||||
|
if (customitemproperties == null) {
|
||||||
|
return null;
|
||||||
|
} else if (customitemproperties.mapTextureLocations == null) {
|
||||||
|
return customitemproperties.textureLocation;
|
||||||
|
} else {
|
||||||
|
Item item = itemStack.getItem();
|
||||||
|
|
||||||
|
if (!(item instanceof ItemArmor)) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
ItemArmor itemarmor = (ItemArmor) item;
|
||||||
|
String s = itemarmor.getArmorMaterial().getName();
|
||||||
|
StringBuffer stringbuffer = new StringBuffer();
|
||||||
|
stringbuffer.append("texture.");
|
||||||
|
stringbuffer.append(s);
|
||||||
|
stringbuffer.append("_layer_");
|
||||||
|
stringbuffer.append(layer);
|
||||||
|
|
||||||
|
if (overlay != null) {
|
||||||
|
stringbuffer.append("_");
|
||||||
|
stringbuffer.append(overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
String s1 = stringbuffer.toString();
|
||||||
|
ResourceLocation resourcelocation = (ResourceLocation) customitemproperties.mapTextureLocations.get(s1);
|
||||||
|
return resourcelocation == null ? customitemproperties.textureLocation : resourcelocation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static CustomItemProperties getCustomItemProperties(ItemStack itemStack, int type) {
|
||||||
|
if (itemProperties == null) {
|
||||||
|
return null;
|
||||||
|
} else if (itemStack == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
Item item = itemStack.getItem();
|
||||||
|
int i = Item.getIdFromItem(item);
|
||||||
|
|
||||||
|
if (i >= 0 && i < itemProperties.length) {
|
||||||
|
CustomItemProperties[] acustomitemproperties = itemProperties[i];
|
||||||
|
|
||||||
|
if (acustomitemproperties != null) {
|
||||||
|
for (int j = 0; j < acustomitemproperties.length; ++j) {
|
||||||
|
CustomItemProperties customitemproperties = acustomitemproperties[j];
|
||||||
|
|
||||||
|
if (customitemproperties.type == type && matchesProperties(customitemproperties, itemStack, (int[][]) null)) {
|
||||||
|
return customitemproperties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean matchesProperties(CustomItemProperties cip, ItemStack itemStack, int[][] enchantmentIdLevels) {
|
||||||
|
Item item = itemStack.getItem();
|
||||||
|
|
||||||
|
if (cip.damage != null) {
|
||||||
|
int i = itemStack.getItemDamage();
|
||||||
|
|
||||||
|
if (cip.damageMask != 0) {
|
||||||
|
i &= cip.damageMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cip.damagePercent) {
|
||||||
|
int j = item.getMaxDamage();
|
||||||
|
i = (int)((double)(i * 100) / (double) j);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cip.damage.isInRange(i)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cip.stackSize != null && !cip.stackSize.isInRange(itemStack.stackSize)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
int[][] aint = enchantmentIdLevels;
|
||||||
|
|
||||||
|
if (cip.enchantmentIds != null) {
|
||||||
|
if (enchantmentIdLevels == null) {
|
||||||
|
aint = getEnchantmentIdLevels(itemStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean flag = false;
|
||||||
|
|
||||||
|
for (int k = 0; k < aint.length; ++k) {
|
||||||
|
int l = aint[k][0];
|
||||||
|
|
||||||
|
if (cip.enchantmentIds.isInRange(l)) {
|
||||||
|
flag = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!flag) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cip.enchantmentLevels != null) {
|
||||||
|
if (aint == null) {
|
||||||
|
aint = getEnchantmentIdLevels(itemStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean flag1 = false;
|
||||||
|
|
||||||
|
for (int i1 = 0; i1 < aint.length; ++i1) {
|
||||||
|
int k1 = aint[i1][1];
|
||||||
|
|
||||||
|
if (cip.enchantmentLevels.isInRange(k1)) {
|
||||||
|
flag1 = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!flag1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cip.nbtTagValues != null) {
|
||||||
|
NBTTagCompound nbttagcompound = itemStack.getTagCompound();
|
||||||
|
|
||||||
|
for (int j1 = 0; j1 < cip.nbtTagValues.length; ++j1) {
|
||||||
|
NbtTagValue nbttagvalue = cip.nbtTagValues[j1];
|
||||||
|
|
||||||
|
if (!nbttagvalue.matches(nbttagcompound)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cip.hand != 0) {
|
||||||
|
if (cip.hand == 1 && renderOffHand) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cip.hand == 2 && !renderOffHand) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int[][] getEnchantmentIdLevels(ItemStack itemStack) {
|
||||||
|
Item item = itemStack.getItem();
|
||||||
|
NBTTagList nbttaglist = item == Items.enchanted_book ? Items.enchanted_book.getEnchantments(itemStack) : itemStack.getEnchantmentTagList();
|
||||||
|
|
||||||
|
if (nbttaglist != null && nbttaglist.tagCount() > 0) {
|
||||||
|
int[][] aint = new int[nbttaglist.tagCount()][2];
|
||||||
|
|
||||||
|
for (int i = 0; i < nbttaglist.tagCount(); ++i) {
|
||||||
|
NBTTagCompound nbttagcompound = nbttaglist.getCompoundTagAt(i);
|
||||||
|
int j = nbttagcompound.getShort("id");
|
||||||
|
int k = nbttagcompound.getShort("lvl");
|
||||||
|
aint[i][0] = j;
|
||||||
|
aint[i][1] = k;
|
||||||
|
}
|
||||||
|
|
||||||
|
return aint;
|
||||||
|
} else {
|
||||||
|
return EMPTY_INT2_ARRAY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean renderCustomEffect(RenderItem renderItem, ItemStack itemStack, IBakedModel model) {
|
||||||
|
if (enchantmentProperties == null) {
|
||||||
|
return false;
|
||||||
|
} else if (itemStack == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
int[][] aint = getEnchantmentIdLevels(itemStack);
|
||||||
|
|
||||||
|
if (aint.length <= 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
Set set = null;
|
||||||
|
boolean flag = false;
|
||||||
|
TextureManager texturemanager = Config.getTextureManager();
|
||||||
|
|
||||||
|
for (int i = 0; i < aint.length; ++i) {
|
||||||
|
int j = aint[i][0];
|
||||||
|
|
||||||
|
if (j >= 0 && j < enchantmentProperties.length) {
|
||||||
|
CustomItemProperties[] acustomitemproperties = enchantmentProperties[j];
|
||||||
|
|
||||||
|
if (acustomitemproperties != null) {
|
||||||
|
for (int k = 0; k < acustomitemproperties.length; ++k) {
|
||||||
|
CustomItemProperties customitemproperties = acustomitemproperties[k];
|
||||||
|
|
||||||
|
if (set == null) {
|
||||||
|
set = new HashSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (set.add(Integer.valueOf(j)) && matchesProperties(customitemproperties, itemStack, aint) && customitemproperties.textureLocation != null) {
|
||||||
|
texturemanager.bindTexture(customitemproperties.textureLocation);
|
||||||
|
float f = customitemproperties.getTextureWidth(texturemanager);
|
||||||
|
|
||||||
|
if (!flag) {
|
||||||
|
flag = true;
|
||||||
|
GlStateManager.depthMask(false);
|
||||||
|
GlStateManager.depthFunc(514);
|
||||||
|
GlStateManager.disableLighting();
|
||||||
|
GlStateManager.matrixMode(5890);
|
||||||
|
}
|
||||||
|
|
||||||
|
Blender.setupBlend(customitemproperties.blend, 1.0F);
|
||||||
|
GlStateManager.pushMatrix();
|
||||||
|
GlStateManager.scale(f / 2.0F, f / 2.0F, f / 2.0F);
|
||||||
|
float f1 = customitemproperties.speed * (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F / 8.0F;
|
||||||
|
GlStateManager.translate(f1, 0.0F, 0.0F);
|
||||||
|
GlStateManager.rotate(customitemproperties.rotation, 0.0F, 0.0F, 1.0F);
|
||||||
|
renderItem.renderModel(model, -1);
|
||||||
|
GlStateManager.popMatrix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flag) {
|
||||||
|
GlStateManager.enableAlpha();
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
GlStateManager.blendFunc(770, 771);
|
||||||
|
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
|
||||||
|
GlStateManager.matrixMode(5888);
|
||||||
|
GlStateManager.enableLighting();
|
||||||
|
GlStateManager.depthFunc(515);
|
||||||
|
GlStateManager.depthMask(true);
|
||||||
|
texturemanager.bindTexture(TextureMap.locationBlocksTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean renderCustomArmorEffect(EntityLivingBase entity, ItemStack itemStack, ModelBase model, float limbSwing, float prevLimbSwing, float partialTicks, float timeLimbSwing, float yaw, float pitch, float scale) {
|
||||||
|
if (enchantmentProperties == null) {
|
||||||
|
return false;
|
||||||
|
} else if (Config.isShaders()) {
|
||||||
|
return false;
|
||||||
|
} else if (itemStack == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
int[][] aint = getEnchantmentIdLevels(itemStack);
|
||||||
|
|
||||||
|
if (aint.length <= 0) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
Set set = null;
|
||||||
|
boolean flag = false;
|
||||||
|
TextureManager texturemanager = Config.getTextureManager();
|
||||||
|
|
||||||
|
for (int i = 0; i < aint.length; ++i) {
|
||||||
|
int j = aint[i][0];
|
||||||
|
|
||||||
|
if (j >= 0 && j < enchantmentProperties.length) {
|
||||||
|
CustomItemProperties[] acustomitemproperties = enchantmentProperties[j];
|
||||||
|
|
||||||
|
if (acustomitemproperties != null) {
|
||||||
|
for (int k = 0; k < acustomitemproperties.length; ++k) {
|
||||||
|
CustomItemProperties customitemproperties = acustomitemproperties[k];
|
||||||
|
|
||||||
|
if (set == null) {
|
||||||
|
set = new HashSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (set.add(Integer.valueOf(j)) && matchesProperties(customitemproperties, itemStack, aint) && customitemproperties.textureLocation != null) {
|
||||||
|
texturemanager.bindTexture(customitemproperties.textureLocation);
|
||||||
|
float f = customitemproperties.getTextureWidth(texturemanager);
|
||||||
|
|
||||||
|
if (!flag) {
|
||||||
|
flag = true;
|
||||||
|
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
GlStateManager.depthFunc(514);
|
||||||
|
GlStateManager.depthMask(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Blender.setupBlend(customitemproperties.blend, 1.0F);
|
||||||
|
GlStateManager.disableLighting();
|
||||||
|
GlStateManager.matrixMode(5890);
|
||||||
|
GlStateManager.loadIdentity();
|
||||||
|
GlStateManager.rotate(customitemproperties.rotation, 0.0F, 0.0F, 1.0F);
|
||||||
|
float f1 = f / 8.0F;
|
||||||
|
GlStateManager.scale(f1, f1 / 2.0F, f1);
|
||||||
|
float f2 = customitemproperties.speed * (float)(Minecraft.getSystemTime() % 3000L) / 3000.0F / 8.0F;
|
||||||
|
GlStateManager.translate(0.0F, f2, 0.0F);
|
||||||
|
GlStateManager.matrixMode(5888);
|
||||||
|
model.render(entity, limbSwing, prevLimbSwing, timeLimbSwing, yaw, pitch, scale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flag) {
|
||||||
|
GlStateManager.enableAlpha();
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
GlStateManager.blendFunc(770, 771);
|
||||||
|
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
|
||||||
|
GlStateManager.matrixMode(5890);
|
||||||
|
GlStateManager.loadIdentity();
|
||||||
|
GlStateManager.matrixMode(5888);
|
||||||
|
GlStateManager.enableLighting();
|
||||||
|
GlStateManager.depthMask(true);
|
||||||
|
GlStateManager.depthFunc(515);
|
||||||
|
GlStateManager.disableBlend();
|
||||||
|
}
|
||||||
|
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isUseGlint() {
|
||||||
|
return useGlint;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
public class CustomItemsComparator implements Comparator {
|
||||||
|
public int compare(Object o1, Object o2) {
|
||||||
|
CustomItemProperties customitemproperties = (CustomItemProperties)o1;
|
||||||
|
CustomItemProperties customitemproperties1 = (CustomItemProperties)o2;
|
||||||
|
return customitemproperties.weight != customitemproperties1.weight ? customitemproperties1.weight - customitemproperties.weight : (!Config.equals(customitemproperties.basePath, customitemproperties1.basePath) ? customitemproperties.basePath.compareTo(customitemproperties1.basePath) : customitemproperties.name.compareTo(customitemproperties1.name));
|
||||||
|
}
|
||||||
|
}
|
30
src/main/java/net/PeytonPlayz585/shadow/EntityArrays.java
Normal file
30
src/main/java/net/PeytonPlayz585/shadow/EntityArrays.java
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
public class EntityArrays {
|
||||||
|
|
||||||
|
private static final String[][] JAVA_CTRL_CHARS_ESCAPE = {{"\b", "\\b"}, {"\n", "\\n"}, {"\t", "\\t"}, {"\f", "\\f"}, {"\r", "\\r"}};
|
||||||
|
|
||||||
|
private static final String[][] JAVA_CTRL_CHARS_UNESCAPE = invert(JAVA_CTRL_CHARS_ESCAPE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to invert an escape array into an unescape array
|
||||||
|
* @param array String[][] to be inverted
|
||||||
|
* @return String[][] inverted array
|
||||||
|
*/
|
||||||
|
public static String[][] invert(final String[][] array) {
|
||||||
|
final String[][] newarray = new String[array.length][2];
|
||||||
|
for (int i = 0; i<array.length; i++) {
|
||||||
|
newarray[i][0] = array[i][1];
|
||||||
|
newarray[i][1] = array[i][0];
|
||||||
|
}
|
||||||
|
return newarray;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse of {@link #JAVA_CTRL_CHARS_ESCAPE()} for unescaping purposes.
|
||||||
|
* @return the mapping table
|
||||||
|
*/
|
||||||
|
public static String[][] JAVA_CTRL_CHARS_UNESCAPE() {
|
||||||
|
return JAVA_CTRL_CHARS_UNESCAPE.clone();
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,7 +11,7 @@ public class GuiQualitySettingsOF extends GuiScreen {
|
||||||
private GuiScreen prevScreen;
|
private GuiScreen prevScreen;
|
||||||
protected String title;
|
protected String title;
|
||||||
private GameSettings settings;
|
private GameSettings settings;
|
||||||
private static GameSettings.Options[] enumOptions = new GameSettings.Options[] {GameSettings.Options.MIPMAP_LEVELS, GameSettings.Options.MIPMAP_TYPE, GameSettings.Options.AF_LEVEL, GameSettings.Options.FXAA, GameSettings.Options.CLEAR_WATER, GameSettings.Options.BETTER_GRASS, GameSettings.Options.BETTER_SNOW, GameSettings.Options.CUSTOM_FONTS, GameSettings.Options.CUSTOM_SKY, GameSettings.Options.DYNAMIC_LIGHTS};
|
private static GameSettings.Options[] enumOptions = new GameSettings.Options[] {GameSettings.Options.MIPMAP_LEVELS, GameSettings.Options.MIPMAP_TYPE, GameSettings.Options.AF_LEVEL, GameSettings.Options.FXAA, GameSettings.Options.CLEAR_WATER, GameSettings.Options.BETTER_GRASS, GameSettings.Options.BETTER_SNOW, GameSettings.Options.CUSTOM_FONTS, GameSettings.Options.CUSTOM_SKY, GameSettings.Options.CUSTOM_ITEMS, GameSettings.Options.DYNAMIC_LIGHTS};
|
||||||
//private static GameSettings.Options[] enumOptions = new GameSettings.Options[] {GameSettings.Options.MIPMAP_LEVELS, GameSettings.Options.MIPMAP_TYPE, GameSettings.Options.AF_LEVEL, GameSettings.Options.AA_LEVEL, GameSettings.Options.CLEAR_WATER, GameSettings.Options.RANDOM_MOBS, GameSettings.Options.BETTER_GRASS, GameSettings.Options.BETTER_SNOW, GameSettings.Options.CUSTOM_FONTS, GameSettings.Options.CUSTOM_COLORS, GameSettings.Options.SWAMP_COLORS, GameSettings.Options.SMOOTH_BIOMES, GameSettings.Options.CONNECTED_TEXTURES, GameSettings.Options.NATURAL_TEXTURES, GameSettings.Options.CUSTOM_SKY, GameSettings.Options.CUSTOM_ITEMS, GameSettings.Options.DYNAMIC_LIGHTS};
|
//private static GameSettings.Options[] enumOptions = new GameSettings.Options[] {GameSettings.Options.MIPMAP_LEVELS, GameSettings.Options.MIPMAP_TYPE, GameSettings.Options.AF_LEVEL, GameSettings.Options.AA_LEVEL, GameSettings.Options.CLEAR_WATER, GameSettings.Options.RANDOM_MOBS, GameSettings.Options.BETTER_GRASS, GameSettings.Options.BETTER_SNOW, GameSettings.Options.CUSTOM_FONTS, GameSettings.Options.CUSTOM_COLORS, GameSettings.Options.SWAMP_COLORS, GameSettings.Options.SMOOTH_BIOMES, GameSettings.Options.CONNECTED_TEXTURES, GameSettings.Options.NATURAL_TEXTURES, GameSettings.Options.CUSTOM_SKY, GameSettings.Options.CUSTOM_ITEMS, GameSettings.Options.DYNAMIC_LIGHTS};
|
||||||
|
|
||||||
public GuiQualitySettingsOF(GuiScreen p_i53_1_, GameSettings p_i53_2_) {
|
public GuiQualitySettingsOF(GuiScreen p_i53_1_, GameSettings p_i53_2_) {
|
||||||
|
|
5
src/main/java/net/PeytonPlayz585/shadow/IParserInt.java
Normal file
5
src/main/java/net/PeytonPlayz585/shadow/IParserInt.java
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
public interface IParserInt {
|
||||||
|
int parse(String var1, int var2);
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* 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.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates a value using a lookup table.
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
* @deprecated As of 3.6, use Apache Commons Text
|
||||||
|
* <a href="https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/translate/LookupTranslator.html">
|
||||||
|
* LookupTranslator</a> instead
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public class LookupTranslator extends CharSequenceTranslator {
|
||||||
|
|
||||||
|
private final HashMap<String, String> lookupMap;
|
||||||
|
private final HashSet<Character> prefixSet;
|
||||||
|
private final int shortest;
|
||||||
|
private final int longest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the lookup table to be used in translation
|
||||||
|
*
|
||||||
|
* Note that, as of Lang 3.1, the key to the lookup table is converted to a
|
||||||
|
* java.lang.String. This is because we need the key to support hashCode and
|
||||||
|
* equals(Object), allowing it to be the key for a HashMap. See LANG-882.
|
||||||
|
*
|
||||||
|
* @param lookup CharSequence[][] table of size [*][2]
|
||||||
|
*/
|
||||||
|
public LookupTranslator(final CharSequence[]... lookup) {
|
||||||
|
lookupMap = new HashMap<>();
|
||||||
|
prefixSet = new HashSet<>();
|
||||||
|
int tmpShortest = Integer.MAX_VALUE;
|
||||||
|
int tmpLongest = 0;
|
||||||
|
if (lookup != null) {
|
||||||
|
for (final CharSequence[] seq : lookup) {
|
||||||
|
this.lookupMap.put(seq[0].toString(), seq[1].toString());
|
||||||
|
this.prefixSet.add(seq[0].charAt(0));
|
||||||
|
final int sz = seq[0].length();
|
||||||
|
if (sz < tmpShortest) {
|
||||||
|
tmpShortest = sz;
|
||||||
|
}
|
||||||
|
if (sz > tmpLongest) {
|
||||||
|
tmpLongest = sz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.shortest = tmpShortest;
|
||||||
|
this.longest = tmpLongest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
|
||||||
|
// check if translation exists for the input at position index
|
||||||
|
if (prefixSet.contains(input.charAt(index))) {
|
||||||
|
int max = longest;
|
||||||
|
if (index + longest > input.length()) {
|
||||||
|
max = input.length() - index;
|
||||||
|
}
|
||||||
|
// implement greedy algorithm by trying maximum match first
|
||||||
|
for (int i = max; i >= shortest; i--) {
|
||||||
|
final CharSequence subSeq = input.subSequence(index, index + i);
|
||||||
|
final String result = lookupMap.get(subSeq.toString());
|
||||||
|
|
||||||
|
if (result != null) {
|
||||||
|
out.write(result);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
214
src/main/java/net/PeytonPlayz585/shadow/NbtTagValue.java
Normal file
214
src/main/java/net/PeytonPlayz585/shadow/NbtTagValue.java
Normal file
|
@ -0,0 +1,214 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import net.minecraft.nbt.NBTBase;
|
||||||
|
import net.minecraft.nbt.NBTTagByte;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagDouble;
|
||||||
|
import net.minecraft.nbt.NBTTagFloat;
|
||||||
|
import net.minecraft.nbt.NBTTagInt;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraft.nbt.NBTTagLong;
|
||||||
|
import net.minecraft.nbt.NBTTagShort;
|
||||||
|
import net.minecraft.nbt.NBTTagString;
|
||||||
|
|
||||||
|
public class NbtTagValue {
|
||||||
|
private String[] parents = null;
|
||||||
|
private String name = null;
|
||||||
|
private int type = 0;
|
||||||
|
private String value = null;
|
||||||
|
private static final int TYPE_TEXT = 0;
|
||||||
|
private static final int TYPE_PATTERN = 1;
|
||||||
|
private static final int TYPE_IPATTERN = 2;
|
||||||
|
private static final int TYPE_REGEX = 3;
|
||||||
|
private static final int TYPE_IREGEX = 4;
|
||||||
|
private static final String PREFIX_PATTERN = "pattern:";
|
||||||
|
private static final String PREFIX_IPATTERN = "ipattern:";
|
||||||
|
private static final String PREFIX_REGEX = "regex:";
|
||||||
|
private static final String PREFIX_IREGEX = "iregex:";
|
||||||
|
|
||||||
|
public NbtTagValue(String p_i69_1_, String p_i69_2_) {
|
||||||
|
String[] astring = Config.tokenize(p_i69_1_, ".");
|
||||||
|
this.parents = (String[]) Arrays.copyOfRange(astring, 0, astring.length - 1);
|
||||||
|
this.name = astring[astring.length - 1];
|
||||||
|
|
||||||
|
if (p_i69_2_.startsWith("pattern:")) {
|
||||||
|
this.type = 1;
|
||||||
|
p_i69_2_ = p_i69_2_.substring("pattern:".length());
|
||||||
|
} else if (p_i69_2_.startsWith("ipattern:")) {
|
||||||
|
this.type = 2;
|
||||||
|
p_i69_2_ = p_i69_2_.substring("ipattern:".length()).toLowerCase();
|
||||||
|
} else if (p_i69_2_.startsWith("regex:")) {
|
||||||
|
this.type = 3;
|
||||||
|
p_i69_2_ = p_i69_2_.substring("regex:".length());
|
||||||
|
} else if (p_i69_2_.startsWith("iregex:")) {
|
||||||
|
this.type = 4;
|
||||||
|
p_i69_2_ = p_i69_2_.substring("iregex:".length()).toLowerCase();
|
||||||
|
} else {
|
||||||
|
this.type = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p_i69_2_ = StringEscapeUtils.unescapeJava(p_i69_2_);
|
||||||
|
this.value = p_i69_2_;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean matches(NBTTagCompound p_matches_1_) {
|
||||||
|
if (p_matches_1_ == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
NBTBase nbtbase = p_matches_1_;
|
||||||
|
|
||||||
|
for (int i = 0; i < this.parents.length; ++i) {
|
||||||
|
String s = this.parents[i];
|
||||||
|
nbtbase = getChildTag(nbtbase, s);
|
||||||
|
|
||||||
|
if (nbtbase == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.name.equals("*")) {
|
||||||
|
return this.matchesAnyChild(nbtbase);
|
||||||
|
} else {
|
||||||
|
nbtbase = getChildTag(nbtbase, this.name);
|
||||||
|
|
||||||
|
if (nbtbase == null) {
|
||||||
|
return false;
|
||||||
|
} else if (this.matches(nbtbase)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean matchesAnyChild(NBTBase p_matchesAnyChild_1_) {
|
||||||
|
if (p_matchesAnyChild_1_ instanceof NBTTagCompound) {
|
||||||
|
NBTTagCompound nbttagcompound = (NBTTagCompound) p_matchesAnyChild_1_;
|
||||||
|
|
||||||
|
for (String s: nbttagcompound.getKeySet()) {
|
||||||
|
NBTBase nbtbase = nbttagcompound.getTag(s);
|
||||||
|
|
||||||
|
if (this.matches(nbtbase)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_matchesAnyChild_1_ instanceof NBTTagList) {
|
||||||
|
NBTTagList nbttaglist = (NBTTagList) p_matchesAnyChild_1_;
|
||||||
|
int i = nbttaglist.tagCount();
|
||||||
|
|
||||||
|
for (int j = 0; j < i; ++j) {
|
||||||
|
NBTBase nbtbase1 = nbttaglist.get(j);
|
||||||
|
|
||||||
|
if (this.matches(nbtbase1)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NBTBase getChildTag(NBTBase p_getChildTag_0_, String p_getChildTag_1_) {
|
||||||
|
if (p_getChildTag_0_ instanceof NBTTagCompound) {
|
||||||
|
NBTTagCompound nbttagcompound = (NBTTagCompound) p_getChildTag_0_;
|
||||||
|
return nbttagcompound.getTag(p_getChildTag_1_);
|
||||||
|
} else if (p_getChildTag_0_ instanceof NBTTagList) {
|
||||||
|
NBTTagList nbttaglist = (NBTTagList) p_getChildTag_0_;
|
||||||
|
int i = Config.parseInt(p_getChildTag_1_, -1);
|
||||||
|
return i < 0 ? null : nbttaglist.get(i);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean matches(NBTBase p_matches_1_) {
|
||||||
|
if (p_matches_1_ == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
String s = getValue(p_matches_1_);
|
||||||
|
|
||||||
|
if (s == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
switch (this.type) {
|
||||||
|
case 0:
|
||||||
|
return s.equals(this.value);
|
||||||
|
case 1:
|
||||||
|
return this.matchesPattern(s, this.value);
|
||||||
|
case 2:
|
||||||
|
return this.matchesPattern(s.toLowerCase(), this.value);
|
||||||
|
case 3:
|
||||||
|
return this.matchesRegex(s, this.value);
|
||||||
|
case 4:
|
||||||
|
return this.matchesRegex(s.toLowerCase(), this.value);
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Unknown NbtTagValue type: " + this.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean matchesPattern(String p_matchesPattern_1_, String p_matchesPattern_2_) {
|
||||||
|
return StrUtils.equalsMask(p_matchesPattern_1_, p_matchesPattern_2_, '*', '?');
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean matchesRegex(String p_matchesRegex_1_, String p_matchesRegex_2_) {
|
||||||
|
return p_matchesRegex_1_.matches(p_matchesRegex_2_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getValue(NBTBase p_getValue_0_) {
|
||||||
|
if (p_getValue_0_ == null) {
|
||||||
|
return null;
|
||||||
|
} else if (p_getValue_0_ instanceof NBTTagString) {
|
||||||
|
NBTTagString nbttagstring = (NBTTagString) p_getValue_0_;
|
||||||
|
return nbttagstring.getString();
|
||||||
|
} else if (p_getValue_0_ instanceof NBTTagInt) {
|
||||||
|
NBTTagInt nbttagint = (NBTTagInt) p_getValue_0_;
|
||||||
|
return Integer.toString(nbttagint.getInt());
|
||||||
|
} else if (p_getValue_0_ instanceof NBTTagByte) {
|
||||||
|
NBTTagByte nbttagbyte = (NBTTagByte) p_getValue_0_;
|
||||||
|
return Byte.toString(nbttagbyte.getByte());
|
||||||
|
} else if (p_getValue_0_ instanceof NBTTagShort) {
|
||||||
|
NBTTagShort nbttagshort = (NBTTagShort) p_getValue_0_;
|
||||||
|
return Short.toString(nbttagshort.getShort());
|
||||||
|
} else if (p_getValue_0_ instanceof NBTTagLong) {
|
||||||
|
NBTTagLong nbttaglong = (NBTTagLong) p_getValue_0_;
|
||||||
|
return Long.toString(nbttaglong.getLong());
|
||||||
|
} else if (p_getValue_0_ instanceof NBTTagFloat) {
|
||||||
|
NBTTagFloat nbttagfloat = (NBTTagFloat) p_getValue_0_;
|
||||||
|
return Float.toString(nbttagfloat.getFloat());
|
||||||
|
} else if (p_getValue_0_ instanceof NBTTagDouble) {
|
||||||
|
NBTTagDouble nbttagdouble = (NBTTagDouble) p_getValue_0_;
|
||||||
|
return Double.toString(nbttagdouble.getDouble());
|
||||||
|
} else {
|
||||||
|
return p_getValue_0_.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
StringBuffer stringbuffer = new StringBuffer();
|
||||||
|
|
||||||
|
for (int i = 0; i < this.parents.length; ++i) {
|
||||||
|
String s = this.parents[i];
|
||||||
|
|
||||||
|
if (i > 0) {
|
||||||
|
stringbuffer.append(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stringbuffer.length() > 0) {
|
||||||
|
stringbuffer.append(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
stringbuffer.append(this.name);
|
||||||
|
stringbuffer.append(" = ");
|
||||||
|
stringbuffer.append(this.value);
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
83
src/main/java/net/PeytonPlayz585/shadow/OctalUnescaper.java
Normal file
83
src/main/java/net/PeytonPlayz585/shadow/OctalUnescaper.java
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* 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.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Writer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translate escaped octal Strings back to their octal values.
|
||||||
|
*
|
||||||
|
* For example, "\45" should go back to being the specific value (a %).
|
||||||
|
*
|
||||||
|
* Note that this currently only supports the viable range of octal for Java; namely
|
||||||
|
* 1 to 377. This is because parsing Java is the main use case.
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
* @deprecated As of 3.6, use Apache Commons Text
|
||||||
|
* <a href="https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/translate/OctalUnescaper.html">
|
||||||
|
* OctalUnescaper</a> instead
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public class OctalUnescaper extends CharSequenceTranslator {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given char is an octal digit. Octal digits are the character representations of the digits 0 to 7.
|
||||||
|
* @param ch the char to check
|
||||||
|
* @return true if the given char is the character representation of one of the digits from 0 to 7
|
||||||
|
*/
|
||||||
|
private boolean isOctalDigit(final char ch) {
|
||||||
|
return ch >= '0' && ch <= '7';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the given char is the character representation of one of the digit from 0 to 3.
|
||||||
|
* @param ch the char to check
|
||||||
|
* @return true if the given char is the character representation of one of the digits from 0 to 3
|
||||||
|
*/
|
||||||
|
private boolean isZeroToThree(final char ch) {
|
||||||
|
return ch >= '0' && ch <= '3';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
|
||||||
|
final int remaining = input.length() - index - 1; // how many characters left, ignoring the first \
|
||||||
|
final StringBuilder builder = new StringBuilder();
|
||||||
|
if (input.charAt(index) == '\\' && remaining > 0 && isOctalDigit(input.charAt(index + 1)) ) {
|
||||||
|
final int next = index + 1;
|
||||||
|
final int next2 = index + 2;
|
||||||
|
final int next3 = index + 3;
|
||||||
|
|
||||||
|
// we know this is good as we checked it in the if block above
|
||||||
|
builder.append(input.charAt(next));
|
||||||
|
|
||||||
|
if (remaining > 1 && isOctalDigit(input.charAt(next2))) {
|
||||||
|
builder.append(input.charAt(next2));
|
||||||
|
if (remaining > 2 && isZeroToThree(input.charAt(next)) && isOctalDigit(input.charAt(next3))) {
|
||||||
|
builder.append(input.charAt(next3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out.write( Integer.parseInt(builder.toString(), 8) );
|
||||||
|
return 1 + builder.length();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import net.minecraft.enchantment.Enchantment;
|
||||||
|
|
||||||
|
public class ParserEnchantmentId implements IParserInt {
|
||||||
|
public int parse(String str, int defVal) {
|
||||||
|
Enchantment enchantment = Enchantment.getEnchantmentByLocation(str);
|
||||||
|
return enchantment == null ? defVal : enchantment.effectId;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class PropertiesOrdered extends Properties {
|
||||||
|
private Set<Object> keysOrdered = new LinkedHashSet();
|
||||||
|
|
||||||
|
public synchronized Object put(Object key, Object value) {
|
||||||
|
this.keysOrdered.add(key);
|
||||||
|
return super.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Object> keySet() {
|
||||||
|
Set<Object> set = super.keySet();
|
||||||
|
this.keysOrdered.retainAll(set);
|
||||||
|
return Collections.<Object>unmodifiableSet(this.keysOrdered);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized Enumeration<Object> keys() {
|
||||||
|
return Collections.<Object>enumeration(this.keySet());
|
||||||
|
}
|
||||||
|
}
|
109
src/main/java/net/PeytonPlayz585/shadow/ResUtils.java
Normal file
109
src/main/java/net/PeytonPlayz585/shadow/ResUtils.java
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.internal.vfs2.VFile2;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerFolderResourcePack;
|
||||||
|
import net.minecraft.client.resources.AbstractResourcePack;
|
||||||
|
import net.minecraft.client.resources.DefaultResourcePack;
|
||||||
|
import net.minecraft.client.resources.IResourcePack;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
public class ResUtils {
|
||||||
|
public static String[] collectFiles(String p_collectFiles_0_, String p_collectFiles_1_) {
|
||||||
|
return collectFiles(new String[] {p_collectFiles_0_}, new String[] {p_collectFiles_1_});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] collectFiles(String[] p_collectFiles_0_, String[] p_collectFiles_1_) {
|
||||||
|
Set<String> set = new LinkedHashSet<String>();
|
||||||
|
IResourcePack[] airesourcepack = Config.getResourcePacks();
|
||||||
|
|
||||||
|
for (int i = 0; i < airesourcepack.length; ++i) {
|
||||||
|
IResourcePack iresourcepack = airesourcepack[i];
|
||||||
|
String[] astring = collectFiles(iresourcepack, (String[])p_collectFiles_0_, (String[])p_collectFiles_1_, (String[])null);
|
||||||
|
set.addAll(Arrays.<String>asList(astring));
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] astring1 = (String[])set.toArray(new String[set.size()]);
|
||||||
|
return astring1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] collectFiles(IResourcePack p_collectFiles_0_, String p_collectFiles_1_, String p_collectFiles_2_, String[] p_collectFiles_3_) {
|
||||||
|
return collectFiles(p_collectFiles_0_, new String[] {p_collectFiles_1_}, new String[] {p_collectFiles_2_}, p_collectFiles_3_);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] collectFiles(IResourcePack p_collectFiles_0_, String[] p_collectFiles_1_, String[] p_collectFiles_2_) {
|
||||||
|
return collectFiles(p_collectFiles_0_, (String[])p_collectFiles_1_, (String[])p_collectFiles_2_, (String[])null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] collectFiles(IResourcePack p_collectFiles_0_, String[] p_collectFiles_1_, String[] p_collectFiles_2_, String[] p_collectFiles_3_) {
|
||||||
|
if (p_collectFiles_0_ instanceof DefaultResourcePack) {
|
||||||
|
return collectFilesFixed(p_collectFiles_0_, p_collectFiles_3_);
|
||||||
|
} else if (!(p_collectFiles_0_ instanceof AbstractResourcePack)) {
|
||||||
|
return new String[0];
|
||||||
|
} else {
|
||||||
|
AbstractResourcePack abstractresourcepack = (AbstractResourcePack)p_collectFiles_0_;
|
||||||
|
String file1 = abstractresourcepack.resourcePackFile;
|
||||||
|
if(file1 == null) {
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
String path = new VFile2(EaglerFolderResourcePack.RESOURCE_PACKS, file1).getPath();
|
||||||
|
return collectFiles(new VFile2(path), "", p_collectFiles_1_, p_collectFiles_2_, file1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] collectFilesFixed(IResourcePack p_collectFilesFixed_0_, String[] p_collectFilesFixed_1_) {
|
||||||
|
if (p_collectFilesFixed_1_ == null) {
|
||||||
|
return new String[0];
|
||||||
|
} else {
|
||||||
|
List<String> list = new ArrayList<String>();
|
||||||
|
|
||||||
|
for (int i = 0; i < p_collectFilesFixed_1_.length; ++i) {
|
||||||
|
String s = p_collectFilesFixed_1_[i];
|
||||||
|
ResourceLocation resourcelocation = new ResourceLocation(s);
|
||||||
|
|
||||||
|
if (p_collectFilesFixed_0_.resourceExists(resourcelocation)) {
|
||||||
|
list.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] astring = (String[])((String[])list.toArray(new String[list.size()]));
|
||||||
|
return astring;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String[] collectFiles(VFile2 p_collectFilesFolder_0_, String p_collectFilesFolder_1_, String[] p_collectFilesFolder_2_, String[] p_collectFilesFolder_3_, String texturePackName) {
|
||||||
|
List<String> list = new ArrayList<String>();
|
||||||
|
String s = "assets/minecraft/";
|
||||||
|
List<String> afile = p_collectFilesFolder_0_.listFilenames(true);
|
||||||
|
|
||||||
|
if (afile == null || afile.isEmpty()) {
|
||||||
|
return new String[0];
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < afile.size(); ++i) {
|
||||||
|
VFile2 file1 = new VFile2(afile.get(i));
|
||||||
|
if (file1.getPath().contains(".")) {
|
||||||
|
String s3 = p_collectFilesFolder_1_ + file1.getPath();
|
||||||
|
s3 = s3.replace("resourcepacks/", "");
|
||||||
|
s3 = s3.replace(texturePackName, "");
|
||||||
|
if(s3.startsWith("/")) {
|
||||||
|
s3 = s3.substring(1);
|
||||||
|
}
|
||||||
|
if (s3.startsWith(s)) {
|
||||||
|
s3 = s3.substring(s.length());
|
||||||
|
if (StrUtils.startsWith(s3, p_collectFilesFolder_2_) && StrUtils.endsWith(s3, p_collectFilesFolder_3_)) {
|
||||||
|
list.add(s3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] astring1 = (String[])((String[])list.toArray(new String[list.size()]));
|
||||||
|
return astring1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
534
src/main/java/net/PeytonPlayz585/shadow/StrUtils.java
Normal file
534
src/main/java/net/PeytonPlayz585/shadow/StrUtils.java
Normal file
|
@ -0,0 +1,534 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
public class StrUtils {
|
||||||
|
public static boolean equalsMask(String p_equalsMask_0_, String p_equalsMask_1_, char p_equalsMask_2_, char p_equalsMask_3_) {
|
||||||
|
if (p_equalsMask_1_ != null && p_equalsMask_0_ != null) {
|
||||||
|
if (p_equalsMask_1_.indexOf(p_equalsMask_2_) < 0) {
|
||||||
|
return p_equalsMask_1_.indexOf(p_equalsMask_3_) < 0 ? p_equalsMask_1_.equals(p_equalsMask_0_) : equalsMaskSingle(p_equalsMask_0_, p_equalsMask_1_, p_equalsMask_3_);
|
||||||
|
} else {
|
||||||
|
List list = new ArrayList();
|
||||||
|
String s = "" + p_equalsMask_2_;
|
||||||
|
|
||||||
|
if (p_equalsMask_1_.startsWith(s)) {
|
||||||
|
list.add("");
|
||||||
|
}
|
||||||
|
|
||||||
|
StringTokenizer stringtokenizer = new StringTokenizer(p_equalsMask_1_, s);
|
||||||
|
|
||||||
|
while (stringtokenizer.hasMoreElements()) {
|
||||||
|
list.add(stringtokenizer.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_equalsMask_1_.endsWith(s)) {
|
||||||
|
list.add("");
|
||||||
|
}
|
||||||
|
|
||||||
|
String s1 = (String) list.get(0);
|
||||||
|
|
||||||
|
if (!startsWithMaskSingle(p_equalsMask_0_, s1, p_equalsMask_3_)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
String s2 = (String) list.get(list.size() - 1);
|
||||||
|
|
||||||
|
if (!endsWithMaskSingle(p_equalsMask_0_, s2, p_equalsMask_3_)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (int j = 0; j < ((List) list).size(); ++j) {
|
||||||
|
String s3 = (String) list.get(j);
|
||||||
|
|
||||||
|
if (s3.length() > 0) {
|
||||||
|
int k = indexOfMaskSingle(p_equalsMask_0_, s3, i, p_equalsMask_3_);
|
||||||
|
|
||||||
|
if (k < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = k + s3.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return p_equalsMask_1_ == p_equalsMask_0_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean equalsMaskSingle(String p_equalsMaskSingle_0_, String p_equalsMaskSingle_1_, char p_equalsMaskSingle_2_) {
|
||||||
|
if (p_equalsMaskSingle_0_ != null && p_equalsMaskSingle_1_ != null) {
|
||||||
|
if (p_equalsMaskSingle_0_.length() != p_equalsMaskSingle_1_.length()) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < p_equalsMaskSingle_1_.length(); ++i) {
|
||||||
|
char c0 = p_equalsMaskSingle_1_.charAt(i);
|
||||||
|
|
||||||
|
if (c0 != p_equalsMaskSingle_2_ && p_equalsMaskSingle_0_.charAt(i) != c0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return p_equalsMaskSingle_0_ == p_equalsMaskSingle_1_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int indexOfMaskSingle(String p_indexOfMaskSingle_0_, String p_indexOfMaskSingle_1_, int p_indexOfMaskSingle_2_, char p_indexOfMaskSingle_3_) {
|
||||||
|
if (p_indexOfMaskSingle_0_ != null && p_indexOfMaskSingle_1_ != null) {
|
||||||
|
if (p_indexOfMaskSingle_2_ >= 0 && p_indexOfMaskSingle_2_ <= p_indexOfMaskSingle_0_.length()) {
|
||||||
|
if (p_indexOfMaskSingle_0_.length() < p_indexOfMaskSingle_2_ + p_indexOfMaskSingle_1_.length()) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
for (int i = p_indexOfMaskSingle_2_; i + p_indexOfMaskSingle_1_.length() <= p_indexOfMaskSingle_0_.length(); ++i) {
|
||||||
|
String s = p_indexOfMaskSingle_0_.substring(i, i + p_indexOfMaskSingle_1_.length());
|
||||||
|
|
||||||
|
if (equalsMaskSingle(s, p_indexOfMaskSingle_1_, p_indexOfMaskSingle_3_)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean endsWithMaskSingle(String p_endsWithMaskSingle_0_, String p_endsWithMaskSingle_1_, char p_endsWithMaskSingle_2_) {
|
||||||
|
if (p_endsWithMaskSingle_0_ != null && p_endsWithMaskSingle_1_ != null) {
|
||||||
|
if (p_endsWithMaskSingle_0_.length() < p_endsWithMaskSingle_1_.length()) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
String s = p_endsWithMaskSingle_0_.substring(p_endsWithMaskSingle_0_.length() - p_endsWithMaskSingle_1_.length(), p_endsWithMaskSingle_0_.length());
|
||||||
|
return equalsMaskSingle(s, p_endsWithMaskSingle_1_, p_endsWithMaskSingle_2_);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return p_endsWithMaskSingle_0_ == p_endsWithMaskSingle_1_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean startsWithMaskSingle(String p_startsWithMaskSingle_0_, String p_startsWithMaskSingle_1_, char p_startsWithMaskSingle_2_) {
|
||||||
|
if (p_startsWithMaskSingle_0_ != null && p_startsWithMaskSingle_1_ != null) {
|
||||||
|
if (p_startsWithMaskSingle_0_.length() < p_startsWithMaskSingle_1_.length()) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
String s = p_startsWithMaskSingle_0_.substring(0, p_startsWithMaskSingle_1_.length());
|
||||||
|
return equalsMaskSingle(s, p_startsWithMaskSingle_1_, p_startsWithMaskSingle_2_);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return p_startsWithMaskSingle_0_ == p_startsWithMaskSingle_1_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean equalsMask(String p_equalsMask_0_, String[] p_equalsMask_1_, char p_equalsMask_2_) {
|
||||||
|
for (int i = 0; i < p_equalsMask_1_.length; ++i) {
|
||||||
|
String s = p_equalsMask_1_[i];
|
||||||
|
|
||||||
|
if (equalsMask(p_equalsMask_0_, s, p_equalsMask_2_)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean equalsMask(String p_equalsMask_0_, String p_equalsMask_1_, char p_equalsMask_2_) {
|
||||||
|
if (p_equalsMask_1_ != null && p_equalsMask_0_ != null) {
|
||||||
|
if (p_equalsMask_1_.indexOf(p_equalsMask_2_) < 0) {
|
||||||
|
return p_equalsMask_1_.equals(p_equalsMask_0_);
|
||||||
|
} else {
|
||||||
|
List list = new ArrayList();
|
||||||
|
String s = "" + p_equalsMask_2_;
|
||||||
|
|
||||||
|
if (p_equalsMask_1_.startsWith(s)) {
|
||||||
|
list.add("");
|
||||||
|
}
|
||||||
|
|
||||||
|
StringTokenizer stringtokenizer = new StringTokenizer(p_equalsMask_1_, s);
|
||||||
|
|
||||||
|
while (stringtokenizer.hasMoreElements()) {
|
||||||
|
list.add(stringtokenizer.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_equalsMask_1_.endsWith(s)) {
|
||||||
|
list.add("");
|
||||||
|
}
|
||||||
|
|
||||||
|
String s1 = (String) list.get(0);
|
||||||
|
|
||||||
|
if (!p_equalsMask_0_.startsWith(s1)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
String s2 = (String) list.get(list.size() - 1);
|
||||||
|
|
||||||
|
if (!p_equalsMask_0_.endsWith(s2)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (int j = 0; j < ((List) list).size(); ++j) {
|
||||||
|
String s3 = (String) list.get(j);
|
||||||
|
|
||||||
|
if (s3.length() > 0) {
|
||||||
|
int k = p_equalsMask_0_.indexOf(s3, i);
|
||||||
|
|
||||||
|
if (k < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = k + s3.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return p_equalsMask_1_ == p_equalsMask_0_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] split(String p_split_0_, String p_split_1_) {
|
||||||
|
if (p_split_0_ != null && p_split_0_.length() > 0) {
|
||||||
|
if (p_split_1_ == null) {
|
||||||
|
return new String[] {
|
||||||
|
p_split_0_
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
List list = new ArrayList();
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (int j = 0; j < p_split_0_.length(); ++j) {
|
||||||
|
char c0 = p_split_0_.charAt(j);
|
||||||
|
|
||||||
|
if (equals(c0, p_split_1_)) {
|
||||||
|
list.add(p_split_0_.substring(i, j));
|
||||||
|
i = j + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add(p_split_0_.substring(i, p_split_0_.length()));
|
||||||
|
return (String[])((String[]) list.toArray(new String[list.size()]));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return new String[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean equals(char p_equals_0_, String p_equals_1_) {
|
||||||
|
for (int i = 0; i < p_equals_1_.length(); ++i) {
|
||||||
|
if (p_equals_1_.charAt(i) == p_equals_0_) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean equalsTrim(String p_equalsTrim_0_, String p_equalsTrim_1_) {
|
||||||
|
if (p_equalsTrim_0_ != null) {
|
||||||
|
p_equalsTrim_0_ = p_equalsTrim_0_.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_equalsTrim_1_ != null) {
|
||||||
|
p_equalsTrim_1_ = p_equalsTrim_1_.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
return equals(p_equalsTrim_0_, p_equalsTrim_1_);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isEmpty(String p_isEmpty_0_) {
|
||||||
|
return p_isEmpty_0_ == null ? true : p_isEmpty_0_.trim().length() <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String stringInc(String p_stringInc_0_) {
|
||||||
|
int i = parseInt(p_stringInc_0_, -1);
|
||||||
|
|
||||||
|
if (i == -1) {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
++i;
|
||||||
|
String s = "" + i;
|
||||||
|
return s.length() > p_stringInc_0_.length() ? "" : fillLeft("" + i, p_stringInc_0_.length(), '0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int parseInt(String p_parseInt_0_, int p_parseInt_1_) {
|
||||||
|
if (p_parseInt_0_ == null) {
|
||||||
|
return p_parseInt_1_;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
return Integer.parseInt(p_parseInt_0_);
|
||||||
|
} catch (NumberFormatException var3) {
|
||||||
|
return p_parseInt_1_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFilled(String p_isFilled_0_) {
|
||||||
|
return !isEmpty(p_isFilled_0_);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String addIfNotContains(String p_addIfNotContains_0_, String p_addIfNotContains_1_) {
|
||||||
|
for (int i = 0; i < p_addIfNotContains_1_.length(); ++i) {
|
||||||
|
if (p_addIfNotContains_0_.indexOf(p_addIfNotContains_1_.charAt(i)) < 0) {
|
||||||
|
p_addIfNotContains_0_ = p_addIfNotContains_0_ + p_addIfNotContains_1_.charAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p_addIfNotContains_0_;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String fillLeft(String p_fillLeft_0_, int p_fillLeft_1_, char p_fillLeft_2_) {
|
||||||
|
if (p_fillLeft_0_ == null) {
|
||||||
|
p_fillLeft_0_ = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_fillLeft_0_.length() >= p_fillLeft_1_) {
|
||||||
|
return p_fillLeft_0_;
|
||||||
|
} else {
|
||||||
|
StringBuffer stringbuffer = new StringBuffer(p_fillLeft_0_);
|
||||||
|
|
||||||
|
while (stringbuffer.length() < p_fillLeft_1_) {
|
||||||
|
stringbuffer.insert(0, (char) p_fillLeft_2_);
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String fillRight(String p_fillRight_0_, int p_fillRight_1_, char p_fillRight_2_) {
|
||||||
|
if (p_fillRight_0_ == null) {
|
||||||
|
p_fillRight_0_ = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_fillRight_0_.length() >= p_fillRight_1_) {
|
||||||
|
return p_fillRight_0_;
|
||||||
|
} else {
|
||||||
|
StringBuffer stringbuffer = new StringBuffer(p_fillRight_0_);
|
||||||
|
|
||||||
|
while (stringbuffer.length() < p_fillRight_1_) {
|
||||||
|
stringbuffer.append(p_fillRight_2_);
|
||||||
|
}
|
||||||
|
|
||||||
|
return stringbuffer.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean equals(Object p_equals_0_, Object p_equals_1_) {
|
||||||
|
return p_equals_0_ == p_equals_1_ ? true : (p_equals_0_ != null && p_equals_0_.equals(p_equals_1_) ? true : p_equals_1_ != null && p_equals_1_.equals(p_equals_0_));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean startsWith(String p_startsWith_0_, String[] p_startsWith_1_) {
|
||||||
|
if (p_startsWith_0_ == null) {
|
||||||
|
return false;
|
||||||
|
} else if (p_startsWith_1_ == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < p_startsWith_1_.length; ++i) {
|
||||||
|
String s = p_startsWith_1_[i];
|
||||||
|
|
||||||
|
if (p_startsWith_0_.startsWith(s)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean endsWith(String p_endsWith_0_, String[] p_endsWith_1_) {
|
||||||
|
if (p_endsWith_0_ == null) {
|
||||||
|
return false;
|
||||||
|
} else if (p_endsWith_1_ == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < p_endsWith_1_.length; ++i) {
|
||||||
|
String s = p_endsWith_1_[i];
|
||||||
|
|
||||||
|
if (p_endsWith_0_.endsWith(s)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String removePrefix(String p_removePrefix_0_, String p_removePrefix_1_) {
|
||||||
|
if (p_removePrefix_0_ != null && p_removePrefix_1_ != null) {
|
||||||
|
if (p_removePrefix_0_.startsWith(p_removePrefix_1_)) {
|
||||||
|
p_removePrefix_0_ = p_removePrefix_0_.substring(p_removePrefix_1_.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
return p_removePrefix_0_;
|
||||||
|
} else {
|
||||||
|
return p_removePrefix_0_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String removeSuffix(String p_removeSuffix_0_, String p_removeSuffix_1_) {
|
||||||
|
if (p_removeSuffix_0_ != null && p_removeSuffix_1_ != null) {
|
||||||
|
if (p_removeSuffix_0_.endsWith(p_removeSuffix_1_)) {
|
||||||
|
p_removeSuffix_0_ = p_removeSuffix_0_.substring(0, p_removeSuffix_0_.length() - p_removeSuffix_1_.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
return p_removeSuffix_0_;
|
||||||
|
} else {
|
||||||
|
return p_removeSuffix_0_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String replaceSuffix(String p_replaceSuffix_0_, String p_replaceSuffix_1_, String p_replaceSuffix_2_) {
|
||||||
|
if (p_replaceSuffix_0_ != null && p_replaceSuffix_1_ != null) {
|
||||||
|
if (p_replaceSuffix_2_ == null) {
|
||||||
|
p_replaceSuffix_2_ = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_replaceSuffix_0_.endsWith(p_replaceSuffix_1_)) {
|
||||||
|
p_replaceSuffix_0_ = p_replaceSuffix_0_.substring(0, p_replaceSuffix_0_.length() - p_replaceSuffix_1_.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
return p_replaceSuffix_0_ + p_replaceSuffix_2_;
|
||||||
|
} else {
|
||||||
|
return p_replaceSuffix_0_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int findPrefix(String[] p_findPrefix_0_, String p_findPrefix_1_) {
|
||||||
|
if (p_findPrefix_0_ != null && p_findPrefix_1_ != null) {
|
||||||
|
for (int i = 0; i < p_findPrefix_0_.length; ++i) {
|
||||||
|
String s = p_findPrefix_0_[i];
|
||||||
|
|
||||||
|
if (s.startsWith(p_findPrefix_1_)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int findSuffix(String[] p_findSuffix_0_, String p_findSuffix_1_) {
|
||||||
|
if (p_findSuffix_0_ != null && p_findSuffix_1_ != null) {
|
||||||
|
for (int i = 0; i < p_findSuffix_0_.length; ++i) {
|
||||||
|
String s = p_findSuffix_0_[i];
|
||||||
|
|
||||||
|
if (s.endsWith(p_findSuffix_1_)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] remove(String[] p_remove_0_, int p_remove_1_, int p_remove_2_) {
|
||||||
|
if (p_remove_0_ == null) {
|
||||||
|
return p_remove_0_;
|
||||||
|
} else if (p_remove_2_ > 0 && p_remove_1_ < p_remove_0_.length) {
|
||||||
|
if (p_remove_1_ >= p_remove_2_) {
|
||||||
|
return p_remove_0_;
|
||||||
|
} else {
|
||||||
|
List < String > list = new ArrayList(p_remove_0_.length);
|
||||||
|
|
||||||
|
for (int i = 0; i < p_remove_0_.length; ++i) {
|
||||||
|
String s = p_remove_0_[i];
|
||||||
|
|
||||||
|
if (i < p_remove_1_ || i >= p_remove_2_) {
|
||||||
|
list.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] astring = (String[]) list.toArray(new String[list.size()]);
|
||||||
|
return astring;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return p_remove_0_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String removeSuffix(String p_removeSuffix_0_, String[] p_removeSuffix_1_) {
|
||||||
|
if (p_removeSuffix_0_ != null && p_removeSuffix_1_ != null) {
|
||||||
|
int i = p_removeSuffix_0_.length();
|
||||||
|
|
||||||
|
for (int j = 0; j < p_removeSuffix_1_.length; ++j) {
|
||||||
|
String s = p_removeSuffix_1_[j];
|
||||||
|
p_removeSuffix_0_ = removeSuffix(p_removeSuffix_0_, s);
|
||||||
|
|
||||||
|
if (p_removeSuffix_0_.length() != i) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p_removeSuffix_0_;
|
||||||
|
} else {
|
||||||
|
return p_removeSuffix_0_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String removePrefix(String p_removePrefix_0_, String[] p_removePrefix_1_) {
|
||||||
|
if (p_removePrefix_0_ != null && p_removePrefix_1_ != null) {
|
||||||
|
int i = p_removePrefix_0_.length();
|
||||||
|
|
||||||
|
for (int j = 0; j < p_removePrefix_1_.length; ++j) {
|
||||||
|
String s = p_removePrefix_1_[j];
|
||||||
|
p_removePrefix_0_ = removePrefix(p_removePrefix_0_, s);
|
||||||
|
|
||||||
|
if (p_removePrefix_0_.length() != i) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p_removePrefix_0_;
|
||||||
|
} else {
|
||||||
|
return p_removePrefix_0_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String removePrefixSuffix(String p_removePrefixSuffix_0_, String[] p_removePrefixSuffix_1_, String[] p_removePrefixSuffix_2_) {
|
||||||
|
p_removePrefixSuffix_0_ = removePrefix(p_removePrefixSuffix_0_, p_removePrefixSuffix_1_);
|
||||||
|
p_removePrefixSuffix_0_ = removeSuffix(p_removePrefixSuffix_0_, p_removePrefixSuffix_2_);
|
||||||
|
return p_removePrefixSuffix_0_;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String removePrefixSuffix(String p_removePrefixSuffix_0_, String p_removePrefixSuffix_1_, String p_removePrefixSuffix_2_) {
|
||||||
|
return removePrefixSuffix(p_removePrefixSuffix_0_, new String[] {
|
||||||
|
p_removePrefixSuffix_1_
|
||||||
|
}, new String[] {
|
||||||
|
p_removePrefixSuffix_2_
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getSegment(String p_getSegment_0_, String p_getSegment_1_, String p_getSegment_2_) {
|
||||||
|
if (p_getSegment_0_ != null && p_getSegment_1_ != null && p_getSegment_2_ != null) {
|
||||||
|
int i = p_getSegment_0_.indexOf(p_getSegment_1_);
|
||||||
|
|
||||||
|
if (i < 0) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
int j = p_getSegment_0_.indexOf(p_getSegment_2_, i);
|
||||||
|
return j < 0 ? null : p_getSegment_0_.substring(i, j + p_getSegment_2_.length());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package net.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
public class StringEscapeUtils {
|
||||||
|
|
||||||
|
public static final CharSequenceTranslator UNESCAPE_JAVA = new AggregateTranslator(new OctalUnescaper(), /* .between('\1', '\377'), */ new UnicodeUnescaper(), new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_UNESCAPE()), new LookupTranslator( new String[][] {{"\\\\", "\\"}, {"\\\"", "\""}, {"\\'", "'"}, {"\\", ""} }));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unescapes any Java literals found in the {@link String}.
|
||||||
|
* For example, it will turn a sequence of {@code '\'} and
|
||||||
|
* {@code 'n'} into a newline character, unless the {@code '\'}
|
||||||
|
* is preceded by another {@code '\'}.
|
||||||
|
*
|
||||||
|
* @param input the {@link String} to unescape, may be null
|
||||||
|
* @return a new unescaped {@link String}, {@code null} if null string input
|
||||||
|
*/
|
||||||
|
public static final String unescapeJava(final String input) {
|
||||||
|
return UNESCAPE_JAVA.translate(input);
|
||||||
|
}
|
||||||
|
}
|
|
@ -98,6 +98,7 @@ public class TextureUtils {
|
||||||
BetterGrass.update();
|
BetterGrass.update();
|
||||||
BetterSnow.update();
|
BetterSnow.update();
|
||||||
CustomSky.update();
|
CustomSky.update();
|
||||||
|
CustomItems.updateModels();
|
||||||
//SmartLeaves.updateLeavesModels();
|
//SmartLeaves.updateLeavesModels();
|
||||||
Config.getTextureManager().tick();
|
Config.getTextureManager().tick();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* 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.PeytonPlayz585.shadow;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Writer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates escaped Unicode values of the form \\u+\d\d\d\d back to
|
||||||
|
* Unicode. It supports multiple 'u' characters and will work with or
|
||||||
|
* without the +.
|
||||||
|
*
|
||||||
|
* @since 3.0
|
||||||
|
* @deprecated As of 3.6, use Apache Commons Text
|
||||||
|
* <a href="https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/translate/UnicodeUnescaper.html">
|
||||||
|
* UnicodeUnescaper</a> instead
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public class UnicodeUnescaper extends CharSequenceTranslator {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
|
||||||
|
if (input.charAt(index) == '\\' && index + 1 < input.length() && input.charAt(index + 1) == 'u') {
|
||||||
|
// consume optional additional 'u' chars
|
||||||
|
int i = 2;
|
||||||
|
while (index + i < input.length() && input.charAt(index + i) == 'u') {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index + i < input.length() && input.charAt(index + i) == '+') {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index + i + 4 <= input.length()) {
|
||||||
|
// Get 4 hex digits
|
||||||
|
final CharSequence unicode = input.subSequence(index + i, index + i + 4);
|
||||||
|
|
||||||
|
try {
|
||||||
|
final int value = Integer.parseInt(unicode.toString(), 16);
|
||||||
|
out.write((char) value);
|
||||||
|
} catch (final NumberFormatException nfe) {
|
||||||
|
throw new IllegalArgumentException("Unable to parse unicode value: " + unicode, nfe);
|
||||||
|
}
|
||||||
|
return i + 4;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Less than 4 hex digits in unicode value: '" + input.subSequence(index, input.length())
|
||||||
|
+ "' due to end of CharSequence");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
|
||||||
|
public class FieldLocatorActionKeyF3 implements IFieldLocator {
|
||||||
|
public Field getField() {
|
||||||
|
Class oclass = Minecraft.class;
|
||||||
|
Field field = this.getFieldRenderChunksMany();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
Config.log("(Reflector) Field not present: " + oclass.getName() + ".actionKeyF3 (field renderChunksMany not found)");
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
Field field1 = ReflectorRaw.getFieldAfter(Minecraft.class, field, Boolean.TYPE, 0);
|
||||||
|
|
||||||
|
if (field1 == null) {
|
||||||
|
Config.log("(Reflector) Field not present: " + oclass.getName() + ".actionKeyF3");
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return field1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Field getFieldRenderChunksMany() {
|
||||||
|
Minecraft minecraft = Minecraft.getMinecraft();
|
||||||
|
boolean flag = minecraft.renderChunksMany;
|
||||||
|
Field[] afield = Minecraft.class.getDeclaredFields();
|
||||||
|
minecraft.renderChunksMany = true;
|
||||||
|
Field[] afield1 = ReflectorRaw.getFields(minecraft, afield, Boolean.TYPE, Boolean.TRUE);
|
||||||
|
minecraft.renderChunksMany = false;
|
||||||
|
Field[] afield2 = ReflectorRaw.getFields(minecraft, afield, Boolean.TYPE, Boolean.FALSE);
|
||||||
|
minecraft.renderChunksMany = flag;
|
||||||
|
Set < Field > set = new HashSet(Arrays.asList(afield1));
|
||||||
|
Set < Field > set1 = new HashSet(Arrays.asList(afield2));
|
||||||
|
Set < Field > set2 = new HashSet(set);
|
||||||
|
set2.retainAll(set1);
|
||||||
|
Field[] afield3 = (Field[])((Field[]) set2.toArray(new Field[set2.size()]));
|
||||||
|
return afield3.length != 1 ? null : afield3[0];
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
public class FieldLocatorFixed implements IFieldLocator {
|
||||||
|
private Field field;
|
||||||
|
|
||||||
|
public FieldLocatorFixed(Field field) {
|
||||||
|
this.field = field;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Field getField() {
|
||||||
|
return this.field;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
|
||||||
|
public class FieldLocatorName implements IFieldLocator {
|
||||||
|
private ReflectorClass reflectorClass = null;
|
||||||
|
private String targetFieldName = null;
|
||||||
|
|
||||||
|
public FieldLocatorName(ReflectorClass reflectorClass, String targetFieldName) {
|
||||||
|
this.reflectorClass = reflectorClass;
|
||||||
|
this.targetFieldName = targetFieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Field getField() {
|
||||||
|
Class oclass = this.reflectorClass.getTargetClass();
|
||||||
|
|
||||||
|
if (oclass == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Field field = this.getDeclaredField(oclass, this.targetFieldName);
|
||||||
|
field.setAccessible(true);
|
||||||
|
return field;
|
||||||
|
} catch (NoSuchFieldException var3) {
|
||||||
|
Config.log("(Reflector) Field not present: " + oclass.getName() + "." + this.targetFieldName);
|
||||||
|
return null;
|
||||||
|
} catch (SecurityException securityexception) {
|
||||||
|
securityexception.printStackTrace();
|
||||||
|
return null;
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Field getDeclaredField(Class cls, String name) throws NoSuchFieldException {
|
||||||
|
Field[] afield = cls.getDeclaredFields();
|
||||||
|
|
||||||
|
for (int i = 0; i < afield.length; ++i) {
|
||||||
|
Field field = afield[i];
|
||||||
|
|
||||||
|
if (field.getName().equals(name)) {
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cls == Object.class) {
|
||||||
|
throw new NoSuchFieldException(name);
|
||||||
|
} else {
|
||||||
|
return this.getDeclaredField(cls.getSuperclass(), name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
|
||||||
|
public class FieldLocatorType implements IFieldLocator {
|
||||||
|
private ReflectorClass reflectorClass;
|
||||||
|
private Class targetFieldType;
|
||||||
|
private int targetFieldIndex;
|
||||||
|
|
||||||
|
public FieldLocatorType(ReflectorClass reflectorClass, Class targetFieldType) {
|
||||||
|
this(reflectorClass, targetFieldType, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FieldLocatorType(ReflectorClass reflectorClass, Class targetFieldType, int targetFieldIndex) {
|
||||||
|
this.reflectorClass = null;
|
||||||
|
this.targetFieldType = null;
|
||||||
|
this.reflectorClass = reflectorClass;
|
||||||
|
this.targetFieldType = targetFieldType;
|
||||||
|
this.targetFieldIndex = targetFieldIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Field getField() {
|
||||||
|
Class oclass = this.reflectorClass.getTargetClass();
|
||||||
|
|
||||||
|
if (oclass == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Field[] afield = oclass.getDeclaredFields();
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (int j = 0; j < afield.length; ++j) {
|
||||||
|
Field field = afield[j];
|
||||||
|
|
||||||
|
if (field.getType() == this.targetFieldType) {
|
||||||
|
if (i == this.targetFieldIndex) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.log("(Reflector) Field not present: " + oclass.getName() + ".(type: " + this.targetFieldType + ", index: " + this.targetFieldIndex + ")");
|
||||||
|
return null;
|
||||||
|
} catch (SecurityException securityexception) {
|
||||||
|
securityexception.printStackTrace();
|
||||||
|
return null;
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
|
||||||
|
public class FieldLocatorTypes implements IFieldLocator {
|
||||||
|
private Field field = null;
|
||||||
|
|
||||||
|
public FieldLocatorTypes(Class cls, Class[] preTypes, Class type, Class[] postTypes, String errorName) {
|
||||||
|
Field[] afield = cls.getDeclaredFields();
|
||||||
|
List < Class > list = new ArrayList();
|
||||||
|
|
||||||
|
for (int i = 0; i < afield.length; ++i) {
|
||||||
|
Field field = afield[i];
|
||||||
|
list.add(field.getType());
|
||||||
|
}
|
||||||
|
|
||||||
|
List < Class > list1 = new ArrayList();
|
||||||
|
list1.addAll(Arrays. < Class > asList(preTypes));
|
||||||
|
list1.add(type);
|
||||||
|
list1.addAll(Arrays. < Class > asList(postTypes));
|
||||||
|
int l = Collections.indexOfSubList(list, list1);
|
||||||
|
|
||||||
|
if (l < 0) {
|
||||||
|
Config.log("(Reflector) Field not found: " + errorName);
|
||||||
|
} else {
|
||||||
|
int j = Collections.indexOfSubList(list.subList(l + 1, list.size()), list1);
|
||||||
|
|
||||||
|
if (j >= 0) {
|
||||||
|
Config.log("(Reflector) More than one match found for field: " + errorName);
|
||||||
|
} else {
|
||||||
|
int k = l + preTypes.length;
|
||||||
|
this.field = afield[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Field getField() {
|
||||||
|
return this.field;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
public interface IFieldLocator {
|
||||||
|
Field getField();
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
public interface IResolvable {
|
||||||
|
void resolve();
|
||||||
|
}
|
551
src/main/java/net/PeytonPlayz585/shadow/reflect/Reflector.java
Normal file
551
src/main/java/net/PeytonPlayz585/shadow/reflect/Reflector.java
Normal file
|
@ -0,0 +1,551 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.ArrayUtils;
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.resources.DefaultResourcePack;
|
||||||
|
|
||||||
|
public class Reflector {
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger();
|
||||||
|
public static ReflectorClass Minecraft = new ReflectorClass(Minecraft.class);
|
||||||
|
public static ReflectorField Minecraft_defaultResourcePack = new ReflectorField(Minecraft, DefaultResourcePack.class);
|
||||||
|
|
||||||
|
public static void callVoid(ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
method.invoke((Object) null, params);
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, (Object) null, refMethod, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean callBoolean(ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
Boolean obool = (Boolean) method.invoke((Object) null, params);
|
||||||
|
return obool.booleanValue();
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, (Object) null, refMethod, params);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int callInt(ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
Integer integer = (Integer) method.invoke((Object) null, params);
|
||||||
|
return integer.intValue();
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, (Object) null, refMethod, params);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float callFloat(ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return 0.0F;
|
||||||
|
} else {
|
||||||
|
Float f = (Float) method.invoke((Object) null, params);
|
||||||
|
return f.floatValue();
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, (Object) null, refMethod, params);
|
||||||
|
return 0.0F;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double callDouble(ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return 0.0D;
|
||||||
|
} else {
|
||||||
|
Double d0 = (Double) method.invoke((Object) null, params);
|
||||||
|
return d0.doubleValue();
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, (Object) null, refMethod, params);
|
||||||
|
return 0.0D;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String callString(ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
String s = (String) method.invoke((Object) null, params);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, (Object) null, refMethod, params);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object call(ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
Object object = method.invoke((Object) null, params);
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, (Object) null, refMethod, params);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void callVoid(Object obj, ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
if (obj == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
method.invoke(obj, params);
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, obj, refMethod, params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean callBoolean(Object obj, ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
Boolean obool = (Boolean) method.invoke(obj, params);
|
||||||
|
return obool.booleanValue();
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, obj, refMethod, params);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int callInt(Object obj, ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
Integer integer = (Integer) method.invoke(obj, params);
|
||||||
|
return integer.intValue();
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, obj, refMethod, params);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float callFloat(Object obj, ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return 0.0F;
|
||||||
|
} else {
|
||||||
|
Float f = (Float) method.invoke(obj, params);
|
||||||
|
return f.floatValue();
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, obj, refMethod, params);
|
||||||
|
return 0.0F;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double callDouble(Object obj, ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return 0.0D;
|
||||||
|
} else {
|
||||||
|
Double d0 = (Double) method.invoke(obj, params);
|
||||||
|
return d0.doubleValue();
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, obj, refMethod, params);
|
||||||
|
return 0.0D;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String callString(Object obj, ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
String s = (String) method.invoke(obj, params);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, obj, refMethod, params);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object call(Object obj, ReflectorMethod refMethod, Object...params) {
|
||||||
|
try {
|
||||||
|
Method method = refMethod.getTargetMethod();
|
||||||
|
|
||||||
|
if (method == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
Object object = method.invoke(obj, params);
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, obj, refMethod, params);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getFieldValue(ReflectorField refField) {
|
||||||
|
return getFieldValue((Object) null, refField);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getFieldValue(Object obj, ReflectorField refField) {
|
||||||
|
try {
|
||||||
|
Field field = refField.getTargetField();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
Object object = field.get(obj);
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Config.error("", throwable);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean getFieldValueBoolean(ReflectorField refField, boolean def) {
|
||||||
|
try {
|
||||||
|
Field field = refField.getTargetField();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return def;
|
||||||
|
} else {
|
||||||
|
boolean flag = field.getBoolean((Object) null);
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Config.error("", throwable);
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean getFieldValueBoolean(Object obj, ReflectorField refField, boolean def) {
|
||||||
|
try {
|
||||||
|
Field field = refField.getTargetField();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return def;
|
||||||
|
} else {
|
||||||
|
boolean flag = field.getBoolean(obj);
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Config.error("", throwable);
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getFieldValue(ReflectorFields refFields, int index) {
|
||||||
|
ReflectorField reflectorfield = refFields.getReflectorField(index);
|
||||||
|
return reflectorfield == null ? null : getFieldValue(reflectorfield);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getFieldValue(Object obj, ReflectorFields refFields, int index) {
|
||||||
|
ReflectorField reflectorfield = refFields.getReflectorField(index);
|
||||||
|
return reflectorfield == null ? null : getFieldValue(obj, reflectorfield);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getFieldValueFloat(Object obj, ReflectorField refField, float def) {
|
||||||
|
try {
|
||||||
|
Field field = refField.getTargetField();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return def;
|
||||||
|
} else {
|
||||||
|
float f = field.getFloat(obj);
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Config.error("", throwable);
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getFieldValueInt(Object obj, ReflectorField refField, int def) {
|
||||||
|
try {
|
||||||
|
Field field = refField.getTargetField();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return def;
|
||||||
|
} else {
|
||||||
|
int i = field.getInt(obj);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Config.error("", throwable);
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getFieldValueLong(Object obj, ReflectorField refField, long def) {
|
||||||
|
try {
|
||||||
|
Field field = refField.getTargetField();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return def;
|
||||||
|
} else {
|
||||||
|
long i = field.getLong(obj);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Config.error("", throwable);
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setFieldValue(ReflectorField refField, Object value) {
|
||||||
|
return setFieldValue((Object) null, refField, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setFieldValue(Object obj, ReflectorField refField, Object value) {
|
||||||
|
try {
|
||||||
|
Field field = refField.getTargetField();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
field.set(obj, value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Config.error("", throwable);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setFieldValueInt(ReflectorField refField, int value) {
|
||||||
|
return setFieldValueInt((Object) null, refField, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setFieldValueInt(Object obj, ReflectorField refField, int value) {
|
||||||
|
try {
|
||||||
|
Field field = refField.getTargetField();
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
field.setInt(obj, value);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Config.error("", throwable);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object newInstance(ReflectorConstructor constr, Object...params) {
|
||||||
|
Constructor constructor = constr.getTargetConstructor();
|
||||||
|
|
||||||
|
if (constructor == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
Object object = constructor.newInstance(params);
|
||||||
|
return object;
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
handleException(throwable, constr, params);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean matchesTypes(Class[] pTypes, Class[] cTypes) {
|
||||||
|
if (pTypes.length != cTypes.length) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < cTypes.length; ++i) {
|
||||||
|
Class oclass = pTypes[i];
|
||||||
|
Class oclass1 = cTypes[i];
|
||||||
|
|
||||||
|
if (oclass != oclass1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void dbgCall(boolean isStatic, String callType, ReflectorMethod refMethod, Object[] params, Object retVal) {
|
||||||
|
String s = refMethod.getTargetMethod().getDeclaringClass().getName();
|
||||||
|
String s1 = refMethod.getTargetMethod().getName();
|
||||||
|
String s2 = "";
|
||||||
|
|
||||||
|
if (isStatic) {
|
||||||
|
s2 = " static";
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.dbg(callType + s2 + " " + s + "." + s1 + "(" + ArrayUtils.arrayToString(params) + ") => " + retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void dbgCallVoid(boolean isStatic, String callType, ReflectorMethod refMethod, Object[] params) {
|
||||||
|
String s = refMethod.getTargetMethod().getDeclaringClass().getName();
|
||||||
|
String s1 = refMethod.getTargetMethod().getName();
|
||||||
|
String s2 = "";
|
||||||
|
|
||||||
|
if (isStatic) {
|
||||||
|
s2 = " static";
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.dbg(callType + s2 + " " + s + "." + s1 + "(" + ArrayUtils.arrayToString(params) + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void dbgFieldValue(boolean isStatic, String accessType, ReflectorField refField, Object val) {
|
||||||
|
String s = refField.getTargetField().getDeclaringClass().getName();
|
||||||
|
String s1 = refField.getTargetField().getName();
|
||||||
|
String s2 = "";
|
||||||
|
|
||||||
|
if (isStatic) {
|
||||||
|
s2 = " static";
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.dbg(accessType + s2 + " " + s + "." + s1 + " => " + val);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void handleException(Throwable e, Object obj, ReflectorMethod refMethod, Object[] params) {
|
||||||
|
if (e instanceof InvocationTargetException) {
|
||||||
|
Throwable throwable = e.getCause();
|
||||||
|
|
||||||
|
if (throwable instanceof RuntimeException) {
|
||||||
|
RuntimeException runtimeexception = (RuntimeException) throwable;
|
||||||
|
throw runtimeexception;
|
||||||
|
} else {
|
||||||
|
Config.error("", e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Config.warn("*** Exception outside of method ***");
|
||||||
|
Config.warn("Method deactivated: " + refMethod.getTargetMethod());
|
||||||
|
refMethod.deactivate();
|
||||||
|
|
||||||
|
if (e instanceof IllegalArgumentException) {
|
||||||
|
Config.warn("*** IllegalArgumentException ***");
|
||||||
|
Config.warn("Method: " + refMethod.getTargetMethod());
|
||||||
|
Config.warn("Object: " + obj);
|
||||||
|
Config.warn("Parameter classes: " + ArrayUtils.arrayToString(getClasses(params)));
|
||||||
|
Config.warn("Parameters: " + ArrayUtils.arrayToString(params));
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.warn("", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void handleException(Throwable e, ReflectorConstructor refConstr, Object[] params) {
|
||||||
|
if (e instanceof InvocationTargetException) {
|
||||||
|
Config.error("", e);
|
||||||
|
} else {
|
||||||
|
Config.warn("*** Exception outside of constructor ***");
|
||||||
|
Config.warn("Constructor deactivated: " + refConstr.getTargetConstructor());
|
||||||
|
refConstr.deactivate();
|
||||||
|
|
||||||
|
if (e instanceof IllegalArgumentException) {
|
||||||
|
Config.warn("*** IllegalArgumentException ***");
|
||||||
|
Config.warn("Constructor: " + refConstr.getTargetConstructor());
|
||||||
|
Config.warn("Parameter classes: " + ArrayUtils.arrayToString(getClasses(params)));
|
||||||
|
Config.warn("Parameters: " + ArrayUtils.arrayToString(params));
|
||||||
|
}
|
||||||
|
|
||||||
|
Config.warn("", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Object[] getClasses(Object[] objs) {
|
||||||
|
if (objs == null) {
|
||||||
|
return new Class[0];
|
||||||
|
} else {
|
||||||
|
Class[] aclass = new Class[objs.length];
|
||||||
|
|
||||||
|
for (int i = 0; i < aclass.length; ++i) {
|
||||||
|
Object object = objs[i];
|
||||||
|
|
||||||
|
if (object != null) {
|
||||||
|
aclass[i] = object.getClass();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return aclass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ReflectorField[] getReflectorFields(ReflectorClass parentClass, Class fieldType, int count) {
|
||||||
|
ReflectorField[] areflectorfield = new ReflectorField[count];
|
||||||
|
|
||||||
|
for (int i = 0; i < areflectorfield.length; ++i) {
|
||||||
|
areflectorfield[i] = new ReflectorField(parentClass, fieldType, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return areflectorfield;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean logEntry(String str) {
|
||||||
|
LOGGER.info("[OptiFine] " + str);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean registerResolvable(final String str) {
|
||||||
|
IResolvable iresolvable = new IResolvable() {
|
||||||
|
public void resolve() {
|
||||||
|
Reflector.LOGGER.info("[OptiFine] " + str);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ReflectorResolver.register(iresolvable);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
|
||||||
|
public class ReflectorClass implements IResolvable {
|
||||||
|
private String targetClassName = null;
|
||||||
|
private boolean checked = false;
|
||||||
|
private Class targetClass = null;
|
||||||
|
|
||||||
|
public ReflectorClass(String targetClassName) {
|
||||||
|
this.targetClassName = targetClassName;
|
||||||
|
ReflectorResolver.register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorClass(Class targetClass) {
|
||||||
|
this.targetClass = targetClass;
|
||||||
|
this.targetClassName = targetClass.getName();
|
||||||
|
this.checked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getTargetClass() {
|
||||||
|
if (this.checked) {
|
||||||
|
return this.targetClass;
|
||||||
|
} else {
|
||||||
|
this.checked = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.targetClass = Class.forName(this.targetClassName);
|
||||||
|
} catch (ClassNotFoundException var2) {
|
||||||
|
Config.log("(Reflector) Class not present: " + this.targetClassName);
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.targetClass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean exists() {
|
||||||
|
return this.getTargetClass() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTargetClassName() {
|
||||||
|
return this.targetClassName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isInstance(Object obj) {
|
||||||
|
return this.getTargetClass() == null ? false : this.getTargetClass().isInstance(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorField makeField(String name) {
|
||||||
|
return new ReflectorField(this, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorMethod makeMethod(String name) {
|
||||||
|
return new ReflectorMethod(this, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorMethod makeMethod(String name, Class[] paramTypes) {
|
||||||
|
return new ReflectorMethod(this, name, paramTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resolve() {
|
||||||
|
Class oclass = this.getTargetClass();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.ArrayUtils;
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
|
||||||
|
public class ReflectorConstructor implements IResolvable {
|
||||||
|
private ReflectorClass reflectorClass = null;
|
||||||
|
private Class[] parameterTypes = null;
|
||||||
|
private boolean checked = false;
|
||||||
|
private Constructor targetConstructor = null;
|
||||||
|
|
||||||
|
public ReflectorConstructor(ReflectorClass reflectorClass, Class[] parameterTypes) {
|
||||||
|
this.reflectorClass = reflectorClass;
|
||||||
|
this.parameterTypes = parameterTypes;
|
||||||
|
ReflectorResolver.register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Constructor getTargetConstructor() {
|
||||||
|
if (this.checked) {
|
||||||
|
return this.targetConstructor;
|
||||||
|
} else {
|
||||||
|
this.checked = true;
|
||||||
|
Class oclass = this.reflectorClass.getTargetClass();
|
||||||
|
|
||||||
|
if (oclass == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
this.targetConstructor = findConstructor(oclass, this.parameterTypes);
|
||||||
|
|
||||||
|
if (this.targetConstructor == null) {
|
||||||
|
Config.dbg("(Reflector) Constructor not present: " + oclass.getName() + ", params: " + ArrayUtils.arrayToString((Object[]) this.parameterTypes));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.targetConstructor != null) {
|
||||||
|
this.targetConstructor.setAccessible(true);
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.targetConstructor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Constructor findConstructor(Class cls, Class[] paramTypes) {
|
||||||
|
Constructor[] aconstructor = cls.getDeclaredConstructors();
|
||||||
|
|
||||||
|
for (int i = 0; i < aconstructor.length; ++i) {
|
||||||
|
Constructor constructor = aconstructor[i];
|
||||||
|
Class[] aclass = constructor.getParameterTypes();
|
||||||
|
|
||||||
|
if (Reflector.matchesTypes(paramTypes, aclass)) {
|
||||||
|
return constructor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean exists() {
|
||||||
|
return this.checked ? this.targetConstructor != null : this.getTargetConstructor() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deactivate() {
|
||||||
|
this.checked = true;
|
||||||
|
this.targetConstructor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object newInstance(Object...params) {
|
||||||
|
return Reflector.newInstance(this, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resolve() {
|
||||||
|
Constructor constructor = this.getTargetConstructor();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
public class ReflectorField implements IResolvable {
|
||||||
|
private IFieldLocator fieldLocator;
|
||||||
|
private boolean checked;
|
||||||
|
private Field targetField;
|
||||||
|
|
||||||
|
public ReflectorField(ReflectorClass reflectorClass, String targetFieldName) {
|
||||||
|
this((IFieldLocator)(new FieldLocatorName(reflectorClass, targetFieldName)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorField(ReflectorClass reflectorClass, Class targetFieldType) {
|
||||||
|
this(reflectorClass, targetFieldType, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorField(ReflectorClass reflectorClass, Class targetFieldType, int targetFieldIndex) {
|
||||||
|
this((IFieldLocator)(new FieldLocatorType(reflectorClass, targetFieldType, targetFieldIndex)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorField(Field field) {
|
||||||
|
this((IFieldLocator)(new FieldLocatorFixed(field)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorField(IFieldLocator fieldLocator) {
|
||||||
|
this.fieldLocator = null;
|
||||||
|
this.checked = false;
|
||||||
|
this.targetField = null;
|
||||||
|
this.fieldLocator = fieldLocator;
|
||||||
|
ReflectorResolver.register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Field getTargetField() {
|
||||||
|
if (this.checked) {
|
||||||
|
return this.targetField;
|
||||||
|
} else {
|
||||||
|
this.checked = true;
|
||||||
|
this.targetField = this.fieldLocator.getField();
|
||||||
|
|
||||||
|
if (this.targetField != null) {
|
||||||
|
this.targetField.setAccessible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.targetField;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getValue() {
|
||||||
|
return Reflector.getFieldValue((Object) null, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(Object value) {
|
||||||
|
Reflector.setFieldValue((Object) null, this, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(Object obj, Object value) {
|
||||||
|
Reflector.setFieldValue(obj, this, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean exists() {
|
||||||
|
return this.getTargetField() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resolve() {
|
||||||
|
Field field = this.getTargetField();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
public class ReflectorFields {
|
||||||
|
private ReflectorClass reflectorClass;
|
||||||
|
private Class fieldType;
|
||||||
|
private int fieldCount;
|
||||||
|
private ReflectorField[] reflectorFields;
|
||||||
|
|
||||||
|
public ReflectorFields(ReflectorClass reflectorClass, Class fieldType, int fieldCount) {
|
||||||
|
this.reflectorClass = reflectorClass;
|
||||||
|
this.fieldType = fieldType;
|
||||||
|
|
||||||
|
if (reflectorClass.exists()) {
|
||||||
|
if (fieldType != null) {
|
||||||
|
this.reflectorFields = new ReflectorField[fieldCount];
|
||||||
|
|
||||||
|
for (int i = 0; i < this.reflectorFields.length; ++i) {
|
||||||
|
this.reflectorFields[i] = new ReflectorField(reflectorClass, fieldType, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorClass getReflectorClass() {
|
||||||
|
return this.reflectorClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getFieldType() {
|
||||||
|
return this.fieldType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFieldCount() {
|
||||||
|
return this.fieldCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorField getReflectorField(int index) {
|
||||||
|
return index >= 0 && index < this.reflectorFields.length ? this.reflectorFields[index] : null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,197 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
|
||||||
|
public class ReflectorMethod implements IResolvable {
|
||||||
|
private ReflectorClass reflectorClass;
|
||||||
|
private String targetMethodName;
|
||||||
|
private Class[] targetMethodParameterTypes;
|
||||||
|
private boolean checked;
|
||||||
|
private Method targetMethod;
|
||||||
|
|
||||||
|
public ReflectorMethod(ReflectorClass reflectorClass, String targetMethodName) {
|
||||||
|
this(reflectorClass, targetMethodName, (Class[]) null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReflectorMethod(ReflectorClass reflectorClass, String targetMethodName, Class[] targetMethodParameterTypes) {
|
||||||
|
this.reflectorClass = null;
|
||||||
|
this.targetMethodName = null;
|
||||||
|
this.targetMethodParameterTypes = null;
|
||||||
|
this.checked = false;
|
||||||
|
this.targetMethod = null;
|
||||||
|
this.reflectorClass = reflectorClass;
|
||||||
|
this.targetMethodName = targetMethodName;
|
||||||
|
this.targetMethodParameterTypes = targetMethodParameterTypes;
|
||||||
|
ReflectorResolver.register(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Method getTargetMethod() {
|
||||||
|
if (this.checked) {
|
||||||
|
return this.targetMethod;
|
||||||
|
} else {
|
||||||
|
this.checked = true;
|
||||||
|
Class oclass = this.reflectorClass.getTargetClass();
|
||||||
|
|
||||||
|
if (oclass == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
if (this.targetMethodParameterTypes == null) {
|
||||||
|
Method[] amethod = getMethods(oclass, this.targetMethodName);
|
||||||
|
|
||||||
|
if (amethod.length <= 0) {
|
||||||
|
Config.log("(Reflector) Method not present: " + oclass.getName() + "." + this.targetMethodName);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (amethod.length > 1) {
|
||||||
|
Config.warn("(Reflector) More than one method found: " + oclass.getName() + "." + this.targetMethodName);
|
||||||
|
|
||||||
|
for (int i = 0; i < amethod.length; ++i) {
|
||||||
|
Method method = amethod[i];
|
||||||
|
Config.warn("(Reflector) - " + method);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.targetMethod = amethod[0];
|
||||||
|
} else {
|
||||||
|
this.targetMethod = getMethod(oclass, this.targetMethodName, this.targetMethodParameterTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.targetMethod == null) {
|
||||||
|
Config.log("(Reflector) Method not present: " + oclass.getName() + "." + this.targetMethodName);
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
this.targetMethod.setAccessible(true);
|
||||||
|
return this.targetMethod;
|
||||||
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throwable.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean exists() {
|
||||||
|
return this.checked ? this.targetMethod != null : this.getTargetMethod() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class getReturnType() {
|
||||||
|
Method method = this.getTargetMethod();
|
||||||
|
return method == null ? null : method.getReturnType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deactivate() {
|
||||||
|
this.checked = true;
|
||||||
|
this.targetMethod = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object call(Object...params) {
|
||||||
|
return Reflector.call(this, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean callBoolean(Object...params) {
|
||||||
|
return Reflector.callBoolean(this, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int callInt(Object...params) {
|
||||||
|
return Reflector.callInt(this, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public float callFloat(Object...params) {
|
||||||
|
return Reflector.callFloat(this, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double callDouble(Object...params) {
|
||||||
|
return Reflector.callDouble(this, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String callString(Object...params) {
|
||||||
|
return Reflector.callString(this, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object call(Object param) {
|
||||||
|
return Reflector.call(this, new Object[] {
|
||||||
|
param
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean callBoolean(Object param) {
|
||||||
|
return Reflector.callBoolean(this, new Object[] {
|
||||||
|
param
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public int callInt(Object param) {
|
||||||
|
return Reflector.callInt(this, new Object[] {
|
||||||
|
param
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public float callFloat(Object param) {
|
||||||
|
return Reflector.callFloat(this, new Object[] {
|
||||||
|
param
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public double callDouble(Object param) {
|
||||||
|
return Reflector.callDouble(this, new Object[] {
|
||||||
|
param
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public String callString1(Object param) {
|
||||||
|
return Reflector.callString(this, new Object[] {
|
||||||
|
param
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void callVoid(Object...params) {
|
||||||
|
Reflector.callVoid(this, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Method getMethod(Class cls, String methodName, Class[] paramTypes) {
|
||||||
|
Method[] amethod = cls.getDeclaredMethods();
|
||||||
|
|
||||||
|
for (int i = 0; i < amethod.length; ++i) {
|
||||||
|
Method method = amethod[i];
|
||||||
|
|
||||||
|
if (method.getName().equals(methodName)) {
|
||||||
|
Class[] aclass = method.getParameterTypes();
|
||||||
|
|
||||||
|
if (Reflector.matchesTypes(paramTypes, aclass)) {
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Method[] getMethods(Class cls, String methodName) {
|
||||||
|
List list = new ArrayList();
|
||||||
|
Method[] amethod = cls.getDeclaredMethods();
|
||||||
|
|
||||||
|
for (int i = 0; i < amethod.length; ++i) {
|
||||||
|
Method method = amethod[i];
|
||||||
|
|
||||||
|
if (method.getName().equals(methodName)) {
|
||||||
|
list.add(method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Method[] amethod1 = (Method[])((Method[]) list.toArray(new Method[list.size()]));
|
||||||
|
return amethod1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resolve() {
|
||||||
|
Method method = this.getTargetMethod();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,157 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ReflectorRaw {
|
||||||
|
public static Field getField(Class cls, Class fieldType) {
|
||||||
|
try {
|
||||||
|
Field[] afield = cls.getDeclaredFields();
|
||||||
|
|
||||||
|
for (int i = 0; i < afield.length; ++i) {
|
||||||
|
Field field = afield[i];
|
||||||
|
|
||||||
|
if (field.getType() == fieldType) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
} catch (Exception var5) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field[] getFields(Class cls, Class fieldType) {
|
||||||
|
try {
|
||||||
|
Field[] afield = cls.getDeclaredFields();
|
||||||
|
return getFields(afield, fieldType);
|
||||||
|
} catch (Exception var3) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field[] getFields(Field[] fields, Class fieldType) {
|
||||||
|
try {
|
||||||
|
List list = new ArrayList();
|
||||||
|
|
||||||
|
for (int i = 0; i < fields.length; ++i) {
|
||||||
|
Field field = fields[i];
|
||||||
|
|
||||||
|
if (field.getType() == fieldType) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
list.add(field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Field[] afield = (Field[])((Field[]) list.toArray(new Field[list.size()]));
|
||||||
|
return afield;
|
||||||
|
} catch (Exception var5) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field[] getFieldsAfter(Class cls, Field field, Class fieldType) {
|
||||||
|
try {
|
||||||
|
Field[] afield = cls.getDeclaredFields();
|
||||||
|
List < Field > list = Arrays. < Field > asList(afield);
|
||||||
|
int i = list.indexOf(field);
|
||||||
|
|
||||||
|
if (i < 0) {
|
||||||
|
return new Field[0];
|
||||||
|
} else {
|
||||||
|
List < Field > list1 = list.subList(i + 1, list.size());
|
||||||
|
Field[] afield1 = (Field[])((Field[]) list1.toArray(new Field[list1.size()]));
|
||||||
|
return getFields(afield1, fieldType);
|
||||||
|
}
|
||||||
|
} catch (Exception var8) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field[] getFields(Object obj, Field[] fields, Class fieldType, Object value) {
|
||||||
|
try {
|
||||||
|
List < Field > list = new ArrayList();
|
||||||
|
|
||||||
|
for (int i = 0; i < fields.length; ++i) {
|
||||||
|
Field field = fields[i];
|
||||||
|
|
||||||
|
if (field.getType() == fieldType) {
|
||||||
|
boolean flag = Modifier.isStatic(field.getModifiers());
|
||||||
|
|
||||||
|
if ((obj != null || flag) && (obj == null || !flag)) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
Object object = field.get(obj);
|
||||||
|
|
||||||
|
if (object == value) {
|
||||||
|
list.add(field);
|
||||||
|
} else if (object != null && value != null && object.equals(value)) {
|
||||||
|
list.add(field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Field[] afield = (Field[])((Field[]) list.toArray(new Field[list.size()]));
|
||||||
|
return afield;
|
||||||
|
} catch (Exception var9) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getField(Class cls, Class fieldType, int index) {
|
||||||
|
Field[] afield = getFields(cls, fieldType);
|
||||||
|
return index >= 0 && index < afield.length ? afield[index] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Field getFieldAfter(Class cls, Field field, Class fieldType, int index) {
|
||||||
|
Field[] afield = getFieldsAfter(cls, field, fieldType);
|
||||||
|
return index >= 0 && index < afield.length ? afield[index] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getFieldValue(Object obj, Class cls, Class fieldType) {
|
||||||
|
ReflectorField reflectorfield = getReflectorField(cls, fieldType);
|
||||||
|
return reflectorfield == null ? null : (!reflectorfield.exists() ? null : Reflector.getFieldValue(obj, reflectorfield));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object getFieldValue(Object obj, Class cls, Class fieldType, int index) {
|
||||||
|
ReflectorField reflectorfield = getReflectorField(cls, fieldType, index);
|
||||||
|
return reflectorfield == null ? null : (!reflectorfield.exists() ? null : Reflector.getFieldValue(obj, reflectorfield));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setFieldValue(Object obj, Class cls, Class fieldType, Object value) {
|
||||||
|
ReflectorField reflectorfield = getReflectorField(cls, fieldType);
|
||||||
|
return reflectorfield == null ? false : (!reflectorfield.exists() ? false : Reflector.setFieldValue(obj, reflectorfield, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setFieldValue(Object obj, Class cls, Class fieldType, int index, Object value) {
|
||||||
|
ReflectorField reflectorfield = getReflectorField(cls, fieldType, index);
|
||||||
|
return reflectorfield == null ? false : (!reflectorfield.exists() ? false : Reflector.setFieldValue(obj, reflectorfield, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ReflectorField getReflectorField(Class cls, Class fieldType) {
|
||||||
|
Field field = getField(cls, fieldType);
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
ReflectorClass reflectorclass = new ReflectorClass(cls);
|
||||||
|
return new ReflectorField(reflectorclass, field.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ReflectorField getReflectorField(Class cls, Class fieldType, int index) {
|
||||||
|
Field field = getField(cls, fieldType, index);
|
||||||
|
|
||||||
|
if (field == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
ReflectorClass reflectorclass = new ReflectorClass(cls);
|
||||||
|
return new ReflectorField(reflectorclass, field.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package net.PeytonPlayz585.shadow.reflect;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ReflectorResolver {
|
||||||
|
private static final List < IResolvable > RESOLVABLES = Collections. < IResolvable > synchronizedList(new ArrayList());
|
||||||
|
private static boolean resolved = false;
|
||||||
|
|
||||||
|
protected static void register(IResolvable resolvable) {
|
||||||
|
if (!resolved) {
|
||||||
|
RESOLVABLES.add(resolvable);
|
||||||
|
} else {
|
||||||
|
resolvable.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void resolve() {
|
||||||
|
if (!resolved) {
|
||||||
|
for (IResolvable iresolvable: RESOLVABLES) {
|
||||||
|
iresolvable.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
resolved = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -616,4 +616,8 @@ public class EaglercraftGPU {
|
||||||
public static final boolean checkHasHDRFramebufferSupport() {
|
public static final boolean checkHasHDRFramebufferSupport() {
|
||||||
return hasFramebufferHDR16FSupport || hasFramebufferHDR32FSupport;
|
return hasFramebufferHDR16FSupport || hasFramebufferHDR32FSupport;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int glGetTexLevelParameteri(int glTexture2d, int i, int glTextureWidth) {
|
||||||
|
return PlatformOpenGL._wglGetTexLevelParameteri(glTexture2d, i, glTextureWidth);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1198,4 +1198,8 @@ public class GlStateManager {
|
||||||
public static boolean isFogEnabled() {
|
public static boolean isFogEnabled() {
|
||||||
return stateFog;
|
return stateFog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getBoundTexture() {
|
||||||
|
return boundTexture[activeTexture];
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -27,5 +27,4 @@ public class OpenGlHelper {
|
||||||
GlStateManager.setActiveTexture(defaultTexUnit);
|
GlStateManager.setActiveTexture(defaultTexUnit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,7 +79,7 @@ public class DeferredStateManager {
|
||||||
static int projMatrixSerial = -1;
|
static int projMatrixSerial = -1;
|
||||||
static int passViewMatrixSerial = -1;
|
static int passViewMatrixSerial = -1;
|
||||||
static int passProjMatrixSerial = -1;
|
static int passProjMatrixSerial = -1;
|
||||||
static boolean isShadowPassMatrixLoaded = false;
|
public static boolean isShadowPassMatrixLoaded = false;
|
||||||
static final Matrix4f viewMatrix = new Matrix4f();
|
static final Matrix4f viewMatrix = new Matrix4f();
|
||||||
static final Matrix4f projMatrix = new Matrix4f();
|
static final Matrix4f projMatrix = new Matrix4f();
|
||||||
static final Matrix4f inverseViewMatrix = new Matrix4f();
|
static final Matrix4f inverseViewMatrix = new Matrix4f();
|
||||||
|
|
|
@ -5,12 +5,15 @@ import java.util.Map.Entry;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
import net.PeytonPlayz585.shadow.CustomItems;
|
||||||
import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
|
import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
|
||||||
import net.minecraft.client.resources.model.IBakedModel;
|
import net.minecraft.client.resources.model.IBakedModel;
|
||||||
import net.minecraft.client.resources.model.ModelManager;
|
import net.minecraft.client.resources.model.ModelManager;
|
||||||
import net.minecraft.client.resources.model.ModelResourceLocation;
|
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
/**+
|
/**+
|
||||||
* This portion of EaglercraftX contains deobfuscated Minecraft 1.8 source code.
|
* This portion of EaglercraftX contains deobfuscated Minecraft 1.8 source code.
|
||||||
|
@ -63,6 +66,10 @@ public class ItemModelMesher {
|
||||||
if (ibakedmodel == null) {
|
if (ibakedmodel == null) {
|
||||||
ibakedmodel = this.modelManager.getMissingModel();
|
ibakedmodel = this.modelManager.getMissingModel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Config.isCustomItems()) {
|
||||||
|
ibakedmodel = CustomItems.getCustomItemModel(stack, ibakedmodel, (ResourceLocation)null, true);
|
||||||
|
}
|
||||||
|
|
||||||
return ibakedmodel;
|
return ibakedmodel;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,8 @@ import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
import net.PeytonPlayz585.shadow.CustomItems;
|
||||||
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||||
import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer;
|
import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer;
|
||||||
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager;
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager;
|
||||||
|
@ -95,6 +97,7 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
private final ItemModelMesher itemModelMesher;
|
private final ItemModelMesher itemModelMesher;
|
||||||
private final TextureManager textureManager;
|
private final TextureManager textureManager;
|
||||||
public ModelManager modelManager = null;
|
public ModelManager modelManager = null;
|
||||||
|
private ModelResourceLocation modelLocation = null;
|
||||||
|
|
||||||
public RenderItem(TextureManager textureManager, ModelManager modelManager) {
|
public RenderItem(TextureManager textureManager, ModelManager modelManager) {
|
||||||
this.modelManager = modelManager;
|
this.modelManager = modelManager;
|
||||||
|
@ -131,7 +134,7 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
this.renderModel(model, -1, stack);
|
this.renderModel(model, -1, stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void renderModel(IBakedModel model, int color) {
|
public void renderModel(IBakedModel model, int color) {
|
||||||
this.renderModel(model, color, (ItemStack) null);
|
this.renderModel(model, color, (ItemStack) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,13 +168,20 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
GlStateManager.enableRescaleNormal();
|
GlStateManager.enableRescaleNormal();
|
||||||
TileEntityItemStackRenderer.instance.renderByItem(stack);
|
TileEntityItemStackRenderer.instance.renderByItem(stack);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
final IBakedModel model1;
|
||||||
|
if (Config.isCustomItems()) {
|
||||||
|
model1 = CustomItems.getCustomItemModel(stack, model, this.modelLocation, false);
|
||||||
|
} else {
|
||||||
|
model1 = model;
|
||||||
|
}
|
||||||
|
|
||||||
GlStateManager.translate(-0.5F, -0.5F, -0.5F);
|
GlStateManager.translate(-0.5F, -0.5F, -0.5F);
|
||||||
if (DeferredStateManager.isInDeferredPass() && isTransparentItem(stack)) {
|
if (DeferredStateManager.isInDeferredPass() && isTransparentItem(stack)) {
|
||||||
if (DeferredStateManager.forwardCallbackHandler != null) {
|
if (DeferredStateManager.forwardCallbackHandler != null) {
|
||||||
final Matrix4f mat = new Matrix4f(GlStateManager.getModelViewReference());
|
final Matrix4f mat = new Matrix4f(GlStateManager.getModelViewReference());
|
||||||
final float lx = GlStateManager.getTexCoordX(1), ly = GlStateManager.getTexCoordY(1);
|
final float lx = GlStateManager.getTexCoordX(1), ly = GlStateManager.getTexCoordY(1);
|
||||||
DeferredStateManager.forwardCallbackHandler.push(new ShadersRenderPassFuture(renderPosX,
|
DeferredStateManager.forwardCallbackHandler.push(new ShadersRenderPassFuture(renderPosX, renderPosY, renderPosZ, EaglerDeferredPipeline.instance.getPartialTicks()) {
|
||||||
renderPosY, renderPosZ, EaglerDeferredPipeline.instance.getPartialTicks()) {
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(PassType pass) {
|
public void draw(PassType pass) {
|
||||||
if (pass == PassType.MAIN) {
|
if (pass == PassType.MAIN) {
|
||||||
|
@ -183,14 +193,14 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
GlStateManager.texCoords2DDirect(1, lx, ly);
|
GlStateManager.texCoords2DDirect(1, lx, ly);
|
||||||
Minecraft.getMinecraft().getTextureManager()
|
Minecraft.getMinecraft().getTextureManager()
|
||||||
.bindTexture(TextureMap.locationBlocksTexture);
|
.bindTexture(TextureMap.locationBlocksTexture);
|
||||||
RenderItem.this.renderModel(model, stack);
|
RenderItem.this.renderModel(model1, stack);
|
||||||
if (pass != PassType.SHADOW && stack.hasEffect()) {
|
if (pass != PassType.SHADOW && stack.hasEffect() && (!Config.isCustomItems() || !CustomItems.renderCustomEffect(RenderItem.this, stack, model1))) {
|
||||||
GlStateManager.color(1.5F, 0.5F, 1.5F, 1.0F);
|
GlStateManager.color(1.5F, 0.5F, 1.5F, 1.0F);
|
||||||
DeferredStateManager.setDefaultMaterialConstants();
|
DeferredStateManager.setDefaultMaterialConstants();
|
||||||
DeferredStateManager.setRoughnessConstant(0.05f);
|
DeferredStateManager.setRoughnessConstant(0.05f);
|
||||||
DeferredStateManager.setMetalnessConstant(0.01f);
|
DeferredStateManager.setMetalnessConstant(0.01f);
|
||||||
GlStateManager.blendFunc(GL_SRC_COLOR, GL_ONE);
|
GlStateManager.blendFunc(GL_SRC_COLOR, GL_ONE);
|
||||||
renderEffect(model);
|
renderEffect(model1);
|
||||||
DeferredStateManager.setHDRTranslucentPassBlendFunc();
|
DeferredStateManager.setHDRTranslucentPassBlendFunc();
|
||||||
}
|
}
|
||||||
GlStateManager.popMatrix();
|
GlStateManager.popMatrix();
|
||||||
|
@ -200,8 +210,8 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.renderModel(model, stack);
|
this.renderModel(model1, stack);
|
||||||
if (stack.hasEffect()) {
|
if (stack.hasEffect() && (!Config.isCustomItems() || !CustomItems.renderCustomEffect(this, stack, model))) {
|
||||||
if (DeferredStateManager.isInDeferredPass()) {
|
if (DeferredStateManager.isInDeferredPass()) {
|
||||||
if (DeferredStateManager.forwardCallbackHandler != null
|
if (DeferredStateManager.forwardCallbackHandler != null
|
||||||
&& !DeferredStateManager.isEnableShadowRender()) {
|
&& !DeferredStateManager.isEnableShadowRender()) {
|
||||||
|
@ -223,7 +233,7 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
GlStateManager.loadMatrix(mat);
|
GlStateManager.loadMatrix(mat);
|
||||||
GlStateManager.texCoords2DDirect(1, lx, ly);
|
GlStateManager.texCoords2DDirect(1, lx, ly);
|
||||||
GlStateManager.tryBlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE);
|
GlStateManager.tryBlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE);
|
||||||
renderEffect(model);
|
renderEffect(model1);
|
||||||
DeferredStateManager.setHDRTranslucentPassBlendFunc();
|
DeferredStateManager.setHDRTranslucentPassBlendFunc();
|
||||||
GlStateManager.popMatrix();
|
GlStateManager.popMatrix();
|
||||||
EntityRenderer.disableLightmapStatic();
|
EntityRenderer.disableLightmapStatic();
|
||||||
|
@ -233,7 +243,7 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GlStateManager.blendFunc(GL_SRC_COLOR, GL_ONE);
|
GlStateManager.blendFunc(GL_SRC_COLOR, GL_ONE);
|
||||||
this.renderEffect(model);
|
this.renderEffect(model1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -250,31 +260,33 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void renderEffect(IBakedModel model) {
|
private void renderEffect(IBakedModel model) {
|
||||||
GlStateManager.depthMask(false);
|
if (!Config.isCustomItems() || CustomItems.isUseGlint()) {
|
||||||
GlStateManager.depthFunc(GL_EQUAL);
|
GlStateManager.depthMask(false);
|
||||||
GlStateManager.disableLighting();
|
GlStateManager.depthFunc(GL_EQUAL);
|
||||||
this.textureManager.bindTexture(RES_ITEM_GLINT);
|
GlStateManager.disableLighting();
|
||||||
GlStateManager.matrixMode(GL_TEXTURE);
|
this.textureManager.bindTexture(RES_ITEM_GLINT);
|
||||||
GlStateManager.pushMatrix();
|
GlStateManager.matrixMode(GL_TEXTURE);
|
||||||
GlStateManager.scale(8.0F, 8.0F, 8.0F);
|
GlStateManager.pushMatrix();
|
||||||
float f = (float) (Minecraft.getSystemTime() % 3000L) / 3000.0F / 8.0F;
|
GlStateManager.scale(8.0F, 8.0F, 8.0F);
|
||||||
GlStateManager.translate(f, 0.0F, 0.0F);
|
float f = (float) (Minecraft.getSystemTime() % 3000L) / 3000.0F / 8.0F;
|
||||||
GlStateManager.rotate(-50.0F, 0.0F, 0.0F, 1.0F);
|
GlStateManager.translate(f, 0.0F, 0.0F);
|
||||||
this.renderModel(model, -8372020);
|
GlStateManager.rotate(-50.0F, 0.0F, 0.0F, 1.0F);
|
||||||
GlStateManager.popMatrix();
|
this.renderModel(model, -8372020);
|
||||||
GlStateManager.pushMatrix();
|
GlStateManager.popMatrix();
|
||||||
GlStateManager.scale(8.0F, 8.0F, 8.0F);
|
GlStateManager.pushMatrix();
|
||||||
float f1 = (float) (Minecraft.getSystemTime() % 4873L) / 4873.0F / 8.0F;
|
GlStateManager.scale(8.0F, 8.0F, 8.0F);
|
||||||
GlStateManager.translate(-f1, 0.0F, 0.0F);
|
float f1 = (float) (Minecraft.getSystemTime() % 4873L) / 4873.0F / 8.0F;
|
||||||
GlStateManager.rotate(10.0F, 0.0F, 0.0F, 1.0F);
|
GlStateManager.translate(-f1, 0.0F, 0.0F);
|
||||||
this.renderModel(model, -8372020);
|
GlStateManager.rotate(10.0F, 0.0F, 0.0F, 1.0F);
|
||||||
GlStateManager.popMatrix();
|
this.renderModel(model, -8372020);
|
||||||
GlStateManager.matrixMode(GL_MODELVIEW);
|
GlStateManager.popMatrix();
|
||||||
GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
GlStateManager.matrixMode(GL_MODELVIEW);
|
||||||
GlStateManager.enableLighting();
|
GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
GlStateManager.depthFunc(GL_LEQUAL);
|
GlStateManager.enableLighting();
|
||||||
GlStateManager.depthMask(true);
|
GlStateManager.depthFunc(GL_LEQUAL);
|
||||||
this.textureManager.bindTexture(TextureMap.locationBlocksTexture);
|
GlStateManager.depthMask(true);
|
||||||
|
this.textureManager.bindTexture(TextureMap.locationBlocksTexture);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void putQuadNormal(WorldRenderer renderer, BakedQuad quad) {
|
private void putQuadNormal(WorldRenderer renderer, BakedQuad quad) {
|
||||||
|
@ -354,6 +366,8 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
modelresourcelocation = new ModelResourceLocation("bow_pulling_0", "inventory");
|
modelresourcelocation = new ModelResourceLocation("bow_pulling_0", "inventory");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.modelLocation = modelresourcelocation;
|
||||||
|
|
||||||
if (modelresourcelocation != null) {
|
if (modelresourcelocation != null) {
|
||||||
ibakedmodel = this.itemModelMesher.getModelManager().getModel(modelresourcelocation);
|
ibakedmodel = this.itemModelMesher.getModelManager().getModel(modelresourcelocation);
|
||||||
|
@ -361,6 +375,7 @@ public class RenderItem implements IResourceManagerReloadListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.renderItemModelTransform(stack, ibakedmodel, cameraTransformType);
|
this.renderItemModelTransform(stack, ibakedmodel, cameraTransformType);
|
||||||
|
this.modelLocation = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@ import java.util.Map;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
import net.PeytonPlayz585.shadow.CustomItems;
|
||||||
import net.lax1dude.eaglercraft.v1_8.HString;
|
import net.lax1dude.eaglercraft.v1_8.HString;
|
||||||
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
|
||||||
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager;
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager;
|
||||||
|
@ -84,7 +86,11 @@ public abstract class LayerArmorBase<T extends ModelBase> implements LayerRender
|
||||||
modelbase.setLivingAnimations(entitylivingbaseIn, armorSlot, parFloat2, parFloat3);
|
modelbase.setLivingAnimations(entitylivingbaseIn, armorSlot, parFloat2, parFloat3);
|
||||||
this.func_177179_a((T) modelbase, parInt1);
|
this.func_177179_a((T) modelbase, parInt1);
|
||||||
boolean flag = this.isSlotForLeggings(parInt1);
|
boolean flag = this.isSlotForLeggings(parInt1);
|
||||||
this.renderer.bindTexture(this.getArmorResource(itemarmor, flag));
|
|
||||||
|
if (!Config.isCustomItems() || !CustomItems.bindCustomArmorTexture(itemstack, flag ? 2 : 1, (String)null)) {
|
||||||
|
this.renderer.bindTexture(this.getArmorResource(itemarmor, flag));
|
||||||
|
}
|
||||||
|
|
||||||
DeferredStateManager.setDefaultMaterialConstants();
|
DeferredStateManager.setDefaultMaterialConstants();
|
||||||
switch (itemarmor.getArmorMaterial()) {
|
switch (itemarmor.getArmorMaterial()) {
|
||||||
case CHAIN:
|
case CHAIN:
|
||||||
|
@ -111,7 +117,9 @@ public abstract class LayerArmorBase<T extends ModelBase> implements LayerRender
|
||||||
float f2 = (float) (i & 255) / 255.0F;
|
float f2 = (float) (i & 255) / 255.0F;
|
||||||
GlStateManager.color(this.colorR * f, this.colorG * f1, this.colorB * f2, this.alpha);
|
GlStateManager.color(this.colorR * f, this.colorG * f1, this.colorB * f2, this.alpha);
|
||||||
modelbase.render(entitylivingbaseIn, armorSlot, parFloat2, parFloat4, parFloat5, parFloat6, parFloat7);
|
modelbase.render(entitylivingbaseIn, armorSlot, parFloat2, parFloat4, parFloat5, parFloat6, parFloat7);
|
||||||
this.renderer.bindTexture(this.getArmorResource(itemarmor, flag, "overlay"));
|
if (!Config.isCustomItems() || !CustomItems.bindCustomArmorTexture(itemstack, flag ? 2 : 1, "overlay")) {
|
||||||
|
this.renderer.bindTexture(this.getArmorResource(itemarmor, flag, "overlay"));
|
||||||
|
}
|
||||||
case CHAIN:
|
case CHAIN:
|
||||||
case IRON:
|
case IRON:
|
||||||
case GOLD:
|
case GOLD:
|
||||||
|
@ -159,8 +167,9 @@ public abstract class LayerArmorBase<T extends ModelBase> implements LayerRender
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
this.func_177183_a(entitylivingbaseIn, (T) modelbase, armorSlot, parFloat2, parFloat3, parFloat4,
|
if (!this.field_177193_i && itemstack.isItemEnchanted() && (!Config.isCustomItems() || !CustomItems.renderCustomArmorEffect(entitylivingbaseIn, itemstack, modelbase, armorSlot, parFloat2, parFloat3, parFloat4, parFloat5, parFloat6, parFloat7))) {
|
||||||
parFloat5, parFloat6, parFloat7);
|
this.func_177183_a(entitylivingbaseIn, (T) modelbase, armorSlot, parFloat2, parFloat3, parFloat4, parFloat5, parFloat6, parFloat7);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -179,43 +188,44 @@ public abstract class LayerArmorBase<T extends ModelBase> implements LayerRender
|
||||||
return armorSlot == 2;
|
return armorSlot == 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void func_177183_a(EntityLivingBase entitylivingbaseIn, T modelbaseIn, float parFloat1, float parFloat2,
|
private void func_177183_a(EntityLivingBase entitylivingbaseIn, T modelbaseIn, float parFloat1, float parFloat2, float parFloat3, float parFloat4, float parFloat5, float parFloat6, float parFloat7) {
|
||||||
float parFloat3, float parFloat4, float parFloat5, float parFloat6, float parFloat7) {
|
if (!Config.isCustomItems() || CustomItems.isUseGlint()) {
|
||||||
float f = (float) entitylivingbaseIn.ticksExisted + parFloat3;
|
float f = (float) entitylivingbaseIn.ticksExisted + parFloat3;
|
||||||
this.renderer.bindTexture(ENCHANTED_ITEM_GLINT_RES);
|
this.renderer.bindTexture(ENCHANTED_ITEM_GLINT_RES);
|
||||||
GlStateManager.enableBlend();
|
GlStateManager.enableBlend();
|
||||||
GlStateManager.depthFunc(GL_EQUAL);
|
GlStateManager.depthFunc(GL_EQUAL);
|
||||||
GlStateManager.depthMask(false);
|
GlStateManager.depthMask(false);
|
||||||
float f1 = 0.5F;
|
float f1 = 0.5F;
|
||||||
boolean d = !DeferredStateManager.isInDeferredPass();
|
boolean d = !DeferredStateManager.isInDeferredPass();
|
||||||
if (d) {
|
|
||||||
GlStateManager.color(f1, f1, f1, 1.0F);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; ++i) {
|
|
||||||
GlStateManager.disableLighting();
|
|
||||||
float f2 = 0.76F;
|
|
||||||
if (d) {
|
if (d) {
|
||||||
GlStateManager.blendFunc(GL_SRC_COLOR, GL_ONE);
|
GlStateManager.color(f1, f1, f1, 1.0F);
|
||||||
GlStateManager.color(0.5F * f2, 0.25F * f2, 0.8F * f2, 1.0F);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
GlStateManager.disableLighting();
|
||||||
|
float f2 = 0.76F;
|
||||||
|
if (d) {
|
||||||
|
GlStateManager.blendFunc(GL_SRC_COLOR, GL_ONE);
|
||||||
|
GlStateManager.color(0.5F * f2, 0.25F * f2, 0.8F * f2, 1.0F);
|
||||||
|
}
|
||||||
|
GlStateManager.matrixMode(GL_TEXTURE);
|
||||||
|
GlStateManager.loadIdentity();
|
||||||
|
float f3 = 0.33333334F;
|
||||||
|
GlStateManager.scale(f3, f3, f3);
|
||||||
|
GlStateManager.rotate(30.0F - (float) i * 60.0F, 0.0F, 0.0F, 1.0F);
|
||||||
|
GlStateManager.translate(0.0F, f * (0.001F + (float) i * 0.003F) * 20.0F, 0.0F);
|
||||||
|
GlStateManager.matrixMode(GL_MODELVIEW);
|
||||||
|
modelbaseIn.render(entitylivingbaseIn, parFloat1, parFloat2, parFloat4, parFloat5, parFloat6, parFloat7);
|
||||||
|
}
|
||||||
|
|
||||||
GlStateManager.matrixMode(GL_TEXTURE);
|
GlStateManager.matrixMode(GL_TEXTURE);
|
||||||
GlStateManager.loadIdentity();
|
GlStateManager.loadIdentity();
|
||||||
float f3 = 0.33333334F;
|
|
||||||
GlStateManager.scale(f3, f3, f3);
|
|
||||||
GlStateManager.rotate(30.0F - (float) i * 60.0F, 0.0F, 0.0F, 1.0F);
|
|
||||||
GlStateManager.translate(0.0F, f * (0.001F + (float) i * 0.003F) * 20.0F, 0.0F);
|
|
||||||
GlStateManager.matrixMode(GL_MODELVIEW);
|
GlStateManager.matrixMode(GL_MODELVIEW);
|
||||||
modelbaseIn.render(entitylivingbaseIn, parFloat1, parFloat2, parFloat4, parFloat5, parFloat6, parFloat7);
|
GlStateManager.enableLighting();
|
||||||
|
GlStateManager.depthMask(true);
|
||||||
|
GlStateManager.depthFunc(GL_LEQUAL);
|
||||||
|
GlStateManager.disableBlend();
|
||||||
}
|
}
|
||||||
|
|
||||||
GlStateManager.matrixMode(GL_TEXTURE);
|
|
||||||
GlStateManager.loadIdentity();
|
|
||||||
GlStateManager.matrixMode(GL_MODELVIEW);
|
|
||||||
GlStateManager.enableLighting();
|
|
||||||
GlStateManager.depthMask(true);
|
|
||||||
GlStateManager.depthFunc(GL_LEQUAL);
|
|
||||||
GlStateManager.disableBlend();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResourceLocation getArmorResource(ItemArmor parItemArmor, boolean parFlag) {
|
private ResourceLocation getArmorResource(ItemArmor parItemArmor, boolean parFlag) {
|
||||||
|
|
|
@ -15,6 +15,7 @@ import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
import net.PeytonPlayz585.shadow.Config;
|
import net.PeytonPlayz585.shadow.Config;
|
||||||
|
import net.PeytonPlayz585.shadow.CustomItems;
|
||||||
import net.PeytonPlayz585.shadow.TextureUtils;
|
import net.PeytonPlayz585.shadow.TextureUtils;
|
||||||
import net.lax1dude.eaglercraft.v1_8.HString;
|
import net.lax1dude.eaglercraft.v1_8.HString;
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.IFramebufferGL;
|
import net.lax1dude.eaglercraft.v1_8.internal.IFramebufferGL;
|
||||||
|
@ -180,6 +181,7 @@ public class TextureMap extends AbstractTexture implements ITickableTextureObjec
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CustomItems.updateIcons(this);
|
||||||
int i = Minecraft.getGLMaximumTextureSize();
|
int i = Minecraft.getGLMaximumTextureSize();
|
||||||
Stitcher stitcher = new Stitcher(i, i, true, 0, this.mipmapLevels);
|
Stitcher stitcher = new Stitcher(i, i, true, 0, this.mipmapLevels);
|
||||||
this.mapUploadedSprites.clear();
|
this.mapUploadedSprites.clear();
|
||||||
|
@ -333,7 +335,25 @@ public class TextureMap extends AbstractTexture implements ITickableTextureObjec
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
IResource iresource = resourceManager.getResource(resourcelocation1);
|
boolean isFuckedUp = false;
|
||||||
|
ResourceLocation shit = null;
|
||||||
|
if(resourcelocation1.toString().contains("mcpatcher") || resourcelocation1.toString().contains("optifine")) {
|
||||||
|
if(resourcelocation1.toString().contains("textures/")) {
|
||||||
|
String s = resourcelocation1.toString().replace("textures/", "");
|
||||||
|
shit = new ResourceLocation(s);
|
||||||
|
isFuckedUp = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IResource iresource;
|
||||||
|
if(isFuckedUp) {
|
||||||
|
if(shit != null) { //Just in case
|
||||||
|
iresource = resourceManager.getResource(shit);
|
||||||
|
} else {
|
||||||
|
iresource = resourceManager.getResource(resourcelocation1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
iresource = resourceManager.getResource(resourcelocation1);
|
||||||
|
}
|
||||||
ImageData[] abufferedimage = new ImageData[1 + this.mipmapLevels];
|
ImageData[] abufferedimage = new ImageData[1 + this.mipmapLevels];
|
||||||
abufferedimage[0] = TextureUtil.readBufferedImage(iresource.getInputStream());
|
abufferedimage[0] = TextureUtil.readBufferedImage(iresource.getInputStream());
|
||||||
TextureMetadataSection texturemetadatasection = (TextureMetadataSection) iresource
|
TextureMetadataSection texturemetadatasection = (TextureMetadataSection) iresource
|
||||||
|
|
|
@ -40,7 +40,7 @@ import net.minecraft.util.ResourceLocation;
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractResourcePack implements IResourcePack {
|
public abstract class AbstractResourcePack implements IResourcePack {
|
||||||
private static final Logger resourceLog = LogManager.getLogger();
|
private static final Logger resourceLog = LogManager.getLogger();
|
||||||
protected final String resourcePackFile;
|
public final String resourcePackFile;
|
||||||
|
|
||||||
public AbstractResourcePack(String resourcePackFileIn) {
|
public AbstractResourcePack(String resourcePackFileIn) {
|
||||||
this.resourcePackFile = resourcePackFileIn;
|
this.resourcePackFile = resourcePackFileIn;
|
||||||
|
|
|
@ -21,6 +21,7 @@ import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
import net.PeytonPlayz585.shadow.CustomItems;
|
||||||
import net.lax1dude.eaglercraft.v1_8.IOUtils;
|
import net.lax1dude.eaglercraft.v1_8.IOUtils;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||||
|
@ -390,6 +391,9 @@ public class ModelBakery {
|
||||||
this.variantNames.put(Item.getItemFromBlock(Blocks.oak_fence),
|
this.variantNames.put(Item.getItemFromBlock(Blocks.oak_fence),
|
||||||
Lists.newArrayList(new String[] { "oak_fence" }));
|
Lists.newArrayList(new String[] { "oak_fence" }));
|
||||||
this.variantNames.put(Items.oak_door, Lists.newArrayList(new String[] { "oak_door" }));
|
this.variantNames.put(Items.oak_door, Lists.newArrayList(new String[] { "oak_door" }));
|
||||||
|
|
||||||
|
CustomItems.update();
|
||||||
|
CustomItems.loadModels(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getVariantNames(Item parItem) {
|
private List<String> getVariantNames(Item parItem) {
|
||||||
|
@ -479,6 +483,20 @@ public class ModelBakery {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void loadItemModel(String p_loadItemModel_1_, ResourceLocation p_loadItemModel_2_, ResourceLocation p_loadItemModel_3_) {
|
||||||
|
this.itemLocations.put(p_loadItemModel_1_, p_loadItemModel_2_);
|
||||||
|
|
||||||
|
if (this.models.get(p_loadItemModel_2_) == null) {
|
||||||
|
try {
|
||||||
|
ModelBlock modelblock = this.loadModel(p_loadItemModel_2_);
|
||||||
|
this.models.put(p_loadItemModel_2_, modelblock);
|
||||||
|
} catch (Exception exception) {
|
||||||
|
LOGGER.warn("Unable to load item model: \'{}\' for item: \'{}\'", new Object[] {p_loadItemModel_2_, p_loadItemModel_3_});
|
||||||
|
LOGGER.warn(exception.getClass().getName() + ": " + exception.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Set<ResourceLocation> getVariantsTextureLocations() {
|
private Set<ResourceLocation> getVariantsTextureLocations() {
|
||||||
HashSet hashset = Sets.newHashSet();
|
HashSet hashset = Sets.newHashSet();
|
||||||
|
|
|
@ -38,9 +38,7 @@ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||||
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredConfig;
|
import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredConfig;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.audio.SoundCategory;
|
import net.minecraft.client.audio.SoundCategory;
|
||||||
import net.minecraft.client.gui.GuiButton;
|
|
||||||
import net.minecraft.client.gui.GuiNewChat;
|
import net.minecraft.client.gui.GuiNewChat;
|
||||||
import net.minecraft.client.gui.GuiOptionButton;
|
|
||||||
import net.minecraft.client.gui.GuiScreen;
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.client.renderer.texture.TextureMap;
|
import net.minecraft.client.renderer.texture.TextureMap;
|
||||||
import net.minecraft.client.resources.I18n;
|
import net.minecraft.client.resources.I18n;
|
||||||
|
@ -254,6 +252,7 @@ public class GameSettings {
|
||||||
public boolean ofBetterSnow = false;
|
public boolean ofBetterSnow = false;
|
||||||
public boolean ofCustomFonts = true;
|
public boolean ofCustomFonts = true;
|
||||||
public boolean ofCustomSky = true;
|
public boolean ofCustomSky = true;
|
||||||
|
public boolean ofCustomItems = true;
|
||||||
public int ofDynamicLights = 3;
|
public int ofDynamicLights = 3;
|
||||||
public boolean toggleSprint = false;
|
public boolean toggleSprint = false;
|
||||||
public boolean toggleSprintEnabled = false;
|
public boolean toggleSprintEnabled = false;
|
||||||
|
@ -865,6 +864,11 @@ public class GameSettings {
|
||||||
this.mc.renderGlobal.loadRenderers();
|
this.mc.renderGlobal.loadRenderers();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parOptions == GameSettings.Options.CUSTOM_ITEMS) {
|
||||||
|
this.ofCustomItems = !this.ofCustomItems;
|
||||||
|
this.mc.refreshResources();
|
||||||
|
}
|
||||||
|
|
||||||
this.saveOptions();
|
this.saveOptions();
|
||||||
}
|
}
|
||||||
|
@ -978,6 +982,8 @@ public class GameSettings {
|
||||||
return this.experimentalVisGraph;
|
return this.experimentalVisGraph;
|
||||||
case BUFFER_QUEUE:
|
case BUFFER_QUEUE:
|
||||||
return this.experimentalBufferQueue;
|
return this.experimentalBufferQueue;
|
||||||
|
case CUSTOM_ITEMS:
|
||||||
|
return this.ofCustomItems;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1246,7 +1252,9 @@ public class GameSettings {
|
||||||
return this.experimentalVisGraph ? s + Lang.getOn() : s + Lang.getOff();
|
return this.experimentalVisGraph ? s + Lang.getOn() : s + Lang.getOff();
|
||||||
} else if(parOptions == GameSettings.Options.BUFFER_QUEUE) {
|
} else if(parOptions == GameSettings.Options.BUFFER_QUEUE) {
|
||||||
return this.experimentalBufferQueue ? s + Lang.getOn() : s + Lang.getOff();
|
return this.experimentalBufferQueue ? s + Lang.getOn() : s + Lang.getOff();
|
||||||
} else {
|
} else if (parOptions == GameSettings.Options.CUSTOM_ITEMS) {
|
||||||
|
return this.ofCustomItems ? s + Lang.getOn() : s + Lang.getOff();
|
||||||
|
} else {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1796,6 +1804,10 @@ public class GameSettings {
|
||||||
if(astring[0].equals("bufferQueue") && astring.length >= 2) {
|
if(astring[0].equals("bufferQueue") && astring.length >= 2) {
|
||||||
this.experimentalBufferQueue = Boolean.valueOf(astring[1]).booleanValue();
|
this.experimentalBufferQueue = Boolean.valueOf(astring[1]).booleanValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (astring[0].equals("ofCustomItems") && astring.length >= 2) {
|
||||||
|
this.ofCustomItems = Boolean.valueOf(astring[1]).booleanValue();
|
||||||
|
}
|
||||||
|
|
||||||
Keyboard.setFunctionKeyModifier(keyBindFunction.getKeyCode());
|
Keyboard.setFunctionKeyModifier(keyBindFunction.getKeyCode());
|
||||||
|
|
||||||
|
@ -1970,6 +1982,7 @@ public class GameSettings {
|
||||||
printwriter.println("chunkBorders:" + this.chunkBorders);
|
printwriter.println("chunkBorders:" + this.chunkBorders);
|
||||||
printwriter.println("visGraph:" + this.experimentalVisGraph);
|
printwriter.println("visGraph:" + this.experimentalVisGraph);
|
||||||
printwriter.println("bufferQueue:" + this.experimentalBufferQueue);
|
printwriter.println("bufferQueue:" + this.experimentalBufferQueue);
|
||||||
|
printwriter.println("ofCustomItems:" + this.ofCustomItems);
|
||||||
|
|
||||||
for (KeyBinding keybinding : this.keyBindings) {
|
for (KeyBinding keybinding : this.keyBindings) {
|
||||||
printwriter.println("key_" + keybinding.getKeyDescription() + ":" + keybinding.getKeyCode());
|
printwriter.println("key_" + keybinding.getKeyDescription() + ":" + keybinding.getKeyCode());
|
||||||
|
@ -2173,7 +2186,8 @@ public class GameSettings {
|
||||||
TOGGLE_SPRINT("Sprint", false, false),
|
TOGGLE_SPRINT("Sprint", false, false),
|
||||||
CHUNK_BORDERS("Chunk Borders", false, false),
|
CHUNK_BORDERS("Chunk Borders", false, false),
|
||||||
VIS_GRAPH("Experimental VisGraph", false, false),
|
VIS_GRAPH("Experimental VisGraph", false, false),
|
||||||
BUFFER_QUEUE("Experimental Queuing", false, false);
|
BUFFER_QUEUE("Experimental Queuing", false, false),
|
||||||
|
CUSTOM_ITEMS("Custom Items", false, false);
|
||||||
|
|
||||||
private final boolean enumFloat;
|
private final boolean enumFloat;
|
||||||
private final boolean enumBoolean;
|
private final boolean enumBoolean;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package net.lax1dude.eaglercraft.v1_8.internal;
|
package net.lax1dude.eaglercraft.v1_8.internal;
|
||||||
|
|
||||||
import org.teavm.jso.JSBody;
|
import org.teavm.jso.JSBody;
|
||||||
|
import org.teavm.jso.JSObject;
|
||||||
|
import org.teavm.jso.core.JSNumber;
|
||||||
import org.teavm.jso.webgl.WebGLUniformLocation;
|
import org.teavm.jso.webgl.WebGLUniformLocation;
|
||||||
|
|
||||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.ByteBuffer;
|
import net.lax1dude.eaglercraft.v1_8.internal.buffer.ByteBuffer;
|
||||||
|
@ -592,4 +594,10 @@ public class PlatformOpenGL {
|
||||||
logger.error("##############################");
|
logger.error("##############################");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int _wglGetTexLevelParameteri(int glTexture2d, int i, int glTextureWidth) {
|
||||||
|
JSObject object = ctx.getTexParameter(glTexture2d, glTextureWidth);
|
||||||
|
int parameterValue = ((JSNumber) object).intValue();
|
||||||
|
return parameterValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user