1515import github .kasuminova .novaeng .client .handler .BlockAngelRendererHandler ;
1616import github .kasuminova .novaeng .client .handler .ClientEventHandler ;
1717import github .kasuminova .novaeng .client .handler .HyperNetClientEventHandler ;
18+ import github .kasuminova .novaeng .client .model .raw_ore .RawOreModelLoader ;
1819import github .kasuminova .novaeng .client .util .ExJEI ;
1920import github .kasuminova .novaeng .client .util .TitleUtils ;
2021import github .kasuminova .novaeng .common .CommonProxy ;
2122import github .kasuminova .novaeng .common .command .CommandPacketProfiler ;
2223import github .kasuminova .novaeng .common .command .ExportResearchDataToJson ;
2324import github .kasuminova .novaeng .common .config .NovaEngCoreConfig ;
25+ import github .kasuminova .novaeng .common .item .ItemRawOre ;
2426import github .kasuminova .novaeng .common .registry .RegistryBlocks ;
2527import github .kasuminova .novaeng .common .registry .RegistryItems ;
2628import github .kasuminova .novaeng .common .tile .TileHyperNetTerminal ;
3234import github .kasuminova .novaeng .common .tile .machine .GeocentricDrillController ;
3335import github .kasuminova .novaeng .common .tile .machine .SingularityCore ;
3436import hellfirepvp .modularmachinery .common .base .Mods ;
37+ import it .unimi .dsi .fastutil .ints .IntArrayList ;
38+ import it .unimi .dsi .fastutil .ints .IntList ;
39+ import it .unimi .dsi .fastutil .objects .Object2IntMap ;
40+ import it .unimi .dsi .fastutil .objects .Object2IntOpenHashMap ;
41+ import it .unimi .dsi .fastutil .objects .ObjectArrayList ;
42+ import net .minecraft .block .Block ;
43+ import net .minecraft .block .state .IBlockState ;
44+ import net .minecraft .client .Minecraft ;
45+ import net .minecraft .client .renderer .block .model .BakedQuad ;
46+ import net .minecraft .client .renderer .color .BlockColors ;
47+ import net .minecraft .client .renderer .color .ItemColors ;
48+ import net .minecraft .client .renderer .texture .TextureAtlasSprite ;
3549import net .minecraft .entity .player .EntityPlayer ;
50+ import net .minecraft .item .Item ;
51+ import net .minecraft .item .ItemBlock ;
52+ import net .minecraft .item .ItemStack ;
3653import net .minecraft .tileentity .TileEntity ;
54+ import net .minecraft .util .EnumFacing ;
3755import net .minecraft .util .math .BlockPos ;
3856import net .minecraft .util .math .MathHelper ;
3957import net .minecraft .world .World ;
4058import net .minecraftforge .client .ClientCommandHandler ;
4159import net .minecraftforge .client .event .ModelRegistryEvent ;
60+ import net .minecraftforge .client .model .ModelLoaderRegistry ;
61+ import net .minecraftforge .client .resource .VanillaResourceType ;
4262import net .minecraftforge .common .MinecraftForge ;
4363import net .minecraftforge .common .config .Config ;
4464import net .minecraftforge .common .config .ConfigManager ;
65+ import net .minecraftforge .fml .client .FMLClientHandler ;
4566import net .minecraftforge .fml .client .registry .ClientRegistry ;
4667import net .minecraftforge .fml .common .Loader ;
4768import net .minecraftforge .fml .common .Mod ;
4869import net .minecraftforge .fml .common .eventhandler .SubscribeEvent ;
4970import net .minecraftforge .fml .relauncher .Side ;
71+ import net .minecraftforge .oredict .OreDictionary ;
5072import slimeknights .tconstruct .library .book .TinkerBook ;
5173
5274import javax .annotation .Nullable ;
75+ import java .awt .Color ;
76+ import java .util .List ;
5377
5478import static github .kasuminova .novaeng .mixin .NovaEngCoreEarlyMixinLoader .checkJavaVersion ;
5579import static github .kasuminova .novaeng .mixin .NovaEngCoreEarlyMixinLoader .isCleanroomLoader ;
5882@ Mod .EventBusSubscriber (Side .CLIENT )
5983public class ClientProxy extends CommonProxy {
6084
85+ public static List <Item > items = new ObjectArrayList <>();
86+ public static List <Block > blocks = new ObjectArrayList <>();
87+ private static final Object2IntMap <String > colorCache = new Object2IntOpenHashMap <>();
88+
89+ static {
90+ colorCache .defaultReturnValue (-1 );
91+ }
92+
93+ public void setColor (String od , int color ) {
94+ colorCache .put (od , color );
95+ }
96+
6197 public ClientProxy () {
6298 MinecraftForge .EVENT_BUS .register (this );
6399 }
64100
65101 @ Override
66- public boolean isClient (){
102+ public boolean isClient () {
67103 return true ;
68104 }
69105
@@ -74,7 +110,7 @@ public void construction() {
74110 ConfigManager .sync (NovaEngineeringCore .MOD_ID , Config .Type .INSTANCE );
75111
76112 if (NovaEngCoreConfig .javaCheck ) {
77- if (!isCleanroomLoader ()){
113+ if (!isCleanroomLoader ()) {
78114 checkJavaVersion ();
79115 }
80116 }
@@ -116,11 +152,34 @@ public void postInit() {
116152
117153 TitleUtils .setRandomTitle ("*PostInit*" );
118154
155+ Minecraft mc = Minecraft .getMinecraft ();
156+ BlockColors blockColors = mc .getBlockColors ();
157+ ItemColors itemColors = mc .getItemColors ();
158+
159+ itemColors .registerItemColorHandler ((stack , i ) -> {
160+ var item = stack .getItem ();
161+ if (item instanceof ItemRawOre r ) {
162+ return getColorForODFirst (r .getPartOD ());
163+ }
164+ if (item instanceof ItemRawOre .BlockRawOre .ItemBLockRawOre r ) {
165+ return getColorForODFirst (r .getPartOD ());
166+ }
167+ return Color .WHITE .getRGB ();
168+ }, items .toArray (new Item [0 ]));
169+
170+ blockColors .registerBlockColorHandler ((state , worldIn , pos , i ) -> {
171+ if (state .getBlock () instanceof ItemRawOre .BlockRawOre blockRawOre ) {
172+ return getColorForODFirst (blockRawOre .getPartOD ());
173+ }
174+ return Color .WHITE .getRGB ();
175+ }, blocks .toArray (new Block [0 ]));
176+
119177 if (Loader .isModLoaded ("ic2" ) && Loader .isModLoaded ("randomtweaker" )) {
120178 ExJEI .jeiRecipeRegister ();
121179 }
122180
123181 TinkerBook .INSTANCE .addTransformer (BookTransformerAppendModifiers .INSTANCE_FALSE );
182+ FMLClientHandler .instance ().refreshResources (VanillaResourceType .TEXTURES , VanillaResourceType .MODELS );
124183 }
125184
126185 @ Override
@@ -134,6 +193,7 @@ public void loadComplete() {
134193 public void onModelRegister (ModelRegistryEvent event ) {
135194 RegistryBlocks .registerBlockModels ();
136195 RegistryItems .registerItemModels ();
196+ ModelLoaderRegistry .registerLoader (new RawOreModelLoader ());
137197 }
138198
139199 @ Nullable
@@ -165,4 +225,47 @@ public Object getClientGuiElement(final int ID, final EntityPlayer player, final
165225 };
166226 }
167227
168- }
228+ public static int getColorForODFirst (String odName ) {
229+ var color = colorCache .getInt (odName );
230+ if (color < 0 ) {
231+ var od = OreDictionary .getOres (odName );
232+ if (!od .isEmpty ()) {
233+ var stack = od .get (0 );
234+ var item = stack .getItem ();
235+ color = getColorForItemStack (od .get (0 )).getRGB ();
236+ } else {
237+ color = Color .WHITE .getRGB ();
238+ }
239+ colorCache .put (odName , color );
240+ }
241+ return color ;
242+ }
243+
244+ public static Color getColorForItemStack (ItemStack stack ) {
245+ try {
246+ TextureAtlasSprite sprite ;
247+ if (stack .getItem () instanceof ItemBlock ) {
248+ Minecraft mc = Minecraft .getMinecraft ();
249+ IBlockState state = ((ItemBlock ) stack .getItem ()).getBlock ().getStateForPlacement (mc .world ,
250+ new BlockPos (0 , 0 , 0 ), EnumFacing .UP , 0 , 0 , 0 , stack .getMetadata (), mc .player );
251+ List <BakedQuad > quads = mc .getBlockRendererDispatcher ().getModelForState (state ).getQuads (state , EnumFacing .NORTH , 0 );
252+ if (quads .isEmpty ()) return Color .WHITE ;
253+ sprite = quads .get (0 ).getSprite ();
254+ } else sprite = Minecraft .getMinecraft ().getRenderItem ().getItemModelWithOverrides (stack , null , null )
255+ .getQuads (null , null , 0 ).get (0 ).getSprite ();
256+ IntList colours = new IntArrayList ();
257+ for (int [] rows : sprite .getFrameTextureData (0 ))
258+ for (int colour : rows ) if ((colour & 0xFF ) > 0 ) colours .add (colour );
259+ long r = 0 , g = 0 , b = 0 ;
260+ for (int colour : colours ) {
261+ r += (colour >> 16 ) & 0xFF ;
262+ g += (colour >> 8 ) & 0xFF ;
263+ b += colour & 0xFF ;
264+ }
265+ return new Color ((int ) r / colours .size (), (int ) g / colours .size (), (int ) b / colours .size (), 255 );
266+ } catch (Exception e ) {
267+ return Color .WHITE ;
268+ }
269+ }
270+
271+ }
0 commit comments