aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/util')
-rw-r--r--src/main/java/gregtech/api/util/GT_Forestry_Compat.java2
-rw-r--r--src/main/java/gregtech/api/util/GT_LanguageManager.java204
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java48
-rw-r--r--src/main/java/gregtech/api/util/GT_RecipeRegistrator.java161
-rw-r--r--src/main/java/gregtech/api/util/GT_Utility.java24
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;