Skip to content

Commit c4fe9b6

Browse files
committed
Fixed a bug, now can automatically complete any forging recipes
1 parent 6e66625 commit c4fe9b6

File tree

3 files changed

+70
-27
lines changed

3 files changed

+70
-27
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ mod_name=TFC:TNG Auto Forging
4848
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
4949
mod_license=All Rights Reserved
5050
# The mod version. See https://semver.org/
51-
mod_version=1.20.1-1.0
51+
mod_version=1.20.1-1.1
5252
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
5353
# This should match the base package used for the mod sources.
5454
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html

src/main/java/com/eternal130/tfcaf/TFCAutoForging.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,15 @@
22

33
import com.mojang.logging.LogUtils;
44
import net.minecraft.client.KeyMapping;
5-
import net.minecraft.client.Minecraft;
6-
import net.minecraft.core.registries.Registries;
7-
import net.minecraft.world.food.FoodProperties;
8-
import net.minecraft.world.item.BlockItem;
9-
import net.minecraft.world.item.CreativeModeTab;
10-
import net.minecraft.world.item.CreativeModeTabs;
11-
import net.minecraft.world.item.Item;
12-
import net.minecraft.world.level.block.Block;
13-
import net.minecraft.world.level.block.Blocks;
14-
import net.minecraft.world.level.block.state.BlockBehaviour;
15-
import net.minecraft.world.level.material.MapColor;
16-
import net.minecraftforge.api.distmarker.Dist;
17-
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
185
import net.minecraftforge.common.MinecraftForge;
19-
import net.minecraftforge.event.BuildCreativeModeTabContentsEvent;
206
import net.minecraftforge.event.server.ServerStartingEvent;
217
import net.minecraftforge.eventbus.api.IEventBus;
228
import net.minecraftforge.eventbus.api.SubscribeEvent;
239
import net.minecraftforge.fml.ModLoadingContext;
2410
import net.minecraftforge.fml.common.Mod;
2511
import net.minecraftforge.fml.config.ModConfig;
2612
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
27-
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
2813
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
29-
import net.minecraftforge.registries.DeferredRegister;
30-
import net.minecraftforge.registries.ForgeRegistries;
31-
import net.minecraftforge.registries.RegistryObject;
32-
import org.lwjgl.glfw.GLFW;
3314
import org.slf4j.Logger;
3415

3516
// The value here should match an entry in the META-INF/mods.toml file

src/main/java/com/eternal130/tfcaf/forgeEvent.java

Lines changed: 69 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import static com.eternal130.tfcaf.ConfigFile.enableForgingTip;
55

66
import java.lang.reflect.Field;
7+
import java.util.Arrays;
78

89
import net.dries007.tfc.client.screen.AnvilScreen;
910
import net.dries007.tfc.common.blockentities.AnvilBlockEntity;
11+
import net.dries007.tfc.common.capabilities.forge.ForgeRule;
1012
import net.dries007.tfc.common.capabilities.forge.ForgeSteps;
1113
import net.dries007.tfc.common.capabilities.forge.Forging;
1214
import net.dries007.tfc.common.recipes.AnvilRecipe;
@@ -62,14 +64,14 @@ public static void operationHighlight(ScreenEvent.Render.Post event) {
6264
// 下面那个变量内存有最后三步
6365
ForgeSteps steps = forging.getSteps();
6466
// 用于存储锻造要求,其中的值为Util类中operations的索引
65-
int[] lastOperations = new int[3];
67+
int[] lastOperations = getRules(AnvilRecipe.getRules());
6668
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+
// }
7375

7476
ruleOffset += Util.operations[lastOperations[i]];
7577
}
@@ -234,4 +236,64 @@ private static AnvilBlockEntity getTEAnvilTFC(AnvilScreen gui) throws NoSuchFiel
234236
fields.setAccessible(true);
235237
return (AnvilBlockEntity) fields.get(gui);
236238
}
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+
}
237299
}

0 commit comments

Comments
 (0)