|
4 | 4 | import static com.eternal130.tfcaf.ConfigFile.enableForgingTip;
|
5 | 5 |
|
6 | 6 | import java.lang.reflect.Field;
|
| 7 | +import java.util.Arrays; |
7 | 8 |
|
8 | 9 | import net.dries007.tfc.client.screen.AnvilScreen;
|
9 | 10 | import net.dries007.tfc.common.blockentities.AnvilBlockEntity;
|
| 11 | +import net.dries007.tfc.common.capabilities.forge.ForgeRule; |
10 | 12 | import net.dries007.tfc.common.capabilities.forge.ForgeSteps;
|
11 | 13 | import net.dries007.tfc.common.capabilities.forge.Forging;
|
12 | 14 | import net.dries007.tfc.common.recipes.AnvilRecipe;
|
@@ -62,14 +64,14 @@ public static void operationHighlight(ScreenEvent.Render.Post event) {
|
62 | 64 | // 下面那个变量内存有最后三步
|
63 | 65 | ForgeSteps steps = forging.getSteps();
|
64 | 66 | // 用于存储锻造要求,其中的值为Util类中operations的索引
|
65 |
| - int[] lastOperations = new int[3]; |
| 67 | + int[] lastOperations = getRules(AnvilRecipe.getRules()); |
66 | 68 | for (int i = 0; i < 3; i++) {
|
67 |
| - try { |
68 |
| - lastOperations[i] = Util.operationsTfc.get(AnvilRecipe.getRules()[i].ordinal()); |
69 |
| - } catch (Exception e) { |
70 |
| - //这里的异常是索引越界异常,因为锻造需求相比于1.7,没有any,长度可以小于3 |
71 |
| - lastOperations[i] = 4; |
72 |
| - } |
| 69 | +// try { |
| 70 | +// lastOperations[i] = Util.operationsTfc.get(AnvilRecipe.getRules()[i].ordinal()); |
| 71 | +// } catch (Exception e) { |
| 72 | +// //这里的异常是索引越界异常,因为锻造需求相比于1.7,没有any,长度可以小于3 |
| 73 | +// lastOperations[i] = 4; |
| 74 | +// } |
73 | 75 |
|
74 | 76 | ruleOffset += Util.operations[lastOperations[i]];
|
75 | 77 | }
|
@@ -234,4 +236,64 @@ private static AnvilBlockEntity getTEAnvilTFC(AnvilScreen gui) throws NoSuchFiel
|
234 | 236 | fields.setAccessible(true);
|
235 | 237 | return (AnvilBlockEntity) fields.get(gui);
|
236 | 238 | }
|
| 239 | + private static int[] getRules(ForgeRule[] rules) { |
| 240 | + // 相对于1.7版本,没有any类型,每种步骤也只有五种位置,少了LastTwo这种类型,因此少遍历一次 |
| 241 | + int[] lastOperations = new int[3]; |
| 242 | + // 将锻造要求初始化为-1,表示没有要求 |
| 243 | + Arrays.fill(lastOperations, -1); |
| 244 | + // 标志该位置要求是否已经被填充 |
| 245 | + boolean[] flag = new boolean[3]; |
| 246 | + // 首先遍历一次锻造目标,将确定位置的步骤填充到lastOperations中,例如Hit_Last,Hit_Second_Last,Hit_Third_Last |
| 247 | + // 因为hit的last和notlast相比于其他步骤是反序的,因此单独摘出来判断 |
| 248 | + for (ForgeRule rule : rules) { |
| 249 | + // 这三种序号对5取余后分别是1,3,4,Hit_Last的序号是2,Hit_Not_Last的序号是1,单独摘出来判断 |
| 250 | + if ((rule.ordinal() != 1 && rule.ordinal() % 5 == 1 && !flag[0]) || rule.ordinal() == 2) { |
| 251 | + lastOperations[0] = Util.operationsTfc.get(rule.ordinal()); |
| 252 | + flag[0] = true; |
| 253 | + } else if (rule.ordinal() % 5 == 3 && !flag[1]) { |
| 254 | + lastOperations[1] = Util.operationsTfc.get(rule.ordinal()); |
| 255 | + flag[1] = true; |
| 256 | + } else if (rule.ordinal() % 5 == 4 && !flag[2]) { |
| 257 | + lastOperations[2] = Util.operationsTfc.get(rule.ordinal()); |
| 258 | + flag[2] = true; |
| 259 | + } |
| 260 | + } |
| 261 | + // 第二次遍历,填充可以位于倒数第二步和倒数第三步的步骤,例如Hit_Not_Last |
| 262 | + // 其他步骤的Not_last序号对5取余后是2,Hit_Not_Last的序号是1,因此单独摘出来判断 |
| 263 | + for (ForgeRule rule : rules) { |
| 264 | + // 这一步的序号对5取余后是2 |
| 265 | + if ((rule.ordinal() != 2 && rule.ordinal() % 5 == 2) || rule.ordinal() == 1){ |
| 266 | + // 如果倒数第三步已经填充,说明倒数第三步是已经定死的步骤,不可以更改,如果能进入这里的循环并且两个位置都已经填满,说明该锻造配方无法完成 |
| 267 | + // 所以当倒数第三步已经填充,就将倒数第二步填充为当前步骤,否则填充最后一步 |
| 268 | + if (flag[2]) { |
| 269 | + lastOperations[1] = Util.operationsTfc.get(rule.ordinal()); |
| 270 | + flag[1] = true; |
| 271 | + } else { |
| 272 | + lastOperations[2] = Util.operationsTfc.get(rule.ordinal()); |
| 273 | + flag[2] = true; |
| 274 | + } |
| 275 | + } |
| 276 | + } |
| 277 | + // 最后一次遍历,填充剩余的步骤,这里的步骤是可以位于任意位置的步骤,例如BendAny |
| 278 | + o: for (ForgeRule rule : rules) { |
| 279 | + // 这个步骤的序号对5取余后是0 |
| 280 | + if (rule.ordinal() % 5 == 0) { |
| 281 | + // 遍历lastOperations,如果有空位就填充,并且因为锻造需求里每步出现一次,所以只填充一次,跳出大循环 |
| 282 | + for (int i = 0; i < 3; i++) { |
| 283 | + if (!flag[i]) { |
| 284 | + lastOperations[i] = Util.operationsTfc.get(rule.ordinal()); |
| 285 | + flag[i] = true; |
| 286 | + break o; |
| 287 | + } |
| 288 | + } |
| 289 | + } |
| 290 | + } |
| 291 | + // 如果还有空位,说明锻造需求不满3个,这时将空位填入4,对应锻造数值是2,此时未遍历的需求只有Any,对于Any,填入的数值依然是4 |
| 292 | + for (int i = 0; i < 3; i++) { |
| 293 | + if (!flag[i]) { |
| 294 | + lastOperations[i] = 4; |
| 295 | + } |
| 296 | + } |
| 297 | + return lastOperations; |
| 298 | + } |
237 | 299 | }
|
0 commit comments