5
5
6
6
import java .lang .reflect .Field ;
7
7
import java .lang .reflect .Method ;
8
+ import java .util .Arrays ;
8
9
import java .util .List ;
9
10
10
11
import com .eternal130 .tfcaf .KeyBind ;
@@ -54,7 +55,7 @@ public void operationHighlight(GuiScreenEvent.DrawScreenEvent.Post event) {
54
55
// for(Field field : fields) {
55
56
// TFCAutoForging.logger.info("Field: {} ,Type: {}", field.getName(), field.getType());
56
57
// }
57
- // 检测当前gui是否是铁砧gui或者是tfcquickpocket替换后的铁砧gui
58
+ // 检测当前gui是否是砧gui
58
59
TEAnvilTFC anvilTE = getTEAnvilTFC ((GuiAnvilTFC ) event .getGui ());
59
60
if (enableAutoForging || enableForgingTip ) {
60
61
// 当锻造提示功能和自动锻造功能有一个开启时就计算下一步锻造步骤
@@ -73,58 +74,8 @@ public void operationHighlight(GuiScreenEvent.DrawScreenEvent.Post event) {
73
74
// 下面那个变量内存有最后三步,LinkedList类型,队列数据结构,最多3个元素,从左到右分别为倒数第三步,倒数第二步,倒数第一步
74
75
ForgeSteps steps = anvilTE .getSteps ();
75
76
// 用于存储锻造要求,其中的值为Util类中operations的索引
76
- int [] lastOperations = new int [ 3 ] ;
77
+ int [] lastOperations = getRules ( AnvilRecipe . getRules ()) ;
77
78
for (int i = 0 ; i < 3 ; i ++) {
78
- try {
79
- lastOperations [i ] = Util .operationsTfc .get (ForgeRule .getID (AnvilRecipe .getRules ()[i ]));
80
- } catch (Exception e ) {
81
- //这里的异常是索引越界异常,因为锻造需求相比于1.7,没有any,长度可以小于3
82
- lastOperations [i ] = 4 ;
83
- }
84
- // switch (ForgeRule.getID(AnvilRecipe.getRules()[i])) {
85
- // case 0:
86
- // case 1:
87
- // case 2:
88
- // case 3:
89
- // case 4:
90
- // lastOperations[i] = 3;
91
- // break;
92
- // case 5:
93
- // case 6:
94
- // case 7:
95
- // case 8:
96
- // case 9:
97
- // lastOperations[i] = 0;
98
- // break;
99
- // case 10:
100
- // case 11:
101
- // case 12:
102
- // case 13:
103
- // case 14:
104
- // lastOperations[i] = 4;
105
- // break;
106
- // case 15:
107
- // case 16:
108
- // case 17:
109
- // case 18:
110
- // case 19:
111
- // lastOperations[i] = 5;
112
- // break;
113
- // case 20:
114
- // case 21:
115
- // case 22:
116
- // case 23:
117
- // case 24:
118
- // lastOperations[i] = 6;
119
- // break;
120
- // case 25:
121
- // case 26:
122
- // case 27:
123
- // case 28:
124
- // case 29:
125
- // lastOperations[i] = 7;
126
- // break;
127
- // }
128
79
ruleOffset += Util .operations [lastOperations [i ]];
129
80
}
130
81
// GuiAnvil中drawItemRulesImages方法绘制最后三步步骤,drawRulesImages方法绘制锻造要求
@@ -320,4 +271,64 @@ private TEAnvilTFC getTEAnvilTFC(GuiAnvilTFC gui) throws NoSuchFieldException, I
320
271
fields .setAccessible (true );
321
272
return (TEAnvilTFC ) fields .get (gui );
322
273
}
274
+ private int [] getRules (ForgeRule [] rules ) {
275
+ // 相对于1.7版本,没有any类型,每种步骤也只有五种位置,少了LastTwo这种类型,因此少遍历一次
276
+ int [] lastOperations = new int [3 ];
277
+ // 将锻造要求初始化为-1,表示没有要求
278
+ Arrays .fill (lastOperations , -1 );
279
+ // 标志该位置要求是否已经被填充
280
+ boolean [] flag = new boolean [3 ];
281
+ // 首先遍历一次锻造目标,将确定位置的步骤填充到lastOperations中,例如Hit_Last,Hit_Second_Last,Hit_Third_Last
282
+ // 因为hit的last和notlast相比于其他步骤是反序的,因此单独摘出来判断
283
+ for (ForgeRule rule : rules ) {
284
+ // 这三种序号对5取余后分别是1,3,4,Hit_Last的序号是2,Hit_Not_Last的序号是1,单独摘出来判断
285
+ if ((rule .ordinal () != 1 && rule .ordinal () % 5 == 1 && !flag [0 ]) || rule .ordinal () == 2 ) {
286
+ lastOperations [0 ] = Util .operationsTfc .get (rule .ordinal ());
287
+ flag [0 ] = true ;
288
+ } else if (rule .ordinal () % 5 == 3 && !flag [1 ]) {
289
+ lastOperations [1 ] = Util .operationsTfc .get (rule .ordinal ());
290
+ flag [1 ] = true ;
291
+ } else if (rule .ordinal () % 5 == 4 && !flag [2 ]) {
292
+ lastOperations [2 ] = Util .operationsTfc .get (rule .ordinal ());
293
+ flag [2 ] = true ;
294
+ }
295
+ }
296
+ // 第二次遍历,填充可以位于倒数第二步和倒数第三步的步骤,例如Hit_Not_Last
297
+ // 其他步骤的Not_last序号对5取余后是2,Hit_Not_Last的序号是1,因此单独摘出来判断
298
+ for (ForgeRule rule : rules ) {
299
+ // 这一步的序号对5取余后是2
300
+ if ((rule .ordinal () != 2 && rule .ordinal () % 5 == 2 ) || rule .ordinal () == 1 ){
301
+ // 如果倒数第三步已经填充,说明倒数第三步是已经定死的步骤,不可以更改,如果能进入这里的循环并且两个位置都已经填满,说明该锻造配方无法完成
302
+ // 所以当倒数第三步已经填充,就将倒数第二步填充为当前步骤,否则填充最后一步
303
+ if (flag [2 ]) {
304
+ lastOperations [1 ] = Util .operationsTfc .get (rule .ordinal ());
305
+ flag [1 ] = true ;
306
+ } else {
307
+ lastOperations [2 ] = Util .operationsTfc .get (rule .ordinal ());
308
+ flag [2 ] = true ;
309
+ }
310
+ }
311
+ }
312
+ // 最后一次遍历,填充剩余的步骤,这里的步骤是可以位于任意位置的步骤,例如BendAny
313
+ o : for (ForgeRule rule : rules ) {
314
+ // 这个步骤的序号对5取余后是0
315
+ if (rule .ordinal () % 5 == 0 ) {
316
+ // 遍历lastOperations,如果有空位就填充,并且因为锻造需求里每步出现一次,所以只填充一次,跳出大循环
317
+ for (int i = 0 ; i < 3 ; i ++) {
318
+ if (!flag [i ]) {
319
+ lastOperations [i ] = Util .operationsTfc .get (rule .ordinal ());
320
+ flag [i ] = true ;
321
+ break o ;
322
+ }
323
+ }
324
+ }
325
+ }
326
+ // 如果还有空位,说明锻造需求不满3个,这时将空位填入4,对应锻造数值是2,此时未遍历的需求只有Any,对于Any,填入的数值依然是4
327
+ for (int i = 0 ; i < 3 ; i ++) {
328
+ if (!flag [i ]) {
329
+ lastOperations [i ] = 4 ;
330
+ }
331
+ }
332
+ return lastOperations ;
333
+ }
323
334
}
0 commit comments