aboutsummaryrefslogtreecommitdiff
path: root/src/Java/gtPlusPlus/xmod/gregtech/common/helpers/GT_MethodHelper.java
blob: d51107bbf04f3970d7202ec6282618ab896d1647 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package gtPlusPlus.xmod.gregtech.common.helpers;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import gregtech.api.enums.Textures.BlockIcons;
import gregtech.api.interfaces.ITexture;
import gregtech.api.metatileentity.BaseMetaTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gtPlusPlus.core.util.reflect.ReflectionUtils;
import net.minecraft.block.Block;
import net.minecraft.tileentity.TileEntity;

public class GT_MethodHelper {

	private static final Method mGetTexture;
	private static final Class mITexturedTileEntity;

	static {
		Class clazz = null;
		Method aMeth = null;
		if (ReflectionUtils.doesClassExist("gregtech.api.interfaces.tileentity.ITexturedTileEntity")) {
			clazz = ReflectionUtils.getClass("gregtech.api.interfaces.tileentity.ITexturedTileEntity");
			aMeth = ReflectionUtils.getMethod(clazz, "getTexture", Block.class, byte.class);
		}
		mITexturedTileEntity = clazz;
		mGetTexture = aMeth;
	}


	public static ITexture[] getTexture(TileEntity tTileEntity, Block aBlock, byte aSide) {

		if (mITexturedTileEntity.isInstance(tTileEntity)) {

			if (mGetTexture != null) {
				try {
					mGetTexture.invoke(tTileEntity, aBlock, aSide);
				}
				catch (IllegalAccessException | IllegalArgumentException
						| InvocationTargetException e) {
					e.printStackTrace();
				}
			}
			else {
				if (tTileEntity instanceof BaseMetaTileEntity) {
					try {
						BaseMetaTileEntity aTile = (BaseMetaTileEntity) tTileEntity;					
						ITexture rIcon = aTile.getCoverTexture(aSide);
						Field aFacing = ReflectionUtils.getField(BaseMetaTileEntity.class, "mFacing");
						Field aColor = ReflectionUtils.getField(BaseMetaTileEntity.class, "mColor");
						Field aActive = ReflectionUtils.getField(BaseMetaTileEntity.class, "mActive");
						Field aMetaTile = ReflectionUtils.getField(BaseMetaTileEntity.class, "mMetaTileEntity");
						Method aHasValidTile = ReflectionUtils.getMethod(BaseMetaTileEntity.class, "hasValidMetaTileEntity", new Class[] {});

						boolean hasValidTileObj = (boolean) aHasValidTile.invoke(aTile, new Object[] {});
						boolean aActiveObj = aActive.getBoolean(aTile);
						byte aFacingObj = aFacing.getByte(aTile);
						byte aColorObj = aColor.getByte(aTile);;
						MetaTileEntity aMetaTileObj = (MetaTileEntity) aMetaTile.get(aTile);

						if (rIcon != null) {
							return new ITexture[]{rIcon};
						} else {
							return hasValidTileObj
									? aMetaTileObj.getTexture(aTile, aSide, aFacingObj, (byte) (aColorObj - 1), aActiveObj,
											aTile.getOutputRedstoneSignal(aSide) > 0)
											: BlockIcons.ERROR_RENDERING;
						}
					}
					catch (Throwable t) {
						t.printStackTrace();
					}
				}
			}
		}
		return BlockIcons.ERROR_RENDERING;
	}

}