Skip to content

Commit 59e66b9

Browse files
committed
Add Default Key Bind (N)
Fix config Removed some unnecessary logs 1.0.0 ready zh lang
1 parent a4206d3 commit 59e66b9

11 files changed

Lines changed: 51 additions & 105 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ parchment_mappings_version=2025.12.20
2626
mod_id=emi_patternizer
2727
mod_name=EMI Patternizer
2828
mod_license=GNU LGPL 3.0
29-
mod_version=0.2.1
29+
mod_version=1.0.0
3030
mod_group_id=io.github.linkfgfgui
3131
mod_authors=link-fgfgui
3232
mod_description=Automatically Encoding Patterns from the EMI Recipe Tree.
Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,14 @@
11
package io.github.linkfgfgui.emi_patternizer;
22

3-
import net.minecraft.core.registries.BuiltInRegistries;
4-
import net.minecraft.resources.ResourceLocation;
5-
import net.minecraft.world.item.Item;
6-
import net.neoforged.bus.api.SubscribeEvent;
7-
import net.neoforged.fml.common.EventBusSubscriber;
8-
import net.neoforged.fml.event.config.ModConfigEvent;
93
import net.neoforged.neoforge.common.ModConfigSpec;
104

11-
import java.util.List;
12-
import java.util.Set;
13-
import java.util.stream.Collectors;
14-
15-
// An example config class. This is not required, but it's a good idea to have one to keep your config organized.
16-
// Demonstrates how to use Neo's config APIs
17-
@EventBusSubscriber(modid = Emi_patternizer.MODID)
185
public class Config {
196
private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder();
207

21-
private static final ModConfigSpec.BooleanValue LOG_DIRT_BLOCK = BUILDER.comment("Whether to log the dirt block on common setup").define("logDirtBlock", true);
22-
23-
private static final ModConfigSpec.IntValue MAGIC_NUMBER = BUILDER.comment("A magic number").defineInRange("magicNumber", 42, 0, Integer.MAX_VALUE);
24-
25-
public static final ModConfigSpec.ConfigValue<String> MAGIC_NUMBER_INTRODUCTION = BUILDER.comment("What you want the introduction message to be for the magic number").define("magicNumberIntroduction", "The magic number is... ");
26-
27-
// a list of strings that are treated as resource locations for items
28-
private static final ModConfigSpec.ConfigValue<List<? extends String>> ITEM_STRINGS = BUILDER.comment("A list of items to log on common setup.").defineListAllowEmpty("items", List.of("minecraft:iron_ingot"), Config::validateItemName);
8+
public static final ModConfigSpec.LongValue DELAY_PER_OPERATION = BUILDER.comment("Delay per click").translation("emi_patternizer.config.delay1").defineInRange("delayPerOperation", 60, 0, Long.MAX_VALUE);
9+
public static final ModConfigSpec.LongValue DELAY_ADDITIONAL_PER_PATTERN = BUILDER.comment("Additional delay after 3 clicks").translation("emi_patternizer.config.delay2").defineInRange("delayAdditionalPerPattern", 20, 0, Long.MAX_VALUE);
10+
public static final ModConfigSpec.LongValue DELAY_BEFORE_READ = BUILDER.comment("Delay before read patterns from terminal (Unit: Millisecond)").translation("emi_patternizer.config.delay3").defineInRange("delayBeforeRead", 1000, 0, Long.MAX_VALUE);
11+
public static final ModConfigSpec.BooleanValue IS_PLAY_SOUND = BUILDER.comment("Play a sound after recipe fill").translation("emi_patternizer.config.playsound").define("isPlaySound", true);
2912

3013
static final ModConfigSpec SPEC = BUILDER.build();
31-
32-
public static boolean logDirtBlock;
33-
public static int magicNumber;
34-
public static String magicNumberIntroduction;
35-
public static Set<Item> items;
36-
37-
private static boolean validateItemName(final Object obj) {
38-
return obj instanceof String itemName && BuiltInRegistries.ITEM.containsKey(ResourceLocation.parse(itemName));
39-
}
40-
41-
@SubscribeEvent
42-
static void onLoad(final ModConfigEvent event) {
43-
logDirtBlock = LOG_DIRT_BLOCK.get();
44-
magicNumber = MAGIC_NUMBER.get();
45-
magicNumberIntroduction = MAGIC_NUMBER_INTRODUCTION.get();
46-
47-
// convert the list of strings into a set of items
48-
items = ITEM_STRINGS.get().stream().map(itemName -> BuiltInRegistries.ITEM.get(ResourceLocation.parse(itemName))).collect(Collectors.toSet());
49-
}
5014
}

