11package gregtech .integration .jei ;
22
33import gregtech .api .gui .GuiTextures ;
4+ import gregtech .api .util .GTLog ;
5+ import gregtech .api .worldgen .config .OreDepositDefinition ;
46import gregtech .api .worldgen .config .WorldGenRegistry ;
57import gregtech .integration .jei .recipe .primitive .PrimitiveRecipeCategory ;
8+ import it .unimi .dsi .fastutil .ints .IntSortedSet ;
69import mezz .jei .api .IGuiHelper ;
710import mezz .jei .api .gui .IDrawable ;
811import mezz .jei .api .gui .IGuiItemStackGroup ;
1114import mezz .jei .api .recipe .IRecipeWrapper ;
1215import net .minecraft .client .Minecraft ;
1316import net .minecraft .client .gui .FontRenderer ;
17+ import net .minecraft .world .DimensionType ;
18+ import net .minecraftforge .common .DimensionManager ;
1419
15- import java .util .Map ;
20+ import java .util .*;
21+ import java .util .function .Supplier ;
22+
23+ import static gregtech .api .GTValues .MODID_AR ;
24+ import static gregtech .api .GTValues .isModLoaded ;
1625
1726public class GTOreCategory extends PrimitiveRecipeCategory <GTOreInfo , GTOreInfo > {
1827
1928 protected final IDrawable slot ;
29+ protected OreDepositDefinition definition ;
2030 protected String veinName ;
2131 protected int minHeight ;
2232 protected int maxHeight ;
2333 protected int outputCount ;
2434 protected int weight ;
25- protected int [] dimensionIDs ;
35+ protected List < Integer > dimensionIDs ;
2636 protected final int FONT_HEIGHT = Minecraft .getMinecraft ().fontRenderer .FONT_HEIGHT ;
27- protected final Map <String , Integer > namedDimensions = WorldGenRegistry .getNamedDimensions ();
37+ protected final Map <Integer , String > namedDimensions = WorldGenRegistry .getNamedDimensions ();
38+ private Map <DimensionType , IntSortedSet > dimMap = DimensionManager .getRegisteredDimensions ();
39+ private Supplier <List <Integer >> dimension = this ::getAllRegisteredDimensions ;
2840 private final int NUM_OF_SLOTS = 5 ;
2941 private final int SLOT_WIDTH = 18 ;
3042 private final int SLOT_HEIGHT = 18 ;
@@ -65,7 +77,7 @@ public void setRecipe(IRecipeLayout recipeLayout, GTOreInfo recipeWrapper, IIngr
6577 maxHeight = recipeWrapper .getMaxHeight ();
6678 outputCount = recipeWrapper .getOutputCount ();
6779 weight = recipeWrapper .getWeight ();
68- dimensionIDs = recipeWrapper .getDimensionIDs ();
80+ definition = recipeWrapper .getDefinition ();
6981 }
7082
7183 @ Override
@@ -86,7 +98,7 @@ public void drawExtras(Minecraft minecraft) {
8698 //Selected Ore
8799 this .slot .draw (minecraft , 22 , baseYPos );
88100 //Surface Identifier
89- this .slot .draw (minecraft , 22 , 73 );
101+ this .slot .draw (minecraft , 22 , SLOT_HEIGHT * ( NUM_OF_SLOTS - 1 ) + 1 );
90102
91103 int yPos = 0 ;
92104 for (int i = 0 ; i < outputCount ; i ++) {
@@ -96,17 +108,20 @@ public void drawExtras(Minecraft minecraft) {
96108 this .slot .draw (minecraft , xPos , yPos );
97109 }
98110
99- baseYPos = yPos ; //has to be set to position of last rendered slot for later use
111+ //base positions set to position of last rendered slot for later use.
112+ //Must account for the fact that yPos is the top corner of the slot, so add in another slot height
113+ baseYPos = yPos + SLOT_HEIGHT ;
100114
101115 drawVeinName (minecraft .fontRenderer );
102116
103117 //Begin Drawing information, depending on how many rows of ore outputs were created
104118 //Give room for 5 lines of 5 ores each, so 25 unique ores in the vein
105- if (baseYPos > 73 ) {
119+ //73 is SLOT_HEIGHT * (NUM_OF_SLOTS - 1) + 1
120+ if (baseYPos >= SLOT_HEIGHT * NUM_OF_SLOTS ) {
106121 minecraft .fontRenderer .drawString ("Spawn Range: " + minHeight + "-" + maxHeight , 70 , baseYPos + 1 , 0x111111 );
107122 }
108123 else {
109- minecraft .fontRenderer .drawString ("Spawn Range: " + minHeight + "-" + maxHeight , 70 , 73 , 0x111111 );
124+ minecraft .fontRenderer .drawString ("Spawn Range: " + minHeight + "-" + maxHeight , 70 , SLOT_HEIGHT * ( NUM_OF_SLOTS - 1 ) + 1 , 0x111111 );
110125 //Update the position at which the spawn information ends
111126 baseYPos = 73 ;
112127 }
@@ -117,27 +132,25 @@ public void drawExtras(Minecraft minecraft) {
117132 //Create the Dimensions
118133 minecraft .fontRenderer .drawString ("Dimensions: " , 70 , baseYPos + (2 * FONT_HEIGHT ), 0x111111 );
119134
135+ dimensionIDs = dimension .get ();
136+
120137 //Will attempt to write dimension IDs in a single line, separated by commas. If the list is so long such that it
121138 //would run off the end of the page, the list is continued on a new line.
122- for (int i = 0 ; i < dimensionIDs .length ; i ++) {
139+ for (int i = 0 ; i < dimensionIDs .size () ; i ++) {
123140
124141 //If the dimension name is included, append it to the dimension number
125- if (namedDimensions .containsValue (dimensionIDs [i ])) {
126- int finalI = i ;
127- dimName = namedDimensions .entrySet ().stream ()
128- .filter (entry -> dimensionIDs [finalI ] == entry .getValue ())
129- .map (Map .Entry ::getKey )
130- .findFirst ().get ();
131- fullDimName = i == dimensionIDs .length - 1 ?
132- dimensionIDs [i ] + " (" + dimName + ")" :
133- dimensionIDs [i ] + " (" + dimName + ")," ;
142+ if (namedDimensions .containsKey (dimensionIDs .get (i ))) {
143+ dimName = namedDimensions .get (dimensionIDs .get (i ));
144+ fullDimName = i == dimensionIDs .size () - 1 ?
145+ dimensionIDs .get (i ) + " (" + dimName + ")" :
146+ dimensionIDs .get (i ) + " (" + dimName + "), " ;
134147 }
135148 //If the dimension name is not included, just add the dimension number
136149 else {
137150
138- fullDimName = i == dimensionIDs .length - 1 ?
139- Integer .toString (dimensionIDs [ i ] ) :
140- dimensionIDs [ i ] + "," ;
151+ fullDimName = i == dimensionIDs .size () - 1 ?
152+ Integer .toString (dimensionIDs . get ( i ) ) :
153+ dimensionIDs . get ( i ) + ", " ;
141154 }
142155
143156 //Find the length of the dimension name string
@@ -157,7 +170,7 @@ public void drawExtras(Minecraft minecraft) {
157170
158171
159172 //Label the Surface Identifier
160- minecraft .fontRenderer .drawSplitString ("SurfaceMaterial" , 15 , 92 , 42 , 0x111111 );
173+ minecraft .fontRenderer .drawSplitString ("SurfaceMaterial" , 15 , 92 , minecraft . fontRenderer . getStringWidth ( "Surface" ) , 0x111111 );
161174
162175 }
163176
@@ -176,4 +189,46 @@ private void drawVeinName(final FontRenderer fontRenderer) {
176189
177190 fontRenderer .drawString (veinNameToDraw , startPosition , 1 , 0x111111 );
178191 }
192+
193+ public List <Integer > getAllRegisteredDimensions () {
194+ List <Integer > dims = new ArrayList <>();
195+ dimMap .values ().stream ()
196+ .flatMap (Collection ::stream )
197+ .mapToInt (Integer ::intValue )
198+ .filter (num -> definition .getDimensionFilter ().test (DimensionManager .createProviderFor (num )))
199+ .forEach (dims ::add );
200+
201+ if (isModLoaded (MODID_AR )) {
202+ try {
203+ int [] plantDims = DimensionManager .getDimensions (DimensionType .byName ("planet" ));
204+ int [] asteroidDims = DimensionManager .getDimensions (DimensionType .byName ("asteroid" ));
205+ int [] spaceDims = DimensionManager .getDimensions (DimensionType .byName ("space" ));
206+
207+ //Add the Planets to the dimension list
208+ Arrays .stream (plantDims )
209+ .filter (num -> !dims .contains (num ))
210+ .filter (num -> definition .getDimensionFilter ().test (DimensionManager .createProviderFor (num )))
211+ .forEach (dims ::add );
212+
213+ //Add the Asteroids to the dimension list
214+ Arrays .stream (asteroidDims )
215+ .filter (num -> !dims .contains (num ))
216+ .filter (num -> definition .getDimensionFilter ().test (DimensionManager .createProviderFor (num )))
217+ .forEach (dims ::add );
218+
219+ //Remove Space from the dimension list
220+ for (int spaceDim : spaceDims ) {
221+ if (dims .contains (spaceDim )) {
222+ dims .remove ((Integer ) spaceDim );
223+ }
224+ }
225+ }
226+ catch (IllegalArgumentException e ) {
227+ GTLog .logger .error ("Something went wrong with AR JEI integration, No DimensionType found" );
228+ GTLog .logger .error (e );
229+ }
230+ }
231+
232+ return dims ;
233+ }
179234}
0 commit comments