From b4ce719eabfff570d6b7161d00aa84de3423ea82 Mon Sep 17 00:00:00 2001 From: Minecraft269 Date: Mon, 3 Aug 2026 21:05:46 +0800 Subject: [PATCH 1/2] fix: infrastructure fixes and config GUI improvements (Stage 0+2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix WorldUtils.isReplaceable duplicate condition (isAir→canBeReplaced) - Replace hardcoded MOD_VERSION with runtime FabricLoader lookup - Fix release.yml: chiseledBuild→build, add gradle setup step - Fix fabric.mod.json depends to match actual versions - Fix pack.mcmeta with dynamic pack_format (88 for 26.2) - Create root README.md with honest version support status - Update CONTRIBUTING.md to remove Stonecutter references - Expand all config tooltip descriptions to 2-3 sentences - Remove All Tab from ConfigGui (remove IConfigGuiAllTab) - Remove hotkey registration (no standalone hotkey, ModMenu only) - Remove dead PrinterConfig.HOTKEY_LIST --- .github/CONTRIBUTING.md | 21 ++-- .github/workflows/release.yml | 3 +- README.md | 45 +++++++ build.gradle.kts | 11 +- gradle.properties | 4 + .../infinitelyprinter/InitHandler.java | 5 - .../infinitelyprinter/Reference.java | 15 ++- .../infinitelyprinter/config/Config.java | 2 - .../infinitelyprinter/config/ConfigGui.java | 23 +--- .../config/PrinterConfig.java | 3 - .../infinitelyprinter/util/WorldUtils.java | 2 +- .../assets/infinitely-printer/lang/en_us.json | 116 +++++++++--------- .../assets/infinitely-printer/lang/zh_cn.json | 94 +++++++------- src/main/resources/fabric.mod.json | 8 +- src/main/resources/pack.mcmeta | 2 +- 15 files changed, 194 insertions(+), 160 deletions(-) create mode 100644 README.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 685f8a8..ef5e0a7 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,9 +1,9 @@ # Contributing to Infinitely-Printer Thank you for your interest in contributing! This project is a Minecraft mod -that targets multiple Minecraft versions and mod loaders (Fabric, NeoForge, and -Forge) via [Stonecutter](https://stonecutter.kikugie.dev/), built with Gradle -Kotlin DSL and Architectury Loom. +built with Gradle Kotlin DSL and Fabric Loom. Multi-version and multi-loader +support is planned but not yet implemented — currently targeting Minecraft 26.2 +with Fabric. This guide covers the contribution workflow and the conventions we expect all contributors to follow. By contributing, you agree that your contributions will @@ -34,11 +34,8 @@ be licensed under the same license as the project. ./gradlew build ``` - This builds the currently active version (see `stonecutter.gradle.kts`). - The repository is versioned and loader-switched through Stonecutter, so a - change may need to build against multiple targets. When you submit a pull - request, make sure the change at least builds for the active target, and - note in the PR description which versions/loaders you verified. + This builds the mod for Minecraft 26.2 with Fabric. Make sure the build + succeeds before opening a pull request. ## Code Style @@ -171,10 +168,10 @@ Do not submit work you have not tested. Before opening a pull request: ./gradlew test ``` -3. **Verify against the relevant version/loader.** Because this mod targets - multiple Minecraft versions and loaders via Stonecutter, test your change in - the target(s) your change affects. If you cannot test every target, say so - explicitly in the PR description so reviewers know what was verified. +3. **Verify against the target version.** This mod currently targets Minecraft + 26.2 with Fabric. Test your change against this version. If you cannot test + in-game, say so explicitly in the PR description so reviewers know what was + verified. 4. **Launch the client** if your change affects gameplay behavior, and manually verify the behavior you changed (for example, `./gradlew runClient` or the IDE run configuration for the active version). diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 81e6cb1..f29d647 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,8 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: { java-version: '25', distribution: 'temurin' } - - run: ./gradlew chiseledBuild + - uses: gradle/actions/setup-gradle@v3 + - run: chmod +x gradlew && ./gradlew build - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: diff --git a/README.md b/README.md new file mode 100644 index 0000000..a1876a0 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# Infinitely Printer + +A feature-complete Litematica printer mod for Minecraft. + +## Version Support + +| Minecraft | Loader | Status | +|-----------|-------------|----------------| +| 26.2 | Fabric | In Development | +| 1.21.1 | Fabric | Planned | +| 1.21.1 | NeoForge | Planned | +| 1.20.1 | Fabric | Planned | +| 1.20.1 | Forge | Planned | +| 1.18.2 | Fabric | Planned | + +## Features + +- Auto printing with accurate block placement +- Bedrock breaking (6-direction, standalone mode) +- Block replacement and weed clearing +- Auto tool switching +- Remote container inventory access +- Anti-cheat bypass (multi-mode packet sending) +- Cruise control (auto-move to next build position) +- Do Not Disturb (hostile mob handling) +- Void mode (17x17 chunk perimeter excavation) +- Quick shulker box access +- Reach extension (auto-operation only) + +## Dependencies + +- [MaLiLib](https://www.curseforge.com/minecraft/mc-mods/malilib) >= 0.29.3 +- [Litematica](https://www.curseforge.com/minecraft/mc-mods/litematica) >= 0.28.4 +- [Fabric API](https://modrinth.com/mod/fabric-api) >= 0.154.0 + +## Documentation + +| Language | Links | +|----------|-------| +| English | [README](docs/README.md) · [Changelog](docs/CHANGELOG.md) · [Contributing](docs/CONTRIBUTING.md) · [Security](docs/SECURITY.md) | +| 中文 | [自述](docs/README_zh.md) · [更新日志](docs/CHANGELOG_zh.md) · [贡献指南](docs/CONTRIBUTING_zh.md) · [安全政策](docs/SECURITY_zh.md) | + +## License + +[MIT](LICENSE) diff --git a/build.gradle.kts b/build.gradle.kts index 7a76585..bc45731 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,9 +39,14 @@ java { } tasks.processResources { - val version = project.version - inputs.property("version", version) + val modVersion = project.property("mod_version") as String + val packFormat = project.property("pack_format") as String + inputs.property("version", modVersion) + inputs.property("pack_format", packFormat) filesMatching("fabric.mod.json") { - expand("version" to version) + expand("version" to modVersion) + } + filesMatching("pack.mcmeta") { + expand("pack_format" to packFormat) } } diff --git a/gradle.properties b/gradle.properties index 25dd7bb..c5b5763 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,10 @@ loom_version=1.17-SNAPSHOT mod_version=0.1.0 maven_group=me.github.minecraft269 +# Resource pack format values per MC version: +# 1.18.2=8 1.20.1=15 1.21.1=34 26.2=88 +pack_format=88 + # Dependencies fabric_api_version=0.154.0+26.2 malilib_version=0.29.3 diff --git a/src/main/java/me/github/minecraft269/infinitelyprinter/InitHandler.java b/src/main/java/me/github/minecraft269/infinitelyprinter/InitHandler.java index 00dad59..87f73f8 100644 --- a/src/main/java/me/github/minecraft269/infinitelyprinter/InitHandler.java +++ b/src/main/java/me/github/minecraft269/infinitelyprinter/InitHandler.java @@ -5,10 +5,8 @@ import fi.dy.masa.malilib.config.ConfigManager; import fi.dy.masa.malilib.interfaces.IInitializationHandler; import fi.dy.masa.malilib.registry.Registry; -import fi.dy.masa.malilib.util.data.ModInfo; import fi.dy.masa.malilib.util.i18n.i18nMode; import me.github.minecraft269.infinitelyprinter.config.Config; -import me.github.minecraft269.infinitelyprinter.config.ConfigGui; public class InitHandler implements IInitializationHandler { @@ -16,9 +14,6 @@ public class InitHandler implements IInitializationHandler public void registerModHandlers() { ConfigManager.getInstance().registerConfigHandler(Reference.MOD_ID, new Config()); - Registry.CONFIG_SCREEN.registerConfigScreenFactory( - new ModInfo(Reference.MOD_ID, Reference.MOD_NAME, ConfigGui::new) - ); Config.LANG.ifPresent(manager -> { Registry.TRANSLATION_OVERRIDE_MANAGER.registerTranslationManager(Reference.MOD_ID, manager, i18nMode.FOLLOW_VANILLA); // Follow the game's current language (translation keys resolve to readable text) diff --git a/src/main/java/me/github/minecraft269/infinitelyprinter/Reference.java b/src/main/java/me/github/minecraft269/infinitelyprinter/Reference.java index 28de0b9..d9c4325 100644 --- a/src/main/java/me/github/minecraft269/infinitelyprinter/Reference.java +++ b/src/main/java/me/github/minecraft269/infinitelyprinter/Reference.java @@ -1,8 +1,21 @@ package me.github.minecraft269.infinitelyprinter; +import net.fabricmc.loader.api.FabricLoader; + public class Reference { public static final String MOD_ID = "infinitely-printer"; public static final String MOD_NAME = "Infinitely Printer"; - public static final String MOD_VERSION = "0.1.0"; + + /** + * Returns the mod version from fabric.mod.json at runtime. + * The version is injected by Gradle's processResources task during build. + */ + public static String getModVersion() + { + return FabricLoader.getInstance() + .getModContainer(MOD_ID) + .map(c -> c.getMetadata().getVersion().getFriendlyString()) + .orElse("0.1.0"); // fallback for dev environments + } } diff --git a/src/main/java/me/github/minecraft269/infinitelyprinter/config/Config.java b/src/main/java/me/github/minecraft269/infinitelyprinter/config/Config.java index 46a1b3d..8b9d390 100644 --- a/src/main/java/me/github/minecraft269/infinitelyprinter/config/Config.java +++ b/src/main/java/me/github/minecraft269/infinitelyprinter/config/Config.java @@ -29,7 +29,6 @@ public static void loadFromFile() JsonObject root = element.getAsJsonObject(); ConfigUtils.readConfigBase(root, "Printer", PrinterConfig.OPTIONS); - ConfigUtils.readConfigBase(root, "PrinterHotkeys", PrinterConfig.HOTKEY_LIST); ConfigUtils.readConfigBase(root, "Bedrock", BedrockConfig.OPTIONS); ConfigUtils.readConfigBase(root, "Replacement", ReplacementConfig.OPTIONS); ConfigUtils.readConfigBase(root, "Cruise", CruiseConfig.OPTIONS); @@ -48,7 +47,6 @@ public static void saveToFile() JsonObject root = new JsonObject(); ConfigUtils.writeConfigBase(root, "Printer", PrinterConfig.OPTIONS); - ConfigUtils.writeConfigBase(root, "PrinterHotkeys", PrinterConfig.HOTKEY_LIST); ConfigUtils.writeConfigBase(root, "Bedrock", BedrockConfig.OPTIONS); ConfigUtils.writeConfigBase(root, "Replacement", ReplacementConfig.OPTIONS); ConfigUtils.writeConfigBase(root, "Cruise", CruiseConfig.OPTIONS); diff --git a/src/main/java/me/github/minecraft269/infinitelyprinter/config/ConfigGui.java b/src/main/java/me/github/minecraft269/infinitelyprinter/config/ConfigGui.java index 0f6daf5..a3b33f6 100644 --- a/src/main/java/me/github/minecraft269/infinitelyprinter/config/ConfigGui.java +++ b/src/main/java/me/github/minecraft269/infinitelyprinter/config/ConfigGui.java @@ -1,15 +1,13 @@ package me.github.minecraft269.infinitelyprinter.config; -import java.util.ArrayList; import java.util.List; import fi.dy.masa.malilib.config.IConfigBase; import fi.dy.masa.malilib.gui.GuiConfigsBase; import fi.dy.masa.malilib.gui.button.ButtonGeneric; -import fi.dy.masa.malilib.gui.interfaces.IConfigGuiAllTab; import fi.dy.masa.malilib.util.StringUtils; -public class ConfigGui extends GuiConfigsBase implements IConfigGuiAllTab +public class ConfigGui extends GuiConfigsBase { private static ConfigCategory currentCategory = ConfigCategory.PRINTER; @@ -24,25 +22,6 @@ public List getConfigs() return ConfigOptionWrapper.createFor(currentCategory.getOptions()); } - @Override - public boolean useAllTab() - { - return true; - } - - @Override - public List getAllConfigs() - { - List wrappers = new ArrayList<>(); - - for (ConfigCategory category : ConfigCategory.values()) - { - wrappers.addAll(ConfigOptionWrapper.createFor(category.getOptions())); - } - - return wrappers; - } - @Override public void initGui() { diff --git a/src/main/java/me/github/minecraft269/infinitelyprinter/config/PrinterConfig.java b/src/main/java/me/github/minecraft269/infinitelyprinter/config/PrinterConfig.java index ab0b6ab..fa05d3f 100644 --- a/src/main/java/me/github/minecraft269/infinitelyprinter/config/PrinterConfig.java +++ b/src/main/java/me/github/minecraft269/infinitelyprinter/config/PrinterConfig.java @@ -1,10 +1,8 @@ package me.github.minecraft269.infinitelyprinter.config; -import java.util.List; import com.google.common.collect.ImmutableList; import fi.dy.masa.malilib.config.IConfigBase; import fi.dy.masa.malilib.config.options.*; -import fi.dy.masa.malilib.hotkeys.IHotkey; public final class PrinterConfig { @@ -32,5 +30,4 @@ public final class PrinterConfig AUTO_MATERIAL, USE_SHULKER, PREVENT_BREAKING, EASY_PLACE_MODE, SWING_HAND ); - public static final List HOTKEY_LIST = List.of(PRINTER_ENABLED, PRINT_WHILE_HOLDING); } diff --git a/src/main/java/me/github/minecraft269/infinitelyprinter/util/WorldUtils.java b/src/main/java/me/github/minecraft269/infinitelyprinter/util/WorldUtils.java index a8ade7d..8a16734 100644 --- a/src/main/java/me/github/minecraft269/infinitelyprinter/util/WorldUtils.java +++ b/src/main/java/me/github/minecraft269/infinitelyprinter/util/WorldUtils.java @@ -11,7 +11,7 @@ public static BlockState getBlockState(BlockPos pos) { } public static boolean isReplaceable(BlockPos pos) { BlockState state = getBlockState(pos); - return state != null && (state.isAir() || state.isAir()); + return state != null && (state.isAir() || state.canBeReplaced()); } public static double distanceTo(BlockPos pos) { if (client.player == null) return Double.MAX_VALUE; diff --git a/src/main/resources/assets/infinitely-printer/lang/en_us.json b/src/main/resources/assets/infinitely-printer/lang/en_us.json index 017bd43..c8f5756 100644 --- a/src/main/resources/assets/infinitely-printer/lang/en_us.json +++ b/src/main/resources/assets/infinitely-printer/lang/en_us.json @@ -11,105 +11,105 @@ "infinitely-printer.config.category.anticheat": "Anti-Cheat", "infinitely-printer.config.category.void": "Void Mode", "infinitely-printer.config.printer.name.printerEnabled": "Printer Enabled", - "infinitely-printer.config.printer.comment.printerEnabled": "Master toggle for the printer", + "infinitely-printer.config.printer.comment.printerEnabled": "Master toggle for the printer. When enabled and the hotkey is held, blocks from the active Litematica schematic will be automatically placed in the world. Disable to stop all automatic block placement.", "infinitely-printer.config.printer.name.printWhileHolding": "Print While Holding", - "infinitely-printer.config.printer.comment.printWhileHolding": "Print while holding the configured key", + "infinitely-printer.config.printer.comment.printWhileHolding": "If enabled, the printer only activates while the configured hotkey is held down. When disabled, the printer toggles on/off with each key press. Useful for precise control over when printing occurs.", "infinitely-printer.config.printer.name.printInterval": "Print Interval", - "infinitely-printer.config.printer.comment.printInterval": "Game ticks between block placements", + "infinitely-printer.config.printer.comment.printInterval": "Number of game ticks (1/20 second) between each block placement. Lower values place blocks faster but may trigger anti-cheat detection on servers. Default: 2 ticks (10 blocks/second).", "infinitely-printer.config.printer.name.printRange": "Print Range", - "infinitely-printer.config.printer.comment.printRange": "Max block placement distance", + "infinitely-printer.config.printer.comment.printRange": "Maximum distance in blocks from the player at which blocks can be placed. Larger values cover more area but require the player to have enough reach distance. Default: 4 blocks (matches vanilla creative reach).", "infinitely-printer.config.printer.name.printYOffset": "Print Y Offset", - "infinitely-printer.config.printer.comment.printYOffset": "Vertical offset from the player", + "infinitely-printer.config.printer.comment.printYOffset": "Vertical offset from the player's eye level for block placement scanning. Positive values scan above the player, negative below. Useful for building tall structures or digging foundations without moving.", "infinitely-printer.config.printer.name.accuratePlacement": "Accurate Placement", - "infinitely-printer.config.printer.comment.accuratePlacement": "Use carpet-extra accurate placement protocol", + "infinitely-printer.config.printer.comment.accuratePlacement": "Use the carpet-extra accurate placement protocol for block placement. This sends precise click position data within the block, improving compatibility with anti-cheat plugins and server-side block logging. Requires carpet-extra on the server to function; disable on vanilla servers.", "infinitely-printer.config.printer.name.fakeRotation": "Fake Rotation", - "infinitely-printer.config.printer.comment.fakeRotation": "Simulate rotation for directional blocks", + "infinitely-printer.config.printer.comment.fakeRotation": "Simulate player rotation when placing directional blocks (stairs, pistons, observers, etc.). When enabled, the mod sends a different look direction to the server to orient blocks correctly without the player physically turning. Disable if the server checks for impossible rotations.", "infinitely-printer.config.printer.name.checkFace": "Check Face", - "infinitely-printer.config.printer.comment.checkFace": "Verify the face can be clicked", + "infinitely-printer.config.printer.comment.checkFace": "Verify that the target block face is valid and clickable before sending a placement packet. Prevents failed placements against invalid surfaces. Recommended to keep enabled for reliability.", "infinitely-printer.config.printer.name.checkLineOfSight": "Check Line of Sight", - "infinitely-printer.config.printer.comment.checkLineOfSight": "Require line of sight for placement", + "infinitely-printer.config.printer.comment.checkLineOfSight": "Require a clear line of sight from the player to the placement position. When enabled, blocks behind walls or obstacles will not be placed. Disable to place through walls, but this may look suspicious on some servers.", "infinitely-printer.config.printer.name.autoMaterialSupply": "Auto Material Supply", - "infinitely-printer.config.printer.comment.autoMaterialSupply": "Auto supply materials from inventory", + "infinitely-printer.config.printer.comment.autoMaterialSupply": "Automatically move required materials from the inventory into the hotbar when needed. Searches the entire inventory (36 slots) for matching blocks. Hotbar slots are prioritized when selecting which slot to use.", "infinitely-printer.config.printer.name.useShulkerBoxes": "Use Shulker Boxes", - "infinitely-printer.config.printer.comment.useShulkerBoxes": "Pull materials from shulker boxes", + "infinitely-printer.config.printer.comment.useShulkerBoxes": "Allow the printer to extract materials from shulker boxes in the inventory. When enabled, the printer opens shulker boxes to access their contents. Requires Quick Shulker functionality to be available.", "infinitely-printer.config.printer.name.preventBreaking": "Prevent Breaking", - "infinitely-printer.config.printer.comment.preventBreaking": "Don't break existing schematic blocks", + "infinitely-printer.config.printer.comment.preventBreaking": "When enabled, the printer will not replace blocks that already match the schematic. This prevents accidental destruction of correctly placed blocks and reduces unnecessary block updates and network traffic.", "infinitely-printer.config.printer.name.easyPlaceMode": "Easy Place Mode", - "infinitely-printer.config.printer.comment.easyPlaceMode": "Easy place mode compatibility", + "infinitely-printer.config.printer.comment.easyPlaceMode": "Compatibility with easy place mode for directional block placement. When enabled, the printer handles blocks like doors, beds, and stairs in a way that respects easyPlaceMode conventions. Enable if you also use easy place features.", "infinitely-printer.config.printer.name.swingHand": "Swing Hand", - "infinitely-printer.config.printer.comment.swingHand": "Swing hand on placement", + "infinitely-printer.config.printer.comment.swingHand": "Play the hand-swinging animation on the player's client when placing a block. Disabling this reduces visual noise but may make the printer less noticeable. Enabling it looks more natural to other players.", "infinitely-printer.config.bedrock.name.bedrockEnabled": "Bedrock Breaking", - "infinitely-printer.config.bedrock.comment.bedrockEnabled": "Toggle bedrock breaking", + "infinitely-printer.config.bedrock.comment.bedrockEnabled": "Toggle the standalone bedrock breaking feature. When enabled and the hotkey is pressed, the mod automatically places pistons and activates them to break bedrock blocks. Operates independently from the main printer.", "infinitely-printer.config.bedrock.name.direction": "Direction", - "infinitely-printer.config.bedrock.comment.direction": "Breaking direction (ALL / one face)", - "infinitely-printer.config.bedrock.direction.all": "All", - "infinitely-printer.config.bedrock.direction.up": "Up", - "infinitely-printer.config.bedrock.direction.down": "Down", - "infinitely-printer.config.bedrock.direction.north": "North", - "infinitely-printer.config.bedrock.direction.south": "South", - "infinitely-printer.config.bedrock.direction.east": "East", - "infinitely-printer.config.bedrock.direction.west": "West", + "infinitely-printer.config.bedrock.comment.direction": "Which direction(s) to break bedrock from. 'All' attempts all 6 faces in sequence. Single-face options only break from that specific side. Use single-face when breaking bedrock near sensitive blocks or at world borders.", "infinitely-printer.config.bedrock.name.method": "Method", - "infinitely-printer.config.bedrock.comment.method": "Redstone torch or lever scheme", - "infinitely-printer.config.bedrock.method.redstone_torch": "Redstone Torch", - "infinitely-printer.config.bedrock.method.lever": "Lever", + "infinitely-printer.config.bedrock.comment.method": "The activation mechanism for breaking bedrock. 'Redstone Torch' places a torch to power the piston. 'Lever' places and flips a lever instead. Torch method is faster but lever method may work on servers that block torch-based breaking.", "infinitely-printer.config.bedrock.name.delayMs": "Delay (ms)", - "infinitely-printer.config.bedrock.comment.delayMs": "Delay between breaking steps (ms)", + "infinitely-printer.config.bedrock.comment.delayMs": "Delay in milliseconds between each step of the bedrock breaking sequence (place piston, place activator, etc.). Lower values are faster but may fail on laggy servers. Default: 50ms.", "infinitely-printer.config.bedrock.name.noBeacon": "No Beacon", - "infinitely-printer.config.bedrock.comment.noBeacon": "Break bedrock without a beacon", + "infinitely-printer.config.bedrock.comment.noBeacon": "Break bedrock without requiring a beacon. When enabled, bypasses the haste beacon requirement for bedrock mining. Only works on servers that do not strictly enforce haste requirements.", "infinitely-printer.config.replace.name.replaceFluids": "Replace Fluids", - "infinitely-printer.config.replace.comment.replaceFluids": "Replace water/lava before placing", + "infinitely-printer.config.replace.comment.replaceFluids": "Automatically remove water and lava source blocks before placing schematic blocks. When disabled, fluid blocks will prevent placement. Recommended to enable for underwater or nether building.", "infinitely-printer.config.replace.name.replaceWaterlogged": "Replace Waterlogged", - "infinitely-printer.config.replace.comment.replaceWaterlogged": "Remove waterlogging from blocks", + "infinitely-printer.config.replace.comment.replaceWaterlogged": "Remove the waterlogged state from blocks (like stairs, slabs, fences) before placing new blocks. This ensures the correct block state is achieved. Enable when building underwater structures.", "infinitely-printer.config.replace.name.replaceGlowLichen": "Replace Glow Lichen", - "infinitely-printer.config.replace.comment.replaceGlowLichen": "Remove glow lichen before placing", + "infinitely-printer.config.replace.comment.replaceGlowLichen": "Remove glow lichen from block faces before placing schematic blocks. Glow lichen occupies block faces without filling the block, so it can interfere with placement. Enable when building in caves or lush areas.", "infinitely-printer.config.replace.name.replaceSeagrass": "Replace Seagrass", - "infinitely-printer.config.replace.comment.replaceSeagrass": "Remove seagrass before placing", + "infinitely-printer.config.replace.comment.replaceSeagrass": "Remove seagrass and tall seagrass before placing blocks underwater. These water plants are non-solid but still count as occupied positions in some placement checks.", "infinitely-printer.config.replace.name.weedEnabled": "Weed Enabled", - "infinitely-printer.config.replace.comment.weedEnabled": "Toggle weed clearing mode", + "infinitely-printer.config.replace.comment.weedEnabled": "Toggle the weed clearing feature. When enabled, the printer removes small plants (grass, flowers, ferns, mushrooms, snow layers, pale moss) from placement positions before placing schematic blocks. Keeps builds clean without manual clearing.", "infinitely-printer.config.cruise.name.cruiseEnabled": "Cruise Enabled", - "infinitely-printer.config.cruise.comment.cruiseEnabled": "Auto-move to next build position", + "infinitely-printer.config.cruise.comment.cruiseEnabled": "Toggle the cruise feature. When enabled, the player automatically moves to the next unbuilt schematic position. Works independently from the printer — you can cruise without printing and print without cruising.", "infinitely-printer.config.cruise.name.searchRadius": "Search Radius", - "infinitely-printer.config.cruise.comment.searchRadius": "Search radius for next position", + "infinitely-printer.config.cruise.comment.searchRadius": "How far (in blocks) to search for the next unbuilt schematic position. Larger values find more distant build sites but may impact performance. Range: 16–256 blocks.", "infinitely-printer.config.cruise.name.baritoneLink": "Baritone Link", - "infinitely-printer.config.cruise.comment.baritoneLink": "Use Baritone for pathfinding", + "infinitely-printer.config.cruise.comment.baritoneLink": "Use Baritone for advanced pathfinding when moving between build positions. When disabled, uses a simple direct-movement approach. Baritone provides smarter pathfinding (avoiding lava, navigating obstacles) but requires the Baritone mod to be installed.", "infinitely-printer.config.dnd.name.dndEnabled": "Do Not Disturb Enabled", - "infinitely-printer.config.dnd.comment.dndEnabled": "Handle nearby hostile mobs", + "infinitely-printer.config.dnd.comment.dndEnabled": "Toggle the Do Not Disturb mode. When enabled, the printer monitors for hostile mobs within an 8-block radius and responds according to the configured strategy. Helps protect the player during automated building.", "infinitely-printer.config.dnd.name.strategy": "Strategy", - "infinitely-printer.config.dnd.comment.strategy": "Avoid / kill / ignore strategy", - "infinitely-printer.config.dnd.strategy.avoid": "Avoid", - "infinitely-printer.config.dnd.strategy.kill": "Kill", - "infinitely-printer.config.dnd.strategy.ignore": "Ignore", + "infinitely-printer.config.dnd.comment.strategy": "How to handle nearby hostile mobs during printing. 'Avoid' moves the player away from mobs. 'Kill' automatically attacks them. 'Ignore' continues printing regardless of nearby danger. Choose Avoid or Kill on survival servers; Ignore is safe in creative or peaceful mode.", "infinitely-printer.config.remote.name.remoteEnabled": "Remote Inventory Enabled", - "infinitely-printer.config.remote.comment.remoteEnabled": "Use remote containers for materials", + "infinitely-printer.config.remote.comment.remoteEnabled": "Enable access to remote container inventories for material supply. When enabled, the printer can scan nearby chests, barrels, shulker boxes, and other containers to find needed building materials. Useful for large builds where inventory space is limited.", "infinitely-printer.config.remote.name.scanRange": "Scan Range", - "infinitely-printer.config.remote.comment.scanRange": "Container scan range", + "infinitely-printer.config.remote.comment.scanRange": "Maximum distance (in blocks) to scan for remote containers. Larger ranges access more containers but may cause server lag due to increased network requests. Range: 4–64 blocks.", "infinitely-printer.config.remote.name.fifoReturn": "FIFO Return", - "infinitely-printer.config.remote.comment.fifoReturn": "Return items in FIFO order", + "infinitely-printer.config.remote.comment.fifoReturn": "Return unused items to their original containers in First-In-First-Out order. When disabled, items are returned to the nearest available container. FIFO ensures items go back where they came from, maintaining organized storage.", "infinitely-printer.config.range.name.reachMultiplier": "Reach Multiplier", - "infinitely-printer.config.range.comment.reachMultiplier": "Reach multiplier for auto operations", + "infinitely-printer.config.range.comment.reachMultiplier": "Multiplier applied to the player's reach distance during automatic operations. At 1.0x, uses vanilla reach (4.5 blocks). Higher values place blocks further away. Only effective during automatic operations when 'Auto Operation Only' is enabled. Use with caution on servers that check reach distance. Range: 1.0–5.0x.", "infinitely-printer.config.range.name.autoOperationOnly": "Auto Operation Only", - "infinitely-printer.config.range.comment.autoOperationOnly": "Only extend reach during auto operations", + "infinitely-printer.config.range.comment.autoOperationOnly": "When enabled, the reach extension only applies during automatic printer operations. Manual block placement uses vanilla reach distance. This prevents accidental detection and keeps normal gameplay unaffected. Strongly recommended to keep enabled.", "infinitely-printer.config.void.name.voidEnabled": "Void Mode Enabled", - "infinitely-printer.config.void.comment.voidEnabled": "Toggle void/perimeter excavation mode", + "infinitely-printer.config.void.comment.voidEnabled": "Toggle the void/perimeter excavation mode. When enabled, the printer will excavate large areas down to the target Y level for creating perimeters, void worlds, or large-scale terraforming. The excavation area is defined by the chunk size setting.", "infinitely-printer.config.void.name.chunkSize": "Chunk Size", - "infinitely-printer.config.void.comment.chunkSize": "Void size in chunks (17 = standard perimeter)", + "infinitely-printer.config.void.comment.chunkSize": "The size of the excavation area in chunks (16 blocks per chunk). A value of 17 creates a standard 272×272 block perimeter. Larger values require significantly more time and resources. Range: 1–33 chunks.", "infinitely-printer.config.void.name.excavationY": "Excavation Y", - "infinitely-printer.config.void.comment.excavationY": "Target excavation Y level", + "infinitely-printer.config.void.comment.excavationY": "The target Y level to excavate down to. Blocks above this level within the defined area will be removed. Set to just above bedrock (Y=-60 to Y=-64 typically) for a full perimeter. Range: -64 to 320.", "infinitely-printer.config.void.name.excavateToBedrock": "Excavate to Bedrock", - "infinitely-printer.config.void.comment.excavateToBedrock": "Excavate down to bedrock", + "infinitely-printer.config.void.comment.excavateToBedrock": "When enabled, excavates all the way down to bedrock regardless of the Excavation Y setting. This is useful for creating void perimeters where you want the lowest possible exposure. Overrides the Excavation Y value.", "infinitely-printer.config.void.name.autoCenter": "Auto Center", - "infinitely-printer.config.void.comment.autoCenter": "Auto-center on the player", + "infinitely-printer.config.void.comment.autoCenter": "Automatically center the excavation area on the player's current position. When disabled, you can manually specify the center coordinates. Auto-centering is convenient for most use cases.", "infinitely-printer.config.anticheat.name.sendMode": "Send Mode", - "infinitely-printer.config.anticheat.comment.sendMode": "Packet send mode for anti-cheat", + "infinitely-printer.config.anticheat.comment.sendMode": "Controls how block placement packets are sent to the server. 'Normal' sends immediately with no modifications. 'Rotated' adds rotation data to packets. 'Delayed' adds random timing delays between placements. 'Randomized' combines rotation and delay for maximum anti-detection. Choose based on server anti-cheat strictness.", + "infinitely-printer.config.anticheat.name.delayMin": "Min Delay", + "infinitely-printer.config.anticheat.comment.delayMin": "Minimum random delay in milliseconds between placement packets when using Delayed or Randomized send modes. The actual delay will be a random value between Min Delay and Max Delay. Lower values are faster but more detectable.", + "infinitely-printer.config.anticheat.name.delayMax": "Max Delay", + "infinitely-printer.config.anticheat.comment.delayMax": "Maximum random delay in milliseconds between placement packets when using Delayed or Randomized send modes. Must be >= Min Delay. Higher values are safer but slower.", + "infinitely-printer.config.anticheat.name.randomizeAngle": "Randomize Angle", + "infinitely-printer.config.anticheat.comment.randomizeAngle": "Add a small random offset to the player's reported look angle when placing blocks. This makes automated placement look more human-like by introducing natural-looking variance. Recommended for servers with anti-cheat plugins.", + "infinitely-printer.config.dnd.strategy.avoid": "Avoid", + "infinitely-printer.config.dnd.strategy.kill": "Kill", + "infinitely-printer.config.dnd.strategy.ignore": "Ignore", "infinitely-printer.config.anticheat.sendMode.normal": "Normal", "infinitely-printer.config.anticheat.sendMode.rotated": "Rotated", "infinitely-printer.config.anticheat.sendMode.delayed": "Delayed", "infinitely-printer.config.anticheat.sendMode.randomized": "Randomized", - "infinitely-printer.config.anticheat.name.delayMin": "Min Delay", - "infinitely-printer.config.anticheat.comment.delayMin": "Minimum random delay (ms)", - "infinitely-printer.config.anticheat.name.delayMax": "Max Delay", - "infinitely-printer.config.anticheat.comment.delayMax": "Maximum random delay (ms)", - "infinitely-printer.config.anticheat.name.randomizeAngle": "Randomize Angle", - "infinitely-printer.config.anticheat.comment.randomizeAngle": "Randomize look angle on placement" + "infinitely-printer.config.bedrock.direction.all": "All", + "infinitely-printer.config.bedrock.direction.up": "Up", + "infinitely-printer.config.bedrock.direction.down": "Down", + "infinitely-printer.config.bedrock.direction.north": "North", + "infinitely-printer.config.bedrock.direction.south": "South", + "infinitely-printer.config.bedrock.direction.east": "East", + "infinitely-printer.config.bedrock.direction.west": "West", + "infinitely-printer.config.bedrock.method.redstone_torch": "Redstone Torch", + "infinitely-printer.config.bedrock.method.lever": "Lever" } diff --git a/src/main/resources/assets/infinitely-printer/lang/zh_cn.json b/src/main/resources/assets/infinitely-printer/lang/zh_cn.json index bc2c261..cd81afe 100644 --- a/src/main/resources/assets/infinitely-printer/lang/zh_cn.json +++ b/src/main/resources/assets/infinitely-printer/lang/zh_cn.json @@ -11,91 +11,91 @@ "infinitely-printer.config.category.anticheat": "反作弊", "infinitely-printer.config.category.void": "空置域", "infinitely-printer.config.printer.name.printerEnabled": "打印机启用", - "infinitely-printer.config.printer.comment.printerEnabled": "打印机总开关", + "infinitely-printer.config.printer.comment.printerEnabled": "打印机总开关。启用后按住热键,将自动放置当前 Litematica 投影中的方块。关闭可停止所有自动放置操作。", "infinitely-printer.config.printer.name.printWhileHolding": "按住时打印", - "infinitely-printer.config.printer.comment.printWhileHolding": "按住指定按键时打印", + "infinitely-printer.config.printer.comment.printWhileHolding": "启用后,仅在按住配置的快捷键时打印机才会工作。关闭后,每次按键将在开启/关闭之间切换。适合需要精确控制打印时机的场景。", "infinitely-printer.config.printer.name.printInterval": "打印间隔", - "infinitely-printer.config.printer.comment.printInterval": "放置方块之间的游戏刻间隔", + "infinitely-printer.config.printer.comment.printInterval": "每次放置方块之间的游戏刻间隔(1 刻 = 1/20 秒)。值越小放置越快,但可能触发服务器反作弊检测。默认:2 刻(每秒约 10 个方块)。", "infinitely-printer.config.printer.name.printRange": "打印范围", - "infinitely-printer.config.printer.comment.printRange": "最大放置距离", + "infinitely-printer.config.printer.comment.printRange": "以玩家为中心的最大放置距离(格)。范围越大覆盖越广,但需要玩家有足够的触达距离。默认:4 格(匹配原版创造模式触达距离)。", "infinitely-printer.config.printer.name.printYOffset": "打印高度偏移", - "infinitely-printer.config.printer.comment.printYOffset": "相对玩家的垂直偏移", + "infinitely-printer.config.printer.comment.printYOffset": "以玩家眼睛高度为基准的垂直偏移。正值向上扫描,负值向下扫描。适合在不移动的情况下建造高层结构或挖掘地基。", "infinitely-printer.config.printer.name.accuratePlacement": "精准放置", - "infinitely-printer.config.printer.comment.accuratePlacement": "使用地毯扩展精确放置协议", + "infinitely-printer.config.printer.comment.accuratePlacement": "使用地毯扩展(carpet-extra)精确放置协议。在方块内发送精确的点击位置数据,提升与反作弊插件及服务端方块日志的兼容性。需要服务端安装 carpet-extra 才能生效;原版服务器请关闭。", "infinitely-printer.config.printer.name.fakeRotation": "假旋转", - "infinitely-printer.config.printer.comment.fakeRotation": "模拟旋转以放置方向性方块", + "infinitely-printer.config.printer.comment.fakeRotation": "放置方向性方块(楼梯、活塞、侦测器等)时模拟玩家朝向。启用后将向服务器发送不同于实际视角的方向数据,使方块朝向正确而无需玩家真正转身。如服务器检测不可能的旋转角度,请关闭此选项。", "infinitely-printer.config.printer.name.checkFace": "检查方块面", - "infinitely-printer.config.printer.comment.checkFace": "验证点击的面是否可用", + "infinitely-printer.config.printer.comment.checkFace": "在发送放置包之前验证目标方块面是否有效且可点击。防止对无效面的失败放置。建议保持启用以确保可靠性。", "infinitely-printer.config.printer.name.checkLineOfSight": "检查视线", - "infinitely-printer.config.printer.comment.checkLineOfSight": "要求视线通畅才能放置", + "infinitely-printer.config.printer.comment.checkLineOfSight": "要求玩家到放置位置之间有清晰的视线。启用时,墙后或障碍物后的方块不会放置。关闭可穿墙放置,但在某些服务器上可能显得可疑。", "infinitely-printer.config.printer.name.autoMaterialSupply": "自动补充材料", - "infinitely-printer.config.printer.comment.autoMaterialSupply": "自动从背包供应材料", + "infinitely-printer.config.printer.comment.autoMaterialSupply": "自动将背包中所需材料移动到快捷栏中。搜索整个背包(36 格)寻找匹配的方块。优先使用快捷栏中已有的材料,不足时从背包补货。", "infinitely-printer.config.printer.name.useShulkerBoxes": "使用潜影盒", - "infinitely-printer.config.printer.comment.useShulkerBoxes": "从潜影盒中提取材料", + "infinitely-printer.config.printer.comment.useShulkerBoxes": "允许打印机从背包中的潜影盒内提取材料。启用后,打印机将打开潜影盒获取内容物。需要快捷潜影盒功能可用。", "infinitely-printer.config.printer.name.preventBreaking": "防止破坏", - "infinitely-printer.config.printer.comment.preventBreaking": "不破坏已存在的投影方块", + "infinitely-printer.config.printer.comment.preventBreaking": "启用后,打印机不会替换已与投影匹配的方块。防止意外破坏已正确放置的方块,减少不必要的方块更新和网络流量。", "infinitely-printer.config.printer.name.easyPlaceMode": "简单放置模式", - "infinitely-printer.config.printer.comment.easyPlaceMode": "兼容简单放置模式", + "infinitely-printer.config.printer.comment.easyPlaceMode": "兼容简单放置模式的方向性方块处理。启用后,打印机以符合 easyPlaceMode 规范的方式处理门、床、楼梯等方块。如果你同时使用简单放置功能,建议启用。", "infinitely-printer.config.printer.name.swingHand": "摆动手臂", - "infinitely-printer.config.printer.comment.swingHand": "放置时挥动手臂", + "infinitely-printer.config.printer.comment.swingHand": "放置方块时在客户端播放挥臂动画。关闭可减少视觉干扰但可能使打印机更不自然。开启对其他玩家来说看起来更正常。", "infinitely-printer.config.bedrock.name.bedrockEnabled": "破基岩启用", - "infinitely-printer.config.bedrock.comment.bedrockEnabled": "破基岩总开关", + "infinitely-printer.config.bedrock.comment.bedrockEnabled": "独立的破基岩功能开关。启用后(且按下热键),模组将自动放置活塞并激活以破坏基岩方块。独立于主打印机运行。", "infinitely-printer.config.bedrock.name.direction": "方向", - "infinitely-printer.config.bedrock.comment.direction": "破坏方向(全向/单面)", + "infinitely-printer.config.bedrock.comment.direction": "从哪个方向破基岩。「全向」按顺序尝试全部 6 个面。单面选项仅从指定面破坏。在靠近敏感方块或世界边界时使用单面模式。", "infinitely-printer.config.bedrock.name.method": "方法", - "infinitely-printer.config.bedrock.comment.method": "红石火把或拉杆方案", + "infinitely-printer.config.bedrock.comment.method": "破基岩的激活方式。「红石火把」放置火把为活塞充能。「拉杆」放置并扳动拉杆。火把方案更快,但拉杆方案可能在某些禁止火把破基岩的服务器上有效。", "infinitely-printer.config.bedrock.name.delayMs": "延迟(毫秒)", - "infinitely-printer.config.bedrock.comment.delayMs": "破坏步骤间隔(毫秒)", + "infinitely-printer.config.bedrock.comment.delayMs": "破基岩序列中每步之间的延迟(毫秒)。值越小越快,但可能在高延迟服务器上失败。默认:50 毫秒。", "infinitely-printer.config.bedrock.name.noBeacon": "无信标", - "infinitely-printer.config.bedrock.comment.noBeacon": "无需信标破基岩", + "infinitely-printer.config.bedrock.comment.noBeacon": "无需信标即可破基岩。启用后,绕过基岩挖掘所需的急迫信标要求。仅在未严格强制急迫要求的服务器上有效。该功能可能在某些服务器上是违规行为。", "infinitely-printer.config.replace.name.replaceFluids": "替换流体", - "infinitely-printer.config.replace.comment.replaceFluids": "放置前替换水/岩浆", + "infinitely-printer.config.replace.comment.replaceFluids": "放置投影方块前自动移除水和岩浆源方块。关闭后,流体方块会阻止放置。建议在水下或下界建造时启用。", "infinitely-printer.config.replace.name.replaceWaterlogged": "替换含水方块", - "infinitely-printer.config.replace.comment.replaceWaterlogged": "移除方块中的含水状态", + "infinitely-printer.config.replace.comment.replaceWaterlogged": "放置新方块前移除方块中的含水状态(如含水楼梯、台阶、栅栏等)。确保方块状态正确。在水下结构建造时启用。", "infinitely-printer.config.replace.name.replaceGlowLichen": "替换发光地衣", - "infinitely-printer.config.replace.comment.replaceGlowLichen": "放置前移除发光地衣", + "infinitely-printer.config.replace.comment.replaceGlowLichen": "放置投影方块前移除附着在方块面上的发光地衣。发光地衣占用方块面而不填充整个方块,可能干扰放置。在洞穴或繁茂区域建造时启用。", "infinitely-printer.config.replace.name.replaceSeagrass": "替换海草", - "infinitely-printer.config.replace.comment.replaceSeagrass": "放置前移除海草", + "infinitely-printer.config.replace.comment.replaceSeagrass": "在水下放置方块前移除海草和高海草。这些水下植物为非固体方块,但在某些放置检查中仍视为占用位置。", "infinitely-printer.config.replace.name.weedEnabled": "清除杂草启用", - "infinitely-printer.config.replace.comment.weedEnabled": "除草模式开关", + "infinitely-printer.config.replace.comment.weedEnabled": "除草功能开关。启用后,打印机在放置投影方块前会移除放置位置的小型植物(草、花、蕨、蘑菇、雪层、苍白苔藓等)。无需手动清理即可保持建造区域干净。", "infinitely-printer.config.cruise.name.cruiseEnabled": "巡航启用", - "infinitely-printer.config.cruise.comment.cruiseEnabled": "自动移动到下一个建造位置", + "infinitely-printer.config.cruise.comment.cruiseEnabled": "巡航功能开关。启用后,玩家自动移动到下一个未建造的投影方块位置。独立于打印机运行——可以不打印只巡航,也可以不巡航只打印。", "infinitely-printer.config.cruise.name.searchRadius": "搜索半径", - "infinitely-printer.config.cruise.comment.searchRadius": "搜索下一个位置的半径", + "infinitely-printer.config.cruise.comment.searchRadius": "搜索下一个未建造投影位置的半径(格)。值越大可以找到更远的建造点,但可能影响性能。范围:16-256 格。", "infinitely-printer.config.cruise.name.baritoneLink": "Baritone 联动", - "infinitely-printer.config.cruise.comment.baritoneLink": "使用 Baritone 进行寻路", + "infinitely-printer.config.cruise.comment.baritoneLink": "使用 Baritone 进行建造位置间的高级寻路。关闭时使用简单的直线移动方式。Baritone 提供更智能的寻路(避开熔岩、绕过障碍物),但需要安装 Baritone 模组。", "infinitely-printer.config.dnd.name.dndEnabled": "勿扰模式启用", - "infinitely-printer.config.dnd.comment.dndEnabled": "处理附近的敌对生物", + "infinitely-printer.config.dnd.comment.dndEnabled": "勿扰模式开关。启用后,打印机监控 8 格半径内的敌对生物,并根据配置的策略做出响应。在自动建造时保护玩家安全。", "infinitely-printer.config.dnd.name.strategy": "策略", - "infinitely-printer.config.dnd.comment.strategy": "避开/击杀/忽略策略", + "infinitely-printer.config.dnd.comment.strategy": "打印时如何处理附近的敌对生物。「避开」将玩家从生物身边移走。「击杀」自动攻击生物。「忽略」无视附近危险继续打印。生存服务器上建议选择避开或击杀;创造或和平模式下可安全使用忽略。", "infinitely-printer.config.remote.name.remoteEnabled": "远程容器启用", - "infinitely-printer.config.remote.comment.remoteEnabled": "使用远程容器获取材料", + "infinitely-printer.config.remote.comment.remoteEnabled": "启用远程容器库存访问以补给材料。启用后,打印机可扫描附近的箱子、木桶、潜影盒等容器以找到所需的建造材料。适合背包空间有限的大型建造项目。", "infinitely-printer.config.remote.name.scanRange": "扫描范围", - "infinitely-printer.config.remote.comment.scanRange": "容器扫描范围", + "infinitely-printer.config.remote.comment.scanRange": "扫描远程容器的最大距离(格)。范围越大可访问的容器越多,但因网络请求增加可能导致服务器延迟。范围:4-64 格。", "infinitely-printer.config.remote.name.fifoReturn": "先进先出归还", - "infinitely-printer.config.remote.comment.fifoReturn": "按先进先出顺序归还物品", + "infinitely-printer.config.remote.comment.fifoReturn": "按先进先出顺序将未使用的物品归还至原容器。关闭时物品会归还到最近的可用容器。FIFO 确保物品回到原处,有利于保持储物分类的条理性。", "infinitely-printer.config.range.name.reachMultiplier": "触达倍数", - "infinitely-printer.config.range.comment.reachMultiplier": "自动操作的交互距离倍数", + "infinitely-printer.config.range.comment.reachMultiplier": "自动操作时玩家交互距离的倍数。1.0 倍使用原版距离(4.5 格)。值越大可越远放置方块。仅在启用「仅自动操作」时对自动操作生效。在检查触达距离的服务器上请谨慎使用。范围:1.0-5.0 倍。", "infinitely-printer.config.range.name.autoOperationOnly": "仅自动操作", - "infinitely-printer.config.range.comment.autoOperationOnly": "仅在自动操作时扩展交互距离", - "infinitely-printer.config.anticheat.name.sendMode": "发送模式", - "infinitely-printer.config.anticheat.comment.sendMode": "反作弊发包模式", - "infinitely-printer.config.anticheat.name.delayMin": "最小延迟", - "infinitely-printer.config.anticheat.comment.delayMin": "最小随机延迟(毫秒)", - "infinitely-printer.config.anticheat.name.delayMax": "最大延迟", - "infinitely-printer.config.anticheat.comment.delayMax": "最大随机延迟(毫秒)", - "infinitely-printer.config.anticheat.name.randomizeAngle": "随机角度", - "infinitely-printer.config.anticheat.comment.randomizeAngle": "放置时随机化视角角度", + "infinitely-printer.config.range.comment.autoOperationOnly": "启用后,触达距离扩展仅对打印机自动操作生效。手动放置方块仍使用原版触达距离。防止意外检测,保持正常游戏不受影响。强烈建议保持启用。", "infinitely-printer.config.void.name.voidEnabled": "空置域模式", + "infinitely-printer.config.void.comment.voidEnabled": "空置域/边境挖掘模式开关。启用后,打印机将挖掘大范围区域至目标 Y 层,用于创建空置域、虚空世界或大规模地形改造。挖掘范围由区块大小设置决定。", "infinitely-printer.config.void.name.chunkSize": "区块大小", + "infinitely-printer.config.void.comment.chunkSize": "挖掘区域的区块大小(1 区块 = 16 格)。设为 17 即创建标准的 272×272 格边境。更大的值需要大量时间和资源。范围:1-33 区块。", "infinitely-printer.config.void.name.excavationY": "挖掘 Y 层", + "infinitely-printer.config.void.comment.excavationY": "向下挖掘的目标 Y 层。指定区域内高于此层的方块将被移除。完整边境通常设在基岩上方(Y=-60 至 Y=-64)。范围:-64 至 320。", "infinitely-printer.config.void.name.excavateToBedrock": "挖掘至基岩", + "infinitely-printer.config.void.comment.excavateToBedrock": "启用后无视「挖掘 Y 层」设置,一直挖到基岩层。适合创建尽可能低的空置域边境。会覆盖挖掘 Y 层设置的值。", "infinitely-printer.config.void.name.autoCenter": "自动居中", - "infinitely-printer.config.void.comment.voidEnabled": "切换空置域/边境挖掘模式", - "infinitely-printer.config.void.comment.chunkSize": "空置域大小(区块,17=标准边境)", - "infinitely-printer.config.void.comment.excavationY": "目标挖掘 Y 层", - "infinitely-printer.config.void.comment.excavateToBedrock": "向下挖掘至基岩层", - "infinitely-printer.config.void.comment.autoCenter": "以玩家为中心自动居中", + "infinitely-printer.config.void.comment.autoCenter": "自动将挖掘区域中心对齐玩家当前位置。关闭后需手动指定中心坐标。大多数情况下自动居中是最方便的选择。", + "infinitely-printer.config.anticheat.name.sendMode": "发送模式", + "infinitely-printer.config.anticheat.comment.sendMode": "控制方块放置包的发送方式。「普通」立即发送,无修改。「旋转」在包中添加旋转数据。「延迟」在放置之间添加随机时间间隔。「随机」组合旋转和延迟以获得最大防检测效果。根据服务器反作弊严格度选择合适模式。", + "infinitely-printer.config.anticheat.name.delayMin": "最小延迟", + "infinitely-printer.config.anticheat.comment.delayMin": "使用延迟或随机发送模式时,放置包之间的最小随机延迟(毫秒)。实际延迟将在最小和最大延迟之间随机取值。值越小越快但越容易被检测。", + "infinitely-printer.config.anticheat.name.delayMax": "最大延迟", + "infinitely-printer.config.anticheat.comment.delayMax": "使用延迟或随机发送模式时,放置包之间的最大随机延迟(毫秒)。必须 >= 最小延迟。值越大越安全但速度越慢。", + "infinitely-printer.config.anticheat.name.randomizeAngle": "随机角度", + "infinitely-printer.config.anticheat.comment.randomizeAngle": "放置方块时对玩家视角添加小幅度随机偏移。通过引入自然方差使自动放置看起来更像人工操作。建议在装有反作弊插件的服务器上启用。", "infinitely-printer.config.dnd.strategy.avoid": "避开", "infinitely-printer.config.dnd.strategy.kill": "击杀", "infinitely-printer.config.dnd.strategy.ignore": "忽略", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 180c863..2ebf2b6 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -27,9 +27,9 @@ }, "mixins": ["infinitely-printer.mixins.json"], "depends": { - "fabricloader": ">=0.15.0", - "minecraft": ">=1.18.2", - "malilib": ">=0.18.0", - "litematica": ">=0.19.0" + "fabricloader": ">=0.19.3", + "minecraft": ">=26.2", + "malilib": ">=0.29.3", + "litematica": ">=0.28.4" } } diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 408be61..9bef663 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1 +1 @@ -{"pack":{"description":"Infinitely Printer","pack_format":34}} +{"pack":{"description":"Infinitely Printer","pack_format":${pack_format}}} From 4ca0fa5f2e9c95c0141b6215dce568644a56bffc Mon Sep 17 00:00:00 2001 From: Minecraft269 Date: Tue, 4 Aug 2026 13:29:43 +0800 Subject: [PATCH 2/2] build: add Stonecutter 0.9.7 multi-version build with loom-back-compat - Stonecutter 0.9.7 + loom-back-compat 0.4 for cross-obfuscation builds (26.x uses fabric-loom; older versions use fabric-loom-remap) - 4 Fabric version subprojects: 26.2 / 1.21.1 / 1.20.1 / 1.18.2 - Per-version gradle.properties with verified dependency coordinates (sakura-ryoko malilib/litematica + maruohon litematica via Modrinth) - Dynamic CI matrix with version discovery - 26.2 builds successfully; older versions need Stonecutter //? if source adaptation for older malilib/MC APIs --- .github/workflows/build.yml | 30 ++++++++-- build.gradle.kts | 71 +++++++++++++++++++----- gradle.properties | 22 ++++---- settings.gradle.kts | 22 ++++++++ src/main/resources/fabric.mod.json | 8 +-- stonecutter.gradle.kts | 4 ++ versions/1.18.2-fabric/gradle.properties | 9 +++ versions/1.20.1-fabric/gradle.properties | 9 +++ versions/1.21.1-fabric/gradle.properties | 9 +++ versions/26.2-fabric/gradle.properties | 9 +++ 10 files changed, 162 insertions(+), 31 deletions(-) create mode 100644 stonecutter.gradle.kts create mode 100644 versions/1.18.2-fabric/gradle.properties create mode 100644 versions/1.20.1-fabric/gradle.properties create mode 100644 versions/1.21.1-fabric/gradle.properties create mode 100644 versions/26.2-fabric/gradle.properties diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 42dc01d..d7abd86 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,18 +1,40 @@ name: Build on: [push, pull_request] jobs: + discover: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.versions.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - id: versions + shell: bash + run: | + VERSIONS=$(ls -d versions/*/ | sed 's|^versions/||; s|/$||' | jq -R -s -c 'split("\n") | map(select(length > 0))') + echo "matrix={\"version\":${VERSIONS}}" >> "$GITHUB_OUTPUT" + echo "Discovered versions: ${VERSIONS}" build: + needs: discover + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.discover.outputs.matrix) }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + # Gradle JVM is Java 25 (Loom 1.17 requirement); per-version Java target + # (25/21/17) is set by build.gradle.kts via options.release. - uses: actions/setup-java@v4 - with: { java-version: '25', distribution: 'temurin' } + with: + java-version: '25' + distribution: 'temurin' - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 with: { gradle-version: "9.5.1" } - - name: Build + - name: Build ${{ matrix.version }} run: | chmod +x gradlew - ./gradlew build + ./gradlew :${{ matrix.version }}:build --no-daemon - uses: actions/upload-artifact@v4 - with: { name: infinitely-printer-dev, path: build/libs/*.jar } + with: + name: infinitely-printer-${{ matrix.version }} + path: versions/${{ matrix.version }}/build/libs/*.jar diff --git a/build.gradle.kts b/build.gradle.kts index bc45731..54f383c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,50 +1,95 @@ plugins { - id("net.fabricmc.fabric-loom") version "1.17-SNAPSHOT" + id("dev.kikugie.loom-back-compat") } +val mcVersion = stonecutter.current.version +val loaderName = stonecutter.current.project.split("-").last() + group = "me.github.minecraft269" version = property("mod_version") as String +base.archivesName.set("infinitely-printer-${mcVersion}-${loaderName}") + +// Java target version by MC version: 26.x->25, 1.21.x->21, <1.20.5->17 +val javaTarget = when { + stonecutter.eval(mcVersion, ">=26") -> 25 + stonecutter.eval(mcVersion, ">=1.21") -> 21 + else -> 17 +} repositories { mavenCentral() + // Masa family mods (sakura-ryoko forks: malilib + 26.2 litematica) maven("https://masa.dy.fi/maven/sakura-ryoko") { content { includeGroupAndSubgroups("fi.dy.masa") } } + // Fabric ecosystem + maven("https://maven.fabricmc.net/") maven("https://maven.fallenbreath.me/releases") { content { includeGroupAndSubgroups("me.fallenbreath") } } maven("https://maven.terraformersmc.com/releases/") { content { includeGroupAndSubgroups("com.terraformersmc") } } + // Modrinth (for litematica/malilib versions not on masa.dy.fi) + maven("https://api.modrinth.com/maven") { + content { includeGroup("maven.modrinth") } + } } dependencies { minecraft("com.mojang:minecraft:${property("minecraft_version")}") - implementation("net.fabricmc:fabric-loader:${property("loader_version")}") - implementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") - implementation("fi.dy.masa.malilib:malilib-fabric-${property("minecraft_version")}:${property("malilib_version")}") - implementation("fi.dy.masa.litematica:litematica-fabric-${property("minecraft_version")}:${property("litematica_version")}") - compileOnly("com.terraformersmc:modmenu:20.0.0-beta.3") - runtimeOnly("com.terraformersmc:modmenu:20.0.0-beta.3") + // mojmap mappings so the mojmap-named source compiles on every MC version. + // loomx.applyMojangMappings() adds mappings only for obfuscated versions; 26.x needs none. + loomx.applyMojangMappings() + "modImplementation"("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") + "modImplementation"("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") + "modImplementation"(property("malilib_dep") as String) + "modImplementation"(property("litematica_dep") as String) + "modCompileOnly"(property("modmenu_dep") as String) + "modRuntimeOnly"(property("modmenu_dep") as String) +} + +loom { + // Shared fabric.mod.json lives at the repo root (src/main/resources) + fabricModJsonPath = rootProject.file("src/main/resources/fabric.mod.json") } tasks.withType(JavaCompile::class).configureEach { - options.release = 25 + options.release = javaTarget } java { withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_25 - targetCompatibility = JavaVersion.VERSION_25 + val javaVer = when (javaTarget) { + 25 -> JavaVersion.VERSION_25 + 21 -> JavaVersion.VERSION_21 + else -> JavaVersion.VERSION_17 + } + sourceCompatibility = javaVer + targetCompatibility = javaVer } +val modVersion = project.property("mod_version") as String +val packFormat = project.property("pack_format") as String +val loaderVersion = project.property("fabric_loader_version") as String +val malilibVersion = project.property("malilib_version") as String +val litematicaVersion = project.property("litematica_version") as String + tasks.processResources { - val modVersion = project.property("mod_version") as String - val packFormat = project.property("pack_format") as String inputs.property("version", modVersion) inputs.property("pack_format", packFormat) + inputs.property("minecraft", mcVersion) + inputs.property("fabric_loader_version", loaderVersion) + inputs.property("malilib_version", malilibVersion) + inputs.property("litematica_version", litematicaVersion) filesMatching("fabric.mod.json") { - expand("version" to modVersion) + expand( + "version" to modVersion, + "minecraft_version" to mcVersion, + "fabric_loader_version" to loaderVersion, + "malilib_version" to malilibVersion, + "litematica_version" to litematicaVersion + ) } filesMatching("pack.mcmeta") { expand("pack_format" to packFormat) diff --git a/gradle.properties b/gradle.properties index c5b5763..7189eee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,22 +1,24 @@ -# Gradle +# Gradle JVM settings (shared) org.gradle.jvmargs=-Xmx1G org.gradle.parallel=true org.gradle.configuration-cache=false -# Fabric Properties (26.2) -minecraft_version=26.2 -loader_version=0.19.3 -loom_version=1.17-SNAPSHOT - -# Mod Properties +# Mod Properties (shared) mod_version=0.1.0 maven_group=me.github.minecraft269 -# Resource pack format values per MC version: -# 1.18.2=8 1.20.1=15 1.21.1=34 26.2=88 +# Loom version for loom-back-compat (auto-selects fabric-loom / fabric-loom-remap per MC version) +loomx.loom_version=1.17-SNAPSHOT + +# Resource pack format (shared; 1.18.2=8 1.20.1=15 1.21.1=34 26.2=88) pack_format=88 -# Dependencies +# Active-version defaults (26.2). Overridden per version in versions//gradle.properties +minecraft_version=26.2 +fabric_loader_version=0.19.3 fabric_api_version=0.154.0+26.2 +malilib_dep=fi.dy.masa.malilib:malilib-fabric-26.2:0.29.3 malilib_version=0.29.3 +litematica_dep=fi.dy.masa.litematica:litematica-fabric-26.2:0.28.4 litematica_version=0.28.4 +modmenu_dep=com.terraformersmc:modmenu:20.0.0-beta.3 diff --git a/settings.gradle.kts b/settings.gradle.kts index 30fbfcd..84c720a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,8 +1,30 @@ pluginManagement { repositories { maven("https://maven.fabricmc.net/") + maven("https://maven.kikugie.dev/releases") + maven("https://maven.kikugie.dev/snapshots") mavenCentral() gradlePluginPortal() } } + +plugins { + id("dev.kikugie.stonecutter") version "0.9.7" + id("dev.kikugie.loom-back-compat") version "0.4" +} + +stonecutter { + kotlinController = true + centralScript = "build.gradle.kts" + + shared { + version("26.2-fabric", "26.2") + version("1.21.1-fabric", "1.21.1") + version("1.20.1-fabric", "1.20.1") + version("1.18.2-fabric", "1.18.2") + } + + create(rootProject) +} + rootProject.name = "infinitely-printer" diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 2ebf2b6..0049649 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -27,9 +27,9 @@ }, "mixins": ["infinitely-printer.mixins.json"], "depends": { - "fabricloader": ">=0.19.3", - "minecraft": ">=26.2", - "malilib": ">=0.29.3", - "litematica": ">=0.28.4" + "fabricloader": ">=${fabric_loader_version}", + "minecraft": ">=${minecraft_version}", + "malilib": ">=${malilib_version}", + "litematica": ">=${litematica_version}" } } diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts new file mode 100644 index 0000000..90e2e98 --- /dev/null +++ b/stonecutter.gradle.kts @@ -0,0 +1,4 @@ +plugins { + id("dev.kikugie.stonecutter") +} +stonecutter active "26.2-fabric" /* [SC] DO NOT EDIT */ diff --git a/versions/1.18.2-fabric/gradle.properties b/versions/1.18.2-fabric/gradle.properties new file mode 100644 index 0000000..1b1fea4 --- /dev/null +++ b/versions/1.18.2-fabric/gradle.properties @@ -0,0 +1,9 @@ +# 1.18.2 Fabric (sakura-ryoko malilib + maruohon litematica via Modrinth) +minecraft_version=1.18.2 +fabric_loader_version=0.14.25 +fabric_api_version=0.77.0+1.18.2 +malilib_dep=fi.dy.masa.malilib:malilib-fabric-1.18.2:0.12.3-alpha.2 +malilib_version=0.12.3-alpha.2 +litematica_dep=maven.modrinth:litematica:0.11.7 +litematica_version=0.11.7 +modmenu_dep=com.terraformersmc:modmenu:4.1.2 diff --git a/versions/1.20.1-fabric/gradle.properties b/versions/1.20.1-fabric/gradle.properties new file mode 100644 index 0000000..1257476 --- /dev/null +++ b/versions/1.20.1-fabric/gradle.properties @@ -0,0 +1,9 @@ +# 1.20.1 Fabric (sakura-ryoko malilib + maruohon litematica via Modrinth) +minecraft_version=1.20.1 +fabric_loader_version=0.15.11 +fabric_api_version=0.92.11+1.20.1 +malilib_dep=fi.dy.masa.malilib:malilib-fabric-1.20.1:0.16.4-alpha.1 +malilib_version=0.16.4-alpha.1 +litematica_dep=maven.modrinth:litematica:0.15.4 +litematica_version=0.15.4 +modmenu_dep=com.terraformersmc:modmenu:7.2.2 diff --git a/versions/1.21.1-fabric/gradle.properties b/versions/1.21.1-fabric/gradle.properties new file mode 100644 index 0000000..1d8c197 --- /dev/null +++ b/versions/1.21.1-fabric/gradle.properties @@ -0,0 +1,9 @@ +# 1.21.1 Fabric (sakura-ryoko malilib + maruohon litematica via Modrinth) +minecraft_version=1.21.1 +fabric_loader_version=0.16.10 +fabric_api_version=0.116.15+1.21.1 +malilib_dep=fi.dy.masa.malilib:malilib-fabric-1.21:0.21.10 +malilib_version=0.21.10 +litematica_dep=maven.modrinth:litematica:0.19.61 +litematica_version=0.19.61 +modmenu_dep=com.terraformersmc:modmenu:11.0.4 diff --git a/versions/26.2-fabric/gradle.properties b/versions/26.2-fabric/gradle.properties new file mode 100644 index 0000000..e333a9e --- /dev/null +++ b/versions/26.2-fabric/gradle.properties @@ -0,0 +1,9 @@ +# 26.2 Fabric (sakura-ryoko forks, mojmap) +minecraft_version=26.2 +fabric_loader_version=0.19.3 +fabric_api_version=0.154.0+26.2 +malilib_dep=fi.dy.masa.malilib:malilib-fabric-26.2:0.29.3 +malilib_version=0.29.3 +litematica_dep=fi.dy.masa.litematica:litematica-fabric-26.2:0.28.4 +litematica_version=0.28.4 +modmenu_dep=com.terraformersmc:modmenu:20.0.0-beta.3