src/main/java/io/github/linkfgfgui/emi_patternizer/Emi_patternizer.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,38 @@
55
import net.minecraft.client.KeyMapping;
66
import net.neoforged.api.distmarker.Dist;
77
import net.neoforged.bus.api.IEventBus;
8-
import net.neoforged.bus.api.SubscribeEvent;
98
import net.neoforged.fml.ModContainer;
109
import net.neoforged.fml.common.Mod;
1110
import net.neoforged.fml.config.ModConfig;
1211
import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
1312
import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent;
13+
import net.neoforged.neoforge.client.gui.ConfigurationScreen;
14+
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
1415
import net.neoforged.neoforge.client.settings.KeyConflictContext;
15-
import net.neoforged.neoforge.client.settings.KeyModifier;
1616
import net.neoforged.neoforge.common.NeoForge;
1717
import net.neoforged.neoforge.common.util.Lazy;
1818
import org.lwjgl.glfw.GLFW;
1919
import org.slf4j.Logger;
2020

21-
// The value here should match an entry in the META-INF/neoforge.mods.toml file
2221
@Mod(value = Emi_patternizer.MODID, dist = Dist.CLIENT)
2322
public class Emi_patternizer {
24-
// Define mod id in a common place for everything to reference
2523
public static final String MODID = "emi_patternizer";
26-
// Directly reference a slf4j logger
2724
private static final Logger LOGGER = LogUtils.getLogger();
2825
public static final Lazy<KeyMapping> PATTERNIZE_MAPPING = Lazy.of(() -> new KeyMapping(
2926
"key.emi_patternizer.patternize",
3027
KeyConflictContext.GUI,
3128
InputConstants.Type.KEYSYM,
32-
InputConstants.UNKNOWN.getValue(),
29+
GLFW.GLFW_KEY_N,
3330
"key.categories.emi_patternizer.category"
3431
));
32+
3533
public Emi_patternizer(IEventBus modEventBus, ModContainer modContainer) {
3634
modEventBus.addListener(this::clientSetup);
3735
modEventBus.addListener(this::registerKeyMappings);
3836
NeoForge.EVENT_BUS.addListener(Patternize::onKeyPressed);
3937
NeoForge.EVENT_BUS.addListener(ReloadMemory::onScreenOpening);
4038
modContainer.registerConfig(ModConfig.Type.CLIENT, Config.SPEC);
39+
modContainer.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new);
4140
}
4241

