diff options
Diffstat (limited to 'src/main/java/gregtech/api/util')
-rw-r--r-- | src/main/java/gregtech/api/util/GT_Forestry_Compat.java | 2 | ||||
-rw-r--r-- | src/main/java/gregtech/api/util/GT_LanguageManager.java | 204 | ||||
-rw-r--r-- | src/main/java/gregtech/api/util/GT_Recipe.java | 48 | ||||
-rw-r--r-- | src/main/java/gregtech/api/util/GT_RecipeRegistrator.java | 161 | ||||
-rw-r--r-- | src/main/java/gregtech/api/util/GT_Utility.java | 24 |
5 files changed, 339 insertions, 100 deletions
diff --git a/src/main/java/gregtech/api/util/GT_Forestry_Compat.java b/src/main/java/gregtech/api/util/GT_Forestry_Compat.java index 6e73c099cb..1edfd836f3 100644 --- a/src/main/java/gregtech/api/util/GT_Forestry_Compat.java +++ b/src/main/java/gregtech/api/util/GT_Forestry_Compat.java @@ -137,6 +137,8 @@ public class GT_Forestry_Compat { } GT_Recipe.GT_Recipe_Map.sCentrifugeRecipes.addRecipe( true, new ItemStack[] {tRecipe.getInput()}, tOutputs, null, tChances, null, null, 128, 5, 0); + GT_Recipe.GT_Recipe_Map.sMultiblockCentrifugeRecipes.addRecipe( + true, new ItemStack[] {tRecipe.getInput()}, tOutputs, null, tChances, null, null, 128, 5, 0); } } catch (Throwable e) { if (GT_Values.D1) { diff --git a/src/main/java/gregtech/api/util/GT_LanguageManager.java b/src/main/java/gregtech/api/util/GT_LanguageManager.java index 50d0deeee7..4518ec1bcf 100644 --- a/src/main/java/gregtech/api/util/GT_LanguageManager.java +++ b/src/main/java/gregtech/api/util/GT_LanguageManager.java @@ -156,9 +156,9 @@ public class GT_LanguageManager { public static void writePlaceholderStrings() { addStringLocalization("Interaction_DESCRIPTION_Index_001", "Puts out into adjacent Slot #"); addStringLocalization("Interaction_DESCRIPTION_Index_002", "Grabs in for own Slot #"); - addStringLocalization("Interaction_DESCRIPTION_Index_003", "Normal"); - addStringLocalization("Interaction_DESCRIPTION_Index_004", "Inverted"); - addStringLocalization("Interaction_DESCRIPTION_Index_005", "No Work at all"); + addStringLocalization("Interaction_DESCRIPTION_Index_003", "Enable with Signal"); + addStringLocalization("Interaction_DESCRIPTION_Index_004", "Disable with Signal"); + addStringLocalization("Interaction_DESCRIPTION_Index_005", "Disabled"); addStringLocalization("Interaction_DESCRIPTION_Index_006", "Export"); addStringLocalization("Interaction_DESCRIPTION_Index_007", "Import"); addStringLocalization("Interaction_DESCRIPTION_Index_008", "Export (conditional)"); @@ -181,9 +181,6 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_025", "Keep Liquids Away"); addStringLocalization("Interaction_DESCRIPTION_Index_026", "Keep Liquids Away (conditional)"); addStringLocalization("Interaction_DESCRIPTION_Index_027", "Keep Liquids Away (invert cond)"); - addStringLocalization("Interaction_DESCRIPTION_Index_028", "Allow"); - addStringLocalization("Interaction_DESCRIPTION_Index_029", "Allow (conditional)"); - addStringLocalization("Interaction_DESCRIPTION_Index_030", "Disallow (conditional)"); addStringLocalization("Interaction_DESCRIPTION_Index_031", "Normal Universal Storage"); addStringLocalization("Interaction_DESCRIPTION_Index_032", "Inverted Universal Storage"); addStringLocalization("Interaction_DESCRIPTION_Index_033", "Normal Electricity Storage"); @@ -196,16 +193,14 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_040", "Inverted Average Electric Output"); addStringLocalization("Interaction_DESCRIPTION_Index_041", "Normal Electricity Storage(Including Batteries)"); addStringLocalization("Interaction_DESCRIPTION_Index_042", "Inverted Electricity Storage(Including Batteries)"); - addStringLocalization("Interaction_DESCRIPTION_Index_043", "Allow input, no output"); - addStringLocalization("Interaction_DESCRIPTION_Index_044", "Deny input, no output"); - addStringLocalization("Interaction_DESCRIPTION_Index_045", "Allow input, permit any output"); - addStringLocalization("Interaction_DESCRIPTION_Index_046", "Deny input, permit any output"); + addStringLocalization("Interaction_DESCRIPTION_Index_043", "Filter input, Deny output"); + addStringLocalization("Interaction_DESCRIPTION_Index_044", "Invert input, Deny output"); + addStringLocalization("Interaction_DESCRIPTION_Index_045", "Filter input, Permit any output"); + addStringLocalization("Interaction_DESCRIPTION_Index_046", "Invert input, Permit any output"); addStringLocalization("Interaction_DESCRIPTION_Index_047", "Filter Fluid: "); addStringLocalization("Interaction_DESCRIPTION_Index_048", "Pump speed: "); addStringLocalization("Interaction_DESCRIPTION_Index_049", "L/tick "); addStringLocalization("Interaction_DESCRIPTION_Index_050", "L/sec"); - addStringLocalization("Interaction_DESCRIPTION_Index_051", "Normal"); - addStringLocalization("Interaction_DESCRIPTION_Index_052", "Inverted"); addStringLocalization("Interaction_DESCRIPTION_Index_053", "Slot: "); addStringLocalization("Interaction_DESCRIPTION_Index_054", "Inverted"); addStringLocalization("Interaction_DESCRIPTION_Index_055", "Normal"); @@ -219,10 +214,14 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_063", "Emit if 4 Maintenance Needed(inverted)"); addStringLocalization("Interaction_DESCRIPTION_Index_064", "Emit if 5 Maintenance Needed"); addStringLocalization("Interaction_DESCRIPTION_Index_065", "Emit if 5 Maintenance Needed(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_066", "Emit if rotor needs maintenance"); - addStringLocalization("Interaction_DESCRIPTION_Index_067", "Emit if rotor needs maintenance(inverted)"); - addStringLocalization("Interaction_DESCRIPTION_Index_068", "Emit if any Player is close"); - addStringLocalization("Interaction_DESCRIPTION_Index_069", "Emit if other player is close"); + addStringLocalization("Interaction_DESCRIPTION_Index_066", "Emit if rotor needs maintenance low accuracy mod"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_067", "Emit if rotor needs maintenance low accuracy mod(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_068", "Emit if rotor needs maintenance high accuracy mod"); + addStringLocalization("Interaction_DESCRIPTION_Index_068.1", "Emit if any Player is close"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_069", "Emit if rotor needs maintenance high accuracy mod(inverted)"); + addStringLocalization("Interaction_DESCRIPTION_Index_069.1", "Emit if other Player is close"); addStringLocalization("Interaction_DESCRIPTION_Index_070", "Emit if you are close"); addStringLocalization("Interaction_DESCRIPTION_Index_071", "Conducts strongest Input"); addStringLocalization("Interaction_DESCRIPTION_Index_072", "Conducts from bottom Input"); @@ -250,10 +249,9 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_094", "Weak"); addStringLocalization("Interaction_DESCRIPTION_Index_095", "Input from Output Side allowed"); addStringLocalization("Interaction_DESCRIPTION_Index_096", "Input from Output Side forbidden"); - addStringLocalization("Interaction_DESCRIPTION_Index_097", "It's dangerous to go alone! Take this."); addStringLocalization("Interaction_DESCRIPTION_Index_098", "Do not regulate Item Stack Size"); addStringLocalization("Interaction_DESCRIPTION_Index_099", "Regulate Item Stack Size to: "); - addStringLocalization("Interaction_DESCRIPTION_Index_100", "This is "); // Spartaaaaaaa!!! + addStringLocalization("Interaction_DESCRIPTION_Index_100", "This is "); addStringLocalization("Interaction_DESCRIPTION_Index_101", " Ore."); addStringLocalization("Interaction_DESCRIPTION_Index_102", "There is Lava behind this Rock."); addStringLocalization("Interaction_DESCRIPTION_Index_103", "There is a Liquid behind this Rock."); @@ -261,13 +259,13 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_105", "Material is changing behind this Rock."); addStringLocalization("Interaction_DESCRIPTION_Index_106", "Found traces of "); addStringLocalization("Interaction_DESCRIPTION_Index_107", "No Ores found."); - addStringLocalization("Interaction_DESCRIPTION_Index_108", "Outputs Liquids, Steam and Items"); + addStringLocalization("Interaction_DESCRIPTION_Index_108", "Outputs misc. Fluids, Steam and Items"); addStringLocalization("Interaction_DESCRIPTION_Index_109", "Outputs Steam and Items"); - addStringLocalization("Interaction_DESCRIPTION_Index_110", "Outputs Steam and Liquids"); + addStringLocalization("Interaction_DESCRIPTION_Index_110", "Outputs Steam and misc. Fluids"); addStringLocalization("Interaction_DESCRIPTION_Index_111", "Outputs Steam"); - addStringLocalization("Interaction_DESCRIPTION_Index_112", "Outputs Liquids and Items"); + addStringLocalization("Interaction_DESCRIPTION_Index_112", "Outputs misc. Fluids and Items"); addStringLocalization("Interaction_DESCRIPTION_Index_113", "Outputs only Items"); - addStringLocalization("Interaction_DESCRIPTION_Index_114", "Outputs only Liquids"); + addStringLocalization("Interaction_DESCRIPTION_Index_114", "Outputs only misc. Fluids"); addStringLocalization("Interaction_DESCRIPTION_Index_115", "Outputs nothing"); addStringLocalization("Interaction_DESCRIPTION_Index_116", "Emit Energy to Outputside"); addStringLocalization("Interaction_DESCRIPTION_Index_117", "Don't emit Energy"); @@ -278,13 +276,19 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_122", "Emit Redstone if slots contain something"); addStringLocalization("Interaction_DESCRIPTION_Index_123", "Don't emit Redstone"); addStringLocalization("Interaction_DESCRIPTION_Index_124", "Invert Filter"); + addStringLocalization("Interaction_DESCRIPTION_Index_124.1", "Blacklist Mode"); addStringLocalization("Interaction_DESCRIPTION_Index_125", "Don't invert Filter"); + addStringLocalization("Interaction_DESCRIPTION_Index_125.1", "Whitelist Mode"); addStringLocalization("Interaction_DESCRIPTION_Index_126", "Ignore NBT"); addStringLocalization("Interaction_DESCRIPTION_Index_127", "NBT has to match"); - addStringLocalization("Interaction_DESCRIPTION_Index_128", "Redstone "); - addStringLocalization("Interaction_DESCRIPTION_Index_129", "Energy "); - addStringLocalization("Interaction_DESCRIPTION_Index_130", "Fluids "); - addStringLocalization("Interaction_DESCRIPTION_Index_131", "Items "); + addStringLocalization("Interaction_DESCRIPTION_Index_128", "Redstone"); + addStringLocalization("Interaction_DESCRIPTION_Index_128.1", "Redstone "); + addStringLocalization("Interaction_DESCRIPTION_Index_129", "Energy"); + addStringLocalization("Interaction_DESCRIPTION_Index_129.1", "Energy "); + addStringLocalization("Interaction_DESCRIPTION_Index_130", "Fluids"); + addStringLocalization("Interaction_DESCRIPTION_Index_130.1", "Fluids "); + addStringLocalization("Interaction_DESCRIPTION_Index_131", "Items"); + addStringLocalization("Interaction_DESCRIPTION_Index_131.1", "Items "); addStringLocalization("Interaction_DESCRIPTION_Index_132", "Pipe is loose."); addStringLocalization("Interaction_DESCRIPTION_Index_133", "Screws are loose."); addStringLocalization("Interaction_DESCRIPTION_Index_134", "Something is stuck."); @@ -292,7 +296,7 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_136", "Circuitry burned out."); addStringLocalization("Interaction_DESCRIPTION_Index_137", "That doesn't belong there."); addStringLocalization("Interaction_DESCRIPTION_Index_138", "Incomplete Structure."); - addStringLocalization("Interaction_DESCRIPTION_Index_139", "Hit with Soft Hammer"); + addStringLocalization("Interaction_DESCRIPTION_Index_139", "Hit with Soft Mallet"); addStringLocalization("Interaction_DESCRIPTION_Index_140", "to (re-)start the Machine"); addStringLocalization("Interaction_DESCRIPTION_Index_141", "if it doesn't start."); addStringLocalization("Interaction_DESCRIPTION_Index_142", "Running perfectly."); @@ -300,12 +304,16 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_144", "Missing Turbine Rotor"); addStringLocalization("Interaction_DESCRIPTION_Index_145", "Step Down, In: "); addStringLocalization("Interaction_DESCRIPTION_Index_146", "Step Up, In: "); - addStringLocalization("Interaction_DESCRIPTION_Index_147", "Amp, Out: "); - addStringLocalization("Interaction_DESCRIPTION_Index_148", " V at "); - addStringLocalization("Interaction_DESCRIPTION_Index_149", " Amp"); + addStringLocalization("Interaction_DESCRIPTION_Index_147", "A, Out: "); + addStringLocalization("Interaction_DESCRIPTION_Index_148", "V "); + addStringLocalization("Interaction_DESCRIPTION_Index_149", "A"); addStringLocalization("Interaction_DESCRIPTION_Index_150", "Chance: "); addStringLocalization("Interaction_DESCRIPTION_Index_151", "Does not get consumed in the process"); + addStringLocalization("Interaction_DESCRIPTION_Index_151.1", "Outputs items and 1 specific Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_151.2", "Outputs 1 specific Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_151.4", "Successfully locked Fluid to %s"); addStringLocalization("Interaction_DESCRIPTION_Index_152", "Total: "); + addStringLocalization("Interaction_DESCRIPTION_Index_152.1", "Max EU: "); addStringLocalization("Interaction_DESCRIPTION_Index_153", "Usage: "); addStringLocalization("Interaction_DESCRIPTION_Index_154", "Voltage: "); addStringLocalization("Interaction_DESCRIPTION_Index_155", "Amperage: "); @@ -314,16 +322,17 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_158", "Time: "); addStringLocalization("Interaction_DESCRIPTION_Index_159", "Needs Low Gravity"); addStringLocalization("Interaction_DESCRIPTION_Index_160", "Needs Cleanroom"); + addStringLocalization("Interaction_DESCRIPTION_Index_160.1", "Needs Cleanroom & LowGrav"); addStringLocalization("Interaction_DESCRIPTION_Index_161", " secs"); addStringLocalization("Interaction_DESCRIPTION_Index_162", "Name: "); - addStringLocalization("Interaction_DESCRIPTION_Index_163", " MetaData: "); + addStringLocalization("Interaction_DESCRIPTION_Index_163", " MetaData: "); addStringLocalization("Interaction_DESCRIPTION_Index_164", "Hardness: "); - addStringLocalization("Interaction_DESCRIPTION_Index_165", " Blast Resistance: "); + addStringLocalization("Interaction_DESCRIPTION_Index_165", " Blast Resistance: "); addStringLocalization("Interaction_DESCRIPTION_Index_166", "Is valid Beacon Pyramid Material"); addStringLocalization("Interaction_DESCRIPTION_Index_167", "Tank "); addStringLocalization("Interaction_DESCRIPTION_Index_168", "Heat: "); - addStringLocalization("Interaction_DESCRIPTION_Index_169", " HEM: "); - addStringLocalization("Interaction_DESCRIPTION_Index_170", " Base EU Output: "); + addStringLocalization("Interaction_DESCRIPTION_Index_169", "HEM: "); + addStringLocalization("Interaction_DESCRIPTION_Index_170", " Base EU Output: "); addStringLocalization("Interaction_DESCRIPTION_Index_171", "Facing: "); addStringLocalization("Interaction_DESCRIPTION_Index_172", " / Chance: "); addStringLocalization("Interaction_DESCRIPTION_Index_173", "You can remove this with a Wrench"); @@ -331,14 +340,12 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_175", "Conduction Loss: "); addStringLocalization("Interaction_DESCRIPTION_Index_176", "Contained Energy: "); addStringLocalization("Interaction_DESCRIPTION_Index_177", "Has Muffler Upgrade"); - addStringLocalization("Interaction_DESCRIPTION_Index_178", "Progress: "); + addStringLocalization("Interaction_DESCRIPTION_Index_178", "Progress/Load: "); addStringLocalization("Interaction_DESCRIPTION_Index_179", "Max IN: "); - addStringLocalization("Interaction_DESCRIPTION_Index_180", " EU"); addStringLocalization("Interaction_DESCRIPTION_Index_181", "Max OUT: "); addStringLocalization("Interaction_DESCRIPTION_Index_182", " EU at "); - addStringLocalization("Interaction_DESCRIPTION_Index_183", " Amperes"); + addStringLocalization("Interaction_DESCRIPTION_Index_183", " A"); addStringLocalization("Interaction_DESCRIPTION_Index_184", "Energy: "); - addStringLocalization("Interaction_DESCRIPTION_Index_185", "EU"); addStringLocalization("Interaction_DESCRIPTION_Index_186", "Owned by: "); addStringLocalization("Interaction_DESCRIPTION_Index_187", "Type -- Crop-Name: "); addStringLocalization("Interaction_DESCRIPTION_Index_188", " Growth: "); @@ -353,38 +360,131 @@ public class GT_LanguageManager { addStringLocalization("Interaction_DESCRIPTION_Index_197", " Air-Quality: "); addStringLocalization("Interaction_DESCRIPTION_Index_198", "Attributes:"); addStringLocalization("Interaction_DESCRIPTION_Index_199", "Discovered by: "); - addStringLocalization("Interaction_DESCRIPTION_Index_200", " L"); + addStringLocalization("Interaction_DESCRIPTION_Index_200", "Sort mode: "); + addStringLocalization("Interaction_DESCRIPTION_Index_200.1", "Automatic Item Shuffling: "); addStringLocalization("Interaction_DESCRIPTION_Index_201", "Nothing"); addStringLocalization("Interaction_DESCRIPTION_Index_202", "Pollution in Chunk: "); addStringLocalization("Interaction_DESCRIPTION_Index_203", " gibbl"); addStringLocalization("Interaction_DESCRIPTION_Index_204", "No Pollution in Chunk! HAYO!"); - addStringLocalization("Interaction_DESCRIPTION_Index_205", " of "); addStringLocalization("Interaction_DESCRIPTION_Index_206", "Scan for Assembly Line"); - // addStringLocalization("Interaction_DESCRIPTION_Index_207", "Grab"); - // addStringLocalization("Interaction_DESCRIPTION_Index_208", "Grab"); - // addStringLocalization("Interaction_DESCRIPTION_Index_209", "Grab"); - // addStringLocalization("Interaction_DESCRIPTION_Index_210", "Grab"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_207", "Pump speed: %dL every %d ticks, %.2f L/sec on average"); + addStringLocalization("Interaction_DESCRIPTION_Index_208", " L"); + addStringLocalization("Interaction_DESCRIPTION_Index_209", " ticks"); + addStringLocalization("Interaction_DESCRIPTION_Index_210", "Average: %.2f L/sec"); addStringLocalization("Interaction_DESCRIPTION_Index_211", "Items per side: "); addStringLocalization("Interaction_DESCRIPTION_Index_212", "Input enabled"); addStringLocalization("Interaction_DESCRIPTION_Index_213", "Input disabled"); addStringLocalization("Interaction_DESCRIPTION_Index_214", "Connected"); addStringLocalization("Interaction_DESCRIPTION_Index_215", "Disconnected"); addStringLocalization("Interaction_DESCRIPTION_Index_216", "Deprecated Recipe"); - addStringLocalization( - "Interaction_DESCRIPTION_Index_217", - "Stocking mode. Keeps this many items in destination input slots. This mode can be server unfriendly."); - addStringLocalization( - "Interaction_DESCRIPTION_Index_218", - "Transfer size mode. Add exactly this many items in destination input slots as long as there is room."); - addStringLocalization("Interaction_DESCRIPTION_Index_219", "Extended Facing:"); + addStringLocalization("Interaction_DESCRIPTION_Index_219", "Extended Facing: "); addStringLocalization("Interaction_DESCRIPTION_Index_220", "Single recipe locking disabled."); addStringLocalization("Interaction_DESCRIPTION_Index_221", "Item threshold"); addStringLocalization("Interaction_DESCRIPTION_Index_222", "Fluid threshold"); + addStringLocalization("Interaction_DESCRIPTION_Index_222.1", "Energy threshold"); addStringLocalization( "Interaction_DESCRIPTION_Index_223", "Single recipe locking enabled. Will lock to next recipe."); - addStringLocalization("Interaction_DESCRIPTION_Index_224", " ticks"); + addStringLocalization("Interaction_DESCRIPTION_Index_224", "Always On"); + addStringLocalization("Interaction_DESCRIPTION_Index_225", "Active with Redstone Signal"); + addStringLocalization("Interaction_DESCRIPTION_Index_226", "Inactive with Redstone Signal"); + addStringLocalization("Interaction_DESCRIPTION_Index_227", "Allow Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_228", "Block Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_229", "Import/Export"); + addStringLocalization("Interaction_DESCRIPTION_Index_230", "Conditional"); + addStringLocalization("Interaction_DESCRIPTION_Index_231", "Enable Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_232", "Filter Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_233", "Filter Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_234", "Block Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_235", "Allow Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_236", "Whitelist Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_237", "Blacklist Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_238", "Filter Direction"); + addStringLocalization("Interaction_DESCRIPTION_Index_239", "Filter Type"); + addStringLocalization("Interaction_DESCRIPTION_Index_240", "Block Flow"); + addStringLocalization("Interaction_DESCRIPTION_Index_241", "Recipe progress"); + addStringLocalization("Interaction_DESCRIPTION_Index_242", "Machine idle"); + addStringLocalization("Interaction_DESCRIPTION_Index_243", "Enable with Redstone"); + addStringLocalization("Interaction_DESCRIPTION_Index_244", "Disable with Redstone"); + addStringLocalization("Interaction_DESCRIPTION_Index_245", "Disable machine"); + addStringLocalization("Interaction_DESCRIPTION_Index_246", "Frequency"); + addStringLocalization("Interaction_DESCRIPTION_Index_247", "1 Issue"); + addStringLocalization("Interaction_DESCRIPTION_Index_248", "2 Issues"); + addStringLocalization("Interaction_DESCRIPTION_Index_249", "3 Issues"); + addStringLocalization("Interaction_DESCRIPTION_Index_250", "4 Issues"); + addStringLocalization("Interaction_DESCRIPTION_Index_251", "5 Issues"); + addStringLocalization("Interaction_DESCRIPTION_Index_252", "Rotor < 80%"); + addStringLocalization("Interaction_DESCRIPTION_Index_253", "Rotor < 100%"); + addStringLocalization("Interaction_DESCRIPTION_Index_254", "Detect slot#"); + addStringLocalization("Interaction_DESCRIPTION_Index_254.1", "Internal slot#"); + addStringLocalization("Interaction_DESCRIPTION_Index_255", "Adjacent slot#"); + addStringLocalization("Interaction_DESCRIPTION_Index_256", "Universal Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_257", "Electricity Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_258", "Steam Storage"); + addStringLocalization("Interaction_DESCRIPTION_Index_259", "Average Electric Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_260", "Average Electric Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_261", "Electricity Storage(Including Batteries)"); + addStringLocalization("Interaction_DESCRIPTION_Index_262", "Fluid Auto Output Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_263", "Fluid Auto Output Enabled"); + addStringLocalization( + "Interaction_DESCRIPTION_Index_264", "currently none, will be locked to the next that is put in"); + addStringLocalization("Interaction_DESCRIPTION_Index_265", "1 specific Fluid"); + addStringLocalization("Interaction_DESCRIPTION_Index_266", "Lock Fluid Mode Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_267", "Overflow Voiding Mode Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_268", "Overflow Voiding Mode Enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_269", "Void Full Mode Disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_270", "Void Full Mode Enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_271", "unspecified"); + addStringLocalization("Interaction_DESCRIPTION_Index_272", "Recipe by: "); + addStringLocalization("Interaction_DESCRIPTION_Index_273", "Original Recipe by: "); + addStringLocalization("Interaction_DESCRIPTION_Index_274", "Modified by: "); + addStringLocalization("Interaction_DESCRIPTION_Index_275", "Original voltage: "); + addStringLocalization("Interaction_DESCRIPTION_Index_299", "Item Filter: "); + addStringLocalization("Interaction_DESCRIPTION_Index_300", "Filter Cleared!"); + addStringLocalization("Interaction_DESCRIPTION_Index_300.1", "Fluid Lock Cleared."); + addStringLocalization("Interaction_DESCRIPTION_Index_301", "Universal"); + addStringLocalization("Interaction_DESCRIPTION_Index_302", "Int. EU"); + addStringLocalization("Interaction_DESCRIPTION_Index_303", "Steam"); + addStringLocalization("Interaction_DESCRIPTION_Index_304", "Avg. Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_305", "Avg. Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_306", "EU stored"); + addStringLocalization("Interaction_DESCRIPTION_Index_307", "Deny input, Filter output"); + addStringLocalization("Interaction_DESCRIPTION_Index_308", "Deny input, Invert output"); + addStringLocalization("Interaction_DESCRIPTION_Index_309", "Permit any input, Filter output"); + addStringLocalization("Interaction_DESCRIPTION_Index_310", "Permit any input, Invert output"); + addStringLocalization("Interaction_DESCRIPTION_Index_311", "Block Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_312", "Allow Output"); + addStringLocalization("Interaction_DESCRIPTION_Index_313", "Block Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_314", "Allow Input"); + addStringLocalization("Interaction_DESCRIPTION_Index_315", "Filter Empty"); + addStringLocalization("Interaction_DESCRIPTION_Index_316", "Pump speed limit reached!"); + addStringLocalization("Interaction_DESCRIPTION_Index_317", "Filter: "); + addStringLocalization("Interaction_DESCRIPTION_Index_318", "Check Mode"); + addStringLocalization("Interaction_DESCRIPTION_Index_319", "Any player"); + addStringLocalization("Interaction_DESCRIPTION_Index_320", "Other players"); + addStringLocalization("Interaction_DESCRIPTION_Index_321", "Only owner"); + addStringLocalization("Interaction_DESCRIPTION_Index_322", "Overflow point: "); + addStringLocalization("Interaction_DESCRIPTION_Index_323", "L"); + addStringLocalization("Interaction_DESCRIPTION_Index_324", "Now"); + addStringLocalization("Interaction_DESCRIPTION_Index_325", "Max"); + addStringLocalization("Interaction_DESCRIPTION_Index_326", "Public"); + addStringLocalization("Interaction_DESCRIPTION_Index_327", "Private"); + addStringLocalization("Interaction_DESCRIPTION_Index_328", "Channel"); + addStringLocalization("Interaction_DESCRIPTION_Index_329", "Public/Private"); addStringLocalization("Interaction_DESCRIPTION_Index_500", "Fitting: Loose - More Flow"); addStringLocalization("Interaction_DESCRIPTION_Index_501", "Fitting: Tight - More Efficiency"); + addStringLocalization("Interaction_DESCRIPTION_Index_502", "Mining chunk loading enabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_503", "Mining chunk loading disabled"); + addStringLocalization("Interaction_DESCRIPTION_Index_505", "Enable with Signal (Safe)"); + addStringLocalization("Interaction_DESCRIPTION_Index_506", "Disable with Signal (Safe)"); + addStringLocalization("Interaction_DESCRIPTION_Index_507", "Safe Mode"); + addStringLocalization("Interaction_DESCRIPTION_Index_601", "Use Private Frequency"); + addStringLocalization("Interaction_DESCRIPTION_Index_756", "Connectable: "); + addStringLocalization("Interaction_DESCRIPTION_Index_ALL", "All"); + addStringLocalization("Interaction_DESCRIPTION_Index_ANY", "Any"); + addStringLocalization("Interaction_DESCRIPTION_Index_INVERTED", "Inverted"); + addStringLocalization("Interaction_DESCRIPTION_Index_NORMAL", "Normal"); + addStringLocalization("Interaction_DESCRIPTION_Index_SIDE", "Side: "); addStringLocalization("Item_DESCRIPTION_Index_000", "Stored Heat: %s"); addStringLocalization("Item_DESCRIPTION_Index_001", "Durability: %s/%s"); diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java index 1ab29c067b..26cff0b262 100644 --- a/src/main/java/gregtech/api/util/GT_Recipe.java +++ b/src/main/java/gregtech/api/util/GT_Recipe.java @@ -2142,6 +2142,54 @@ public class GT_Recipe implements Comparable<GT_Recipe> { " EU", true, true); + public static final GT_Recipe_Map sMultiblockElectrolyzerRecipes = new GT_Recipe_Map( + new HashSet<>(300), + "gt.recipe.largeelectrolyzer", + "Large(PA) Electrolyzer", + null, + RES_PATH_GUI + "basicmachines/LCRNEI", + 1, + 9, + 0, + 0, + 1, + "", + 0, + "", + true, + false); + public static final GT_Recipe_Map sMultiblockCentrifugeRecipes = new GT_Recipe_Map( + new HashSet<>(1200), + "gt.recipe.largecentrifuge", + "Large(PA) Centrifuge", + null, + RES_PATH_GUI + "basicmachines/LCRNEI", + 1, + 9, + 0, + 0, + 1, + "", + 0, + "", + true, + false); + public static final GT_Recipe_Map sMultiblockMixerRecipes = new GT_Recipe_Map( + new HashSet<>(900), + "gt.recipe.largemixer", + "Large(PA) Mixer", + null, + RES_PATH_GUI + "basicmachines/LCRNEI", + 9, + 3, + 0, + 0, + 1, + "", + 0, + "", + true, + false); public static final GT_Recipe_Map_LargeBoilerFakeFuels sLargeBoilerFakeFuels = new GT_Recipe_Map_LargeBoilerFakeFuels(); diff --git a/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java b/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java index 60ab0986d5..713380972f 100644 --- a/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java +++ b/src/main/java/gregtech/api/util/GT_RecipeRegistrator.java @@ -4,15 +4,18 @@ import static gregtech.api.enums.GT_Values.*; import static gregtech.api.enums.Materials.*; import static gregtech.api.enums.Materials.Void; +import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; +import com.google.common.collect.SetMultimap; +import cpw.mods.fml.relauncher.ReflectionHelper; import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.*; import gregtech.api.objects.ItemData; import gregtech.api.objects.MaterialStack; import ic2.api.reactor.IReactorComponent; +import java.lang.reflect.Field; import java.util.*; -import java.util.stream.Collectors; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemBlock; @@ -81,6 +84,8 @@ public class GT_RecipeRegistrator { new RecipeShape(sMt1, sMt1, null, sMt2, null, sMt1, sMt2, null, null), new RecipeShape(null, sMt1, sMt1, sMt1, null, sMt2, null, null, sMt2) }; + public static final Field SHAPED_ORE_RECIPE_WIDTH = ReflectionHelper.findField(ShapedOreRecipe.class, "width"); + public static final Field SHAPED_ORE_RECIPE_HEIGHT = ReflectionHelper.findField(ShapedOreRecipe.class, "height"); private static volatile Map<RecipeShape, List<IRecipe>> indexedRecipeListCache; private static final String[][] sShapesA = new String[][] { null, @@ -479,15 +484,19 @@ public class GT_RecipeRegistrator { (ArrayList<IRecipe>) CraftingManager.getInstance().getRecipeList(); // filter using the empty slots in the shape. // if the empty slots doesn't match, the recipe will definitely fail - Map<List<Integer>, List<RecipeShape>> filter = - Arrays.stream(sShapes).collect(Collectors.groupingBy(RecipeShape::getEmptySlots)); - List<Integer> x = new ArrayList<>(9); + SetMultimap<List<Integer>, RecipeShape> filter = HashMultimap.create(); + for (RecipeShape shape : sShapes) { + for (List<Integer> list : shape.getEmptySlotsAllVariants()) { + filter.put(list, shape); + } + } + List<Integer> buffer = new ArrayList<>(9); for (IRecipe tRecipe : allRecipeList) { if (tRecipe instanceof ShapelessRecipes || tRecipe instanceof ShapelessOreRecipe) { // we don't target shapeless recipes continue; } - x.clear(); + buffer.clear(); ItemStack tStack = tRecipe.getRecipeOutput(); if (GT_Utility.isStackValid(tStack) && tStack.getMaxStackSize() == 1 @@ -497,50 +506,24 @@ public class GT_RecipeRegistrator { && !GT_ModHandler.isElectricItem(tStack) && !GT_Utility.isStackInList(tStack, GT_ModHandler.sNonReplaceableItems)) { if (tRecipe instanceof ShapedOreRecipe) { - boolean allValid = true; - Object[] input = ((ShapedOreRecipe) tRecipe).getInput(); - for (int i = 0, inputLength = input.length; i < inputLength; i++) { - Object tObject = input[i]; - if (tObject != null) { - if (tObject instanceof ItemStack - && (((ItemStack) tObject).getItem() == null - || ((ItemStack) tObject).getMaxStackSize() < 2 - || ((ItemStack) tObject).getMaxDamage() > 0 - || ((ItemStack) tObject).getItem() instanceof ItemBlock)) { - allValid = false; - break; - } - if (tObject instanceof List && ((List<?>) tObject).isEmpty()) { - allValid = false; - break; - } - } else { - x.add(i); - } - } - if (allValid) { - for (RecipeShape s : filter.getOrDefault(x, Collections.emptyList())) { + ShapedOreRecipe tShapedRecipe = (ShapedOreRecipe) tRecipe; + if (checkRecipeShape( + buffer, + tShapedRecipe.getInput(), + getRecipeWidth(tShapedRecipe), + getRecipeHeight(tShapedRecipe))) { + for (RecipeShape s : filter.get(buffer)) { result.computeIfAbsent(s, k -> new ArrayList<>()).add(tRecipe); } } } else if (tRecipe instanceof ShapedRecipes) { - boolean allValid = true; - ItemStack[] recipeItems = ((ShapedRecipes) tRecipe).recipeItems; - for (int i = 0, recipeItemsLength = recipeItems.length; i < recipeItemsLength; i++) { - ItemStack tObject = recipeItems[i]; - if (tObject != null - && (tObject.getItem() == null - || tObject.getMaxStackSize() < 2 - || tObject.getMaxDamage() > 0 - || tObject.getItem() instanceof ItemBlock)) { - allValid = false; - break; - } else { - x.add(i); - } - } - if (allValid) { - for (RecipeShape s : filter.getOrDefault(x, Collections.emptyList())) { + ShapedRecipes tShapedRecipe = (ShapedRecipes) tRecipe; + if (checkRecipeShape( + buffer, + tShapedRecipe.recipeItems, + getRecipeWidth(tShapedRecipe), + getRecipeHeight(tShapedRecipe))) { + for (RecipeShape s : filter.get(buffer)) { result.computeIfAbsent(s, k -> new ArrayList<>()).add(tRecipe); } } @@ -556,6 +539,34 @@ public class GT_RecipeRegistrator { return result; } + private static boolean checkRecipeShape( + List<Integer> emptySlotIndexesBuffer, Object[] input, int tRecipeWidth, int tRecipeHeight) { + for (int y = 0; y < 3; y++) { + for (int x = 0; x < 3; x++) { + if (x >= tRecipeWidth || y >= tRecipeHeight) { + emptySlotIndexesBuffer.add(x + y * 3); + continue; + } + Object tObject = input[x + y * tRecipeWidth]; + if (tObject == null) { + emptySlotIndexesBuffer.add(x + y * 3); + continue; + } + if (tObject instanceof ItemStack + && (((ItemStack) tObject).getItem() == null + || ((ItemStack) tObject).getMaxStackSize() < 2 + || ((ItemStack) tObject).getMaxDamage() > 0 + || ((ItemStack) tObject).getItem() instanceof ItemBlock)) { + return false; + } + if (tObject instanceof List && ((List<?>) tObject).isEmpty()) { + return false; + } + } + } + return true; + } + private static synchronized void registerStickStuff(String aPlate, ItemData aItemData, boolean aRecipeReplacing) { ItemStack tStack; for (Materials tMaterial : sRodMaterialList) { @@ -646,6 +657,30 @@ public class GT_RecipeRegistrator { return Arrays.stream(VANILLA_MATS).anyMatch(mat -> mat == materials); } + private static int getRecipeWidth(ShapedOreRecipe r) { + try { + return (int) SHAPED_ORE_RECIPE_WIDTH.get(r); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + private static int getRecipeHeight(ShapedOreRecipe r) { + try { + return (int) SHAPED_ORE_RECIPE_HEIGHT.get(r); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + private static int getRecipeHeight(ShapedRecipes r) { + return r.recipeHeight; + } + + private static int getRecipeWidth(ShapedRecipes r) { + return r.recipeWidth; + } + private static class RecipeShape { private final ItemStack[] shape; private int amount1; @@ -660,10 +695,42 @@ public class GT_RecipeRegistrator { } } - public List<Integer> getEmptySlots() { + public List<List<Integer>> getEmptySlotsAllVariants() { + // "shake" the grid in 8 direction and see if the recipe shape is still valid + // also include the "no movement" case + ImmutableList.Builder<List<Integer>> b = ImmutableList.builder(); + for (int i = -1; i < 2; i++) { + if (i != 0 && !isColClear(i + 1)) continue; + for (int j = -1; j < 2; j++) { + if (j != 0 && !isRowClear(j + 1)) continue; + b.add(getEmptySlots(i, j)); + } + } + return b.build(); + } + + private boolean isRowClear(int row) { + for (int i = 0; i < 3; i++) { + if (shape[i + row * 3] != null) return false; + } + return true; + } + + private boolean isColClear(int col) { + for (int i = 0; i < 3; i++) { + if (shape[col + i * 3] != null) return false; + } + return true; + } + + private List<Integer> getEmptySlots(int offsetX, int offsetY) { ImmutableList.Builder<Integer> b = ImmutableList.builder(); for (int i = 0; i < shape.length; i++) { - if (shape[i] == null) b.add(i); + int mappedIndex = i - offsetX - offsetY * 3; + // empty slot if it either + // 1) map to a slot outside the original shape + // 2) map to an empty slot in original shape + if (mappedIndex < 0 || mappedIndex > 8 || shape[mappedIndex] == null) b.add(i); } return b.build(); } diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java index 4371658b3a..c9aa55d291 100644 --- a/src/main/java/gregtech/api/util/GT_Utility.java +++ b/src/main/java/gregtech/api/util/GT_Utility.java @@ -4254,7 +4254,29 @@ public class GT_Utility { return Textures.BlockIcons.ERROR_TEXTURE_INDEX; } - public static byte convertRatioToRedstone(long used, long max, int threshold, boolean inverted) { + public static boolean isCellEmpty(ItemStack itemStack) { + if (itemStack == null) return false; + ItemStack tStack = ItemList.Cell_Empty.get(1); + tStack.stackSize = itemStack.stackSize; + return GT_Utility.areStacksEqual(itemStack, tStack); + } + + public static FluidStack convertCellToFluid(ItemStack itemStack) { + if (itemStack == null) return null; + if (getFluidForFilledItem(itemStack, true) != null) { + FluidStack fluidStack = getFluidForFilledItem(itemStack, true); + if (fluidStack != null) fluidStack.amount = fluidStack.amount * itemStack.stackSize; + return fluidStack; + } + return null; + } + + public static boolean checkIfSameIntegratedCircuit(ItemStack itemStack) { + if (itemStack == null) return false; + for (int i = 0; i < 25; i++) if (itemStack.isItemEqual(GT_Utility.getIntegratedCircuit(i))) return true; + return false; + } +public static byte convertRatioToRedstone(long used, long max, int threshold, boolean inverted) { byte signal; if (used <= 0) { // Empty signal = 0; |