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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
package gregtech.common.render.items;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Aluminium;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Chrome;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Iridium;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Neutronium;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Osmium;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_StainlessSteel;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Steel;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_Titanium;
import static gregtech.api.enums.ItemList.Large_Fluid_Cell_TungstenSteel;
import static gregtech.api.enums.Mods.HodgePodge;
import javax.annotation.Nullable;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.opengl.GL11;
import com.mitchej123.hodgepodge.textures.IPatchedTextureAtlasSprite;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Textures;
import gregtech.api.items.MetaGeneratedItem;
import gregtech.api.util.GTUtility;
import gregtech.common.render.GTRenderUtil;
import gregtech.loaders.ExtraIcons;
public class GeneratedItemRenderer implements IItemRenderer {
@Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) {
return type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON
|| type == ItemRenderType.INVENTORY
|| type == ItemRenderType.ENTITY;
}
@Override
public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
return type == ItemRenderType.ENTITY && helper == ItemRendererHelper.ENTITY_BOBBING
|| (helper == ItemRendererHelper.ENTITY_ROTATION && Minecraft.getMinecraft().gameSettings.fancyGraphics);
}
@Override
public void renderItem(ItemRenderType type, ItemStack aStack, Object... data) {
short aMetaData = (short) aStack.getItemDamage();
if (!(aStack.getItem() instanceof MetaGeneratedItem aItem)) return;
GL11.glEnable(GL11.GL_BLEND);
GL11.glColor3f(1.0F, 1.0F, 1.0F);
IIcon tIcon;
if (aItem.mIconList[(aMetaData - aItem.mOffset)].length > 1) {
Long[] tStats = aItem.mElectricStats.get(aMetaData);
if ((tStats != null) && (tStats[3] < 0L)) {
long tCharge = aItem.getRealCharge(aStack);
if (tCharge <= 0L) {
tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][1];
} else {
if (tCharge >= tStats[0]) {
tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][8];
} else {
tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][(7
- (int) Math.max(0L, Math.min(5L, (tStats[0] - tCharge) * 6L / tStats[0])))];
}
}
} else {
tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][0];
}
} else {
tIcon = aItem.mIconList[(aMetaData - aItem.mOffset)][0];
}
if (tIcon == null) tIcon = Textures.ItemIcons.RENDERING_ERROR.getIcon();
markNeedsAnimationUpdate(tIcon);
ItemList largeFluidCell = getLargeFluidCell(aStack);
if (largeFluidCell != null) {
renderLargeFluidCellExtraParts(type, largeFluidCell, aStack);
}
Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GTRenderUtil.renderItem(type, tIcon);
GL11.glDisable(GL11.GL_BLEND);
}
@Nullable
private static ItemList getLargeFluidCell(ItemStack stack) {
if (isSame(Large_Fluid_Cell_Steel, stack)) return Large_Fluid_Cell_Steel;
if (isSame(Large_Fluid_Cell_Aluminium, stack)) return Large_Fluid_Cell_Aluminium;
if (isSame(Large_Fluid_Cell_TungstenSteel, stack)) return Large_Fluid_Cell_TungstenSteel;
if (isSame(Large_Fluid_Cell_StainlessSteel, stack)) return Large_Fluid_Cell_StainlessSteel;
if (isSame(Large_Fluid_Cell_Titanium, stack)) return Large_Fluid_Cell_Titanium;
if (isSame(Large_Fluid_Cell_Chrome, stack)) return Large_Fluid_Cell_Chrome;
if (isSame(Large_Fluid_Cell_Iridium, stack)) return Large_Fluid_Cell_Iridium;
if (isSame(Large_Fluid_Cell_Osmium, stack)) return Large_Fluid_Cell_Osmium;
if (isSame(Large_Fluid_Cell_Neutronium, stack)) return Large_Fluid_Cell_Neutronium;
return null;
}
private void renderLargeFluidCellExtraParts(IItemRenderer.ItemRenderType type, ItemList item, ItemStack stack) {
IIcon inner = switch (item) {
case Large_Fluid_Cell_Steel -> ExtraIcons.steelLargeCellInner;
case Large_Fluid_Cell_Aluminium -> ExtraIcons.aluminiumLargeCellInner;
case Large_Fluid_Cell_StainlessSteel -> ExtraIcons.stainlesssteelLargeCellInner;
case Large_Fluid_Cell_Titanium -> ExtraIcons.titaniumLargeCellInner;
case Large_Fluid_Cell_TungstenSteel -> ExtraIcons.tungstensteelLargeCellInner;
case Large_Fluid_Cell_Iridium -> ExtraIcons.iridiumLargeCellInner;
case Large_Fluid_Cell_Osmium -> ExtraIcons.osmiumLargeCellInner;
case Large_Fluid_Cell_Chrome -> ExtraIcons.chromiumLargeCellInner;
case Large_Fluid_Cell_Neutronium -> ExtraIcons.neutroniumLargeCellInner;
default -> Textures.ItemIcons.RENDERING_ERROR.getIcon();
};
// Empty inner side
Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture);
markNeedsAnimationUpdate(inner);
GTRenderUtil.renderItem(type, inner);
FluidStack fluidStack = GTUtility.getFluidForFilledItem(stack, true);
if (fluidStack != null && fluidStack.getFluid() != null) {
IIcon fluidIcon = fluidStack.getFluid()
.getIcon(fluidStack);
if (fluidIcon == null) {
fluidIcon = Textures.ItemIcons.RENDERING_ERROR.getIcon();
}
int fluidColor = fluidStack.getFluid()
.getColor(fluidStack);
Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);
markNeedsAnimationUpdate(fluidIcon);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glDepthFunc(GL11.GL_EQUAL);
GL11.glColor3ub((byte) (fluidColor >> 16), (byte) (fluidColor >> 8), (byte) fluidColor);
GTRenderUtil.renderItem(type, fluidIcon);
GL11.glColor3ub((byte) -1, (byte) -1, (byte) -1);
GL11.glDepthFunc(GL11.GL_LEQUAL);
}
}
private static boolean isSame(ItemList item, ItemStack stack) {
ItemStack internal = item.getInternalStack_unsafe();
if (GTUtility.isStackInvalid(internal)) return false;
return internal.getItem() == stack.getItem() && internal.getItemDamage() == stack.getItemDamage();
}
protected void markNeedsAnimationUpdate(IIcon icon) {
if (HodgePodge.isModLoaded() && icon instanceof IPatchedTextureAtlasSprite) {
((IPatchedTextureAtlasSprite) icon).markNeedsAnimationUpdate();
}
}
}
|