4342
private void clientSetup(final FMLClientSetupEvent event) {

src/main/java/io/github/linkfgfgui/emi_patternizer/Patternize.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package io.github.linkfgfgui.emi_patternizer;
22

33
import appeng.client.gui.me.items.PatternEncodingTermScreen;
4-
import appeng.client.gui.me.patternaccess.PatternAccessTermScreen;
54
import appeng.menu.SlotSemantics;
65
import appeng.menu.me.items.PatternEncodingTermMenu;
76
import com.mojang.blaze3d.platform.InputConstants;
87
import com.mojang.logging.LogUtils;
9-
import dev.emi.emi.api.EmiApi;
108
import dev.emi.emi.api.recipe.EmiRecipe;
119
import dev.emi.emi.api.recipe.handler.EmiCraftContext;
1210
import dev.emi.emi.api.stack.EmiStack;
@@ -20,7 +18,6 @@
2018
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
2119
import net.minecraft.sounds.SoundEvents;
2220
import net.minecraft.world.inventory.ClickType;
23-
import net.neoforged.bus.api.SubscribeEvent;
2421
import net.neoforged.neoforge.client.event.ScreenEvent;
2522
import org.jetbrains.annotations.Nullable;
2623
import org.slf4j.Logger;
@@ -32,7 +29,9 @@
3229

3330

3431
public class Patternize {
35-
static long per = 60;
32+
static long delayPerOperation;
33+
static long delayAdditionalPerPattern;
34+
static boolean isPlaySound;
3635
public static HashSet<String> EncodedItems = new HashSet<>();
3736
public static volatile boolean operating = false;
3837
private static final Logger LOGGER = LogUtils.getLogger();
@@ -49,14 +48,15 @@ public static void Encode(long initDelay, Minecraft minecraft, EmiRecipe recipe,
4948
CompletableFuture.delayedExecutor(initDelay, TimeUnit.MILLISECONDS).execute(() -> {
5049
minecraft.execute(() -> {
5150
EmiRecipeFiller.performFill(recipe, screen, EmiCraftContext.Type.FILL_BUTTON, EmiCraftContext.Destination.NONE, 1);
52-
minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0f));
51+
if (isPlaySound) {
52+
minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0f));
53+
}
5354
});
54-
CompletableFuture.delayedExecutor(per, TimeUnit.MILLISECONDS).execute(() -> {
55+
CompletableFuture.delayedExecutor(delayPerOperation, TimeUnit.MILLISECONDS).execute(() -> {
5556
minecraft.execute(() -> {
5657
menu.encode();
57-
LOGGER.debug("Operating: {}, EncodedItems: {}", operating, EncodedItems);
5858
});
59-
CompletableFuture.delayedExecutor(per, TimeUnit.MILLISECONDS).execute(() ->
59+
CompletableFuture.delayedExecutor(delayPerOperation, TimeUnit.MILLISECONDS).execute(() ->
6060
minecraft.execute(() ->
6161
gameMode.handleInventoryMouseClick(
6262
menu.containerId,
@@ -78,7 +78,7 @@ public static long CreateTasks(long delay, Minecraft minecraft, @Nullable List<M
7878
if (node.recipe != null && node.recipe.getId() != null && !containsAllItems(node.recipe)) {
7979
Encode(delay, minecraft, node.recipe, screen, menu, player, gameMode, encodedPatternSlot);
8080
node.recipe.getOutputs().forEach(emiStack -> EncodedItems.add(emiStack.getId().toString()));
81-
delay += (3 * per + 20);
81+
delay += (3 * delayPerOperation + delayAdditionalPerPattern);
8282
}
8383
if (node.children != null) {
8484
delay = CreateTasks(delay, minecraft, node.children, screen, menu, player, gameMode, encodedPatternSlot);
@@ -87,27 +87,30 @@ public static long CreateTasks(long delay, Minecraft minecraft, @Nullable List<M
8787
return delay;
8888
}
8989

90+
public static void LoadConfig() {
91+
delayPerOperation = Config.DELAY_PER_OPERATION.get();
92+
delayAdditionalPerPattern = Config.DELAY_ADDITIONAL_PER_PATTERN.get();
93+
isPlaySound = Config.IS_PLAY_SOUND.get();
94+
}
95+
9096
public static void onKeyPressed(ScreenEvent.KeyPressed.Post event) {
9197
if (!operating && Emi_patternizer.PATTERNIZE_MAPPING.get().isActiveAndMatches(InputConstants.getKey(event.getKeyCode(), event.getScanCode()))) {
9298
if (event.getScreen() instanceof PatternEncodingTermScreen<?> screen) {
93-
LOGGER.debug("Catched");
9499
PatternEncodingTermMenu menu = screen.getMenu();
95100
// int blankPatternSlot = ((AEBaseMenuAccessor) menu).getSlotsBySemantic().get(SlotSemantics.BLANK_PATTERN).getFirst().index;
96101
int encodedPatternSlot = ((AEBaseMenuAccessor) menu).getSlotsBySemantic().get(SlotSemantics.ENCODED_PATTERN).getFirst().index;
97-
if (BoM.craftingMode) {
98-
LOGGER.debug("BoM crafting");
102+
if (BoM.craftingMode && !operating) {
103+
LoadConfig();
99104
Minecraft minecraft = Minecraft.getInstance();
100105
LocalPlayer player = minecraft.player;
101106
MultiPlayerGameMode gameMode = minecraft.gameMode;
102-
103-
104107
MaterialNode goal = BoM.tree.goal;
105108
operating = true;
106109
LOGGER.debug("operating started");
107110
long maxDelay = CreateTasks(0, minecraft, List.of(goal), screen, menu, player, gameMode, encodedPatternSlot);
108-
CompletableFuture.delayedExecutor(maxDelay + per, TimeUnit.MILLISECONDS).execute(() -> {
111+
CompletableFuture.delayedExecutor(maxDelay + delayPerOperation, TimeUnit.MILLISECONDS).execute(() -> {
109112
operating = false;
110-
BoM.craftingMode=false;
113+
BoM.craftingMode = false;
111114
LOGGER.debug("operating finished");
112115
});
113116
}

src/main/java/io/github/linkfgfgui/emi_patternizer/ReloadMemory.java

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,35 @@
22

33
import appeng.api.crafting.IPatternDetails;
44
import appeng.api.crafting.PatternDetailsHelper;
5-
import appeng.api.storage.IPatternAccessTermMenuHost;
65
import appeng.client.gui.me.patternaccess.PatternAccessTermScreen;
76
import appeng.client.gui.me.patternaccess.PatternContainerRecord;
8-
import appeng.menu.implementations.PatternAccessTermMenu;
9-
import com.mojang.logging.LogUtils;
10-
import dev.emi.emi.api.recipe.handler.EmiCraftContext;
11-
import dev.emi.emi.registry.EmiRecipeFiller;
127
import io.github.linkfgfgui.emi_patternizer.mixin.PatternAccessTermScreenAccessor;
138
import net.minecraft.client.Minecraft;
14-
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
159
import net.minecraft.network.chat.Component;
16-
import net.minecraft.sounds.SoundEvents;
1710
import net.minecraft.world.level.Level;
1811
import net.neoforged.neoforge.client.event.ScreenEvent;
1912

20-
import static io.github.linkfgfgui.emi_patternizer.Patternize.EncodedItems;
21-
22-
import org.slf4j.Logger;
23-
2413
import java.util.Collection;
25-
import java.util.Set;
2614
import java.util.concurrent.CompletableFuture;
2715
import java.util.concurrent.TimeUnit;
2816

17+
import static io.github.linkfgfgui.emi_patternizer.Patternize.EncodedItems;
18+
2919
public class ReloadMemory {
20+
static long delayBeforeRead;
21+
3022
static long PatternCount = 0;
31-
private static final Logger LOGGER = LogUtils.getLogger();
3223

3324
public static void onScreenOpening(ScreenEvent.Opening event) {
3425
if (event.getScreen() instanceof PatternAccessTermScreen<?> screen) {
3526
EncodedItems.clear();
3627
Minecraft minecraft = Minecraft.getInstance();
3728
Level level = minecraft.level;
38-
CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS).execute(() -> {
29+
delayBeforeRead=Config.DELAY_BEFORE_READ.get();
30+
CompletableFuture.delayedExecutor(delayBeforeRead, TimeUnit.MILLISECONDS).execute(() -> {
3931
minecraft.execute(() -> {
4032
PatternCount = 0;
4133
Collection<PatternContainerRecord> patternContainerRecordSet = ((PatternAccessTermScreenAccessor) screen).getById().values();
42-
LOGGER.debug(patternContainerRecordSet.toString());
4334
for (PatternContainerRecord entry : patternContainerRecordSet) {
4435
entry.getInventory().toItemContainerContents().stream().forEach((item) -> {
4536
IPatternDetails details = PatternDetailsHelper.decodePattern(item, level);

src/main/java/io/github/linkfgfgui/emi_patternizer/mixin/AbstractContainerScreenMixin.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package io.github.linkfgfgui.emi_patternizer.mixin;
22

33
import appeng.client.gui.me.items.PatternEncodingTermScreen;
4-
import appeng.client.gui.me.patternaccess.PatternAccessTermScreen;
5-
import com.mojang.logging.LogUtils;
64
import io.github.linkfgfgui.emi_patternizer.Patternize;
75
import net.minecraft.client.gui.screens.Screen;
86
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
9-
import org.slf4j.Logger;
107
import org.spongepowered.asm.mixin.Mixin;
118
import org.spongepowered.asm.mixin.injection.At;
129
import org.spongepowered.asm.mixin.injection.Inject;

src/main/java/io/github/linkfgfgui/emi_patternizer/mixin/PatternAccessTermScreenAccessor.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package io.github.linkfgfgui.emi_patternizer.mixin;
22

3-
import appeng.api.storage.IPatternAccessTermMenuHost;
43
import appeng.client.gui.me.patternaccess.PatternAccessTermScreen;
54
import appeng.client.gui.me.patternaccess.PatternContainerRecord;
6-
import appeng.helpers.patternprovider.PatternContainer;
75
import org.spongepowered.asm.mixin.Mixin;
86
import org.spongepowered.asm.mixin.gen.Accessor;
97

108
import java.util.HashMap;
11-
import java.util.Set;
129

1310
@Mixin(PatternAccessTermScreen.class)
1411
public interface PatternAccessTermScreenAccessor {

src/main/java/io/github/linkfgfgui/emi_patternizer/mixin/PatternEncodingTermMenuAccessor.java

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
{
22
"itemGroup.emi_patternizer": "EMI Patternizer",
3-
"key.emi_patternizer.patternize": "Encode Pattern",
3+
"key.emi_patternizer.patternize": "Encode Patterns",
44
"key.categories.emi_patternizer.category": "EMI Patternizer",
5-
"chat.emi_patternizer.loaded": "Loaded %d Item(s) from %d Pattern(s)"
5+
"chat.emi_patternizer.loaded": "Loaded %d Item(s) from %d Pattern(s)",
6+
"emi_patternizer.config.delay1": "Delay per click",
7+
"emi_patternizer.config.delay2": "Additional delay after 3 clicks",
8+
"emi_patternizer.config.delay3": "Delay before read patterns from terminal (Unit: Millisecond)",
9+
"emi_patternizer.config.playsound": "Play a sound after recipe fill"
610
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"itemGroup.emi_patternizer": "EMI 快速编码",
3+
"key.emi_patternizer.patternize": "编码样板",
4+
"key.categories.emi_patternizer.category": "EMI 快速编码",
5+
"chat.emi_patternizer.loaded": "从%2$d个样板中加载了%1$d种物品",
6+
"emi_patternizer.config.delay1": "每次点击后的延迟",
7+
"emi_patternizer.config.delay2": "每个样板编码完成后的额外延迟",
8+
"emi_patternizer.config.delay3": "读取样板前的延迟(单位:毫秒)",
9+
"emi_patternizer.config.playsound": "转移配方后播放音效"
10+
}

0 commit comments

Comments
 (0)