From 9b736b55184ce331c67e497b98aba325445fe8f3 Mon Sep 17 00:00:00 2001 From: TexTrue <3140846162@qq.com> Date: Wed, 24 Jul 2024 18:47:13 +0800 Subject: [PATCH] sync from `sakura-ryoko/litematica` --- CHANGELOG.md | 2 +- gradle/libs.versions.toml | 4 +- .../fi/dy/masa/litematica/config/Configs.java | 270 ++-- .../fi/dy/masa/litematica/config/Hotkeys.java | 150 +- .../litematica/data/EntitiesDataStorage.java | 163 +- .../masa/litematica/event/KeyCallbacks.java | 33 +- .../masa/litematica/event/RenderHandler.java | 7 +- .../gui/GuiPlacementConfiguration.java | 1 + .../litematica/gui/GuiSchematicManager.java | 4 +- .../gui/GuiSchematicSaveImported.java | 12 +- .../materials/MaterialListBase.java | 2 +- .../materials/MaterialListSorter.java | 28 +- .../litematica/mixin/MixinHandledScreen.java | 10 +- .../litematica/mixin/MixinWorldRenderer.java | 2 - .../network/ServuxLitematicaHandler.java | 5 +- .../masa/litematica/render/RenderUtils.java | 29 +- .../BlockModelRendererSchematic.java | 130 +- .../schematic/BufferAllocatorCache.java | 84 +- .../render/schematic/BufferBuilderCache.java | 25 +- .../render/schematic/BufferBuilderPatch.java | 2 +- .../render/schematic/BuiltBufferCache.java | 56 +- .../schematic/ChunkRenderDataSchematic.java | 13 +- .../ChunkRenderDispatcherLitematica.java | 160 +- .../render/schematic/ChunkRenderLayers.java | 6 +- .../schematic/ChunkRenderTaskSchematic.java | 122 +- .../ChunkRenderWorkerLitematica.java | 199 ++- .../schematic/ChunkRendererSchematicVbo.java | 293 ++-- .../render/schematic/OverlayRenderType.java | 39 + .../schematic/WorldRendererSchematic.java | 29 +- .../scheduler/tasks/TaskSaveSchematic.java | 8 +- .../schematic/LitematicaSchematic.java | 50 +- .../schematic/SchematicaSchematic.java | 41 +- .../conversion/SchematicConversionMaps.java | 57 + .../placement/SchematicPlacement.java | 4 + .../masa/litematica/util/DataFixerMode.java | 222 +++ .../litematica/util/PlacementHandler.java | 67 +- .../util/SchematicPlacingUtils.java | 1 + .../dy/masa/litematica/util/WorldUtils.java | 239 ++- .../assets/forgematica/lang/en_us.json | 462 +++++- .../assets/forgematica/lang/fr_fr.json | 512 ------ .../assets/forgematica/lang/ru_ru.json | 510 ------ .../assets/forgematica/lang/uk_ua.json | 443 ------ .../assets/forgematica/lang/zh_cn.json | 1402 +++++++++++------ 43 files changed, 3283 insertions(+), 2615 deletions(-) create mode 100644 src/main/java/fi/dy/masa/litematica/render/schematic/OverlayRenderType.java create mode 100644 src/main/java/fi/dy/masa/litematica/util/DataFixerMode.java delete mode 100644 src/main/resources/assets/forgematica/lang/fr_fr.json delete mode 100644 src/main/resources/assets/forgematica/lang/ru_ru.json delete mode 100644 src/main/resources/assets/forgematica/lang/uk_ua.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 3893492..c8dd764 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,3 @@ ## Change - update mafglib version -- `neonetwork` -> `badpackets` \ No newline at end of file +- sync from `sakura-ryoko/litematica` \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 571b369..3c2fb96 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ mappings_patch="1.21+build.4" neoforge="21.0.60-beta" # Mod properties -version="0.1.7" +version="0.1.8" maven-group="org.thinkingstudio.forgematica" archives-name="Forgematica" @@ -18,7 +18,7 @@ id-modrinth="dCKRaeBC" id-curseforge="912441" # Mod dependencies -mafglib="0.1.16-mc1.21" +mafglib="0.1.17-mc1.21" badpackets="neo-0.8.1" # Libraries diff --git a/src/main/java/fi/dy/masa/litematica/config/Configs.java b/src/main/java/fi/dy/masa/litematica/config/Configs.java index 2305dd7..dd7dfda 100644 --- a/src/main/java/fi/dy/masa/litematica/config/Configs.java +++ b/src/main/java/fi/dy/masa/litematica/config/Configs.java @@ -23,72 +23,73 @@ public class Configs implements IConfigHandler public static class Generic { - public static final ConfigOptionList EASY_PLACE_PROTOCOL = new ConfigOptionList("easyPlaceProtocolVersion", EasyPlaceProtocol.AUTO, "The type of \"accurate placement protocol\" to use.\n- Auto: Uses v3 in single player, and by default Slabs-only in multiplayer,\n unless the server has Carpet mod that sends a 'carpet:hello'\n packet, in which case v2 is used on that server.\n- Version 3: Only supported by Litematica itself (in single player) or with Servux.\n- Version 2: Compatible with servers with the Carpet mod\n (either QuickCarpet by skyrising and DeadlyMC,\n or CarpetExtra in addition to FabricCarpet.\n And in both cases the 'accurateBlockPlacement' Carpet rule needs\n to be enabled on the server).\n- Slabs only: Only fixes top slabs. Compatible with Paper servers.\n- None: Does not modify coordinates."); - public static final ConfigOptionList PASTE_NBT_BEHAVIOR = new ConfigOptionList("pasteNbtRestoreBehavior", PasteNbtBehavior.NONE, "Whether or not the NBT data of blocks is attempted to be restored,\nand which method is used for that.\n- Place & Data Modify will try to place the \"NBT-picked\" block\n near the player, and then use the data modify\n command to transfer the NBT data to the setblock'ed block\n- Place & Clone will try to place the \"NBT-picked\" block\n near the player, and then clone it to the final location.\n- Teleport & Place will try to teleport the player nearby and then\n directly place the NBT-picked item in the correct position.\nNote that the teleport & place method doesn't currently work correctly/at all.\nThe recommended method is §ePlace & Data Modify§r, however for that to work\nyou will probably need to lower the pasteCommandLimit to 1 per tick and increase\nthe pasteCommandInterval to 1-4 ticks or something.\nThus you should only use this for pasting important blocks that need the data,\nfor example by making a schematic of just the inventories,\nand then paste that with replace behavior set to None."); - public static final ConfigOptionList PASTE_REPLACE_BEHAVIOR = new ConfigOptionList("pasteReplaceBehavior", ReplaceBehavior.NONE, "The behavior of replacing existing blocks\nin the Paste schematic tool mode"); - public static final ConfigOptionList PLACEMENT_REPLACE_BEHAVIOR = new ConfigOptionList("placementReplaceBehavior", ReplaceBehavior.ALL, "The block replace behavior when adding blocks\nto the schematic world.\n\nThis allows using overlapped placements without the\nlater handled placement always overwriting earlier ones with air.\nOn the other hand some blocks like light blocks are considered\nto be air, so they would need the \"All\" replace behavior\nto get placed at all."); - public static final ConfigOptionList PLACEMENT_RESTRICTION_WARN = new ConfigOptionList("placementRestrictionWarn", MessageOutputType.ACTIONBAR, "Selects which type of warning message to show (if any)\nwhen either the Easy Place mode or Placement Restriction prevent placing a block"); - public static final ConfigOptionList SELECTION_CORNERS_MODE = new ConfigOptionList("selectionCornersMode", CornerSelectionMode.CORNERS, "The Area Selection corners mode to use (Corners, or Expand)"); + public static final ConfigOptionList EASY_PLACE_PROTOCOL = new ConfigOptionList("easyPlaceProtocolVersion", EasyPlaceProtocol.AUTO, "litematica.config.generic.comment.easyPlaceProtocolVersion").translatedName("litematica.config.generic.name.easyPlaceProtocolVersion"); + public static final ConfigOptionList PASTE_NBT_BEHAVIOR = new ConfigOptionList("pasteNbtRestoreBehavior", PasteNbtBehavior.NONE, "litematica.config.generic.comment.pasteNbtRestoreBehavior").translatedName("litematica.config.generic.name.pasteNbtRestoreBehavior"); + public static final ConfigOptionList PASTE_REPLACE_BEHAVIOR = new ConfigOptionList("pasteReplaceBehavior", ReplaceBehavior.NONE, "litematica.config.generic.comment.pasteReplaceBehavior").translatedName("litematica.config.generic.name.pasteReplaceBehavior"); + public static final ConfigOptionList PLACEMENT_REPLACE_BEHAVIOR = new ConfigOptionList("placementReplaceBehavior", ReplaceBehavior.ALL, "litematica.config.generic.comment.placementReplaceBehavior").translatedName("litematica.config.generic.name.placementReplaceBehavior"); + public static final ConfigOptionList PLACEMENT_RESTRICTION_WARN = new ConfigOptionList("placementRestrictionWarn", MessageOutputType.ACTIONBAR, "litematica.generic.config.comment.placementRestrictionWarn").translatedName("litematica.config.generic.name.placementRestrictionWarn"); + public static final ConfigOptionList SELECTION_CORNERS_MODE = new ConfigOptionList("selectionCornersMode", CornerSelectionMode.CORNERS, "litematica.config.generic.comment.cornerSelectionMode").translatedName("litematica.config.generic.name.cornerSelectionMode"); - public static final ConfigBoolean CUSTOM_SCHEMATIC_BASE_DIRECTORY_ENABLED = new ConfigBoolean("customSchematicBaseDirectoryEnabled", false, "If enabled, then the directory set in 'customSchematicBaseDirectory'\nwill be used as the root/base schematic directory,\ninstead of the normal '.minecraft/schematics/' directory"); - public static final ConfigString CUSTOM_SCHEMATIC_BASE_DIRECTORY = new ConfigString( "customSchematicBaseDirectory", DataManager.getDefaultBaseSchematicDirectory().getAbsolutePath(), "The root/base schematic directory to use,\nif 'customSchematicBaseDirectoryEnabled' is enabled"); + public static final ConfigBoolean CUSTOM_SCHEMATIC_BASE_DIRECTORY_ENABLED = new ConfigBoolean("customSchematicBaseDirectoryEnabled", false, "litematica.config.generic.comment.customSchematicBaseDirectoryEnabled").translatedName("litematica.config.generic.name.customSchematicBaseDirectoryEnabled"); + public static final ConfigString CUSTOM_SCHEMATIC_BASE_DIRECTORY = new ConfigString( "customSchematicBaseDirectory", DataManager.getDefaultBaseSchematicDirectory().getAbsolutePath(), "litematica.config.generic.comment.customSchematicBaseDirectory").translatedName("litematica.config.generic.name.customSchematicBaseDirectory"); - public static final ConfigBoolean AREAS_PER_WORLD = new ConfigBoolean("areaSelectionsPerWorld", true, "Use per-world or server root directories for the area selections\n§6NOTE: Don't switch this OFF while you are live streaming,\n§6as then the Area Selection browser will show the server IP\n§6in the navigation widget and also in the current selection name/path\n§6until you change the current directory and selection again"); - public static final ConfigBoolean BETTER_RENDER_ORDER = new ConfigBoolean("betterRenderOrder", true, "If enabled, then the schematic rendering is done\nby injecting the different render call into the vanilla\nrendering code. This should result in better translucent block\nrendering/ordering and schematic blocks not getting rendered\nthrough the client world blocks/terrain.\nIf the rendering doesn't work (for example with Optifine),\ntry disabling this option."); - public static final ConfigBoolean CHANGE_SELECTED_CORNER = new ConfigBoolean("changeSelectedCornerOnMove", true, "If true, then the selected corner of an area selection\nis always set to the last moved corner,\nwhen using the set corner hotkeys"); - public static final ConfigBoolean CLONE_AT_ORIGINAL_POS = new ConfigBoolean("cloneAtOriginalPosition", false, "If enabled, then using the Clone Selection hotkey will create\nthe placement at the original area selection position,\ninstead of at the player's current position"); - public static final ConfigBoolean COMMAND_DISABLE_FEEDBACK = new ConfigBoolean("commandDisableFeedback", true, "If enabled, then command feedback is automatically disabled\nand then re-enabled for multiplayer Paste, Fill and Delete operations\n(which are using /setblock and /fill commands) by disabling and then\nre-enabling the sendCommandFeedback game rule when the task is finished"); - public static final ConfigInteger COMMAND_FILL_MAX_VOLUME = new ConfigInteger("commandFillMaxVolume", 32768, 256, 10000000, "The maximum size/volume of each individual box\nthat can be filled via the command-based Fill/Delete\noperations. Bigger areas/volumes will get split to multiple commands.\nAll areas are also split to per-chunk boxes at first anyway."); - public static final ConfigBoolean COMMAND_FILL_NO_CHUNK_CLAMP = new ConfigBoolean("commandFillNoChunkClamp", false, "Disables dividing the fill volumes (in the Fill, Replace and Delete modes)\nto per-chunk boxes"); - public static final ConfigInteger COMMAND_LIMIT = new ConfigInteger("commandLimitPerTick", 24, 1, 256, "Maximum number of commands sent per game tick,\nwhen using the Paste, Fill and Delete features on a server,\nwhere they will use setblock and fill commands.\nNote that he Paste feature can overshoot this by a couple of commands\nwhen using the NBT restore functionality, which needs two additional commands for each block."); - public static final ConfigString COMMAND_NAME_CLONE = new ConfigString( "commandNameClone", "clone", "The clone command name to use when using the\ncommand-based creative mode functionality on servers.\nThis is currently only used by the Paste function if the NBT restore\nbehavior is set to 'Place & Clone'."); - public static final ConfigString COMMAND_NAME_FILL = new ConfigString( "commandNameFill", "fill", "The fill command name to use when using the\ncommand-based creative mode functionality on servers"); - public static final ConfigString COMMAND_NAME_SETBLOCK = new ConfigString( "commandNameSetblock", "setblock", "The setblock command name to use when using the\ncommand-based creative mode functionality on servers,\nnamely the Paste Schematic in World function"); - public static final ConfigString COMMAND_NAME_SUMMON = new ConfigString( "commandNameSummon", "summon", "The summon command name to use when using the\ncommand-based creative mode functionality on servers,\nnamely the Paste Schematic in World function"); - public static final ConfigInteger COMMAND_TASK_INTERVAL = new ConfigInteger("commandTaskInterval", 1, 1, 1000, "The interval in game ticks the Paste, Fill and Delete tasks\nare executed at. The commandLimitPerTick config sets the maximum\nnumber of commands to send per execution, and this config\nsets the interval in game ticks before the next execution."); - public static final ConfigBoolean COMMAND_USE_WORLDEDIT = new ConfigBoolean("commandUseWorldEdit", false, "If enabled, instead of using the configured setblock and fill commands,\nthe World Edit //pos1, //pos2 and //set commands are used.\nNote that using World Edit commands is around 3x slower\nthan using vanilla commands due to the command limit per tick,\nand WE requiring multiple commands per block or area (//pos1 //pos2 //set).\n§6WARNING: The paste replace behavior option WILL NOT WORK if using\n§6the World Edit commands and fill volumes instead of individual setblock commands!\nThus it's recommended to use the vanilla commands, if you have the permission to run them.\nOne other thing that might make you prefer WE commands in some cases\nis that they can prevent block updates, if the server doesn't have\nthe Carpet mod and thus the '/carpet fillUpdates false' rule available."); - public static final ConfigBoolean DEBUG_LOGGING = new ConfigBoolean("debugLogging", false, "Enables some debug log messages in the game console,\nfor debugging certain issues or crashes."); - public static final ConfigInteger DATAFIXER_DEFAULT_SCHEMA = new ConfigInteger("datafixerDefaultSchema", 1139, 99, 2724, true, "Default Schema Value for the Vanilla Data Fixer\n\nUsed to adjust the lowest possible value, and the value used\nwhen the loaded schematic does not contain this information.\n\n§6WARNING: This setting is meant to be used at the direction\n§6from a Litematica developer such as masa themselves.\n§6When in doubt, keep the default for Minecraft 1.12."); - public static final ConfigBoolean EASY_PLACE_FIRST = new ConfigBoolean("easyPlaceFirst", true, "This causes the Easy Place mode to place the first/closest block\nyou are looking at first, instead of the furthest/bottom-most block.\nSetting this to false allows you to place multiple layers \"at once\",\nsince the furthest blocks would be placed before the closer ones block the line of sight."); - public static final ConfigBoolean EASY_PLACE_HOLD_ENABLED = new ConfigBoolean("easyPlaceHoldEnabled", true, "When enabled, then you can hold down the use key\nand look at different schematic blocks to place them,\nwithout having to click on every block individually."); - public static final ConfigBoolean EASY_PLACE_MODE = new ConfigBoolean("easyPlaceMode", false, "When enabled, then simply trying to use an item/place a block\non schematic blocks will place that block in that position"); - public static final ConfigBoolean EASY_PLACE_SP_HANDLING = new ConfigBoolean("easyPlaceSinglePlayerHandling", true, "If enabled, then Litematica handles the so called\n\"Carpet mod Accurate Block Placement Protocol\" itself in single player.\nThis is recommended to be kept enabled if you\nare going to use Easy Place in single player."); - public static final ConfigInteger EASY_PLACE_SWAP_INTERVAL = new ConfigInteger("easyPlaceSwapInterval", 0, 0, 10000, "The interval in milliseconds the Easy Place mode waits\nafter swapping inventory slots and placing a block.\nUseful to avoid placing wrong blocks when having high ping."); - public static final ConfigBoolean EASY_PLACE_VANILLA_REACH = new ConfigBoolean("easyPlaceVanillaReach", false, "If enabled, reduces reach distance from 6 to 4.5\nso servers don't reject placement of far blocks."); - public static final ConfigBoolean ENTITY_DATA_SYNC = new ConfigBoolean("entityDataSync", true, "Use the Entity Data Sync protocol from Servux\nto obtain Entity Data from the server"); - public static final ConfigBoolean ENTITY_DATA_SYNC_BACKUP = new ConfigBoolean("entityDataSyncBackup", true, "Use the Vanilla NBT Query method when Servux\nis not available. This method requires Operator Privileges."); - public static final ConfigBoolean EXECUTE_REQUIRE_TOOL = new ConfigBoolean("executeRequireHoldingTool", true, "Require holding an enabled tool item\nfor the executeOperation hotkey to work"); - public static final ConfigBoolean FIX_CHEST_MIRROR = new ConfigBoolean("fixChestMirror", true, "Enable a fix to the broken chest mirror code in vanilla"); - public static final ConfigBoolean FIX_RAIL_ROTATION = new ConfigBoolean("fixRailRotation", true, "If true, then a fix is applied for the vanilla bug in rails,\nwhere the 180 degree rotations of straight north-south and\neast-west rails rotate 90 degrees counterclockwise instead >_>"); - public static final ConfigBoolean GENERATE_LOWERCASE_NAMES = new ConfigBoolean("generateLowercaseNames", false, "If enabled, then by default the suggested schematic names\nwill be lowercase and using underscores instead of spaces"); - public static final ConfigBoolean HIGHLIGHT_BLOCK_IN_INV = new ConfigBoolean("highlightBlockInInventory", false, "When enabled, highlights the item (including Shulker Boxes containing it)\nof the looked at block in the schematic"); - public static final ConfigBoolean ITEM_USE_PACKET_CHECK_BYPASS= new ConfigBoolean("itemUsePacketCheckBypass", true, "Bypass the new distance/coordinate check that was added in 1.18.2.\n\nThat check breaks the \"accurate placement protocol\" and causes\nany blocks placed with a rotation (or other property) request to just become ghost blocks.\n\nThere is basically no need to ever disable this.\nThe check didn't even exist ever before 1.18.2."); - public static final ConfigBoolean LAYER_MODE_DYNAMIC = new ConfigBoolean("layerModeFollowsPlayer", false, "If true, then the render layer follows the player.\nNote: This currently collapses Layer Range type ranges unfortunately"); - public static final ConfigBoolean LOAD_ENTIRE_SCHEMATICS = new ConfigBoolean("loadEntireSchematics", false, "If true, then the entire schematic is always loaded at once.\nIf false, then only the part that is within the client's view distance is loaded."); - public static final ConfigBoolean MATERIAL_LIST_IGNORE_STATE = new ConfigBoolean("materialListIgnoreState", false, "When enabled, the exact block state is ignored, and only the block type needs to match"); - public static final ConfigBoolean PASTE_ALWAYS_USE_FILL = new ConfigBoolean("pasteAlwaysUseFill", false, "This forces using the fill command (instead of setblock) even for single blocks"); - public static final ConfigBoolean PASTE_IGNORE_BE_ENTIRELY = new ConfigBoolean("pasteIgnoreBlockEntitiesEntirely", false, "If enabled, then block entities ae not pasted at all\nvia the command-based pasting in multiplayer.\nThis allows you to easier paste in two passes if you\nwant to use the NBT-restore option for inventories etc. in the second pass,\nwhich usually requires a lot slower pasting speed/command rate."); - public static final ConfigBoolean PASTE_IGNORE_BE_IN_FILL = new ConfigBoolean("pasteIgnoreBlockEntitiesFromFill", true, "If enabled, then all block entities are ignored from the fill\ncommands when pasting. This allows them to get pasted individually,\nwhich is required if the NBT restore option is being used."); - public static final ConfigBoolean PASTE_IGNORE_CMD_LIMIT = new ConfigBoolean("pasteIgnoreCommandLimitWithNbtRestore", true, "If enabled, then the command limit is ignored when pasting\nblocks with a block entity with the NBT restore option enabled.\nThis seems to somehow fix an issue where the NBT restore\nwould otherwise fail for many blocks with a low command rate."); - public static final ConfigBoolean PASTE_IGNORE_ENTITIES = new ConfigBoolean("pasteIgnoreEntities", false, "If enabled, then the Paste feature will not paste any entities"); - public static final ConfigBoolean PASTE_IGNORE_INVENTORY = new ConfigBoolean("pasteIgnoreInventories", false, "Don't paste inventory contents when pasting a schematic"); - public static final ConfigBoolean PASTE_TO_MCFUNCTION = new ConfigBoolean("pasteToMcFunctionFiles", false, "If enabled, then instead of actually pasting schematics to the world,\nthey are written as setblock commands into text files."); - public static final ConfigBoolean PASTE_USE_FILL_COMMAND = new ConfigBoolean("pasteUseFillCommand", true, "If enabled, then instead of only using individual /setblock commands,\nthe command-based Paste operation (which is used on servers)\nwill also try to use /fill commands for any continuous areas of the same block.\nThis has no effect in single player, since the mod sets the blocks directly\nin the integrated server's world in and doesn't use commands at all."); - public static final ConfigBoolean PASTE_USING_COMMANDS_IN_SP = new ConfigBoolean("pasteUsingCommandsInSp", false, "This is a temporary hack workaround to use the command-based pasting\nalso in single player, which allows using the render layer limited\npasting in single player, which currently doesn't work with\nthe direct world access pasting that single player normally uses.\n\nNote that this will have all the same NBT data restoration\nlimitations that multiplayer pasting has normally."); - public static final ConfigBoolean PASTE_USING_SERVUX = new ConfigBoolean("pasteUsingServux", true, "Use Servux to paste a schematic directly to the server.\nThis method is much faster than the traditional\ncommand-based method, and it supports restoring\nEntity NBT Data."); - public static final ConfigBoolean PICK_BLOCK_AVOID_DAMAGEABLE = new ConfigBoolean("pickBlockAvoidDamageable", true, "Avoids replacing any damageable items in the hotbar"); - public static final ConfigBoolean PICK_BLOCK_AVOID_TOOLS = new ConfigBoolean("pickBlockAvoidTools", false, "Avoids replacing any tool items in the hotbar.\n\nThis means any items that extend the vanilla ToolItem class."); - public static final ConfigBoolean PICK_BLOCK_ENABLED = new ConfigBoolean("pickBlockEnabled", true, "Enables the schematic world pick block hotkeys.\nThere is also a hotkey for toggling this option to toggle those hotkeys... o.o", "Pick Block Hotkeys"); - public static final ConfigBoolean PICK_BLOCK_SHULKERS = new ConfigBoolean("pickBlockShulkers", false, "If enabled, then if the required item for the pick bloc\nis not found directly in the player's inventory, but there\nis a Shulker box that contains it, the Shulker Box\nwill be switched to the player's hand instead"); - public static final ConfigString PICK_BLOCKABLE_SLOTS = new ConfigString( "pickBlockableSlots", "1,2,3,4,5", "The hotbar slots that are allowed to be\nused for the schematic pick block"); - public static final ConfigBoolean PLACEMENT_RESTRICTION = new ConfigBoolean("placementRestriction", false, "When enabled, the use key can only be used\nwhen holding the correct item for the targeted position,\nand the targeted position must have a missing block in the schematic", "Placement Restriction"); - public static final ConfigBoolean RENDER_MATERIALS_IN_GUI = new ConfigBoolean("renderMaterialListInGuis", true, "Whether or not the material list should\nbe rendered inside GUIs"); - public static final ConfigBoolean RENDER_THREAD_NO_TIMEOUT = new ConfigBoolean("renderThreadNoTimeout", true, "Removes the timeout from the rendering worker threads.\nIf you get very stuttery rendering when moving around\nor dealing with large schematics, try disabling this. It will however make\nthe schematic rendering a lot slower in some cases."); - public static final ConfigInteger SERVER_NBT_REQUEST_RATE = new ConfigInteger("serverNbtRequestRate", 2, "Limit request rate for server entity data syncer"); - public static final ConfigBoolean SIGN_TEXT_PASTE = new ConfigBoolean("signTextPaste", true, "Automatically set the text in the sign GUIs from the schematic"); - public static final ConfigString TOOL_ITEM = new ConfigString( "toolItem", "minecraft:stick", "The item to use as the \"tool\" for selections etc."); - public static final ConfigBoolean TOOL_ITEM_ENABLED = new ConfigBoolean("toolItemEnabled", true, "If true, then the \"tool\" item can be used to control selections etc.", "Tool Item Enabled"); - public static final ConfigBoolean UNHIDE_SCHEMATIC_PROJECTS = new ConfigBoolean("unhideSchematicVCS", false, "Un-hides the Schematic VCS (Version Control System) menu button,\nand enables the hotkey and the VCS functionality in general.\n(This was called Schematic Projects before.)\n\nIn general you §6should not§r be using this feature,\nunless you really know how it works and what it does.\nIt somewhat changes how the area selections, placements and pasting works,\nin particular that there is also an area delete operation when pasting.\n\nBasically this feature is intended for §6iterative, in-place§r design work,\nand it allows you to easier create multiple versions/snapshots\nof the same build, and also to switch between the versions by deleting what is\nin the world first, and then pasting the next version in its place."); + public static final ConfigBoolean AREAS_PER_WORLD = new ConfigBoolean("areaSelectionsPerWorld", true, "litematica.config.generic.comment.areaSelectionsPerWorld").translatedName("litematica.config.generic.name.areaSelectionsPerWorld"); + public static final ConfigBoolean BETTER_RENDER_ORDER = new ConfigBoolean("betterRenderOrder", true, "litematica.config.generic.comment.betterRenderOrder").translatedName("litematica.config.generic.name.betterRenderOrder"); + public static final ConfigBoolean CHANGE_SELECTED_CORNER = new ConfigBoolean("changeSelectedCornerOnMove", true, "litematica.config.generic.comment.changeSelectedCornerOnMove").translatedName("litematica.config.generic.name.changeSelectedCornerOnMove"); + public static final ConfigBoolean CLONE_AT_ORIGINAL_POS = new ConfigBoolean("cloneAtOriginalPosition", false, "litematica.config.generic.comment.cloneAtOriginalPosition").translatedName("litematica.generic.config.name.cloneAtOriginalPosition"); + public static final ConfigBoolean COMMAND_DISABLE_FEEDBACK = new ConfigBoolean("commandDisableFeedback", true, "litematica.config.generic.comment.commandDisableFeedback").translatedName("litematica.config.generic.name.commandDisableFeedback"); + public static final ConfigInteger COMMAND_FILL_MAX_VOLUME = new ConfigInteger("commandFillMaxVolume", 32768, 256, 10000000, "litematica.config.generic.comment.commandFillMaxVolume").translatedName("litematica.config.name.commandFillMaxVolume"); + public static final ConfigBoolean COMMAND_FILL_NO_CHUNK_CLAMP = new ConfigBoolean("commandFillNoChunkClamp", false, "litematica.config.generic.comment.commandFillNoChunkClamp").translatedName("litematica.config.generic.name.commandFillNoChunkClamp"); + public static final ConfigInteger COMMAND_LIMIT = new ConfigInteger("commandLimitPerTick", 24, 1, 256, "litematica.config.generic.comment.commandLimitPerTick").translatedName("litematica.config.generic.name.commandLimitPerTick"); + public static final ConfigString COMMAND_NAME_CLONE = new ConfigString( "commandNameClone", "clone", "litematica.config.generic.comment.commandNameClone").translatedName("litematica.config.generic.name.commandNameClone"); + public static final ConfigString COMMAND_NAME_FILL = new ConfigString( "commandNameFill", "fill", "litematica.config.generic.comment.commandNameFill").translatedName("litematica.config.generic.name.commandNameFill"); + public static final ConfigString COMMAND_NAME_SETBLOCK = new ConfigString( "commandNameSetblock", "setblock", "litematica.config.generic.comment.commandNameSetblock").translatedName("litematica.config.generic.name.commandNameSetblock"); + public static final ConfigString COMMAND_NAME_SUMMON = new ConfigString( "commandNameSummon", "summon", "litematica.config.generic.comment.commandNameSummon").translatedName("litematica.config.generic.name.commandNameSummon"); + public static final ConfigInteger COMMAND_TASK_INTERVAL = new ConfigInteger("commandTaskInterval", 1, 1, 1000, "litematica.config.generic.comment.commandTaskInterval").translatedName("litematica.config.generic.name.commandTaskInterval"); + public static final ConfigBoolean COMMAND_USE_WORLDEDIT = new ConfigBoolean("commandUseWorldEdit", false, "litematica.config.generic.comment.commandUseWorldEdit").translatedName("litematica.config.generic.name.commandUseWorldEdit"); + public static final ConfigBoolean DEBUG_LOGGING = new ConfigBoolean("debugLogging", false, "litematica.config.generic.comment.debugLogging").translatedName("litematica.config.generic.name.debugLogging"); + public static final ConfigOptionList DATAFIXER_MODE = new ConfigOptionList("datafixerMode", DataFixerMode.ALWAYS, "litematica.config.generic.comment.datafixerMode").translatedName("litematica.config.generic.name.datafixerMode"); + public static final ConfigInteger DATAFIXER_DEFAULT_SCHEMA = new ConfigInteger("datafixerDefaultSchema", 1139, 99, 2724, true, "litematica.config.generic.comment.datafixerDefaultSchema").translatedName("litematica.config.generic.name.datafixerDefaultSchema"); + public static final ConfigBoolean EASY_PLACE_FIRST = new ConfigBoolean("easyPlaceFirst", true, "litematica.config.generic.comment.easyPlaceFirst").translatedName("litematica.config.generic.name.easyPlaceFirst"); + public static final ConfigBoolean EASY_PLACE_HOLD_ENABLED = new ConfigBoolean("easyPlaceHoldEnabled", true, "litematica.config.generic.comment.easyPlaceHoldEnabled").translatedName("litematica.config.generic.name.easyPlaceHoldEnabled"); + public static final ConfigBoolean EASY_PLACE_MODE = new ConfigBoolean("easyPlaceMode", false, "litematica.config.generic.comment.easyPlaceMode", "litematica.config.generic.prettyName.easyPlaceMode").translatedName("litematica.config.generic.name.easyPlaceMode"); + public static final ConfigBoolean EASY_PLACE_SP_HANDLING = new ConfigBoolean("easyPlaceSinglePlayerHandling", true, "litematica.config.generic.comment.easyPlaceSinglePlayerHandling").translatedName("litematica.config.generic.name.easyPlaceSinglePlayerHandling"); + public static final ConfigInteger EASY_PLACE_SWAP_INTERVAL = new ConfigInteger("easyPlaceSwapInterval", 0, 0, 10000, "litematica.config.generic.comment.easyPlaceSwapInterval").translatedName("litematica.config.generic.name.easyPlaceSwapInterval"); + public static final ConfigBoolean EASY_PLACE_VANILLA_REACH = new ConfigBoolean("easyPlaceVanillaReach", false, "litematica.config.generic.comment.easyPlaceVanillaReach").translatedName("litematica.config.generic.name.easyPlaceVanillaReach"); + public static final ConfigBoolean ENTITY_DATA_SYNC = new ConfigBoolean("entityDataSync", true, "litematica.config.generic.comment.entityDataSync").translatedName("litematica.config.generic.name.entityDataSync"); + public static final ConfigBoolean ENTITY_DATA_SYNC_BACKUP = new ConfigBoolean("entityDataSyncBackup", true, "litematica.config.generic.comment.entityDataSyncBackup").translatedName("litematica.config.generic.name.entityDataSyncBackup"); + public static final ConfigBoolean EXECUTE_REQUIRE_TOOL = new ConfigBoolean("executeRequireHoldingTool", true, "litematica.config.generic.comment.executeRequireHoldingTool").translatedName("litematica.config.generic.name.executeRequireHoldingTool"); + public static final ConfigBoolean FIX_CHEST_MIRROR = new ConfigBoolean("fixChestMirror", true, "litematica.config.generic.comment.fixChestMirror").translatedName("litematica.config.generic.name.fixChestMirror"); + public static final ConfigBoolean FIX_RAIL_ROTATION = new ConfigBoolean("fixRailRotation", true, "litematica.config.generic.comment.fixRailRotation").translatedName("litematica.config.generic.name.fixRailRotation"); + public static final ConfigBoolean GENERATE_LOWERCASE_NAMES = new ConfigBoolean("generateLowercaseNames", false, "litematica.config.generic.comment.generateLowercaseNames").translatedName("litematica.config.generic.name.generateLowercaseNames"); + public static final ConfigBoolean HIGHLIGHT_BLOCK_IN_INV = new ConfigBoolean("highlightBlockInInventory", false, "litematica.config.generic.comment.highlightBlockInInventory").translatedName("litematica.config.generic.name.highlightBlockInInventory"); + public static final ConfigBoolean ITEM_USE_PACKET_CHECK_BYPASS= new ConfigBoolean("itemUsePacketCheckBypass", true, "litematica.config.generic.comment.itemUsePacketCheckBypass").translatedName("litematica.config.generic.name.itemUsePacketCheckBypass"); + public static final ConfigBoolean LAYER_MODE_DYNAMIC = new ConfigBoolean("layerModeFollowsPlayer", false, "litematica.config.generic.comment.layerModeFollowsPlayer").translatedName("litematica.config.generic.name.layerModeFollowsPlayer"); + public static final ConfigBoolean LOAD_ENTIRE_SCHEMATICS = new ConfigBoolean("loadEntireSchematics", false, "litematica.config.generic.comment.loadEntireSchematics").translatedName("litematica.config.generic.name.loadEntireSchematics"); + public static final ConfigBoolean MATERIAL_LIST_IGNORE_STATE = new ConfigBoolean("materialListIgnoreState", false, "litematica.config.generic.comment.materialListIgnoreState").translatedName("litematica.config.generic.name.materialListIgnoreState"); + public static final ConfigBoolean PASTE_ALWAYS_USE_FILL = new ConfigBoolean("pasteAlwaysUseFill", false, "litematica.config.generic.comment.pasteAlwaysUseFill").translatedName("litematica.config.generic.name.pasteAlwaysUseFill"); + public static final ConfigBoolean PASTE_IGNORE_BE_ENTIRELY = new ConfigBoolean("pasteIgnoreBlockEntitiesEntirely", false, "litematica.config.generic.comment.pasteIgnoreBlockEntitiesEntirely").translatedName("litematica.config.generic.name.pasteIgnoreBlockEntitiesEntirely"); + public static final ConfigBoolean PASTE_IGNORE_BE_IN_FILL = new ConfigBoolean("pasteIgnoreBlockEntitiesFromFill", true, "litematica.config.generic.comment.pasteIgnoreBlockEntitiesFromFill").translatedName("litematica.config.generic.name.pasteIgnoreBlockEntitiesFromFill"); + public static final ConfigBoolean PASTE_IGNORE_CMD_LIMIT = new ConfigBoolean("pasteIgnoreCommandLimitWithNbtRestore", true, "litematica.config.generic.comment.pasteIgnoreCommandLimitWithNbtRestore").translatedName("litematica.config.generic.name.pasteIgnoreCommandLimitWithNbtRestore"); + public static final ConfigBoolean PASTE_IGNORE_ENTITIES = new ConfigBoolean("pasteIgnoreEntities", false, "litematica.config.generic.comment.pasteIgnoreEntities").translatedName("litematica.config.generic.name.pasteIgnoreEntities"); + public static final ConfigBoolean PASTE_IGNORE_INVENTORY = new ConfigBoolean("pasteIgnoreInventories", false, "litematica.config.generic.comment.pasteIgnoreInventories").translatedName("litematica.config.generic.name.pasteIgnoreInventories"); + public static final ConfigBoolean PASTE_TO_MCFUNCTION = new ConfigBoolean("pasteToMcFunctionFiles", false, "litematica.config.generic.comment.pasteToMcFunctionFiles").translatedName("litematica.config.generic.name.pasteToMcFunctionFiles"); + public static final ConfigBoolean PASTE_USE_FILL_COMMAND = new ConfigBoolean("pasteUseFillCommand", true, "litematica.config.generic.comment.pasteUseFillCommand").translatedName("litematica.config.generic.name.pasteUseFillCommand"); + public static final ConfigBoolean PASTE_USING_COMMANDS_IN_SP = new ConfigBoolean("pasteUsingCommandsInSp", false, "litematica.config.generic.comment.pasteUsingCommandsInSp").translatedName("litematica.config.generic.name.pasteUsingCommandsInSp"); + public static final ConfigBoolean PASTE_USING_SERVUX = new ConfigBoolean("pasteUsingServux", true, "litematica.config.generic.comment.pasteUsingServux").translatedName("litematica.config.generic.name.pasteUsingServux"); + public static final ConfigBoolean PICK_BLOCK_AVOID_DAMAGEABLE = new ConfigBoolean("pickBlockAvoidDamageable", true, "litematica.config.generic.comment.pickBlockAvoidDamageable").translatedName("litematica.config.generic.name.pickBlockAvoidDamageable"); + public static final ConfigBoolean PICK_BLOCK_AVOID_TOOLS = new ConfigBoolean("pickBlockAvoidTools", false, "litematica.config.generic.comment.pickBlockAvoidTools").translatedName("litematica.config.generic.name.pickBlockAvoidTools"); + public static final ConfigBoolean PICK_BLOCK_ENABLED = new ConfigBoolean("pickBlockEnabled", true, "litematica.config.generic.comment.pickBlockEnabled", "litematica.config.generic.prettyName.pickBlockEnabled"); + public static final ConfigBoolean PICK_BLOCK_SHULKERS = new ConfigBoolean("pickBlockShulkers", false, "litematica.config.generic.comment.pickBlockShulkers").translatedName("litematica.config.generic.name.pickBlockShulkers"); + public static final ConfigString PICK_BLOCKABLE_SLOTS = new ConfigString( "pickBlockableSlots", "1,2,3,4,5", "litematica.config.generic.comment.pickBlockableSlots").translatedName("litematica.config.generic.name.pickBlockableSlots"); + public static final ConfigBoolean PLACEMENT_RESTRICTION = new ConfigBoolean("placementRestriction", false, "litematica.config.generic.comment.placementRestriction", "litematica.config.generic.prettyName.placementRestriction").translatedName("litematica.config.generic.name.placementRestriction"); + public static final ConfigBoolean RENDER_MATERIALS_IN_GUI = new ConfigBoolean("renderMaterialListInGuis", true, "litematica.config.generic.comment.renderMaterialListInGuis").translatedName("litematica.config.generic.name.renderMaterialListInGuis"); + public static final ConfigBoolean RENDER_THREAD_NO_TIMEOUT = new ConfigBoolean("renderThreadNoTimeout", true, "litematica.config.generic.comment.renderThreadNoTimeout").translatedName("litematica.config.generic.name.renderThreadNoTimeout"); + public static final ConfigInteger SERVER_NBT_REQUEST_RATE = new ConfigInteger("serverNbtRequestRate", 2, "litematica.config.generic.comment.serverNbtRequestRate").translatedName("litematica.config.generic.name.serverNbtRequestRate"); + public static final ConfigBoolean SIGN_TEXT_PASTE = new ConfigBoolean("signTextPaste", true, "litematica.config.generic.comment.signTextPaste", "litematica.config.generic.prettyName.signTextPaste").translatedName("litematica.config.generic.name.signTextPaste"); + public static final ConfigString TOOL_ITEM = new ConfigString( "toolItem", "minecraft:stick", "litematica.config.generic.comment.toolItem").translatedName("litematica.config.generic.name.toolItem"); + public static final ConfigBoolean TOOL_ITEM_ENABLED = new ConfigBoolean("toolItemEnabled", true, "litematica.config.generic.comment.toolItemEnabled", "litematica.config.generic.prettyName.toolItemEnabled").translatedName("litematica.config.generic.name.toolItemEnabled"); + public static final ConfigBoolean UNHIDE_SCHEMATIC_PROJECTS = new ConfigBoolean("unhideSchematicVCS", false, "litematica.config.generic.comment.unhideSchematicVCS").translatedName("litematica.config.generic.name.unhideSchematicVCS"); public static final ImmutableList OPTIONS = ImmutableList.of( AREAS_PER_WORLD, @@ -100,6 +101,7 @@ public static class Generic COMMAND_USE_WORLDEDIT, CUSTOM_SCHEMATIC_BASE_DIRECTORY_ENABLED, DEBUG_LOGGING, + DATAFIXER_MODE, DATAFIXER_DEFAULT_SCHEMA, EASY_PLACE_FIRST, EASY_PLACE_HOLD_ENABLED, @@ -162,44 +164,44 @@ public static class Generic public static class Visuals { - public static final ConfigBoolean ENABLE_AREA_SELECTION_RENDERING = new ConfigBoolean("enableAreaSelectionBoxesRendering", true, "Enable Area Selection boxes rendering", "Area Selection Boxes Rendering"); - public static final ConfigBoolean ENABLE_PLACEMENT_BOXES_RENDERING = new ConfigBoolean("enablePlacementBoxesRendering", true, "Enable Schematic Placement boxes rendering", "Schematic Placement Boxes Rendering"); - public static final ConfigBoolean ENABLE_RENDERING = new ConfigBoolean("enableRendering", true, "Main rendering toggle option. Enables/disables ALL mod rendering.", "All Rendering"); - public static final ConfigBoolean ENABLE_SCHEMATIC_BLOCKS = new ConfigBoolean("enableSchematicBlocksRendering", true, "Enables schematic block rendering.\nDisabling this allows you to only see the color overlay", "Schematic Blocks Rendering"); - public static final ConfigBoolean ENABLE_SCHEMATIC_OVERLAY = new ConfigBoolean("enableSchematicOverlay", true, "The main toggle option for the schematic\nblock overlay rendering", "Schematic Overlay Rendering"); - public static final ConfigBoolean ENABLE_SCHEMATIC_RENDERING = new ConfigBoolean("enableSchematicRendering", true, "Enable rendering the schematic and overlay", "Schematic Rendering"); - public static final ConfigInteger RENDER_SCHEMATIC_MAX_THREADS = new ConfigInteger("renderSchematicMaxThreads", 4, 1, 16, "Maximum Schematic World Rendering Thread Size\nThis will directly effect overall multi-threaded performance\n\n§6USE WITH CAUTION!! This will only take effect\n§6after you leave the game, and rejoin."); - public static final ConfigDouble GHOST_BLOCK_ALPHA = new ConfigDouble( "ghostBlockAlpha", 0.5, 0, 1, "The alpha value of the ghost blocks,\nwhen rendering them as translucent.\n§6Note: §7You also need to enable the translucent rendering separately,\nusing the 'renderBlocksAsTranslucent' option!"); - public static final ConfigBoolean IGNORE_EXISTING_FLUIDS = new ConfigBoolean("ignoreExistingFluids", false, "If enabled, then any fluid blocks are ignored as \"extra blocks\"\nand as \"wrong blocks\", ie. where the schematic has air or other blocks.\nBasically this makes building stuff under water a whole lot less annoying.\nNote: You will most likely also want to enable the 'renderCollidingSchematicBlocks'\noption at the same time, to allow the blocks to get rendered inside fluids."); - public static final ConfigBoolean OVERLAY_REDUCED_INNER_SIDES = new ConfigBoolean("overlayReducedInnerSides", true, "If enabled, then the adjacent/touching inner sides\nfor the block overlays are removed/not rendered"); - public static final ConfigDouble PLACEMENT_BOX_SIDE_ALPHA = new ConfigDouble( "placementBoxSideAlpha", 0.2, 0, 1, "The alpha value of the sub-region boxes' side"); - public static final ConfigBoolean RENDER_AREA_SELECTION_BOX_SIDES = new ConfigBoolean("renderAreaSelectionBoxSides", true, "If enabled, then the area selection boxes will\nhave their side quads rendered"); - public static final ConfigBoolean RENDER_BLOCKS_AS_TRANSLUCENT = new ConfigBoolean("renderBlocksAsTranslucent", false, "If enabled, then the schematics are rendered\nusing translucent \"ghost blocks\"", "Translucent Schematic Block Rendering"); - public static final ConfigBoolean RENDER_COLLIDING_SCHEMATIC_BLOCKS = new ConfigBoolean("renderCollidingSchematicBlocks", false, "If enabled, then blocks in the schematics are rendered\nalso when there is already a (wrong) block in the client world.\nProbably mostly useful when trying to build\nsomething where there are snow layers or water in the way."); - public static final ConfigBoolean RENDER_ERROR_MARKER_CONNECTIONS = new ConfigBoolean("renderErrorMarkerConnections", false, "Render connecting lines between subsequent verifier hilight box corners.\nThis was a rendering bug that some people experienced, but at least some players\nliked it and requested for it to stay, so this options \"restores\" it"); - public static final ConfigBoolean RENDER_ERROR_MARKER_SIDES = new ConfigBoolean("renderErrorMarkerSides", true, "If enabled, then the error markers in the Schematic Verifier\nwill have (translucent) sides rendered instead of just the outline"); - public static final ConfigBoolean RENDER_PLACEMENT_BOX_SIDES = new ConfigBoolean("renderPlacementBoxSides", false, "If enabled, then the placed schematic sub-region boxes\nwill have their side quads rendered"); - public static final ConfigBoolean RENDER_PLACEMENT_ENCLOSING_BOX = new ConfigBoolean("renderPlacementEnclosingBox", true, "If enabled, then an enclosing box is rendered around\nall the sub-regions in a schematic (placement)"); - public static final ConfigBoolean RENDER_PLACEMENT_ENCLOSING_BOX_SIDES= new ConfigBoolean("renderPlacementEnclosingBoxSides", false, "If enabled, then the enclosing box around\na schematic placement will have its side quads rendered"); - public static final ConfigBoolean RENDER_TRANSLUCENT_INNER_SIDES = new ConfigBoolean("renderTranslucentBlockInnerSides", false, "If enabled, then the model sides are also rendered\nfor inner sides in the translucent mode"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_ENABLE_OUTLINES = new ConfigBoolean("schematicOverlayEnableOutlines", true, "Enables rendering a wire frame outline for\nthe schematic block overlay", "Schematic Overlay Outlines"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_ENABLE_RESORTING = new ConfigBoolean("schematicOverlayEnableResorting", false, "Enables Translucent Sorting for\nthe schematic block overlay", "Schematic Overlay Translucent Sorting"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_ENABLE_SIDES = new ConfigBoolean("schematicOverlayEnableSides", true, "Enables rendering translucent boxes/sides for\nthe schematic block overlay", "Schematic Overlay Sides"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_MODEL_OUTLINE = new ConfigBoolean("schematicOverlayModelOutline", true, "If enabled, then the schematic overlay will use the\nblock model quads/vertices instead of the\ntraditional full block overlay"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_MODEL_SIDES = new ConfigBoolean("schematicOverlayModelSides", false, "If enabled, then the schematic overlay will use the\nblock model quads/vertices instead of the\ntraditional full block overlay"); - public static final ConfigDouble SCHEMATIC_OVERLAY_OUTLINE_WIDTH = new ConfigDouble( "schematicOverlayOutlineWidth", 1.0, 0, 64, "The line width of the block (model) outlines"); - public static final ConfigDouble SCHEMATIC_OVERLAY_OUTLINE_WIDTH_THROUGH = new ConfigDouble("schematicOverlayOutlineWidthThrough", 3.0, 0, 64, "The line width of the block (model) outlines,\nwhen the overlay is rendered through blocks"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_RENDER_THROUGH = new ConfigBoolean("schematicOverlayRenderThroughBlocks", false, "If enabled, then the schematic overlay will be rendered\nthrough blocks. This is probably only useful once you are\nfinished building and want to see any errors easier"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_TYPE_EXTRA = new ConfigBoolean("schematicOverlayTypeExtra", true, "Enables the schematic overlay for extra blocks"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_TYPE_MISSING = new ConfigBoolean("schematicOverlayTypeMissing", true, "Enables the schematic overlay for missing blocks"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_TYPE_WRONG_BLOCK = new ConfigBoolean("schematicOverlayTypeWrongBlock", true, "Enables the schematic overlay for wrong blocks"); - public static final ConfigBoolean SCHEMATIC_OVERLAY_TYPE_WRONG_STATE = new ConfigBoolean("schematicOverlayTypeWrongState", true, "Enables the schematic overlay for wrong states"); - public static final ConfigBoolean SCHEMATIC_VERIFIER_BLOCK_MODELS = new ConfigBoolean("schematicVerifierUseBlockModels", false, "Forces using blocks models for everything in the Schematic Verifier\nresult list. Normally item models are used for anything\nthat has an item, and block models are only used for blocks\nthat don't have an item, plus for Flower Pots to see the contained item."); + public static final ConfigBoolean ENABLE_AREA_SELECTION_RENDERING = new ConfigBoolean("enableAreaSelectionBoxesRendering", true, "litematica.config.visuals.comment.enableAreaSelectionBoxesRendering", "litematica.config.visuals.prettyName.enableAreaSelectionBoxesRendering").translatedName("litematica.config.visuals.name.enableAreaSelectionBoxesRendering"); + public static final ConfigBoolean ENABLE_PLACEMENT_BOXES_RENDERING = new ConfigBoolean("enablePlacementBoxesRendering", true, "litematica.config.visuals.comment.enablePlacementBoxesRendering", "litematica.config.visuals.prettyName.enablePlacementBoxesRendering").translatedName("litematica.config.visuals.name.enablePlacementBoxesRendering"); + public static final ConfigBoolean ENABLE_RENDERING = new ConfigBoolean("enableRendering", true, "litematica.config.visuals.comment.enableRendering", "litematica.config.visuals.prettyName.enableRendering").translatedName("litematica.config.visuals.name.enableRendering"); + public static final ConfigBoolean ENABLE_SCHEMATIC_BLOCKS = new ConfigBoolean("enableSchematicBlocksRendering", true, "litematica.config.visuals.comment.enableSchematicBlocksRendering", "litematica.config.visuals.prettyName.enableSchematicBlocksRendering").translatedName("litematica.config.visuals.name.enableSchematicBlocksRendering"); + public static final ConfigBoolean ENABLE_SCHEMATIC_OVERLAY = new ConfigBoolean("enableSchematicOverlay", true, "litematica.config.visuals.comment.enableSchematicOverlay", "litematica.config.visuals.prettyName.enableSchematicOverlay").translatedName("litematica.config.visuals.name.enableSchematicOverlay"); + public static final ConfigBoolean ENABLE_SCHEMATIC_RENDERING = new ConfigBoolean("enableSchematicRendering", true, "litematica.config.visuals.comment.enableSchematicRendering", "litematica.config.visuals.prettyName.enableSchematicRendering").translatedName("litematica.config.visuals.name.enableSchematicRendering"); + //public static final ConfigInteger RENDER_SCHEMATIC_MAX_THREADS = new ConfigInteger("renderSchematicMaxThreads", 4, 1, 16, "litematica.config.visuals.comment.renderSchematicMaxThreads").translatedName("litematica.config.visuals.name.renderSchematicMaxThreads"); + public static final ConfigDouble GHOST_BLOCK_ALPHA = new ConfigDouble( "ghostBlockAlpha", 0.5, 0, 1, "litematica.config.visuals.comment.ghostBlockAlpha").translatedName("litematica.config.visuals.name.ghostBlockAlpha"); + public static final ConfigBoolean IGNORE_EXISTING_FLUIDS = new ConfigBoolean("ignoreExistingFluids", false, "litematica.config.visuals.comment.ignoreExistingFluids").translatedName("litematica.config.visuals.name.ignoreExistingFluids"); + public static final ConfigBoolean OVERLAY_REDUCED_INNER_SIDES = new ConfigBoolean("overlayReducedInnerSides", false, "litematica.config.visuals.comment.overlayReducedInnerSides").translatedName("litematica.config.visuals.name.overlayReducedInnerSides"); + public static final ConfigDouble PLACEMENT_BOX_SIDE_ALPHA = new ConfigDouble( "placementBoxSideAlpha", 0.2, 0, 1, "litematica.config.visuals.comment.placementBoxSideAlpha").translatedName("litematica.config.visuals.name.placementBoxSideAlpha"); + public static final ConfigBoolean RENDER_AREA_SELECTION_BOX_SIDES = new ConfigBoolean("renderAreaSelectionBoxSides", true, "litematica.config.visuals.comment.renderAreaSelectionBoxSides").translatedName("litematica.config.visuals.name.renderAreaSelectionBoxSides"); + public static final ConfigBoolean RENDER_BLOCKS_AS_TRANSLUCENT = new ConfigBoolean("renderBlocksAsTranslucent", false, "litematica.config.visuals.comment.renderBlocksAsTranslucent", "litematica.config.visuals.prettyName.renderBlocksAsTranslucent").translatedName("litematica.config.visuals.name.renderBlocksAsTranslucent"); + public static final ConfigBoolean RENDER_COLLIDING_SCHEMATIC_BLOCKS = new ConfigBoolean("renderCollidingSchematicBlocks", false, "litematica.config.visuals.comment.renderCollidingSchematicBlocks").translatedName("litematica.config.visuals.name.renderCollidingSchematicBlocks"); + public static final ConfigBoolean RENDER_ERROR_MARKER_CONNECTIONS = new ConfigBoolean("renderErrorMarkerConnections", false, "litematica.config.visuals.comment.renderErrorMarkerConnections").translatedName("litematica.config.visuals.name.renderErrorMarkerConnections"); + public static final ConfigBoolean RENDER_ERROR_MARKER_SIDES = new ConfigBoolean("renderErrorMarkerSides", true, "litematica.config.visuals.comment.renderErrorMarkerSides").translatedName("litematica.config.visuals.name.renderErrorMarkerSides"); + public static final ConfigBoolean RENDER_PLACEMENT_BOX_SIDES = new ConfigBoolean("renderPlacementBoxSides", false, "litematica.config.visuals.comment.renderPlacementBoxSides").translatedName("litematica.config.visuals.name.renderPlacementBoxSides"); + public static final ConfigBoolean RENDER_PLACEMENT_ENCLOSING_BOX = new ConfigBoolean("renderPlacementEnclosingBox", true, "litematica.config.visuals.comment.renderPlacementEnclosingBox").translatedName("litematica.config.visuals.name.renderPlacementEnclosingBox"); + public static final ConfigBoolean RENDER_PLACEMENT_ENCLOSING_BOX_SIDES= new ConfigBoolean("renderPlacementEnclosingBoxSides", false, "litematica.config.visuals.comment.renderPlacementEnclosingBoxSides").translatedName("litematica.config.visuals.name.renderPlacementEnclosingBoxSides"); + public static final ConfigBoolean RENDER_TRANSLUCENT_INNER_SIDES = new ConfigBoolean("renderTranslucentBlockInnerSides", false, "litematica.config.visuals.comment.renderTranslucentBlockInnerSides").translatedName("litematica.config.visuals.name.renderTranslucentBlockInnerSides"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_ENABLE_OUTLINES = new ConfigBoolean("schematicOverlayEnableOutlines", true, "litematica.config.visuals.comment.schematicOverlayEnableOutlines", "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines").translatedName("litematica.config.visuals.name.schematicOverlayEnableOutlines"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_ENABLE_RESORTING = new ConfigBoolean("schematicOverlayEnableResorting", false, "litematica.config.visuals.comment.schematicOverlayEnableResorting", "litematica.config.visuals.prettyName.schematicOverlayEnableResorting").translatedName("litematica.config.visuals.name.schematicOverlayEnableResorting"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_ENABLE_SIDES = new ConfigBoolean("schematicOverlayEnableSides", true, "litematica.config.visuals.comment.schematicOverlayEnableSides", "litematica.config.visuals.prettyName.schematicOverlayEnableSides").translatedName("litematica.config.visuals.name.schematicOverlayEnableSides"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_MODEL_OUTLINE = new ConfigBoolean("schematicOverlayModelOutline", true, "litematica.config.visuals.comment.schematicOverlayModelOutline").translatedName("litematica.config.visuals.name.schematicOverlayModelOutline"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_MODEL_SIDES = new ConfigBoolean("schematicOverlayModelSides", false, "litematica.config.visuals.comment.schematicOverlayModelSides").translatedName("litematica.config.visuals.name.schematicOverlayModelSides"); + public static final ConfigDouble SCHEMATIC_OVERLAY_OUTLINE_WIDTH = new ConfigDouble( "schematicOverlayOutlineWidth", 1.0, 0, 64, "litematica.config.visuals.comment.schematicOverlayOutlineWidth").translatedName("litematica.config.visuals.name.schematicOverlayOutlineWidth"); + public static final ConfigDouble SCHEMATIC_OVERLAY_OUTLINE_WIDTH_THROUGH = new ConfigDouble("schematicOverlayOutlineWidthThrough", 3.0, 0, 64, "litematica.config.visuals.comment.schematicOverlayOutlineWidthThrough").translatedName("litematica.config.visuals.name.schematicOverlayOutlineWidthThrough"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_RENDER_THROUGH = new ConfigBoolean("schematicOverlayRenderThroughBlocks", false, "litematica.config.visuals.comment.schematicOverlayRenderThroughBlocks").translatedName("litematica.config.visuals.name.schematicOverlayRenderThroughBlocks"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_TYPE_EXTRA = new ConfigBoolean("schematicOverlayTypeExtra", true, "litematica.config.visuals.comment.schematicOverlayTypeExtra").translatedName("litematica.config.visuals.name.schematicOverlayTypeExtra"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_TYPE_MISSING = new ConfigBoolean("schematicOverlayTypeMissing", true, "litematica.config.visuals.comment.schematicOverlayTypeMissing").translatedName("litematica.config.visuals.name.schematicOverlayTypeMissing"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_TYPE_WRONG_BLOCK = new ConfigBoolean("schematicOverlayTypeWrongBlock", true, "litematica.config.visuals.comment.schematicOverlayTypeWrongBlock").translatedName("litematica.config.visuals.name.schematicOverlayTypeWrongBlock"); + public static final ConfigBoolean SCHEMATIC_OVERLAY_TYPE_WRONG_STATE = new ConfigBoolean("schematicOverlayTypeWrongState", true, "litematica.config.visuals.comment.schematicOverlayTypeWrongState").translatedName("litematica.config.visuals.name.schematicOverlayTypeWrongState"); + public static final ConfigBoolean SCHEMATIC_VERIFIER_BLOCK_MODELS = new ConfigBoolean("schematicVerifierUseBlockModels", false, "litematica.config.visuals.comment.schematicVerifierUseBlockModels").translatedName("litematica.config.visuals.name.schematicVerifierUseBlockModels"); public static final ImmutableList OPTIONS = ImmutableList.of( ENABLE_RENDERING, ENABLE_SCHEMATIC_RENDERING, - RENDER_SCHEMATIC_MAX_THREADS, + //RENDER_SCHEMATIC_MAX_THREADS, ENABLE_AREA_SELECTION_RENDERING, ENABLE_PLACEMENT_BOXES_RENDERING, @@ -237,33 +239,33 @@ public static class Visuals public static class InfoOverlays { - public static final ConfigOptionList BLOCK_INFO_LINES_ALIGNMENT = new ConfigOptionList("blockInfoLinesAlignment", HudAlignment.TOP_RIGHT, "The alignment of the block info lines overlay"); - public static final ConfigOptionList BLOCK_INFO_OVERLAY_ALIGNMENT = new ConfigOptionList("blockInfoOverlayAlignment", BlockInfoAlignment.TOP_CENTER, "The alignment of the Block Info Overlay"); - public static final ConfigOptionList INFO_HUD_ALIGNMENT = new ConfigOptionList("infoHudAlignment", HudAlignment.BOTTOM_RIGHT, "The alignment of the \"Info HUD\",\nused for the Material List, Schematic Verifier mismatch positions etc."); - public static final ConfigOptionList TOOL_HUD_ALIGNMENT = new ConfigOptionList("toolHudAlignment", HudAlignment.BOTTOM_LEFT, "The alignment of the \"tool HUD\", when holding the configured \"tool\""); + public static final ConfigOptionList BLOCK_INFO_LINES_ALIGNMENT = new ConfigOptionList("blockInfoLinesAlignment", HudAlignment.TOP_RIGHT, "litematica.config.info_overlays.comment.blockInfoLinesAlignment").translatedName("litematica.config.info_overlays.name.blockInfoLinesAlignment"); + public static final ConfigOptionList BLOCK_INFO_OVERLAY_ALIGNMENT = new ConfigOptionList("blockInfoOverlayAlignment", BlockInfoAlignment.TOP_CENTER, "litematica.config.info_overlays.comment.blockInfoOverlayAlignment").translatedName("litematica.config.info_overlays.name.blockInfoOverlayAlignment"); + public static final ConfigOptionList INFO_HUD_ALIGNMENT = new ConfigOptionList("infoHudAlignment", HudAlignment.BOTTOM_RIGHT, "litematica.config.info_overlays.comment.infoHudAlignment").translatedName("litematica.config.info_overlays.name.infoHudAlignment"); + public static final ConfigOptionList TOOL_HUD_ALIGNMENT = new ConfigOptionList("toolHudAlignment", HudAlignment.BOTTOM_LEFT, "litematica.config.info_overlays.comment.toolHudAlignment").translatedName("litematica.config.info_overlays.name.toolHudAlignment"); - public static final ConfigBoolean BLOCK_INFO_LINES_ENABLED = new ConfigBoolean("blockInfoLinesEnabled", true, "If enabled, then MiniHUD-style block info overlay\nis rendered for the looked-at block"); - public static final ConfigDouble BLOCK_INFO_LINES_FONT_SCALE = new ConfigDouble( "blockInfoLinesFontScale", 0.5, 0, 10, "The font scale for the block info lines"); - public static final ConfigInteger BLOCK_INFO_LINES_OFFSET_X = new ConfigInteger("blockInfoLinesOffsetX", 4, 0, 2000, "The x offset of the block info lines from the selected edge"); - public static final ConfigInteger BLOCK_INFO_LINES_OFFSET_Y = new ConfigInteger("blockInfoLinesOffsetY", 4, 0, 2000, "The y offset of the block info lines from the selected edge"); - public static final ConfigInteger BLOCK_INFO_OVERLAY_OFFSET_Y = new ConfigInteger("blockInfoOverlayOffsetY", 6, -2000, 2000, "The y offset of the block info overlay from the selected edge"); - public static final ConfigBoolean BLOCK_INFO_OVERLAY_ENABLED = new ConfigBoolean("blockInfoOverlayEnabled", true, "Enable Block Info Overlay rendering to show info\nabout the looked-at block or verifier error marker,\nwhile holding the 'renderInfoOverlay' key", "Block Info Overlay Rendering"); - public static final ConfigInteger INFO_HUD_MAX_LINES = new ConfigInteger("infoHudMaxLines", 10, 1, 128, "The maximum number of info lines to show on the HUD at once"); - public static final ConfigInteger INFO_HUD_OFFSET_X = new ConfigInteger("infoHudOffsetX", 1, 0, 32000, "The X offset of the Info HUD from the screen edge"); - public static final ConfigInteger INFO_HUD_OFFSET_Y = new ConfigInteger("infoHudOffsetY", 1, 0, 32000, "The Y offset of the Info HUD from the screen edge"); - public static final ConfigDouble INFO_HUD_SCALE = new ConfigDouble( "infoHudScale", 1, 0.1, 4, "Scale factor for the generic Info HUD text"); - public static final ConfigBoolean INFO_OVERLAYS_TARGET_FLUIDS = new ConfigBoolean("infoOverlaysTargetFluids", false, "When enabled, the Block Info Overlay and Block Info Lines\nwill be able to ray trace to fluid blocks instead of going through them"); - public static final ConfigInteger MATERIAL_LIST_HUD_MAX_LINES = new ConfigInteger("materialListHudMaxLines", 10, 1, 128, "The maximum number of items to show on\nthe Material List Info HUD at once"); - public static final ConfigDouble MATERIAL_LIST_HUD_SCALE = new ConfigDouble( "materialListHudScale", 1, 0.1, 4, "Scale factor for the Material List Info HUD"); - public static final ConfigBoolean STATUS_INFO_HUD = new ConfigBoolean("statusInfoHud", false, "Enable a status info HUD renderer,\nwhich renders a few bits of status info, such as\nthe current layer mode and renderers enabled state"); - public static final ConfigBoolean STATUS_INFO_HUD_AUTO = new ConfigBoolean("statusInfoHudAuto", true, "Allow automatically momentarily enabling the status info HUD \"when needed\",\nfor example when creating a placement and having rendering disabled"); - public static final ConfigInteger TOOL_HUD_OFFSET_X = new ConfigInteger("toolHudOffsetX", 1, 0, 32000, "The X offset of the Info HUD from the screen edge"); - public static final ConfigInteger TOOL_HUD_OFFSET_Y = new ConfigInteger("toolHudOffsetY", 1, 0, 32000, "The X offset of the Info HUD from the screen edge"); - public static final ConfigDouble TOOL_HUD_SCALE = new ConfigDouble( "toolHudScale", 1, 0.1, 4, "Scale factor for the Tool HUD text"); - public static final ConfigDouble VERIFIER_ERROR_HILIGHT_ALPHA = new ConfigDouble( "verifierErrorHilightAlpha", 0.2, 0, 1, "The alpha value of the error marker box sides"); - public static final ConfigInteger VERIFIER_ERROR_HILIGHT_MAX_POSITIONS= new ConfigInteger("verifierErrorHilightMaxPositions", 1000, 1, 1000000, "The maximum number of mismatched positions to render\nat once in the Schematic Verifier overlay."); - public static final ConfigBoolean VERIFIER_OVERLAY_ENABLED = new ConfigBoolean("verifierOverlayEnabled", true, "Enable Schematic Verifier marker overlay rendering", "Verifier Overlay Rendering"); - public static final ConfigBoolean WARN_DISABLED_RENDERING = new ConfigBoolean("warnDisabledRendering", true, "Should the warning message about being in a layer mode\nor having some of the rendering options disabled\nbe shown when loading a new schematic\nor creating a new placement"); + public static final ConfigBoolean BLOCK_INFO_LINES_ENABLED = new ConfigBoolean("blockInfoLinesEnabled", true, "litematica.config.info_overlays.comment.blockInfoLinesEnabled").translatedName("litematica.config.info_overlays.name.blockInfoLinesEnabled"); + public static final ConfigDouble BLOCK_INFO_LINES_FONT_SCALE = new ConfigDouble( "blockInfoLinesFontScale", 0.5, 0, 10, "litematica.config.info_overlays.comment.blockInfoLinesFontScale").translatedName("litematica.config.info_overlays.name.blockInfoLinesFontScale"); + public static final ConfigInteger BLOCK_INFO_LINES_OFFSET_X = new ConfigInteger("blockInfoLinesOffsetX", 4, 0, 2000, "litematica.config.info_overlays.comment.blockInfoLinesOffsetX").translatedName("litematica.config.info_overlays.name.blockInfoLinesOffsetX"); + public static final ConfigInteger BLOCK_INFO_LINES_OFFSET_Y = new ConfigInteger("blockInfoLinesOffsetY", 4, 0, 2000, "litematica.config.info_overlays.comment.blockInfoLinesOffsetY").translatedName("litematica.config.info_overlays.name.blockInfoLinesOffsetY"); + public static final ConfigInteger BLOCK_INFO_OVERLAY_OFFSET_Y = new ConfigInteger("blockInfoOverlayOffsetY", 6, -2000, 2000, "litematica.config.info_overlays.comment.blockInfoOverlayOffsetY").translatedName("litematica.config.info_overlays.name.blockInfoOverlayOffsetY"); + public static final ConfigBoolean BLOCK_INFO_OVERLAY_ENABLED = new ConfigBoolean("blockInfoOverlayEnabled", true, "litematica.config.info_overlays.comment.blockInfoOverlayEnabled", "litematica.config.info_overlays.prettyName.blockInfoOverlayEnabled").translatedName("litematica.config.info_overlays.name.blockInfoOverlayEnabled"); + public static final ConfigInteger INFO_HUD_MAX_LINES = new ConfigInteger("infoHudMaxLines", 10, 1, 128, "litematica.config.info_overlays.comment.infoHudMaxLines").translatedName("litematica.config.info_overlays.name.infoHudMaxLines"); + public static final ConfigInteger INFO_HUD_OFFSET_X = new ConfigInteger("infoHudOffsetX", 1, 0, 32000, "litematica.config.info_overlays.comment.infoHudOffsetX").translatedName("litematica.config.info_overlays.name.infoHudOffsetX"); + public static final ConfigInteger INFO_HUD_OFFSET_Y = new ConfigInteger("infoHudOffsetY", 1, 0, 32000, "litematica.config.info_overlays.comment.infoHudOffsetY").translatedName("litematica.config.info_overlays.name.infoHudOffsetY"); + public static final ConfigDouble INFO_HUD_SCALE = new ConfigDouble( "infoHudScale", 1, 0.1, 4, "litematica.config.info_overlays.comment.infoHudScale").translatedName("litematica.config.info_overlays.name.infoHudScale"); + public static final ConfigBoolean INFO_OVERLAYS_TARGET_FLUIDS = new ConfigBoolean("infoOverlaysTargetFluids", false, "litematica.config.info_overlays.comment.infoOverlaysTargetFluids").translatedName("litematica.config.info_overlays.name.infoOverlaysTargetFluids"); + public static final ConfigInteger MATERIAL_LIST_HUD_MAX_LINES = new ConfigInteger("materialListHudMaxLines", 10, 1, 128, "litematica.config.info_overlays.comment.materialListHudMaxLines").translatedName("litematica.config.info_overlays.name.materialListHudMaxLines"); + public static final ConfigDouble MATERIAL_LIST_HUD_SCALE = new ConfigDouble( "materialListHudScale", 1, 0.1, 4, "litematica.config.info_overlays.comment.materialListHudScale").translatedName("litematica.config.info_overlays.name.materialListHudScale"); + public static final ConfigBoolean STATUS_INFO_HUD = new ConfigBoolean("statusInfoHud", false, "litematica.config.info_overlays.comment.statusInfoHud").translatedName("litematica.config.info_overlays.name.statusInfoHud"); + public static final ConfigBoolean STATUS_INFO_HUD_AUTO = new ConfigBoolean("statusInfoHudAuto", true, "statusInfoHudAuto").translatedName("litematica.config.info_overlays.name.statusInfoHudAuto"); + public static final ConfigInteger TOOL_HUD_OFFSET_X = new ConfigInteger("toolHudOffsetX", 1, 0, 32000, "litematica.config.info_overlays.comment.toolHudOffsetX").translatedName("litematica.config.info_overlays.name.toolHudOffsetX"); + public static final ConfigInteger TOOL_HUD_OFFSET_Y = new ConfigInteger("toolHudOffsetY", 1, 0, 32000, "litematica.config.info_overlays.comment.toolHudOffsetY").translatedName("litematica.config.info_overlays.name.toolHudOffsetY"); + public static final ConfigDouble TOOL_HUD_SCALE = new ConfigDouble( "toolHudScale", 1, 0.1, 4, "litematica.config.info_overlays.comment.toolHudScale").translatedName("litematica.config.info_overlays.name.toolHudScale"); + public static final ConfigDouble VERIFIER_ERROR_HILIGHT_ALPHA = new ConfigDouble( "verifierErrorHilightAlpha", 0.2, 0, 1, "litematica.config.info_overlays.comment.verifierErrorHilightAlpha").translatedName("litematica.config.info_overlays.name.verifierErrorHilightAlpha"); + public static final ConfigInteger VERIFIER_ERROR_HILIGHT_MAX_POSITIONS= new ConfigInteger("verifierErrorHilightMaxPositions", 1000, 1, 1000000, "litematica.config.info_overlays.comment.verifierErrorHilightMaxPositions").translatedName("litematica.config.info_overlays.name.verifierErrorHilightMaxPositions"); + public static final ConfigBoolean VERIFIER_OVERLAY_ENABLED = new ConfigBoolean("verifierOverlayEnabled", true, "litematica.config.info_overlays.comment.verifierOverlayEnabled", "litematica.config.info_overlays.prettyName.verifierOverlayEnabled").translatedName("litematica.config.info_overlays.name.verifierOverlayEnabled"); + public static final ConfigBoolean WARN_DISABLED_RENDERING = new ConfigBoolean("warnDisabledRendering", true, "litematica.config.info_overlays.comment.warnDisabledRendering").translatedName("litematica.config.info_overlays.name.warnDisabledRendering"); public static final ImmutableList OPTIONS = ImmutableList.of( BLOCK_INFO_LINES_ENABLED, @@ -299,16 +301,16 @@ public static class InfoOverlays public static class Colors { - public static final ConfigColor AREA_SELECTION_BOX_SIDE_COLOR = new ConfigColor("areaSelectionBoxSideColor", "#30FFFFFF", "The color of the area selection boxes, when they are unselected"); - public static final ConfigColor HIGHTLIGHT_BLOCK_IN_INV_COLOR = new ConfigColor("hightlightBlockInInventoryColor", "#30FF30FF", "The highlight color for the item of the looked at block"); - public static final ConfigColor MATERIAL_LIST_HUD_ITEM_COUNTS = new ConfigColor("materialListHudItemCountsColor", "#FFFFAA00", "The color of the item count text in the Material List info HUD"); - public static final ConfigColor REBUILD_BREAK_OVERLAY_COLOR = new ConfigColor("schematicRebuildBreakPlaceOverlayColor", "#4C33CC33", "The color of Schematic Rebuild mode's break or place blocks selector overlay"); - public static final ConfigColor REBUILD_BREAK_EXCEPT_OVERLAY_COLOR = new ConfigColor("schematicRebuildBreakExceptPlaceOverlayColor", "#4CF03030", "The color of Schematic Rebuild mode's break all blocks except targeted selector overlay"); - public static final ConfigColor REBUILD_REPLACE_OVERLAY_COLOR = new ConfigColor("schematicRebuildReplaceOverlayColor","#4CF0A010", "The color of Schematic Rebuild mode's replace selector overlay"); - public static final ConfigColor SCHEMATIC_OVERLAY_COLOR_EXTRA = new ConfigColor("schematicOverlayColorExtra", "#4CFF4CE6", "The color of the blocks overlay for extra blocks"); - public static final ConfigColor SCHEMATIC_OVERLAY_COLOR_MISSING = new ConfigColor("schematicOverlayColorMissing", "#2C33B3E6", "The color of the blocks overlay for missing blocks"); - public static final ConfigColor SCHEMATIC_OVERLAY_COLOR_WRONG_BLOCK = new ConfigColor("schematicOverlayColorWrongBlock", "#4CFF3333", "The color of the blocks overlay for wrong blocks"); - public static final ConfigColor SCHEMATIC_OVERLAY_COLOR_WRONG_STATE = new ConfigColor("schematicOverlayColorWrongState", "#4CFF9010", "The color of the blocks overlay for wrong block states"); + public static final ConfigColor AREA_SELECTION_BOX_SIDE_COLOR = new ConfigColor("areaSelectionBoxSideColor", "#30FFFFFF", "litematica.config.colors.comment.areaSelectionBoxSideColor").translatedName("litematica.config.colors.name.areaSelectionBoxSideColor"); + public static final ConfigColor HIGHTLIGHT_BLOCK_IN_INV_COLOR = new ConfigColor("hightlightBlockInInventoryColor", "#30FF30FF", "litematica.config.colors.comment.hightlightBlockInInventoryColor").translatedName("litematica.config.colors.name.hightlightBlockInInventoryColor"); + public static final ConfigColor MATERIAL_LIST_HUD_ITEM_COUNTS = new ConfigColor("materialListHudItemCountsColor", "#FFFFAA00", "litematica.config.colors.comment.materialListHudItemCountsColor").translatedName("litematica.config.colors.name.materialListHudItemCountsColor"); + public static final ConfigColor REBUILD_BREAK_OVERLAY_COLOR = new ConfigColor("schematicRebuildBreakPlaceOverlayColor", "#4C33CC33", "litematica.config.colors.comment.schematicRebuildBreakPlaceOverlayColor").translatedName("litematica.config.colors.name.schematicRebuildBreakPlaceOverlayColor"); + public static final ConfigColor REBUILD_BREAK_EXCEPT_OVERLAY_COLOR = new ConfigColor("schematicRebuildBreakExceptPlaceOverlayColor", "#4CF03030", "litematica.config.colors.comment.schematicRebuildBreakExceptPlaceOverlayColor").translatedName("litematica.config.colors.name.schematicRebuildBreakExceptPlaceOverlayColor"); + public static final ConfigColor REBUILD_REPLACE_OVERLAY_COLOR = new ConfigColor("schematicRebuildReplaceOverlayColor","#4CF0A010", "litematica.config.colors.comment.schematicRebuildReplaceOverlayColor").translatedName("litematica.config.colors.name.schematicRebuildReplaceOverlayColor"); + public static final ConfigColor SCHEMATIC_OVERLAY_COLOR_EXTRA = new ConfigColor("schematicOverlayColorExtra", "#4CFF4CE6", "litematica.config.colors.comment.schematicOverlayColorExtra").translatedName("litematica.config.colors.name.schematicOverlayColorExtra"); + public static final ConfigColor SCHEMATIC_OVERLAY_COLOR_MISSING = new ConfigColor("schematicOverlayColorMissing", "#2C33B3E6", "litematica.config.colors.comment.schematicOverlayColorMissing").translatedName("litematica.config.colors.name.schematicOverlayColorMissing"); + public static final ConfigColor SCHEMATIC_OVERLAY_COLOR_WRONG_BLOCK = new ConfigColor("schematicOverlayColorWrongBlock", "#4CFF3333", "litematica.config.colors.comment.schematicOverlayColorWrongBlock").translatedName("litematica.config.colors.name.schematicOverlayColorWrongBlock"); + public static final ConfigColor SCHEMATIC_OVERLAY_COLOR_WRONG_STATE = new ConfigColor("schematicOverlayColorWrongState", "#4CFF9010", "litematica.config.colors.comment.schematicOverlayColorWrongState").translatedName("litematica.config.colors.name.schematicOverlayColorWrongState"); public static final ImmutableList OPTIONS = ImmutableList.of( AREA_SELECTION_BOX_SIDE_COLOR, diff --git a/src/main/java/fi/dy/masa/litematica/config/Hotkeys.java b/src/main/java/fi/dy/masa/litematica/config/Hotkeys.java index d262547..725c73d 100644 --- a/src/main/java/fi/dy/masa/litematica/config/Hotkeys.java +++ b/src/main/java/fi/dy/masa/litematica/config/Hotkeys.java @@ -7,79 +7,81 @@ public class Hotkeys { - public static final ConfigHotkey ADD_SELECTION_BOX = new ConfigHotkey("addSelectionBox", "M,A", "Add a new selection box (position 1) here"); - public static final ConfigHotkey CLONE_SELECTION = new ConfigHotkey("cloneSelection", "", "Quickly clone the current area selection.\nThis basically just creates an in-memory-only schematic,\nand then creates a placement of that schematic and selects it,\nand also switches the tool mode to the Paste mode."); - public static final ConfigHotkey DELETE_SELECTION_BOX = new ConfigHotkey("deleteSelectionBox", "", "Delete the currently selected box"); - public static final ConfigHotkey EASY_PLACE_ACTIVATION = new ConfigHotkey("easyPlaceUseKey", "BUTTON_2", KeybindSettings.PRESS_ALLOWEXTRA, "When the easyPlaceMode is enabled, this key is used for placing the blocks"); - public static final ConfigHotkey EASY_PLACE_TOGGLE = new ConfigHotkey("easyPlaceToggle", "", "Allows quickly toggling on/off the Easy Place mode"); - public static final ConfigHotkey EXECUTE_OPERATION = new ConfigHotkey("executeOperation", "", "Execute the currently selected tool operation with the\ncurrent selection or placement in the Fill, Replace,\nPaste Schematic etc. modes"); - public static final ConfigHotkey INVERT_GHOST_BLOCK_RENDER_STATE = new ConfigHotkey("invertGhostBlockRenderState", "", "Inverts the schematic/ghost block rendering status\nwhile this keybind is held down"); - public static final ConfigHotkey INVERT_OVERLAY_RENDER_STATE = new ConfigHotkey("invertOverlayRenderState", "", "Inverts the Overlay rendering status while this keybind is held down"); - public static final ConfigHotkey LAYER_MODE_NEXT = new ConfigHotkey("layerModeNext", "M,PAGE_UP", "Cycle the rendering mode (all, layers) forward"); - public static final ConfigHotkey LAYER_MODE_PREVIOUS = new ConfigHotkey("layerModePrevious", "M,PAGE_DOWN", "Cycle the rendering mode (all, layers) backwards"); - public static final ConfigHotkey LAYER_NEXT = new ConfigHotkey("layerNext", "PAGE_UP", "Move the rendered layer selection up"); - public static final ConfigHotkey LAYER_PREVIOUS = new ConfigHotkey("layerPrevious", "PAGE_DOWN", "Move the rendered layer selection down"); - public static final ConfigHotkey LAYER_SET_HERE = new ConfigHotkey("layerSetHere", "", "Set the Render Layer to the player's current position"); - public static final ConfigHotkey NUDGE_SELECTION_NEGATIVE = new ConfigHotkey("nudgeSelectionNegative", "", "Nudge the current selection in the \"negative\" direction\nThis is basically the same as mouse wheel down\nwith the Nudge modifier pressed"); - public static final ConfigHotkey NUDGE_SELECTION_POSITIVE = new ConfigHotkey("nudgeSelectionPositive", "", "Nudge the current selection in the \"positive\" direction\nThis is basically the same as mouse wheel up\nwith the Nudge modifier pressed"); - public static final ConfigHotkey MOVE_ENTIRE_SELECTION = new ConfigHotkey("moveEntireSelection", "", "Move the entire current selection here"); - public static final ConfigHotkey OPEN_GUI_AREA_SETTINGS = new ConfigHotkey("openGuiAreaSettings", "KP_MULTIPLY", "Open the Area Settings GUI for the currently selected area"); - public static final ConfigHotkey OPEN_GUI_LOADED_SCHEMATICS = new ConfigHotkey("openGuiLoadedSchematics", "", "Open the Loaded Schematic GUI"); - public static final ConfigHotkey OPEN_GUI_MAIN_MENU = new ConfigHotkey("openGuiMainMenu", "M", KeybindSettings.RELEASE_EXCLUSIVE, "Open the Litematica main menu"); - public static final ConfigHotkey OPEN_GUI_MATERIAL_LIST = new ConfigHotkey("openGuiMaterialList", "M,L", "Open the Material List GUI for the currently\nselected schematic placement"); - public static final ConfigHotkey OPEN_GUI_PLACEMENT_SETTINGS = new ConfigHotkey("openGuiPlacementSettings", "KP_SUBTRACT", "Open the Placement Settings GUI for the currently\nselected placement or sub-region"); - public static final ConfigHotkey OPEN_GUI_SCHEMATIC_PLACEMENTS = new ConfigHotkey("openGuiSchematicPlacements", "M,P", "Open the Schematic Placements GUI"); - public static final ConfigHotkey OPEN_GUI_SCHEMATIC_PROJECTS = new ConfigHotkey("openGuiSchematicProjects", "", "Open the Schematic Projects GUI"); - public static final ConfigHotkey OPEN_GUI_SCHEMATIC_VERIFIER = new ConfigHotkey("openGuiSchematicVerifier", "M,V", "Open the Schematic Verifier GUI for the currently\nselected schematic placement"); - public static final ConfigHotkey OPEN_GUI_SELECTION_MANAGER = new ConfigHotkey("openGuiSelectionManager", "M,S", "Open the Area Selection manager GUI"); - public static final ConfigHotkey OPEN_GUI_SETTINGS = new ConfigHotkey("openGuiSettings", "M,C", "Open the Config GUI"); - public static final ConfigHotkey OPERATION_MODE_CHANGE_MODIFIER = new ConfigHotkey("operationModeChangeModifier", "LEFT_CONTROL", KeybindSettings.MODIFIER_INGAME, "The modifier key to quickly change the operation mode.\nHold this and scroll while holding the \"tool item\" to quickly cycle the mode."); - public static final ConfigHotkey PICK_BLOCK_FIRST = new ConfigHotkey("pickBlockFirst", "BUTTON_3", KeybindSettings.PRESS_ALLOWEXTRA, "A key to pick block the first\nschematic block ray traced to"); - public static final ConfigHotkey PICK_BLOCK_LAST = new ConfigHotkey("pickBlockLast", "", KeybindSettings.MODIFIER_INGAME, "A key to pick block the last schematic block\nray traced to, before the first (possible) client world\nblock ray traced to. Basically this would get\nyou the block you could place against an existing block."); - public static final ConfigHotkey PICK_BLOCK_TOGGLE = new ConfigHotkey("pickBlockToggle", "M,BUTTON_3", "A hotkey to toggle the pick block toggle option in the\nGeneric configs. This is provided as a quick way to enable\nor disable the pick block keys, if they interfere with something."); - public static final ConfigHotkey RENDER_INFO_OVERLAY = new ConfigHotkey("renderInfoOverlay", "I", KeybindSettings.PRESS_ALLOWEXTRA, "The key that enables rendering the block info overlay.\nUse NONE for not requiring a key to be pressed.\nDisable the similarly named option in the Visuals\nconfigs to disable the overlay completely."); - public static final ConfigHotkey RENDER_OVERLAY_THROUGH_BLOCKS = new ConfigHotkey("renderOverlayThroughBlocks", "RIGHT_CONTROL", KeybindSettings.PRESS_ALLOWEXTRA, "A hotkey to allow the overlays to render through blocks.\nThis is just a quicker way to temporarily enable\nthe same thing that the 'schematicOverlayRenderThroughBlocks' option in Visuals does."); - public static final ConfigHotkey RERENDER_SCHEMATIC = new ConfigHotkey("rerenderSchematic", "F3,M", "Hotkey to refresh/redraw only the schematic, instead of\nhaving to refresh the vanilla terrain too with F3 + A"); - public static final ConfigHotkey SAVE_AREA_AS_IN_MEMORY_SCHEMATIC = new ConfigHotkey("saveAreaAsInMemorySchematic", "", "Save the current Area Selection as an in-memory Schematic"); - public static final ConfigHotkey SAVE_AREA_AS_SCHEMATIC_TO_FILE = new ConfigHotkey("saveAreaAsSchematicToFile", "LEFT_CONTROL,LEFT_ALT,S", "Save the current Area Selection as a Schematic to a file"); - public static final ConfigHotkey SCHEMATIC_EDIT_BREAK_ALL_EXCEPT = new ConfigHotkey("schematicEditBreakAllExcept", "", KeybindSettings.MODIFIER_INGAME, "Modifier key to activate the \"break everything except\"\nmode/function in the Schematic Edit tool mode.\nBasically when you hold this key and punch a schematic block,\nall other blocks except this block will be removed from the schematic."); - public static final ConfigHotkey SCHEMATIC_EDIT_BREAK_ALL = new ConfigHotkey("schematicEditBreakPlaceAll", "", KeybindSettings.MODIFIER_INGAME, "Modifier key to activate the \"break all identical blocks\"\nfunction in the Schematic Edit tool mode"); - public static final ConfigHotkey SCHEMATIC_EDIT_BREAK_DIRECTION = new ConfigHotkey("schematicEditBreakPlaceDirection", "", KeybindSettings.MODIFIER_INGAME, "Modifier key to activate the directional/continuous\nbreak or place function in the Schematic Edit tool mode"); - public static final ConfigHotkey SCHEMATIC_EDIT_REPLACE_ALL = new ConfigHotkey("schematicEditReplaceAll", "", KeybindSettings.MODIFIER_INGAME, "Modifier key to activate the \"replace all identical\"\nreplace mode/function in the Schematic Edit tool mode"); - public static final ConfigHotkey SCHEMATIC_EDIT_REPLACE_BLOCK = new ConfigHotkey("schematicEditReplaceBlock", "", KeybindSettings.MODIFIER_INGAME, "Modifier key to activate the \"replace block type\"\nreplace mode/function in the Schematic Edit tool mode"); - public static final ConfigHotkey SCHEMATIC_EDIT_REPLACE_DIRECTION = new ConfigHotkey("schematicEditReplaceDirection", "", KeybindSettings.MODIFIER_INGAME, "Modifier key to activate the directional/continuous\nreplace mode/function in the Schematic Edit tool mode"); - public static final ConfigHotkey SCHEMATIC_VERSION_CYCLE_MODIFIER = new ConfigHotkey("schematicVersionCycleModifier", "", KeybindSettings.MODIFIER_INGAME, "The modifier key to hold to be able to use the mouse wheel\nto cycle through the schematic versions in the Version Control tool mode"); - public static final ConfigHotkey SCHEMATIC_VERSION_CYCLE_NEXT = new ConfigHotkey("schematicVersionCycleNext", "", "A hotkey to cycle to the next schematic version in the Version Control tool mode"); - public static final ConfigHotkey SCHEMATIC_VERSION_CYCLE_PREVIOUS = new ConfigHotkey("schematicVersionCyclePrevious", "", "A hotkey to cycle to the next schematic version in the Version Control tool mode"); - public static final ConfigHotkey SELECTION_GRAB_MODIFIER = new ConfigHotkey("selectionGrabModifier", "", KeybindSettings.MODIFIER_INGAME, "The modifier key to hold to \"grab\" a selection\nbox or corner for cursor moving."); - public static final ConfigHotkey SELECTION_GROW_HOTKEY = new ConfigHotkey("selectionGrow", "", "The action hotkey to auto-grow the selection box around\nany adjacent/diagonally connected blocks"); - public static final ConfigHotkey SELECTION_GROW_MODIFIER = new ConfigHotkey("selectionGrowModifier", "", KeybindSettings.MODIFIER_INGAME, "The modifier key to hold to grow or shrink\na selection box while scrolling"); - public static final ConfigHotkey SELECTION_NUDGE_MODIFIER = new ConfigHotkey("selectionNudgeModifier", "LEFT_ALT", KeybindSettings.MODIFIER_INGAME, "The modifier key to hold while scrolling\nto nudge the selected area or corner"); - public static final ConfigHotkey SELECTION_MODE_CYCLE = new ConfigHotkey("selectionModeCycle", "LEFT_CONTROL,M", "Change the mode between Corners and Cuboid\nin the Area Selection mode"); - public static final ConfigHotkey SELECTION_SHRINK_HOTKEY = new ConfigHotkey("selectionShrink", "", "The action hotkey to shrink the selection box so that there\nisn't any empty space (empty layers) on any side"); - public static final ConfigHotkey SET_AREA_ORIGIN = new ConfigHotkey("setAreaOrigin", "", "Set/move the origin point of the current\narea selection to the player's position"); - public static final ConfigHotkey SET_SELECTION_BOX_POSITION_1 = new ConfigHotkey("setSelectionBoxPosition1", "", "Set the first position of the currently selected\nbox to the player's position"); - public static final ConfigHotkey SET_SELECTION_BOX_POSITION_2 = new ConfigHotkey("setSelectionBoxPosition2", "", "Set the second position of the currently selected\nbox to the player's position"); - public static final ConfigHotkey TOGGLE_ALL_RENDERING = new ConfigHotkey("toggleAllRendering", "M,R", "Toggle all rendering on/off", "All Rendering"); - public static final ConfigHotkey TOGGLE_AREA_SELECTION_RENDERING = new ConfigHotkey("toggleAreaSelectionBoxesRendering", "", "Toggle Area Selection boxes rendering on/off"); - public static final ConfigHotkey TOGGLE_SCHEMATIC_RENDERING = new ConfigHotkey("toggleSchematicRendering", "M,G", "Toggle schematic rendering (blocks & overlay) on/off"); - public static final ConfigHotkey TOGGLE_INFO_OVERLAY_RENDERING = new ConfigHotkey("toggleInfoOverlayRendering", "", "Toggle the info overlay rendering (for hovered block info)"); - public static final ConfigHotkey TOGGLE_OVERLAY_RENDERING = new ConfigHotkey("toggleOverlayRendering", "", "Toggle the block overlay rendering on/off"); - public static final ConfigHotkey TOGGLE_OVERLAY_OUTLINE_RENDERING = new ConfigHotkey("toggleOverlayOutlineRendering", "", "Toggle the block overlay outline rendering on/off"); - public static final ConfigHotkey TOGGLE_OVERLAY_SIDE_RENDERING = new ConfigHotkey("toggleOverlaySideRendering", "", "Toggle the block overlay side rendering on/off"); - public static final ConfigHotkey TOGGLE_PLACEMENT_BOXES_RENDERING = new ConfigHotkey("togglePlacementBoxesRendering", "", "Toggle Schematic Placement boxes rendering on/off"); - public static final ConfigHotkey TOGGLE_PLACEMENT_RESTRICTION = new ConfigHotkey("togglePlacementRestriction", "", "A hotkey to toggle the placement restriction mode"); - public static final ConfigHotkey TOGGLE_SCHEMATIC_BLOCK_RENDERING = new ConfigHotkey("toggleSchematicBlockRendering", "", "Toggle schematic block rendering on/off"); - public static final ConfigHotkey TOGGLE_SIGN_TEXT_PASTE = new ConfigHotkey("toggleSignTextPaste", "", "Toggle the signTextPaste config value (in Generic category)"); - public static final ConfigHotkey TOGGLE_TRANSLUCENT_RENDERING = new ConfigHotkey("toggleTranslucentRendering", "", "Toggle translucent vs. opaque ghost block rendering"); - public static final ConfigHotkey TOGGLE_VERIFIER_OVERLAY_RENDERING = new ConfigHotkey("toggleVerifierOverlayRendering", "", "Toggle the Schematic Verifier overlay rendering"); - public static final ConfigHotkey TOOL_ENABLED_TOGGLE = new ConfigHotkey("toolEnabledToggle", "M,T", "The keybind to toggle the \"tool\" item functionality on/off"); - public static final ConfigHotkey TOOL_PLACE_CORNER_1 = new ConfigHotkey("toolPlaceCorner1", "BUTTON_1", KeybindSettings.PRESS_ALLOWEXTRA, "The button to use while holding the \"tool\" item\nto place the primary/first corner"); - public static final ConfigHotkey TOOL_PLACE_CORNER_2 = new ConfigHotkey("toolPlaceCorner2", "BUTTON_2", KeybindSettings.PRESS_ALLOWEXTRA, "The button to use while holding the \"tool\" item\nto place the second corner"); - public static final ConfigHotkey TOOL_SELECT_ELEMENTS = new ConfigHotkey("toolSelectElements", "BUTTON_3", KeybindSettings.PRESS_ALLOWEXTRA, "The button to use to select corners or boxes\nwhile holding the \"tool\" item"); - public static final ConfigHotkey TOOL_SELECT_MODIFIER_BLOCK_1 = new ConfigHotkey("toolSelectModifierBlock1", "LEFT_ALT", KeybindSettings.MODIFIER_INGAME, "The modifier key to hold while using the 'toolSelectElements'\nhotkey, to select the primary block type to use in some of the tool modes"); - public static final ConfigHotkey TOOL_SELECT_MODIFIER_BLOCK_2 = new ConfigHotkey("toolSelectModifierBlock2", "LEFT_SHIFT", KeybindSettings.MODIFIER_INGAME, "The modifier key to hold while using the 'toolSelectElements'\nhotkey, to select the secondary block type to use in some of the tool modes"); - public static final ConfigHotkey UNLOAD_CURRENT_SCHEMATIC = new ConfigHotkey("unloadCurrentSchematic", "", "Unloads the schematic of the currently selected placement,and thus also removes all placements created from it\n"); + public static final ConfigHotkey ADD_SELECTION_BOX = new ConfigHotkey("addSelectionBox", "M,A", "litematica.config.hotkeys.comment.addSelectionBox").translatedName("litematica.config.hotkeys.name.addSelectionBox"); + public static final ConfigHotkey CLONE_SELECTION = new ConfigHotkey("cloneSelection", "", "litematica.config.hotkeys.comment.cloneSelection").translatedName("litematica.config.hotkeys.name.cloneSelection"); + public static final ConfigHotkey DELETE_SELECTION_BOX = new ConfigHotkey("deleteSelectionBox", "", "litematica.config.hotkeys.comment.deleteSelectionBox").translatedName("litematica.config.hotkeys.name.deleteSelectionBox"); + public static final ConfigHotkey EASY_PLACE_ACTIVATION = new ConfigHotkey("easyPlaceUseKey", "BUTTON_2", KeybindSettings.PRESS_ALLOWEXTRA, "litematica.config.hotkeys.comment.easyPlaceUseKey").translatedName("litematica.config.hotkeys.name.easyPlaceUseKey"); + public static final ConfigHotkey EASY_PLACE_TOGGLE = new ConfigHotkey("easyPlaceToggle", "", "litematica.config.hotkeys.comment.easyPlaceToggle").translatedName("litematica.config.hotkeys.name.easyPlaceToggle"); + public static final ConfigHotkey EXECUTE_OPERATION = new ConfigHotkey("executeOperation", "", "litematica.config.hotkeys.comment.executeOperation").translatedName("litematica.config.hotkeys.name.executeOperation"); + public static final ConfigHotkey INVERT_GHOST_BLOCK_RENDER_STATE = new ConfigHotkey("invertGhostBlockRenderState", "", "litematica.config.hotkeys.comment.invertGhostBlockRenderState").translatedName("litematica.config.hotkeys.name.invertGhostBlockRenderState"); + public static final ConfigHotkey INVERT_OVERLAY_RENDER_STATE = new ConfigHotkey("invertOverlayRenderState", "", "litematica.config.hotkeys.comment.invertOverlayRenderState").translatedName("litematica.config.hotkeys.name.invertOverlayRenderState"); + public static final ConfigHotkey LAYER_MODE_NEXT = new ConfigHotkey("layerModeNext", "M,PAGE_UP", "litematica.config.hotkeys.comment.layerModeNext").translatedName("litematica.config.hotkeys.name.layerModeNext"); + public static final ConfigHotkey LAYER_MODE_PREVIOUS = new ConfigHotkey("layerModePrevious", "M,PAGE_DOWN", "litematica.config.hotkeys.comment.layerModePrevious").translatedName("litematica.config.hotkeys.name.layerModePrevious"); + public static final ConfigHotkey LAYER_NEXT = new ConfigHotkey("layerNext", "PAGE_UP", "litematica.config.hotkeys.comment.layerNext").translatedName("litematica.config.hotkeys.name.layerNext"); + public static final ConfigHotkey LAYER_PREVIOUS = new ConfigHotkey("layerPrevious", "PAGE_DOWN", "litematica.config.hotkeys.comment.layerPrevious").translatedName("litematica.config.hotkeys.name.layerPrevious"); + public static final ConfigHotkey LAYER_SET_HERE = new ConfigHotkey("layerSetHere", "", "litematica.config.hotkeys.comment.layerSetHere").translatedName("litematica.config.hotkeys.name.layerSetHere"); + public static final ConfigHotkey NUDGE_SELECTION_NEGATIVE = new ConfigHotkey("nudgeSelectionNegative", "", "litematica.config.hotkeys.comment.nudgeSelectionNegative").translatedName("litematica.config.hotkeys.name.nudgeSelectionNegative"); + public static final ConfigHotkey NUDGE_SELECTION_POSITIVE = new ConfigHotkey("nudgeSelectionPositive", "", "litematica.config.hotkeys.comment.nudgeSelectionPositive").translatedName("litematica.config.hotkeys.name.nudgeSelectionPositive"); + public static final ConfigHotkey MOVE_ENTIRE_SELECTION = new ConfigHotkey("moveEntireSelection", "", "litematica.config.hotkeys.comment.moveEntireSelection").translatedName("litematica.config.hotkeys.name.moveEntireSelection"); + public static final ConfigHotkey OPEN_GUI_AREA_SETTINGS = new ConfigHotkey("openGuiAreaSettings", "KP_MULTIPLY", "litematica.config.hotkeys.comment.openGuiAreaSettings").translatedName("litematica.config.hotkeys.name.openGuiAreaSettings"); + public static final ConfigHotkey OPEN_GUI_LOADED_SCHEMATICS = new ConfigHotkey("openGuiLoadedSchematics", "", "litematica.config.hotkeys.comment.openGuiLoadedSchematics").translatedName("litematica.config.hotkeys.name.openGuiLoadedSchematics"); + public static final ConfigHotkey OPEN_GUI_MAIN_MENU = new ConfigHotkey("openGuiMainMenu", "M", KeybindSettings.RELEASE_EXCLUSIVE, "litematica.config.hotkeys.comment.openGuiMainMenu").translatedName("litematica.config.hotkeys.name.openGuiMainMenu"); + public static final ConfigHotkey OPEN_GUI_MATERIAL_LIST = new ConfigHotkey("openGuiMaterialList", "M,L", "litematica.config.hotkeys.comment.openGuiMaterialList").translatedName("litematica.config.hotkeys.name.openGuiMaterialList"); + public static final ConfigHotkey OPEN_GUI_PLACEMENT_SETTINGS = new ConfigHotkey("openGuiPlacementSettings", "KP_SUBTRACT", "litematica.config.hotkeys.comment.openGuiPlacementSettings").translatedName("litematica.config.hotkeys.name.openGuiPlacementSettings"); + public static final ConfigHotkey OPEN_GUI_SCHEMATIC_PLACEMENTS = new ConfigHotkey("openGuiSchematicPlacements", "M,P", "litematica.config.hotkeys.comment.openGuiSchematicPlacements").translatedName("litematica.config.hotkeys.name.openGuiSchematicPlacements"); + public static final ConfigHotkey OPEN_GUI_SCHEMATIC_PROJECTS = new ConfigHotkey("openGuiSchematicProjects", "", "litematica.config.hotkeys.comment.openGuiSchematicProjects").translatedName("litematica.config.hotkeys.name.openGuiSchematicProjects"); + public static final ConfigHotkey OPEN_GUI_SCHEMATIC_VERIFIER = new ConfigHotkey("openGuiSchematicVerifier", "M,V", "litematica.config.hotkeys.comment.openGuiSchematicVerifier").translatedName("litematica.config.hotkeys.name.openGuiSchematicVerifier"); + public static final ConfigHotkey OPEN_GUI_SELECTION_MANAGER = new ConfigHotkey("openGuiSelectionManager", "M,S", "litematica.config.hotkeys.comment.openGuiSelectionManager").translatedName("litematica.config.hotkeys.name.openGuiSelectionManager"); + public static final ConfigHotkey OPEN_GUI_SETTINGS = new ConfigHotkey("openGuiSettings", "M,C", "litematica.config.hotkeys.comment.openGuiSettings").translatedName("litematica.config.hotkeys.name.openGuiSettings"); + public static final ConfigHotkey OPERATION_MODE_CHANGE_MODIFIER = new ConfigHotkey("operationModeChangeModifier", "LEFT_CONTROL", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.operationModeChangeModifier").translatedName("litematica.config.hotkeys.name.operationModeChangeModifier"); + public static final ConfigHotkey PICK_BLOCK_FIRST = new ConfigHotkey("pickBlockFirst", "BUTTON_3", KeybindSettings.PRESS_ALLOWEXTRA, "litematica.config.hotkeys.comment.pickBlockFirst").translatedName("litematica.config.hotkeys.name.pickBlockFirst"); + public static final ConfigHotkey PICK_BLOCK_LAST = new ConfigHotkey("pickBlockLast", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.pickBlockLast").translatedName("litematica.config.hotkeys.name.pickBlockLast"); + public static final ConfigHotkey PICK_BLOCK_TOGGLE = new ConfigHotkey("pickBlockToggle", "M,BUTTON_3", "litematica.config.hotkeys.comment.pickBlockToggle").translatedName("litematica.config.hotkeys.name.pickBlockToggle"); + public static final ConfigHotkey RENDER_INFO_OVERLAY = new ConfigHotkey("renderInfoOverlay", "I", KeybindSettings.PRESS_ALLOWEXTRA, "litematica.config.hotkeys.comment.renderInfoOverlay").translatedName("litematica.config.hotkeys.name.renderInfoOverlay"); + public static final ConfigHotkey RENDER_OVERLAY_THROUGH_BLOCKS = new ConfigHotkey("renderOverlayThroughBlocks", "RIGHT_CONTROL", KeybindSettings.PRESS_ALLOWEXTRA, "litematica.config.hotkeys.comment.renderOverlayThroughBlocks").translatedName("litematica.config.hotkeys.name.renderOverlayThroughBlocks"); + public static final ConfigHotkey RERENDER_SCHEMATIC = new ConfigHotkey("rerenderSchematic", "F3,M", "litematica.config.hotkeys.comment.rerenderSchematic").translatedName("litematica.config.hotkeys.name.rerenderSchematic"); + public static final ConfigHotkey SAVE_AREA_AS_IN_MEMORY_SCHEMATIC = new ConfigHotkey("saveAreaAsInMemorySchematic", "", "litematica.config.hotkeys.comment.saveAreaAsInMemorySchematic").translatedName("litematica.config.hotkeys.name.saveAreaAsInMemorySchematic"); + public static final ConfigHotkey SAVE_AREA_AS_SCHEMATIC_TO_FILE = new ConfigHotkey("saveAreaAsSchematicToFile", "LEFT_CONTROL,LEFT_ALT,S", "litematica.config.hotkeys.comment.saveAreaAsSchematicToFile").translatedName("litematica.config.hotkeys.name.saveAreaAsSchematicToFile"); + public static final ConfigHotkey SCHEMATIC_EDIT_BREAK_ALL_EXCEPT = new ConfigHotkey("schematicEditBreakAllExcept", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicEditBreakAllExcept").translatedName("litematica.config.hotkeys.name.schematicEditBreakAll"); + public static final ConfigHotkey SCHEMATIC_EDIT_BREAK_ALL = new ConfigHotkey("schematicEditBreakPlaceAll", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicEditBreakPlaceAll").translatedName("litematica.config.hotkeys.name.schematicEditBreakPlaceAll"); + public static final ConfigHotkey SCHEMATIC_EDIT_BREAK_DIRECTION = new ConfigHotkey("schematicEditBreakPlaceDirection", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicEditBreakPlaceDirection").translatedName("litematica.config.hotkeys.name.schematicEditBreakPlaceDirection"); + public static final ConfigHotkey SCHEMATIC_EDIT_REPLACE_ALL = new ConfigHotkey("schematicEditReplaceAll", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicEditReplaceAll").translatedName("litematica.config.hotkeys.name.schemaEditReplaceAll"); + public static final ConfigHotkey SCHEMATIC_EDIT_REPLACE_BLOCK = new ConfigHotkey("schematicEditReplaceBlock", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicEditReplaceBlock").translatedName("litematica.config.hotkeys.name.schemaEditReplaceBlock"); + public static final ConfigHotkey SCHEMATIC_EDIT_REPLACE_DIRECTION = new ConfigHotkey("schematicEditReplaceDirection", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicEditReplaceDirection").translatedName("litematica.config.hotkeys.name.schemaEditReplaceDirection"); + public static final ConfigHotkey SCHEMATIC_PLACEMENT_ROTATION = new ConfigHotkey("schematicPlacementRotation", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicPlacementRotation").translatedName("litematica.config.hotkeys.name.schematicPlacementRotation"); + public static final ConfigHotkey SCHEMATIC_PLACEMENT_MIRROR = new ConfigHotkey("schematicPlacementMirror", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicPlacementMirror").translatedName("litematica.config.hotkeys.name.schematicPlacementMirror"); + public static final ConfigHotkey SCHEMATIC_VERSION_CYCLE_MODIFIER = new ConfigHotkey("schematicVersionCycleModifier", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.schematicVersionCycleModifier").translatedName("litematica.config.hotkeys.name.schematicVersionCycleModifier"); + public static final ConfigHotkey SCHEMATIC_VERSION_CYCLE_NEXT = new ConfigHotkey("schematicVersionCycleNext", "", "litematica.config.hotkeys.comment.schematicVersionCycleNext").translatedName("litematica.config.hotkeys.name.schematicVersionCycleNext"); + public static final ConfigHotkey SCHEMATIC_VERSION_CYCLE_PREVIOUS = new ConfigHotkey("schematicVersionCyclePrevious", "", "litematica.config.hotkeys.comment.schematicVersionCyclePrevious").translatedName("litematica.config.hotkeys.name.schemaCyclePrevious"); + public static final ConfigHotkey SELECTION_GRAB_MODIFIER = new ConfigHotkey("selectionGrabModifier", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.selectionGrabModifier").translatedName("litematica.config.hotkeys.name.selectionGrabModifier"); + public static final ConfigHotkey SELECTION_GROW_HOTKEY = new ConfigHotkey("selectionGrow", "", "litematica.config.hotkeys.comment.selectionGrow").translatedName("litematica.config.hotkeys.name.selectionGrow"); + public static final ConfigHotkey SELECTION_GROW_MODIFIER = new ConfigHotkey("selectionGrowModifier", "", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.selectionGrowModifier").translatedName("litematica.config.hotkeys.name.selectionGrowModifier"); + public static final ConfigHotkey SELECTION_NUDGE_MODIFIER = new ConfigHotkey("selectionNudgeModifier", "LEFT_ALT", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.selectionNudgeModifier").translatedName("litematica.config.hotkeys.name.selectionNudgeModifier"); + public static final ConfigHotkey SELECTION_MODE_CYCLE = new ConfigHotkey("selectionModeCycle", "LEFT_CONTROL,M", "litematica.config.hotkeys.comment.selectionModeCycle").translatedName("litematica.config.hotkeys.name.selectionModeCycle"); + public static final ConfigHotkey SELECTION_SHRINK_HOTKEY = new ConfigHotkey("selectionShrink", "", "litematica.config.hotkeys.comment.selectionShrink").translatedName("litematica.config.hotkeys.name.selectionShrink"); + public static final ConfigHotkey SET_AREA_ORIGIN = new ConfigHotkey("setAreaOrigin", "", "litematica.config.hotkeys.comment.setAreaOrigin").translatedName("litematica.config.hotkeys.name.setAreaOrigin"); + public static final ConfigHotkey SET_SELECTION_BOX_POSITION_1 = new ConfigHotkey("setSelectionBoxPosition1", "", "litematica.config.hotkeys.comment.setSelectionBoxPosition1").translatedName("litematica.config.hotkeys.name.setSelectionBoxPosition1"); + public static final ConfigHotkey SET_SELECTION_BOX_POSITION_2 = new ConfigHotkey("setSelectionBoxPosition2", "", "litematica.config.hotkeys.comment.setSelectionBoxPosition2").translatedName("litematica.config.hotkeys.name.setSelectionBoxPosition2"); + public static final ConfigHotkey TOGGLE_ALL_RENDERING = new ConfigHotkey("toggleAllRendering", "M,R", "litematica.config.hotkeys.comment.toggleAllRendering", "litematica.config.hotkeys.prettyName.toggleAllRendering").translatedName("litematica.config.hotkeys.name.toggleAllRendering"); + public static final ConfigHotkey TOGGLE_AREA_SELECTION_RENDERING = new ConfigHotkey("toggleAreaSelectionBoxesRendering", "", "litematica.config.hotkeys.comment.toggleAreaSelectionBoxesRendering").translatedName("litematica.config.hotkeys.name.toggleAreaSelection"); + public static final ConfigHotkey TOGGLE_SCHEMATIC_RENDERING = new ConfigHotkey("toggleSchematicRendering", "M,G", "litematica.config.hotkeys.comment.toggleSchematicRendering").translatedName("litematica.config.hotkeys.name.toggleSchematicRendering"); + public static final ConfigHotkey TOGGLE_INFO_OVERLAY_RENDERING = new ConfigHotkey("toggleInfoOverlayRendering", "", "litematica.config.hotkeys.comment.toggleInfoOverlayRendering").translatedName("litematica.config.hotkeys.name.toggleInfoOverlayRendering"); + public static final ConfigHotkey TOGGLE_OVERLAY_RENDERING = new ConfigHotkey("toggleOverlayRendering", "", "litematica.config.hotkeys.comment.toggleOverlayRendering").translatedName("litematica.config.hotkeys.name.toggleOverlayRendering"); + public static final ConfigHotkey TOGGLE_OVERLAY_OUTLINE_RENDERING = new ConfigHotkey("toggleOverlayOutlineRendering", "", "litematica.config.hotkeys.comment.toggleOverlayOutlineRendering").translatedName("litematica.config.hotkeys.name.toggleOverlayOutlineRendering"); + public static final ConfigHotkey TOGGLE_OVERLAY_SIDE_RENDERING = new ConfigHotkey("toggleOverlaySideRendering", "", "litematica.config.hotkeys.comment.toggleOverlaySideRendering").translatedName("litematica.config.hotkeys.name.toggleOverlaySideRendering"); + public static final ConfigHotkey TOGGLE_PLACEMENT_BOXES_RENDERING = new ConfigHotkey("togglePlacementBoxesRendering", "", "litematica.config.hotkeys.comment.togglePlacementBoxesRendering").translatedName("litematica.config.hotkeys.name.togglePlacementBoxesRendering"); + public static final ConfigHotkey TOGGLE_PLACEMENT_RESTRICTION = new ConfigHotkey("togglePlacementRestriction", "", "litematica.config.hotkeys.comment.togglePlacementRestriction").translatedName("litematica.config.hotkeys.name.togglePlacementRestriction"); + public static final ConfigHotkey TOGGLE_SCHEMATIC_BLOCK_RENDERING = new ConfigHotkey("toggleSchematicBlockRendering", "", "litematica.config.hotkeys.comment.toggleSchematicBlockRendering").translatedName("litematica.config.hotkeys.name.toggleSchematicBlockRendering"); + public static final ConfigHotkey TOGGLE_SIGN_TEXT_PASTE = new ConfigHotkey("toggleSignTextPaste", "", "litematica.config.hotkeys.comment.toggleSignTextPaste").translatedName("litematica.config.hotkeys.name.toggleSignTextPaste"); + public static final ConfigHotkey TOGGLE_TRANSLUCENT_RENDERING = new ConfigHotkey("toggleTranslucentRendering", "", "litematica.config.hotkeys.comment.toggleTranslucentRendering").translatedName("litematica.config.hotkeys.name.toggleTranslucentRendering"); + public static final ConfigHotkey TOGGLE_VERIFIER_OVERLAY_RENDERING = new ConfigHotkey("toggleVerifierOverlayRendering", "", "litematica.config.hotkeys.comment.toggleVerifierOverlayRendering").translatedName("litematica.config.hotkeys.name.toggleVerifierOverlayRendering"); + public static final ConfigHotkey TOOL_ENABLED_TOGGLE = new ConfigHotkey("toolEnabledToggle", "M,T", "litematica.config.hotkeys.comment.toolEnabledToggle").translatedName("litematica.config.hotkeys.name.toggleEnabledToggle"); + public static final ConfigHotkey TOOL_PLACE_CORNER_1 = new ConfigHotkey("toolPlaceCorner1", "BUTTON_1", KeybindSettings.PRESS_ALLOWEXTRA, "litematica.config.hotkeys.comment.toolPlaceCorner1").translatedName("litematica.config.hotkeys.name.togglePlaceCorner1"); + public static final ConfigHotkey TOOL_PLACE_CORNER_2 = new ConfigHotkey("toolPlaceCorner2", "BUTTON_2", KeybindSettings.PRESS_ALLOWEXTRA, "litematica.config.hotkeys.comment.toolPlaceCorner2").translatedName("litematica.config.hotkeys.name.togglePlaceCorner2"); + public static final ConfigHotkey TOOL_SELECT_ELEMENTS = new ConfigHotkey("toolSelectElements", "BUTTON_3", KeybindSettings.PRESS_ALLOWEXTRA, "litematica.config.hotkeys.comment.toolSelectElements").translatedName("litematica.config.hotkeys.name.toggleSelectElements"); + public static final ConfigHotkey TOOL_SELECT_MODIFIER_BLOCK_1 = new ConfigHotkey("toolSelectModifierBlock1", "LEFT_ALT", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.toolSelectModifierBlock1").translatedName("litematica.config.hotkeys.name.toggleSelectModifierBlock1"); + public static final ConfigHotkey TOOL_SELECT_MODIFIER_BLOCK_2 = new ConfigHotkey("toolSelectModifierBlock2", "LEFT_SHIFT", KeybindSettings.MODIFIER_INGAME, "litematica.config.hotkeys.comment.toolSelectModifierBlock2").translatedName("litematica.config.hotkeys.name.toggleSelectModifierBlock2"); + public static final ConfigHotkey UNLOAD_CURRENT_SCHEMATIC = new ConfigHotkey("unloadCurrentSchematic", "", "litematica.config.hotkeys.comment.unloadCurrentSchematic").translatedName("litematica.config.hotkeys.name.unloadCurrentSchematic"); public static final List HOTKEY_LIST = ImmutableList.of( ADD_SELECTION_BOX, @@ -123,6 +125,8 @@ public class Hotkeys SCHEMATIC_EDIT_REPLACE_ALL, SCHEMATIC_EDIT_REPLACE_BLOCK, SCHEMATIC_EDIT_REPLACE_DIRECTION, + SCHEMATIC_PLACEMENT_ROTATION, + SCHEMATIC_PLACEMENT_MIRROR, SCHEMATIC_VERSION_CYCLE_MODIFIER, SCHEMATIC_VERSION_CYCLE_NEXT, SCHEMATIC_VERSION_CYCLE_PREVIOUS, diff --git a/src/main/java/fi/dy/masa/litematica/data/EntitiesDataStorage.java b/src/main/java/fi/dy/masa/litematica/data/EntitiesDataStorage.java index 004184e..585c467 100644 --- a/src/main/java/fi/dy/masa/litematica/data/EntitiesDataStorage.java +++ b/src/main/java/fi/dy/masa/litematica/data/EntitiesDataStorage.java @@ -17,8 +17,10 @@ import net.minecraft.nbt.NbtList; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; +import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import fi.dy.masa.malilib.interfaces.IClientTickHandler; @@ -33,6 +35,7 @@ import fi.dy.masa.litematica.network.ServuxLitematicaHandler; import fi.dy.masa.litematica.network.ServuxLitematicaPacket; import fi.dy.masa.litematica.util.EntityUtils; +import fi.dy.masa.litematica.util.WorldUtils; public class EntitiesDataStorage implements IClientTickHandler { @@ -49,15 +52,18 @@ public static EntitiesDataStorage getInstance() private boolean servuxServer = false; private boolean hasInValidServux = false; private String servuxVersion; + private final long chunkTimeoutMs = 5000; + // Wait 5 seconds for loaded Client Chunks to receive Entity Data private long serverTickTime = 0; // Requests to be executed - private Set pendingBlockEntitiesQueue = new LinkedHashSet<>(); - private Set pendingEntitiesQueue = new LinkedHashSet<>(); - private Set pendingChunks = new LinkedHashSet<>(); - private Set completedChunks = new LinkedHashSet<>(); + private final Set pendingBlockEntitiesQueue = new LinkedHashSet<>(); + private final Set pendingEntitiesQueue = new LinkedHashSet<>(); + private final Set pendingChunks = new LinkedHashSet<>(); + private final Set completedChunks = new LinkedHashSet<>(); + private final Map pendingChunkTimeout = new HashMap<>(); // To save vanilla query packet transaction - private Map> transactionToBlockPosOrEntityId = new HashMap<>(); + private final Map> transactionToBlockPosOrEntityId = new HashMap<>(); @Nullable public World getWorld() @@ -72,23 +78,38 @@ private EntitiesDataStorage() @Override public void onClientTick(MinecraftClient mc) { - uptimeTicks++; - if (System.currentTimeMillis() - serverTickTime > 50) + this.uptimeTicks++; + if (System.currentTimeMillis() - this.serverTickTime > 50) { // In this block, we do something every server tick if (Configs.Generic.ENTITY_DATA_SYNC.getBooleanValue() == false) { - serverTickTime = System.currentTimeMillis(); + this.serverTickTime = System.currentTimeMillis(); + + if (DataManager.getInstance().hasIntegratedServer() == false && this.hasServuxServer()) + { + this.servuxServer = false; + HANDLER.unregisterPlayReceiver(); + } return; } + else if (DataManager.getInstance().hasIntegratedServer() == false && + this.hasServuxServer() == false && + this.hasInValidServux == false && + this.getWorld() != null) + { + // Make sure we're Play Registered, and request Metadata + HANDLER.registerPlayReceiver(ServuxLitematicaPacket.Payload.ID, HANDLER::receivePlayPayload); + this.requestMetadata(); + } // 5 queries / server tick for (int i = 0; i < Configs.Generic.SERVER_NBT_REQUEST_RATE.getIntegerValue(); i++) { - if (!pendingBlockEntitiesQueue.isEmpty()) + if (!this.pendingBlockEntitiesQueue.isEmpty()) { - var iter = pendingBlockEntitiesQueue.iterator(); + var iter = this.pendingBlockEntitiesQueue.iterator(); BlockPos pos = iter.next(); iter.remove(); if (this.hasServuxServer()) @@ -100,9 +121,9 @@ public void onClientTick(MinecraftClient mc) requestQueryBlockEntity(pos); } } - if (!pendingEntitiesQueue.isEmpty()) + if (!this.pendingEntitiesQueue.isEmpty()) { - var iter = pendingEntitiesQueue.iterator(); + var iter = this.pendingEntitiesQueue.iterator(); int entityId = iter.next(); iter.remove(); if (this.hasServuxServer()) @@ -115,7 +136,7 @@ public void onClientTick(MinecraftClient mc) } } } - serverTickTime = System.currentTimeMillis(); + this.serverTickTime = System.currentTimeMillis(); } } @@ -244,13 +265,13 @@ public void requestBlockEntity(World world, BlockPos pos) { if (world.getBlockState(pos).getBlock() instanceof BlockEntityProvider) { - pendingBlockEntitiesQueue.add(pos); + this.pendingBlockEntitiesQueue.add(pos); } } public void requestEntity(int entityId) { - pendingEntitiesQueue.add(entityId); + this.pendingEntitiesQueue.add(entityId); } private void requestQueryBlockEntity(BlockPos pos) @@ -268,7 +289,7 @@ private void requestQueryBlockEntity(BlockPos pos) { handleBlockEntityData(pos, nbtCompound, null); }); - transactionToBlockPosOrEntityId.put(((IMixinDataQueryHandler) handler.getDataQueryHandler()).currentTransactionId(), Either.left(pos)); + this.transactionToBlockPosOrEntityId.put(((IMixinDataQueryHandler) handler.getDataQueryHandler()).currentTransactionId(), Either.left(pos)); } } @@ -279,7 +300,7 @@ private void requestQueryEntityData(int entityId) return; } - ClientPlayNetworkHandler handler = this.getVanillaHandler(); + ClientPlayNetworkHandler handler = getVanillaHandler(); if (handler != null) { @@ -287,7 +308,7 @@ private void requestQueryEntityData(int entityId) { handleEntityData(entityId, nbtCompound); }); - transactionToBlockPosOrEntityId.put(((IMixinDataQueryHandler) handler.getDataQueryHandler()).currentTransactionId(), Either.right(entityId)); + this.transactionToBlockPosOrEntityId.put(((IMixinDataQueryHandler) handler.getDataQueryHandler()).currentTransactionId(), Either.right(entityId)); } } @@ -321,22 +342,14 @@ public void requestServuxBulkEntityData(ChunkPos chunkPos, int minY, int maxY) NbtCompound req = new NbtCompound(); - if (this.completedChunks.contains(chunkPos)) - { - this.completedChunks.remove(chunkPos); - } - + this.completedChunks.remove(chunkPos); this.pendingChunks.add(chunkPos); + this.pendingChunkTimeout.put(chunkPos, Util.getMeasuringTimeMs()); - if (minY < -60) - { - minY = -60; - } - if (maxY > 319) - { - maxY = 319; - } + minY = MathHelper.clamp(minY, -60, 319); + maxY = MathHelper.clamp(maxY, -60, 319); + req.putString("Task", "BulkEntityRequest"); req.putInt("minY", minY); req.putInt("maxY", maxY); @@ -347,7 +360,7 @@ public void requestServuxBulkEntityData(ChunkPos chunkPos, int minY, int maxY) @Nullable public BlockEntity handleBlockEntityData(BlockPos pos, NbtCompound nbt, @Nullable Identifier type) { - pendingBlockEntitiesQueue.remove(pos); + this.pendingBlockEntitiesQueue.remove(pos); if (nbt == null || this.getWorld() == null) return null; BlockEntity blockEntity = this.getWorld().getBlockEntity(pos); @@ -375,7 +388,7 @@ public BlockEntity handleBlockEntityData(BlockPos pos, NbtCompound nbt, @Nullabl @Nullable public Entity handleEntityData(int entityId, NbtCompound nbt) { - pendingEntitiesQueue.remove(entityId); + this.pendingEntitiesQueue.remove(entityId); if (nbt == null || this.getWorld() == null) return null; Entity entity = this.getWorld().getEntityById(entityId); if (entity != null) @@ -391,41 +404,45 @@ public void handleBulkEntityData(int transactionId, @Nullable NbtCompound nbt) { return; } - NbtList tileList = nbt.contains("TileEntities") ? nbt.getList("TileEntities", Constants.NBT.TAG_COMPOUND) : new NbtList(); - NbtList entityList = nbt.contains("Entities") ? nbt.getList("Entities", Constants.NBT.TAG_COMPOUND) : new NbtList(); - ChunkPos chunkPos = new ChunkPos(nbt.getInt("chunkX"), nbt.getInt("chunkZ")); - for (int i = 0; i < tileList.size(); ++i) + // TODO --> Split out the task this way (I should have done this under sakura.12, etc), + // So we need to check if the "Task" is not included for now... (Wait for the updates to bake in) + if ((nbt.contains("Task") && nbt.getString("Task").equals("BulkEntityReply")) || + nbt.contains("Task") == false) { - NbtCompound te = tileList.getCompound(i); - BlockPos pos = NBTUtils.readBlockPos(te); - Identifier type = Identifier.of(te.getString("id")); + NbtList tileList = nbt.contains("TileEntities") ? nbt.getList("TileEntities", Constants.NBT.TAG_COMPOUND) : new NbtList(); + NbtList entityList = nbt.contains("Entities") ? nbt.getList("Entities", Constants.NBT.TAG_COMPOUND) : new NbtList(); + ChunkPos chunkPos = new ChunkPos(nbt.getInt("chunkX"), nbt.getInt("chunkZ")); - handleBlockEntityData(pos, te, type); - } + for (int i = 0; i < tileList.size(); ++i) + { + NbtCompound te = tileList.getCompound(i); + BlockPos pos = NBTUtils.readBlockPos(te); + Identifier type = Identifier.of(te.getString("id")); - for (int i = 0; i < entityList.size(); ++i) - { - NbtCompound ent = entityList.getCompound(i); - Vec3d pos = NBTUtils.readEntityPositionFromTag(ent); - int entityId = ent.getInt("entityId"); + handleBlockEntityData(pos, te, type); + } - handleEntityData(entityId, ent); - } + for (int i = 0; i < entityList.size(); ++i) + { + NbtCompound ent = entityList.getCompound(i); + Vec3d pos = NBTUtils.readEntityPositionFromTag(ent); + int entityId = ent.getInt("entityId"); - if (this.pendingChunks.contains(chunkPos)) - { - this.pendingChunks.remove(chunkPos); - } + handleEntityData(entityId, ent); + } - this.completedChunks.add(chunkPos); + this.pendingChunks.remove(chunkPos); + this.pendingChunkTimeout.remove(chunkPos); + this.completedChunks.add(chunkPos); - Litematica.debugLog("EntitiesDataStorage#handleBulkEntityData(): [ChunkPos {}] received TE: [{}], and E: [{}] entiries from Servux", chunkPos.toString(), tileList.size(), entityList.size()); + Litematica.debugLog("EntitiesDataStorage#handleBulkEntityData(): [ChunkPos {}] received TE: [{}], and E: [{}] entiries from Servux", chunkPos.toString(), tileList.size(), entityList.size()); + } } public void handleVanillaQueryNbt(int transactionId, NbtCompound nbt) { - Either either = transactionToBlockPosOrEntityId.remove(transactionId); + Either either = this.transactionToBlockPosOrEntityId.remove(transactionId); if (either != null) { either.ifLeft(pos -> handleBlockEntityData(pos, nbt, null)) @@ -439,9 +456,32 @@ public boolean hasPendingChunk(ChunkPos pos) { return this.pendingChunks.contains(pos); } - else + + return false; + } + + private void checkForPendingChunkTimeout(ChunkPos pos) + { + if (this.hasServuxServer() && this.hasPendingChunk(pos)) { - return false; + long now = Util.getMeasuringTimeMs(); + + // Take no action when ChunkPos is not loaded by the ClientWorld. + if (WorldUtils.isClientChunkLoaded(mc.world, pos.x, pos.z) == false) + { + this.pendingChunkTimeout.replace(pos, now); + return; + } + + long duration = now - this.pendingChunkTimeout.get(pos); + + if (duration > this.chunkTimeoutMs) + { + //Litematica.debugLog("EntitiesDataStorage#checkForPendingChunkTimeout(): [ChunkPos {}] has timed out waiting for data, marking complete without Receiving Entity Data.", pos.toString()); + this.pendingChunkTimeout.remove(pos); + this.pendingChunks.remove(pos); + this.completedChunks.add(pos); + } } } @@ -449,12 +489,11 @@ public boolean hasCompletedChunk(ChunkPos pos) { if (this.hasServuxServer()) { + this.checkForPendingChunkTimeout(pos); return this.completedChunks.contains(pos); } - else - { - return true; - } + + return true; } public void markCompletedChunkDirty(ChunkPos pos) diff --git a/src/main/java/fi/dy/masa/litematica/event/KeyCallbacks.java b/src/main/java/fi/dy/masa/litematica/event/KeyCallbacks.java index f8d1f06..c11bd8e 100644 --- a/src/main/java/fi/dy/masa/litematica/event/KeyCallbacks.java +++ b/src/main/java/fi/dy/masa/litematica/event/KeyCallbacks.java @@ -2,6 +2,8 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; import fi.dy.masa.litematica.config.Configs; import fi.dy.masa.litematica.config.Hotkeys; @@ -93,13 +95,14 @@ public static void init(MinecraftClient mc) Hotkeys.TOOL_SELECT_MODIFIER_BLOCK_1.getKeybind().setCallback(callbackHotkeys); Hotkeys.TOOL_SELECT_MODIFIER_BLOCK_2.getKeybind().setCallback(callbackHotkeys); Hotkeys.UNLOAD_CURRENT_SCHEMATIC.getKeybind().setCallback(callbackHotkeys); - Hotkeys.ADD_SELECTION_BOX.getKeybind().setCallback(callbackMessage); Hotkeys.DELETE_SELECTION_BOX.getKeybind().setCallback(callbackMessage); Hotkeys.EASY_PLACE_TOGGLE.getKeybind().setCallback(new KeyCallbackToggleBooleanConfigWithMessage(Configs.Generic.EASY_PLACE_MODE)); Hotkeys.MOVE_ENTIRE_SELECTION.getKeybind().setCallback(callbackMessage); Hotkeys.SELECTION_MODE_CYCLE.getKeybind().setCallback(callbackMessage); Hotkeys.SET_AREA_ORIGIN.getKeybind().setCallback(callbackMessage); + Hotkeys.SCHEMATIC_PLACEMENT_ROTATION.getKeybind().setCallback(callbackMessage); + Hotkeys.SCHEMATIC_PLACEMENT_MIRROR.getKeybind().setCallback(callbackMessage); Hotkeys.SET_SELECTION_BOX_POSITION_1.getKeybind().setCallback(callbackMessage); Hotkeys.SET_SELECTION_BOX_POSITION_2.getKeybind().setCallback(callbackMessage); Hotkeys.TOGGLE_ALL_RENDERING.getKeybind().setCallback(new RenderToggle(Configs.Visuals.ENABLE_RENDERING)); @@ -618,6 +621,34 @@ else if (mode.getUsesSchematic()) return true; } } + else if (key == Hotkeys.SCHEMATIC_PLACEMENT_ROTATION.getKeybind()) { + SchematicPlacement placement = DataManager.getSchematicPlacementManager().getSelectedSchematicPlacement(); + if(placement != null) { + BlockRotation rotation = PositionUtils.cycleRotation(placement.getRotation(), false); + if(placement.isLocked()) { + InfoUtils.showGuiOrActionBarMessage(MessageType.ERROR, "litematica.message.placement.cant_modify_is_locked"); + } + else { + placement.setRotation(rotation, null); + InfoUtils.printActionbarMessage("litematica.message.placement.rotation_set_to", PositionUtils.getRotationNameShort(rotation)); + } + return true; + } + } + else if (key == Hotkeys.SCHEMATIC_PLACEMENT_MIRROR.getKeybind()) { + SchematicPlacement placement = DataManager.getSchematicPlacementManager().getSelectedSchematicPlacement(); + if(placement != null) { + BlockMirror mirror = PositionUtils.cycleMirror(placement.getMirror(), false); + if(placement.isLocked()) { + InfoUtils.showGuiOrActionBarMessage(MessageType.ERROR, "litematica.message.placement.cant_modify_is_locked"); + } + else { + placement.setMirror(mirror, null); + InfoUtils.printActionbarMessage("litematica.message.placement.mirror_set_to", PositionUtils.getMirrorName(mirror)); + } + return true; + } + } else if (key == Hotkeys.SELECTION_MODE_CYCLE.getKeybind()) { if (mode == ToolMode.DELETE) diff --git a/src/main/java/fi/dy/masa/litematica/event/RenderHandler.java b/src/main/java/fi/dy/masa/litematica/event/RenderHandler.java index 2adfea7..caa97c7 100644 --- a/src/main/java/fi/dy/masa/litematica/event/RenderHandler.java +++ b/src/main/java/fi/dy/masa/litematica/event/RenderHandler.java @@ -50,8 +50,11 @@ public void onRenderGameOverlayPost(DrawContext drawContext) if (GuiUtils.getCurrentScreen() == null) { - ToolHud.getInstance().renderHud(drawContext); - OverlayRenderer.getInstance().renderHoverInfo(mc, drawContext); + if (mc.options.hudHidden == false) + { + ToolHud.getInstance().renderHud(drawContext); + OverlayRenderer.getInstance().renderHoverInfo(mc, drawContext); + } if (GuiSchematicManager.hasPendingPreviewTask()) { diff --git a/src/main/java/fi/dy/masa/litematica/gui/GuiPlacementConfiguration.java b/src/main/java/fi/dy/masa/litematica/gui/GuiPlacementConfiguration.java index d6de6db..571effb 100644 --- a/src/main/java/fi/dy/masa/litematica/gui/GuiPlacementConfiguration.java +++ b/src/main/java/fi/dy/masa/litematica/gui/GuiPlacementConfiguration.java @@ -433,6 +433,7 @@ public void actionPerformedWithButton(ButtonBase button, int mouseButton) case OPEN_MATERIAL_LIST_GUI: { MaterialListBase materialList = this.placement.getMaterialList(); + materialList.reCreateMaterialList(); GuiMaterialList gui = new GuiMaterialList(materialList); DataManager.setMaterialList(materialList); // Remember the last opened material list for the hotkey to (re-) open it gui.setParent(this.parent); diff --git a/src/main/java/fi/dy/masa/litematica/gui/GuiSchematicManager.java b/src/main/java/fi/dy/masa/litematica/gui/GuiSchematicManager.java index 2cbf07d..07dffa0 100644 --- a/src/main/java/fi/dy/masa/litematica/gui/GuiSchematicManager.java +++ b/src/main/java/fi/dy/masa/litematica/gui/GuiSchematicManager.java @@ -84,6 +84,7 @@ private void createButtons() x = this.createButton(x, y, ButtonListener.Type.SET_PREVIEW); x = this.createButton(x, y, ButtonListener.Type.EXPORT_SCHEMATIC); x = this.createButton(x, y, ButtonListener.Type.EXPORT_TYPE); + x = this.createButton(x, y, ButtonListener.Type.IMPORT_SCHEMATIC); x = this.createButton(x, y, ButtonListener.Type.DELETE_SCHEMATIC); } else if (type == FileType.SCHEMATICA_SCHEMATIC || type == FileType.VANILLA_STRUCTURE) @@ -236,7 +237,8 @@ public void actionPerformedWithButton(ButtonBase button, int mouseButton) } else if (this.type == Type.IMPORT_SCHEMATIC) { - if (fileType == FileType.SCHEMATICA_SCHEMATIC || + if (fileType == FileType.LITEMATICA_SCHEMATIC || + fileType == FileType.SCHEMATICA_SCHEMATIC || fileType == FileType.VANILLA_STRUCTURE) { GuiSchematicSaveImported gui = new GuiSchematicSaveImported(entry.getType(), entry.getDirectory(), entry.getName()); diff --git a/src/main/java/fi/dy/masa/litematica/gui/GuiSchematicSaveImported.java b/src/main/java/fi/dy/masa/litematica/gui/GuiSchematicSaveImported.java index dae7d75..b6afb07 100644 --- a/src/main/java/fi/dy/masa/litematica/gui/GuiSchematicSaveImported.java +++ b/src/main/java/fi/dy/masa/litematica/gui/GuiSchematicSaveImported.java @@ -87,7 +87,17 @@ public void actionPerformedWithButton(ButtonBase button, int mouseButton) boolean ignoreEntities = this.gui.checkboxIgnoreEntities.isChecked(); FileType fileType = FileType.fromFile(new File(inDir, inFile)); - if (fileType == FileType.SCHEMATICA_SCHEMATIC) + if (fileType == FileType.LITEMATICA_SCHEMATIC) + { + if (WorldUtils.convertLitematicaSchematicToLitematicaSchematic(inDir, inFile, dir, fileName, ignoreEntities, override, this.gui)) + { + this.gui.addMessage(MessageType.SUCCESS, "litematica.message.litematic_saved_as", fileName); + this.gui.getListWidget().refreshEntries(); + } + + return; + } + else if (fileType == FileType.SCHEMATICA_SCHEMATIC) { if (WorldUtils.convertSchematicaSchematicToLitematicaSchematic(inDir, inFile, dir, fileName, ignoreEntities, override, this.gui)) { diff --git a/src/main/java/fi/dy/masa/litematica/materials/MaterialListBase.java b/src/main/java/fi/dy/masa/litematica/materials/MaterialListBase.java index a6a6abd..364735d 100644 --- a/src/main/java/fi/dy/masa/litematica/materials/MaterialListBase.java +++ b/src/main/java/fi/dy/masa/litematica/materials/MaterialListBase.java @@ -23,7 +23,7 @@ public abstract class MaterialListBase implements IMaterialList @Nullable protected ICompletionListener completionListener; protected SortCriteria sortCriteria = SortCriteria.COUNT_TOTAL; protected BlockInfoListType materialListType = BlockInfoListType.ALL; - protected boolean reverse; + protected boolean reverse = false; protected boolean hideAvailable; protected int multiplier = 1; protected long countTotal; diff --git a/src/main/java/fi/dy/masa/litematica/materials/MaterialListSorter.java b/src/main/java/fi/dy/masa/litematica/materials/MaterialListSorter.java index b5614b9..a2a9092 100644 --- a/src/main/java/fi/dy/masa/litematica/materials/MaterialListSorter.java +++ b/src/main/java/fi/dy/masa/litematica/materials/MaterialListSorter.java @@ -1,6 +1,7 @@ package fi.dy.masa.litematica.materials; import java.util.Comparator; +import fi.dy.masa.litematica.materials.MaterialListBase.SortCriteria; public class MaterialListSorter implements Comparator { @@ -14,14 +15,23 @@ public MaterialListSorter(MaterialListBase materialList) @Override public int compare(MaterialListEntry entry1, MaterialListEntry entry2) { - int cmp = switch (this.materialList.getSortCriteria()) { - case COUNT_TOTAL -> entry1.getCountTotal() - entry2.getCountTotal(); - case COUNT_MISSING -> entry1.getCountMissing() - entry2.getCountMissing(); - case COUNT_AVAILABLE -> entry1.getCountAvailable() - entry2.getCountAvailable(); - default -> 0; - }; - if(cmp==0) - cmp = entry1.getStack().getName().getString().compareTo(entry2.getStack().getName().getString()); - return this.materialList.getSortInReverse()? -cmp: cmp; + boolean reverse = this.materialList.getSortInReverse(); + SortCriteria sortCriteria = this.materialList.getSortCriteria(); + int nameCompare = entry1.getStack().getName().getString().compareTo(entry2.getStack().getName().getString()); + + if (sortCriteria == SortCriteria.COUNT_TOTAL) + { + return entry1.getCountTotal() == entry2.getCountTotal() ? nameCompare : ((entry1.getCountTotal() > entry2.getCountTotal()) != reverse ? -1 : 1); + } + else if (sortCriteria == SortCriteria.COUNT_MISSING) + { + return entry1.getCountMissing() == entry2.getCountMissing() ? nameCompare : ((entry1.getCountMissing() > entry2.getCountMissing()) != reverse ? -1 : 1); + } + else if (sortCriteria == SortCriteria.COUNT_AVAILABLE) + { + return entry1.getCountAvailable() == entry2.getCountAvailable() ? nameCompare : ((entry1.getCountAvailable() > entry2.getCountAvailable()) != reverse ? -1 : 1); + } + + return reverse == false ? nameCompare * -1 : nameCompare; } } diff --git a/src/main/java/fi/dy/masa/litematica/mixin/MixinHandledScreen.java b/src/main/java/fi/dy/masa/litematica/mixin/MixinHandledScreen.java index d3ccccd..04c5f05 100644 --- a/src/main/java/fi/dy/masa/litematica/mixin/MixinHandledScreen.java +++ b/src/main/java/fi/dy/masa/litematica/mixin/MixinHandledScreen.java @@ -4,12 +4,10 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.text.Text; - import fi.dy.masa.litematica.materials.MaterialListHudRenderer; @Mixin(HandledScreen.class) @@ -22,7 +20,13 @@ private MixinHandledScreen(Text title) @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Drawable;render(Lnet/minecraft/client/gui/DrawContext;IIF)V")) - private void renderSlotHighlights(DrawContext drawContext, int mouseX, int mouseY, float delta, CallbackInfo ci) + private void litematica_renderSlotHighlightsPre(DrawContext drawContext, int mouseX, int mouseY, float delta, CallbackInfo ci) + { + MaterialListHudRenderer.renderLookedAtBlockInInventory((HandledScreen) (Object) this, this.client); + } + + @Inject(method = "render", at = @At("TAIL")) + private void litematica_renderSlotHighlightsPost(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { MaterialListHudRenderer.renderLookedAtBlockInInventory((HandledScreen) (Object) this, this.client); } diff --git a/src/main/java/fi/dy/masa/litematica/mixin/MixinWorldRenderer.java b/src/main/java/fi/dy/masa/litematica/mixin/MixinWorldRenderer.java index c706fd9..95ed253 100644 --- a/src/main/java/fi/dy/masa/litematica/mixin/MixinWorldRenderer.java +++ b/src/main/java/fi/dy/masa/litematica/mixin/MixinWorldRenderer.java @@ -35,8 +35,6 @@ private void onPostSetupTerrain( @Inject(method = "renderLayer", at = @At("TAIL")) private void onRenderLayer(RenderLayer renderLayer, double x, double y, double z, Matrix4f matrix4f, Matrix4f positionMatrix, CallbackInfo ci) { - //Litematica.logger.error("onRenderLayer(): [Mixin] layer [{}], [{}, {}, {}]", renderLayer.getDrawMode().name(), x, y, z); - if (renderLayer == RenderLayer.getSolid()) { LitematicaRenderer.getInstance().piecewiseRenderSolid(matrix4f, positionMatrix); diff --git a/src/main/java/fi/dy/masa/litematica/network/ServuxLitematicaHandler.java b/src/main/java/fi/dy/masa/litematica/network/ServuxLitematicaHandler.java index d372056..8669098 100644 --- a/src/main/java/fi/dy/masa/litematica/network/ServuxLitematicaHandler.java +++ b/src/main/java/fi/dy/masa/litematica/network/ServuxLitematicaHandler.java @@ -4,6 +4,8 @@ import lol.bai.badpackets.api.play.ClientPlayContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtSizeTracker; import net.minecraft.network.PacketByteBuf; import net.minecraft.network.packet.CustomPayload; import net.minecraft.util.Identifier; @@ -16,7 +18,6 @@ import fi.dy.masa.litematica.data.EntitiesDataStorage; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -//import org.thinkingstudio.fabric.api.client.networking.v1.ClientPlayNetworking; @OnlyIn(Dist.CLIENT) public abstract class ServuxLitematicaHandler implements IPluginClientPlayHandler @@ -96,7 +97,7 @@ public

void decodeClientData(Identifier channel, try { this.readingSessionKey = -1; - EntitiesDataStorage.getInstance().handleBulkEntityData(fullPacket.readVarInt(), fullPacket.readNbt()); + EntitiesDataStorage.getInstance().handleBulkEntityData(fullPacket.readVarInt(), (NbtCompound) fullPacket.readNbt(NbtSizeTracker.ofUnlimitedBytes())); } catch (Exception e) { diff --git a/src/main/java/fi/dy/masa/litematica/render/RenderUtils.java b/src/main/java/fi/dy/masa/litematica/render/RenderUtils.java index 2d9c353..dc3d3ad 100644 --- a/src/main/java/fi/dy/masa/litematica/render/RenderUtils.java +++ b/src/main/java/fi/dy/masa/litematica/render/RenderUtils.java @@ -1,9 +1,11 @@ package fi.dy.masa.litematica.render; import java.util.List; +import it.unimi.dsi.fastutil.objects.Object2ByteLinkedOpenHashMap; import org.joml.Matrix4f; import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; @@ -11,11 +13,15 @@ import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.BakedQuad; import net.minecraft.inventory.Inventory; +import net.minecraft.util.function.BooleanBiFunction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.util.math.random.LocalRandom; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; import net.minecraft.world.World; import fi.dy.masa.litematica.Litematica; @@ -234,10 +240,7 @@ private static void drawBoundingBoxEdges(float minX, float minY, float minZ, flo BufferRenderer.drawWithGlobalProgram(meshData); meshData.close(); } - catch (Exception e) - { - Litematica.logger.error("drawBoundingBoxEdges: Failed to draw Area Selection box (Error: {})", e.getLocalizedMessage()); - } + catch (Exception ignored) { } } private static void drawBoundingBoxLinesX(BufferBuilder buffer, float minX, float minY, float minZ, float maxX, float maxY, float maxZ, Color4f color) @@ -303,10 +306,7 @@ public static void renderAreaSides(BlockPos pos1, BlockPos pos2, Color4f color, BufferRenderer.drawWithGlobalProgram(meshData); meshData.close(); } - catch (Exception e) - { - Litematica.logger.error("renderAreaSides: Failed to draw Area Selection box (Error: {})", e.getLocalizedMessage()); - } + catch (Exception ignored) { } RenderSystem.enableCull(); RenderSystem.disableBlend(); @@ -489,10 +489,7 @@ public static void renderAreaOutlineNoCorners(BlockPos pos1, BlockPos pos2, BufferRenderer.drawWithGlobalProgram(meshData); meshData.close(); } - catch (Exception e) - { - Litematica.logger.error("renderAreaOutlineNoCorners: Failed to draw Area Selection box (Error: {})", e.getLocalizedMessage()); - } + catch (Exception ignored) { } } /** @@ -508,7 +505,7 @@ public static void drawBlockModelOutlinesBatched(BakedModel model, BlockState st renderModelQuadOutlines(model, state, pos, null, color, expand, buffer); } - private static void renderModelQuadOutlines(BakedModel model, BlockState state, BlockPos pos, Direction side, Color4f color, double expand, BufferBuilder buffer) + public static void renderModelQuadOutlines(BakedModel model, BlockState state, BlockPos pos, Direction side, Color4f color, double expand, BufferBuilder buffer) { try { @@ -578,11 +575,11 @@ public static void drawBlockModelQuadOverlayBatched(BakedModel model, BlockState private static void renderModelQuadOverlayBatched(BlockPos pos, BufferBuilder buffer, Color4f color, List quads) { - final int size = quads.size(); + //final int size = quads.size(); - for (int i = 0; i < size; i++) + for (BakedQuad quad : quads) { - renderModelQuadOverlayBatched(pos, buffer, color, quads.get(i).getVertexData()); + renderModelQuadOverlayBatched(pos, buffer, color, quad.getVertexData()); } } diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BlockModelRendererSchematic.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BlockModelRendererSchematic.java index 467a2b6..e3f5384 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BlockModelRendererSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BlockModelRendererSchematic.java @@ -15,9 +15,11 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.random.BaseRandom; import net.minecraft.util.math.random.LocalRandom; +import net.minecraft.util.math.random.Random; import net.minecraft.world.BlockRenderView; import fi.dy.masa.malilib.util.PositionUtils; import fi.dy.masa.litematica.config.Configs; @@ -67,22 +69,24 @@ public boolean renderModel(BlockRenderView worldIn, BakedModel modelIn, BlockSta } } - public boolean renderModelSmooth(BlockRenderView worldIn, BakedModel modelIn, BlockState stateIn, BlockPos posIn, MatrixStack matrixStack, + private boolean renderModelSmooth(BlockRenderView worldIn, BakedModel modelIn, BlockState stateIn, BlockPos posIn, MatrixStack matrixStack, VertexConsumer vertexConsumer, BaseRandom random, long seedIn, int overlay) { boolean renderedSomething = false; float[] quadBounds = new float[PositionUtils.ALL_DIRECTIONS.length * 2]; BitSet bitset = new BitSet(3); AmbientOcclusionCalculator aoFace = new AmbientOcclusionCalculator(); + BlockPos.Mutable mutablePos = posIn.mutableCopy(); for (Direction side : PositionUtils.ALL_DIRECTIONS) { random.setSeed(seedIn); List quads = modelIn.getQuads(stateIn, side, random); - if (quads.isEmpty() == false) + if (!quads.isEmpty()) { - if (this.shouldRenderModelSide(worldIn, stateIn, posIn, side)) + mutablePos.set(posIn, side); + if (this.shouldRenderModelSide(worldIn, stateIn, posIn, side, mutablePos)) { this.renderQuadsSmooth(worldIn, stateIn, posIn, matrixStack, vertexConsumer, quads, quadBounds, bitset, aoFace, overlay); renderedSomething = true; @@ -93,7 +97,7 @@ public boolean renderModelSmooth(BlockRenderView worldIn, BakedModel modelIn, Bl random.setSeed(seedIn); List quads = modelIn.getQuads(stateIn, null, random); - if (quads.isEmpty() == false) + if (!quads.isEmpty()) { this.renderQuadsSmooth(worldIn, stateIn, posIn, matrixStack, vertexConsumer, quads, quadBounds, bitset, aoFace, overlay); renderedSomething = true; @@ -102,23 +106,26 @@ public boolean renderModelSmooth(BlockRenderView worldIn, BakedModel modelIn, Bl return renderedSomething; } - public boolean renderModelFlat(BlockRenderView worldIn, BakedModel modelIn, BlockState stateIn, + private boolean renderModelFlat(BlockRenderView worldIn, BakedModel modelIn, BlockState stateIn, BlockPos posIn, MatrixStack matrixStack, VertexConsumer vertexConsumer, BaseRandom random, long seedIn, int overlay) { boolean renderedSomething = false; BitSet bitset = new BitSet(3); + BlockPos.Mutable mutablePos = posIn.mutableCopy(); for (Direction side : PositionUtils.ALL_DIRECTIONS) { random.setSeed(seedIn); List quads = modelIn.getQuads(stateIn, side, random); - if (quads.isEmpty() == false) + if (!quads.isEmpty()) { - if (this.shouldRenderModelSide(worldIn, stateIn, posIn, side)) + mutablePos.set(posIn, side); + if (this.shouldRenderModelSide(worldIn, stateIn, posIn, side, mutablePos)) { - int light = WorldRenderer.getLightmapCoordinates(worldIn, stateIn, posIn.offset(side)); + //int light = WorldRenderer.getLightmapCoordinates(worldIn, stateIn, posIn.offset(side)); + int light = WorldRenderer.getLightmapCoordinates(worldIn, stateIn, mutablePos); this.renderQuadsFlat(worldIn, stateIn, posIn, light, overlay, false, matrixStack, vertexConsumer, quads, bitset); renderedSomething = true; } @@ -128,7 +135,7 @@ public boolean renderModelFlat(BlockRenderView worldIn, BakedModel modelIn, Bloc random.setSeed(seedIn); List quads = modelIn.getQuads(stateIn, null, random); - if (quads.isEmpty() == false) + if (!quads.isEmpty()) { this.renderQuadsFlat(worldIn, stateIn, posIn, -1, overlay, true, matrixStack, vertexConsumer, quads, bitset); renderedSomething = true; @@ -137,22 +144,21 @@ public boolean renderModelFlat(BlockRenderView worldIn, BakedModel modelIn, Bloc return renderedSomething; } - protected boolean shouldRenderModelSide(BlockRenderView worldIn, BlockState stateIn, BlockPos posIn, Direction side) + private boolean shouldRenderModelSide(BlockRenderView worldIn, BlockState stateIn, BlockPos posIn, Direction side, BlockPos mutable) { return DataManager.getRenderLayerRange().isPositionAtRenderEdgeOnSide(posIn, side) || (Configs.Visuals.RENDER_BLOCKS_AS_TRANSLUCENT.getBooleanValue() && Configs.Visuals.RENDER_TRANSLUCENT_INNER_SIDES.getBooleanValue()) || - Block.shouldDrawSide(stateIn, worldIn, posIn, side ,posIn.offset(side)); + //Block.shouldDrawSide(stateIn, worldIn, posIn, side, posIn.offset(side)); + Block.shouldDrawSide(stateIn, worldIn, posIn, side, mutable); } - protected void renderQuadsSmooth(BlockRenderView world, BlockState state, BlockPos pos, MatrixStack matrixStack, + private void renderQuadsSmooth(BlockRenderView world, BlockState state, BlockPos pos, MatrixStack matrixStack, VertexConsumer vertexConsumer, List list, float[] box, BitSet flags, AmbientOcclusionCalculator ambientOcclusionCalculator, int overlay) { - final int size = list.size(); + //final int size = list.size(); - for (int i = 0; i < size; ++i) + for (BakedQuad bakedQuad : list) { - BakedQuad bakedQuad = list.get(i); - this.getQuadDimensions(world, state, pos, bakedQuad.getVertexData(), bakedQuad.getFace(), box, flags); ambientOcclusionCalculator.apply(world, state, pos, bakedQuad.getFace(), box, flags, bakedQuad.hasShade()); @@ -168,15 +174,13 @@ protected void renderQuadsSmooth(BlockRenderView world, BlockState state, BlockP } } - protected void renderQuadsFlat(BlockRenderView world, BlockState state, BlockPos pos, + private void renderQuadsFlat(BlockRenderView world, BlockState state, BlockPos pos, int light, int overlay, boolean useWorldLight, MatrixStack matrixStack, VertexConsumer vertexConsumer, List list, BitSet flags) { - final int size = list.size(); + //final int size = list.size(); - for (int i = 0; i < size; ++i) + for (BakedQuad bakedQuad : list) { - BakedQuad bakedQuad = list.get(i); - if (useWorldLight) { this.getQuadDimensions(world, state, pos, bakedQuad.getVertexData(), bakedQuad.getFace(), null, flags); @@ -188,7 +192,7 @@ protected void renderQuadsFlat(BlockRenderView world, BlockState state, BlockPos } } - protected void renderQuad(BlockRenderView world, BlockState state, BlockPos pos, VertexConsumer vertexConsumer, MatrixStack matrixStack, + private void renderQuad(BlockRenderView world, BlockState state, BlockPos pos, VertexConsumer vertexConsumer, MatrixStack matrixStack, BakedQuad quad, float brightness0, float brightness1, float brightness2, float brightness3, int light0, int light1, int light2, int light3, int overlay) { @@ -213,7 +217,7 @@ protected void renderQuad(BlockRenderView world, BlockState state, BlockPos pos, r, g, b, 1.0f, new int[]{ light0, light1, light2, light3 }, overlay, true); } - protected void getQuadDimensions(BlockRenderView world, BlockState state, BlockPos pos, int[] vertexData, Direction face, @Nullable float[] box, BitSet flags) + private void getQuadDimensions(BlockRenderView world, BlockState state, BlockPos pos, int[] vertexData, Direction face, @Nullable float[] box, BitSet flags) { float minX = 32.0F; float minY = 32.0F; @@ -353,7 +357,73 @@ private void fillQuadBounds(BlockRenderView world, BlockState stateIn, BlockPos } */ - class AmbientOcclusionCalculator + public void renderEntity(VertexConsumer vertexConsumer, MatrixStack matrixStack, @Nullable BlockState stateIn, BakedModel modelIn, + float red, float green, float blue, int light, int overlay) + { + Random rand = Random.create(); + long life = 42L; + for (Direction side : PositionUtils.ALL_DIRECTIONS) + { + rand.setSeed(life); + this.renderQuads(vertexConsumer, matrixStack, red, green, blue, modelIn.getQuads(stateIn, side, rand), light, overlay); + } + rand.setSeed(life); + this.renderQuads(vertexConsumer, matrixStack, red, green, blue, modelIn.getQuads(stateIn, null, rand), light, overlay); + } + + private void renderQuads(VertexConsumer vertexConsumer, MatrixStack matrixStack, + float red, float green, float blue, List quads, int light, int overlay) + { + for (BakedQuad quad : quads) + { + float h; + float g; + float f; + + if (quad.hasColor()) + { + f = MathHelper.clamp(red, 0.0f, 1.0f); + g = MathHelper.clamp(green, 0.0f, 1.0f); + h = MathHelper.clamp(blue, 0.0f, 1.0f); + } + else + { + h = 1.0F; + g = 1.0F; + f = 1.0F; + } + vertexConsumer.quad(matrixStack.peek(), quad, f, g, h, 1.0f, light, overlay); + } + } + + /* + public boolean renderBlockEntity(VertexConsumerProvider consumer, MatrixStack matrixStack, BlockState stateIn, int light, int overlay) + { + BlockRenderType blockRenderType = stateIn.getRenderType(); + if (blockRenderType == BlockRenderType.INVISIBLE) + { + return false; + } + switch (blockRenderType) + { + case MODEL: + { + BakedModel bakedModel = this.getModel(state); + int i = this.blockColors.getColor(state, null, null, 0); + float f = (float) (i >> 16 & 0xFF) / 255.0f; + float g = (float) (i >> 8 & 0xFF) / 255.0f; + float h = (float) (i & 0xFF) / 255.0f; + } + case ENTITYBLOCK_ANIMATED: { + this.builtinModelItemRenderer.render(new ItemStack(stateIn.getBlock()), ModelTransformationMode.NONE, matrixStack, consumer, light, overlay); + } + } + + return false; + } + */ + + static class AmbientOcclusionCalculator { private final float[] brightness = new float[4]; private final int[] light = new int[4]; @@ -546,7 +616,7 @@ private int getVertexBrightness(int p_178203_1_, int p_178203_2_, int p_178203_3 } } - public static enum EnumNeighborInfo + public enum EnumNeighborInfo { DOWN(new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH}, 0.5F, true, new Orientation[]{Orientation.FLIP_WEST, Orientation.SOUTH, Orientation.FLIP_WEST, Orientation.FLIP_SOUTH, Orientation.WEST, Orientation.FLIP_SOUTH, Orientation.WEST, Orientation.SOUTH}, new Orientation[]{Orientation.FLIP_WEST, Orientation.NORTH, Orientation.FLIP_WEST, Orientation.FLIP_NORTH, Orientation.WEST, Orientation.FLIP_NORTH, Orientation.WEST, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_EAST, Orientation.NORTH, Orientation.FLIP_EAST, Orientation.FLIP_NORTH, Orientation.EAST, Orientation.FLIP_NORTH, Orientation.EAST, Orientation.NORTH}, new Orientation[]{Orientation.FLIP_EAST, Orientation.SOUTH, Orientation.FLIP_EAST, Orientation.FLIP_SOUTH, Orientation.EAST, Orientation.FLIP_SOUTH, Orientation.EAST, Orientation.SOUTH}), UP(new Direction[]{Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH}, 1.0F, true, new Orientation[]{Orientation.EAST, Orientation.SOUTH, Orientation.EAST, Orientation.FLIP_SOUTH, Orientation.FLIP_EAST, Orientation.FLIP_SOUTH, Orientation.FLIP_EAST, Orientation.SOUTH}, new Orientation[]{Orientation.EAST, Orientation.NORTH, Orientation.EAST, Orientation.FLIP_NORTH, Orientation.FLIP_EAST, Orientation.FLIP_NORTH, Orientation.FLIP_EAST, Orientation.NORTH}, new Orientation[]{Orientation.WEST, Orientation.NORTH, Orientation.WEST, Orientation.FLIP_NORTH, Orientation.FLIP_WEST, Orientation.FLIP_NORTH, Orientation.FLIP_WEST, Orientation.NORTH}, new Orientation[]{Orientation.WEST, Orientation.SOUTH, Orientation.WEST, Orientation.FLIP_SOUTH, Orientation.FLIP_WEST, Orientation.FLIP_SOUTH, Orientation.FLIP_WEST, Orientation.SOUTH}), @@ -564,7 +634,7 @@ public static enum EnumNeighborInfo private final Orientation[] vert3Weights; private static final EnumNeighborInfo[] VALUES = new EnumNeighborInfo[6]; - private EnumNeighborInfo(Direction[] p_i46236_3_, float p_i46236_4_, boolean p_i46236_5_, Orientation[] p_i46236_6_, Orientation[] p_i46236_7_, Orientation[] p_i46236_8_, Orientation[] p_i46236_9_) + EnumNeighborInfo(Direction[] p_i46236_3_, float p_i46236_4_, boolean p_i46236_5_, Orientation[] p_i46236_6_, Orientation[] p_i46236_7_, Orientation[] p_i46236_8_, Orientation[] p_i46236_9_) { //this.corners = p_i46236_3_; //this.shadeWeight = p_i46236_4_; @@ -591,7 +661,7 @@ public static EnumNeighborInfo getNeighbourInfo(Direction p_178273_0_) } } - public static enum Orientation + public enum Orientation { DOWN(Direction.DOWN, false), UP(Direction.UP, false), @@ -608,13 +678,13 @@ public static enum Orientation private final int shape; - private Orientation(Direction p_i46233_3_, boolean p_i46233_4_) + Orientation(Direction p_i46233_3_, boolean p_i46233_4_) { this.shape = p_i46233_3_.getId() + (p_i46233_4_ ? Direction.values().length : 0); } } - static enum VertexTranslations + enum VertexTranslations { DOWN(0, 1, 2, 3), UP(2, 3, 0, 1), @@ -629,7 +699,7 @@ static enum VertexTranslations private final int vert3; private static final VertexTranslations[] VALUES = new VertexTranslations[6]; - private VertexTranslations(int p_i46234_3_, int p_i46234_4_, int p_i46234_5_, int p_i46234_6_) + VertexTranslations(int p_i46234_3_, int p_i46234_4_, int p_i46234_5_, int p_i46234_6_) { this.vert0 = p_i46234_3_; this.vert1 = p_i46234_4_; diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferAllocatorCache.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferAllocatorCache.java index 8aec61f..fdaa8d3 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferAllocatorCache.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferAllocatorCache.java @@ -1,8 +1,8 @@ package fi.dy.masa.litematica.render.schematic; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; -import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.util.BufferAllocator; import net.neoforged.api.distmarker.Dist; @@ -12,67 +12,71 @@ public class BufferAllocatorCache implements AutoCloseable { protected static final List LAYERS = ChunkRenderLayers.LAYERS; - protected static final List TYPES = ChunkRenderLayers.TYPES; + protected static final List TYPES = ChunkRenderLayers.TYPES; protected static final int EXPECTED_TOTAL_SIZE; - private final Map layerCache = new HashMap<>(); - private final Map overlayCache = new HashMap<>(); + private final ConcurrentHashMap layerCache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap overlayCache = new ConcurrentHashMap<>(); protected BufferAllocatorCache() { } + protected void allocateCache() + { + for (RenderLayer layer : LAYERS) + { + if (this.layerCache.containsKey(layer)) + { + this.layerCache.get(layer).close(); + } + + this.layerCache.put(layer, new BufferAllocator(layer.getExpectedBufferSize())); + } + for (OverlayRenderType type : TYPES) + { + if (this.overlayCache.containsKey(type)) + { + this.overlayCache.get(type).close(); + } + + this.overlayCache.put(type, new BufferAllocator(type.getExpectedBufferSize())); + } + } + protected boolean hasBufferByLayer(RenderLayer layer) { return this.layerCache.containsKey(layer); } - protected boolean hasBufferByOverlay(ChunkRendererSchematicVbo.OverlayRenderType type) + protected boolean hasBufferByOverlay(OverlayRenderType type) { return this.overlayCache.containsKey(type); } protected BufferAllocator getBufferByLayer(RenderLayer layer) { - if (this.layerCache.containsKey(layer) == false) - { - this.layerCache.put(layer, new BufferAllocator(layer.getExpectedBufferSize())); - } - - return this.layerCache.get(layer); + return this.layerCache.computeIfAbsent(layer, l -> new BufferAllocator(l.getExpectedBufferSize())); } - protected BufferAllocator getBufferByOverlay(ChunkRendererSchematicVbo.OverlayRenderType type) + protected BufferAllocator getBufferByOverlay(OverlayRenderType type) { - if (this.overlayCache.containsKey(type) == false) - { - this.overlayCache.put(type, new BufferAllocator(type.getExpectedBufferSize())); - } - - return this.overlayCache.get(type); + return this.overlayCache.computeIfAbsent(type, t -> new BufferAllocator(t.getExpectedBufferSize())); } protected void closeByLayer(RenderLayer layer) { try { - if (this.layerCache.containsKey(layer)) - { - this.layerCache.get(layer).close(); - } + this.layerCache.remove(layer).close(); } catch (Exception ignored) { } - this.layerCache.remove(layer).close(); } - protected void closeByType(ChunkRendererSchematicVbo.OverlayRenderType type) + protected void closeByType(OverlayRenderType type) { try { - if (this.overlayCache.containsKey(type)) - { - this.overlayCache.get(type).close(); - } + this.overlayCache.remove(type).close(); } catch (Exception ignored) { } - this.overlayCache.remove(type).close(); } protected void resetAll() @@ -97,14 +101,20 @@ protected void clearAll() protected void closeAll() { - try + ArrayList allocators; + + synchronized (this.layerCache) { - this.layerCache.values().forEach(BufferAllocator::close); - this.overlayCache.values().forEach(BufferAllocator::close); + allocators = new ArrayList<>(this.layerCache.values()); + this.layerCache.clear(); } - catch (Exception ignored) { } - this.layerCache.clear(); - this.overlayCache.clear(); + synchronized (this.overlayCache) + { + allocators.addAll(this.overlayCache.values()); + this.overlayCache.clear(); + } + + allocators.forEach(BufferAllocator::close); } @Override @@ -115,6 +125,6 @@ public void close() static { - EXPECTED_TOTAL_SIZE = LAYERS.stream().mapToInt(RenderLayer::getExpectedBufferSize).sum() + TYPES.stream().mapToInt(ChunkRendererSchematicVbo.OverlayRenderType::getExpectedBufferSize).sum(); + EXPECTED_TOTAL_SIZE = LAYERS.stream().mapToInt(RenderLayer::getExpectedBufferSize).sum() + TYPES.stream().mapToInt(OverlayRenderType::getExpectedBufferSize).sum(); } } diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderCache.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderCache.java index 9e392a0..0e7aa41 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderCache.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderCache.java @@ -9,7 +9,7 @@ public class BufferBuilderCache implements AutoCloseable { private final ConcurrentHashMap blockBufferBuilders = new ConcurrentHashMap<>(); - private final ConcurrentHashMap overlayBufferBuilders = new ConcurrentHashMap<>(); + private final ConcurrentHashMap overlayBufferBuilders = new ConcurrentHashMap<>(); protected BufferBuilderCache() { } @@ -18,7 +18,7 @@ protected boolean hasBufferByLayer(RenderLayer layer) return blockBufferBuilders.containsKey(layer); } - protected boolean hasBufferByOverlay(ChunkRendererSchematicVbo.OverlayRenderType type) + protected boolean hasBufferByOverlay(OverlayRenderType type) { return overlayBufferBuilders.containsKey(type); } @@ -28,7 +28,7 @@ protected BufferBuilderPatch getBufferByLayer(RenderLayer layer, @Nonnull Buffer return blockBufferBuilders.computeIfAbsent(layer, (key) -> new BufferBuilderPatch(allocators.getBufferByLayer(key), key.getDrawMode(), key.getVertexFormat())); } - protected BufferBuilderPatch getBufferByOverlay(ChunkRendererSchematicVbo.OverlayRenderType type, @Nonnull BufferAllocatorCache allocators) + protected BufferBuilderPatch getBufferByOverlay(OverlayRenderType type, @Nonnull BufferAllocatorCache allocators) { return overlayBufferBuilders.computeIfAbsent(type, (key) -> new BufferBuilderPatch(allocators.getBufferByOverlay(key), key.getDrawMode(), key.getVertexFormat())); } @@ -37,22 +37,25 @@ protected void clearAll() { ArrayList buffers; - synchronized (blockBufferBuilders) + synchronized (this.blockBufferBuilders) { - buffers = new ArrayList<>(blockBufferBuilders.values()); - blockBufferBuilders.clear(); + buffers = new ArrayList<>(this.blockBufferBuilders.values()); + this.blockBufferBuilders.clear(); } - synchronized (overlayBufferBuilders) + synchronized (this.overlayBufferBuilders) { - buffers.addAll(overlayBufferBuilders.values()); - overlayBufferBuilders.clear(); + buffers.addAll(this.overlayBufferBuilders.values()); + this.overlayBufferBuilders.clear(); } - for (BufferBuilderPatch buffer:buffers) + for (BufferBuilderPatch buffer : buffers) { - try { + try + { BuiltBuffer built = buffer.endNullable(); if (built != null) + { built.close(); + } } catch (Exception ignored) {} } diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderPatch.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderPatch.java index 236d046..c1f1748 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderPatch.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BufferBuilderPatch.java @@ -12,7 +12,7 @@ public class BufferBuilderPatch extends BufferBuilder public BufferBuilderPatch(BufferAllocator arg, VertexFormat.DrawMode drawMode, VertexFormat vertexFormat) { super(arg, drawMode, vertexFormat); - this.offsetY = 0; + this.offsetY = (float) 0; } public void setOffsetY(float offset) diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/BuiltBufferCache.java b/src/main/java/fi/dy/masa/litematica/render/schematic/BuiltBufferCache.java index 5ef3a7a..d8aeca5 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/BuiltBufferCache.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/BuiltBufferCache.java @@ -1,15 +1,16 @@ package fi.dy.masa.litematica.render.schematic; import javax.annotation.Nonnull; -import java.util.HashMap; -import java.util.Map; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.concurrent.ConcurrentHashMap; import net.minecraft.client.render.BuiltBuffer; import net.minecraft.client.render.RenderLayer; public class BuiltBufferCache implements AutoCloseable { - private final Map layerBuffers = new HashMap<>(); - private final Map overlayBuffers = new HashMap<>(); + private final ConcurrentHashMap layerBuffers = new ConcurrentHashMap<>(); + private final ConcurrentHashMap overlayBuffers = new ConcurrentHashMap<>(); protected BuiltBufferCache() { } @@ -18,7 +19,7 @@ protected boolean hasBuiltBufferByLayer(RenderLayer layer) return this.layerBuffers.containsKey(layer); } - protected boolean hasBuiltBufferByType(ChunkRendererSchematicVbo.OverlayRenderType type) + protected boolean hasBuiltBufferByType(OverlayRenderType type) { return this.overlayBuffers.containsKey(type); } @@ -32,7 +33,7 @@ protected void storeBuiltBufferByLayer(RenderLayer layer, @Nonnull BuiltBuffer n this.layerBuffers.put(layer, newBuffer); } - protected void storeBuiltBufferByType(ChunkRendererSchematicVbo.OverlayRenderType type, @Nonnull BuiltBuffer newBuffer) + protected void storeBuiltBufferByType(OverlayRenderType type, @Nonnull BuiltBuffer newBuffer) { if (this.hasBuiltBufferByType(type)) { @@ -41,52 +42,37 @@ protected void storeBuiltBufferByType(ChunkRendererSchematicVbo.OverlayRenderTyp this.overlayBuffers.put(type, newBuffer); } - public BuiltBuffer getBuiltBufferByLayer(RenderLayer layer) + @Nullable + protected BuiltBuffer getBuiltBufferByLayer(RenderLayer layer) { return this.layerBuffers.get(layer); } - protected BuiltBuffer getBuiltBufferByType(ChunkRendererSchematicVbo.OverlayRenderType type) + @Nullable + protected BuiltBuffer getBuiltBufferByType(OverlayRenderType type) { return this.overlayBuffers.get(type); } - protected void closeByLayer(RenderLayer layer) + protected void closeAll() { - try + ArrayList builtBuffers; + + synchronized (this.layerBuffers) { - if (this.layerBuffers.containsKey(layer)) - { - this.layerBuffers.get(layer).close(); - } + builtBuffers = new ArrayList<>(this.layerBuffers.values()); + this.layerBuffers.clear(); } - catch (Exception ignored) { } - this.layerBuffers.remove(layer); - } - - protected void closeByType(ChunkRendererSchematicVbo.OverlayRenderType type) - { - try + synchronized (this.overlayBuffers) { - if (this.overlayBuffers.containsKey(type)) - { - this.overlayBuffers.get(type).close(); - } + builtBuffers.addAll(this.overlayBuffers.values()); + this.overlayBuffers.clear(); } - catch (Exception ignored) { } - this.overlayBuffers.remove(type); - } - - protected void closeAll() - { try { - this.layerBuffers.values().forEach(BuiltBuffer::close); - this.overlayBuffers.values().forEach(BuiltBuffer::close); + builtBuffers.forEach(BuiltBuffer::close); } catch (Exception ignored) { } - this.layerBuffers.clear(); - this.overlayBuffers.clear(); } @Override diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderDataSchematic.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderDataSchematic.java index a9b145f..d05617e 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderDataSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderDataSchematic.java @@ -7,7 +7,6 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.client.render.BuiltBuffer; import net.minecraft.client.render.RenderLayer; -import fi.dy.masa.litematica.render.schematic.ChunkRendererSchematicVbo.OverlayRenderType; public class ChunkRenderDataSchematic implements AutoCloseable { @@ -75,6 +74,12 @@ protected void setBlockLayerUsed(RenderLayer layer) this.blockLayersUsed.add(layer); } + protected void setBlockLayerUnused(RenderLayer layer) + { + this.blockLayersStarted.remove(layer); + this.blockLayersUsed.remove(layer); + } + public boolean isOverlayEmpty() { return this.overlayEmpty; @@ -101,6 +106,12 @@ protected void setOverlayTypeUsed(OverlayRenderType type) this.overlayLayersUsed.add(type); } + protected void setOverlayTypeUnused(OverlayRenderType type) + { + this.overlayLayersStarted.remove(type); + this.overlayLayersUsed.remove(type); + } + public List getBlockEntities() { return this.blockEntities; diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderDispatcherLitematica.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderDispatcherLitematica.java index 1c1f3f7..8eb10f1 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderDispatcherLitematica.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderDispatcherLitematica.java @@ -25,12 +25,12 @@ import net.minecraft.util.math.Vec3d; import fi.dy.masa.litematica.Litematica; import fi.dy.masa.litematica.config.Configs; -import fi.dy.masa.litematica.render.schematic.ChunkRendererSchematicVbo.OverlayRenderType; public class ChunkRenderDispatcherLitematica { private static final Logger LOGGER = Litematica.logger; - private static final ThreadFactory THREAD_FACTORY = (new ThreadFactoryBuilder()).setNameFormat("Litematica Chunk Batcher %d").setDaemon(true).build(); + // Threaded Code + //private static final ThreadFactory THREAD_FACTORY = (new ThreadFactoryBuilder()).setNameFormat("Litematica Chunk Batcher %d").setDaemon(true).build(); private final List listWorkerThreads = new ArrayList<>(); private final List listThreadedWorkers = new ArrayList<>(); @@ -39,11 +39,14 @@ public class ChunkRenderDispatcherLitematica private final Queue queueChunkUploads = Queues.newPriorityQueue(); private final ChunkRenderWorkerLitematica renderWorker; private final int countRenderAllocators; - private final int countRenderThreads; + // Threaded Code + //private final int countRenderThreads; private Vec3d cameraPos; public ChunkRenderDispatcherLitematica() { + /* Threaded Code + int threadLimitMemory = Math.max(1, (int) ((double) Runtime.getRuntime().maxMemory() * 0.3D) / BufferAllocatorCache.EXPECTED_TOTAL_SIZE); int threadLimitCPU = Math.max(1, MathHelper.clamp(Runtime.getRuntime().availableProcessors(), 1, threadLimitMemory / 5)); int maxThreads = Math.max(1, Math.min((Configs.Visuals.RENDER_SCHEMATIC_MAX_THREADS.getIntegerValue()), threadLimitCPU)); @@ -95,6 +98,21 @@ public ChunkRenderDispatcherLitematica() this.countRenderAllocators = maxCache; LOGGER.info("Using {} max total BufferAllocator caches", this.countRenderAllocators + 1); + this.renderWorker = new ChunkRenderWorkerLitematica(this, new BufferAllocatorCache()); + */ + + this.countRenderAllocators = 2; + this.cameraPos = Vec3d.ZERO; + + LOGGER.info("Using {} total BufferAllocator caches", this.countRenderAllocators + 1); + + this.queueFreeRenderAllocators = Queues.newArrayBlockingQueue(this.countRenderAllocators); + + for (int i = 0; i < this.countRenderAllocators; ++i) + { + this.queueFreeRenderAllocators.add(new BufferAllocatorCache()); + } + this.renderWorker = new ChunkRenderWorkerLitematica(this, new BufferAllocatorCache()); } @@ -110,8 +128,10 @@ public Vec3d getCameraPos() protected String getDebugInfo() { - //return this.listWorkerThreads.isEmpty() ? String.format("pC: %03d, single-threaded", this.queueChunkUpdates.size()) : String.format("pC: %03d, pU: %1d, aB: %1d", this.queueChunkUpdates.size(), this.queueChunkUploads.size(), this.queueFreeRenderAllocators.size()); - return String.format("T: %02d, pC: %03d, pU: %03d, aB: %02d", this.listThreadedWorkers.size(), this.queueChunkUpdates.size(), this.queueChunkUploads.size(), this.queueFreeRenderAllocators.size()); + // Threaded Code + //return String.format("T: %02d, pC: %03d, pU: %03d, aB: %02d", this.listThreadedWorkers.size(), this.queueChunkUpdates.size(), this.queueChunkUploads.size(), this.queueFreeRenderAllocators.size()); + + return this.listWorkerThreads.isEmpty() ? String.format("pC: %03d, single-threaded", this.queueChunkUpdates.size()) : String.format("pC: %03d, pU: %1d, aB: %1d", this.queueChunkUpdates.size(), this.queueChunkUploads.size(), this.queueFreeRenderAllocators.size()); } protected boolean runChunkUploads(long finishTimeNano) @@ -161,23 +181,89 @@ protected boolean runChunkUploads(long finishTimeNano) protected boolean updateChunkLater(ChunkRendererSchematicVbo renderChunk) { + /* Threaded Code final ChunkRenderTaskSchematic generator = renderChunk.makeCompileTaskChunkSchematic(this::getCameraPos); generator.addFinishRunnable(() -> queueChunkUpdates.remove(generator)); boolean flag = queueChunkUpdates.offer(generator); - if(!flag) + + if (!flag) + { generator.finish(); + } + return flag; + */ + + renderChunk.getLockCompileTask().lock(); + boolean flag1; + + try + { + final ChunkRenderTaskSchematic generator = renderChunk.makeCompileTaskChunkSchematic(this::getCameraPos); + + generator.addFinishRunnable(new Runnable() + { + public void run() + { + ChunkRenderDispatcherLitematica.this.queueChunkUpdates.remove(generator); + } + }); + + boolean flag = this.queueChunkUpdates.offer(generator); + + if (!flag) + { + generator.finish(); + } + + flag1 = flag; + } + finally + { + renderChunk.getLockCompileTask().unlock(); + } + + return flag1; } protected boolean updateChunkNow(ChunkRendererSchematicVbo chunkRenderer) { - try { + /* Threaded Code + try + { renderWorker.processTask(chunkRenderer.makeCompileTaskChunkSchematic(this::getCameraPos)); return true; - } catch (InterruptedException e) { + } + catch (InterruptedException e) + { LOGGER.warn("updateChunkNow(): Process Interrupted; error message: [{}]", e.getLocalizedMessage()); return false; } + */ + + chunkRenderer.getLockCompileTask().lock(); + boolean flag; + + try + { + ChunkRenderTaskSchematic generator = chunkRenderer.makeCompileTaskChunkSchematic(this::getCameraPos); + + try + { + this.renderWorker.processTask(generator); + } + catch (InterruptedException e) + { + } + + flag = true; + } + finally + { + chunkRenderer.getLockCompileTask().unlock(); + } + + return flag; } protected void stopChunkUpdates() @@ -219,11 +305,47 @@ protected ChunkRenderTaskSchematic getNextChunkUpdate() throws InterruptedExcept protected boolean updateTransparencyLater(ChunkRendererSchematicVbo renderChunk) { + /* Threaded Code final ChunkRenderTaskSchematic generator = renderChunk.makeCompileTaskTransparencySchematic(this::getCameraPos); - if(generator==null) + + if (generator == null) + { return true; + } generator.addFinishRunnable(() -> ChunkRenderDispatcherLitematica.this.queueChunkUpdates.remove(generator)); return queueChunkUpdates.offer(generator); + */ + + renderChunk.getLockCompileTask().lock(); + boolean flag; + + try + { + final ChunkRenderTaskSchematic generator = renderChunk.makeCompileTaskTransparencySchematic(this::getCameraPos); + + if (generator == null) + { + flag = true; + return flag; + } + + generator.addFinishRunnable(new Runnable() + { + @Override + public void run() + { + ChunkRenderDispatcherLitematica.this.queueChunkUpdates.remove(generator); + } + }); + + flag = this.queueChunkUpdates.offer(generator); + } + finally + { + renderChunk.getLockCompileTask().unlock(); + } + + return flag; } protected ListenableFuture uploadChunkBlocks(final RenderLayer layer, final BufferAllocatorCache allocators, final ChunkRendererSchematicVbo renderChunk, final ChunkRenderDataSchematic chunkRenderData, final double distanceSq, boolean resortOnly) @@ -243,9 +365,21 @@ protected ListenableFuture uploadChunkBlocks(final RenderLayer layer, fi } else { + /* Threaded Code + ListenableFutureTask futureTask = ListenableFutureTask.create( () -> uploadChunkBlocks(layer, allocators, renderChunk, chunkRenderData, distanceSq, resortOnly), null); + */ + + ListenableFutureTask futureTask = ListenableFutureTask.create(new Runnable() + { + @Override + public void run() + { + ChunkRenderDispatcherLitematica.this.uploadChunkBlocks(layer, allocators, renderChunk, chunkRenderData, distanceSq, resortOnly); + } + }, null); synchronized (this.queueChunkUploads) { @@ -299,12 +433,14 @@ private void uploadVertexBufferByLayer(RenderLayer layer, @Nonnull BufferAllocat if (allocator == null) { allocators.closeByLayer(layer); + compiledChunk.setBlockLayerUnused(layer); throw new InterruptedException("BufferAllocators are invalid"); } if (renderBuffer == null) { - throw new InterruptedException("BuiltBuffer was not built"); + compiledChunk.setBlockLayerUnused(layer); + return; } VertexBuffer vertexBuffer = renderChunk.getBlocksVertexBufferByLayer(layer); @@ -349,12 +485,14 @@ private void uploadVertexBufferByType(OverlayRenderType type, @Nonnull BufferAll if (allocator == null) { allocators.closeByType(type); + compiledChunk.setOverlayTypeUnused(type); throw new InterruptedException("BufferAllocators are invalid"); } if (renderBuffer == null) { - throw new InterruptedException("BuiltBuffer was not built"); + compiledChunk.setOverlayTypeUnused(type); + return; } VertexBuffer vertexBuffer = renderChunk.getOverlayVertexBuffer(type); diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderLayers.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderLayers.java index 722ebb3..09a43f9 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderLayers.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderLayers.java @@ -8,7 +8,7 @@ public record ChunkRenderLayers() { public static final List LAYERS = getLayers(); - public static final List TYPES = getTypes(); + public static final List TYPES = getTypes(); private static List getLayers() { @@ -20,10 +20,10 @@ private static List getLayers() return list; } - private static List getTypes() + private static List getTypes() { // In case we need to add additional Types in the future - return Arrays.stream(ChunkRendererSchematicVbo.OverlayRenderType.values()).toList(); + return Arrays.stream(OverlayRenderType.values()).toList(); } public static String getFriendlyName(RenderLayer layer) diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderTaskSchematic.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderTaskSchematic.java index ec9bde2..7343774 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderTaskSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderTaskSchematic.java @@ -1,9 +1,9 @@ package fi.dy.masa.litematica.render.schematic; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicReference; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; - +import com.google.common.collect.Lists; import com.google.common.primitives.Doubles; import net.minecraft.util.math.Vec3d; import fi.dy.masa.litematica.Litematica; @@ -12,12 +12,20 @@ public class ChunkRenderTaskSchematic implements Comparable finishRunnables = new ConcurrentLinkedQueue<>(); + // Threaded + //private final ConcurrentLinkedQueue finishRunnables = new ConcurrentLinkedQueue<>(); + private final List listFinishRunnables = Lists.newArrayList(); + private final ReentrantLock lock = new ReentrantLock(); + // private final Supplier cameraPosSupplier; private final double distanceSq; private BufferAllocatorCache allocatorCache; private ChunkRenderDataSchematic chunkRenderData; - private final AtomicReference status = new AtomicReference<>(Status.PENDING); + // Threaded + //private final AtomicReference status = new AtomicReference<>(Status.PENDING); + private ChunkRenderTaskSchematic.Status status = ChunkRenderTaskSchematic.Status.PENDING; + private boolean finished; + // public ChunkRenderTaskSchematic(ChunkRendererSchematicVbo renderChunkIn, ChunkRenderTaskSchematic.Type typeIn, Supplier cameraPosSupplier, double distanceSqIn) { @@ -34,7 +42,9 @@ public Supplier getCameraPosSupplier() public ChunkRenderTaskSchematic.Status getStatus() { - return this.status.get(); + //Threaded Code + //return this.status.get(); + return this.status; } protected ChunkRendererSchematicVbo getRenderChunk() @@ -69,23 +79,34 @@ public boolean setRegionRenderCacheBuilder(BufferAllocatorCache allocatorCache) Litematica.logger.error("setRegionRenderCacheBuilder() [Task] allocatorCache is null"); return false; } + if (this.allocatorCache != null) + { + this.allocatorCache.closeAll(); + } this.allocatorCache = allocatorCache; return true; } - - protected Status casStatus(Status expected, Status nStatus) { + + /* Threaded Code + protected Status casStatus(Status expected, Status nStatus) + { return status.compareAndExchange(expected, nStatus); } protected void finish() { Status current = status.get(); - if(current==Status.DONE) + + if (current == Status.DONE) + { return; - if(status.compareAndSet(current,Status.DONE)) { + } + if (status.compareAndSet(current,Status.DONE)) + { Runnable runnable; - while((runnable = finishRunnables.poll())!= null) { + while((runnable = finishRunnables.poll())!= null) + { runnable.run(); } } @@ -93,23 +114,96 @@ protected void finish() protected void addFinishRunnable(Runnable runnable) { - if(status.get() == Status.DONE) { + if (status.get() == Status.DONE) + { runnable.run(); return; } finishRunnables.add(runnable); - if(status.get() == Status.DONE) { + if (status.get() == Status.DONE) + { runnable = finishRunnables.poll(); - if(runnable!=null) + if (runnable != null) + { + runnable.run(); + } + } + } + */ + + protected void setStatus(ChunkRenderTaskSchematic.Status statusIn) + { + this.lock.lock(); + + try + { + this.status = statusIn; + } + finally + { + this.lock.unlock(); + } + } + + protected void finish() + { + this.lock.lock(); + + try + { + if (this.type == ChunkRenderTaskSchematic.Type.REBUILD_CHUNK && this.status != ChunkRenderTaskSchematic.Status.DONE) + { + this.chunkRenderer.setNeedsUpdate(false); + } + + this.finished = true; + this.status = ChunkRenderTaskSchematic.Status.DONE; + + for (Runnable runnable : this.listFinishRunnables) + { + runnable.run(); + } + } + finally + { + this.lock.unlock(); + } + } + + protected void addFinishRunnable(Runnable runnable) + { + this.lock.lock(); + + try + { + this.listFinishRunnables.add(runnable); + + if (this.finished) + { runnable.run(); + } + } + finally + { + this.lock.unlock(); } } + public ReentrantLock getLock() + { + return this.lock; + } + protected ChunkRenderTaskSchematic.Type getType() { return this.type; } + protected boolean isFinished() + { + return this.finished; + } + public int compareTo(ChunkRenderTaskSchematic other) { return Doubles.compare(this.distanceSq, other.distanceSq); diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderWorkerLitematica.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderWorkerLitematica.java index 9a1c101..95c35ae 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderWorkerLitematica.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRenderWorkerLitematica.java @@ -16,7 +16,6 @@ import net.minecraft.entity.Entity; import net.minecraft.util.crash.CrashReport; import fi.dy.masa.litematica.Litematica; -import fi.dy.masa.litematica.render.schematic.ChunkRendererSchematicVbo.OverlayRenderType; public class ChunkRenderWorkerLitematica implements Runnable { @@ -61,14 +60,21 @@ public void run() } } + /* Threaded Code protected void processTask(final ChunkRenderTaskSchematic task) throws InterruptedException { ChunkRenderTaskSchematic.Status oldStatus; oldStatus = task.casStatus(ChunkRenderTaskSchematic.Status.PENDING, ChunkRenderTaskSchematic.Status.COMPILING); - if(oldStatus != ChunkRenderTaskSchematic.Status.PENDING) + + if (oldStatus != ChunkRenderTaskSchematic.Status.PENDING) + { return; + } + Entity entity = MinecraftClient.getInstance().getCameraEntity(); - if (entity == null) { + + if (entity == null) + { task.finish(); return; } @@ -79,13 +85,14 @@ protected void processTask(final ChunkRenderTaskSchematic task) throws Interrupt } ChunkRenderTaskSchematic.Type taskType = task.getType(); - switch (task.getType()) { + switch (task.getType()) + { case REBUILD_CHUNK -> task.getRenderChunk().rebuildChunk(task); case RESORT_TRANSPARENCY -> task.getRenderChunk().resortTransparency(task); } oldStatus = task.casStatus(ChunkRenderTaskSchematic.Status.COMPILING, ChunkRenderTaskSchematic.Status.UPLOADING); - if(oldStatus != ChunkRenderTaskSchematic.Status.COMPILING) + if (oldStatus != ChunkRenderTaskSchematic.Status.COMPILING) { resetRenderAllocators(task); return; @@ -96,8 +103,10 @@ protected void processTask(final ChunkRenderTaskSchematic task) throws Interrupt ChunkRendererSchematicVbo renderChunk = task.getRenderChunk(); BufferAllocatorCache allocators = task.getAllocatorCache(); - switch (taskType) { - case REBUILD_CHUNK -> { + switch (taskType) + { + case REBUILD_CHUNK -> + { for(RenderLayer layer: ChunkRenderLayers.LAYERS) if (!chunkRenderData.isBlockLayerEmpty(layer)) futuresList.add(this.chunkRenderDispatcher.uploadChunkBlocks(layer, allocators, renderChunk, chunkRenderData, task.getDistanceSq(), false)); @@ -105,7 +114,8 @@ protected void processTask(final ChunkRenderTaskSchematic task) throws Interrupt if (!chunkRenderData.isOverlayTypeEmpty(type)) futuresList.add(this.chunkRenderDispatcher.uploadChunkOverlay(type, allocators, renderChunk, chunkRenderData, task.getDistanceSq(), false)); } - case RESORT_TRANSPARENCY -> { + case RESORT_TRANSPARENCY -> + { RenderLayer layer = RenderLayer.getTranslucent(); if (!chunkRenderData.isBlockLayerEmpty(layer)) futuresList.add(this.chunkRenderDispatcher.uploadChunkBlocks(RenderLayer.getTranslucent(), allocators, renderChunk, chunkRenderData, task.getDistanceSq(), true)); @@ -136,6 +146,179 @@ public void onFailure(@NotNull Throwable throwable) } }, MoreExecutors.directExecutor()); } + */ + + protected void processTask(final ChunkRenderTaskSchematic task) throws InterruptedException + { + task.getLock().lock(); + + try + { + if (task.getStatus() != ChunkRenderTaskSchematic.Status.PENDING) + { + if (task.isFinished() == false) + { + LOGGER.warn("Chunk render task was {} when I expected it to be pending; ignoring task", (Object) task.getStatus()); + } + + return; + } + + task.setStatus(ChunkRenderTaskSchematic.Status.COMPILING); + } + finally + { + task.getLock().unlock(); + } + + Entity entity = MinecraftClient.getInstance().getCameraEntity(); + + if (entity == null) + { + task.finish(); + } + else + { + if (task.setRegionRenderCacheBuilder(this.getRegionRenderAllocatorCache()) == false) + { + throw new InterruptedException("No free Allocator Cache found"); + } + + ChunkRenderTaskSchematic.Type taskType = task.getType(); + + if (taskType == ChunkRenderTaskSchematic.Type.REBUILD_CHUNK) + { + task.getRenderChunk().rebuildChunk(task); + } + else if (taskType == ChunkRenderTaskSchematic.Type.RESORT_TRANSPARENCY) + { + task.getRenderChunk().resortTransparency(task); + } + + task.getLock().lock(); + + try + { + if (task.getStatus() != ChunkRenderTaskSchematic.Status.COMPILING) + { + if (task.isFinished() == false) + { + LOGGER.warn("Chunk render task was {} when I expected it to be compiling; aborting task", (Object) task.getStatus()); + } + + this.resetRenderAllocators(task); + return; + } + + task.setStatus(ChunkRenderTaskSchematic.Status.UPLOADING); + } + finally + { + task.getLock().unlock(); + } + + final ChunkRenderDataSchematic chunkRenderData = (ChunkRenderDataSchematic) task.getChunkRenderData(); + ArrayList> futuresList = Lists.newArrayList(); + ChunkRendererSchematicVbo renderChunk = (ChunkRendererSchematicVbo) task.getRenderChunk(); + BufferAllocatorCache allocators = task.getAllocatorCache(); + + if (taskType == ChunkRenderTaskSchematic.Type.REBUILD_CHUNK) + { + //if (GuiBase.isCtrlDown()) System.out.printf("pre uploadChunk()\n"); + for (RenderLayer layer : ChunkRenderLayers.LAYERS) + { + if (chunkRenderData.isBlockLayerEmpty(layer) == false) + { + //if (GuiBase.isCtrlDown()) System.out.printf("REBUILD_CHUNK pre uploadChunkBlocks()\n"); + //System.out.printf("REBUILD_CHUNK pre uploadChunkBlocks(%s)\n", layer.toString()); + futuresList.add(this.chunkRenderDispatcher.uploadChunkBlocks(layer, allocators, renderChunk, chunkRenderData, task.getDistanceSq(), false)); + } + } + + for (OverlayRenderType type : ChunkRenderLayers.TYPES) + { + if (chunkRenderData.isOverlayTypeEmpty(type) == false) + { + //if (GuiBase.isCtrlDown()) System.out.printf("REBUILD_CHUNK pre uploadChunkOverlay()\n"); + futuresList.add(this.chunkRenderDispatcher.uploadChunkOverlay(type, allocators, renderChunk, chunkRenderData, task.getDistanceSq(), false)); + } + } + } + else if (taskType == ChunkRenderTaskSchematic.Type.RESORT_TRANSPARENCY) + { + RenderLayer layer = RenderLayer.getTranslucent(); + + if (chunkRenderData.isBlockLayerEmpty(layer) == false) + { + //System.out.printf("RESORT_TRANSPARENCY pre uploadChunkBlocks(%s)\n", layer.toString()); + futuresList.add(this.chunkRenderDispatcher.uploadChunkBlocks(RenderLayer.getTranslucent(), allocators, renderChunk, chunkRenderData, task.getDistanceSq(), true)); + } + if (chunkRenderData.isOverlayTypeEmpty(OverlayRenderType.QUAD) == false) + { + //if (GuiBase.isCtrlDown()) System.out.printf("RESORT_TRANSPARENCY pre uploadChunkOverlay()\n"); + futuresList.add(this.chunkRenderDispatcher.uploadChunkOverlay(OverlayRenderType.QUAD, allocators, renderChunk, chunkRenderData, task.getDistanceSq(), true)); + } + } + + final ListenableFuture> listenablefuture = Futures.allAsList(futuresList); + + task.addFinishRunnable(new Runnable() + { + @Override + public void run() + { + listenablefuture.cancel(false); + } + }); + + Futures.addCallback(listenablefuture, new FutureCallback>() + { + @Override + public void onSuccess(@Nullable List list) + { + ChunkRenderWorkerLitematica.this.clearRenderAllocators(task); + + task.getLock().lock(); + + label49: + { + try + { + if (task.getStatus() == ChunkRenderTaskSchematic.Status.UPLOADING) + { + task.setStatus(ChunkRenderTaskSchematic.Status.DONE); + break label49; + } + + if (task.isFinished() == false) + { + ChunkRenderWorkerLitematica.LOGGER.warn("Chunk render task was {} when I expected it to be uploading; aborting task", (Object)task.getStatus()); + } + } + finally + { + task.getLock().unlock(); + } + + return; + } + + task.getRenderChunk().setChunkRenderData(chunkRenderData); + } + + @Override + public void onFailure(Throwable throwable) + { + ChunkRenderWorkerLitematica.this.resetRenderAllocators(task); + + if ((throwable instanceof CancellationException) == false && (throwable instanceof InterruptedException) == false) + { + MinecraftClient.getInstance().setCrashReportSupplier(CrashReport.create(throwable, "Rendering Litematica chunk")); + } + } + }, MoreExecutors.directExecutor()); + } + } @Nullable private BufferAllocatorCache getRegionRenderAllocatorCache() throws InterruptedException diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRendererSchematicVbo.java b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRendererSchematicVbo.java index 67e1b9d..f4e7468 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRendererSchematicVbo.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/ChunkRendererSchematicVbo.java @@ -4,10 +4,12 @@ import javax.annotation.Nullable; import java.util.*; import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; import com.google.common.collect.Sets; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.VertexSorter; +import net.minecraft.block.BedBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -22,7 +24,10 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.fluid.FluidState; -import net.minecraft.util.math.*; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; import net.minecraft.world.chunk.WorldChunk; import fi.dy.masa.malilib.util.Color4f; import fi.dy.masa.malilib.util.EntityUtils; @@ -43,7 +48,12 @@ public class ChunkRendererSchematicVbo implements AutoCloseable protected volatile WorldSchematic world; protected final WorldRendererSchematic worldRenderer; - protected final AtomicReference> setBlockEntities = new AtomicReference<>(new HashSet<>()); + // UNTHREADED CODE + protected final ReentrantLock chunkRenderLock; + protected final ReentrantLock chunkRenderDataLock; + protected final Set setBlockEntities = new HashSet<>(); + // + //protected final AtomicReference> setBlockEntities = new AtomicReference<>(new HashSet<>()); protected final BlockPos.Mutable position; protected final BlockPos.Mutable chunkRelativePos; @@ -62,8 +72,12 @@ public class ChunkRendererSchematicVbo implements AutoCloseable private final BufferBuilderCache builderCache; + /* THREADED CODE protected AtomicReference compileTask = new AtomicReference<>(null); protected AtomicReference chunkRenderData = new AtomicReference<>(ChunkRenderDataSchematic.EMPTY); + */ + protected ChunkRenderTaskSchematic compileTask; + protected ChunkRenderDataSchematic chunkRenderData; private boolean needsUpdate; private boolean needsImmediateUpdate; @@ -72,6 +86,9 @@ protected ChunkRendererSchematicVbo(WorldSchematic world, WorldRendererSchematic { this.world = world; this.worldRenderer = worldRenderer; + this.chunkRenderData = ChunkRenderDataSchematic.EMPTY; + this.chunkRenderLock = new ReentrantLock(); + this.chunkRenderDataLock = new ReentrantLock(); this.vertexBufferBlocks = new IdentityHashMap<>(); this.vertexBufferOverlay = new IdentityHashMap<>(); this.position = new BlockPos.Mutable(); @@ -102,7 +119,9 @@ protected VertexBuffer getOverlayVertexBuffer(OverlayRenderType type) protected ChunkRenderDataSchematic getChunkRenderData() { - return chunkRenderData.get(); + // Threaded code + //return this.chunkRenderData.get(); + return this.chunkRenderData; } protected BufferBuilderCache getBuilderCache() @@ -112,7 +131,18 @@ protected BufferBuilderCache getBuilderCache() protected void setChunkRenderData(ChunkRenderDataSchematic data) { - chunkRenderData.set(data); + this.chunkRenderDataLock.lock(); + + try + { + this.chunkRenderData = data; + } + finally + { + this.chunkRenderDataLock.unlock(); + } + // Threaded Code + //this.chunkRenderData.set(data); } public BlockPos getOrigin() @@ -177,8 +207,6 @@ protected void resortTransparency(ChunkRenderTaskSchematic task) RenderLayer layerTranslucent = RenderLayer.getTranslucent(); BufferAllocatorCache allocators = task.getAllocatorCache(); - //Litematica.debugLog("resortTransparency() [VBO]: resort for chunk origin [{}]", this.position.toShortString()); - float x = (float) cameraPos.x - this.position.getX(); float y = (float) cameraPos.y - this.position.getY(); float z = (float) cameraPos.z - this.position.getZ(); @@ -227,9 +255,22 @@ protected void resortTransparency(ChunkRenderTaskSchematic task) protected void rebuildChunk(ChunkRenderTaskSchematic task) { ChunkRenderDataSchematic data = new ChunkRenderDataSchematic(); - task.setChunkRenderData(data); + //task.setChunkRenderData(data); + task.getLock().lock(); - //Litematica.debugLog("rebuildChunk() [VBO]: bootstrap/clearing all render buffers for chunk origin [{}]", this.position.toShortString()); + try + { + if (task.getStatus() != ChunkRenderTaskSchematic.Status.COMPILING) + { + return; + } + + task.setChunkRenderData(data); + } + finally + { + task.getLock().unlock(); + } this.builderCache.clearAll(); @@ -335,15 +376,39 @@ protected void rebuildChunk(ChunkRenderTaskSchematic task) } } - Set removed = setBlockEntities.getAndSet(tileEntities); + this.chunkRenderLock.lock(); + + try + { + Set set = Sets.newHashSet(tileEntities); + Set set1 = Sets.newHashSet(this.setBlockEntities); + set.removeAll(this.setBlockEntities); + set1.removeAll(tileEntities); + this.setBlockEntities.clear(); + this.setBlockEntities.addAll(tileEntities); + this.worldRenderer.updateBlockEntities(set1, set); + this.builderCache.clearAll(); + } + finally + { + this.chunkRenderLock.unlock(); + } + + /* + Set removed = this.setBlockEntities.getAndSet(tileEntities); Set added = Sets.newHashSet(tileEntities); added.removeAll(removed); removed.removeAll(tileEntities); - synchronized (builderCache) { + + Threaded Code + + synchronized (this.builderCache) + { // probably not necessary to do block Entity update this with builderCache locked but doing so out of caution. - worldRenderer.updateBlockEntities(removed, added); - builderCache.clearAll(); + this.worldRenderer.updateBlockEntities(removed, added); + this.builderCache.clearAll(); } + */ data.setTimeBuilt(this.world.getTime()); } @@ -351,8 +416,6 @@ protected void rebuildChunk(ChunkRenderTaskSchematic task) protected void renderBlocksAndOverlay(BlockPos pos, @Nonnull ChunkRenderDataSchematic data, @Nonnull BufferAllocatorCache allocators, Set tileEntities, Set usedLayers, MatrixStack matrixStack) { - //Litematica.logger.warn("renderBlocksAndOverlay() [VBO] for BlockPos [{}]", pos.toShortString()); - BlockState stateSchematic = this.schematicWorldView.getBlockState(pos); BlockState stateClient = this.clientWorldView.getBlockState(pos); boolean clientHasAir = stateClient.isAir(); @@ -391,8 +454,6 @@ protected void renderBlocksAndOverlay(BlockPos pos, @Nonnull ChunkRenderDataSche } bufferSchematic.setOffsetY(offsetY); - //Litematica.logger.error("renderBlocksAndOverlay() -> renderFluid() [VBO] layer: [{}] // stateSchematic [{}] // fluidState [{}]", ChunkRenderLayers.getFriendlyName(layer), stateSchematic.toString(), fluidState.toString()); - this.worldRenderer.renderFluid(this.schematicWorldView, stateSchematic, fluidState, pos, bufferSchematic); usedLayers.add(layer); bufferSchematic.setOffsetY(0.0F); @@ -409,8 +470,6 @@ protected void renderBlocksAndOverlay(BlockPos pos, @Nonnull ChunkRenderDataSche bufferSchematic = this.preRenderBlocks(layer, allocators); } - //Litematica.logger.error("renderBlocksAndOverlay() -> renderBlock() [VBO] layer: [{}] // stateSchematic [{}]", ChunkRenderLayers.getFriendlyName(layer), stateSchematic.toString()); - if (this.worldRenderer.renderBlock(this.schematicWorldView, stateSchematic, pos, matrixStack, bufferSchematic)) { usedLayers.add(layer); @@ -438,8 +497,6 @@ protected void renderBlocksAndOverlay(BlockPos pos, @Nonnull ChunkRenderDataSche protected void renderOverlay(OverlayType type, BlockPos pos, BlockState stateSchematic, boolean missing, @Nonnull ChunkRenderDataSchematic data, @Nonnull BufferAllocatorCache allocators) { - //Litematica.logger.warn("renderOverlay() [VBO] for overlay [{}]", type.name()); - RenderSystem.setShader(GameRenderer::getPositionColorProgram); BlockPos.Mutable relPos = this.getChunkRelativePosition(pos); OverlayRenderType overlayType; @@ -465,8 +522,7 @@ protected void renderOverlay(OverlayType type, BlockPos pos, BlockState stateSch posMutable.set(pos.getX() + side.getOffsetX(), pos.getY() + side.getOffsetY(), pos.getZ() + side.getOffsetZ()); BlockState adjStateSchematic = this.schematicWorldView.getBlockState(posMutable); BlockState adjStateClient = this.clientWorldView.getBlockState(posMutable); - - OverlayType typeAdj = this.getOverlayType(adjStateSchematic, adjStateClient); + OverlayType typeAdj = getOverlayType(adjStateSchematic, adjStateClient); // Only render the model-based outlines or sides for missing blocks if (missing && Configs.Visuals.SCHEMATIC_OVERLAY_MODEL_SIDES.getBooleanValue()) @@ -474,7 +530,7 @@ protected void renderOverlay(OverlayType type, BlockPos pos, BlockState stateSch BakedModel bakedModel = this.worldRenderer.getModelForState(stateSchematic); if (type.getRenderPriority() > typeAdj.getRenderPriority() || - Block.isFaceFullSquare(stateSchematic.getCollisionShape(this.schematicWorldView, pos), side) == false) + !Block.isFaceFullSquare(stateSchematic.getCollisionShape(this.schematicWorldView, pos), side)) { RenderUtils.drawBlockModelQuadOverlayBatched(bakedModel, stateSchematic, relPos, side, this.overlayColor, 0, bufferOverlayQuads); } @@ -518,7 +574,7 @@ protected void renderOverlay(OverlayType type, BlockPos pos, BlockState stateSch bufferOverlayOutlines = this.preRenderOverlay(overlayType, allocators); } - this.overlayColor = new Color4f(this.overlayColor.r, this.overlayColor.g, this.overlayColor.b, 1f); + Color4f overlayColor = new Color4f(this.overlayColor.r, this.overlayColor.g, this.overlayColor.b, 1f); if (Configs.Visuals.OVERLAY_REDUCED_INNER_SIDES.getBooleanValue()) { @@ -536,7 +592,7 @@ protected void renderOverlay(OverlayType type, BlockPos pos, BlockState stateSch posMutable.set(pos.getX() + x - 1, pos.getY() + y - 1, pos.getZ() + z - 1); BlockState adjStateSchematic = this.schematicWorldView.getBlockState(posMutable); BlockState adjStateClient = this.clientWorldView.getBlockState(posMutable); - adjTypes[x][y][z] = this.getOverlayType(adjStateSchematic, adjStateClient); + adjTypes[x][y][z] = getOverlayType(adjStateSchematic, adjStateClient); } else { @@ -549,8 +605,6 @@ protected void renderOverlay(OverlayType type, BlockPos pos, BlockState stateSch // Only render the model-based outlines or sides for missing blocks if (missing && Configs.Visuals.SCHEMATIC_OVERLAY_MODEL_OUTLINE.getBooleanValue()) { - BakedModel bakedModel = this.worldRenderer.getModelForState(stateSchematic); - // FIXME: how to implement this correctly here... >_> if (stateSchematic.isOpaque()) { @@ -558,7 +612,8 @@ protected void renderOverlay(OverlayType type, BlockPos pos, BlockState stateSch } else { - RenderUtils.drawBlockModelOutlinesBatched(bakedModel, stateSchematic, relPos, this.overlayColor, 0, bufferOverlayOutlines); + BakedModel bakedModel = this.worldRenderer.getModelForState(stateSchematic); + RenderUtils.drawBlockModelOutlinesBatched(bakedModel, stateSchematic, relPos, overlayColor, 0, bufferOverlayOutlines); } } else @@ -572,13 +627,13 @@ protected void renderOverlay(OverlayType type, BlockPos pos, BlockState stateSch if (missing && Configs.Visuals.SCHEMATIC_OVERLAY_MODEL_OUTLINE.getBooleanValue()) { BakedModel bakedModel = this.worldRenderer.getModelForState(stateSchematic); - RenderUtils.drawBlockModelOutlinesBatched(bakedModel, stateSchematic, relPos, this.overlayColor, 0, bufferOverlayOutlines); + RenderUtils.drawBlockModelOutlinesBatched(bakedModel, stateSchematic, relPos, overlayColor, 0, bufferOverlayOutlines); } else { try { - fi.dy.masa.malilib.render.RenderUtils.drawBlockBoundingBoxOutlinesBatchedLines(relPos, this.overlayColor, 0, bufferOverlayOutlines); + fi.dy.masa.malilib.render.RenderUtils.drawBlockBoundingBoxOutlinesBatchedLines(relPos, overlayColor, 0, bufferOverlayOutlines); } catch (Exception ignored) { } } @@ -662,15 +717,10 @@ protected void renderOverlayReducedEdges(BlockPos pos, OverlayType[][][] adjType //System.out.printf("plop 2 index: %d, ind: %d, pos: %s, off: %s\n", index, ind, pos, posTmp); try { - RenderUtils.drawBlockBoxEdgeBatchedLines(this.getChunkRelativePosition(pos), axis, corner, this.overlayColor, bufferOverlayOutlines); + RenderUtils.drawBlockBoxEdgeBatchedLines(this.getChunkRelativePosition(pos), axis, corner, overlayColor, bufferOverlayOutlines); } catch (IllegalStateException err) { - // TODO: This is absolutely awful. Basically some times the render buffer is closed - // while the this processing is happening but if this happens the work the thread was - // doing is going to be thrown away anyway so we just abort & no harm done. Really we - // should be using cancelable futures & coroutines to do this correctly but that is a - // task for not 1:30am when I have work tomorrow. return; } lines++; @@ -692,7 +742,7 @@ protected OverlayType getOverlayType(BlockState stateSchematic, BlockState state boolean clientHasAir = stateClient.isAir(); boolean schematicHasAir = stateSchematic.isAir(); - // TODO --> Maybe someday Mojang will add something to replace isLiquid(), and isSolid(), someday? + // TODO --> Maybe someday Mojang will add something to replace isLiquid(), and isSolid() if (schematicHasAir) { return (clientHasAir || (this.ignoreClientWorldFluids && stateClient.isLiquid())) ? OverlayType.NONE : OverlayType.EXTRA; @@ -718,7 +768,7 @@ else if (stateSchematic.getBlock() != stateClient.getBlock()) } @Nullable - protected Color4f getOverlayColor(OverlayType overlayType) + protected static Color4f getOverlayColor(OverlayType overlayType) { Color4f overlayColor = null; @@ -792,7 +842,7 @@ protected void uploadBuiltBuffer(@Nonnull BuiltBuffer builtBuffer, @Nonnull Vert { if (vertexBuffer.isClosed()) { - Litematica.logger.error("uploadBuiltBuffer() [VBO] - Error, vertexBuffer is closed/Null"); + //Litematica.logger.error("uploadBuiltBuffer() [VBO] - Error, vertexBuffer is closed/Null"); builtBuffer.close(); return; } @@ -805,7 +855,6 @@ protected void uploadBuiltBuffer(@Nonnull BuiltBuffer builtBuffer, @Nonnull Vert private void postRenderBlocks(RenderLayer layer, float x, float y, float z, @Nonnull ChunkRenderDataSchematic chunkRenderData, @Nonnull BufferAllocatorCache allocators) throws RuntimeException { - //if (layer == RenderLayer.getTranslucent() && chunkRenderData.isBlockLayerEmpty(layer) == false) if (!chunkRenderData.isBlockLayerEmpty(layer)) { BuiltBuffer built; @@ -821,7 +870,8 @@ private void postRenderBlocks(RenderLayer layer, float x, float y, float z, @Non if (built == null) { - throw new RuntimeException("failed to build BuiltBuffer"); + chunkRenderData.setBlockLayerUnused(layer); + return; } else { @@ -830,7 +880,8 @@ private void postRenderBlocks(RenderLayer layer, float x, float y, float z, @Non } else { - throw new RuntimeException("BufferBuilder has not been initialized"); + chunkRenderData.setBlockLayerUnused(layer); + return; } if (layer == RenderLayer.getTranslucent()) @@ -851,7 +902,6 @@ private void postRenderOverlay(OverlayRenderType type, float x, float y, float z throws RuntimeException { RenderSystem.applyModelViewMatrix(); - //if (type == OverlayRenderType.QUAD && chunkRenderData.isOverlayTypeEmpty(type) == false) if (chunkRenderData.isOverlayTypeEmpty(type) == false) { BuiltBuffer built; @@ -867,7 +917,8 @@ private void postRenderOverlay(OverlayRenderType type, float x, float y, float z if (built == null) { - throw new RuntimeException("failed to build BuiltBuffer"); + chunkRenderData.setOverlayTypeUnused(type); + return; } else { @@ -876,7 +927,8 @@ private void postRenderOverlay(OverlayRenderType type, float x, float y, float z } else { - throw new RuntimeException("BufferBuilder has not been initialized"); + chunkRenderData.setOverlayTypeUnused(type); + return; } if (type.isTranslucent() && Configs.Visuals.SCHEMATIC_OVERLAY_ENABLE_RESORTING.getBooleanValue()) @@ -919,7 +971,6 @@ protected void uploadSortingState(@Nonnull BufferAllocator.CloseableBuffer resul { if (vertexBuffer.isClosed()) { - Litematica.logger.error("uploadSortingState() [VBO] - Error, vertexBuffer is closed/Null"); result.close(); return; } @@ -932,7 +983,6 @@ protected void uploadSortingState(@Nonnull BufferAllocator.CloseableBuffer resul private void resortRenderBlocks(RenderLayer layer, float x, float y, float z, @Nonnull ChunkRenderDataSchematic chunkRenderData, @Nonnull BufferAllocatorCache allocators) throws InterruptedException { - //if (layer == RenderLayer.getTranslucent() && chunkRenderData.isBlockLayerEmpty(layer) == false) if (chunkRenderData.isBlockLayerEmpty(layer) == false) { BufferAllocator allocator = allocators.getBufferByLayer(layer); @@ -940,18 +990,21 @@ private void resortRenderBlocks(RenderLayer layer, float x, float y, float z, @N if (allocator == null) { - throw new InterruptedException("Buffers are invalid"); + chunkRenderData.setBlockLayerUnused(layer); + return; } if (chunkRenderData.getBuiltBufferCache().hasBuiltBufferByLayer(layer) == false) { - throw new InterruptedException("Buffers are invalid"); + chunkRenderData.setBlockLayerUnused(layer); + return; } built = chunkRenderData.getBuiltBufferCache().getBuiltBufferByLayer(layer); if (built == null) { - throw new InterruptedException("Buffers are invalid"); + chunkRenderData.setBlockLayerUnused(layer); + return; } if (layer == RenderLayer.getTranslucent()) @@ -980,10 +1033,6 @@ private void resortRenderBlocks(RenderLayer layer, float x, float y, float z, @N throw new InterruptedException("Sorting Data failure"); } } - else - { - throw new InterruptedException("layer is not translucent"); - } } } @@ -991,8 +1040,6 @@ private void resortRenderOverlay(OverlayRenderType type, float x, float y, float throws InterruptedException { RenderSystem.applyModelViewMatrix(); - - //if (type == OverlayRenderType.QUAD && chunkRenderData.isOverlayTypeEmpty(type) == false) if (chunkRenderData.isOverlayTypeEmpty(type) == false) { BufferAllocator allocator = allocators.getBufferByOverlay(type); @@ -1000,18 +1047,21 @@ private void resortRenderOverlay(OverlayRenderType type, float x, float y, float if (allocator == null) { - throw new InterruptedException("Buffers are invalid"); + chunkRenderData.setOverlayTypeUnused(type); + return; } if (chunkRenderData.getBuiltBufferCache().hasBuiltBufferByType(type) == false) { - throw new InterruptedException("Buffers are invalid"); + chunkRenderData.setOverlayTypeUnused(type); + return; } built = chunkRenderData.getBuiltBufferCache().getBuiltBufferByType(type); if (built == null) { - throw new InterruptedException("Buffers are invalid"); + chunkRenderData.setOverlayTypeUnused(type); + return; } if (type.isTranslucent() && Configs.Visuals.SCHEMATIC_OVERLAY_ENABLE_RESORTING.getBooleanValue()) @@ -1040,51 +1090,130 @@ private void resortRenderOverlay(OverlayRenderType type, float x, float y, float throw new InterruptedException("Sorting Data failure"); } } - else - { - throw new InterruptedException("layer is not translucent"); - } } } protected ChunkRenderTaskSchematic makeCompileTaskChunkSchematic(Supplier cameraPosSupplier) { + /* Threaded Code + ChunkRenderTaskSchematic generator = new ChunkRenderTaskSchematic(this, ChunkRenderTaskSchematic.Type.REBUILD_CHUNK, cameraPosSupplier, this.getDistanceSq()); this.finishCompileTask(generator); this.rebuildWorldView(); + return generator; + */ + + this.chunkRenderLock.lock(); + ChunkRenderTaskSchematic generator = null; + + try + { + //if (GuiBase.isCtrlDown()) System.out.printf("makeCompileTaskChunk()\n"); + this.finishCompileTask(); + this.rebuildWorldView(); + this.compileTask = new ChunkRenderTaskSchematic(this, ChunkRenderTaskSchematic.Type.REBUILD_CHUNK, cameraPosSupplier, this.getDistanceSq()); + generator = this.compileTask; + } + finally + { + this.chunkRenderLock.unlock(); + } + return generator; } @Nullable protected ChunkRenderTaskSchematic makeCompileTaskTransparencySchematic(Supplier cameraPosSupplier) { + /* Threaded Code + if (compileTask.get().getStatus() == ChunkRenderTaskSchematic.Status.PENDING) return null; ChunkRenderTaskSchematic newTask = new ChunkRenderTaskSchematic(this, ChunkRenderTaskSchematic.Type.RESORT_TRANSPARENCY, cameraPosSupplier, this.getDistanceSq()); newTask.setChunkRenderData(this.chunkRenderData.get()); finishCompileTask(newTask); return newTask; + */ + + this.chunkRenderLock.lock(); + + try + { + if (this.compileTask == null || this.compileTask.getStatus() != ChunkRenderTaskSchematic.Status.PENDING) + { + if (this.compileTask != null && this.compileTask.getStatus() != ChunkRenderTaskSchematic.Status.DONE) + { + this.compileTask.finish(); + } + + this.compileTask = new ChunkRenderTaskSchematic(this, ChunkRenderTaskSchematic.Type.RESORT_TRANSPARENCY, cameraPosSupplier, this.getDistanceSq()); + this.compileTask.setChunkRenderData(this.chunkRenderData); + + return this.compileTask; + } + } + finally + { + this.chunkRenderLock.unlock(); + } + + return null; } + /* Threaded Code + protected void finishCompileTask(@Nullable ChunkRenderTaskSchematic newTask) { ChunkRenderTaskSchematic oldtask = compileTask.getAndSet(newTask); if (oldtask != null) oldtask.finish(); } + */ + + protected void finishCompileTask() + { + this.chunkRenderLock.lock(); + + try + { + if (this.compileTask != null && this.compileTask.getStatus() != ChunkRenderTaskSchematic.Status.DONE) + { + this.compileTask.finish(); + this.compileTask = null; + } + } + finally + { + this.chunkRenderLock.unlock(); + } + } + + protected ReentrantLock getLockCompileTask() + { + return this.chunkRenderLock; + } protected void clear() { try { - this.finishCompileTask(null); + this.finishCompileTask(); } finally { - this.builderCache.clearAll(); + /* Threaded Code + this.chunkRenderData.get().clearAll(); this.chunkRenderData.set(ChunkRenderDataSchematic.EMPTY); + */ + + if (this.chunkRenderData != null && !this.chunkRenderData.equals(ChunkRenderDataSchematic.EMPTY)) + { + this.chunkRenderData.clearAll(); + } + this.builderCache.clearAll(); + this.chunkRenderData = ChunkRenderDataSchematic.EMPTY; this.existingOverlays.clear(); this.hasOverlay = false; } @@ -1143,38 +1272,4 @@ public void close() throws Exception { this.deleteGlResources(); } - - public enum OverlayRenderType - { - OUTLINE (VertexFormat.DrawMode.DEBUG_LINES, RenderLayer.DEFAULT_BUFFER_SIZE, VertexFormats.POSITION_COLOR, false, false), - QUAD (VertexFormat.DrawMode.QUADS, RenderLayer.DEFAULT_BUFFER_SIZE, VertexFormats.POSITION_COLOR, false, true); - - private final VertexFormat.DrawMode drawMode; - private final VertexFormat vertexFormat; - private final int bufferSize; - private final boolean hasCrumbling; - private final boolean translucent; - - OverlayRenderType(VertexFormat.DrawMode drawMode, int bufferSize, VertexFormat format, boolean crumbling, boolean translucent) - { - this.drawMode = drawMode; - this.bufferSize = bufferSize; - this.vertexFormat = format; - this.hasCrumbling = crumbling; - this.translucent = translucent; - } - - public VertexFormat.DrawMode getDrawMode() - { - return this.drawMode; - } - - public int getExpectedBufferSize() { return this.bufferSize; } - - public VertexFormat getVertexFormat() { return this.vertexFormat; } - - public boolean hasCrumbling() { return this.hasCrumbling; } - - public boolean isTranslucent() { return this.translucent; } - } } diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/OverlayRenderType.java b/src/main/java/fi/dy/masa/litematica/render/schematic/OverlayRenderType.java new file mode 100644 index 0000000..3bc29a0 --- /dev/null +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/OverlayRenderType.java @@ -0,0 +1,39 @@ +package fi.dy.masa.litematica.render.schematic; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.VertexFormats; + +public enum OverlayRenderType +{ + OUTLINE (VertexFormat.DrawMode.DEBUG_LINES, RenderLayer.DEFAULT_BUFFER_SIZE, VertexFormats.POSITION_COLOR, false, false), + QUAD (VertexFormat.DrawMode.QUADS, RenderLayer.DEFAULT_BUFFER_SIZE, VertexFormats.POSITION_COLOR, false, true); + + private final VertexFormat.DrawMode drawMode; + private final VertexFormat vertexFormat; + private final int bufferSize; + private final boolean hasCrumbling; + private final boolean translucent; + + OverlayRenderType(VertexFormat.DrawMode drawMode, int bufferSize, VertexFormat format, boolean crumbling, boolean translucent) + { + this.drawMode = drawMode; + this.bufferSize = bufferSize; + this.vertexFormat = format; + this.hasCrumbling = crumbling; + this.translucent = translucent; + } + + public VertexFormat.DrawMode getDrawMode() + { + return this.drawMode; + } + + public int getExpectedBufferSize() { return this.bufferSize; } + + public VertexFormat getVertexFormat() { return this.vertexFormat; } + + public boolean hasCrumbling() { return this.hasCrumbling; } + + public boolean isTranslucent() { return this.translucent; } +} diff --git a/src/main/java/fi/dy/masa/litematica/render/schematic/WorldRendererSchematic.java b/src/main/java/fi/dy/masa/litematica/render/schematic/WorldRendererSchematic.java index 758faf6..e34b8d1 100644 --- a/src/main/java/fi/dy/masa/litematica/render/schematic/WorldRendererSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/render/schematic/WorldRendererSchematic.java @@ -26,13 +26,15 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.random.Random; import net.minecraft.world.BlockRenderView; +import fi.dy.masa.malilib.util.Color4f; import fi.dy.masa.malilib.util.EntityUtils; import fi.dy.masa.malilib.util.LayerRange; import fi.dy.masa.litematica.config.Configs; import fi.dy.masa.litematica.config.Hotkeys; import fi.dy.masa.litematica.data.DataManager; -import fi.dy.masa.litematica.render.schematic.ChunkRendererSchematicVbo.OverlayRenderType; +import fi.dy.masa.litematica.util.OverlayType; import fi.dy.masa.litematica.world.ChunkSchematic; import fi.dy.masa.litematica.world.WorldSchematic; @@ -112,7 +114,9 @@ protected int getRenderedChunks() for (ChunkRendererSchematicVbo chunkRenderer : this.renderInfos) { - ChunkRenderDataSchematic data = chunkRenderer.chunkRenderData.get(); + // Threaded Code + //ChunkRenderDataSchematic data = chunkRenderer.chunkRenderData.get(); + ChunkRenderDataSchematic data = chunkRenderer.chunkRenderData; if (data != ChunkRenderDataSchematic.EMPTY && !data.isEmpty()) { @@ -160,8 +164,6 @@ public void setWorldAndLoadRenderers(@Nullable WorldSchematic worldSchematic) public void loadRenderers() { - //Litematica.logger.warn("loadRenderers() [Renderer]"); - if (this.hasWorld()) { this.world.getProfiler().push("litematica_load_renderers"); @@ -205,8 +207,6 @@ protected void stopChunkUpdates() public void setupTerrain(Camera camera, Frustum frustum, int frameCount, boolean playerSpectator) { - //Litematica.logger.warn("setupTerrain() [Renderer]"); - this.world.getProfiler().push("setup_terrain"); if (this.chunkRendererDispatcher == null || @@ -357,8 +357,6 @@ public void setupTerrain(Camera camera, Frustum frustum, int frameCount, boolean public void updateChunks(long finishTimeNano) { - //Litematica.logger.warn("updateChunks() [Renderer]"); - this.mc.getProfiler().push("litematica_run_chunk_uploads"); this.displayListEntitiesDirty |= this.renderDispatcher.runChunkUploads(finishTimeNano); @@ -409,7 +407,7 @@ public void updateChunks(long finishTimeNano) public int renderBlockLayer(RenderLayer renderLayer, Matrix4f matrices, Camera camera, Matrix4f projMatrix) { - //RenderSystem.assertOnRenderThread(); + RenderSystem.assertOnRenderThread(); this.world.getProfiler().push("render_block_layer_" + renderLayer.toString()); boolean isTranslucent = renderLayer == RenderLayer.getTranslucent(); @@ -491,13 +489,11 @@ public int renderBlockLayer(RenderLayer renderLayer, Matrix4f matrices, Camera c if (buffer == null || buffer.isClosed()) { - //Litematica.logger.error("renderBlockLayer() [Renderer]: vertexBuffer for layer [{}] is null/closed, skipping draw", ChunkRenderLayers.getFriendlyName(renderLayer)); continue; } if (renderer.getChunkRenderData().getBuiltBufferCache().hasBuiltBufferByLayer(renderLayer) == false) { - //Litematica.logger.error("renderBlockLayer() [Renderer]: buffer for layer [{}] is not built, skipping draw", ChunkRenderLayers.getFriendlyName(renderLayer)); continue; } @@ -507,8 +503,6 @@ public int renderBlockLayer(RenderLayer renderLayer, Matrix4f matrices, Camera c chunkOffsetUniform.upload(); } - //Litematica.logger.warn("renderBlockLayer() [Renderer] --> bind / draw / unbind for layer [{}]", ChunkRenderLayers.getFriendlyName(renderLayer)); - buffer.bind(); buffer.draw(); VertexBuffer.unbind(); @@ -595,8 +589,6 @@ protected void renderBlockOverlay(OverlayRenderType type, Matrix4f matrix4f, Cam ShaderProgram shader = RenderSystem.getShader(); BufferRenderer.reset(); - - // I tried using the matrix4f value here, only to have things break Matrix4fStack matrix4fStack = RenderSystem.getModelViewStack(); for (int i = this.renderInfos.size() - 1; i >= 0; --i) @@ -663,7 +655,12 @@ public boolean renderBlock(BlockRenderView world, BlockState state, BlockPos pos public void renderFluid(BlockRenderView world, BlockState blockState, FluidState fluidState, BlockPos pos, BufferBuilder bufferBuilderIn) { - this.blockRenderManager.renderFluid(pos, world, bufferBuilderIn, blockState, fluidState); + // Sometimes this collides with FAPI + try + { + this.blockRenderManager.renderFluid(pos, world, bufferBuilderIn, blockState, fluidState); + } + catch (Exception ignored) { } } public BakedModel getModelForState(BlockState state) diff --git a/src/main/java/fi/dy/masa/litematica/scheduler/tasks/TaskSaveSchematic.java b/src/main/java/fi/dy/masa/litematica/scheduler/tasks/TaskSaveSchematic.java index d4c41b1..0d2530e 100644 --- a/src/main/java/fi/dy/masa/litematica/scheduler/tasks/TaskSaveSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/scheduler/tasks/TaskSaveSchematic.java @@ -1,12 +1,15 @@ package fi.dy.masa.litematica.scheduler.tasks; +import javax.annotation.Nullable; import java.io.File; import java.util.*; -import javax.annotation.Nullable; import com.google.common.collect.ImmutableMap; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import fi.dy.masa.malilib.gui.Message.MessageType; +import fi.dy.masa.malilib.util.InfoUtils; +import fi.dy.masa.malilib.util.IntBoundingBox; import fi.dy.masa.litematica.data.EntitiesDataStorage; import fi.dy.masa.litematica.data.SchematicHolder; import fi.dy.masa.litematica.render.infohud.InfoHud; @@ -14,9 +17,6 @@ import fi.dy.masa.litematica.selection.AreaSelection; import fi.dy.masa.litematica.selection.Box; import fi.dy.masa.litematica.util.PositionUtils; -import fi.dy.masa.malilib.gui.Message.MessageType; -import fi.dy.masa.malilib.util.InfoUtils; -import fi.dy.masa.malilib.util.IntBoundingBox; public class TaskSaveSchematic extends TaskProcessChunkBase { diff --git a/src/main/java/fi/dy/masa/litematica/schematic/LitematicaSchematic.java b/src/main/java/fi/dy/masa/litematica/schematic/LitematicaSchematic.java index 34a314b..1a54b7c 100644 --- a/src/main/java/fi/dy/masa/litematica/schematic/LitematicaSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/schematic/LitematicaSchematic.java @@ -1605,14 +1605,19 @@ public boolean readFromVanillaStructure(String name, NbtCompound tag) List list = new ArrayList<>(paletteSize); RegistryEntryLookup lookup = Registries.BLOCK.getReadOnlyWrapper(); - if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION) + DataFixerMode.Schema effective = DataFixerMode.getEffectiveSchema(minecraftDataVersion); + if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION && effective != null) { Litematica.logger.info("VanillaStructure: executing Vanilla DataFixer for Block State Palette DataVersion {} -> {}", minecraftDataVersion, LitematicaSchematic.MINECRAFT_DATA_VERSION); } + else if (effective == null) + { + Litematica.logger.warn("readFromVanillaStructure(): Effective Schema has been bypassed. Not applying Vanilla Data Fixer for Block State Palette DataVersion {}", minecraftDataVersion); + } for (int id = 0; id < paletteSize; ++id) { NbtCompound t = paletteTag.getCompound(id); - if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION) + if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION && effective != null) { t = SchematicConversionMaps.updateBlockStates(t, minecraftDataVersion); } @@ -1745,15 +1750,20 @@ protected List readEntitiesFromVanillaStructure(NbtCompound tag, int List entities = new ArrayList<>(); NbtList tagList = tag.getList("entities", Constants.NBT.TAG_COMPOUND); final int size = tagList.size(); + DataFixerMode.Schema effective = DataFixerMode.getEffectiveSchema(minecraftDataVersion); - if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION) + if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION && effective != null) { Litematica.logger.info("VanillaStructure: executing Vanilla DataFixer for Entities DataVersion {} -> {}", minecraftDataVersion, LitematicaSchematic.MINECRAFT_DATA_VERSION); } + else if (effective == null) + { + Litematica.logger.warn("readEntitiesFromVanillaStructure(): Effective Schema has been bypassed. Not applying Vanilla Data Fixer for Entities DataVersion {}", minecraftDataVersion); + } for (int i = 0; i < size; ++i) { NbtCompound entityData = tagList.getCompound(i); - if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION) + if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION && effective != null) { entityData = SchematicConversionMaps.updateEntity(entityData, minecraftDataVersion); } @@ -1843,6 +1853,14 @@ private NbtList convertBlockStatePalette_to_1_20_5(NbtList oldPalette, int minec } if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION) { + DataFixerMode.Schema effective = DataFixerMode.getEffectiveSchema(minecraftDataVersion); + + if (effective == null) + { + Litematica.logger.warn("LitematicaSchematic: Effective Schema has been bypassed. Not applying Vanilla Data Fixer for Block State Palette DataVersion {}", minecraftDataVersion); + return oldPalette; + } + NbtList newPalette = new NbtList(); final int count = oldPalette.size(); Litematica.logger.info("LitematicaSchematic: executing Vanilla DataFixer for Block State Palette DataVersion {} -> {}", minecraftDataVersion, LitematicaSchematic.MINECRAFT_DATA_VERSION); @@ -1866,6 +1884,14 @@ private Map convertTileEntities_to_1_20_5(Map newTE = new HashMap<>(); Litematica.logger.info("LitematicaSchematic: executing Vanilla DataFixer for Tile Entities DataVersion {} -> {}", minecraftDataVersion, LitematicaSchematic.MINECRAFT_DATA_VERSION); @@ -1889,6 +1915,14 @@ private NbtList convertEntities_to_1_20_5(NbtList oldEntitiesList, int minecraft } if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION) { + DataFixerMode.Schema effective = DataFixerMode.getEffectiveSchema(minecraftDataVersion); + + if (effective == null) + { + Litematica.logger.warn("LitematicaSchematic: Effective Schema has been bypassed. Not applying Vanilla Data Fixer for Entities DataVersion {}", minecraftDataVersion); + return oldEntitiesList; + } + NbtList newEntitiesList = new NbtList(); final int size = oldEntitiesList.size(); @@ -1914,6 +1948,14 @@ private List convertSpongeEntities_to_1_20_5(List oldEnt if (minecraftDataVersion < LitematicaSchematic.MINECRAFT_DATA_VERSION) { + DataFixerMode.Schema effective = DataFixerMode.getEffectiveSchema(minecraftDataVersion); + + if (effective == null) + { + Litematica.logger.warn("SpongeSchematic: Effective Schema has been bypassed. Not applying Vanilla Data Fixer for Entities DataVersion {}", minecraftDataVersion); + return oldEntitiesList; + } + List newEntitiesList = new ArrayList<>(); Litematica.logger.info("SpongeSchematic: executing Vanilla DataFixer for Entities DataVersion {} -> {}", minecraftDataVersion, LitematicaSchematic.MINECRAFT_DATA_VERSION); diff --git a/src/main/java/fi/dy/masa/litematica/schematic/SchematicaSchematic.java b/src/main/java/fi/dy/masa/litematica/schematic/SchematicaSchematic.java index f601c01..67c3a80 100644 --- a/src/main/java/fi/dy/masa/litematica/schematic/SchematicaSchematic.java +++ b/src/main/java/fi/dy/masa/litematica/schematic/SchematicaSchematic.java @@ -32,6 +32,7 @@ import fi.dy.masa.litematica.schematic.conversion.SchematicConversionFixers.IStateFixer; import fi.dy.masa.litematica.schematic.conversion.SchematicConversionMaps; import fi.dy.masa.litematica.schematic.conversion.SchematicConverter; +import fi.dy.masa.litematica.util.DataFixerMode; import fi.dy.masa.litematica.util.EntityUtils; import fi.dy.masa.litematica.util.NbtUtils; import fi.dy.masa.litematica.util.PositionUtils; @@ -681,12 +682,28 @@ private void readEntitiesFromNBT(NbtCompound nbt) { this.entities.clear(); NbtList tagList = nbt.getList("Entities", Constants.NBT.TAG_COMPOUND); + int minecraftDataVersion = Configs.Generic.DATAFIXER_DEFAULT_SCHEMA.getIntegerValue(); + DataFixerMode.Schema effective = DataFixerMode.getEffectiveSchema(minecraftDataVersion); - Litematica.logger.info("SchematicaSchematic: executing Vanilla DataFixer for Entities DataVersion {} -> {}", Configs.Generic.DATAFIXER_DEFAULT_SCHEMA.getIntegerValue(), LitematicaSchematic.MINECRAFT_DATA_VERSION); + if (effective != null) + { + Litematica.logger.info("SchematicaSchematic: executing Vanilla DataFixer for Entities DataVersion {} -> {}", minecraftDataVersion, LitematicaSchematic.MINECRAFT_DATA_VERSION); + } + else + { + Litematica.logger.warn("SchematicaSchematic: Effective Schema has been bypassed. Not applying Vanilla Data Fixer for Entities DataVersion {}", minecraftDataVersion); + } for (int i = 0; i < tagList.size(); ++i) { - this.entities.add(SchematicConversionMaps.updateEntity(tagList.getCompound(i), Configs.Generic.DATAFIXER_DEFAULT_SCHEMA.getIntegerValue())); + if (effective != null) + { + this.entities.add(SchematicConversionMaps.updateEntity(tagList.getCompound(i), minecraftDataVersion)); + } + else + { + this.entities.add(tagList.getCompound(i)); + } } } @@ -694,8 +711,17 @@ private void readTileEntitiesFromNBT(NbtCompound nbt) { this.tiles.clear(); NbtList tagList = nbt.getList("TileEntities", Constants.NBT.TAG_COMPOUND); + int minecraftDataVersion = Configs.Generic.DATAFIXER_DEFAULT_SCHEMA.getIntegerValue(); + DataFixerMode.Schema effective = DataFixerMode.getEffectiveSchema(minecraftDataVersion); - Litematica.logger.info("SchematicaSchematic: executing Vanilla DataFixer for Tile Entities DataVersion {} -> {}", Configs.Generic.DATAFIXER_DEFAULT_SCHEMA.getIntegerValue(), LitematicaSchematic.MINECRAFT_DATA_VERSION); + if (effective != null) + { + Litematica.logger.info("SchematicaSchematic: executing Vanilla DataFixer for Tile Entities DataVersion {} -> {}", minecraftDataVersion, LitematicaSchematic.MINECRAFT_DATA_VERSION); + } + else + { + Litematica.logger.warn("SchematicaSchematic: Effective Schema has been bypassed. Not applying Vanilla Data Fixer for Tile Entities DataVersion {}", minecraftDataVersion); + } for (int i = 0; i < tagList.size(); ++i) { @@ -707,7 +733,14 @@ private void readTileEntitiesFromNBT(NbtCompound nbt) pos.getY() >= 0 && pos.getY() < size.getY() && pos.getZ() >= 0 && pos.getZ() < size.getZ()) { - this.tiles.put(pos, SchematicConversionMaps.updateBlockEntity(SchematicConversionMaps.checkForIdTag(tag), Configs.Generic.DATAFIXER_DEFAULT_SCHEMA.getIntegerValue())); + if (effective != null) + { + this.tiles.put(pos, SchematicConversionMaps.updateBlockEntity(SchematicConversionMaps.checkForIdTag(tag), minecraftDataVersion)); + } + else + { + this.tiles.put(pos, SchematicConversionMaps.checkForIdTag(tag)); + } } } } diff --git a/src/main/java/fi/dy/masa/litematica/schematic/conversion/SchematicConversionMaps.java b/src/main/java/fi/dy/masa/litematica/schematic/conversion/SchematicConversionMaps.java index cf8d2da..a8de9f0 100644 --- a/src/main/java/fi/dy/masa/litematica/schematic/conversion/SchematicConversionMaps.java +++ b/src/main/java/fi/dy/masa/litematica/schematic/conversion/SchematicConversionMaps.java @@ -18,6 +18,7 @@ import net.minecraft.registry.RegistryEntryLookup; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import fi.dy.masa.malilib.util.Constants; import fi.dy.masa.malilib.util.NBTUtils; import fi.dy.masa.litematica.Litematica; import fi.dy.masa.litematica.config.Configs; @@ -338,6 +339,7 @@ public static NbtCompound updateEntity(NbtCompound oldEntity, int oldVersion) } } + // Fix missing "id" tags. This seems to be an issue with 1.19.x litematics. public static NbtCompound checkForIdTag(NbtCompound tags) { if (tags.contains("id")) @@ -449,9 +451,64 @@ else if (tags.contains("x") && tags.contains("y") && tags.contains("z")) tags.putString("id", "minecraft:piston"); } + // Fix any erroneous Items tags with the null "tag" tag. + if (tags.contains("Items")) + { + NbtList items = fixItemsTag(tags.getList("Items", Constants.NBT.TAG_COMPOUND)); + tags.put("Items", items); + } + return tags; } + // Fix null 'tag' entries. This seems to be an issue with 1.19.x litematics. + private static NbtList fixItemsTag(NbtList items) + { + NbtList newList = new NbtList(); + + for (int i = 0; i < items.size(); i++) + { + NbtCompound itemEntry = items.getCompound(i); + if (itemEntry.contains("tag")) + { + NbtCompound tag = null; + try + { + tag = itemEntry.getCompound("tag"); + } + catch (Exception ignored) {} + + // Remove 'tag' if it is set to null + if (tag == null) + { + itemEntry.remove("tag"); + } + else + { + // Fix nested entries if they exist + if (tag.contains("BlockEntityTag", Constants.NBT.TAG_COMPOUND)) + { + NbtCompound entityEntry = tag.getCompound("BlockEntityTag"); + + if (entityEntry.contains("Items", Constants.NBT.TAG_LIST)) + { + NbtList nestedItems = fixItemsTag(entityEntry.getList("Items", Constants.NBT.TAG_COMPOUND)); + entityEntry.put("Items", nestedItems); + } + + tag.put("BlockEntityTag", entityEntry); + } + + itemEntry.put("tag", tag); + } + } + + newList.add(itemEntry); + } + + return newList; + } + private static class ConversionData { private final int idMeta; diff --git a/src/main/java/fi/dy/masa/litematica/schematic/placement/SchematicPlacement.java b/src/main/java/fi/dy/masa/litematica/schematic/placement/SchematicPlacement.java index 47ede0a..02b9fee 100644 --- a/src/main/java/fi/dy/masa/litematica/schematic/placement/SchematicPlacement.java +++ b/src/main/java/fi/dy/masa/litematica/schematic/placement/SchematicPlacement.java @@ -12,6 +12,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; +import fi.dy.masa.litematica.config.Configs; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtHelper; import org.apache.commons.lang3.tuple.Pair; @@ -1074,8 +1075,11 @@ public NbtCompound toNbt(boolean withSchematic) sub.putInt("Rotation", subRegionPlacement.getRotation().ordinal()); sub.putInt("Mirror", subRegionPlacement.getMirror().ordinal()); sub.putString("Name", subRegionPlacement.getName()); + sub.putBoolean("Enabled", subRegionPlacement.isEnabled()); + sub.putBoolean("IgnoreEntities", subRegionPlacement.ignoreEntities()); } compound.put("SubRegions", subs); + compound.putString("ReplaceMode", Configs.Generic.PASTE_REPLACE_BEHAVIOR.getStringValue()); return compound; } } diff --git a/src/main/java/fi/dy/masa/litematica/util/DataFixerMode.java b/src/main/java/fi/dy/masa/litematica/util/DataFixerMode.java new file mode 100644 index 0000000..372cfcf --- /dev/null +++ b/src/main/java/fi/dy/masa/litematica/util/DataFixerMode.java @@ -0,0 +1,222 @@ +package fi.dy.masa.litematica.util; + +import javax.annotation.Nullable; +import com.google.common.collect.ImmutableList; +import fi.dy.masa.malilib.config.IConfigOptionListEntry; +import fi.dy.masa.malilib.util.StringUtils; +import fi.dy.masa.litematica.config.Configs; + +public enum DataFixerMode implements IConfigOptionListEntry +{ + ALWAYS ("always", "litematica.gui.label.data_fixer_mode.always"), + BELOW_1205 ("below_1205", "litematica.gui.label.data_fixer_mode.below_1205"), + BELOW_120X ("below_120X", "litematica.gui.label.data_fixer_mode.below_120X"), + BELOW_119X ("below_119X", "litematica.gui.label.data_fixer_mode.below_119X"), + BELOW_117X ("below_117X", "litematica.gui.label.data_fixer_mode.below_117X"), + BELOW_116X ("below_116X", "litematica.gui.label.data_fixer_mode.below_116X"), + BELOW_113X ("below_113X", "litematica.gui.label.data_fixer_mode.below_113X"), + BELOW_112X ("below_112X", "litematica.gui.label.data_fixer_mode.below_112X"), + NEVER ("never", "litematica.gui.label.data_fixer_mode.never"); + + public static final ImmutableList VALUES = ImmutableList.copyOf(values()); + + private final String configString; + private final String translationKey; + + DataFixerMode(String configString, String translationKey) + { + this.configString = configString; + this.translationKey = translationKey; + } + + @Override + public String getStringValue() + { + return this.configString; + } + + @Override + public String getDisplayName() + { + return StringUtils.translate(this.translationKey); + } + + @Override + public IConfigOptionListEntry cycle(boolean forward) + { + int id = this.ordinal(); + + if (forward) + { + if (++id >= values().length) + { + id = 0; + } + } + else + { + if (--id < 0) + { + id = values().length - 1; + } + } + + return values()[id % values().length]; + } + + @Override + public DataFixerMode fromString(String name) + { + return fromStringStatic(name); + } + + public static DataFixerMode fromStringStatic(String name) + { + for (DataFixerMode val : VALUES) + { + if (val.configString.equalsIgnoreCase(name)) + { + return val; + } + } + + return DataFixerMode.ALWAYS; + } + + @Nullable + public static Schema getEffectiveSchema(int dataVersion) + { + DataFixerMode config = (DataFixerMode) Configs.Generic.DATAFIXER_MODE.getOptionListValue(); + Schema schema = getSchemaByVersion(dataVersion); + + switch (config) + { + case ALWAYS -> { return schema; } + case BELOW_1205 -> + { + if (dataVersion < Schema.SCHEMA_1_20_05.getDataVersion()) + { + return schema; + } + + return null; + } + case BELOW_120X -> + { + if (dataVersion < Schema.SCHEMA_1_20_00.getDataVersion()) + { + return schema; + } + + return null; + } + case BELOW_119X -> + { + if (dataVersion < Schema.SCHEMA_1_19_00.getDataVersion()) + { + return schema; + } + + return null; + } + case BELOW_117X -> + { + if (dataVersion < Schema.SCHEMA_1_17_00.getDataVersion()) + { + return schema; + } + + return null; + } + case BELOW_116X -> + { + if (dataVersion < Schema.SCHEMA_1_16_00.getDataVersion()) + { + return schema; + } + + return null; + } + case BELOW_113X -> + { + if (dataVersion < Schema.SCHEMA_1_13_00.getDataVersion()) + { + return schema; + } + + return null; + } + case BELOW_112X -> + { + if (dataVersion < Schema.SCHEMA_1_12_00.getDataVersion()) + { + return schema; + } + + return null; + } + case NEVER -> { return null; } + default -> { return getSchemaByVersion(Configs.Generic.DATAFIXER_DEFAULT_SCHEMA.getDefaultIntegerValue()); } + } + } + + public static Schema getSchemaByVersion(int dataVersion) + { + for (Schema schema : Schema.values()) + { + if (schema.getDataVersion() < dataVersion) + { + return schema; + } + } + + return getSchemaByVersion(Configs.Generic.DATAFIXER_DEFAULT_SCHEMA.getDefaultIntegerValue()); + } + + // TODO --> Add Schema Versions to this as versions get released + public enum Schema + { + // Minecraft Data Versions + SCHEMA_1_21_00 (3953), + SCHEMA_1_20_05 (3837), + SCHEMA_1_20_04 (3700), + SCHEMA_1_20_02 (3578), + SCHEMA_1_20_01 (3465), + SCHEMA_1_20_00 (3463), + SCHEMA_1_19_04 (3337), + SCHEMA_1_19_00 (3105), + SCHEMA_1_18_02 (2975), + SCHEMA_1_18_00 (2860), + SCHEMA_1_17_01 (2730), + SCHEMA_1_17_00 (2724), + SCHEMA_1_16_05 (2586), + SCHEMA_1_16_00 (2566), + SCHEMA_1_15_02 (2230), + SCHEMA_1_15_00 (2225), + SCHEMA_1_14_04 (1976), + SCHEMA_1_14_00 (1952), + SCHEMA_1_13_02 (1631), + SCHEMA_1_13_00 (1519), + SCHEMA_1_12_02 (1343), + SCHEMA_1_12_00 (1139), + SCHEMA_1_11_02 (922), + SCHEMA_1_11_00 (819), + SCHEMA_1_10_02 (512), + SCHEMA_1_10_00 (510), + SCHEMA_1_09_04 (184), + SCHEMA_1_09_00 (169), + SCHEMA_15W32A (100); + + private final int schemaId; + + Schema(int id) + { + this.schemaId = id; + } + + public int getDataVersion() + { + return this.schemaId; + } + } +} diff --git a/src/main/java/fi/dy/masa/litematica/util/PlacementHandler.java b/src/main/java/fi/dy/masa/litematica/util/PlacementHandler.java index f002747..115f790 100644 --- a/src/main/java/fi/dy/masa/litematica/util/PlacementHandler.java +++ b/src/main/java/fi/dy/masa/litematica/util/PlacementHandler.java @@ -1,15 +1,11 @@ package fi.dy.masa.litematica.util; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import javax.annotation.Nullable; import com.google.common.collect.ImmutableSet; -import net.minecraft.block.BedBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.ComparatorBlock; -import net.minecraft.block.RepeaterBlock; +import net.minecraft.block.*; import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.ComparatorMode; import net.minecraft.block.enums.SlabType; @@ -36,22 +32,18 @@ public class PlacementHandler // BooleanProperty: // INVERTED - DaylightDetector // OPEN - Barrel, Door, FenceGate, Trapdoor - // PERSISTENT - Leaves - // CAN_SUMMON - Shrieker + // PERSISTENT - Leaves (Disabled) Properties.INVERTED, Properties.OPEN, - Properties.PERSISTENT, - Properties.CAN_SUMMON, + //Properties.PERSISTENT, // EnumProperty: - // ATTACHMENT - Bell + // ATTACHMENT - Bells // AXIS - Pillar - // BED_PART - Beds // BLOCK_HALF - Stairs, Trapdoor // BLOCK_FACE - Button, Grindstone, Lever // CHEST_TYPE - Chest // COMPARATOR_MODE - Comparator // DOOR_HINGE - Door - // DOUBLE_BLOCK_HALF - Doors, Plants // ORIENTATION - Crafter // RAIL_SHAPE / STRAIGHT_RAIL_SHAPE - Rails // SLAB_TYPE - Slab - PARTIAL ONLY: TOP and BOTTOM, not DOUBLE @@ -59,13 +51,13 @@ public class PlacementHandler // BLOCK_FACE - Button, Grindstone, Lever Properties.ATTACHMENT, Properties.AXIS, - Properties.BED_PART, Properties.BLOCK_HALF, Properties.BLOCK_FACE, Properties.CHEST_TYPE, Properties.COMPARATOR_MODE, Properties.DOOR_HINGE, - Properties.DOUBLE_BLOCK_HALF, + Properties.HORIZONTAL_FACING, + Properties.HOPPER_FACING, Properties.ORIENTATION, Properties.RAIL_SHAPE, Properties.STRAIGHT_RAIL_SHAPE, @@ -101,8 +93,6 @@ public static EasyPlaceProtocol getEffectiveProtocolVersion() return EasyPlaceProtocol.SLAB_ONLY; } - Litematica.debugLog("getEffectiveProtocolVersion(): {}", protocol.name()); - return protocol; } @@ -188,11 +178,13 @@ else if (block instanceof ComparatorBlock) public static > BlockState applyPlacementProtocolV3(BlockState state, UseContext context) { int protocolValue = (int) (context.getHitVec().x - (double) context.getPos().getX()) - 2; + BlockState oldState = state; + //System.out.printf("hit vec.x %s, pos.x: %s\n", context.getHitVec().getX(), context.getPos().getX()); //System.out.printf("raw protocol value in: 0x%08X\n", protocolValue); if (protocolValue < 0) { - return state; + return oldState; } @Nullable DirectionProperty property = fi.dy.masa.malilib.util.BlockUtils.getFirstDirectionProperty(state); @@ -208,6 +200,17 @@ public static > BlockState applyPlacementProtocolV3(Bloc return null; } + if (state.canPlaceAt(context.getWorld(), context.getPos())) + { + //System.out.printf("validator passed for \"%s\"\n", property.getName()); + oldState = state; + } + else + { + //System.out.printf("validator failed for \"%s\"\n", property.getName()); + state = oldState; + } + // Consume the bits used for the facing protocolValue >>>= 3; } @@ -242,8 +245,19 @@ public static > BlockState applyPlacementProtocolV3(Bloc if (state.get(prop).equals(value) == false && value != SlabType.DOUBLE) // don't allow duping slabs by forcing a double slab via the protocol { - //System.out.printf("applying %s: %s\n", prop.getName(), value); + //System.out.printf("applying \"%s\": %s\n", prop.getName(), value); state = state.with(prop, value); + + if (state.canPlaceAt(context.getWorld(), context.getPos())) + { + //System.out.printf("validator passed for \"%s\"\n", prop.getName()); + oldState = state; + } + else + { + //System.out.printf("validator failed for \"%s\"\n", prop.getName()); + state = oldState; + } } protocolValue >>>= requiredBits; @@ -256,7 +270,16 @@ public static > BlockState applyPlacementProtocolV3(Bloc Litematica.logger.warn("Exception trying to apply placement protocol value", e); } - return state; + if (state.canPlaceAt(context.getWorld(), context.getPos())) + { + //System.out.printf("validator passed for \"%s\"\n", state); + return state; + } + else + { + //System.out.printf("validator failed for \"%s\"\n", state); + return null; + } } private static BlockState applyDirectionProperty(BlockState state, UseContext context, @@ -280,7 +303,7 @@ else if (decodedFacingIndex >= 0 && decodedFacingIndex <= 5) } } - //System.out.printf("plop facing: %s -> %s (raw: %d, dec: %d)\n", facingOrig, facing, rawFacingIndex, decodedFacingIndex); + //System.out.printf("plop facing: %s -> %s (raw: %d, dec: %d)\n", facingOrig, facing, protocolValue, decodedFacingIndex); if (facing != facingOrig && property.getValues().contains(facing)) { @@ -311,7 +334,7 @@ public static class UseContext private final Hand hand; @Nullable private final ItemPlacementContext itemPlacementContext; - private UseContext(World world, BlockPos pos, Direction side, Vec3d hitVec, + public UseContext(World world, BlockPos pos, Direction side, Vec3d hitVec, LivingEntity entity, Hand hand, @Nullable ItemPlacementContext itemPlacementContext) { this.world = world; diff --git a/src/main/java/fi/dy/masa/litematica/util/SchematicPlacingUtils.java b/src/main/java/fi/dy/masa/litematica/util/SchematicPlacingUtils.java index 5572e57..8d673b3 100644 --- a/src/main/java/fi/dy/masa/litematica/util/SchematicPlacingUtils.java +++ b/src/main/java/fi/dy/masa/litematica/util/SchematicPlacingUtils.java @@ -11,6 +11,7 @@ import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.decoration.AbstractDecorationEntity; import net.minecraft.entity.decoration.DisplayEntity; import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.entity.decoration.painting.PaintingEntity; diff --git a/src/main/java/fi/dy/masa/litematica/util/WorldUtils.java b/src/main/java/fi/dy/masa/litematica/util/WorldUtils.java index 855843e..7f6c4d6 100644 --- a/src/main/java/fi/dy/masa/litematica/util/WorldUtils.java +++ b/src/main/java/fi/dy/masa/litematica/util/WorldUtils.java @@ -37,9 +37,9 @@ import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkStatus; -import fi.dy.masa.malilib.gui.Message; import fi.dy.masa.malilib.gui.Message.MessageType; import fi.dy.masa.malilib.interfaces.IStringConsumer; +import fi.dy.masa.malilib.util.BlockUtils; import fi.dy.masa.malilib.util.*; import fi.dy.masa.litematica.Litematica; import fi.dy.masa.litematica.config.Configs; @@ -76,6 +76,13 @@ public static void setShouldPreventBlockUpdates(World world, boolean preventUpda ((IWorldUpdateSuppressor) world).litematica_setShouldPreventBlockUpdates(preventUpdates); } + public static boolean convertLitematicaSchematicToLitematicaSchematic( + File inputDir, String inputFileName, File outputDir, String outputFileName, boolean ignoreEntities, boolean override, IStringConsumer feedback) + { + LitematicaSchematic litematicaSchematic = convertLitematicaSchematicToLitematicaSchematic(inputDir, inputFileName, outputFileName, feedback); + return litematicaSchematic != null && litematicaSchematic.writeToFile(outputDir, outputFileName, override); + } + public static boolean convertSchematicaSchematicToLitematicaSchematic( File inputDir, String inputFileName, File outputDir, String outputFileName, boolean ignoreEntities, boolean override, IStringConsumer feedback) { @@ -83,6 +90,29 @@ public static boolean convertSchematicaSchematicToLitematicaSchematic( return litematicaSchematic != null && litematicaSchematic.writeToFile(outputDir, outputFileName, override); } + @Nullable + public static LitematicaSchematic convertLitematicaSchematicToLitematicaSchematic(File inputDir, String inputFileName, + String outputFilename, + IStringConsumer feedback) + { + DataFixerMode oldMode = (DataFixerMode) Configs.Generic.DATAFIXER_MODE.getOptionListValue(); + Configs.Generic.DATAFIXER_MODE.setOptionListValue(DataFixerMode.ALWAYS); + LitematicaSchematic litematicaSchematic = LitematicaSchematic.createFromFile(inputDir, inputFileName, FileType.LITEMATICA_SCHEMATIC); + + if (litematicaSchematic == null) + { + feedback.setString("litematica.error.schematic_conversion.litematic_to_litematica.failed_to_read_litematic"); + Configs.Generic.DATAFIXER_MODE.setOptionListValue(oldMode); + return null; + } + + litematicaSchematic.getMetadata().setName(outputFilename); + litematicaSchematic.getMetadata().setTimeModifiedToNow(); + + Configs.Generic.DATAFIXER_MODE.setOptionListValue(oldMode); + return litematicaSchematic; + } + @Nullable public static LitematicaSchematic convertSchematicaSchematicToLitematicaSchematic(File inputDir, String inputFileName, boolean ignoreEntities, IStringConsumer feedback) @@ -403,7 +433,7 @@ public static boolean handleEasyPlace(MinecraftClient mc) if (type == MessageOutputType.MESSAGE) { - InfoUtils.showGuiOrInGameMessage(Message.MessageType.WARNING, "litematica.message.easy_place_fail"); + InfoUtils.showGuiOrInGameMessage(MessageType.WARNING, "litematica.message.easy_place_fail"); } else if (type == MessageOutputType.ACTIONBAR) { @@ -445,7 +475,7 @@ private static ActionResult doEasyPlaceAction(MinecraftClient mc) return ActionResult.PASS; } - if (traceWrapper.getHitType() == RayTraceWrapper.HitType.SCHEMATIC_BLOCK) + if (traceWrapper.getHitType() == HitType.SCHEMATIC_BLOCK) { BlockHitResult trace = traceWrapper.getBlockHitResult(); HitResult traceVanilla = RayTraceUtils.getRayTraceFromEntity(mc.world, mc.player, false, traceMaxRange); @@ -492,32 +522,49 @@ private static ActionResult doEasyPlaceAction(MinecraftClient mc) Vec3d hitPos = trace.getPos(); Direction sideOrig = trace.getSide(); + EasyPlaceProtocol protocol = PlacementHandler.getEffectiveProtocolVersion(); - // If there is a block in the world right behind the targeted schematic block, then use - // that block as the click position - if (traceVanilla != null && traceVanilla.getType() == HitResult.Type.BLOCK) + if (protocol == EasyPlaceProtocol.NONE || protocol == EasyPlaceProtocol.SLAB_ONLY) { - BlockHitResult hitResult = (BlockHitResult) traceVanilla; - BlockPos posVanilla = hitResult.getBlockPos(); - Direction sideVanilla = hitResult.getSide(); - BlockState stateVanilla = mc.world.getBlockState(posVanilla); - Vec3d hit = traceVanilla.getPos(); - ItemPlacementContext ctx = new ItemPlacementContext(new ItemUsageContext(mc.player, hand, hitResult)); - - if (stateVanilla.canReplace(ctx) == false) + // If there is a block in the world right behind the targeted schematic block, then use + // that block as the click position + if (traceVanilla != null && traceVanilla.getType() == HitResult.Type.BLOCK) { - posVanilla = posVanilla.offset(sideVanilla); - - if (pos.equals(posVanilla)) + BlockHitResult hitResult = (BlockHitResult) traceVanilla; + BlockPos posVanilla = hitResult.getBlockPos(); + Direction sideVanilla = hitResult.getSide(); + BlockState stateVanilla = mc.world.getBlockState(posVanilla); + Vec3d hit = traceVanilla.getPos(); + ItemPlacementContext ctx = new ItemPlacementContext(new ItemUsageContext(mc.player, hand, hitResult)); + + if (stateVanilla.canReplace(ctx) == false) { - hitPos = hit; - sideOrig = sideVanilla; + posVanilla = posVanilla.offset(sideVanilla); + + if (pos.equals(posVanilla)) + { + hitPos = hit; + sideOrig = sideVanilla; + } } } } Direction side = applyPlacementFacing(stateSchematic, sideOrig, stateClient); - EasyPlaceProtocol protocol = PlacementHandler.getEffectiveProtocolVersion(); + + // Support for special cases + PlacementProtocolData placementData = applyPlacementProtocolAll(pos, stateSchematic, hitPos); + if (placementData.mustFail) + { + return ActionResult.FAIL; //disallowed cases (e.g. trying to place torch with no support block) + } + + if (placementData.handled) + { + pos = placementData.pos; + side = placementData.side; + hitPos = placementData.hitVec; + } if (protocol == EasyPlaceProtocol.V3) { @@ -539,9 +586,15 @@ else if (protocol == EasyPlaceProtocol.SLAB_ONLY) BlockHitResult hitResult = new BlockHitResult(hitPos, side, pos, false); - //System.out.printf("pos: %s side: %s, hit: %s\n", pos, side, hitPos); + //System.out.printf("interact -> pos: %s side: %s, hit: %s\n", pos, side, hitPos); // pos, side, hitPos - mc.interactionManager.interactBlock(mc.player, hand, hitResult); + ActionResult result = mc.interactionManager.interactBlock(mc.player, hand, hitResult); + + // swing hand fix, see MinecraftClient#doItemUse + if (result.shouldSwingHand()) + { + mc.player.swingHand(hand); + } if (stateSchematic.getBlock() instanceof SlabBlock && stateSchematic.get(SlabBlock.TYPE) == SlabType.DOUBLE) { @@ -558,7 +611,7 @@ else if (protocol == EasyPlaceProtocol.SLAB_ONLY) return ActionResult.SUCCESS; } - else if (traceWrapper.getHitType() == RayTraceWrapper.HitType.VANILLA_BLOCK) + else if (traceWrapper.getHitType() == HitType.VANILLA_BLOCK) { return placementRestrictionInEffect(mc) ? ActionResult.FAIL : ActionResult.PASS; } @@ -597,6 +650,76 @@ private static boolean easyPlaceBlockChecksCancel(BlockState stateSchematic, Blo return false; } + public static class PlacementProtocolData + { + boolean handled; + boolean mustFail; + BlockPos pos; + Direction side; + Vec3d hitVec; + } + + public static PlacementProtocolData applyPlacementProtocolAll(BlockPos pos, BlockState stateSchematic, Vec3d hitVecIn) + { + PlacementProtocolData placementData = new PlacementProtocolData(); + + Block stateBlock = stateSchematic.getBlock(); + final World world = MinecraftClient.getInstance().world; + + //Wall-mountable blocks + if (stateBlock instanceof AbstractTorchBlock || + stateBlock instanceof AbstractBannerBlock || + stateBlock instanceof AbstractSignBlock || + stateBlock instanceof AbstractSkullBlock) + { + placementData.handled = true; + placementData.hitVec = hitVecIn; + + if (stateBlock instanceof WallTorchBlock || + stateBlock instanceof WallRedstoneTorchBlock || + stateBlock instanceof WallBannerBlock || + stateBlock instanceof WallSignBlock || + stateBlock instanceof WallSkullBlock) + { + placementData.side = stateSchematic.get(Properties.HORIZONTAL_FACING); + placementData.pos = pos.offset(placementData.side.getOpposite()); + } + else + { + placementData.side = Direction.UP; + placementData.pos = pos.down(); + } + + //If the supporting block doesn't exist, fail + BlockState stateFacing = world.getBlockState(placementData.pos); + if (stateFacing == null || stateFacing.isAir()) + { + placementData.mustFail = true; + } + } + else if (stateBlock instanceof WallMountedBlock) + { + //If the supporting block doesn't exist, fail + Direction direction; + switch (stateSchematic.get(Properties.BLOCK_FACE)) + { + case CEILING: + direction = Direction.UP; + break; + case FLOOR: + direction = Direction.DOWN; + break; + default: + direction = stateSchematic.get(Properties.HORIZONTAL_FACING).getOpposite(); + } + + if (!WallMountedBlock.canPlaceAt(world, pos, direction)) + placementData.mustFail = true; + } + + return placementData; + } + /** * Apply the Carpet-Extra mod accurate block placement protocol support */ @@ -606,7 +729,7 @@ public static Vec3d applyCarpetProtocolHitVec(BlockPos pos, BlockState state, Ve double y = hitVecIn.y; double z = hitVecIn.z; Block block = state.getBlock(); - Direction facing = fi.dy.masa.malilib.util.BlockUtils.getFirstPropertyFacingValue(state); + Direction facing = BlockUtils.getFirstPropertyFacingValue(state); final int propertyIncrement = 16; boolean hasData = false; int protocolValue = 0; @@ -696,13 +819,17 @@ public static > Vec3d applyPlacementProtocolV3(BlockPos int shiftAmount = 1; int propCount = 0; - @Nullable DirectionProperty property = fi.dy.masa.malilib.util.BlockUtils.getFirstDirectionProperty(state); + //System.out.printf("hit vec.x %s, pos.x: %s\n", hitVecIn.getX(), pos.getX()); + //System.out.printf("raw protocol value in: 0x%08X\n", protocolValue); + + @Nullable DirectionProperty property = BlockUtils.getFirstDirectionProperty(state); // DirectionProperty - allow all except: VERTICAL_DIRECTION (PointedDripstone) if (property != null && property != Properties.VERTICAL_DIRECTION) { Direction direction = state.get(property); protocolValue |= direction.getId() << shiftAmount; + //System.out.printf("applying: 0x%08X\n", protocolValue); shiftAmount += 3; ++propCount; } @@ -725,6 +852,8 @@ public static > Vec3d applyPlacementProtocolV3(BlockPos int requiredBits = MathHelper.floorLog2(MathHelper.smallestEncompassingPowerOfTwo(list.size())); int valueIndex = list.indexOf(state.get(prop)); + //System.out.printf("trying to apply valInd: %d, bits: %d, prot val: 0x%08X\n", valueIndex, requiredBits, protocolValue); + if (valueIndex != -1) { //System.out.printf("requesting: %s = %s, index: %d\n", prop.getName(), state.get(prop), valueIndex); @@ -802,7 +931,7 @@ public static boolean handlePlacementRestriction(MinecraftClient mc) if (type == MessageOutputType.MESSAGE) { - InfoUtils.showGuiOrInGameMessage(Message.MessageType.WARNING, "litematica.message.placement_restriction_fail"); + InfoUtils.showGuiOrInGameMessage(MessageType.WARNING, "litematica.message.placement_restriction_fail"); } else if (type == MessageOutputType.ACTIONBAR) { @@ -881,11 +1010,69 @@ private static boolean placementRestrictionInEffect(MinecraftClient mc) { return true; } + + // Ignore if schematic block is wall-mountable and orientation is wrong + Block schematicBlock = stateSchematic.getBlock(); + if (schematicBlock instanceof WallTorchBlock || + schematicBlock instanceof WallRedstoneTorchBlock || + schematicBlock instanceof WallBannerBlock || + schematicBlock instanceof WallSignBlock || + schematicBlock instanceof WallSkullBlock) + { + if (blockHitResult.getSide() != stateSchematic.get(Properties.HORIZONTAL_FACING)) + return true; + } + + // Orientation is wrong + BlockState attemptState = schematicBlock.getPlacementState(ctx); + return !isMatchingStatePlacementRestriction (attemptState, stateSchematic); } return false; } + private static boolean isMatchingStatePlacementRestriction (BlockState state1, BlockState state2) + { + if (state1 == null || state2 == null) + return false; + if (state1 == state2) + return true; + + Property[] orientationProperties = new Property[] { + Properties.FACING, //pistons + Properties.BLOCK_HALF, //stairs, trapdoors + Properties.HOPPER_FACING, + Properties.DOOR_HINGE, + Properties.HORIZONTAL_FACING, //small dripleaf + Properties.AXIS, //logs + Properties.SLAB_TYPE, + Properties.VERTICAL_DIRECTION, + Properties.ROTATION, //banners + Properties.HANGING, //lanterns + Properties.BLOCK_FACE, //lever + Properties.ATTACHMENT, //bell (double-check for single-wall / double-wall) + //Properties.HORIZONTAL_AXIS, //Nether portals, though they aren't directly placeable + //Properties.ORIENTATION, //jigsaw blocks + }; + + for (Property property : orientationProperties) + { + boolean hasProperty1 = state1.contains(property); + boolean hasProperty2 = state2.contains(property); + + if (hasProperty1 != hasProperty2) + return false; + if (!hasProperty1) + continue; + + if (state1.get(property) != state2.get(property)) + return false; + } + + //Other properties are considered as matching + return true; + } + public static boolean isPositionWithinRangeOfSchematicRegions(BlockPos pos, int range) { SchematicPlacementManager manager = DataManager.getSchematicPlacementManager(); diff --git a/src/main/resources/assets/forgematica/lang/en_us.json b/src/main/resources/assets/forgematica/lang/en_us.json index a859c98..42ee7f5 100644 --- a/src/main/resources/assets/forgematica/lang/en_us.json +++ b/src/main/resources/assets/forgematica/lang/en_us.json @@ -1,6 +1,452 @@ { "fml.menu.mods.info.description.forgematica": "Litematica unofficial (Neo)Forge port. \nA modern schematic mod for (Neo)Forge.", + "litematica.config.generic.name.easyPlaceProtocolVersion": "easyPlaceProtocolVersion", + "litematica.config.generic.name.pasteNbtRestoreBehavior": "pasteNbtRestoreBehavior", + "litematica.config.generic.name.pasteReplaceBehavior": "pasteReplaceBehavior", + "litematica.config.generic.name.placementReplaceBehavior": "placementReplaceBehavior", + "litematica.config.generic.name.placementRestrictionWarn": "placementRestrictionWarn", + "litematica.config.generic.name.selectionCornersMode": "selectionCornersMode", + "litematica.config.generic.name.customSchematicBaseDirectoryEnabled": "customSchematicBaseDirectoryEnabled", + "litematica.config.generic.name.customSchematicBaseDirectory": "customSchematicBaseDirectory", + "litematica.config.generic.name.areaSelectionsPerWorld": "areaSelectionsPerWorld", + "litematica.config.generic.name.betterRenderOrder": "betterRenderOrder", + "litematica.config.generic.name.changeSelectedCornerOnMove": "changeSelectedCornerOnMove", + "litematica.config.generic.name.cloneAtOriginalPosition": "cloneAtOriginalPosition", + "litematica.config.generic.name.commandDisableFeedback": "commandDisableFeedback", + "litematica.config.generic.name.commandFillMaxVolume": "commandFillMaxVolume", + "litematica.config.generic.name.commandFillNoChunkClamp": "commandFillNoChunkClamp", + "litematica.config.generic.name.commandLimitPerTick": "commandLimitPerTick", + "litematica.config.generic.name.commandNameClone": "commandNameClone", + "litematica.config.generic.name.commandNameFill": "commandNameFill", + "litematica.config.generic.name.commandNameSetblock": "commandNameSetblock", + "litematica.config.generic.name.commandNameSummon": "commandNameSummon", + "litematica.config.generic.name.commandTaskInterval": "commandTaskInterval", + "litematica.config.generic.name.commandUseWorldEdit": "commandUseWorldEdit", + "litematica.config.generic.name.debugLogging": "debugLogging", + "litematica.config.generic.name.datafixerMode": "datafixerMode", + "litematica.config.generic.name.datafixerDefaultSchema": "datafixerDefaultSchema", + "litematica.config.generic.name.easyPlaceFirst": "easyPlaceFirst", + "litematica.config.generic.name.easyPlaceHoldEnabled": "easyPlaceHoldEnabled", + "litematica.config.generic.name.easyPlaceMode": "easyPlaceMode", + "litematica.config.generic.name.easyPlaceSinglePlayerHandling": "easyPlaceSinglePlayerHandling", + "litematica.config.generic.name.easyPlaceSwapInterval": "easyPlaceSwapInterval", + "litematica.config.generic.name.easyPlaceVanillaReach": "easyPlaceVanillaReach", + "litematica.config.generic.name.entityDataSync": "entityDataSync", + "litematica.config.generic.name.entityDataSyncBackup": "entityDataSyncBackup", + "litematica.config.generic.name.executeRequireHoldingTool": "executeRequireHoldingTool", + "litematica.config.generic.name.fixChestMirror": "fixChestMirror", + "litematica.config.generic.name.fixRailRotation": "fixRailRotation", + "litematica.config.generic.name.generateLowercaseNames": "generateLowercaseNames", + "litematica.config.generic.name.highlightBlockInInventory": "highlightBlockInInventory", + "litematica.config.generic.name.itemUsePacketCheckBypass": "itemUsePacketCheckBypass", + "litematica.config.generic.name.layerModeFollowsPlayer": "layerModeFollowsPlayer", + "litematica.config.generic.name.loadEntireSchematics": "loadEntireSchematics", + "litematica.config.generic.name.materialListIgnoreState": "materialListIgnoreState", + "litematica.config.generic.name.pasteAlwaysUseFill": "pasteAlwaysUseFill", + "litematica.config.generic.name.pasteIgnoreBlockEntitiesEntirely": "pasteIgnoreBlockEntitiesEntirely", + "litematica.config.generic.name.pasteIgnoreBlockEntitiesFromFill": "pasteIgnoreBlockEntitiesFromFill", + "litematica.config.generic.name.pasteIgnoreCommandLimitWithNbtRestore": "pasteIgnoreCommandLimitWithNbtRestore", + "litematica.config.generic.name.pasteIgnoreEntities": "pasteIgnoreEntities", + "litematica.config.generic.name.pasteIgnoreInventories": "pasteIgnoreInventories", + "litematica.config.generic.name.pasteToMcFunctionFiles": "pasteToMcFunctionFiles", + "litematica.config.generic.name.pasteUseFillCommand": "pasteUseFillCommand", + "litematica.config.generic.name.pasteUsingCommandsInSp": "pasteUsingCommandsInSp", + "litematica.config.generic.name.pasteUsingServux": "pasteUsingServux", + "litematica.config.generic.name.pickBlockAvoidDamageable": "pickBlockAvoidDamageable", + "litematica.config.generic.name.pickBlockAvoidTools": "pickBlockAvoidTools", + "litematica.config.generic.name.pickBlockEnabled": "pickBlockEnabled", + "litematica.config.generic.name.pickBlockShulkers": "pickBlockShulkers", + "litematica.config.generic.name.pickBlockableSlots": "pickBlockableSlots", + "litematica.config.generic.name.placementRestriction": "placementRestriction", + "litematica.config.generic.name.renderMaterialListInGuis": "renderMaterialListInGuis", + "litematica.config.generic.name.renderThreadNoTimeout": "renderThreadNoTimeout", + "litematica.config.generic.name.serverNbtRequestRate": "serverNbtRequestRate", + "litematica.config.generic.name.signTextPaste": "signTextPaste", + "litematica.config.generic.name.toolItem": "toolItem", + "litematica.config.generic.name.toolItemEnabled": "toolItemEnabled", + "litematica.config.generic.name.unhideSchematicVCS": "unhideSchematicVCS", + + "litematica.config.visuals.name.enableAreaSelectionBoxesRendering": "enableAreaSelectionBoxesRendering", + "litematica.config.visuals.name.enablePlacementBoxesRendering": "enablePlacementBoxesRendering", + "litematica.config.visuals.name.enableRendering": "enableRendering", + "litematica.config.visuals.name.enableSchematicBlocksRendering": "enableSchematicBlocksRendering", + "litematica.config.visuals.name.enableSchematicOverlay": "enableSchematicOverlay", + "litematica.config.visuals.name.enableSchematicRendering": "enableSchematicRendering", + "litematica.config.visuals.name.renderSchematicMaxThreads": "renderSchematicMaxThreads", + "litematica.config.visuals.name.ghostBlockAlpha": "ghostBlockAlpha", + "litematica.config.visuals.name.ignoreExistingFluids": "ignoreExistingFluids", + "litematica.config.visuals.name.overlayReducedInnerSides": "overlayReducedInnerSides", + "litematica.config.visuals.name.placementBoxSideAlpha": "placementBoxSideAlpha", + "litematica.config.visuals.name.renderAreaSelectionBoxSides": "renderAreaSelectionBoxSides", + "litematica.config.visuals.name.renderBlocksAsTranslucent": "renderBlocksAsTranslucent", + "litematica.config.visuals.name.renderCollidingSchematicBlocks": "renderCollidingSchematicBlocks", + "litematica.config.visuals.name.renderErrorMarkerConnections": "renderErrorMarkerConnections", + "litematica.config.visuals.name.renderErrorMarkerSides": "renderErrorMarkerSides", + "litematica.config.visuals.name.renderPlacementBoxSides": "renderPlacementBoxSides", + "litematica.config.visuals.name.renderPlacementEnclosingBox": "renderPlacementEnclosingBox", + "litematica.config.visuals.name.renderPlacementEnclosingBoxSides": "renderPlacementEnclosingBoxSides", + "litematica.config.visuals.name.renderTranslucentBlockInnerSides": "renderTranslucentBlockInnerSides", + "litematica.config.visuals.name.schematicOverlayEnableOutlines": "schematicOverlayEnableOutlines", + "litematica.config.visuals.name.schematicOverlayEnableResorting": "schematicOverlayEnableResorting", + "litematica.config.visuals.name.schematicOverlayEnableSides": "schematicOverlayEnableSides", + "litematica.config.visuals.name.schematicOverlayModelOutline": "schematicOverlayModelOutline", + "litematica.config.visuals.name.schematicOverlayModelSides": "schematicOverlayModelSides", + "litematica.config.visuals.name.schematicOverlayOutlineWidth": "schematicOverlayOutlineWidth", + "litematica.config.visuals.name.schematicOverlayOutlineWidthThrough": "schematicOverlayOutlineWidthThrough", + "litematica.config.visuals.name.schematicOverlayRenderThroughBlocks": "schematicOverlayRenderThroughBlocks", + "litematica.config.visuals.name.schematicOverlayTypeExtra": "schematicOverlayTypeExtra", + "litematica.config.visuals.name.schematicOverlayTypeMissing": "schematicOverlayTypeMissing", + "litematica.config.visuals.name.schematicOverlayTypeWrongBlock": "schematicOverlayTypeWrongBlock", + "litematica.config.visuals.name.schematicOverlayTypeWrongState": "schematicOverlayTypeWrongState", + "litematica.config.visuals.name.schematicVerifierUseBlockModels": "schematicVerifierUseBlockModels", + + "litematica.config.info_overlays.name.blockInfoLinesAlignment": "blockInfoLinesAlignment", + "litematica.config.info_overlays.name.blockInfoOverlayAlignment": "blockInfoOverlayAlignment", + "litematica.config.info_overlays.name.infoHudAlignment": "infoHudAlignment", + "litematica.config.info_overlays.name.toolHudAlignment": "toolHudAlignment", + "litematica.config.info_overlays.name.blockInfoLinesEnabled": "blockInfoLinesEnabled", + "litematica.config.info_overlays.name.blockInfoLinesFontScale": "blockInfoLinesFontScale", + "litematica.config.info_overlays.name.blockInfoLinesOffsetX": "blockInfoLinesOffsetX", + "litematica.config.info_overlays.name.blockInfoLinesOffsetY": "blockInfoLinesOffsetY", + "litematica.config.info_overlays.name.blockInfoOverlayOffsetY": "blockInfoOverlayOffsetY", + "litematica.config.info_overlays.name.blockInfoOverlayEnabled": "blockInfoOverlayEnabled", + "litematica.config.info_overlays.name.infoHudMaxLines": "infoHudMaxLines", + "litematica.config.info_overlays.name.infoHudOffsetX": "infoHudOffsetX", + "litematica.config.info_overlays.name.infoHudOffsetY": "infoHudOffsetY", + "litematica.config.info_overlays.name.infoHudScale": "infoHudScale", + "litematica.config.info_overlays.name.infoOverlaysTargetFluids": "infoOverlaysTargetFluids", + "litematica.config.info_overlays.name.materialListHudMaxLines": "materialListHudMaxLines", + "litematica.config.info_overlays.name.materialListHudScale": "materialListHudScale", + "litematica.config.info_overlays.name.statusInfoHud": "statusInfoHud", + "litematica.config.info_overlays.name.statusInfoHudAuto": "statusInfoHudAuto", + "litematica.config.info_overlays.name.toolHudOffsetX": "toolHudOffsetX", + "litematica.config.info_overlays.name.toolHudOffsetY": "toolHudOffsetY", + "litematica.config.info_overlays.name.toolHudScale": "toolHudScale", + "litematica.config.info_overlays.name.verifierErrorHilightAlpha": "verifierErrorHilightAlpha", + "litematica.config.info_overlays.name.verifierErrorHilightMaxPositions": "verifierErrorHilightMaxPositions", + "litematica.config.info_overlays.name.verifierOverlayEnabled": "verifierOverlayEnabled", + "litematica.config.info_overlays.name.warnDisabledRendering": "warnDisabledRendering", + + "litematica.config.colors.name.areaSelectionBoxSideColor": "areaSelectionBoxSideColor", + "litematica.config.colors.name.hightlightBlockInInventoryColor": "hightlightBlockInInventoryColor", + "litematica.config.colors.name.materialListHudItemCountsColor": "materialListHudItemCountsColor", + "litematica.config.colors.name.schematicRebuildBreakPlaceOverlayColor": "schematicRebuildBreakPlaceOverlayColor", + "litematica.config.colors.name.schematicRebuildBreakExceptPlaceOverlayColor": "schematicRebuildBreakExceptPlaceOverlayColor", + "litematica.config.colors.name.schematicRebuildReplaceOverlayColor": "schematicRebuildReplaceOverlayColor", + "litematica.config.colors.name.schematicOverlayColorExtra": "schematicOverlayColorExtra", + "litematica.config.colors.name.schematicOverlayColorMissing": "schematicOverlayColorMissing", + "litematica.config.colors.name.schematicOverlayColorWrongBlock": "schematicOverlayColorWrongBlock", + "litematica.config.colors.name.schematicOverlayColorWrongState": "schematicOverlayColorWrongState", + + "litematica.config.hotkeys.name.addSelectionBox": "addSelectionBox", + "litematica.config.hotkeys.name.cloneSelection": "cloneSelection", + "litematica.config.hotkeys.name.deleteSelectionBox": "deleteSelectionBox", + "litematica.config.hotkeys.name.easyPlaceUseKey": "easyPlaceUseKey", + "litematica.config.hotkeys.name.easyPlaceToggle": "easyPlaceToggle", + "litematica.config.hotkeys.name.executeOperation": "executeOperation", + "litematica.config.hotkeys.name.invertGhostBlockRenderState": "invertGhostBlockRenderState", + "litematica.config.hotkeys.name.invertOverlayRenderState": "invertOverlayRenderState", + "litematica.config.hotkeys.name.layerModeNext": "layerModeNext", + "litematica.config.hotkeys.name.layerModePrevious": "layerModePrevious", + "litematica.config.hotkeys.name.layerNext": "layerNext", + "litematica.config.hotkeys.name.layerPrevious": "layerPrevious", + "litematica.config.hotkeys.name.layerSetHere": "layerSetHere", + "litematica.config.hotkeys.name.nudgeSelectionNegative": "nudgeSelectionNegative", + "litematica.config.hotkeys.name.nudgeSelectionPositive": "nudgeSelectionPositive", + "litematica.config.hotkeys.name.moveEntireSelection": "moveEntireSelection", + "litematica.config.hotkeys.name.openGuiAreaSettings": "openGuiAreaSettings", + "litematica.config.hotkeys.name.openGuiLoadedSchematics": "openGuiLoadedSchematics", + "litematica.config.hotkeys.name.openGuiMainMenu": "openGuiMainMenu", + "litematica.config.hotkeys.name.openGuiMaterialList": "openGuiMaterialList", + "litematica.config.hotkeys.name.openGuiPlacementSettings": "openGuiPlacementSettings", + "litematica.config.hotkeys.name.openGuiSchematicPlacements": "openGuiSchematicPlacements", + "litematica.config.hotkeys.name.openGuiSchematicProjects": "openGuiSchematicProjects", + "litematica.config.hotkeys.name.openGuiSchematicVerifier": "openGuiSchematicVerifier", + "litematica.config.hotkeys.name.openGuiSelectionManager": "openGuiSelectionManager", + "litematica.config.hotkeys.name.openGuiSettings": "openGuiSettings", + "litematica.config.hotkeys.name.operationModeChangeModifier": "operationModeChangeModifier", + "litematica.config.hotkeys.name.pickBlockFirst": "pickBlockFirst", + "litematica.config.hotkeys.name.pickBlockLast": "pickBlockLast", + "litematica.config.hotkeys.name.pickBlockToggle": "pickBlockToggle", + "litematica.config.hotkeys.name.renderInfoOverlay": "renderInfoOverlay", + "litematica.config.hotkeys.name.renderOverlayThroughBlocks": "renderOverlayThroughBlocks", + "litematica.config.hotkeys.name.rerenderSchematic": "rerenderSchematic", + "litematica.config.hotkeys.name.saveAreaAsInMemorySchematic": "saveAreaAsInMemorySchematic", + "litematica.config.hotkeys.name.saveAreaAsSchematicToFile": "saveAreaAsSchematicToFile", + "litematica.config.hotkeys.name.schematicEditBreakAllExcept": "schematicEditBreakAllExcept", + "litematica.config.hotkeys.name.schematicEditBreakPlaceAll": "schematicEditBreakPlaceAll", + "litematica.config.hotkeys.name.schematicEditBreakPlaceDirection": "schematicEditBreakPlaceDirection", + "litematica.config.hotkeys.name.schematicEditReplaceAll": "schematicEditReplaceAll", + "litematica.config.hotkeys.name.schematicEditReplaceBlock": "schematicEditReplaceBlock", + "litematica.config.hotkeys.name.schematicEditReplaceDirection": "schematicEditReplaceDirection", + "litematica.config.hotkeys.name.schematicVersionCycleModifier": "schematicVersionCycleModifier", + "litematica.config.hotkeys.name.schematicVersionCycleNext": "schematicVersionCycleNext", + "litematica.config.hotkeys.name.schematicVersionCyclePrevious": "schematicVersionCyclePrevious", + "litematica.config.hotkeys.name.selectionGrabModifier": "selectionGrabModifier", + "litematica.config.hotkeys.name.selectionGrow": "selectionGrow", + "litematica.config.hotkeys.name.selectionGrowModifier": "selectionGrowModifier", + "litematica.config.hotkeys.name.selectionNudgeModifier": "selectionNudgeModifier", + "litematica.config.hotkeys.name.selectionModeCycle": "selectionModeCycle", + "litematica.config.hotkeys.name.selectionShrink": "selectionShrink", + "litematica.config.hotkeys.name.setAreaOrigin": "setAreaOrigin", + "litematica.config.hotkeys.name.setSelectionBoxPosition1": "setSelectionBoxPosition1", + "litematica.config.hotkeys.name.setSelectionBoxPosition2": "setSelectionBoxPosition2", + "litematica.config.hotkeys.name.toggleAllRendering": "toggleAllRendering", + "litematica.config.hotkeys.name.toggleAreaSelectionBoxesRendering": "toggleAreaSelectionBoxesRendering", + "litematica.config.hotkeys.name.toggleSchematicRendering": "toggleSchematicRendering", + "litematica.config.hotkeys.name.toggleInfoOverlayRendering": "toggleInfoOverlayRendering", + "litematica.config.hotkeys.name.toggleOverlayRendering": "toggleOverlayRendering", + "litematica.config.hotkeys.name.toggleOverlayOutlineRendering": "toggleOverlayOutlineRendering", + "litematica.config.hotkeys.name.toggleOverlaySideRendering": "toggleOverlaySideRendering", + "litematica.config.hotkeys.name.togglePlacementBoxesRendering": "togglePlacementBoxesRendering", + "litematica.config.hotkeys.name.togglePlacementRestriction": "togglePlacementRestriction", + "litematica.config.hotkeys.name.toggleSchematicBlockRendering": "toggleSchematicBlockRendering", + "litematica.config.hotkeys.name.toggleSignTextPaste": "toggleSignTextPaste", + "litematica.config.hotkeys.name.toggleTranslucentRendering": "toggleTranslucentRendering", + "litematica.config.hotkeys.name.toggleVerifierOverlayRendering": "toggleVerifierOverlayRendering", + "litematica.config.hotkeys.name.toolEnabledToggle": "toolEnabledToggle", + "litematica.config.hotkeys.name.toolPlaceCorner1": "toolPlaceCorner1", + "litematica.config.hotkeys.name.toolPlaceCorner2": "toolPlaceCorner2", + "litematica.config.hotkeys.name.toolSelectElements": "toolSelectElements", + "litematica.config.hotkeys.name.toolSelectModifierBlock1": "toolSelectModifierBlock1", + "litematica.config.hotkeys.name.toolSelectModifierBlock2": "toolSelectModifierBlock2", + "litematica.config.hotkeys.name.unloadCurrentSchematic": "unloadCurrentSchematic", + + "litematica.config.generic.comment.easyPlaceProtocolVersion": "The type of \"accurate placement protocol\" to use.\n- Auto: Uses v3 in single player, and by default Slabs-only in multiplayer,\n unless the server has Carpet mod that sends a 'carpet:hello'\n packet, in which case v2 is used on that server.\n- Version 3: Only supported by Litematica itself (in single player) or with Servux.\n- Version 2: Compatible with servers with the Carpet mod\n (either QuickCarpet by skyrising and DeadlyMC,\n or CarpetExtra in addition to FabricCarpet.\n And in both cases the 'accurateBlockPlacement' Carpet rule needs\n to be enabled on the server).\n- Slabs only: Only fixes top slabs. Compatible with Paper servers.\n- None: Does not modify coordinates.", + "litematica.config.generic.comment.pasteNbtRestoreBehavior": "Whether or not the NBT data of blocks is attempted to be restored,\nand which method is used for that.\n- Place & Data Modify will try to place the \"NBT-picked\" block\n near the player, and then use the data modify\n command to transfer the NBT data to the setblock'ed block\n- Place & Clone will try to place the \"NBT-picked\" block\n near the player, and then clone it to the final location.\n- Teleport & Place will try to teleport the player nearby and then\n directly place the NBT-picked item in the correct position.\nNote that the teleport & place method doesn't currently work correctly/at all.\nThe recommended method is §ePlace & Data Modify§r, however for that to work\nyou will probably need to lower the pasteCommandLimit to 1 per tick and increase\nthe pasteCommandInterval to 1-4 ticks or something.\nThus you should only use this for pasting important blocks that need the data,\nfor example by making a schematic of just the inventories,\nand then paste that with replace behavior set to None.", + "litematica.config.generic.comment.pasteReplaceBehavior": "The behavior of replacing existing blocks\nin the Paste schematic tool mode", + "litematica.config.generic.comment.placementReplaceBehavior": "The block replace behavior when adding blocks\nto the schematic world.\n\nThis allows using overlapped placements without the\nlater handled placement always overwriting earlier ones with air.\nOn the other hand some blocks like light blocks are considered\nto be air, so they would need the \"All\" replace behavior\nto get placed at all.", + "litematica.config.generic.comment.placementRestrictionWarn": "Selects which type of warning message to show (if any)\nwhen either the Easy Place mode or Placement Restriction prevent placing a block", + "litematica.config.generic.comment.selectionCornersMode": "The Area Selection corners mode to use (Corners, or Expand)", + "litematica.config.generic.comment.customSchematicBaseDirectoryEnabled": "If enabled, then the directory set in 'customSchematicBaseDirectory'\nwill be used as the root/base schematic directory,\ninstead of the normal '.minecraft/schematics/' directory", + "litematica.config.generic.comment.customSchematicBaseDirectory": "The root/base schematic directory to use,\nif 'customSchematicBaseDirectoryEnabled' is enabled", + "litematica.config.generic.comment.areaSelectionsPerWorld": "Use per-world or server root directories for the area selections\n§6NOTE: Don't switch this OFF while you are live streaming,\n§6as then the Area Selection browser will show the server IP\n§6in the navigation widget and also in the current selection name/path\n§6until you change the current directory and selection again", + "litematica.config.generic.comment.betterRenderOrder": "If enabled, then the schematic rendering is done\nby injecting the different render call into the vanilla\nrendering code. This should result in better translucent block\nrendering/ordering and schematic blocks not getting rendered\nthrough the client world blocks/terrain.\nIf the rendering doesn't work (for example with Optifine),\ntry disabling this option.", + "litematica.config.generic.comment.changeSelectedCornerOnMove": "If true, then the selected corner of an area selection\nis always set to the last moved corner,\nwhen using the set corner hotkeys", + "litematica.config.generic.comment.cloneAtOriginalPosition": "If enabled, then using the Clone Selection hotkey will create\nthe placement at the original area selection position,\ninstead of at the player's current position", + "litematica.config.generic.comment.commandDisableFeedback": "If enabled, then command feedback is automatically disabled\nand then re-enabled for multiplayer Paste, Fill and Delete operations\n(which are using /setblock and /fill commands) by disabling and then\nre-enabling the sendCommandFeedback game rule when the task is finished", + "litematica.config.generic.comment.commandFillMaxVolume": "The maximum size/volume of each individual box\nthat can be filled via the command-based Fill/Delete\noperations. Bigger areas/volumes will get split to multiple commands.\nAll areas are also split to per-chunk boxes at first anyway.", + "litematica.config.generic.comment.commandFillNoChunkClamp": "Disables dividing the fill volumes (in the Fill, Replace and Delete modes)\nto per-chunk boxes", + "litematica.config.generic.comment.commandLimitPerTick": "Maximum number of commands sent per game tick,\nwhen using the Paste, Fill and Delete features on a server,\nwhere they will use setblock and fill commands.\nNote that he Paste feature can overshoot this by a couple of commands\nwhen using the NBT restore functionality, which needs two additional commands for each block.", + "litematica.config.generic.comment.commandNameClone": "The clone command name to use when using the\ncommand-based creative mode functionality on servers.\nThis is currently only used by the Paste function if the NBT restore\nbehavior is set to 'Place & Clone'.", + "litematica.config.generic.comment.commandNameFill": "The fill command name to use when using the\ncommand-based creative mode functionality on servers", + "litematica.config.generic.comment.commandNameSetblock": "The setblock command name to use when using the\ncommand-based creative mode functionality on servers,\nnamely the Paste Schematic in World function", + "litematica.config.generic.comment.commandNameSummon": "The summon command name to use when using the\ncommand-based creative mode functionality on servers,\nnamely the Paste Schematic in World function", + "litematica.config.generic.comment.commandTaskInterval": "The interval in game ticks the Paste, Fill and Delete tasks\nare executed at. The commandLimitPerTick config sets the maximum\nnumber of commands to send per execution, and this config\nsets the interval in game ticks before the next execution.", + "litematica.config.generic.comment.commandUseWorldEdit": "If enabled, instead of using the configured setblock and fill commands,\nthe World Edit //pos1, //pos2 and //set commands are used.\nNote that using World Edit commands is around 3x slower\nthan using vanilla commands due to the command limit per tick,\nand WE requiring multiple commands per block or area (//pos1 //pos2 //set).\n§6WARNING: The paste replace behavior option WILL NOT WORK if using\n§6the World Edit commands and fill volumes instead of individual setblock commands!\nThus it's recommended to use the vanilla commands, if you have the permission to run them.\nOne other thing that might make you prefer WE commands in some cases\nis that they can prevent block updates, if the server doesn't have\nthe Carpet mod and thus the '/carpet fillUpdates false' rule available.", + "litematica.config.generic.comment.debugLogging": "Enables some debug log messages in the game console,\nfor debugging certain issues or crashes.", + "litematica.config.generic.comment.datafixerMode": "The configurable data fixer level to apply to loaded schematics.\nThis option can improve performance of loading\nschematics by bypassing the Vanilla Data Fixer,\nbut this can also cause severe data loss if it is disabled.", + "litematica.config.generic.comment.datafixerDefaultSchema": "Default Schema Value for the Vanilla Data Fixer\n\nUsed to adjust the lowest possible value, and the value used\nwhen the loaded schematic does not contain this information.\n\n§6WARNING: This setting is meant to be used at the direction\n§6from a Litematica developer such as masa themselves.\n§6When in doubt, keep the default for Minecraft 1.12.", + "litematica.config.generic.comment.easyPlaceFirst": "This causes the Easy Place mode to place the first/closest block\nyou are looking at first, instead of the furthest/bottom-most block.\nSetting this to false allows you to place multiple layers \"at once\",\nsince the furthest blocks would be placed before the closer ones block the line of sight.", + "litematica.config.generic.comment.easyPlaceHoldEnabled": "When enabled, then you can hold down the use key\nand look at different schematic blocks to place them,\nwithout having to click on every block individually.", + "litematica.config.generic.comment.easyPlaceMode": "When enabled, then simply trying to use an item/place a block\non schematic blocks will place that block in that position", + "litematica.config.generic.comment.easyPlaceSinglePlayerHandling": "If enabled, then Litematica handles the so called\n\"Carpet mod Accurate Block Placement Protocol\" itself in single player.\nThis is recommended to be kept enabled if you\nare going to use Easy Place in single player.", + "litematica.config.generic.comment.easyPlaceSwapInterval": "The interval in milliseconds the Easy Place mode waits\nafter swapping inventory slots and placing a block.\nUseful to avoid placing wrong blocks when having high ping.", + "litematica.config.generic.comment.easyPlaceVanillaReach": "If enabled, reduces reach distance from 6 to 4.5\nso servers don't reject placement of far blocks.", + "litematica.config.generic.comment.entityDataSync": "Use the Entity Data Sync protocol from Servux\nto obtain Entity Data from the server", + "litematica.config.generic.comment.entityDataSyncBackup": "Use the Vanilla NBT Query method when Servux\nis not available. This method requires Operator Privileges.", + "litematica.config.generic.comment.executeRequireHoldingTool": "Require holding an enabled tool item\nfor the executeOperation hotkey to work", + "litematica.config.generic.comment.fixChestMirror": "Enable a fix to the broken chest mirror code in vanilla", + "litematica.config.generic.comment.fixRailRotation": "If true, then a fix is applied for the vanilla bug in rails,\nwhere the 180 degree rotations of straight north-south and\neast-west rails rotate 90 degrees counterclockwise instead >_>", + "litematica.config.generic.comment.generateLowercaseNames": "If enabled, then by default the suggested schematic names\nwill be lowercase and using underscores instead of spaces", + "litematica.config.generic.comment.highlightBlockInInventory": "When enabled, highlights the item (including Shulker Boxes containing it)\nof the looked at block in the schematic", + "litematica.config.generic.comment.itemUsePacketCheckBypass": "Bypass the new distance/coordinate check that was added in 1.18.2.\n\nThat check breaks the \"accurate placement protocol\" and causes\nany blocks placed with a rotation (or other property) request to just become ghost blocks.\n\nThere is basically no need to ever disable this.\nThe check didn't even exist ever before 1.18.2.", + "litematica.config.generic.comment.layerModeFollowsPlayer": "If true, then the render layer follows the player.\nNote: This currently collapses Layer Range type ranges unfortunately", + "litematica.config.generic.comment.loadEntireSchematics": "If true, then the entire schematic is always loaded at once.\nIf false, then only the part that is within the client's view distance is loaded.", + "litematica.config.generic.comment.materialListIgnoreState": "When enabled, the exact block state is ignored, and only the block type needs to match", + "litematica.config.generic.comment.pasteAlwaysUseFill": "This forces using the fill command (instead of setblock) even for single blocks", + "litematica.config.generic.comment.pasteIgnoreBlockEntitiesEntirely": "If enabled, then block entities ae not pasted at all\nvia the command-based pasting in multiplayer.\nThis allows you to easier paste in two passes if you\nwant to use the NBT-restore option for inventories etc. in the second pass,\nwhich usually requires a lot slower pasting speed/command rate.", + "litematica.config.generic.comment.pasteIgnoreBlockEntitiesFromFill": "If enabled, then all block entities are ignored from the fill\ncommands when pasting. This allows them to get pasted individually,\nwhich is required if the NBT restore option is being used.", + "litematica.config.generic.comment.pasteIgnoreCommandLimitWithNbtRestore": "If enabled, then the command limit is ignored when pasting\nblocks with a block entity with the NBT restore option enabled.\nThis seems to somehow fix an issue where the NBT restore\nwould otherwise fail for many blocks with a low command rate.", + "litematica.config.generic.comment.pasteIgnoreEntities": "If enabled, then the Paste feature will not paste any entities", + "litematica.config.generic.comment.pasteIgnoreInventories": "Don't paste inventory contents when pasting a schematic", + "litematica.config.generic.comment.pasteToMcFunctionFiles": "If enabled, then instead of actually pasting schematics to the world,\nthey are written as setblock commands into text files.", + "litematica.config.generic.comment.pasteUseFillCommand": "If enabled, then instead of only using individual /setblock commands,\nthe command-based Paste operation (which is used on servers)\nwill also try to use /fill commands for any continuous areas of the same block.\nThis has no effect in single player, since the mod sets the blocks directly\nin the integrated server's world in and doesn't use commands at all.", + "litematica.config.generic.comment.pasteUsingCommandsInSp": "This is a temporary hack workaround to use the command-based pasting\nalso in single player, which allows using the render layer limited\npasting in single player, which currently doesn't work with\nthe direct world access pasting that single player normally uses.\n\nNote that this will have all the same NBT data restoration\nlimitations that multiplayer pasting has normally.", + "litematica.config.generic.comment.pasteUsingServux": "Use Servux to paste a schematic directly to the server.\nThis method is much faster than the traditional\ncommand-based method, and it supports restoring\nEntity NBT Data.", + "litematica.config.generic.comment.pickBlockAvoidDamageable": "Avoids replacing any damageable items in the hotbar", + "litematica.config.generic.comment.pickBlockAvoidTools": "Avoids replacing any tool items in the hotbar.\n\nThis means any items that extend the vanilla ToolItem class.", + "litematica.config.generic.comment.pickBlockEnabled": "Enables the schematic world pick block hotkeys.\nThere is also a hotkey for toggling this option to toggle those hotkeys... o.o", + "litematica.config.generic.comment.pickBlockShulkers": "If enabled, then if the required item for the pick bloc\nis not found directly in the player's inventory, but there\nis a Shulker box that contains it, the Shulker Box\nwill be switched to the player's hand instead", + "litematica.config.generic.comment.pickBlockableSlots": "The hotbar slots that are allowed to be\nused for the schematic pick block", + "litematica.config.generic.comment.placementRestriction": "When enabled, the use key can only be used\nwhen holding the correct item for the targeted position,\nand the targeted position must have a missing block in the schematic", + "litematica.config.generic.comment.renderMaterialListInGuis": "Whether or not the material list should\nbe rendered inside GUIs", + "litematica.config.generic.comment.renderThreadNoTimeout": "Removes the timeout from the rendering worker threads.\nIf you get very stuttery rendering when moving around\nor dealing with large schematics, try disabling this. It will however make\nthe schematic rendering a lot slower in some cases.", + "litematica.config.generic.comment.serverNbtRequestRate": "Limit request rate for server entity data syncer", + "litematica.config.generic.comment.signTextPaste": "Automatically set the text in the sign GUIs from the schematic", + "litematica.config.generic.comment.toolItem": "The item to use as the \"tool\" for selections etc.", + "litematica.config.generic.comment.toolItemEnabled": "If true, then the \"tool\" item can be used to control selections etc.", + "litematica.config.generic.comment.unhideSchematicVCS": "Un-hides the Schematic VCS (Version Control System) menu button,\nand enables the hotkey and the VCS functionality in general.\n(This was called Schematic Projects before.)\n\nIn general you §6should not§r be using this feature,\nunless you really know how it works and what it does.\nIt somewhat changes how the area selections, placements and pasting works,\nin particular that there is also an area delete operation when pasting.\n\nBasically this feature is intended for §6iterative, in-place§r design work,\nand it allows you to easier create multiple versions/snapshots\nof the same build, and also to switch between the versions by deleting what is\nin the world first, and then pasting the next version in its place.", + + "litematica.config.visuals.comment.enableAreaSelectionBoxesRendering": "Enable Area Selection boxes rendering", + "litematica.config.visuals.comment.enablePlacementBoxesRendering": "Enable Schematic Placement boxes rendering", + "litematica.config.visuals.comment.enableRendering": "Main rendering toggle option. Enables/disables ALL mod rendering.", + "litematica.config.visuals.comment.enableSchematicBlocksRendering": "Enables schematic block rendering.\nDisabling this allows you to only see the color overlay", + "litematica.config.visuals.comment.enableSchematicOverlay": "The main toggle option for the schematic\nblock overlay rendering", + "litematica.config.visuals.comment.enableSchematicRendering": "Enable rendering the schematic and overlay", + "litematica.config.visuals.comment.renderSchematicMaxThreads": "Maximum Schematic World Rendering Thread Size\nThis will directly effect overall multi-threaded performance\n\n§6USE WITH CAUTION!! This will only take effect\n§6after you leave the game, and rejoin.", + "litematica.config.visuals.comment.ghostBlockAlpha": "The alpha value of the ghost blocks,\nwhen rendering them as translucent.\n§6Note: §7You also need to enable the translucent rendering separately,\nusing the 'renderBlocksAsTranslucent' option!", + "litematica.config.visuals.comment.ignoreExistingFluids": "If enabled, then any fluid blocks are ignored as \"extra blocks\"\nand as \"wrong blocks\", ie. where the schematic has air or other blocks.\nBasically this makes building stuff under water a whole lot less annoying.\nNote: You will most likely also want to enable the 'renderCollidingSchematicBlocks'\noption at the same time, to allow the blocks to get rendered inside fluids.", + "litematica.config.visuals.comment.overlayReducedInnerSides": "If enabled, then the adjacent/touching inner sides\nfor the block overlays are removed/not rendered", + "litematica.config.visuals.comment.placementBoxSideAlpha": "The alpha value of the sub-region boxes' side", + "litematica.config.visuals.comment.renderAreaSelectionBoxSides": "If enabled, then the area selection boxes will\nhave their side quads rendered", + "litematica.config.visuals.comment.renderBlocksAsTranslucent": "If enabled, then the schematics are rendered\nusing translucent \"ghost blocks\"", + "litematica.config.visuals.comment.renderCollidingSchematicBlocks": "If enabled, then blocks in the schematics are rendered\nalso when there is already a (wrong) block in the client world.\nProbably mostly useful when trying to build\nsomething where there are snow layers or water in the way.", + "litematica.config.visuals.comment.renderErrorMarkerConnections": "Render connecting lines between subsequent verifier highlight box corners.\nThis was a rendering bug that some people experienced, but at least some players\nliked it and requested for it to stay, so this options \"restores\" it", + "litematica.config.visuals.comment.renderErrorMarkerSides": "If enabled, then the error markers in the Schematic Verifier\nwill have (translucent) sides rendered instead of just the outline", + "litematica.config.visuals.comment.renderPlacementBoxSides": "If enabled, then the placed schematic sub-region boxes\nwill have their side quads rendered", + "litematica.config.visuals.comment.renderPlacementEnclosingBox": "If enabled, then an enclosing box is rendered around\nall the sub-regions in a schematic (placement)", + "litematica.config.visuals.comment.renderPlacementEnclosingBoxSides": "If enabled, then the enclosing box around\na schematic placement will have its side quads rendered", + "litematica.config.visuals.comment.renderTranslucentBlockInnerSides": "If enabled, then the model sides are also rendered\nfor inner sides in the translucent mode", + "litematica.config.visuals.comment.schematicOverlayEnableOutlines": "Enables rendering a wire frame outline for\nthe schematic block overlay", + "litematica.config.visuals.comment.schematicOverlayEnableResorting": "Enables Translucent Sorting for\nthe schematic block overlay", + "litematica.config.visuals.comment.schematicOverlayEnableSides": "Enables rendering translucent boxes/sides for\nthe schematic block overlay", + "litematica.config.visuals.comment.schematicOverlayModelOutline": "If enabled, then the schematic overlay will use the\nblock model quads/vertices instead of the\ntraditional full block overlay", + "litematica.config.visuals.comment.schematicOverlayModelSides": "If enabled, then the schematic overlay will use the\nblock model quads/vertices instead of the\ntraditional full block overlay", + "litematica.config.visuals.comment.schematicOverlayOutlineWidth": "The line width of the block (model) outlines", + "litematica.config.visuals.comment.schematicOverlayOutlineWidthThrough": "The line width of the block (model) outlines,\nwhen the overlay is rendered through blocks", + "litematica.config.visuals.comment.schematicOverlayRenderThroughBlocks": "If enabled, then the schematic overlay will be rendered\nthrough blocks. This is probably only useful once you are\nfinished building and want to see any errors easier", + "litematica.config.visuals.comment.schematicOverlayTypeExtra": "Enables the schematic overlay for extra blocks", + "litematica.config.visuals.comment.schematicOverlayTypeMissing": "Enables the schematic overlay for missing blocks", + "litematica.config.visuals.comment.schematicOverlayTypeWrongBlock": "Enables the schematic overlay for wrong blocks", + "litematica.config.visuals.comment.schematicOverlayTypeWrongState": "Enables the schematic overlay for wrong states", + "litematica.config.visuals.comment.schematicVerifierUseBlockModels": "Forces using blocks models for everything in the Schematic Verifier\nresult list. Normally item models are used for anything\nthat has an item, and block models are only used for blocks\nthat don't have an item, plus for Flower Pots to see the contained item.", + + "litematica.config.info_overlays.comment.blockInfoLinesAlignment": "The alignment of the block info lines overlay", + "litematica.config.info_overlays.comment.blockInfoOverlayAlignment": "The alignment of the Block Info Overlay", + "litematica.config.info_overlays.comment.infoHudAlignment": "The alignment of the \"Info HUD\",\nused for the Material List, Schematic Verifier mismatch positions etc.", + "litematica.config.info_overlays.comment.toolHudAlignment": "The alignment of the \"tool HUD\", when holding the configured \"tool\"", + "litematica.config.info_overlays.comment.blockInfoLinesEnabled": "If enabled, then MiniHUD-style block info overlay\nis rendered for the looked-at block", + "litematica.config.info_overlays.comment.blockInfoLinesFontScale": "The font scale for the block info lines", + "litematica.config.info_overlays.comment.blockInfoLinesOffsetX": "The x offset of the block info lines from the selected edge", + "litematica.config.info_overlays.comment.blockInfoLinesOffsetY": "The y offset of the block info lines from the selected edge", + "litematica.config.info_overlays.comment.blockInfoOverlayOffsetY": "The y offset of the block info overlay from the selected edge", + "litematica.config.info_overlays.comment.blockInfoOverlayEnabled": "Enable Block Info Overlay rendering to show info\nabout the looked-at block or verifier error marker,\nwhile holding the 'renderInfoOverlay' key", + "litematica.config.info_overlays.comment.infoHudMaxLines": "The maximum number of info lines to show on the HUD at once", + "litematica.config.info_overlays.comment.infoHudOffsetX": "The X offset of the Info HUD from the screen edge", + "litematica.config.info_overlays.comment.infoHudOffsetY": "The Y offset of the Info HUD from the screen edge", + "litematica.config.info_overlays.comment.infoHudScale": "Scale factor for the generic Info HUD text", + "litematica.config.info_overlays.comment.infoOverlaysTargetFluids": "When enabled, the Block Info Overlay and Block Info Lines\nwill be able to ray trace to fluid blocks instead of going through them", + "litematica.config.info_overlays.comment.materialListHudMaxLines": "The maximum number of items to show on\nthe Material List Info HUD at once", + "litematica.config.info_overlays.comment.materialListHudScale": "Scale factor for the Material List Info HUD", + "litematica.config.info_overlays.comment.statusInfoHud": "Enable a status info HUD renderer,\nwhich renders a few bits of status info, such as\nthe current layer mode and renderers enabled state", + "litematica.config.info_overlays.comment.statusInfoHudAuto": "Allow automatically momentarily enabling the status info HUD \"when needed\",\nfor example when creating a placement and having rendering disabled", + "litematica.config.info_overlays.comment.toolHudOffsetX": "The X offset of the Info HUD from the screen edge", + "litematica.config.info_overlays.comment.toolHudOffsetY": "The Y offset of the Info HUD from the screen edge", + "litematica.config.info_overlays.comment.toolHudScale": "Scale factor for the Tool HUD text", + "litematica.config.info_overlays.comment.verifierErrorHilightAlpha": "The alpha value of the error marker box sides", + "litematica.config.info_overlays.comment.verifierErrorHilightMaxPositions": "The maximum number of mismatched positions to render\nat once in the Schematic Verifier overlay.", + "litematica.config.info_overlays.comment.verifierOverlayEnabled": "Enable Schematic Verifier marker overlay rendering", + "litematica.config.info_overlays.comment.warnDisabledRendering": "Should the warning message about being in a layer mode\nor having some of the rendering options disabled\nbe shown when loading a new schematic\nor creating a new placement", + + "litematica.config.colors.comment.areaSelectionBoxSideColor": "The color of the area selection boxes, when they are unselected", + "litematica.config.colors.comment.hightlightBlockInInventoryColor": "The highlight color for the item of the looked at block", + "litematica.config.colors.comment.materialListHudItemCountsColor": "The color of the item count text in the Material List info HUD", + "litematica.config.colors.comment.schematicRebuildBreakPlaceOverlayColor": "The color of Schematic Rebuild mode's break or place blocks selector overlay", + "litematica.config.colors.comment.schematicRebuildBreakExceptPlaceOverlayColor": "The color of Schematic Rebuild mode's break all blocks except targeted selector overlay", + "litematica.config.colors.comment.schematicRebuildReplaceOverlayColor": "The color of Schematic Rebuild mode's replace selector overlay", + "litematica.config.colors.comment.schematicOverlayColorExtra": "The color of the blocks overlay for extra blocks", + "litematica.config.colors.comment.schematicOverlayColorMissing": "The color of the blocks overlay for missing blocks", + "litematica.config.colors.comment.schematicOverlayColorWrongBlock": "The color of the blocks overlay for wrong blocks", + "litematica.config.colors.comment.schematicOverlayColorWrongState": "The color of the blocks overlay for wrong block states", + + "litematica.config.hotkeys.comment.addSelectionBox": "Add a new selection box (position 1) here", + "litematica.config.hotkeys.comment.cloneSelection": "Quickly clone the current area selection.\nThis basically just creates an in-memory-only schematic,\nand then creates a placement of that schematic and selects it,\nand also switches the tool mode to the Paste mode.", + "litematica.config.hotkeys.comment.deleteSelectionBox": "Delete the currently selected box", + "litematica.config.hotkeys.comment.easyPlaceUseKey": "When the easyPlaceMode is enabled, this key is used for placing the blocks", + "litematica.config.hotkeys.comment.easyPlaceToggle": "Allows quickly toggling on/off the Easy Place mode", + "litematica.config.hotkeys.comment.executeOperation": "Execute the currently selected tool operation with the\ncurrent selection or placement in the Fill, Replace,\nPaste Schematic etc. modes", + "litematica.config.hotkeys.comment.invertGhostBlockRenderState": "Inverts the schematic/ghost block rendering status\nwhile this keybind is held down", + "litematica.config.hotkeys.comment.invertOverlayRenderState": "Inverts the Overlay rendering status while this keybind is held down", + "litematica.config.hotkeys.comment.layerModeNext": "Cycle the rendering mode (all, layers) forward", + "litematica.config.hotkeys.comment.layerModePrevious": "Cycle the rendering mode (all, layers) backwards", + "litematica.config.hotkeys.comment.layerNext": "Move the rendered layer selection up", + "litematica.config.hotkeys.comment.layerPrevious": "Move the rendered layer selection down", + "litematica.config.hotkeys.comment.layerSetHere": "Set the Render Layer to the player's current position", + "litematica.config.hotkeys.comment.nudgeSelectionNegative": "Nudge the current selection in the \"negative\" direction\nThis is basically the same as mouse wheel down\nwith the Nudge modifier pressed", + "litematica.config.hotkeys.comment.nudgeSelectionPositive": "Nudge the current selection in the \"positive\" direction\nThis is basically the same as mouse wheel up\nwith the Nudge modifier pressed", + "litematica.config.hotkeys.comment.moveEntireSelection": "Move the entire current selection here", + "litematica.config.hotkeys.comment.openGuiAreaSettings": "Open the Area Settings GUI for the currently selected area", + "litematica.config.hotkeys.comment.openGuiLoadedSchematics": "Open the Loaded Schematic GUI", + "litematica.config.hotkeys.comment.openGuiMainMenu": "Open the Litematica main menu", + "litematica.config.hotkeys.comment.openGuiMaterialList": "Open the Material List GUI for the currently\nselected schematic placement", + "litematica.config.hotkeys.comment.openGuiPlacementSettings": "Open the Placement Settings GUI for the currently\nselected placement or sub-region", + "litematica.config.hotkeys.comment.openGuiSchematicPlacements": "Open the Schematic Placements GUI", + "litematica.config.hotkeys.comment.openGuiSchematicProjects": "Open the Schematic Projects GUI", + "litematica.config.hotkeys.comment.openGuiSchematicVerifier": "Open the Schematic Verifier GUI for the currently\nselected schematic placement", + "litematica.config.hotkeys.comment.openGuiSelectionManager": "Open the Area Selection manager GUI", + "litematica.config.hotkeys.comment.openGuiSettings": "Open the Config GUI", + "litematica.config.hotkeys.comment.operationModeChangeModifier": "The modifier key to quickly change the operation mode.\nHold this and scroll while holding the \"tool item\" to quickly cycle the mode.", + "litematica.config.hotkeys.comment.pickBlockFirst": "A key to pick block the first\nschematic block ray traced to", + "litematica.config.hotkeys.comment.pickBlockLast": "A key to pick block the last schematic block\nray traced to, before the first (possible) client world\nblock ray traced to. Basically this would get\nyou the block you could place against an existing block.", + "litematica.config.hotkeys.comment.pickBlockToggle": "A hotkey to toggle the pick block toggle option in the\nGeneric configs. This is provided as a quick way to enable\nor disable the pick block keys, if they interfere with something.", + "litematica.config.hotkeys.comment.renderInfoOverlay": "The key that enables rendering the block info overlay.\nUse NONE for not requiring a key to be pressed.\nDisable the similarly named option in the Visuals\nconfigs to disable the overlay completely.", + "litematica.config.hotkeys.comment.renderOverlayThroughBlocks": "A hotkey to allow the overlays to render through blocks.\nThis is just a quicker way to temporarily enable\nthe same thing that the 'schematicOverlayRenderThroughBlocks' option in Visuals does.", + "litematica.config.hotkeys.comment.rerenderSchematic": "Hotkey to refresh/redraw only the schematic, instead of\nhaving to refresh the vanilla terrain too with F3 + A", + "litematica.config.hotkeys.comment.saveAreaAsInMemorySchematic": "Save the current Area Selection as an in-memory Schematic", + "litematica.config.hotkeys.comment.saveAreaAsSchematicToFile": "Save the current Area Selection as a Schematic to a file", + "litematica.config.hotkeys.comment.schematicEditBreakAllExcept": "Modifier key to activate the \"break everything except\"\nmode/function in the Schematic Edit tool mode.\nBasically when you hold this key and punch a schematic block,\nall other blocks except this block will be removed from the schematic.", + "litematica.config.hotkeys.comment.schematicEditBreakPlaceAll": "Modifier key to activate the \"break all identical blocks\"\nfunction in the Schematic Edit tool mode", + "litematica.config.hotkeys.comment.schematicEditBreakPlaceDirection": "Modifier key to activate the directional/continuous\nbreak or place function in the Schematic Edit tool mode", + "litematica.config.hotkeys.comment.schematicEditReplaceAll": "Modifier key to activate the \"replace all identical\"\nreplace mode/function in the Schematic Edit tool mode", + "litematica.config.hotkeys.comment.schematicEditReplaceBlock": "Modifier key to activate the \"replace block type\"\nreplace mode/function in the Schematic Edit tool mode", + "litematica.config.hotkeys.comment.schematicEditReplaceDirection": "Modifier key to activate the directional/continuous\nreplace mode/function in the Schematic Edit tool mode", + "litematica.config.hotkeys.comment.schematicVersionCycleModifier": "The modifier key to hold to be able to use the mouse wheel\nto cycle through the schematic versions in the Version Control tool mode", + "litematica.config.hotkeys.comment.schematicVersionCycleNext": "A hotkey to cycle to the next schematic version in the Version Control tool mode", + "litematica.config.hotkeys.comment.schematicVersionCyclePrevious": "A hotkey to cycle to the next schematic version in the Version Control tool mode", + "litematica.config.hotkeys.comment.selectionGrabModifier": "The modifier key to hold to \"grab\" a selection\nbox or corner for cursor moving.", + "litematica.config.hotkeys.comment.selectionGrow": "The action hotkey to auto-grow the selection box around\nany adjacent/diagonally connected blocks", + "litematica.config.hotkeys.comment.selectionGrowModifier": "The modifier key to hold to grow or shrink\na selection box while scrolling", + "litematica.config.hotkeys.comment.selectionNudgeModifier": "The modifier key to hold while scrolling\nto nudge the selected area or corner", + "litematica.config.hotkeys.comment.selectionModeCycle": "Change the mode between Corners and Cuboid\nin the Area Selection mode", + "litematica.config.hotkeys.comment.selectionShrink": "The action hotkey to shrink the selection box so that there\nisn't any empty space (empty layers) on any side", + "litematica.config.hotkeys.comment.setAreaOrigin": "Set/move the origin point of the current\narea selection to the player's position", + "litematica.config.hotkeys.comment.setSelectionBoxPosition1": "Set the first position of the currently selected\nbox to the player's position", + "litematica.config.hotkeys.comment.setSelectionBoxPosition2": "Set the second position of the currently selected\nbox to the player's position", + "litematica.config.hotkeys.comment.toggleAllRendering": "Toggle all rendering on/off", + "litematica.config.hotkeys.comment.toggleAreaSelectionBoxesRendering": "Toggle Area Selection boxes rendering on/off", + "litematica.config.hotkeys.comment.toggleSchematicRendering": "Toggle schematic rendering (blocks & overlay) on/off", + "litematica.config.hotkeys.comment.toggleInfoOverlayRendering": "Toggle the info overlay rendering (for hovered block info)", + "litematica.config.hotkeys.comment.toggleOverlayRendering": "Toggle the block overlay rendering on/off", + "litematica.config.hotkeys.comment.toggleOverlayOutlineRendering": "Toggle the block overlay outline rendering on/off", + "litematica.config.hotkeys.comment.toggleOverlaySideRendering": "Toggle the block overlay side rendering on/off", + "litematica.config.hotkeys.comment.togglePlacementBoxesRendering": "Toggle Schematic Placement boxes rendering on/off", + "litematica.config.hotkeys.comment.togglePlacementRestriction": "A hotkey to toggle the placement restriction mode", + "litematica.config.hotkeys.comment.toggleSchematicBlockRendering": "Toggle schematic block rendering on/off", + "litematica.config.hotkeys.comment.toggleSignTextPaste": "Toggle the signTextPaste config value (in Generic category)", + "litematica.config.hotkeys.comment.toggleTranslucentRendering": "Toggle translucent vs. opaque ghost block rendering", + "litematica.config.hotkeys.comment.toggleVerifierOverlayRendering": "Toggle the Schematic Verifier overlay rendering", + "litematica.config.hotkeys.comment.toolEnabledToggle": "The keybind to toggle the \"tool\" item functionality on/off", + "litematica.config.hotkeys.comment.toolPlaceCorner1": "The button to use while holding the \"tool\" item\nto place the primary/first corner", + "litematica.config.hotkeys.comment.toolPlaceCorner2": "The button to use while holding the \"tool\" item\nto place the second corner", + "litematica.config.hotkeys.comment.toolSelectElements": "The button to use to select corners or boxes\nwhile holding the \"tool\" item", + "litematica.config.hotkeys.comment.toolSelectModifierBlock1": "The modifier key to hold while using the 'toolSelectElements'\nhotkey, to select the primary block type to use in some of the tool modes", + "litematica.config.hotkeys.comment.toolSelectModifierBlock2": "The modifier key to hold while using the 'toolSelectElements'\nhotkey, to select the secondary block type to use in some of the tool modes", + "litematica.config.hotkeys.comment.unloadCurrentSchematic": "Unloads the schematic of the currently selected placement,and thus also removes all placements created from it", + + "litematica.config.generic.prettyName.pickBlockEnabled": "Pick Block Hotkeys", + "litematica.config.generic.prettyName.easyPlaceMode": "Easy Place Mode", + "litematica.config.generic.prettyName.placementRestriction": "Placement Restriction", + "litematica.config.generic.prettyName.signTextPaste": "Sign Text Paste", + "litematica.config.generic.prettyName.toolItemEnabled": "Tool Item Enabled", + + "litematica.config.visuals.prettyName.enableAreaSelectionBoxesRendering": "Area Selection Boxes Rendering", + "litematica.config.visuals.prettyName.enablePlacementBoxesRendering": "Schematic Placement Boxes Rendering", + "litematica.config.visuals.prettyName.enableRendering": "All Rendering", + "litematica.config.visuals.prettyName.enableSchematicBlocksRendering": "Schematic Blocks Rendering", + "litematica.config.visuals.prettyName.enableSchematicOverlay": "Schematic Overlay Rendering", + "litematica.config.visuals.prettyName.enableSchematicRendering": "Schematic Rendering", + "litematica.config.visuals.prettyName.renderBlocksAsTranslucent": "Translucent Schematic Block Rendering", + "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines": "Schematic Overlay Outlines", + "litematica.config.visuals.prettyName.schematicOverlayEnableResorting": "Schematic Overlay Translucent Sorting", + "litematica.config.visuals.prettyName.schematicOverlayEnableSides": "Schematic Overlay Sides", + + "litematica.config.info_overlays.prettyName.blockInfoOverlayEnabled": "Block Info Overlay Rendering", + "litematica.config.info_overlays.prettyName.verifierOverlayEnabled": "Verifier Overlay Rendering", + + "litematica.config.hotkeys.prettyName.toggleAllRendering": "All Rendering", + "litematica.error.area_selection.copy_failed": "Failed to copy the selection", "litematica.error.area_selection.create_failed": "Failed to create a new selection by the name '%s', file already exists", "litematica.error.area_selection.failed_to_load": "Failed to load the Area Selection", @@ -21,6 +467,7 @@ "litematica.error.area_editor.rename_sub_region.exists": "Failed to rename the sub-region:\nA sub-region already exists by the name '%s'", "litematica.error.area_editor.switch_mode.no_selection": "Can't switch to Selection Mode: Normal, because there is currently no area selected.\nSelect an area or create a new selection in the Area Selection browser", + "litematica.error.schematic_conversion.litematic_to_litematica.failed_to_read_litematic": "Failed to load the Litematica Schematic", "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_create_schematic": "Failed to create the Litematica schematic", "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_read_schematic": "Failed to load the Schematic", "litematica.error.schematic_conversion.structure_to_litematica_failed": "Failed to convert the Structure to a Litematica Schematic", @@ -233,6 +680,16 @@ "litematica.gui.label.easy_place_protocol.v2": "Version 2", "litematica.gui.label.easy_place_protocol.v3": "Version 3", + "litematica.gui.label.data_fixer_mode.always": "Always", + "litematica.gui.label.data_fixer_mode.below_1205": "Below 1.20.5 Only", + "litematica.gui.label.data_fixer_mode.below_120X": "Below 1.20.x Only", + "litematica.gui.label.data_fixer_mode.below_119X": "Below 1.19.x Only", + "litematica.gui.label.data_fixer_mode.below_117X": "Below 1.17.x Only", + "litematica.gui.label.data_fixer_mode.below_116X": "Below 1.16.x Only", + "litematica.gui.label.data_fixer_mode.below_113X": "Below 1.13.x Only", + "litematica.gui.label.data_fixer_mode.below_112X": "Below 1.12.x Only", + "litematica.gui.label.data_fixer_mode.never": "Never", + "litematica.gui.label.loaded_schematic.modified_on": "§6Modified on %s§r", "litematica.gui.label.material_list.abbr.shulker_box": "SB", @@ -439,7 +896,7 @@ "litematica.message.error.schematic_save_failed": "Failed to save schematic to file '%s'", "litematica.message.error.schematic_save_interrupted": "Schematic saving interrupted or stopped", "litematica.message.error.schematic_save_no_area_selected": "§cSchematic saving failed - no area selected§r", - "litematica.message.warn.pickblock.no_suitable_slot_found": "No suitable hotbar slot found for pick block!\\nCheck the config Generic -> §epickBlockableSlots§r.\\nAlso depending on the §epickBlockAvoid*§6 configs, the pick block feature may refuse to replace any tools or other damageable items in those slots.", + "litematica.message.warn.pickblock.no_suitable_slot_found": "No suitable hotbar slot found for pick block!\nCheck the config Generic -> §epickBlockableSlots§r.\nAlso depending on the §epickBlockAvoid*§6 configs, the pick block feature may refuse to replace any tools or other damageable items in those slots.", "litematica.message.warn.pickblock.no_valid_slots_configured": "No hotbar slots set in the Generic -> §epickBlockableSlots§6 config!", "litematica.message.added_selection_box": "Added a new selection box at %s", @@ -451,6 +908,7 @@ "litematica.message.easy_place_fail": "§6Action prevented by the Easy Place mode", "litematica.message.grabbed_element_for_moving": "Grabbed an element to move", "litematica.message.in_memory_schematic_created": "Created an in-memory schematic as '%s'", + "litematica.message.litematic_saved_as": "Successfully Upgraded the Litematica Schematic's Data Version\nSchematic saved as '%s'", "litematica.message.material_list.material_cache_cleared": "Material Cache cleared", "litematica.message.material_list_written_to_file": "Material list written to file '%s'", "litematica.message.moved_area_origin": "Moved the area origin point from %s => %s", @@ -459,6 +917,8 @@ "litematica.message.placement.cant_modify_is_locked": "§cThe placement is locked and can't be modified§r", "litematica.message.placement.moved_placement_origin": "Moved placement origin from %s => %s", "litematica.message.placement.moved_subregion_to": "Moved sub-region to %s", + "litematica.message.placement.rotation_set_to": "Placement rotated to %s", + "litematica.message.placement.mirror_set_to": "Placement mirrored to %s", "litematica.message.placement_restriction_fail": "§6Action prevented by Placement Restriction mode", "litematica.message.removed_area_origin": "Removed the explicit/manual area origin point", "litematica.message.removed_selection_box": "Removed selection box %s", diff --git a/src/main/resources/assets/forgematica/lang/fr_fr.json b/src/main/resources/assets/forgematica/lang/fr_fr.json deleted file mode 100644 index 39ef974..0000000 --- a/src/main/resources/assets/forgematica/lang/fr_fr.json +++ /dev/null @@ -1,512 +0,0 @@ -{ - "litematica.error.area_selection.copy_failed": "Échec de la copie de la sélection", - "litematica.error.area_selection.create_failed": "Échec de la création d'une nouvelle sélection avec le nom '%s', le fichier existe déjà", - "litematica.error.area_selection.failed_to_load": "Échec du chargement de la sélection de zone", - "litematica.error.area_selection.grow.no_sub_region_selected": "Aucune sous-région sélectionnée !", - "litematica.error.area_selection.no_placement_selected": "Aucun placement de schéma sélectionné !", - "litematica.error.area_selection.rename.already_exists": "Erreur : Une zone existe déjà avec le nom de fichier '%s'", - "litematica.error.area_selection.rename.invalid_safe_file_name": "Nom de fichier sécurisé généré invalide '%s'", - - "litematica.error.duplicate_schematic_placement": "Erreur : Tentative d'ajout d'un placement qui existe déjà", - "litematica.error.generic.creative_mode_only": "Cette action est uniquement disponible en mode Créatif", - "litematica.error.generic.failed_to_delete_file": "Échec de la suppression du fichier '%s'", - "litematica.error.generic.failed_to_sort_list_of_ignored_states": "Échec du tri de la liste des états ignorés", - "litematica.error.generic.schematic_world_not_loaded": "Le monde schématique n'a pas été chargé", - - "litematica.error.area_editor.create_sub_region.exists": "Une sous-région portant le nom '%s' existe déjà", - "litematica.error.area_editor.no_selection": "Aucune sélection de zone active", - "litematica.error.area_editor.open_gui.no_selection": "Actuellement en mode de sélection : Normal, mais aucune zone n'est actuellement sélectionnée", - "litematica.error.area_editor.rename_sub_region.exists": "Échec du renommage de la sous-région:\nUne sous-région existe déjà avec le nom '%s'", - "litematica.error.area_editor.switch_mode.no_selection": "Impossible de passer en mode de sélection : Normal, car aucune zone n'est actuellement sélectionnée.\nSélectionnez une zone ou créez une nouvelle sélection dans le navigateur de sélection de zone", - - "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_create_schematic": "Échec de la création du schéma Litematica", - "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_read_schematic": "Échec du chargement du schéma", - "litematica.error.schematic_conversion.structure_to_litematica_failed": "Échec de la conversion de la structure en schéma Litematica", - - "litematica.error.schematic.create.no_selections": "Aucune région de sélection valide !", - - "litematica.error.schematic_load.cant_read_file": "Impossible de lire le fichier schématique '%s' (n'existe pas ou problème de permission)", - "litematica.error.schematic_load.no_schematic_selected": "Aucun fichier schématique sélectionné !", - "litematica.error.schematic_load.no_schematic_version_information": "Le schéma n'a pas d'informations de version et ne peut pas être chargé en toute sécurité !", - "litematica.error.schematic_load.unsupported_schematic_version": "Version schématique non prise en charge ou future '%d'", - "litematica.error.schematic_load.unsupported_type": "Type de fichier inconnu ou non pris en charge pour '%s'", - - "litematica.error.schematic_manager.schematic_export.unsupported_type": "Seuls les schémas Litematica peuvent être exportés dans d'autres formats !", - "litematica.error.schematic_manager.schematic_import.unsupported_type": "Le type de schéma sélectionné n'est pas pris en charge pour l'importation !", - - "litematica.error.schematic_placements.remove_fail_locked": "Le placement est verrouillé !\n- Maintenez la touche Maj enfoncée pour le supprimer de force", - - "litematica.error.schematic_save.directory_doesnt_exist": "Aucun répertoire tel que '%s'", - "litematica.error.schematic_save.file_already_exists": "Le fichier '%s' existe déjà", - "litematica.error.schematic_save.invalid_directory": "Répertoire invalide '%s'", - "litematica.error.schematic_save.invalid_schematic_name": "Nom de schéma invalide '%s'", - "litematica.error.schematic_save.schematic_creation_failed": "Échec de la création du schéma !", - - "litematica.error.schematic_read_from_file_failed.cant_read": "Échec de la lecture du schéma depuis le fichier '%s'", - "litematica.error.schematic_read_from_file_failed.exception": "Exception lors de la tentative de lecture du schéma depuis le fichier '%s'", - "litematica.error.schematic_read_from_file_failed.no_file": "Échec de la lecture du schéma depuis le fichier : aucun fichier disponible (schéma en mémoire ?)", - - "litematica.error.schematic_projects.empty_selection": "Sélection de zone vide (0 sous-régions)", - "litematica.error.schematic_projects.failed_to_load_project": "Échec du chargement du projet", - "litematica.error.schematic_projects.failed_to_load_schematic": "Échec du chargement du schéma pour la version actuelle", - "litematica.error.schematic_projects.failed_to_rename_project_file_exception": "Échec du renommage du fichier de projet en '%s' (exception)", - "litematica.error.schematic_projects.failed_to_rename_project_file_exists": "Impossible de renommer le projet en '%s', le fichier existe déjà", - "litematica.error.schematic_projects.invalid_project_directory": "Répertoire de projet invalide ou inexistant", - "litematica.error.schematic_projects.no_project_open": "Aucun projet ouvert", - "litematica.error.schematic_projects.in_projects_mode_but_no_project_open": "Actuellement en mode Schematic VCS, mais aucun projet n'est actuellement ouvert", - "litematica.error.schematic_projects.null_player": "Le joueur était nul", - "litematica.error.schematic_projects.project_already_exists": "Le projet '%s' existe déjà", - "litematica.error.schematic_projects.save_already_in_progress": "Sauvegarde déjà en cours", - - "litematica.error.schematic_write_to_file_failed.directory_creation_failed": "Échec de la création du répertoire du schéma '%s'", - "litematica.error.schematic_write_to_file_failed.exception": "Échec de l'écriture du schéma dans le fichier '%s' (exception)", - "litematica.error.schematic_write_to_file_failed.exists": "Échec de l'écriture du schéma dans le fichier '%s', le fichier existe déjà", - "litematica.error.structure_write_to_file_failed.exception": "Échec de l'écriture de la structure dans le fichier '%s' (exception)", - "litematica.error.structure_write_to_file_failed.exists": "Échec de l'écriture de la structure dans le fichier '%s', le fichier existe déjà", - - "litematica.hotkeys.category.generic_hotkeys": "Raccourcis génériques", - - "litematica.info.schematic_load.schematic_loaded": "Schéma '%s' chargé avec succès en mémoire", - "litematica.info.schematic_manager.preview.right_click_to_cancel": "- Clic droit sur le bouton pour annuler une opération d'aperçu en attente\n- Ctrl + Alt + Maj + clic pour définir la vignette à partir d'une image PNG existante\n appelée 'thumb.png' dans le même répertoire que le fichier schématique.", - "litematica.info.schematic_manager.preview.set_preview_by_taking_a_screenshot": "Utilisez la touche normale de capture d'écran pour définir l'aperçu.\nOu faites un clic droit sur le bouton Définir l'aperçu pour annuler la définition de l'aperçu.", - "litematica.info.schematic_manager.preview.success": "Image d'aperçu définie avec succès", - - "litematica.gui.button.area_editor.analyze_area": "Analyser zone", - "litematica.gui.button.area_editor.change_corner_mode": "Mode Coin : %s", - "litematica.gui.button.area_editor.change_selection_mode": "Mode de sélection : %s", - "litematica.gui.button.area_editor.create_schematic": "Enregistrer le schéma", - "litematica.gui.button.area_editor.create_sub_region": "Nouvelle sous-région", - "litematica.gui.button.area_editor.origin_enabled": "Origine manuelle : %s", - "litematica.gui.button.area_editor.set_box_name": "Définir", - "litematica.gui.button.area_editor.set_selection_name": "Définir", - - "litematica.gui.button.area_selection_mode": "Mode de sélection de zone : %s", - "litematica.gui.button.area_selections.create_directory": "Créer un répertoire", - "litematica.gui.button.area_selections.create_new_selection": "Nouvelle sélection", - "litematica.gui.button.area_selections.create_selection_from_placement": "À partir du Placement", - "litematica.gui.button.area_selections.unselect": "Désélectionner", - - "litematica.gui.button.change_menu.area_editor": "Éditeur de zone", - "litematica.gui.button.change_menu.configuration_menu": "Menu de configuration", - "litematica.gui.button.change_menu.load_schematics_to_memory": "Charger les schémas", - "litematica.gui.button.change_menu.schematic_manager": "Gestionnaire de schémas", - "litematica.gui.button.change_menu.schematic_projects_manager": "Schematic VCS", - "litematica.gui.button.change_menu.show_area_selections": "Navigateur de sélection de zone", - "litematica.gui.button.change_menu.show_loaded_schematics": "Schémas chargés", - "litematica.gui.button.change_menu.show_schematic_placements": "Placements de schéma", - "litematica.gui.button.change_menu.task_manager": "Gestionnaire des tâches", - "litematica.gui.button.change_menu.to_main_menu": "Menu Litematica", - - "litematica.gui.button.config_gui.colors": "Couleurs", - "litematica.gui.button.config_gui.generic": "Générique", - "litematica.gui.button.config_gui.hotkeys": "Raccourcis", - "litematica.gui.button.config_gui.info_overlays": "Surimpressions d'informations", - "litematica.gui.button.config_gui.render_layers": "Couches de rendu", - "litematica.gui.button.config_gui.visuals": "Visuels", - - "litematica.gui.button.hover.area_editor.shift_for_in_memory": "Maintenez la touche Shift pour créer un schéma uniquement en mémoire", - "litematica.gui.button.hover.area_selections.unselect": "Désélectionne la sélection de zone actuelle", - "litematica.gui.button.hover.material_list.clear_cache": "Efface le cache des matériaux\nNormalement, cela ne devrait pas être nécessaire\nCela peut être utilisé au lieu de supprimer le fichier 'material_cache.nbt'\nsi le cache contient des données incorrectes, comme des objets\nstockés pour des blocs qui ne devraient pas en avoir, comme les têtes de piston", - "litematica.gui.button.hover.material_list.write_hold_shift_for_csv": "Maintenez la touche Shift enfoncée pour écrire dans un fichier CSV,\nau lieu du fichier texte ASCII standard", - "litematica.gui.button.hover.material_list_shift_to_select_sub_regions": "Maintenez la touche Shift enfoncée pour sélectionner les sous-régions utilisées pour la liste des matériaux", - "litematica.gui.button.hover.plus_minus_tip": "Clic gauche pour augmenter\nClic droit pour diminuer\nMaintenez Maj et/ou Alt pour augmenter la taille du pas", - "litematica.gui.button.hover.plus_minus_tip_ctrl_alt_shift": "Clic gauche pour augmenter\nClic droit pour diminuer\nMaintenez Maj/Alt/Ctrl pour augmenter la taille du pas (multiplicatif)", - "litematica.gui.button.hover.schematic_list.reload_schematic": "Recharge le schéma depuis le fichier.\nCela peut être utile en cas d'erreur\nen mode Édition de schéma.", - "litematica.gui.button.hover.schematic_projects.area_browser_disabled_currently_in_projects_mode": "Un projet Schematic VCS est actuellement ouvert.\nLe mode Schematic VCS remplace la fonctionnalité normale de sélection de zone", - "litematica.gui.button.hover.schematic_projects.delete_area": "§6Supprimer la dernière zone placée ou enregistrée§r", - "litematica.gui.button.hover.schematic_projects.menu_warning": "(Cela s'appelait Schematic Projects auparavant.)\nEn général, vous §6ne devriez pas§r utiliser cette fonctionnalité,\nà moins de savoir vraiment comment elle fonctionne et ce qu'elle fait.\nElle modifie quelque peu le fonctionnement des sélections de zone, des placements et du collage,\nnotamment qu'il y a aussi une opération de suppression de zone lors du collage.\n\nEssentiellement, cette fonctionnalité est destinée à un travail de conception §6itératif, sur place§r,\net elle vous permet de créer plus facilement plusieurs versions/snapshots\nde la même construction, ainsi que de passer entre les versions en supprimant ce qui est\ndans le monde d'abord, puis en collant la version suivante à sa place.", - "litematica.gui.button.hover.schematic_projects.move_origin_to_player": "Déplace l'origine du projet à la position actuelle du joueur\nCela déplacera également la sélection de zone et le placement", - "litematica.gui.button.hover.schematic_projects.place_to_world_warning": "§6Avertissement : Cela supprimera/écrasera les blocs actuels\n§6dans le monde dans la zone qui a été précédemment\n§6placée à partir d'une version, ou enregistrée en tant que version\n§6(en gros, c'est la dernière fois que j'ai vu \"sélection de zone efficace\")", - "litematica.gui.button.hover.schematic_projects.save_new_version": "Enregistre une nouvelle version du schéma/dans le projet actuel", - - "litematica.gui.button.material_list": "Liste des matériaux", - "litematica.gui.button.material_list.clear_cache": "Effacer le cache", - "litematica.gui.button.material_list.clear_ignored": "Effacer les ignorés", - "litematica.gui.button.material_list.hide_available": "Masquer disponible : %s", - "litematica.gui.button.material_list.ignore": "Ignorer", - "litematica.gui.button.material_list.list_type": "Afficher : %s", - "litematica.gui.button.material_list.refresh_list": "Actualiser", - "litematica.gui.button.material_list.toggle_info_hud": "HUD d'informations : %s", - "litematica.gui.button.material_list.write_to_file": "Écrire dans un fichier", - - "litematica.gui.button.placement_sub.placement_configuration": "Configuration du placement", - "litematica.gui.button.placement_sub.reset_sub_region_placement": "Réinitialiser la sous-région", - "litematica.gui.button.placement_sub.slice_type": "Tranche : %s", - - "litematica.gui.button.schematic_manager.export_as": "Exporter en :", - - "litematica.gui.button.schematic_placement.abbr.rendering": "R", - - "litematica.gui.button.schematic_placement.ignore_entities": "Ignorer les entités : %s", - "litematica.gui.button.schematic_placement.region_enabled": "Région : %s", - "litematica.gui.button.schematic_placement.reset_sub_region_placements": "Réinitialiser tous les placements de sous-régions", - "litematica.gui.button.schematic_placement.toggle_all_off": "Tout §cDÉSACTIVɧr", - "litematica.gui.button.schematic_placement.toggle_all_on": "Tout §aACTIVɧr", - - "litematica.gui.button.schematic_placement.hover.enclosing_box": "Rendu de la boîte englobante : %s", - "litematica.gui.button.schematic_placement.hover.lock": "Verrouiller un placement empêche de le déplacer ou de\nle modifier d'une autre manière (accidentellement)", - "litematica.gui.button.schematic_placement.hover.rendering": "Rendu : %s\nNotez que cela fonctionne un peu étrangement\net n'empêche pas le rendu des entités.\nEn général, vous devriez simplement désactiver\nle placement entièrement", - - "litematica.gui.button.schematic_placements.configure": "Configurer", - "litematica.gui.button.schematic_placements.disable": "Désactiver", - "litematica.gui.button.schematic_placements.locked": "Verrouillé : %s", - "litematica.gui.button.schematic_placements.placement_enabled": "Placement : %s", - "litematica.gui.button.schematic_placements.remove": "Supprimer", - "litematica.gui.button.schematic_placements.rendering_enabled": "Rendu : %s", - "litematica.gui.button.schematic_placements.select": "Sélectionner", - - "litematica.gui.button.schematic_projects.close_project": "Fermer le projet actuel", - "litematica.gui.button.schematic_projects.create_project": "Créer un projet", - "litematica.gui.button.schematic_projects.delete_area": "Supprimer la zone", - "litematica.gui.button.schematic_projects.load_project": "Charger le projet", - "litematica.gui.button.schematic_projects.move_origin_to_player": "Déplacer vers toi", - "litematica.gui.button.schematic_projects.open_area_editor": "Éditeur de zone", - "litematica.gui.button.schematic_projects.open_manager_gui": "Ouvrir le gestionnaire", - "litematica.gui.button.schematic_projects.open_project_browser": "Navigateur de projet VCS", - "litematica.gui.button.schematic_projects.place_to_world": "Placer dans le monde", - "litematica.gui.button.schematic_projects.save_version": "Enregistrer la version", - - "litematica.gui.button.schematic_verifier.ignore": "Ignorer", - "litematica.gui.button.schematic_verifier.range_type": "Plage : %s", - "litematica.gui.button.schematic_verifier.reset_ignored": "Réinitialiser les ignorés", - "litematica.gui.button.schematic_verifier.reset_verifier": "Réinitialiser les données", - "litematica.gui.button.schematic_verifier.resume": "Reprendre la vérification", - "litematica.gui.button.schematic_verifier.start": "Démarrer la vérification", - "litematica.gui.button.schematic_verifier.stop": "Arrêter la vérification", - "litematica.gui.button.schematic_verifier.toggle_info_hud": "HUD d'informations : %s", - - "litematica.gui.button.cancel": "Annuler", - "litematica.gui.button.configure": "Configurer", - "litematica.gui.button.copy": "Copier", - "litematica.gui.button.create_directory": "Créer un nouveau répertoire", - "litematica.gui.button.create_placement": "Créer un placement", - "litematica.gui.button.delete": "Supprimer", - "litematica.gui.button.disable": "Désactiver", - "litematica.gui.button.enable": "Activer", - "litematica.gui.button.import": "Importer", - "litematica.gui.button.load_schematic_to_memory": "Charger le schéma", - "litematica.gui.button.mirror_value": "Miroir : %s", - "litematica.gui.button.move_to_player": "Déplacer vers toi", - "litematica.gui.button.ok": "Ok", - "litematica.gui.button.reload": "Recharger", - "litematica.gui.button.remove": "Supprimer", - "litematica.gui.button.remove_placement": "Supprimer le placement", - "litematica.gui.button.rename": "Renommer", - "litematica.gui.button.rotation_value": "Rotation : %s", - "litematica.gui.button.save_new_schematic_version": "Enregistrer la version", - "litematica.gui.button.save_schematic": "Enregistrer le schéma", - "litematica.gui.button.save_to_file": "Enregistrer dans un fichier", - "litematica.gui.button.schematic_verifier": "Vérificateur de schéma", - "litematica.gui.button.set_preview": "Définir l'aperçu", - "litematica.gui.button.tool_mode": "Mode d'outil : %s", - "litematica.gui.button.unload": "Décharger", - "litematica.gui.button.unlocked": "Déverrouillé", - - "litematica.gui.label.area_editor.box_name": "Nom de la boîte de la sous-région", - "litematica.gui.label.area_editor.selection_name": "Nom de la sélection", - "litematica.gui.label.area_editor.corner_1": "Coin 1", - "litematica.gui.label.area_editor.corner_2": "Coin 2", - "litematica.gui.label.area_editor.origin": "Origine", - "litematica.gui.label.area_editor.dimensions": "Dimensions", - "litematica.gui.label.area_editor.pos1": "Coin 1", - "litematica.gui.label.area_editor.pos2": "Coin 2", - "litematica.gui.label.area_editor.sub_regions": "Sous-régions (%s)", - - "litematica.gui.label.area_selection_manager.current_selection": "Zone sélectionnée : %s", - - "litematica.gui.label.area_selection_box_count": "Boîtes : %d", - "litematica.gui.label.area_selection_origin": "Origine : %s", - "litematica.gui.label.area_selection.mode.normal": "Normal", - "litematica.gui.label.area_selection.mode.simple": "Simple", - - "litematica.gui.label.block_info.state_client": "État du bloc dans le monde client", - "litematica.gui.label.block_info.state_schematic": "État du bloc dans le monde schématique", - - "litematica.gui.label.block_info_list_type.all": "Tout", - "litematica.gui.label.block_info_list_type.render_layers": "Couches de rendu", - - "litematica.gui.label.easy_place_protocol.auto": "Auto", - "litematica.gui.label.easy_place_protocol.none": "Aucun", - "litematica.gui.label.easy_place_protocol.slabs_only": "Seulement des dalles", - "litematica.gui.label.easy_place_protocol.v2": "Version 2", - "litematica.gui.label.easy_place_protocol.v3": "Version 3", - - "litematica.gui.label.loaded_schematic.modified_on": "§6Modifié le %s§r", - - "litematica.gui.label.material_list.abbr.shulker_box": "SB", - "litematica.gui.label.material_list.title.available": "Disponible", - "litematica.gui.label.material_list.title.item": "Objet", - "litematica.gui.label.material_list.title.missing": "Manquant", - "litematica.gui.label.material_list.title.total": "Total", - - "litematica.gui.label.material_list.multiplier": "Multiplicateur :", - "litematica.gui.label.material_list.name": "Nom", - "litematica.gui.label.material_list.progress": "Progression : %s", - "litematica.gui.label.material_list.progress.done": "Fait %s", - "litematica.gui.label.material_list.progress.mismatch": "Incompatibilité %s", - "litematica.gui.label.material_list.progress.missing": "Manquant %s", - "litematica.gui.label.material_list.total": "Total : %s objets", - - "litematica.gui.label.origin.auto": "Auto", - "litematica.gui.label.origin.manual": "Manuel", - - "litematica.gui.label.paste_nbt_behavior.none": "Aucun", - "litematica.gui.label.paste_nbt_behavior.place_data_modify": "Placer & Modifier les données", - "litematica.gui.label.paste_nbt_behavior.place_clone": "Placer & Cloner", - - "litematica.gui.label.placement_sub.region_name": "Nom de la région : %s", - "litematica.gui.label.placement_sub.region_position": "Position de la région", - "litematica.gui.label.placement_sub.region_size": "Taille de la région : %s", - - "litematica.gui.label.placement_settings.placement_origin": "Origine du placement", - - "litematica.gui.label.render_layers.hotkey": "Raccourci", - "litematica.gui.label.render_layers.hover.hotkey": "Les raccourcis suivant/précédent de la couche affecteront cette limite.\nSi les deux sont désélectionnés, alors les raccourcis affecteront\nla limite la plus proche du joueur.", - - "litematica.gui.label.replace_behavior.all": "Tout", - "litematica.gui.label.replace_behavior.none": "Aucun", - "litematica.gui.label.replace_behavior.with_non_air": "Avec des blocs non-air", - - "litematica.gui.label.schematic_info.schematic_author": "Schéma créé par : §f%s§r", - "litematica.gui.label.schematic_info.description": "Description :", - "litematica.gui.label.schematic_info.enclosing_size": "Taille de l'enclos :", - "litematica.gui.label.schematic_info.enclosing_size_value": "Taille de l'enclos : §f%s§r", - "litematica.gui.label.schematic_info.name": "Nom :", - "litematica.gui.label.schematic_info.region_count": "Régions : §f%d§r", - "litematica.gui.label.schematic_info.time_created": "Créé : §f%s§r", - "litematica.gui.label.schematic_info.time_modified": "Modifié : §f%s§r", - "litematica.gui.label.schematic_info.total_blocks": "Bloc total : §f%d§r", - "litematica.gui.label.schematic_info.total_blocks_and_volume": "Blocs/Volume : §f%d§r/§f%d§r", - "litematica.gui.label.schematic_info.total_volume": "Volume total : Blocs §f%d§r", - - "litematica.gui.label.schematic_load.checkbox.create_placement": "Créer un placement", - "litematica.gui.label.schematic_load.hoverinfo.create_placement": "Créez immédiatement un nouveau placement\net sélectionnez ce placement", - - "litematica.gui.label.schematic_placement.enclosing_size": "Taille de l'enclos : %s", - "litematica.gui.label.schematic_placement.hoverinfo.hold_shift_to_create_as_disabled": "Maintenez la touche Maj enfoncée pour désactiver le placement lors de sa création", - "litematica.gui.label.schematic_placement.in_memory": "EN MÉMOIRE UNIQUEMENT", - "litematica.gui.label.schematic_placement.origin": "Origine : %s", - "litematica.gui.label.schematic_placement.rename_placement": "Renommer le placement :", - "litematica.gui.label.schematic_placement.schematic_file": "Fichier : %s", - "litematica.gui.label.schematic_placement.schematic_name": "Schéma : %s", - "litematica.gui.label.schematic_placement.sub_region_count": "Sous-régions : %s", - "litematica.gui.label.schematic_placement.sub_regions": "Sous-régions (%s) :", - - "litematica.gui.label.schematic_projects.currently_open_project": "Projet actuellement ouvert : %s", - "litematica.gui.label.schematic_projects.origin": "Origine :", - "litematica.gui.label.schematic_projects.project": "Projet :", - "litematica.gui.label.schematic_projects.version": "Version : %s (sur %s)", - "litematica.gui.label.schematic_projects.version_entry": "Ver. %d - %s", - "litematica.gui.label.schematic_projects.version_name": "Nom de la version :", - - "litematica.gui.label.schematic_save.checkbox.ignore_entities": "Ignorer les entités", - "litematica.gui.label.schematic_save.hoverinfo.hold_shift_to_overwrite": "Maintenez la touche Maj enfoncée pour écraser un fichier existant", - - "litematica.gui.label.schematic_verifier.count": "Compter", - "litematica.gui.label.schematic_verifier.expected": "Attendu", - "litematica.gui.label.schematic_verifier.found": "Trouvé", - "litematica.gui.label.schematic_verifier_display_type.all": "Tous (non ignorés)", - "litematica.gui.label.schematic_verifier_display_type.correct_state": "État correct", - "litematica.gui.label.schematic_verifier_display_type.extra": "Blocs supplémentaires", - "litematica.gui.label.schematic_verifier_display_type.missing": "Blocs manquants", - "litematica.gui.label.schematic_verifier_display_type.wrong_blocks": "Mauvais blocs", - "litematica.gui.label.schematic_verifier_display_type.wrong_state": "États incorrects", - "litematica.gui.label.schematic_verifier.status.done_errors": "Mauvais : §cBloc : %s§r, §6État : %s§r, §bManquants : %s§r, §dSupplémentaires : %s§r", - "litematica.gui.label.schematic_verifier.status.done_correct_total": "§aCorrects : %s§r, Total : %s", - "litematica.gui.label.schematic_verifier.status.verifying": "Chunks non vus : %s / %s", - "litematica.gui.label.schematic_verifier.verifier": "Vérificateur de schéma", - - "litematica.gui.label.task.title.remaining_chunks": "%s, chunks restants (%s)", - "litematica.gui.label.task_name.area_analyzer": "Analyseur de zone", - "litematica.gui.label.task_name.delete": "Supprimer la tâche", - "litematica.gui.label.task_name.fill": "Tâche de remplissage", - "litematica.gui.label.task_name.material_list": "Liste des matériaux", - "litematica.gui.label.task_name.paste": "Coller le schéma", - "litematica.gui.label.task_name.save_schematic": "Enregistrer le schéma", - "litematica.gui.label.task_name.verifier": "Vérificateur", - - "litematica.gui.message.confirm_file_deletion": "Voulez-vous supprimer le fichier '%s' ?", - "litematica.gui.message.schematic_projects.confirm_delete_area": "Voulez-vous supprimer la zone \"dernièrement affectée\" ?\nCela supprimera les blocs et entités présents dans la zone que le gestionnaire de projet a récemment placée dans le monde, ou sauvegardée en tant que version. (Essentiellement la \"zone affectée vue en dernier\", de sorte que si vous deviez changer de version, cela ne laisserait pas de blocs derrière de la version précédente.)", - "litematica.gui.message.schematic_projects.confirm_place_to_world": "Voulez-vous placer cette version dans le monde ?\nCela supprimera les blocs présents dans la zone que le gestionnaire de projet a récemment placée dans le monde, ou sauvegardée en tant que version. (Essentiellement la \"zone affectée vue en dernier\", de sorte que si vous deviez changer de version, cela ne laisserait pas de blocs derrière de la version précédente.)", - - "litematica.gui.title.area_editor_normal": "Éditeur de zone (Mode normal/Multi-boîtes)", - "litematica.gui.title.area_editor_normal_schematic_projects": "Éditeur de zone (Zone de schéma §6§lVCS§r)", - "litematica.gui.title.area_editor_simple": "Éditeur de zone (Mode simple)", - "litematica.gui.title.area_editor_sub_region": "Éditeur de zone (Sous-région)", - "litematica.gui.title.area_editor.sub_region_name": "Nom de la sous-région", - "litematica.gui.title.area_selection_manager": "Gestionnaire de sélection de zone", - "litematica.gui.title.configure_schematic_placement": "Configurer le placement du schéma", - "litematica.gui.title.configure_schematic_sub_region": "Configurer la sous-région de placement", - "litematica.gui.title.configs": "Configurations %s - %s", - "litematica.gui.title.confirm_file_deletion": "Confirmer la suppression de fichier", - "litematica.gui.title.copy_area_selection": "Copier la sélection de zone '%s'", - "litematica.gui.title.create_area_selection": "Créer une nouvelle sélection de zone", - "litematica.gui.title.create_area_selection_from_placement": "Créer une nouvelle sélection de zone à partir d'un placement de schéma", - "litematica.gui.title.create_directory": "Créer un nouveau répertoire", - "litematica.gui.title.create_in_memory_schematic": "Créer un schéma en mémoire", - "litematica.gui.title.create_schematic_project": "Créer un nouveau projet de schéma", - "litematica.gui.title.litematica_main_menu": "Litematica %s", - "litematica.gui.title.load_schematic": "Charger le schéma", - "litematica.gui.title.manage_loaded_schematics": "Gérer les schémas chargés", - "litematica.gui.title.manage_schematic_placements": "Gérer les placements de schémas", - "litematica.gui.title.material_list.area_analyzer": "Analyse de zone pour la sélection '%s'", - "litematica.gui.title.material_list.placement": "Liste des matériaux pour le placement '%s'", - "litematica.gui.title.material_list.schematic": "Liste des matériaux pour le schéma '%s' (%s sur %s régions)", - "litematica.gui.title.material_list.select_schematic_regions": "Sélectionnez les sous-régions pour la liste des matériaux de '%s'", - "litematica.gui.title.rename_area_selection": "Renommer la sélection de zone", - "litematica.gui.title.rename_area_sub_region": "Renommer la sous-région", - "litematica.gui.title.rename_schematic": "Renommer le schéma", - "litematica.gui.title.create_schematic_from_selection": "Enregistrer la zone actuellement sélectionnée comme schéma", - "litematica.gui.title.save_exported_schematic": "Enregistrer un %s exporté de '%s'", - "litematica.gui.title.save_imported_schematic": "Enregistrer un schéma importé", - "litematica.gui.title.save_schematic_from_memory": "Enregistrer un schéma en mémoire dans un fichier", - "litematica.gui.title.save_schematic_filename": "Nom du fichier du schéma", - "litematica.gui.title.schematic_browser": "Navigateur de schémas", - "litematica.gui.title.schematic_manager": "Gestionnaire de schémas", - "litematica.gui.title.schematic_project_manager": "Gestionnaire de projets de schémas VCS", - "litematica.gui.title.schematic_projects.confirm_delete_area": "Confirmer la suppression de la zone", - "litematica.gui.title.schematic_projects.confirm_place_to_world": "Confirmer l'action de placement dans le monde", - "litematica.gui.title.schematic_projects.save_new_version": "Enregistrer une nouvelle version de schéma", - "litematica.gui.title.schematic_projects_browser": "Navigateur de projets de schémas VCS", - "litematica.gui.title.schematic_verifier": "Vérificateur de schéma pour '%s'", - "litematica.gui.title.schematic_verifier_errors": "Erreurs de vérificateur de schéma", - "litematica.gui.title.task_manager": "Gestionnaire de tâches", - - "litematica.hud.area_selection.box_count": "Boîtes: %s", - "litematica.hud.area_selection.dimensions_position": "Dim: %s - p1: %s, p2: %s", - "litematica.hud.area_selection.mode.corners": "Coins", - "litematica.hud.area_selection.mode.expand": "Étendre", - "litematica.hud.area_selection.origin": "Origine: %s", - "litematica.hud.area_selection.selected_area_normal": "Zone: %s", - "litematica.hud.area_selection.selected_area_simple": "Zone [§6Mode simple§r]: %s", - "litematica.hud.area_selection.selected_sub_region": "Sous-région: %s", - "litematica.hud.area_selection.selection_corners_mode": "Mode Coins: %s", - - "litematica.hud.delete.target_mode": "Mode cible de suppression: %s", - "litematica.hud.delete.target_mode.area": "Zone actuelle", - "litematica.hud.delete.target_mode.placement": "Placement actuel", - - "litematica.hud.misc.easy_place_mode_enabled": "Mode Placement Facile §aON§r", - "litematica.hud.misc.none_brackets": "", - "litematica.hud.misc.placement_restriction_mode_enabled": "Mode Restriction de Placement §aON§r", - "litematica.hud.misc.render_layer_mode": "Mode de calque: %s - %s", - "litematica.hud.misc.render_layer_mode_all": "Mode de calque: %s", - "litematica.hud.misc.renderer_status": "Rendus: A: %s S: %s B: %s O: %s SEL: %s", - "litematica.hud.misc.schematic_paste.data_restore_mode": "Mode de restauration des données: §b%s", - "litematica.hud.misc.schematic_paste.replace_mode": "Remplacer les blocs: %s", - - "litematica.hud.schematic_placement.hover_info.lock_coordinate": "Verrouiller cette coordonnée\nCela permet de modifier les autres coordonnées\nsans affecter les coordonnées verrouillées", - "litematica.hud.schematic_placement.hover_info.placement_locked": "Ce placement a été verrouillé et ne peut pas\nêtre modifié sans être déverrouillé au préalable", - "litematica.hud.schematic_placement.hover_info.placement_modified": "Ce placement a été modifié", - "litematica.hud.schematic_placement.hover_info.placement_sub_region_modified": "Cette sous-région a été modifiée", - "litematica.hud.schematic_placement.selected_placement": "Placement", - "litematica.hud.schematic_placement.selected_sub_region": "Sous-région", - "litematica.hud.schematic_placement.sub_region_count": "Régions", - "litematica.hud.schematic_placement.sub_region_modified": "Modifié", - "litematica.hud.schematic_placement.sub_region_origin": "Origine de la région: %s", - "litematica.hud.schematic_placement.sub_regions_modified": "Régions modifiées", - - "litematica.hud.selected_mode": "Mode", - - "litematica.hud.schematic_projects.current_version_date": "Date: %s", - "litematica.hud.schematic_projects.current_version": "Version: %s/%s - name: %s", - "litematica.hud.schematic_projects.no_project_open": "", - "litematica.hud.schematic_projects.no_versions": "", - "litematica.hud.schematic_projects.origin": "Origine du projet: %s", - "litematica.hud.schematic_projects.project_name": "Projet: %s", - "litematica.hud.schematic_projects_mode": "§6Mode Schematic VCS§r", - - "litematica.info.material_list": "- La touche de raccourci de la liste des matériaux ouvrira la dernière liste consultée,\n si elle est sauvegardée\n- Pour basculer vers une liste de matériaux différente, ouvrez-en une via\n le bouton GUI dans la configuration du placement ou\n le navigateur de schémas\n- La liste stockée/dernièrement consultée est également oubliée\n si le Placement Schematic sélectionné est changé\n- S'il n'y a pas encore de liste de matériaux consultée,\n alors le Placement sélectionné est utilisé, s'il y en a un", - - "litematica.label.alignment.center": "Centre", - "litematica.label.alignment.top_center": "Haut Centre", - - "litematica.label.none_lower": "aucun", - "litematica.label.no": "non", - "litematica.label.yes": "oui", - - "litematica.message.error.area_deletion_aborted": "Suppression de la zone interrompue ou annulée", - "litematica.message.error.empty_area_selection": "Sélection de zone vide (pas de boîtes)", - "litematica.message.error.invalid_schematic_name": "Nom de schéma invalide '%s'", - "litematica.message.error.no_area_selected": "§cAucune zone sélectionnée§r", - "litematica.message.error.no_placement_selected": "§cAucun placement sélectionné§r", - "litematica.message.error.only_works_in_single_player": "§cCette opération ne fonctionne que en mode joueur unique§r", - "litematica.message.error.move.pending_tasks": "§cImpossible de démarrer une opération de déplacement tant qu'il y a des tâches en attente§r", - "litematica.message.error.placement_paste_outside_world": "Le placement ne peut pas être collé à la position actuelle, car il dépasse les limites du monde", - "litematica.message.error.schematic_paste_failed": "§cÉchec du collage du schéma dans le monde§r", - "litematica.message.error.schematic_save_failed": "Échec de l'enregistrement du schéma dans le fichier '%s'", - "litematica.message.error.schematic_save_interrupted": "Enregistrement du schéma interrompu ou arrêté", - "litematica.message.error.schematic_save_no_area_selected": "§cÉchec de l'enregistrement du schéma - aucune zone sélectionnée§r", - "litematica.message.warn.pickblock.no_suitable_slot_found": "Aucun emplacement de barre d'accès rapide adapté trouvé pour le bloc à ramasser!\\nVérifiez la configuration Generic -> §epickBlockableSlots§r.\\nDe plus, en fonction des configurations §epickBlockAvoid*§6, la fonction de ramassage peut refuser de remplacer tout outil ou autre élément endommageable dans ces emplacements.", - "litematica.message.warn.pickblock.no_valid_slots_configured": "Aucun emplacement de barre d'accès rapide défini dans la configuration Generic -> §epickBlockableSlots§6 !", - - "litematica.message.added_selection_box": "Ajouté une nouvelle boîte de sélection à %s", - "litematica.message.area_clear_fail": "§cImpossible de vider la ou les zones§r", - "litematica.message.area_cleared": "Zone vidée", - "litematica.message.area_filled": "Zone remplie", - "litematica.message.area_fill_fail": "Échec du remplissage de la zone", - "litematica.message.area_selections.selection_created_from_placement": "Créé une nouvelle sélection à partir du placement '%s'", - "litematica.message.easy_place_fail": "§6Action empêchée par le mode Placement Facile", - "litematica.message.grabbed_element_for_moving": "Élément saisi pour le déplacement", - "litematica.message.in_memory_schematic_created": "Créé un schéma en mémoire en tant que '%s'", - "litematica.message.material_list.material_cache_cleared": "Cache des matériaux effacé", - "litematica.message.material_list_written_to_file": "Liste des matériaux écrite dans le fichier '%s'", - "litematica.message.moved_area_origin": "Déplacé le point d'origine de la zone de %s => %s", - "litematica.message.moved_selection": "Déplacé la sélection actuelle de %s => %s", - "litematica.message.paste_with_servux": "§6Le placement est en cours de téléchargement sur Servux pour être collé", - "litematica.message.placement.cant_modify_is_locked": "§cLe placement est verrouillé et ne peut pas être modifié§r", - "litematica.message.placement.moved_placement_origin": "Déplacé l'origine du placement de %s => %s", - "litematica.message.placement.moved_subregion_to": "Déplacé la sous-région à %s", - "litematica.message.placement_restriction_fail": "§6Action empêchée par le mode Restriction de Placement", - "litematica.message.removed_area_origin": "Supprimé le point d'origine de la zone explicite/manuelle", - "litematica.message.removed_selection_box": "Boîte de sélection %s supprimée", - "litematica.message.scheduled_task_added": "Tâche planifiée ajoutée...", - "litematica.message.schematic_exported_as": "Schéma exporté en tant que '%s'", - "litematica.message.schematic_pasted": "Schéma collé dans le monde", - "litematica.message.schematic_pasted_using_fill_and_setblock": "Schéma collé en utilisant les commandes fill §b%s§r et setblock §b%s§r", - "litematica.message.schematic_pasted_using_setblock": "Schéma collé en utilisant les commandes setblock §b%s§r", - "litematica.message.schematic_pasted_using_world_edit": "Schéma collé en utilisant les commandes World Edit //set §b%s§r", - "litematica.message.schematic_placement_created": "Placement créé pour '%s'", - "litematica.message.schematic_preview_cancelled": "Tâche d'aperçu annulée", - "litematica.message.schematic_read_from_file_success": "Schéma chargé à partir du fichier '%s'", - "litematica.message.schematic_rendering_refreshed": "Rendu du schéma actualisé", - "litematica.message.schematic_saved_as": "Schéma enregistré en tant que '%s'", - "litematica.message.schematic_save_task_created": "Tâche d'enregistrement du schéma créée", - "litematica.message.set_area_origin": "Définir le point d'origine de la zone à %s", - "litematica.message.set_selection_box_point": "Définir/déplacer le point %d à %s", - "litematica.message.toggled": "Basculé %s %s", - "litematica.message.value.on": "ON", - "litematica.message.value.off": "OFF", - - "litematica.message.schematic_projects.project_created": "Projet '%s' créé", - "litematica.message.schematic_projects.project_loaded": "Projet '%s' chargé", - "litematica.message.schematic_projects.version_saved": "Nouvelle version (#%s) enregistrée en tant que '%s'", - - "litematica.message.warn.area_selection.browser_open_in_simple_mode": "Note : Vous êtes actuellement en mode de sélection de zone simple", - "litematica.message.warn.layer_mode_currently_at": "Note : Vous êtes actuellement en mode de rendu de couche '%s'", - "litematica.message.warn.main_rendering_disabled": "Attention : Le rendu principal est actuellement désactivé\nVoir Visuals -> %s, ou Hotkeys -> %s ['%s']", - "litematica.message.warn.schematic_blocks_rendering_disabled": "Attention : Le rendu des blocs de schéma est actuellement désactivé\nVoir Visuals -> %s, ou Hotkeys -> %s ['%s']", - "litematica.message.warn.schematic_load_non_litematica": "Attention : Lorsque vous chargez directement des schémas non-Litematica, les placements créés ne seront pas persistants.\nDe plus, si vous devez charger le schéma plusieurs fois, la latence de conversion de type de schéma (pour les schémas volumineux) se produira à chaque chargement.\n\nIl est donc recommandé de soit importer le schéma et de l'enregistrer dans le format Litematica via le menu Gestionnaire de schémas, ou mieux encore, de coller le schéma d'origine dans un monde temporaire à l'aide de MCEdit ou du mode Coller dans Litematica, puis de créer un nouveau schéma Litematica à partir de celui-ci, de préférence en utilisant plusieurs sous-régions pour capturer étroitement la construction, le cas échéant.", - "litematica.message.warn.schematic_rebuild_placement_not_selected": "Le placement ciblé n'est actuellement pas sélectionné. La touche de raccourci Remplacer tout ne fonctionne que sur les sous-régions actuellement sélectionnées du placement sur lequel vous cliquez. Ainsi, pour remplacer les blocs dans une seule sous-région, sélectionnez cette sous-région. Pour remplacer dans l'ensemble du schéma (toutes les sous-régions), sélectionnez l'ensemble du placement et non pas une sous-région de celui-ci. Les blocs ne sont également remplacés que dans la zone limitée par le paramètre actuel des couches de rendu.", - "litematica.message.warn.schematic_rendering_disabled": "Attention : Le rendu de schéma est actuellement désactivé\nVoir Visuals -> %s, ou Hotkeys -> %s ['%s']", - "litematica.message.warn.schematic_verifier.overlay_disabled": "Attention : Le rendu de l'overlay du vérificateur est actuellement désactivé ! Voir Infos sur les superpositions -> %s (ou Hotkeys -> %s ['%s'])", - - "litematica.message.warning.invalid_number": "Entrée invalide pour un nombre '%s'", - "litematica.message.warning.schematic_projects_hidden": "Attention : Le système de contrôle de version du schéma est actuellement masqué. En général, vous NE DEVRIEZ PAS utiliser ceci, sauf si vous savez vraiment comment cela fonctionne et modifie certains comportements du mod. Il est destiné à un travail de conception itératif, en place, où il est nécessaire de basculer entre différentes versions de la construction en place (= supprimer et remplacer la version précédente). Si vous souhaitez l'utiliser, activez l'option Generic -> unhideSchematicVCS", - - "litematica.warning.area_editor.area_rendering_disabled": "Note : Le rendu des boîtes de sélection de zone est actuellement désactivé\nVoir Visuals -> %s, ou Hotkeys -> %s ['%s']", - - "litematica.tool_hud.block_1": "Bloc: %s", - "litematica.tool_hud.block_2": "Remplacer: %s", - "litematica.tool_hud.facing": "Orientation: %s", - - "litematica.tool_mode.name.area_selection": "Sélection de zone", - "litematica.tool_mode.name.delete": "Supprimer", - "litematica.tool_mode.name.fill": "Remplir", - "litematica.tool_mode.name.grid_paste": "Coller un schéma en grille dans le monde", - "litematica.tool_mode.name.move": "Déplacer", - "litematica.tool_mode.name.paste_schematic": "Coller un schéma dans le monde", - "litematica.tool_mode.name.rebuild": "Modifier un schéma", - "litematica.tool_mode.name.replace_block": "Remplacer le bloc", - "litematica.tool_mode.name.schematic_placement": "Placement de schéma" -} \ No newline at end of file diff --git a/src/main/resources/assets/forgematica/lang/ru_ru.json b/src/main/resources/assets/forgematica/lang/ru_ru.json deleted file mode 100644 index dbe6411..0000000 --- a/src/main/resources/assets/forgematica/lang/ru_ru.json +++ /dev/null @@ -1,510 +0,0 @@ -{ - "litematica.error.area_selection.copy_failed": "Не удалось скопировать выделение", - "litematica.error.area_selection.create_failed": "Не удалось создать новое выделение с именем \"%s\", файл уже существует", - "litematica.error.area_selection.failed_to_load": "Не удалось загрузить область выделения", - "litematica.error.area_selection.grow.no_sub_region_selected": "Подрегионы не выбраны", - "litematica.error.area_selection.no_placement_selected": "Размещение схемы не выбрано", - "litematica.error.area_selection.rename.already_exists": "Ошибка: область с именем \"%s\" уже существует", - "litematica.error.area_selection.rename.invalid_safe_file_name": "Сгенерировано некорректное имя файла \"%s\"", - - "litematica.error.duplicate_schematic_placement": "Ошибка: Попытка создать уже существующее размещение", - "litematica.error.generic.creative_mode_only": "Это действие доступно только в режиме креатива", - "litematica.error.generic.failed_to_delete_file": "Не удалось удалить файл \"%s\"", - "litematica.error.generic.failed_to_sort_list_of_ignored_states": "Не удалось отсортировать список игнорируемых состояний", - "litematica.error.generic.schematic_world_not_loaded": "Мир схемы не был загружен", - - "litematica.error.area_editor.create_sub_region.exists": "Подрегион с именем \"%s\" уже существует", - "litematica.error.area_editor.no_selection": "Нет активных областей выделения", - "litematica.error.area_editor.open_gui.no_selection": "Активен режим выделения: обычный, но не выбрана ни одна область", - "litematica.error.area_editor.rename_sub_region.exists": "Не удалось переименовать подрегион:\nПодрегион уже существует с именем \"%s\"", - "litematica.error.area_editor.switch_mode.no_selection": "Не удалось переключить режим указания на обычный, так как не выбрана область. Выберите область или создайте новое выделение в Менеджере областей выделения", - - "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_create_schematic": "Не удалось создать схему Litematica", - "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_read_schematic": "Не удалось загрузить схему", - "litematica.error.schematic_conversion.structure_to_litematica_failed": "Ошибка конвертации структуры в схему Litematica", - - "litematica.error.schematic.create.no_selections": "Выделение не имеет ни одного подрегиона.", - - "litematica.error.schematic_load.cant_read_file": "Не удалось прочитать файл схемы \"%s\" (ошибка доступа или файл не существует)", - "litematica.error.schematic_load.no_schematic_selected": "Файл схемы не выбран.", - "litematica.error.schematic_load.no_schematic_version_information": "Схема не содержит информации о версии и не может быть безопасно загружена.", - "litematica.error.schematic_load.unsupported_schematic_version": "Неподдерживаемая или более поздняя версия схемы \"%d\"", - "litematica.error.schematic_load.unsupported_type": "Неизвестный или неподдерживаемый тип файла \"%s\"", - - "litematica.error.schematic_manager.schematic_export.unsupported_type": "Только схемы Litematica могут быть экспортированы в другие форматы.", - "litematica.error.schematic_manager.schematic_import.unsupported_type": "Тип выбранной схемы не поддерживается для импорта.", - - "litematica.error.schematic_placements.remove_fail_locked": "Размещение зафиксировано. Удерживайте Shift, чтобы принудительно удалить его.", - - "litematica.error.schematic_save.directory_doesnt_exist": "Папка не существует: \"%s\"", - "litematica.error.schematic_save.file_already_exists": "Файл \"%s\" уже существует", - "litematica.error.schematic_save.invalid_directory": "Некорректный путь: \"%s\"", - "litematica.error.schematic_save.invalid_schematic_name": "Некорректное имя схемы \"%s\"", - "litematica.error.schematic_save.schematic_creation_failed": "Не удалось создать схему", - - "litematica.error.schematic_read_from_file_failed.cant_read": "Не удалось прочитать схему из файла \"%s\"", - "litematica.error.schematic_read_from_file_failed.exception": "Исключение при попытке чтения схемы из файла \"%s\"", - "litematica.error.schematic_read_from_file_failed.no_file": "Не удалось прочитать схему из файла: файл недоступен (возможно, временная схема?)", - - "litematica.error.schematic_projects.empty_selection": "Пустая область выделения (0 подрегионов)", - "litematica.error.schematic_projects.failed_to_load_project": "Не удалось загрузить проект", - "litematica.error.schematic_projects.failed_to_load_schematic": "Не удалось загрузить схему для текущей версии", - "litematica.error.schematic_projects.failed_to_rename_project_file_exception": "Не удалось переименовать файл проекта \"%s\" (исключение)", - "litematica.error.schematic_projects.failed_to_rename_project_file_exists": "Не удалось переименовать проект \"%s\", файл уже существует", - "litematica.error.schematic_projects.invalid_project_directory": "Некорректный или несуществующий путь к файлу проекта", - "litematica.error.schematic_projects.no_project_open": "Нет открытых проектов", - "litematica.error.schematic_projects.in_projects_mode_but_no_project_open": "Уже в режиме УВС, но ни один проект не открыт.", - "litematica.error.schematic_projects.null_player": "Нет данных об игроке", - "litematica.error.schematic_projects.project_already_exists": "Проект \"%s\" уже существует", - "litematica.error.schematic_projects.save_already_in_progress": "Сохранение уже запущено", - - "litematica.error.schematic_write_to_file_failed.directory_creation_failed": "Не удалось создать адрес схемы \"%s\"", - "litematica.error.schematic_write_to_file_failed.exception": "Не удалось записать схему в файл \"%s\" (исключение)", - "litematica.error.schematic_write_to_file_failed.exists": "Не удалось записать схему в файл \"%s\": имя уже занято", - "litematica.error.structure_write_to_file_failed.exception": "Не удалось записать структуру в файл \"%s\" (исключение)", - "litematica.error.structure_write_to_file_failed.exists": "Не удалось записать структуру в файл \"%s\": имя уже занято", - - "litematica.hotkeys.category.generic_hotkeys": "Основные клавиши", - - "litematica.info.schematic_load.schematic_loaded": "Схема \"%s\" успешно загружена в память", - "litematica.info.schematic_manager.preview.right_click_to_cancel": "- Нажмите ПКМ по кнопке, чтобы прервать операцию создания миниатюры\n- Удерживайте Ctrl+Alt+Shift при нажатии, чтобы загрузить картинку из существующего\n PNG-файла с именем \"thumb.png\", лежащего в той же директории, что и файл схемы.", - "litematica.info.schematic_manager.preview.set_preview_by_taking_a_screenshot": "Используйте обычную клавишу создания скриншота, чтобы установить миниатюру. Нажмите ПКМ по этой кнопке, чтобы прервать операцию.", - "litematica.info.schematic_manager.preview.success": "Миниатюра успешно установлена", - - "litematica.gui.button.area_editor.analyze_area": "Анализ области", - "litematica.gui.button.area_editor.change_corner_mode": "Режим выделения: %s", - "litematica.gui.button.area_editor.change_selection_mode": "Тип указания: %s", - "litematica.gui.button.area_editor.create_schematic": "Сохранить схему", - "litematica.gui.button.area_editor.create_sub_region": "Новый подрегион", - "litematica.gui.button.area_editor.origin_enabled": "Точка привязки: %s", - "litematica.gui.button.area_editor.set_box_name": "Применить", - "litematica.gui.button.area_editor.set_selection_name": "Применить", - - "litematica.gui.button.area_selection_mode": "Режим указания области: %s", - "litematica.gui.button.area_selections.create_directory": "Создать папку", - "litematica.gui.button.area_selections.create_new_selection": "Новое выделение", - "litematica.gui.button.area_selections.create_selection_from_placement": "Из размещения схемы", - "litematica.gui.button.area_selections.unselect": "Снять выбор", - - "litematica.gui.button.change_menu.area_editor": "Редактор области", - "litematica.gui.button.change_menu.configuration_menu": "Настройки", - "litematica.gui.button.change_menu.load_schematics_to_memory": "Загрузить схему", - "litematica.gui.button.change_menu.schematic_manager": "Менеджер схем", - "litematica.gui.button.change_menu.schematic_projects_manager": "Менеджер УВС", - "litematica.gui.button.change_menu.show_area_selections": "Менеджер областей выделения", - "litematica.gui.button.change_menu.show_loaded_schematics": "Загруженные схемы", - "litematica.gui.button.change_menu.show_schematic_placements": "Размещение схем", - "litematica.gui.button.change_menu.task_manager": "Диспетчер задач", - "litematica.gui.button.change_menu.to_main_menu": "Главное меню", - - "litematica.gui.button.config_gui.colors": "Цвета", - "litematica.gui.button.config_gui.generic": "Основные", - "litematica.gui.button.config_gui.hotkeys": "Клавиши", - "litematica.gui.button.config_gui.info_overlays": "Наложение информации", - "litematica.gui.button.config_gui.render_layers": "Отображение слоёв", - "litematica.gui.button.config_gui.visuals": "Визуализация", - - "litematica.gui.button.hover.area_editor.shift_for_in_memory": "Удерживайте Shift, чтобы сохранить временную схему (только в ОЗУ)", - "litematica.gui.button.hover.area_selections.unselect": "Снимает выбор с текущей области выделения", - "litematica.gui.button.hover.material_list.clear_cache": "Очищает кэш материалов.\nОбычно это не требуется.\nЭто можно использовать вместо удаления файла \"material_cache.nbt\"\nв случае, если кэш содержит ошибочные данные вроде\nпредметов, сохранённых для блоков, которые их не имеют\n(например, головка поршня)", - "litematica.gui.button.hover.material_list.write_hold_shift_for_csv": "Удерживайте Shift для записи в файл .ctv\nвместо обычной ASCII-таблицы в текстовом файле.", - "litematica.gui.button.hover.material_list_shift_to_select_sub_regions": "Удерживайте Shift, чтобы выбрать подрегионы для списка материалов", - "litematica.gui.button.hover.plus_minus_tip": "ЛКМ для увеличения\nПКМ для уменьшения\nShift и/или Alt для увеличения размера шага", - "litematica.gui.button.hover.plus_minus_tip_ctrl_alt_shift": "ЛКМ для увеличения\nПКМ для уменьшения\nShift/Alt/Ctrl для умножения размера шага", - "litematica.gui.button.hover.schematic_list.reload_schematic": "Перезагружает схему из файла.\nМожет быть полезно, если вы безвозвратно\nповредили схему в режиме редактирования.", - "litematica.gui.button.hover.schematic_projects.area_browser_disabled_currently_in_projects_mode": "Сейчас открыт проект управления версиями схемы.\nРежим УВС переопределяет обычный функционал\nобластей выделения.", - "litematica.gui.button.hover.schematic_projects.delete_area": "§6Удалить последнюю размещённую или сохранённую область§r", - "litematica.gui.button.hover.schematic_projects.menu_warning": "(Ранее назывался \"Проекты схем\")\nВам §6не следует§r использовать эту функцию,\nесли вы не знаете, как она работает и что делает.\nОна несколько изменяет способ работы выделения\nобластей, размещения и вставки. Например, при\nвставке выполняется операция удаления области.\n\nЭта функция предназначается для §6итеративной работы§r\nс дизайном §6на одном и том же месте§r и позволяет вам\nлегко создавать несколько версий/набросков какой-либо\nпостройки и переключаться между ними, удаляя блоки\nна месте старой версии постройки и замещая их новой.", - "litematica.gui.button.hover.schematic_projects.move_origin_to_player": "Переместить точку привязки проекта к текущей пощиции игрока.\nЭто также переместит область выделения и размещение.", - "litematica.gui.button.hover.schematic_projects.place_to_world_warning": "§6Предупреждение: Это приведёт к замене блоков\n§6в пределах области, сохранённой как версия проекта\n§6или размещённой из неё.", - "litematica.gui.button.hover.schematic_projects.save_new_version": "Сохранить новую версию проекта (в виде схемы)", - - "litematica.gui.button.material_list": "Список материалов", - "litematica.gui.button.material_list.clear_cache": "Очистить кэш", - "litematica.gui.button.material_list.clear_ignored": "Показать скрытые", - "litematica.gui.button.material_list.hide_available": "Скрыть доступные: %s", - "litematica.gui.button.material_list.ignore": "Скрыть", - "litematica.gui.button.material_list.list_type": "Отображение: %s", - "litematica.gui.button.material_list.refresh_list": "Обновить", - "litematica.gui.button.material_list.toggle_info_hud": "Панель информации: %s", - "litematica.gui.button.material_list.write_to_file": "Записать в файл", - - "litematica.gui.button.placement_sub.placement_configuration": "Настройка размещения", - "litematica.gui.button.placement_sub.reset_sub_region_placement": "Сброс", - "litematica.gui.button.placement_sub.slice_type": "Slice: %s", - - "litematica.gui.button.schematic_manager.export_as": "Экспортировать как:", - - "litematica.gui.button.schematic_placement.abbr.rendering": "⩺", - - "litematica.gui.button.schematic_placement.ignore_entities": "Скрыть сущности: %s", - "litematica.gui.button.schematic_placement.region_enabled": "Регион: %s", - "litematica.gui.button.schematic_placement.reset_sub_region_placements": "Сброс подрегионов", - "litematica.gui.button.schematic_placement.toggle_all_off": "§cОтключить§r все", - "litematica.gui.button.schematic_placement.toggle_all_on": "§aВключить§r все", - - "litematica.gui.button.schematic_placement.hover.enclosing_box": "Отображение общей границы: %s", - "litematica.gui.button.schematic_placement.hover.lock": "Фиксация размещения предотвращает его сдвиг\nили иное случайное изменение позиции", - "litematica.gui.button.schematic_placement.hover.rendering": "Отображение: %s\nОбратите внимание, что это работает немного\nстранно и не влияет на отображение сущностей.\nОбычно достаточно просто полностью\nотключить размещение.", - - "litematica.gui.button.schematic_placements.configure": "Настроить", - "litematica.gui.button.schematic_placements.disable": "Отключить", - "litematica.gui.button.schematic_placements.locked": "Фиксация: %s", - "litematica.gui.button.schematic_placements.placement_enabled": "Размещение: %s", - "litematica.gui.button.schematic_placements.remove": "Удалить", - "litematica.gui.button.schematic_placements.rendering_enabled": "Отображение: %s", - "litematica.gui.button.schematic_placements.select": "Выбрать", - - "litematica.gui.button.schematic_projects.close_project": "Закрыть проект", - "litematica.gui.button.schematic_projects.create_project": "Создать проект", - "litematica.gui.button.schematic_projects.delete_area": "Очистить область", - "litematica.gui.button.schematic_projects.load_project": "Загрузить проект", - "litematica.gui.button.schematic_projects.move_origin_to_player": "Переместить к игроку", - "litematica.gui.button.schematic_projects.open_area_editor": "Редактор области", - "litematica.gui.button.schematic_projects.open_manager_gui": "Открыть менеджер", - "litematica.gui.button.schematic_projects.open_project_browser": "Просмотр проектов УВС", - "litematica.gui.button.schematic_projects.place_to_world": "Разместить в мире", - "litematica.gui.button.schematic_projects.save_version": "Сохранить новую версию", - - "litematica.gui.button.schematic_verifier.ignore": "Скрыть", - "litematica.gui.button.schematic_verifier.range_type": "Диапазон: %s", - "litematica.gui.button.schematic_verifier.reset_ignored": "Показать скрытые", - "litematica.gui.button.schematic_verifier.reset_verifier": "Очистить данные", - "litematica.gui.button.schematic_verifier.resume": "Возобновить проверку", - "litematica.gui.button.schematic_verifier.start": "Запустить проверку", - "litematica.gui.button.schematic_verifier.stop": "Остановить проверку", - "litematica.gui.button.schematic_verifier.toggle_info_hud": "Панель информации: %s", - - "litematica.gui.button.cancel": "Закрыть", - "litematica.gui.button.configure": "Настройки", - "litematica.gui.button.copy": "Копировать", - "litematica.gui.button.create_directory": "Создать папку", - "litematica.gui.button.create_placement": "Создать размещение", - "litematica.gui.button.delete": "Удалить", - "litematica.gui.button.disable": "Отключить", - "litematica.gui.button.enable": "Включить", - "litematica.gui.button.import": "Импортировать", - "litematica.gui.button.load_schematic_to_memory": "Загрузить схему", - "litematica.gui.button.mirror_value": "Отразить: %s", - "litematica.gui.button.move_to_player": "К игроку", - "litematica.gui.button.ok": "Применить", - "litematica.gui.button.reload": "Перезагрузить", - "litematica.gui.button.remove": "Удалить", - "litematica.gui.button.remove_placement": "Удалить размещение", - "litematica.gui.button.rename": "Переименовать", - "litematica.gui.button.rotation_value": "Поворот: %s", - "litematica.gui.button.save_new_schematic_version": "Сохранить новую версию", - "litematica.gui.button.save_schematic": "Сохранить схему", - "litematica.gui.button.save_to_file": "Сохранить в файл", - "litematica.gui.button.schematic_verifier": "Проверка схемы", - "litematica.gui.button.set_preview": "Установить картинку", - "litematica.gui.button.tool_mode": "Режим инструмента: %s", - "litematica.gui.button.unload": "Выгрузить", - "litematica.gui.button.unlocked": "Разблокировано", - - "litematica.gui.label.area_editor.box_name": "Имя подрегиона", - "litematica.gui.label.area_editor.selection_name": "Имя выделения", - "litematica.gui.label.area_editor.corner_1": "Угол 1", - "litematica.gui.label.area_editor.corner_2": "Угол 2", - "litematica.gui.label.area_editor.origin": "Привязка", - "litematica.gui.label.area_editor.dimensions": "Габариты", - "litematica.gui.label.area_editor.pos1": "Угол 1", - "litematica.gui.label.area_editor.pos2": "Угол 2", - "litematica.gui.label.area_editor.sub_regions": "Подрегионы (%s)", - - "litematica.gui.label.area_selection_manager.current_selection": "Выбранная область: %s", - - "litematica.gui.label.area_selection_box_count": "Регионы: %d", - "litematica.gui.label.area_selection_origin": "Привязка: %s", - "litematica.gui.label.area_selection.mode.normal": "Обычный", - "litematica.gui.label.area_selection.mode.simple": "Простой", - - "litematica.gui.label.block_info.state_client": "Состояние блока клиентского мира", - "litematica.gui.label.block_info.state_schematic": "Состояние блока схемы", - - "litematica.gui.label.block_info_list_type.all": "Вся схема", - "litematica.gui.label.block_info_list_type.render_layers": "Видимые слои", - - "litematica.gui.label.easy_place_protocol.auto": "Авто", - "litematica.gui.label.easy_place_protocol.none": "Нет", - "litematica.gui.label.easy_place_protocol.slabs_only": "Только плиты", - "litematica.gui.label.easy_place_protocol.v2": "Версия 2", - "litematica.gui.label.easy_place_protocol.v3": "Версия 3", - - "litematica.gui.label.loaded_schematic.modified_on": "§6Изменено %s§r", - - "litematica.gui.label.material_list.abbr.shulker_box": "шалкеровых ящика(ов)", - "litematica.gui.label.material_list.title.available": "Доступно", - "litematica.gui.label.material_list.title.item": "Название", - "litematica.gui.label.material_list.title.missing": "Пропущено", - "litematica.gui.label.material_list.title.total": "Всего", - - "litematica.gui.label.material_list.multiplier": "Множитель:", - "litematica.gui.label.material_list.name": "Название", - "litematica.gui.label.material_list.progress": "Прогресс: %s", - "litematica.gui.label.material_list.progress.done": "выполнено %s", - "litematica.gui.label.material_list.progress.mismatch": "не совпадает %s", - "litematica.gui.label.material_list.progress.missing": "пропущено %s", - "litematica.gui.label.material_list.total": "Всего: %s предметов", - - "litematica.gui.label.origin.auto": "Авто", - "litematica.gui.label.origin.manual": "Ручная", - - "litematica.gui.label.paste_nbt_behavior.none": "Нет", - "litematica.gui.label.paste_nbt_behavior.place_data_modify": "Разместить → /data modify", - "litematica.gui.label.paste_nbt_behavior.place_clone": "Разместить → /clone", - - "litematica.gui.label.placement_sub.region_name": "Имя региона: %s", - "litematica.gui.label.placement_sub.region_position": "Позиция региона", - "litematica.gui.label.placement_sub.region_size": "Размер региона: %s", - - "litematica.gui.label.placement_settings.placement_origin": "Привязка размещения", - - "litematica.gui.label.render_layers.hotkey": "Клавиша", - "litematica.gui.label.render_layers.hover.hotkey": "Горячая клавиша следующего/предыдущего слоя будет менять это значение.\nЕсли обе отключены, горячие клавиши будут влиять на границу,\nближайшую к игроку.", - - "litematica.gui.label.replace_behavior.all": "Вся схема", - "litematica.gui.label.replace_behavior.none": "Не заменять блоки", - "litematica.gui.label.replace_behavior.with_non_air": "Исключить воздух", - - "litematica.gui.label.schematic_info.schematic_author": "Автор схемы: §f%s§r", - "litematica.gui.label.schematic_info.description": "Описание:", - "litematica.gui.label.schematic_info.enclosing_size": "Суммарный размер:", - "litematica.gui.label.schematic_info.enclosing_size_value": "Суммарный размер: §f%s§r", - "litematica.gui.label.schematic_info.name": "Название:", - "litematica.gui.label.schematic_info.region_count": "Регионов: §f%d§r", - "litematica.gui.label.schematic_info.time_created": "Создано: §f%s§r", - "litematica.gui.label.schematic_info.time_modified": "Изменён: §f%s§r", - "litematica.gui.label.schematic_info.total_blocks": "Всего блоков: §f%d§r", - "litematica.gui.label.schematic_info.total_blocks_and_volume": "Блоков/Объём: §f%d§r/§f%d§r", - "litematica.gui.label.schematic_info.total_volume": "Общий объём, блоков: §f%d§r", - - "litematica.gui.label.schematic_load.checkbox.create_placement": "Создать размещение", - "litematica.gui.label.schematic_load.hoverinfo.create_placement": "Создать и сделать активным размещение", - - "litematica.gui.label.schematic_placement.enclosing_size": "Суммарный размер: %s", - "litematica.gui.label.schematic_placement.hoverinfo.hold_shift_to_create_as_disabled": "Удерживайте Shift, чтобы скрыть размещение при создании", - "litematica.gui.label.schematic_placement.in_memory": "Временная схема", - "litematica.gui.label.schematic_placement.origin": "Привязка: %s", - "litematica.gui.label.schematic_placement.rename_placement": "Переименовать размещение:", - "litematica.gui.label.schematic_placement.schematic_file": "Файл: %s", - "litematica.gui.label.schematic_placement.schematic_name": "Схема: %s", - "litematica.gui.label.schematic_placement.sub_region_count": "Подрегионов: %s", - "litematica.gui.label.schematic_placement.sub_regions": "Подрегионы (%s):", - - "litematica.gui.label.schematic_projects.currently_open_project": "Текущий открытый проект: %s", - "litematica.gui.label.schematic_projects.origin": "Привязка:", - "litematica.gui.label.schematic_projects.project": "Проект:", - "litematica.gui.label.schematic_projects.version": "Версия: %s (из %s)", - "litematica.gui.label.schematic_projects.version_entry": "Версия %d - %s", - "litematica.gui.label.schematic_projects.version_name": "Название версии:", - - "litematica.gui.label.schematic_save.checkbox.ignore_entities": "Исключить сущности", - "litematica.gui.label.schematic_save.hoverinfo.hold_shift_to_overwrite": "Удерживайте Shift, чтобы перезаписать существующий файл", - - "litematica.gui.label.schematic_verifier.count": "Количество", - "litematica.gui.label.schematic_verifier.expected": "Ожидалось", - "litematica.gui.label.schematic_verifier.found": "Найдено", - "litematica.gui.label.schematic_verifier_display_type.all": "Все (не скрытые)", - "litematica.gui.label.schematic_verifier_display_type.correct_state": "§aПравильное состояние§r", - "litematica.gui.label.schematic_verifier_display_type.extra": "§dЛишние блоки§r", - "litematica.gui.label.schematic_verifier_display_type.missing": "§bПропущенные блоки§r", - "litematica.gui.label.schematic_verifier_display_type.wrong_blocks": "§cОшибочные блоки§r", - "litematica.gui.label.schematic_verifier_display_type.wrong_state": "§6Ошибочные состояния§r", - "litematica.gui.label.schematic_verifier.status.done_errors": "Ошибки: §cБлоки: %s§r, §6Состояния: %s§r, §bПропущенные: %s§r, §dПрочее: %s§r", - "litematica.gui.label.schematic_verifier.status.done_correct_total": "§aПравильно: %s§r, Всего: %s", - "litematica.gui.label.schematic_verifier.status.verifying": "Ожидание загрузки чанков: %s / %s", - "litematica.gui.label.schematic_verifier.verifier": "Проверка схемы", - - "litematica.gui.label.task.title.remaining_chunks": "%s, оставшиеся чанки (%s)", - "litematica.gui.label.task_name.area_analyzer": "Анализ области", - "litematica.gui.label.task_name.delete": "Удаление", - "litematica.gui.label.task_name.fill": "Размещение блоков", - "litematica.gui.label.task_name.material_list": "Список материалов", - "litematica.gui.label.task_name.paste": "Вставка схемы", - "litematica.gui.label.task_name.save_schematic": "Сохранение схемы", - "litematica.gui.label.task_name.verifier": "Проверка схемы", - - "litematica.gui.message.confirm_file_deletion": "Вы действительно хотите удалить файл \"%s\"?", - "litematica.gui.message.schematic_projects.confirm_delete_area": "Вы хотите удалить последнюю затронутую область? Это приведёт к удалению всех блоков и сущностей, находящихся в области, которую менеджер проекта в последний раз размещал в мире или сохранял в качестве версии. (Как правило, \"последняя просмотренная затронутая область\", если бы вы циклично перебирали версии, она не оставила бы блоков после предыдущей версии.)", - "litematica.gui.message.schematic_projects.confirm_place_to_world": "Вы хотите разместить эту версию в мире? Это приведёт к удалению всех блоков, находящихся в области, которую менеджер проекта в последний раз размещал в мире или сохранял в качестве версии. (Как правило, \"последняя просмотренная затронутая область\", если бы вы циклично перебирали версии, она не оставила бы блоков после предыдущей версии.)", - - "litematica.gui.title.area_editor_normal": "Редактор области (обычный/мультирежим)", - "litematica.gui.title.area_editor_normal_schematic_projects": "Редактор области (§6§lОбласть проекта УВС§r)", - "litematica.gui.title.area_editor_simple": "Редактор области (простой режим)", - "litematica.gui.title.area_editor_sub_region": "Редактор области (подрегион)", - "litematica.gui.title.area_editor.sub_region_name": "Название подрегиона", - "litematica.gui.title.area_selection_manager": "Менеджер областей выделения", - "litematica.gui.title.configure_schematic_placement": "Настройка размещения схемы", - "litematica.gui.title.configure_schematic_sub_region": "Настройка размещения подрегиона", - "litematica.gui.title.configs": "Настройки %s - %s", - "litematica.gui.title.confirm_file_deletion": "Подтвердите удаление файла", - "litematica.gui.title.copy_area_selection": "Копировать область выделения \"%s\"", - "litematica.gui.title.create_area_selection": "Создать новую область выделения", - "litematica.gui.title.create_area_selection_from_placement": "Создать новую область выделения из размещения схемы", - "litematica.gui.title.create_directory": "Создать новую папку", - "litematica.gui.title.create_in_memory_schematic": "Создать временную схему (поместить в ОЗУ)", - "litematica.gui.title.create_schematic_project": "Создать новый проект схемы", - "litematica.gui.title.litematica_main_menu": "Litematica %s", - "litematica.gui.title.load_schematic": "Загрузка схемы", - "litematica.gui.title.manage_loaded_schematics": "Управление загруженными схемами", - "litematica.gui.title.manage_schematic_placements": "Управление размещением схем", - "litematica.gui.title.material_list.area_analyzer": "Анализ области для выделения \"%s\"", - "litematica.gui.title.material_list.placement": "Список материалов размещения \"%s\"", - "litematica.gui.title.material_list.schematic": "Список материалов схемы \"%s\" (регион %s из %s)", - "litematica.gui.title.material_list.select_schematic_regions": "Выберите подрегионы для списка материалов \"%s\"", - "litematica.gui.title.rename_area_selection": "Переименовать область выделения", - "litematica.gui.title.rename_area_sub_region": "Переименовать подрегион", - "litematica.gui.title.rename_schematic": "Переименовать схему", - "litematica.gui.title.create_schematic_from_selection": "Сохранить текущую выбранную область как схему", - "litematica.gui.title.save_exported_schematic": "Сохранить экспортированную %s \"%s\"", - "litematica.gui.title.save_imported_schematic": "Сохранить импортированную схему", - "litematica.gui.title.save_schematic_from_memory": "Сохранить временную схему в файл", - "litematica.gui.title.save_schematic_filename": "Имя файла схемы", - "litematica.gui.title.schematic_browser": "Просмотр схем", - "litematica.gui.title.schematic_manager": "Менеджер схем", - "litematica.gui.title.schematic_project_manager": "Менеджер проектов УВС", - "litematica.gui.title.schematic_projects.confirm_delete_area": "Подтвердите удаление области", - "litematica.gui.title.schematic_projects.confirm_place_to_world": "Подтвердите размещение в мире", - "litematica.gui.title.schematic_projects.save_new_version": "Сохранение новой версии схемы", - "litematica.gui.title.schematic_projects_browser": "Просмотр проектов УВС", - "litematica.gui.title.schematic_verifier": "Проверка схемы \"%s\"", - "litematica.gui.title.schematic_verifier_errors": "Ошибки проверки схемы", - "litematica.gui.title.task_manager": "Диспетчер задач", - - "litematica.hud.area_selection.box_count": "Регионы: %s", - "litematica.hud.area_selection.dimensions_position": "Габариты: %s - угол 1: %s, угол 2: %s", - "litematica.hud.area_selection.mode.corners": "Углы", - "litematica.hud.area_selection.mode.expand": "Расширение", - "litematica.hud.area_selection.origin": "Привязка: %s", - "litematica.hud.area_selection.selected_area_normal": "Область: %s", - "litematica.hud.area_selection.selected_area_simple": "Область [§6простой режим§r]: %s", - "litematica.hud.area_selection.selected_sub_region": "Подрегион: %s", - "litematica.hud.area_selection.selection_corners_mode": "Тип указания: %s", - - "litematica.hud.delete.target_mode": "Режим удаления: %s", - "litematica.hud.delete.target_mode.area": "Текущая область", - "litematica.hud.delete.target_mode.placement": "Текущее размещение", - - "litematica.hud.misc.easy_place_mode_enabled": "Простой режим размещения §aВкл§r", - "litematica.hud.misc.none_brackets": "<нет>", - "litematica.hud.misc.placement_restriction_mode_enabled": "Ограничение размещения §aвключено§r", - "litematica.hud.misc.render_layer_mode": "Режим слоя: %s - %s", - "litematica.hud.misc.render_layer_mode_all": "Режим слоя: %s", - "litematica.hud.misc.renderer_status": "Отображение: A: %s Блоки: %s B: %s Обводка: %s Области: %s", - "litematica.hud.misc.schematic_paste.data_restore_mode": "Режим восстановления данных: §b%s", - "litematica.hud.misc.schematic_paste.replace_mode": "Замена блоков: %s", - - "litematica.hud.schematic_placement.hover_info.lock_coordinate": "Зафиксировать координату\nЭто позволяет менять другие координаты,\nне затрагивая зафиксированную.", - "litematica.hud.schematic_placement.hover_info.placement_locked": "Это размещение зафиксировано и не может\nбыть изменено без снятия фиксации", - "litematica.hud.schematic_placement.hover_info.placement_modified": "Это размещение было изменено", - "litematica.hud.schematic_placement.hover_info.placement_sub_region_modified": "Подрегион был изменён", - "litematica.hud.schematic_placement.selected_placement": "Размещение", - "litematica.hud.schematic_placement.selected_sub_region": "Подрегион", - "litematica.hud.schematic_placement.sub_region_count": "Подрегионы", - "litematica.hud.schematic_placement.sub_region_modified": "Изменён", - "litematica.hud.schematic_placement.sub_region_origin": "Привязка региона: %s", - "litematica.hud.schematic_placement.sub_regions_modified": "Подрегионы изменены", - - "litematica.hud.selected_mode": "Режим", - - "litematica.hud.schematic_projects.current_version_date": "Дата: %s", - "litematica.hud.schematic_projects.current_version": "Версия: %s/%s - Название: %s", - "litematica.hud.schematic_projects.no_project_open": "<нет открытых проектов>", - "litematica.hud.schematic_projects.no_versions": "<версии отсутствуют>", - "litematica.hud.schematic_projects.origin": "Привязка проекта: %s", - "litematica.hud.schematic_projects.project_name": "Проект: %s", - "litematica.hud.schematic_projects_mode": "§6Управление версиями схемы (УВС)§r", - - "litematica.info.material_list": "- Клавиша списка материалов откроет последний просмотренный список материалов,\n если он был сохранён.\n- Чтобы переключиться на другой список материалов, откройте его\n с помощью соответствующей кнопки в окне настроек размещения\n или в Менеджере схем.\n- Сохранённый/просмотренный список также \"забывается\",\n если меняется размещение выбранной схемы.\n- Если ещё нет последнего просмотренного списка материалов,\n то используется выбранное размещение (при наличии)", - - "litematica.label.alignment.center": "По центру", - "litematica.label.alignment.top_center": "По центру сверху", - - "litematica.label.none_lower": "нет", - "litematica.label.no": "нет", - "litematica.label.yes": "да", - - "litematica.message.error.area_deletion_aborted": "Удаление области привело к ошибке или было прервано", - "litematica.message.error.empty_area_selection": "Пустая облась выделения (без регионов)", - "litematica.message.error.invalid_schematic_name": "Некорректное имя схемы \"%s\"", - "litematica.message.error.no_area_selected": "§cОбласть не выбрана§r", - "litematica.message.error.no_placement_selected": "§cРазмещение не выбрано§r", - "litematica.message.error.only_works_in_single_player": "§cЭто действие работает только в одиночной игре.§r", - "litematica.message.error.move.pending_tasks": "§cНе удаётся запустить операцию перемещения, пока есть незавершённые задачи§r", - "litematica.message.error.placement_paste_outside_world": "Размещение невозможно вставить на текущей позиции, так как оно выходит за границы мира", - "litematica.message.error.schematic_paste_failed": "§cНе удалось вставить схему в мир§r", - "litematica.message.error.schematic_save_failed": "Не удалось сохранить схему в файл \"%s\"", - "litematica.message.error.schematic_save_interrupted": "Сохранение схемы привело к ошибке или было остановлено", - "litematica.message.error.schematic_save_no_area_selected": "§cНе удалось сохранить схему - не выбрана область§r", - - "litematica.message.added_selection_box": "Добавлена новая область выделения на %s", - "litematica.message.area_clear_fail": "§cНе удалось очистить область(и)§r", - "litematica.message.area_cleared": "Область очищена", - "litematica.message.area_filled": "Область заполнена", - "litematica.message.area_fill_fail": "Не удалось заполнить область", - "litematica.message.area_selections.selection_created_from_placement": "Создано новое выделение из размещения \"%s\"", - "litematica.message.easy_place_fail": "§6Действие заблокировано из-за простого режима размещения", - "litematica.message.grabbed_element_for_moving": "Элемент захвачен", - "litematica.message.in_memory_schematic_created": "Создана временная схема \"%s\"", - "litematica.message.material_list.material_cache_cleared": "Кэш материалов очищен", - "litematica.message.material_list_written_to_file": "Список материалов сохранён в файл \"%s\"", - "litematica.message.moved_area_origin": "Точка привязки области изменена с %s → %s", - "litematica.message.moved_selection": "Текущее выделение перемещено с %s → %s", - "litematica.message.paste_with_servux": "§6Место размещения загружается в Servux для вставки.", - "litematica.message.placement.cant_modify_is_locked": "§cРазмещение зафиксировано и не может быть перемещено§r", - "litematica.message.placement.moved_placement_origin": "Точка привязки изменена с %s → %s", - "litematica.message.placement.moved_subregion_to": "Подрегион перемещён на %s", - "litematica.message.placement_restriction_fail": "§6Действие заблокировано включённым режимом ограничения размещения (PlacementRestriction)", - "litematica.message.removed_area_origin": "Точка привязки региона удалена", - "litematica.message.removed_selection_box": "Подрегион %s удалён", - "litematica.message.scheduled_task_added": "Добавлена отложенная задача...", - "litematica.message.schematic_exported_as": "Схема сохранена как \"%s\"", - "litematica.message.schematic_pasted": "Схема вставлена в мир", - "litematica.message.schematic_pasted_using_world_edit": "Схема вставлена с использованием §b%s§r команд //set для World Edit", - "litematica.message.schematic_pasted_using_fill_and_setblock": "Схема вставлена с использованием §b%s§r команд /fill и §b%s§r команд /setblock", - "litematica.message.schematic_pasted_using_setblock": "Схема вставлена с использованием %s команд /setblock", - "litematica.message.schematic_placement_created": "Создано расположение для \"%s\"", - "litematica.message.schematic_preview_cancelled": "Создание миниатюры отменено", - "litematica.message.schematic_read_from_file_success": "Схема загружена из файла \"%s\"", - "litematica.message.schematic_rendering_refreshed": "Отображение схемы перезагружено", - "litematica.message.schematic_saved_as": "Сохранена схема \"%s\"", - "litematica.message.schematic_save_task_created": "Задача сохранения схемы создана", - "litematica.message.set_area_origin": "Точка привязки области установлена на %s", - "litematica.message.set_selection_box_point": "Угол %d установлен на %s", - "litematica.message.toggled": "Переключён %s %s", - "litematica.message.value.on": "Вкл", - "litematica.message.value.off": "Выкл", - - "litematica.message.schematic_projects.project_created": "Создан проект \"%s\"", - "litematica.message.schematic_projects.project_loaded": "Проект \"%s\" загружен", - "litematica.message.schematic_projects.version_saved": "Новая версия (№%s) сохранена как \"%s\"", - - "litematica.message.warn.area_selection.browser_open_in_simple_mode": "Примечание: В настоящее время вы в режиме простого выделения области", - "litematica.message.warn.layer_mode_currently_at": "Примечание: В настоящее время включён режим отображения §f[%s]", - "litematica.message.warn.main_rendering_disabled": "Внимание: В настоящее время отображение всех элементов отключено. Проверьте настройки §f[Визуализация] §6→§f %s§6 или §f[Клавиши] §6→§f %s [%s]", - "litematica.message.warn.schematic_blocks_rendering_disabled": "Внимание: Отображение блоков в схеме в настоящее время отключено. Проверьте настройки §f[Визуализация] §6→§f %s§6 или §f[Клавиши] §6→§f %s [%s]", - "litematica.message.warn.schematic_load_non_litematica": "Предупреждение: При прямой загрузке схем, отличающихся от формата Litematica, созданные размещения не будут постоянными. Кроме того, преобразование типа схемы будет вызывать зависание каждый раз, когда вы её загружаете (особенно для больших схем). Поэтому рекомендуется импортировать схему и сохранить её в формате Litematica через Диспетчер схем, но лучше вставить исходную схему во временный мир с помощью MCEdit или режима вставки в Litematica, а затем создать из неё новую схему Litematica, по возможности используя несколько подрегионов для плотного захвата постройки, где это применимо.", - "litematica.message.warn.schematic_rebuild_placement_not_selected": "Это размещение сейчас не выбрано. Клавиша \"Заменить всё\" работает только с выделенными подрегионами размещения, на которое вы нажимаете. Поэтому, чтобы заменить блоки в конкретном подрегионе, выберите этот подрегион. Чтобы произвести замену во всей схеме (все подрегионы), выберите всё размещение, но не отдельный подрегион. Также блоки будут заменены только в пределах отображаемых слоёв.", - "litematica.message.warn.schematic_rendering_disabled": "Внимание: В настоящее время отображение схемы отключено. Проверьте настройки §f[Визуализация] §6→§f %s§6 или §f[Клавиши] §6→§f %s [%s]", - "litematica.message.warn.schematic_verifier.overlay_disabled": "Внимание: Наложение информации проверки схемы отключено. Проверьте настройки §f[Наложение информации] §6→§f %s§6 (или §f[Клавиши] §6→§f %s [%s]§6)", - - "litematica.message.warning.invalid_number": "Некорректный ввод числа \"%s\"", - "litematica.message.warning.schematic_projects_hidden": "Внимание: Система управления версиями схемы (УВС) скрыта. Вам НЕ следует её использовать, если вы не знаете, каким образом она работает и меняет поведение мода. Она предназначена для работы в местах, где требуется быстрое переключение по итерациям между разными версиями постройки (=удаление предыдущей версии и её замена новой). Если вы хотите её использовать, включите настройку [Основные] → unhideSchematicVCS", - - "litematica.warning.area_editor.area_rendering_disabled": "Примечание: В настоящее время отображение регионов областей выделения отключено. Проверьте настройки §f[Визуализация] §6→§f %s§6 или §f[Клавиши] §6→§f %s [%s]", - - "litematica.tool_hud.block_1": "Блок: %s", - "litematica.tool_hud.block_2": "Заменяемый блок: %s", - "litematica.tool_hud.facing": "направление: %s", - - "litematica.tool_mode.name.area_selection": "Выбор области", - "litematica.tool_mode.name.delete": "Удаление", - "litematica.tool_mode.name.fill": "Заполнение", - "litematica.tool_mode.name.grid_paste": "Вставка схемы в мир по сетке", - "litematica.tool_mode.name.move": "Перемещение", - "litematica.tool_mode.name.paste_schematic": "Вставка схемы в мир", - "litematica.tool_mode.name.rebuild": "Редактирование схемы", - "litematica.tool_mode.name.replace_block": "Замена блока", - "litematica.tool_mode.name.schematic_placement": "Размещение схемы" -} diff --git a/src/main/resources/assets/forgematica/lang/uk_ua.json b/src/main/resources/assets/forgematica/lang/uk_ua.json deleted file mode 100644 index f2aeb36..0000000 --- a/src/main/resources/assets/forgematica/lang/uk_ua.json +++ /dev/null @@ -1,443 +0,0 @@ -{ - "litematica.error.area_selection.copy_failed": "Не вдалося скопіювати виділення", - "litematica.error.area_selection.create_failed": "Не вдалося створити новий вибір під назвою «%s», файл уже існує", - "litematica.error.area_selection.failed_to_load": "Не вдалося завантажити вибрану область", - "litematica.error.area_selection.grow.no_sub_region_selected": "Субрегіон не вибрано!", - "litematica.error.area_selection.no_placement_selected": "Розташування схеми не вибрано!", - "litematica.error.area_selection.rename.already_exists": "Помилка: область із назвою файлу «%s» уже існує", - "litematica.error.area_selection.rename.invalid_safe_file_name": "Недійсна згенерована безпечна назва файлу \"%s\"", - "litematica.error.duplicate_schematic_placement": "Помилка. Спроба додати місце розташування, яке вже існує", - "litematica.error.generic.creative_mode_only": "Ця дія доступна лише в творчому режимі", - "litematica.error.generic.failed_to_delete_file": "Не вдалося видалити файл \"%s\"", - "litematica.error.generic.failed_to_sort_list_of_ignored_states": "Не вдалося сортувати список ігнорованих станів", - "litematica.error.generic.schematic_world_not_loaded": "Світ схем не завантажився", - "litematica.error.area_editor.create_sub_region.exists": "Субрегіон під назвою \"%s\" вже існує", - "litematica.error.area_editor.no_selection": "Немає активних вибраних областей", - "litematica.error.area_editor.open_gui.no_selection": "Зараз у режимі виділення: нормально, але наразі жодна область не виділена", - "litematica.error.area_editor.rename_sub_region.exists": "Не вдалося перейменувати субрегіон:\n", - "litematica.error.area_editor.switch_mode.no_selection": "Неможливо перейти в режим виділення: нормальний, оскільки наразі не виділено жодної області.\n", - "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_create_schematic": "Не вдалося створити схему Litematica", - "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_read_schematic": "Не вдалося завантажити схему", - "litematica.error.schematic_conversion.structure_to_litematica_failed": "Не вдалося перетворити структуру на схему Litematica", - "litematica.error.schematic.create.no_selections": "Немає дійсних регіонів вибору!", - "litematica.error.schematic_load.cant_read_file": "Не вдається прочитати файл схеми \"%s\" (не існує або проблема з дозволом)", - "litematica.error.schematic_load.no_schematic_selected": "Файл схеми не вибрано!", - "litematica.error.schematic_load.no_schematic_version_information": "На схемі немає інформації про версію, і її неможливо безпечно завантажити!", - "litematica.error.schematic_load.unsupported_schematic_version": "Непідтримувана або майбутня версія схеми \"%d\"", - "litematica.error.schematic_load.unsupported_type": "Невідомий або непідтримуваний тип файлу для \"%s\"", - "litematica.error.schematic_manager.schematic_export.unsupported_type": "Тільки схеми Litematica можна експортувати в інші формати!", - "litematica.error.schematic_manager.schematic_import.unsupported_type": "Вибраний тип схеми не підтримується для імпорту!", - "litematica.error.schematic_placements.remove_fail_locked": "Розміщення заблоковано!\n", - "litematica.error.schematic_save.directory_doesnt_exist": "Такого каталогу немає: \"%s\"", - "litematica.error.schematic_save.file_already_exists": "Файл '%s' вже існує", - "litematica.error.schematic_save.invalid_directory": "Недійсний каталог \"%s\"", - "litematica.error.schematic_save.invalid_schematic_name": "Недійсна назва схеми \"%s\"", - "litematica.error.schematic_save.schematic_creation_failed": "Не вдалося створити схему!", - "litematica.error.schematic_read_from_file_failed.cant_read": "Не вдалося прочитати схему з файлу \"%s\"", - "litematica.error.schematic_read_from_file_failed.exception": "Виняток під час спроби прочитати схему з файлу \"%s\"", - "litematica.error.schematic_read_from_file_failed.no_file": "Не вдалося прочитати схему з файлу: файл відсутній (схема в пам’яті?)", - "litematica.error.schematic_projects.empty_selection": "Вибрана порожня область (0 субрегіонів)", - "litematica.error.schematic_projects.failed_to_load_project": "Не вдалося завантажити проект", - "litematica.error.schematic_projects.failed_to_load_schematic": "Не вдалося завантажити схему для поточної версії", - "litematica.error.schematic_projects.failed_to_rename_project_file_exception": "Не вдалося перейменувати файл проекту на \"%s\" (виняток)", - "litematica.error.schematic_projects.failed_to_rename_project_file_exists": "Неможливо перейменувати проект на \"%s\", файл уже існує", - "litematica.error.schematic_projects.invalid_project_directory": "Недійсний або неіснуючий каталог проекту", - "litematica.error.schematic_projects.no_project_open": "Немає відкритих проектів", - "litematica.error.schematic_projects.in_projects_mode_but_no_project_open": "Зараз у режимі Schematic VCS, але наразі немає відкритого проекту", - "litematica.error.schematic_projects.null_player": "Гравець був нульовим", - "litematica.error.schematic_projects.project_already_exists": "Проект \"%s\" вже існує", - "litematica.error.schematic_projects.save_already_in_progress": "Збереження вже триває", - "litematica.error.schematic_write_to_file_failed.directory_creation_failed": "Не вдалося створити каталог схем \"%s\"", - "litematica.error.schematic_write_to_file_failed.exception": "Не вдалося записати схему у файл \"%s\" (виняток)", - "litematica.error.schematic_write_to_file_failed.exists": "Не вдалося записати схему у файл \"%s\", файл уже існує", - "litematica.error.structure_write_to_file_failed.exception": "Не вдалося записати структуру у файл \"%s\" (виняток)", - "litematica.error.structure_write_to_file_failed.exists": "Не вдалося записати структуру у файл \"%s\", файл уже існує", - "litematica.hotkeys.category.generic_hotkeys": "Загальні гарячі клавіші", - "litematica.info.schematic_load.schematic_loaded": "Схема '%s' успішно завантажена в пам'ять", - "litematica.info.schematic_manager.preview.right_click_to_cancel": "- Натисніть кнопку правою кнопкою миші, щоб скасувати незавершену операцію попереднього перегляду\n", - "litematica.info.schematic_manager.preview.set_preview_by_taking_a_screenshot": "Використовуйте звичайну клавішу знімка екрана, щоб налаштувати попередній перегляд.\n", - "litematica.info.schematic_manager.preview.success": "Попередній перегляд зображення успішно встановлено", - "litematica.gui.button.area_editor.analyze_area": "Проаналізуйте область", - "litematica.gui.button.area_editor.change_corner_mode": "Кутовий режим: %s", - "litematica.gui.button.area_editor.change_selection_mode": "Режим вибору: %s", - "litematica.gui.button.area_editor.create_schematic": "Зберегти схему", - "litematica.gui.button.area_editor.create_sub_region": "Новий субрегіон", - "litematica.gui.button.area_editor.origin_enabled": "Початок вручну: %s", - "litematica.gui.button.area_editor.set_box_name": "Встановити", - "litematica.gui.button.area_editor.set_selection_name": "встановити", - "litematica.gui.button.area_selection_mode": "Режим вибору області: %s", - "litematica.gui.button.area_selections.create_directory": "Створити каталог", - "litematica.gui.button.area_selections.create_new_selection": "Новий вибір", - "litematica.gui.button.area_selections.create_selection_from_placement": "Від розміщення", - "litematica.gui.button.area_selections.unselect": "Скасувати вибір", - "litematica.gui.button.change_menu.area_editor": "Редактор області", - "litematica.gui.button.change_menu.configuration_menu": "Меню конфігурації", - "litematica.gui.button.change_menu.load_schematics_to_memory": "Схеми навантаження", - "litematica.gui.button.change_menu.schematic_manager": "Менеджер схем", - "litematica.gui.button.change_menu.schematic_projects_manager": "Схематична СВК", - "litematica.gui.button.change_menu.show_area_selections": "Браузер вибору області", - "litematica.gui.button.change_menu.show_loaded_schematics": "Завантажені схеми", - "litematica.gui.button.change_menu.show_schematic_placements": "Схематичне розміщення", - "litematica.gui.button.change_menu.task_manager": "Диспетчер задач", - "litematica.gui.button.change_menu.to_main_menu": "Меню Litematica", - "litematica.gui.button.config_gui.colors": "Кольори", - "litematica.gui.button.config_gui.generic": "Загальні", - "litematica.gui.button.config_gui.hotkeys": "Гарячі клавіші", - "litematica.gui.button.config_gui.info_overlays": "Інформаційні накладки", - "litematica.gui.button.config_gui.render_layers": "Рендеринг шарів", - "litematica.gui.button.config_gui.visuals": "Візуальні матеріали", - "litematica.gui.button.hover.area_editor.shift_for_in_memory": "Утримуйте Shift, щоб створити схему лише в пам’яті", - "litematica.gui.button.hover.area_selections.unselect": "Скасовує виділення поточної області", - "litematica.gui.button.hover.material_list.clear_cache": "Очищає кеш матеріалів\n", - "litematica.gui.button.hover.material_list.write_hold_shift_for_csv": "Утримуйте Shift для запису у файл CSV,\n", - "litematica.gui.button.hover.material_list_shift_to_select_sub_regions": "Утримуйте Shift, щоб вибрати підрегіони, які використовуються для списку матеріалів", - "litematica.gui.button.hover.plus_minus_tip": "Клацніть лівою кнопкою миші, щоб збільшити\n", - "litematica.gui.button.hover.plus_minus_tip_ctrl_alt_shift": "Клацніть лівою кнопкою миші, щоб збільшити\n", - "litematica.gui.button.hover.schematic_list.reload_schematic": "Перезавантажує схему з файлу.\n", - "litematica.gui.button.hover.schematic_projects.area_browser_disabled_currently_in_projects_mode": "Наразі відкритий проект Schematic VCS.\n", - "litematica.gui.button.hover.schematic_projects.delete_area": "§6Видалити останню розміщену або збережену область§r", - "litematica.gui.button.hover.schematic_projects.menu_warning": "(Раніше це називалося схематичними проектами.)\n", - "litematica.gui.button.hover.schematic_projects.move_origin_to_player": "Перемістити джерело проекту до поточної позиції гравця\n", - "litematica.gui.button.hover.schematic_projects.place_to_world_warning": "§6Попередження: це призведе до видалення/перезапису поточних блоків\n", - "litematica.gui.button.hover.schematic_projects.save_new_version": "Зберігає нову схему/версію поточного проекту", - "litematica.gui.button.material_list": "Список матеріалів", - "litematica.gui.button.material_list.clear_cache": "Очистити кеш", - "litematica.gui.button.material_list.clear_ignored": "Очистити проігноровано", - "litematica.gui.button.material_list.hide_available": "Приховати доступні: %s", - "litematica.gui.button.material_list.ignore": "Ігнорувати", - "litematica.gui.button.material_list.list_type": "Показати: %s", - "litematica.gui.button.material_list.refresh_list": "Оновити", - "litematica.gui.button.material_list.toggle_info_hud": "Інформація HUD: %s", - "litematica.gui.button.material_list.write_to_file": "Записати в файл", - "litematica.gui.button.placement_sub.placement_configuration": "Конфігурація розміщення", - "litematica.gui.button.placement_sub.reset_sub_region_placement": "Скинути субрегіон", - "litematica.gui.button.placement_sub.slice_type": "Фрагмент: %s", - "litematica.gui.button.schematic_manager.export_as": "Експортувати як:", - "litematica.gui.button.schematic_placement.abbr.rendering": "Р", - "litematica.gui.button.schematic_placement.ignore_entities": "Ігнорувати сутності: %s", - "litematica.gui.button.schematic_placement.region_enabled": "Регіон: %s", - "litematica.gui.button.schematic_placement.reset_sub_region_placements": "Скинути всі підрегіони", - "litematica.gui.button.schematic_placement.toggle_all_off": "Усі §cOFF§r", - "litematica.gui.button.schematic_placement.toggle_all_on": "Усі §аОН§р", - "litematica.gui.button.schematic_placement.hover.enclosing_box": "Візуалізація охоплюючої коробки: %s", - "litematica.gui.button.schematic_placement.hover.lock": "Блокування розташування запобігає переміщенню або\n", - "litematica.gui.button.schematic_placement.hover.rendering": "Візуалізація: %s\n", - "litematica.gui.button.schematic_placements.configure": "Налаштувати", - "litematica.gui.button.schematic_placements.disable": "Вимкнути", - "litematica.gui.button.schematic_placements.locked": "Заблоковано: %s", - "litematica.gui.button.schematic_placements.placement_enabled": "Розміщення: %s", - "litematica.gui.button.schematic_placements.remove": "видалити", - "litematica.gui.button.schematic_placements.rendering_enabled": "Візуалізація: %s", - "litematica.gui.button.schematic_placements.select": "Виберіть", - "litematica.gui.button.schematic_projects.close_project": "Закрити поточний проект", - "litematica.gui.button.schematic_projects.create_project": "Створити проект", - "litematica.gui.button.schematic_projects.delete_area": "Видалити область", - "litematica.gui.button.schematic_projects.load_project": "Завантажити проект", - "litematica.gui.button.schematic_projects.move_origin_to_player": "Перейти до гравця", - "litematica.gui.button.schematic_projects.open_area_editor": "Редактор області", - "litematica.gui.button.schematic_projects.open_manager_gui": "Відкрийте менеджер", - "litematica.gui.button.schematic_projects.open_project_browser": "Браузер проектів VCS", - "litematica.gui.button.schematic_projects.place_to_world": "Місце для світу", - "litematica.gui.button.schematic_projects.save_version": "Зберегти версію", - "litematica.gui.button.schematic_verifier.ignore": "Ігнорувати", - "litematica.gui.button.schematic_verifier.range_type": "Діапазон: %s", - "litematica.gui.button.schematic_verifier.reset_ignored": "Скидання проігноровано", - "litematica.gui.button.schematic_verifier.reset_verifier": "Скидання даних", - "litematica.gui.button.schematic_verifier.resume": "Відновити перевірку", - "litematica.gui.button.schematic_verifier.start": "Почніть перевірку", - "litematica.gui.button.schematic_verifier.stop": "Зупинити перевірку", - "litematica.gui.button.schematic_verifier.toggle_info_hud": "Інформація HUD: %s", - "litematica.gui.button.cancel": "Скасувати", - "litematica.gui.button.configure": "Налаштувати", - "litematica.gui.button.copy": "Копія", - "litematica.gui.button.create_directory": "Створити новий каталог", - "litematica.gui.button.create_placement": "Створити розміщення", - "litematica.gui.button.delete": "Видалити", - "litematica.gui.button.disable": "Вимкнути", - "litematica.gui.button.enable": "Увімкнути", - "litematica.gui.button.import": "Імпорт", - "litematica.gui.button.load_schematic_to_memory": "Схема навантаження", - "litematica.gui.button.mirror_value": "Дзеркало: %s", - "litematica.gui.button.move_to_player": "Перейти до гравця", - "litematica.gui.button.ok": "В порядку", - "litematica.gui.button.reload": "Перезавантажити", - "litematica.gui.button.remove": "видалити", - "litematica.gui.button.remove_placement": "Вилучити розміщення", - "litematica.gui.button.rename": "Перейменувати", - "litematica.gui.button.rotation_value": "Обертання: %s", - "litematica.gui.button.save_new_schematic_version": "Зберегти версію", - "litematica.gui.button.save_schematic": "Зберегти схему", - "litematica.gui.button.save_to_file": "Зберегти у файл", - "litematica.gui.button.schematic_verifier": "Перевірка схеми", - "litematica.gui.button.set_preview": "Налаштувати попередній перегляд", - "litematica.gui.button.tool_mode": "Режим інструменту: %s", - "litematica.gui.button.unload": "Розвантажити", - "litematica.gui.button.unlocked": "Розблоковано", - "litematica.gui.label.area_editor.box_name": "Назва вікна субрегіону", - "litematica.gui.label.area_editor.selection_name": "Назва вибору", - "litematica.gui.label.area_editor.corner_1": "Кут 1", - "litematica.gui.label.area_editor.corner_2": "Кут 2", - "litematica.gui.label.area_editor.origin": "Походження", - "litematica.gui.label.area_editor.dimensions": "Розміри", - "litematica.gui.label.area_editor.pos1": "Кут 1", - "litematica.gui.label.area_editor.pos2": "Кут 2", - "litematica.gui.label.area_editor.sub_regions": "Субрегіони (%s)", - "litematica.gui.label.area_selection_manager.current_selection": "Вибрана область: %s", - "litematica.gui.label.area_selection_box_count": "Коробки: %d", - "litematica.gui.label.area_selection_origin": "Походження: %s", - "litematica.gui.label.area_selection.mode.normal": "нормальний", - "litematica.gui.label.area_selection.mode.simple": "просто", - "litematica.gui.label.block_info.state_client": "Стан блоку світу клієнта", - "litematica.gui.label.block_info.state_schematic": "Схематичний блочний стан світу", - "litematica.gui.label.block_info_list_type.all": "все", - "litematica.gui.label.block_info_list_type.render_layers": "Рендеринг шарів", - "litematica.gui.label.easy_place_protocol.auto": "Авто", - "litematica.gui.label.easy_place_protocol.none": "Жодного", - "litematica.gui.label.easy_place_protocol.slabs_only": "Тільки плити", - "litematica.gui.label.easy_place_protocol.v2": "Версія 2", - "litematica.gui.label.easy_place_protocol.v3": "Версія 3", - "litematica.gui.label.loaded_schematic.modified_on": "§6 Змінено %s§r", - "litematica.gui.label.material_list.abbr.shulker_box": "SB", - "litematica.gui.label.material_list.title.available": "в наявності", - "litematica.gui.label.material_list.title.item": "Пункт", - "litematica.gui.label.material_list.title.missing": "Відсутня", - "litematica.gui.label.material_list.title.total": "Всього", - "litematica.gui.label.material_list.multiplier": "Множник:", - "litematica.gui.label.material_list.name": "Ім'я", - "litematica.gui.label.material_list.progress": "Прогрес: %s", - "litematica.gui.label.material_list.progress.done": "Готово %s", - "litematica.gui.label.material_list.progress.mismatch": "Невідповідність %s", - "litematica.gui.label.material_list.progress.missing": "Відсутній %s", - "litematica.gui.label.material_list.total": "Усього: %s елементів", - "litematica.gui.label.origin.auto": "Авто", - "litematica.gui.label.origin.manual": "Інструкція", - "litematica.gui.label.paste_nbt_behavior.none": "Жодного", - "litematica.gui.label.paste_nbt_behavior.place_data_modify": "Місце", - "litematica.gui.label.paste_nbt_behavior.place_clone": "Місце", - "litematica.gui.label.placement_sub.region_name": "Назва регіону: %s", - "litematica.gui.label.placement_sub.region_position": "Положення регіону", - "litematica.gui.label.placement_sub.region_size": "Розмір регіону: %s", - "litematica.gui.label.placement_settings.placement_origin": "Походження розміщення", - "litematica.gui.label.render_layers.hotkey": "Гаряча клавіша", - "litematica.gui.label.render_layers.hover.hotkey": "Гарячі клавіші наступного/попереднього шару впливатимуть на цю межу.\n", - "litematica.gui.label.replace_behavior.all": "все", - "litematica.gui.label.replace_behavior.none": "Жодного", - "litematica.gui.label.replace_behavior.with_non_air": "З не повітря", - "litematica.gui.label.schematic_info.schematic_author": "Схема за: §f%s§r", - "litematica.gui.label.schematic_info.description": "Опис:", - "litematica.gui.label.schematic_info.enclosing_size": "Розмір вкладення:", - "litematica.gui.label.schematic_info.enclosing_size_value": "Розмір вкладення: §f%s§r", - "litematica.gui.label.schematic_info.name": "Ім'я:", - "litematica.gui.label.schematic_info.region_count": "Регіони: §f%d§r", - "litematica.gui.label.schematic_info.time_created": "Створено: §f%s§r", - "litematica.gui.label.schematic_info.time_modified": "Змінено: §f%s§r", - "litematica.gui.label.schematic_info.total_blocks": "Всього блоків: §f%d§r", - "litematica.gui.label.schematic_info.total_blocks_and_volume": "Блоки/Обсяг: §f%d§r/§f%d§r", - "litematica.gui.label.schematic_info.total_volume": "Загальний обсяг: §f%d§r блоків", - "litematica.gui.label.schematic_load.checkbox.create_placement": "Створіть місце розташування", - "litematica.gui.label.schematic_load.hoverinfo.create_placement": "Негайно створіть нове місце розташування\n", - "litematica.gui.label.schematic_placement.enclosing_size": "Розмір вкладення: %s", - "litematica.gui.label.schematic_placement.hoverinfo.hold_shift_to_create_as_disabled": "Утримуйте Shift, щоб вимкнути розміщення під час створення", - "litematica.gui.label.schematic_placement.in_memory": "ЛИШЕ В ПАМ'ЯТІ", - "litematica.gui.label.schematic_placement.origin": "Походження: %s", - "litematica.gui.label.schematic_placement.rename_placement": "Перейменувати місце розташування:", - "litematica.gui.label.schematic_placement.schematic_file": "Файл: %s", - "litematica.gui.label.schematic_placement.schematic_name": "Схема: %s", - "litematica.gui.label.schematic_placement.sub_region_count": "Субрегіони: %s", - "litematica.gui.label.schematic_placement.sub_regions": "Субрегіони (%s):", - "litematica.gui.label.schematic_projects.currently_open_project": "Зараз відкритий проект: %s", - "litematica.gui.label.schematic_projects.origin": "Походження:", - "litematica.gui.label.schematic_projects.project": "Демонструвати:", - "litematica.gui.label.schematic_projects.version": "Версія: %s (з %s)", - "litematica.gui.label.schematic_projects.version_entry": "Ver. ", - "litematica.gui.label.schematic_projects.version_name": "Назва версії:", - "litematica.gui.label.schematic_save.checkbox.ignore_entities": "Ігнорувати сутності", - "litematica.gui.label.schematic_save.hoverinfo.hold_shift_to_overwrite": "Утримуйте Shift, щоб перезаписати наявний файл", - "litematica.gui.label.schematic_verifier.count": "Рахувати", - "litematica.gui.label.schematic_verifier.expected": "Очікуваний", - "litematica.gui.label.schematic_verifier.found": "знайдено", - "litematica.gui.label.schematic_verifier_display_type.all": "Усі (не проігноровані)", - "litematica.gui.label.schematic_verifier_display_type.correct_state": "Правильний стан", - "litematica.gui.label.schematic_verifier_display_type.extra": "Додаткові блоки", - "litematica.gui.label.schematic_verifier_display_type.missing": "Відсутні блоки", - "litematica.gui.label.schematic_verifier_display_type.wrong_blocks": "Неправильні блоки", - "litematica.gui.label.schematic_verifier_display_type.wrong_state": "Неправильні держави", - "litematica.gui.label.schematic_verifier.status.done_errors": "Неправильно: §cБлок: %s§r, §6Стан: %s§r, §bВідсутній: %s§r, §dДодатково: %s§r", - "litematica.gui.label.schematic_verifier.status.done_correct_total": "§aПравильно: %s§r, Усього: %s", - "litematica.gui.label.schematic_verifier.status.verifying": "Невидимі фрагменти: %s / %s", - "litematica.gui.label.schematic_verifier.verifier": "Перевірка схеми", - "litematica.gui.label.task.title.remaining_chunks": "%s, залишилися фрагменти (%s)", - "litematica.gui.label.task_name.area_analyzer": "Аналізатор площ", - "litematica.gui.label.task_name.delete": "Видалити завдання", - "litematica.gui.label.task_name.fill": "Заповнити завдання", - "litematica.gui.label.task_name.material_list": "Список матеріалів", - "litematica.gui.label.task_name.paste": "Вставити схему", - "litematica.gui.label.task_name.save_schematic": "Зберегти схему", - "litematica.gui.label.task_name.verifier": "Верифікатор", - "litematica.gui.message.confirm_file_deletion": "Ви бажаєте видалити файл \"%s\"?", - "litematica.gui.message.schematic_projects.confirm_delete_area": "Ви бажаєте видалити «останню уражену» область?\n", - "litematica.gui.message.schematic_projects.confirm_place_to_world": "Ви хочете оприлюднити цю версію?\n", - "litematica.gui.title.area_editor_normal": "Редактор області (звичайний режим/режим із кількома ящиками)", - "litematica.gui.title.area_editor_normal_schematic_projects": "Редактор областей (§6§lSchematic VCS area§r)", - "litematica.gui.title.area_editor_simple": "Редактор області (простий режим)", - "litematica.gui.title.area_editor_sub_region": "Редактор області (субрегіон)", - "litematica.gui.title.area_editor.sub_region_name": "Назва субрегіону", - "litematica.gui.title.area_selection_manager": "Менеджер з вибору району", - "litematica.gui.title.configure_schematic_placement": "Налаштувати розташування схеми", - "litematica.gui.title.configure_schematic_sub_region": "Налаштувати підрегіон розміщення", - "litematica.gui.title.configs": "Конфігурації %s - %s", - "litematica.gui.title.confirm_file_deletion": "Підтвердити видалення файлу", - "litematica.gui.title.copy_area_selection": "Копіювати виділення області \"%s\"", - "litematica.gui.title.create_area_selection": "Створіть нове виділення області", - "litematica.gui.title.create_area_selection_from_placement": "Створіть нову область виділення зі схеми розташування", - "litematica.gui.title.create_directory": "Створіть новий каталог", - "litematica.gui.title.create_in_memory_schematic": "Створіть схему в пам'яті", - "litematica.gui.title.create_schematic_project": "Створіть новий схематичний проект", - "litematica.gui.title.litematica_main_menu": "Litematica %s", - "litematica.gui.title.load_schematic": "Схема навантаження", - "litematica.gui.title.manage_loaded_schematics": "Керуйте завантаженими схемами", - "litematica.gui.title.manage_schematic_placements": "Керуйте схематичними розміщеннями", - "litematica.gui.title.material_list.area_analyzer": "Аналіз області для вибору \"%s\"", - "litematica.gui.title.material_list.placement": "Список матеріалів для розміщення \"%s\"", - "litematica.gui.title.material_list.schematic": "Список матеріалів для схеми \"%s\" (%s з %s регіонів)", - "litematica.gui.title.material_list.select_schematic_regions": "Виберіть підрегіони для списку матеріалів для «%s»", - "litematica.gui.title.rename_area_selection": "Перейменувати виділену область", - "litematica.gui.title.rename_area_sub_region": "Перейменувати підрегіон", - "litematica.gui.title.rename_schematic": "Перейменувати схему", - "litematica.gui.title.create_schematic_from_selection": "Збережіть поточну вибрану область як схему", - "litematica.gui.title.save_exported_schematic": "Зберегти експортований %s з \"%s\"", - "litematica.gui.title.save_imported_schematic": "Збережіть імпортовану схему", - "litematica.gui.title.save_schematic_from_memory": "Збережіть схему в пам'яті у файл", - "litematica.gui.title.save_schematic_filename": "Назва файлу схеми", - "litematica.gui.title.schematic_browser": "Переглядач схем", - "litematica.gui.title.schematic_manager": "Менеджер схем", - "litematica.gui.title.schematic_project_manager": "Менеджер проекту VCS", - "litematica.gui.title.schematic_projects.confirm_delete_area": "Підтвердьте Видалити область", - "litematica.gui.title.schematic_projects.confirm_place_to_world": "Підтвердьте дію «Місце до світу».", - "litematica.gui.title.schematic_projects.save_new_version": "Зберегти нову версію схеми", - "litematica.gui.title.schematic_projects_browser": "Переглядач схемних проектів VCS", - "litematica.gui.title.schematic_verifier": "Перевірка схеми для \"%s\"", - "litematica.gui.title.schematic_verifier_errors": "Помилки верифікатора схеми", - "litematica.gui.title.task_manager": "Диспетчер задач", - "litematica.hud.area_selection.box_count": "Коробки: %s", - "litematica.hud.area_selection.dimensions_position": "Dim: %s - p1: %s, p2: %s", - "litematica.hud.area_selection.mode.corners": "Кути", - "litematica.hud.area_selection.mode.expand": "Розгорнути", - "litematica.hud.area_selection.origin": "Походження: %s", - "litematica.hud.area_selection.selected_area_normal": "Область: %s", - "litematica.hud.area_selection.selected_area_simple": "Область [§6Простий режим§r]: %s", - "litematica.hud.area_selection.selected_sub_region": "Субрегіон: %s", - "litematica.hud.area_selection.selection_corners_mode": "Режим кутів: %s", - "litematica.hud.delete.target_mode": "Видалити цільовий режим: %s", - "litematica.hud.delete.target_mode.area": "Поточна площа", - "litematica.hud.delete.target_mode.placement": "Поточне розміщення", - "litematica.hud.misc.easy_place_mode_enabled": "Режим Easy Place §aON§r", - "litematica.hud.misc.none_brackets": "", - "litematica.hud.misc.placement_restriction_mode_enabled": "Режим обмеження розміщення §aON§r", - "litematica.hud.misc.render_layer_mode": "Режим шару: %s - %s", - "litematica.hud.misc.render_layer_mode_all": "Режим шару: %s", - "litematica.hud.misc.renderer_status": "Рендерери: A: %s S: %s B: %s O: %s SEL: %s", - "litematica.hud.misc.schematic_paste.data_restore_mode": "Режим відновлення даних: §b%s", - "litematica.hud.misc.schematic_paste.replace_mode": "Замінити блоки: %s", - "litematica.hud.schematic_placement.hover_info.lock_coordinate": "Зафіксуйте цю координату\n", - "litematica.hud.schematic_placement.hover_info.placement_locked": "Це місце розташування заблоковано і не може\n", - "litematica.hud.schematic_placement.hover_info.placement_modified": "Це розташування було змінено", - "litematica.hud.schematic_placement.hover_info.placement_sub_region_modified": "Цей субрегіон було змінено", - "litematica.hud.schematic_placement.selected_placement": "Розміщення", - "litematica.hud.schematic_placement.selected_sub_region": "Субрегіон", - "litematica.hud.schematic_placement.sub_region_count": "Регіони", - "litematica.hud.schematic_placement.sub_region_modified": "Змінено", - "litematica.hud.schematic_placement.sub_region_origin": "Регіон походження: %s", - "litematica.hud.schematic_placement.sub_regions_modified": "Регіони змінені", - "litematica.hud.selected_mode": "Режим", - "litematica.hud.schematic_projects.current_version_date": "Дата: %s", - "litematica.hud.schematic_projects.current_version": "Версія: %s/%s - назва: %s", - "litematica.hud.schematic_projects.no_project_open": "", - "litematica.hud.schematic_projects.no_versions": "", - "litematica.hud.schematic_projects.origin": "Походження проекту: %s", - "litematica.hud.schematic_projects.project_name": "Проект: %s", - "litematica.hud.schematic_projects_mode": "§6 Схематичний режим VCS§r", - "litematica.info.material_list": "- Гаряча клавіша «Список матеріалів» відкриває останній переглянутий список матеріалів,\n ", - "litematica.label.alignment.center": "Центр", - "litematica.label.alignment.top_center": "Верхній центр", - "litematica.label.none_lower": "немає", - "litematica.label.no": "Ні", - "litematica.label.yes": "Так", - "litematica.message.error.area_deletion_aborted": "Видалення області перервано або скасовано", - "litematica.message.error.empty_area_selection": "Вибір порожньої області (без полів)", - "litematica.message.error.invalid_schematic_name": "Недійсна назва схеми \"%s\"", - "litematica.message.error.no_area_selected": "§cОбласть не вибрана§r", - "litematica.message.error.no_placement_selected": "§cРозташування не вибрано§r", - "litematica.message.error.only_works_in_single_player": "§cЦя операція працює лише в одиночній грі§r", - "litematica.message.error.move.pending_tasks": "§cНеможливо розпочати операцію переміщення, поки є незавершені завдання§r", - "litematica.message.error.placement_paste_outside_world": "Розташування не можна вставити в поточну позицію, оскільки воно виходить за межі світу", - "litematica.message.error.schematic_paste_failed": "§cНе вдалося вставити схему у світ§r", - "litematica.message.error.schematic_save_failed": "Не вдалося зберегти схему у файл \"%s\"", - "litematica.message.error.schematic_save_interrupted": "Збереження схеми перервано або зупинено", - "litematica.message.error.schematic_save_no_area_selected": "§cНе вдалося зберегти схему - область не вибрана§r", - "litematica.message.warn.pickblock.no_suitable_slot_found": "Не знайдено відповідного слота гарячої панелі для блокування вибору!\\nПеревірте конфігурацію Generic -> §epickBlockableSlots§r.\\nКрім того, залежно від конфігурації §epickBlockAvoid*§6, функція блокування вибору може відмовитися замінити будь-які інструменти чи інші пошкоджені елементи в цих слотах.", - "litematica.message.warn.pickblock.no_valid_slots_configured": "У конфігурації Generic -> §epickBlockableSlots§6 не встановлено слоти гарячої панелі!", - "litematica.message.added_selection_box": "Додано нове поле вибору в %s", - "litematica.message.area_clear_fail": "§cНе вдалося очистити область(і)§r", - "litematica.message.area_cleared": "Територія очищена", - "litematica.message.area_filled": "Площа заповнена", - "litematica.message.area_fill_fail": "Не вдалося заповнити область", - "litematica.message.area_selections.selection_created_from_placement": "Створено новий вибір із розташування \"%s\"", - "litematica.message.easy_place_fail": "§6Дії заборонено режимом Easy Place", - "litematica.message.grabbed_element_for_moving": "Взяв елемент для переміщення", - "litematica.message.in_memory_schematic_created": "Створено схему в пам'яті як \"%s\"", - "litematica.message.material_list.material_cache_cleared": "Кеш матеріалів очищено", - "litematica.message.material_list_written_to_file": "Список матеріалів, записаний у файл \"%s\"", - "litematica.message.moved_area_origin": "Початкову точку області перенесено з %s => %s", - "litematica.message.moved_selection": "Переміщено поточний вибір із %s => %s", - "litematica.message.paste_with_servux": "§6Місце розміщення завантажується в Servux для вставки", - "litematica.message.placement.cant_modify_is_locked": "§cРозташування заблоковано і не може бути змінено§r", - "litematica.message.placement.moved_placement_origin": "Перенесено джерело розташування з %s => %s", - "litematica.message.placement.moved_subregion_to": "Субрегіон перенесено до %s", - "litematica.message.placement_restriction_fail": "§6Дії запобігає режим обмеження розміщення", - "litematica.message.removed_area_origin": "Видалено явну/ручну початкову точку області", - "litematica.message.removed_selection_box": "Видалено поле вибору %s", - "litematica.message.scheduled_task_added": "Додано заплановане завдання...", - "litematica.message.schematic_exported_as": "Схему експортовано як \"%s\"", - "litematica.message.schematic_pasted": "Схема вставлена ​​у світ", - "litematica.message.schematic_pasted_using_fill_and_setblock": "Схема вставлена ​​за допомогою команд §b%s§r fill і §b%s§r setblock", - "litematica.message.schematic_pasted_using_setblock": "Схема вставлена ​​за допомогою команд §b%s§r setblock", - "litematica.message.schematic_pasted_using_world_edit": "Схему вставлено за допомогою §b%s§r World Edit //налаштування команд", - "litematica.message.schematic_placement_created": "Розташування створено для \"%s\"", - "litematica.message.schematic_preview_cancelled": "Завдання попереднього перегляду скасовано", - "litematica.message.schematic_read_from_file_success": "Схема завантажена з файлу \"%s\"", - "litematica.message.schematic_rendering_refreshed": "Схематичне зображення оновлено", - "litematica.message.schematic_saved_as": "Схему збережено як \"%s\"", - "litematica.message.schematic_save_task_created": "Створено завдання збереження схеми", - "litematica.message.set_area_origin": "Встановіть початкову точку області на %s", - "litematica.message.set_selection_box_point": "Встановити/перемістити точку %d на %s", - "litematica.message.toggled": "Перемкнуто %s %s", - "litematica.message.value.on": "УВІМКНЕНО", - "litematica.message.value.off": "ВИМКНЕНО", - "litematica.message.schematic_projects.project_created": "Проект \"%s\" створено", - "litematica.message.schematic_projects.project_loaded": "Проект \"%s\" завантажено", - "litematica.message.schematic_projects.version_saved": "Нова версія (", - "litematica.message.warn.area_selection.browser_open_in_simple_mode": "Примітка. Зараз ви перебуваєте в режимі простого вибору області", - "litematica.message.warn.layer_mode_currently_at": "Примітка. Зараз ви перебуваєте в режимі шару візуалізації «%s».", - "litematica.message.warn.main_rendering_disabled": "Попередження: основний рендеринг наразі вимкнено\n", - "litematica.message.warn.schematic_blocks_rendering_disabled": "Попередження: візуалізація схемних блоків наразі вимкнена\n", - "litematica.message.warn.schematic_load_non_litematica": "Застереження: коли ви безпосередньо завантажуєте схеми не Litematica, створені місця розташування не будуть постійними.\n", - "litematica.message.warn.schematic_rebuild_placement_not_selected": "Цільове розташування наразі не вибрано. ", - "litematica.message.warn.schematic_rendering_disabled": "Попередження: візуалізація схеми наразі вимкнена\n", - "litematica.message.warn.schematic_verifier.overlay_disabled": "Попередження: візуалізація накладання верифікатора наразі вимкнена! ", - "litematica.message.warning.invalid_number": "Недійсний вхід для числа \"%s\"", - "litematica.message.warning.schematic_projects_hidden": "Попередження: система контролю версій схеми наразі прихована. ", - "litematica.warning.area_editor.area_rendering_disabled": "Примітка. Візуалізація полів вибору області наразі вимкнена\n", - "litematica.tool_hud.block_1": "Заблокувати: %s", - "litematica.tool_hud.block_2": "Замінити: %s", - "litematica.tool_hud.facing": "Облицювання: %s", - "litematica.tool_mode.name.area_selection": "Вибір області", - "litematica.tool_mode.name.delete": "Видалити", - "litematica.tool_mode.name.fill": "Заповнити", - "litematica.tool_mode.name.grid_paste": "Сітка Вставити схему в світі", - "litematica.tool_mode.name.move": "рухатися", - "litematica.tool_mode.name.paste_schematic": "Вставте схему в світ", - "litematica.tool_mode.name.rebuild": "Редагувати схему", - "litematica.tool_mode.name.replace_block": "Замінити блок", - "litematica.tool_mode.name.schematic_placement": "Схематичне розміщення" -} \ No newline at end of file diff --git a/src/main/resources/assets/forgematica/lang/zh_cn.json b/src/main/resources/assets/forgematica/lang/zh_cn.json index 097439d..3a5eda2 100644 --- a/src/main/resources/assets/forgematica/lang/zh_cn.json +++ b/src/main/resources/assets/forgematica/lang/zh_cn.json @@ -1,514 +1,890 @@ { - "fml.menu.mods.info.description.forgematica": "Litematica 非官方 (Neo)Forge 移植。 \n用于 (Neo)Forge 的现代全息蓝图 mod 。", - - "litematica.error.area_selection.copy_failed": "无法复制选区", - "litematica.error.area_selection.create_failed": "无法创建一个名为“%s”的新选区文件,因为文件已存在", - "litematica.error.area_selection.failed_to_load": "无法加载选区", - "litematica.error.area_selection.grow.no_sub_region_selected": "没有选中子区域!", - "litematica.error.area_selection.no_placement_selected": "没有选中放置的投影!", - "litematica.error.area_selection.rename.already_exists": "错误:已经存在一个文件名为“%s”的区域", - "litematica.error.area_selection.rename.invalid_safe_file_name": "生成的文件名为“%s”的安全文件无效", - - "litematica.error.duplicate_schematic_placement": "错误:尝试添加一个已经存在的投影放置", - "litematica.error.generic.creative_mode_only": "这个行为尽在创造模式中可用", - "litematica.error.generic.failed_to_delete_file": "无法删除文件“%s”", - "litematica.error.generic.failed_to_sort_list_of_ignored_states": "无法对忽略状态列表进行排序", - "litematica.error.generic.schematic_world_not_loaded": "原理图世界未被加载", - - "litematica.error.area_editor.create_sub_region.exists": "名为'%s' 子区域已经存在", - "litematica.error.area_editor.no_selection": "无活动区域的选择", - "litematica.error.area_editor.open_gui.no_selection": "当前处于选择模式:Normal,但当前未选择任何区域", - "litematica.error.area_editor.rename_sub_region.exists": "重命名子区域失败\\n已存在子区域名字为 '%s'", - "litematica.error.area_editor.switch_mode.no_selection": "无法切换到选择模式:Normal,因为当前没有选择区域.\\n请在区域选择浏览器中选择一个区域或创建一个新的选择", - - "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_create_schematic": "创建litematica原理图失败", - "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_read_schematic": "加载原理图失败", - "litematica.error.schematic_conversion.structure_to_litematica_failed": "无法将结构转换为litematica原理图", - - "litematica.error.schematic.create.no_selections": "没有选择任何有效的区域", - - "litematica.error.schematic_load.cant_read_file": "无法读取原理图文件 '%s' (不存在或权限问题)", - "litematica.error.schematic_load.no_schematic_selected": "未选择原理图文件", - "litematica.error.schematic_load.no_schematic_version_information": "该原理图没有版本信息,无法安全加载", - "litematica.error.schematic_load.unsupported_schematic_version": "不支持的或将来版本的原理图 '%d'", - "litematica.error.schematic_load.unsupported_type": "未知或不支持的文件类型 '%s'", - - "litematica.error.schematic_manager.schematic_export.unsupported_type": "只能以其他格式导出Litematica原理图", - "litematica.error.schematic_manager.schematic_import.unsupported_type": "所选的原理图类型不支持导入", - - "litematica.error.schematic_placements.remove_fail_locked": "位置已锁定\\n- 按住SHIFT键强制删除", - - "litematica.error.schematic_save.directory_doesnt_exist": "没有这样的目录: '%s'", - "litematica.error.schematic_save.file_already_exists": "文件'%s' 已经存在", - "litematica.error.schematic_save.invalid_directory": "无效目录 '%s'", - "litematica.error.schematic_save.invalid_schematic_name": "无效的原理图名称 '%s'", - "litematica.error.schematic_save.schematic_creation_failed": "创建原理图失败", - - "litematica.error.schematic_read_from_file_failed.cant_read": "无法从文件 '%s'中读取原理图", - "litematica.error.schematic_read_from_file_failed.exception": "从文件 '%s'中读取原理图时出现异常", - "litematica.error.schematic_read_from_file_failed.no_file": "无法从文件中读取原理图: 没有可用的文件 (in-memory schematic?)", - - "litematica.error.schematic_projects.empty_selection": "空白区域选择(0个子区域)", - "litematica.error.schematic_projects.failed_to_load_project": "加载项目失败", - "litematica.error.schematic_projects.failed_to_load_schematic": "加载当前版本的原理图失败", - "litematica.error.schematic_projects.failed_to_rename_project_file_exception": "未能将项目文件重命名为 '%s' (exception)", - "litematica.error.schematic_projects.failed_to_rename_project_file_exists": "无法将项目重命名为'%s', 文件已存在", - "litematica.error.schematic_projects.invalid_project_directory": "项目目录无效或不存在", - "litematica.error.schematic_projects.no_project_open": "没有项目被打开", - "litematica.error.schematic_projects.in_projects_mode_but_no_project_open": "目前处于原理图项目模式,但目前没有打开的项目", - "litematica.error.schematic_projects.null_player": "player为空", - "litematica.error.schematic_projects.project_already_exists": "项目'%s' 已经存在", - "litematica.error.schematic_projects.save_already_in_progress": "正在保存", - - "litematica.error.schematic_write_to_file_failed.directory_creation_failed": "未能创建原理图目录 '%s'", - "litematica.error.schematic_write_to_file_failed.exception": "未能将原理图写入文件 '%s' (exception)", - "litematica.error.schematic_write_to_file_failed.exists": "未能将结构写入文件 '%s', 文件已存在", - "litematica.error.structure_write_to_file_failed.exception": "未能将结构写入文件 '%s' (exception)", - "litematica.error.structure_write_to_file_failed.exists": "未能将结构写入文件 '%s', 文件已存在", - - "litematica.hotkeys.category.generic_hotkeys": "通用热键", - - "litematica.info.schematic_load.schematic_loaded": "原理图 '%s' 成功加载到内存中", - "litematica.info.schematic_manager.preview.right_click_to_cancel": "右键单击该按钮可取消挂起的预览操作", - "litematica.info.schematic_manager.preview.set_preview_by_taking_a_screenshot": "使用普通屏幕截图键设置预览\\n或者右键单击“设置预览”按钮取消设置预览", - "litematica.info.schematic_manager.preview.success": "已成功设置预览图像", - - "litematica.gui.button.area_editor.analyze_area": "分析区域", - "litematica.gui.button.area_editor.change_corner_mode": "角点模式:%s", - "litematica.gui.button.area_editor.change_selection_mode": "选择模式:%s", - "litematica.gui.button.area_editor.create_schematic": "保存原理图", - "litematica.gui.button.area_editor.create_sub_region": "新建子区域", - "litematica.gui.button.area_editor.origin_enabled": "手动来源:%s", - "litematica.gui.button.area_editor.set_box_name": "set", - "litematica.gui.button.area_editor.set_selection_name": "set", - - "litematica.gui.button.area_selection_mode": "区域选择模式:%s", - "litematica.gui.button.area_selections.create_directory": "创建目录", - "litematica.gui.button.area_selections.create_new_selection": "新选择", - "litematica.gui.button.area_selections.create_selection_from_placement": "从位置", - "litematica.gui.button.area_selections.unselect": "取消选择", - - "litematica.gui.button.change_menu.area_editor": "选区编辑器", - "litematica.gui.button.change_menu.configuration_menu": "配置菜单", - "litematica.gui.button.change_menu.load_schematics_to_memory": "加载原理图", - "litematica.gui.button.change_menu.schematic_manager": "原理图目录", - "litematica.gui.button.change_menu.schematic_projects_manager": "原理图文件夹", - "litematica.gui.button.change_menu.show_area_selections": "选区目录", - "litematica.gui.button.change_menu.show_loaded_schematics": "已加载原理图", - "litematica.gui.button.change_menu.show_schematic_placements": "原理图编辑", - "litematica.gui.button.change_menu.task_manager": "任务管理器", - "litematica.gui.button.change_menu.to_main_menu": "投影菜单", - - "litematica.gui.button.config_gui.colors": "颜色", - "litematica.gui.button.config_gui.generic": "通用", - "litematica.gui.button.config_gui.hotkeys": "热键", - "litematica.gui.button.config_gui.info_overlays": "信息覆盖", - "litematica.gui.button.config_gui.render_layers": "渲染层", - "litematica.gui.button.config_gui.visuals": "视觉", - - "litematica.gui.button.hover.area_editor.shift_for_in_memory": "按住shift创建一个仅在内存中的原理图", - "litematica.gui.button.hover.area_selections.unselect": "取消选择当前区域选择", - "litematica.gui.button.hover.material_list.clear_cache": "清除材料缓存\n通常这不应该需要做的\n这可以用来代替删除'material_cache.nbt'\n文件,以防缓存含有一些错误的数据,\n如一些不应存在的物品储存,如活塞头", - "litematica.gui.button.hover.material_list.write_hold_shift_for_csv": "按住shift写入csv文件,\\n而不是普通的ASCII艺术表文本文件", - "litematica.gui.button.hover.material_list_shift_to_select_sub_regions": "按住shift选择用于材料列表的子区域", - "litematica.gui.button.hover.plus_minus_tip": "左键单击可增大\\n右键单击可减小\\nShift and/or Alt 增加步长", - "litematica.gui.button.hover.plus_minus_tip_ctrl_alt_shift": "左键单击可增大\\n右键单击可减小\\nShift/Alt/Ctrl 增加步长(乘法)", - "litematica.gui.button.hover.schematic_list.reload_schematic": "Reloads the schematic from file.\nThis can be useful if you make a mistake\nin the Schematic Edit mode.", - "litematica.gui.button.hover.schematic_projects.area_browser_disabled_currently_in_projects_mode": "当前打开了一个原理图项目\\n原理图项目将覆盖正常区域选择功能", - "litematica.gui.button.hover.schematic_projects.delete_area": "§6删除最后放置或保存的区域§r", - "litematica.gui.button.hover.schematic_projects.menu_warning": "(This was called Schematic Projects before.)\nIn general you §6should not§r be using this feature,\nunless you really know how it works and what it does.\nIt somewhat changes how the area selections, placements and pasting works,\nin particular that there is also an area delete operation when pasting.\n\nBasically this feature is intended for §6iterative, in-place§r design work,\nand it allows you to easier create multiple versions/snapshots\nof the same build, and also to switch between the versions by deleting what is\nin the world first, and then pasting the next version in its place.", - "litematica.gui.button.hover.schematic_projects.move_origin_to_player": "将项目原点移动到玩家当前位置\\n这还会移动区域选择和放置", - "litematica.gui.button.hover.schematic_projects.place_to_world_warning": "§6警告:这将在一个之前放置或者保存的\n§6一个版本的区域里,删除/覆盖当前世界里的方块\n§6(基本上是最后一次看到的“有效区域选择”)", - "litematica.gui.button.hover.schematic_projects.save_new_version": "将新的原理图/版本保存到当前项目", - - "litematica.gui.button.material_list": "材料列表", - "litematica.gui.button.material_list.clear_cache": "清除缓存", - "litematica.gui.button.material_list.clear_ignored": "清除忽略", - "litematica.gui.button.material_list.hide_available": "隐藏可用: %s", - "litematica.gui.button.material_list.ignore": "忽略", - "litematica.gui.button.material_list.list_type": "显示: %s", - "litematica.gui.button.material_list.refresh_list": "刷新", - "litematica.gui.button.material_list.toggle_info_hud": "信息 HUD: %s", - "litematica.gui.button.material_list.write_to_file": "写入文件", - - "litematica.gui.button.placement_sub.placement_configuration": "放置配置", - "litematica.gui.button.placement_sub.reset_sub_region_placement": "重置子区域", - "litematica.gui.button.placement_sub.slice_type": "切片: %s", - - "litematica.gui.button.schematic_manager.export_as": "导出为 :", - - "litematica.gui.button.schematic_placement.abbr.rendering": "R", - - "litematica.gui.button.schematic_placement.ignore_entities": "忽略实体: %s", - "litematica.gui.button.schematic_placement.region_enabled": "区域: %s", - "litematica.gui.button.schematic_placement.reset_sub_region_placements": "重置所有子区域", - "litematica.gui.button.schematic_placement.toggle_all_off": "全部 §c关闭§r", - "litematica.gui.button.schematic_placement.toggle_all_on": "全部 §a开§r", - - "litematica.gui.button.schematic_placement.hover.enclosing_box": "封闭框呈现: %s", - "litematica.gui.button.schematic_placement.hover.lock": "锁定位置可防止移动\\n以其他方式更改它(意外地)", - "litematica.gui.button.schematic_placement.hover.rendering": "呈现: %s\\n请注意,这有点奇怪\\n并且不会阻止实体呈现.\\n通常,您应该完全禁用\\n完全放置", - - "litematica.gui.button.schematic_placements.configure": "配置", - "litematica.gui.button.schematic_placements.disable": "禁用", - "litematica.gui.button.schematic_placements.locked": "已锁定: %s", - "litematica.gui.button.schematic_placements.placement_enabled": "位置: %s", - "litematica.gui.button.schematic_placements.remove": "删除", - "litematica.gui.button.schematic_placements.rendering_enabled": "渲染: %s", - "litematica.gui.button.schematic_placements.select": "选择", - - "litematica.gui.button.schematic_projects.close_project": "关闭当前项目", - "litematica.gui.button.schematic_projects.create_project": "创建项目", - "litematica.gui.button.schematic_projects.delete_area": "删除区域", - "litematica.gui.button.schematic_projects.load_project": "加载项目", - "litematica.gui.button.schematic_projects.move_origin_to_player": "移动到玩家", - "litematica.gui.button.schematic_projects.open_area_editor": "区域编辑", - "litematica.gui.button.schematic_projects.open_manager_gui": "打开管理器", - "litematica.gui.button.schematic_projects.open_project_browser": "项目浏览器", - "litematica.gui.button.schematic_projects.place_to_world": "在世界上放置", - "litematica.gui.button.schematic_projects.save_version": "保存版本", - - "litematica.gui.button.schematic_verifier.ignore": "忽略", - "litematica.gui.button.schematic_verifier.range_type": "范围: %s", - "litematica.gui.button.schematic_verifier.reset_ignored": "重置被忽略", - "litematica.gui.button.schematic_verifier.reset_verifier": "重置数据", - "litematica.gui.button.schematic_verifier.resume": "摘要验证", - "litematica.gui.button.schematic_verifier.start": "开始验证", - "litematica.gui.button.schematic_verifier.stop": "停止验证", - "litematica.gui.button.schematic_verifier.toggle_info_hud": "信息HUD: %s", - - "litematica.gui.button.cancel": "取消", - "litematica.gui.button.configure": "配置", - "litematica.gui.button.copy": "复制", - "litematica.gui.button.create_directory": "新建目录", - "litematica.gui.button.create_placement": "创造放置", - "litematica.gui.button.delete": "删除", - "litematica.gui.button.disable": "禁用", - "litematica.gui.button.enable": "启用", - "litematica.gui.button.import": "导入", - "litematica.gui.button.load_schematic_to_memory": "加载原理图", - "litematica.gui.button.mirror_value": "镜像: %s", - "litematica.gui.button.move_to_player": "移动到玩家", - "litematica.gui.button.ok": "Ok", - "litematica.gui.button.reload": "重载", - "litematica.gui.button.remove": "删除", - "litematica.gui.button.remove_placement": "删除放置", - "litematica.gui.button.rename": "重命名", - "litematica.gui.button.rotation_value": "旋转: %s", - "litematica.gui.button.save_new_schematic_version": "保存版本", - "litematica.gui.button.save_schematic": "保存原理图", - "litematica.gui.button.save_to_file": "保存到文件", - "litematica.gui.button.schematic_verifier": "原理图验证程序", - "litematica.gui.button.set_preview": "设置预览", - "litematica.gui.button.tool_mode": "工具模式: %s", - "litematica.gui.button.unload": "卸载", - "litematica.gui.button.unlocked": "解锁", - - "litematica.gui.label.area_editor.box_name": "子区域框名称", - "litematica.gui.label.area_editor.selection_name": "选择名称", - "litematica.gui.label.area_editor.corner_1": "角1", - "litematica.gui.label.area_editor.corner_2": "角2", - "litematica.gui.label.area_editor.origin": "原点", - "litematica.gui.label.area_editor.dimensions": "尺寸", - "litematica.gui.label.area_editor.pos1": "角1", - "litematica.gui.label.area_editor.pos2": "角2", - "litematica.gui.label.area_editor.sub_regions": "子区域 (%s)", - - "litematica.gui.label.area_selection_manager.current_selection": "所选区域: %s", - - "litematica.gui.label.area_selection_box_count": "框数: %d", - "litematica.gui.label.area_selection_origin": "原点: %s", - "litematica.gui.label.area_selection.mode.normal": "正常", - "litematica.gui.label.area_selection.mode.simple": "简单", - - "litematica.gui.label.block_info.state_client": "客户端世界的方块信息", - "litematica.gui.label.block_info.state_schematic": "原理图世界的方块信息", - - "litematica.gui.label.block_info_list_type.all": "ALL", - "litematica.gui.label.block_info_list_type.render_layers": "渲染层", - - "litematica.gui.label.easy_place_protocol.auto": "自动", - "litematica.gui.label.easy_place_protocol.none": "None", - "litematica.gui.label.easy_place_protocol.slabs_only": "Slabs only", - "litematica.gui.label.easy_place_protocol.v2": "版本 2", - "litematica.gui.label.easy_place_protocol.v3": "版本 3", - - "litematica.gui.label.loaded_schematic.modified_on": "§6Modified on %s§r", - - "litematica.gui.label.material_list.abbr.shulker_box": "SB", - "litematica.gui.label.material_list.title.available": "可用", - "litematica.gui.label.material_list.title.item": "项目", - "litematica.gui.label.material_list.title.missing": "缺少", - "litematica.gui.label.material_list.title.total": "总计", - - "litematica.gui.label.material_list.multiplier": "倍数:", - "litematica.gui.label.material_list.name": "名称", - "litematica.gui.label.material_list.progress": "进度: %s", - "litematica.gui.label.material_list.progress.done": "完成 %s", - "litematica.gui.label.material_list.progress.mismatch": "不匹配的 %s", - "litematica.gui.label.material_list.progress.missing": "缺少 %s", - "litematica.gui.label.material_list.total": "总计: %s 个物品", - - "litematica.gui.label.origin.auto": "自动", - "litematica.gui.label.origin.manual": "手动", - - "litematica.gui.label.paste_nbt_behavior.none": "None", - "litematica.gui.label.paste_nbt_behavior.place_data_modify": "Place & Data Modify", - "litematica.gui.label.paste_nbt_behavior.place_clone": "放置&克隆", - - "litematica.gui.label.placement_sub.region_name": "区域名: %s", - "litematica.gui.label.placement_sub.region_position": "区域位置", - "litematica.gui.label.placement_sub.region_size": "区域大小: %s", - - "litematica.gui.label.placement_settings.placement_origin": "放置原点", - - "litematica.gui.label.render_layers.hotkey": "热键", - "litematica.gui.label.render_layers.hover.hotkey": "下一个/上一个图层热键将影响此边界\\n如果两者都被选中,那么热键将被影响\\n在最接近玩家的边界", - - "litematica.gui.label.replace_behavior.all": "所有", - "litematica.gui.label.replace_behavior.none": "无", - "litematica.gui.label.replace_behavior.with_non_air": "非空气", - - "litematica.gui.label.schematic_info.schematic_author": "原理图作者: §f%s§r", - "litematica.gui.label.schematic_info.description": "说明:", - "litematica.gui.label.schematic_info.enclosing_size": "框大小:", - "litematica.gui.label.schematic_info.enclosing_size_value": "框大小: §f%s§r", - "litematica.gui.label.schematic_info.name": "名字:", - "litematica.gui.label.schematic_info.region_count": "区域: §f%d§r", - "litematica.gui.label.schematic_info.time_created": "已创建: §f%s§r", - "litematica.gui.label.schematic_info.time_modified": "修改自: §f%s§r", - "litematica.gui.label.schematic_info.total_blocks": "方块总数: §f%d§r", - "litematica.gui.label.schematic_info.total_blocks_and_volume": "方块/体积: §f%d§r/§f%d§r", - "litematica.gui.label.schematic_info.total_volume": "总体积: §f%d§r 个方块", - - "litematica.gui.label.schematic_load.checkbox.create_placement": "创建放置", - "litematica.gui.label.schematic_load.hoverinfo.create_placement": "立即创建新位置\\n并选择该位置", - - "litematica.gui.label.schematic_placement.enclosing_size": "框尺寸: %s", - "litematica.gui.label.schematic_placement.hoverinfo.hold_shift_to_create_as_disabled": "按住shift以在创建时禁用放置", - "litematica.gui.label.schematic_placement.in_memory": "仅限内存", - "litematica.gui.label.schematic_placement.origin": "来源: %s", - "litematica.gui.label.schematic_placement.rename_placement": "重命名放置:", - "litematica.gui.label.schematic_placement.schematic_file": "文件: %s", - "litematica.gui.label.schematic_placement.schematic_name": "原理图: %s", - "litematica.gui.label.schematic_placement.sub_region_count": "子区域: %s", - "litematica.gui.label.schematic_placement.sub_regions": "子区域 (%s):", - - "litematica.gui.label.schematic_projects.currently_open_project": "当前打开的项目: %s", - "litematica.gui.label.schematic_projects.origin": "来源:", - "litematica.gui.label.schematic_projects.project": "项目:", - "litematica.gui.label.schematic_projects.version": "版本: %s (of %s)", - "litematica.gui.label.schematic_projects.version_entry": "请参见. %d - %s", - "litematica.gui.label.schematic_projects.version_name": "版本名:", - - "litematica.gui.label.schematic_save.checkbox.ignore_entities": "忽略实体", - "litematica.gui.label.schematic_save.hoverinfo.hold_shift_to_overwrite": "按住shift覆盖现有文件", - - "litematica.gui.label.schematic_verifier.count": "数量", - "litematica.gui.label.schematic_verifier.expected": "预期", - "litematica.gui.label.schematic_verifier.found": "找到", - "litematica.gui.label.schematic_verifier_display_type.all": "全部 (非忽略的)", - "litematica.gui.label.schematic_verifier_display_type.correct_state": "正确状态", - "litematica.gui.label.schematic_verifier_display_type.extra": "额外的方块", - "litematica.gui.label.schematic_verifier_display_type.missing": "缺失的方块", - "litematica.gui.label.schematic_verifier_display_type.wrong_blocks": "错误的方块", - "litematica.gui.label.schematic_verifier_display_type.wrong_state": "错误的状态", - "litematica.gui.label.schematic_verifier.status.done_errors": "警告: §c方块: %s§r, §6状态: %s§r, §b缺失: %s§r, §d额外: %s§r", - "litematica.gui.label.schematic_verifier.status.done_correct_total": "§a正确: %s§r, 总共: %s", - "litematica.gui.label.schematic_verifier.status.verifying": "不可见的区块: %s / %s", - "litematica.gui.label.schematic_verifier.verifier": "原理图验证程序", - - "litematica.gui.label.task.title.remaining_chunks": "%s, 剩余区块 (%s)", - "litematica.gui.label.task_name.area_analyzer": "区域分析器", - "litematica.gui.label.task_name.delete": "删除任务", - "litematica.gui.label.task_name.fill": "填充任务", - "litematica.gui.label.task_name.material_list": "材料列表", - "litematica.gui.label.task_name.paste": "粘贴原理图", - "litematica.gui.label.task_name.save_schematic": "保存原理图", - "litematica.gui.label.task_name.verifier": "验证程序", - - "litematica.gui.message.confirm_file_deletion": "是否要删除文件 '%s'", - "litematica.gui.message.schematic_projects.confirm_delete_area": "是否删除“上次受影响”的区域?\n这将删除这个工程管理器上次放置在世界上的,或者上次保存为一个版本文件的区域中任何方块实体\n(基本上是“最后一次看到受影响的区域”,这样如果你要循环版本,它就不会留下以前版本的方块)", - "litematica.gui.message.schematic_projects.confirm_place_to_world": "你想把这个版本放到世界吗?\\n这将删除项目管理器最后放置到世界的区域内的任何方块和实体,或最后保存为版本. (基本上 \\\"最后见过受影响的区域\\\", 这样,如果你要循环版本,它不会留下以前版本的方块.)", - - "litematica.gui.title.area_editor_normal": "区域编辑器(普通/多框模式)", - "litematica.gui.title.area_editor_normal_schematic_projects": "区域编辑器 (§6§l图形项目区域§r)", - "litematica.gui.title.area_editor_simple": "区域编辑器 (简单模式)", - "litematica.gui.title.area_editor_sub_region": "区域编辑器 (子区域)", - "litematica.gui.title.area_editor.sub_region_name": "子区域名称", - "litematica.gui.title.area_selection_manager": "区域选择管理器", - "litematica.gui.title.configure_schematic_placement": "配置原理图放置", - "litematica.gui.title.configure_schematic_sub_region": "配置放置子区域", - "litematica.gui.title.configs": "%s 配置 - %s", - "litematica.gui.title.confirm_file_deletion": "确认文件删除", - "litematica.gui.title.copy_area_selection": "复制区域选择 '%s'", - "litematica.gui.title.create_area_selection": "新建区域选择", - "litematica.gui.title.create_area_selection_from_placement": "从原理图位置创建新的区域选择", - "litematica.gui.title.create_directory": "新建目录", - "litematica.gui.title.create_in_memory_schematic": "创建内存中的原理图", - "litematica.gui.title.create_schematic_project": "新建原理图项目", - "litematica.gui.title.litematica_main_menu": "投影 %s", - "litematica.gui.title.load_schematic": "加载原理图", - "litematica.gui.title.manage_loaded_schematics": "管理加载的原理图", - "litematica.gui.title.manage_schematic_placements": "管理原理图放置", - "litematica.gui.title.material_list.area_analyzer": "选择区域分析 '%s'", - "litematica.gui.title.material_list.placement": "放置材料列表 '%s'", - "litematica.gui.title.material_list.schematic": "原理图的材料清单 '%s' (%s of %s 区域)", - "litematica.gui.title.material_list.select_schematic_regions": "选择材料列表的子区域 '%s'", - "litematica.gui.title.rename_area_selection": "重命名区域选择", - "litematica.gui.title.rename_area_sub_region": "重命名子区域", - "litematica.gui.title.rename_schematic": "重命名原理图", - "litematica.gui.title.create_schematic_from_selection": "将当前选定的区域另存为原理图", - "litematica.gui.title.save_exported_schematic": "保存导出 %s 属于 '%s'", - "litematica.gui.title.save_imported_schematic": "保存导入的原理图", - "litematica.gui.title.save_schematic_from_memory": "将内存中的原理图保存到文件", - "litematica.gui.title.save_schematic_filename": "原理图文件名", - "litematica.gui.title.schematic_browser": "原理图浏览器", - "litematica.gui.title.schematic_manager": "原理图管理器", - "litematica.gui.title.schematic_project_manager": "原理图工程目录", - "litematica.gui.title.schematic_projects.confirm_delete_area": "确认删除区域", - "litematica.gui.title.schematic_projects.confirm_place_to_world": "确认在世界中放置的操作", - "litematica.gui.title.schematic_projects.save_new_version": "保存一个新的原理图版本", - "litematica.gui.title.schematic_projects_browser": "原理图工程浏览器", - "litematica.gui.title.schematic_verifier": "验证 '%s' 原理图", - "litematica.gui.title.schematic_verifier_errors": "原理图验证错误", - "litematica.gui.title.task_manager": "任务管理器", - - "litematica.hud.area_selection.box_count": "框数: %s", - "litematica.hud.area_selection.dimensions_position": "尺寸: %s - p1: %s, p2: %s", - "litematica.hud.area_selection.mode.corners": "角点", - "litematica.hud.area_selection.mode.expand": "展开", - "litematica.hud.area_selection.origin": "原点: %s", - "litematica.hud.area_selection.selected_area_normal": "区域: %s", - "litematica.hud.area_selection.selected_area_simple": "区域 [§6简单模式§r]: %s", - "litematica.hud.area_selection.selected_sub_region": "子区域: %s", - "litematica.hud.area_selection.selection_corners_mode": "角点模式: %s", - - "litematica.hud.delete.target_mode": "删除目标模式: %s", - "litematica.hud.delete.target_mode.area": "当前区域", - "litematica.hud.delete.target_mode.placement": "当前放置", - - "litematica.hud.misc.easy_place_mode_enabled": "简单放置模式 §aON§r", - "litematica.hud.misc.none_brackets": "", - "litematica.hud.misc.placement_restriction_mode_enabled": "限制放置模式 §a开启§r", - "litematica.hud.misc.render_layer_mode": "图层模式: %s - %s", - "litematica.hud.misc.render_layer_mode_all": "图层模式: %s", - "litematica.hud.misc.renderer_status": "渲染器: A: %s S: %s B: %s O: %s SEL: %s", - "litematica.hud.misc.schematic_paste.data_restore_mode": "Data Restore Mode: §b%s", - "litematica.hud.misc.schematic_paste.replace_mode": "替换方块: %s", - - "litematica.hud.schematic_placement.hover_info.lock_coordinate": "锁定此坐标\\n这允许改变其他坐标\\n不影响锁定的", - "litematica.hud.schematic_placement.hover_info.placement_locked": "此位置已锁定,如果不先解锁,则无法修改", - "litematica.hud.schematic_placement.hover_info.placement_modified": "此位置已修改", - "litematica.hud.schematic_placement.hover_info.placement_sub_region_modified": "此子区域已修改", - "litematica.hud.schematic_placement.selected_placement": "放置", - "litematica.hud.schematic_placement.selected_sub_region": "子区域", - "litematica.hud.schematic_placement.sub_region_count": "区域", - "litematica.hud.schematic_placement.sub_region_modified": "修改", - "litematica.hud.schematic_placement.sub_region_origin": "区域原点: %s", - "litematica.hud.schematic_placement.sub_regions_modified": "修改区域", - - "litematica.hud.selected_mode": "模式", - - "litematica.hud.schematic_projects.current_version_date": "数据: %s", - "litematica.hud.schematic_projects.current_version": "版本: %s/%s - 名字: %s", - "litematica.hud.schematic_projects.no_project_open": "<没有项目打开>", - "litematica.hud.schematic_projects.no_versions": "<没有该版本>", - "litematica.hud.schematic_projects.origin": "项目来源: %s", - "litematica.hud.schematic_projects.project_name": "项目: %s", - "litematica.hud.schematic_projects_mode": "§6原理图项目模式§r", - - "litematica.info.material_list": "- 材料清单热键将打开上次查看的材料清单,\\n 如果有一个存储\\n- 要切换到其他材料列表,请打开一个\\n 放置配置GUI中的GUI按钮或原理图浏览器\\n- 存储/上次查看的列表也会被忘记\\n 如果选择的原理图放置已更改\\n- 如果还没有最后查看的材料清单,\\n 然后使用选定的放置,如果有的话", - - "litematica.label.alignment.center": "中心", - "litematica.label.alignment.top_center": "顶部中心", - - "litematica.label.none_lower": "none", - "litematica.label.no": "no", - "litematica.label.yes": "yes", - - "litematica.message.error.area_deletion_aborted": "区域删除中断或中止", - "litematica.message.error.empty_area_selection": "空白区域选择(无框)", - "litematica.message.error.invalid_schematic_name": "无效的原理图名称 '%s'", - "litematica.message.error.no_area_selected": "§c没有区域被选择§r", - "litematica.message.error.no_placement_selected": "§c没有选择展示位置§r", - "litematica.message.error.only_works_in_single_player": "§c此操作仅在单个玩家中运行§r", - "litematica.message.error.move.pending_tasks": "§c当有待处理的任务时,无法进行移动§r", - "litematica.message.error.placement_paste_outside_world": "无法将放置粘贴到当前位置,因为它超出了世界边界", - "litematica.message.error.schematic_paste_failed": "§c原理图粘贴到世界失败§r", - "litematica.message.error.schematic_save_failed": "无法将原理图保存到文件 '%s'", - "litematica.message.error.schematic_save_interrupted": "原理图保存中断或停止", - "litematica.message.error.schematic_save_no_area_selected": "§c原理图保存失败,未选择任何区域§r", - "litematica.message.warn.pickblock.no_suitable_slot_found": "No suitable hotbar slot found for pick block!\\nCheck the config Generic -> §epickBlockableSlots§r.\\nAlso depending on the §epickBlockAvoid*§6 configs, the pick block feature may refuse to replace any tools or other damageable items in those slots.", - "litematica.message.warn.pickblock.no_valid_slots_configured": "No hotbar slots set in the Generic -> §epickBlockableSlots§6 config!", - - "litematica.message.added_selection_box": "添加了一个新的选择框在 %s", - "litematica.message.area_clear_fail": "§c清除区域失败§r", - "litematica.message.area_cleared": "已清除区域", - "litematica.message.area_filled": "已填充区域", - "litematica.message.area_fill_fail": "填充区域失败", - "litematica.message.area_selections.selection_created_from_placement": "创建了新的选择在位置 '%s'", - "litematica.message.easy_place_fail": "由轻松放置模式阻止的操作", - "litematica.message.grabbed_element_for_moving": "抓住要移动的元件", - "litematica.message.in_memory_schematic_created": "已将内存中的原理图创建为 '%s'", - "litematica.message.material_list.material_cache_cleared": "已清除材料缓存", - "litematica.message.material_list_written_to_file": "材料列表写入文件 '%s'", - "litematica.message.moved_area_origin": "移动区域原点 %s => %s", - "litematica.message.moved_selection": "移动所选内容 %s => %s", - "litematica.message.paste_with_servux": "§6正在将展示位置上传至 Servux 进行粘贴", - "litematica.message.placement.cant_modify_is_locked": "§c展示位置已锁定且无法修改§r", - "litematica.message.placement.moved_placement_origin": "已移动展示位置 原点%s => %s", - "litematica.message.placement.moved_subregion_to": "移动子区域 to %s", - "litematica.message.placement_restriction_fail": "放置限制模式阻止的操作", - "litematica.message.removed_area_origin": "删除了展示的/手动区域原点", - "litematica.message.removed_selection_box": "已删除选择框 %s", - "litematica.message.scheduled_task_added": "添加的计划任务...", - "litematica.message.schematic_exported_as": "原理图导出为 '%s'", - "litematica.message.schematic_pasted": "在世界上粘贴原理图", - "litematica.message.schematic_pasted_using_fill_and_setblock": "Schematic pasted using §b%s§r fill and §b%s§r setblock commands", - "litematica.message.schematic_pasted_using_setblock": "原理图粘贴使用 %s 放置命令", - "litematica.message.schematic_pasted_using_world_edit": "Schematic pasted using §b%s§r World Edit //set commands", - "litematica.message.schematic_placement_created": "创建放置 '%s'", - "litematica.message.schematic_preview_cancelled": "预览任务已取消", - "litematica.message.schematic_read_from_file_success": "加载原理图从文件中 '%s'", - "litematica.message.schematic_rendering_refreshed": "原理图渲染已刷新", - "litematica.message.schematic_saved_as": "原理图保存为 '%s'", - "litematica.message.schematic_save_task_created": "已创建原理图保存任务", - "litematica.message.set_area_origin": "将区域原点设置为%s", - "litematica.message.set_selection_box_point": "设置/移动点从 %d 到 %s", - "litematica.message.toggled": "已切换 %s %s", - "litematica.message.value.on": "NO", - "litematica.message.value.off": "OFF", - - "litematica.message.schematic_projects.project_created": "已创建项目 '%s'", - "litematica.message.schematic_projects.project_loaded": "已加载项目 '%s'", - "litematica.message.schematic_projects.version_saved": "新版本 (#%s) 保存为 '%s'", - - "litematica.message.warn.area_selection.browser_open_in_simple_mode": "注意:您当前处于简单区域选择模式", - "litematica.message.warn.layer_mode_currently_at": "注意:你当前处在 '%s' 显示层模式", - "litematica.message.warn.main_rendering_disabled": "警告:主渲染当前已禁用\\n查看视觉效果 -> %s, 或者热键 -> %s ['%s']", - "litematica.message.warn.schematic_blocks_rendering_disabled": "警告:原理图块呈现当前被禁用\\n查看视觉效果 -> %s, or 或者热键 -> %s ['%s']", - "litematica.message.warn.schematic_load_non_litematica": "警告:直接加载非Litematica原理图时,创建的展示位置不会持久。\\n此外,如果您必须多次加载原理图,那么每次加载时都会发生原理图类型转换滞后尖峰(对于大型原理图)。\\n\\n因此,建议导入原理图并通过原理图管理器菜单以Litematica格式保存,或者更好的是,使用MCEdit或Litematica中的粘贴模式将原始原理图粘贴到临时世界中,然后制作新的Litematica原理图 从那里开始,在适用的情况下,最好使用多个子区域来紧密捕获构建。", - "litematica.message.warn.schematic_rebuild_placement_not_selected": "目前未选择目标展示位置。 “全部替换”热键仅适用于您单击的放置的当前选定子区域。 因此,要仅替换一个子区域中的块,请选择该子区域。 要替换整个原理图(所有太阳区域),请选择整个位置而不是其子区域。 这些块也仅在当前“渲染层”设置限制的区域内被替换。", - "litematica.message.warn.schematic_rendering_disabled": "警告:当前禁用了原理图渲染\\n查看视觉效果 -> %s, 或者热键 -> %s ['%s']", - "litematica.message.warn.schematic_verifier.overlay_disabled": "警告:验证程序重叠渲染当前已禁用! 请参阅信息 -> %s (或者热键 -> %s ['%s'])", - - "litematica.message.warning.invalid_number": "输入无效的数字 '%s'", - "litematica.message.warning.schematic_projects_hidden": "警告:原理图版本控制系统当前处于隐藏状态。 一般来说,你不应该使用它,除非你真的知道它是如何工作的并改变了一些 mod 行为。如果您想使用它,请启用选项 Generic -> unhideSchematicVCS", - - "litematica.warning.area_editor.area_rendering_disabled": "注意:区域选择框呈现当前被禁用\\n查看视觉效果 -> %s, 或者热键 -> %s ['%s']", - - "litematica.tool_hud.block_1": "方块: %s", - "litematica.tool_hud.block_2": "替换: %s", - "litematica.tool_hud.facing": "朝向: %s", - - "litematica.tool_mode.name.area_selection": "区域选择", - "litematica.tool_mode.name.delete": "删除", - "litematica.tool_mode.name.fill": "填充", - "litematica.tool_mode.name.grid_paste": "在世界上粘贴原理图网格", - "litematica.tool_mode.name.move": "移动", - "litematica.tool_mode.name.paste_schematic": "在世界上粘贴原理图", - "litematica.tool_mode.name.rebuild": "重建原理", - "litematica.tool_mode.name.replace_block": "替换方块", - "litematica.tool_mode.name.schematic_placement": "原理图放置" -} \ No newline at end of file + "fml.menu.mods.info.description.forgematica": "Litematica 非官方 (Neo)Forge 移植。 \n用于 (Neo)Forge 的现代全息蓝图 mod 。", + + "litematica.error.area_selection.copy_failed": "无法复制选区", + "litematica.error.area_selection.create_failed": "无法创建一个名为“%s”的新选区文件,因为文件已存在", + "litematica.error.area_selection.failed_to_load": "无法加载选区", + "litematica.error.area_selection.grow.no_sub_region_selected": "没有选中子区域!", + "litematica.error.area_selection.no_placement_selected": "没有选中放置的投影!", + "litematica.error.area_selection.rename.already_exists": "错误:已经存在一个文件名为“%s”的区域", + "litematica.error.area_selection.rename.invalid_safe_file_name": "生成的文件名为“%s”的安全文件无效", + "litematica.error.duplicate_schematic_placement": "错误:尝试添加一个已经存在的投影放置", + "litematica.error.generic.creative_mode_only": "这个行为仅在创造模式中可用", + "litematica.error.generic.failed_to_delete_file": "无法删除文件“%s”", + "litematica.error.generic.failed_to_sort_list_of_ignored_states": "无法对忽略状态列表进行排序", + "litematica.error.generic.schematic_world_not_loaded": "原理图世界未被加载", + "litematica.error.area_editor.create_sub_region.exists": "名为'%s' 子区域已经存在", + "litematica.error.area_editor.no_selection": "无活动区域的选择", + "litematica.error.area_editor.open_gui.no_selection": "当前处于选择模式:Normal,但当前未选择任何区域", + "litematica.error.area_editor.rename_sub_region.exists": "重命名子区域失败\n已存在子区域名字为 '%s'", + "litematica.error.area_editor.switch_mode.no_selection": "无法切换到选择模式:Normal,因为当前没有选择区域.\n请在区域选择浏览器中选择一个区域或创建一个新的选择", + "litematica.error.schematic_conversion.litematic_to_litematica.failed_to_read_litematic": "無法載入 Litematica 原理圖", + "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_create_schematic": "创建litematica原理图失败", + "litematica.error.schematic_conversion.schematic_to_litematica.failed_to_read_schematic": "加载原理图失败", + "litematica.error.schematic_conversion.structure_to_litematica_failed": "无法将结构转换为litematica原理图", + "litematica.error.schematic.create.no_selections": "没有选择任何有效的区域", + "litematica.error.schematic_load.cant_read_file": "无法读取原理图文件 '%s' (不存在或权限问题)", + "litematica.error.schematic_load.no_schematic_selected": "未选择原理图文件", + "litematica.error.schematic_load.no_schematic_version_information": "该原理图没有版本信息,无法安全加载", + "litematica.error.schematic_load.unsupported_schematic_version": "不支持的或将来版本的原理图 '%d'", + "litematica.error.schematic_load.unsupported_type": "未知或不支持的文件类型 '%s'", + "litematica.error.schematic_manager.schematic_export.unsupported_type": "只能以其他格式导出Litematica原理图", + "litematica.error.schematic_manager.schematic_import.unsupported_type": "所选的原理图类型不支持导入", + "litematica.error.schematic_placements.remove_fail_locked": "位置已锁定\n- 按住SHIFT键强制删除", + "litematica.error.schematic_save.directory_doesnt_exist": "没有这样的目录: '%s'", + "litematica.error.schematic_save.file_already_exists": "文件'%s' 已经存在", + "litematica.error.schematic_save.invalid_directory": "无效目录 '%s'", + "litematica.error.schematic_save.invalid_schematic_name": "无效的原理图名称 '%s'", + "litematica.error.schematic_save.schematic_creation_failed": "创建原理图失败", + "litematica.error.schematic_read_from_file_failed.cant_read": "无法从文件 '%s'中读取原理图", + "litematica.error.schematic_read_from_file_failed.exception": "从文件 '%s'中读取原理图时出现异常", + "litematica.error.schematic_read_from_file_failed.no_file": "无法从文件中读取原理图: 没有可用的文件 (in-memory schematic?)", + "litematica.error.schematic_projects.empty_selection": "空白区域选择(0个子区域)", + "litematica.error.schematic_projects.failed_to_load_project": "加载项目失败", + "litematica.error.schematic_projects.failed_to_load_schematic": "加载当前版本的原理图失败", + "litematica.error.schematic_projects.failed_to_rename_project_file_exception": "未能将项目文件重命名为 '%s' (exception)", + "litematica.error.schematic_projects.failed_to_rename_project_file_exists": "无法将项目重命名为'%s', 文件已存在", + "litematica.error.schematic_projects.invalid_project_directory": "项目目录无效或不存在", + "litematica.error.schematic_projects.no_project_open": "没有项目被打开", + "litematica.error.schematic_projects.in_projects_mode_but_no_project_open": "目前处于原理图项目模式,但目前没有打开的项目", + "litematica.error.schematic_projects.null_player": "player为空", + "litematica.error.schematic_projects.project_already_exists": "项目'%s' 已经存在", + "litematica.error.schematic_projects.save_already_in_progress": "正在保存", + "litematica.error.schematic_write_to_file_failed.directory_creation_failed": "未能创建原理图目录 '%s'", + "litematica.error.schematic_write_to_file_failed.exception": "未能将原理图写入文件 '%s' (exception)", + "litematica.error.schematic_write_to_file_failed.exists": "未能将结构写入文件 '%s', 文件已存在", + "litematica.error.structure_write_to_file_failed.exception": "未能将结构写入文件 '%s' (exception)", + "litematica.error.structure_write_to_file_failed.exists": "未能将结构写入文件 '%s', 文件已存在", + "litematica.hotkeys.category.generic_hotkeys": "通用热键", + "litematica.info.schematic_load.schematic_loaded": "原理图 '%s' 成功加载到内存中", + "litematica.info.schematic_manager.preview.right_click_to_cancel": "右键单击该按钮可取消挂起的预览操作", + "litematica.info.schematic_manager.preview.set_preview_by_taking_a_screenshot": "使用普通屏幕截图键设置预览\n或者右键单击“设置预览”按钮取消设置预览", + "litematica.info.schematic_manager.preview.success": "已成功设置预览图像", + "litematica.gui.button.area_editor.analyze_area": "分析区域", + "litematica.gui.button.area_editor.change_corner_mode": "角点模式:%s", + "litematica.gui.button.area_editor.change_selection_mode": "选择模式:%s", + "litematica.gui.button.area_editor.create_schematic": "保存原理图", + "litematica.gui.button.area_editor.create_sub_region": "新建子区域", + "litematica.gui.button.area_editor.origin_enabled": "手动来源:%s", + "litematica.gui.button.area_editor.set_box_name": "set", + "litematica.gui.button.area_editor.set_selection_name": "set", + "litematica.gui.button.area_selection_mode": "区域选择模式:%s", + "litematica.gui.button.area_selections.create_directory": "创建目录", + "litematica.gui.button.area_selections.create_new_selection": "新选择", + "litematica.gui.button.area_selections.create_selection_from_placement": "从位置", + "litematica.gui.button.area_selections.unselect": "取消选择", + "litematica.gui.button.change_menu.area_editor": "选区编辑器", + "litematica.gui.button.change_menu.configuration_menu": "配置菜单", + "litematica.gui.button.change_menu.load_schematics_to_memory": "加载原理图", + "litematica.gui.button.change_menu.schematic_manager": "原理图目录", + "litematica.gui.button.change_menu.schematic_projects_manager": "原理图文件夹", + "litematica.gui.button.change_menu.show_area_selections": "选区目录", + "litematica.gui.button.change_menu.show_loaded_schematics": "已加载原理图", + "litematica.gui.button.change_menu.show_schematic_placements": "原理图编辑", + "litematica.gui.button.change_menu.task_manager": "任务管理器", + "litematica.gui.button.change_menu.to_main_menu": "投影菜单", + "litematica.gui.button.config_gui.colors": "颜色", + "litematica.gui.button.config_gui.generic": "通用", + "litematica.gui.button.config_gui.hotkeys": "热键", + "litematica.gui.button.config_gui.info_overlays": "信息覆盖", + "litematica.gui.button.config_gui.render_layers": "渲染层", + "litematica.gui.button.config_gui.visuals": "视觉", + "litematica.gui.button.hover.area_editor.shift_for_in_memory": "按住shift创建一个仅在内存中的原理图", + "litematica.gui.button.hover.area_selections.unselect": "取消选择当前区域选择", + "litematica.gui.button.hover.material_list.clear_cache": "清除材料缓存\n通常这不应该需要做的\n这可以用来代替删除'material_cache.nbt'\n文件,以防缓存含有一些错误的数据,\n如一些不应存在的物品储存,如活塞头", + "litematica.gui.button.hover.material_list.write_hold_shift_for_csv": "按住shift写入csv文件,\n而不是普通的ASCII艺术表文本文件", + "litematica.gui.button.hover.material_list_shift_to_select_sub_regions": "按住shift选择用于材料列表的子区域", + "litematica.gui.button.hover.plus_minus_tip": "左键单击可增大\n右键单击可减小\nShift and/or Alt 增加步长", + "litematica.gui.button.hover.plus_minus_tip_ctrl_alt_shift": "左键单击可增大\n右键单击可减小\nShift/Alt/Ctrl 增加步长(乘法)", + "litematica.gui.button.hover.schematic_list.reload_schematic": "从文件重新加载原理图。\n如果你在原理图编辑模式犯错了这会很有用", + "litematica.gui.button.hover.schematic_projects.area_browser_disabled_currently_in_projects_mode": "当前打开了一个原理图项目\n原理图项目将覆盖正常区域选择功能", + "litematica.gui.button.hover.schematic_projects.delete_area": "§6删除最后放置或保存的区域§r", + "litematica.gui.button.hover.schematic_projects.menu_warning": "(This was called Schematic Projects before.)\nIn general you §6should not§r be using this feature,\nunless you really know how it works and what it does.\nIt somewhat changes how the area selections, placements and pasting works,\nin particular that there is also an area delete operation when pasting.\n\nBasically this feature is intended for §6iterative, in-place§r design work,\nand it allows you to easier create multiple versions/snapshots\nof the same build, and also to switch between the versions by deleting what is\nin the world first, and then pasting the next version in its place.", + "litematica.gui.button.hover.schematic_projects.move_origin_to_player": "将项目原点移动到玩家当前位置\n这还会移动区域选择和放置", + "litematica.gui.button.hover.schematic_projects.place_to_world_warning": "§6警告:这将在一个之前放置或者保存的\n§6一个版本的区域里,删除/覆盖当前世界里的方块\n§6(基本上是最后一次看到的“有效区域选择”)", + "litematica.gui.button.hover.schematic_projects.save_new_version": "将新的原理图/版本保存到当前项目", + "litematica.gui.button.material_list": "材料列表", + "litematica.gui.button.material_list.clear_cache": "清除缓存", + "litematica.gui.button.material_list.clear_ignored": "清除忽略", + "litematica.gui.button.material_list.hide_available": "隐藏可用: %s", + "litematica.gui.button.material_list.ignore": "忽略", + "litematica.gui.button.material_list.list_type": "显示: %s", + "litematica.gui.button.material_list.refresh_list": "刷新", + "litematica.gui.button.material_list.toggle_info_hud": "信息 HUD: %s", + "litematica.gui.button.material_list.write_to_file": "写入文件", + "litematica.gui.button.placement_sub.placement_configuration": "放置配置", + "litematica.gui.button.placement_sub.reset_sub_region_placement": "重置子区域", + "litematica.gui.button.placement_sub.slice_type": "切片: %s", + "litematica.gui.button.schematic_manager.export_as": "导出为 :", + "litematica.gui.button.schematic_placement.abbr.rendering": "R", + "litematica.gui.button.schematic_placement.ignore_entities": "忽略实体: %s", + "litematica.gui.button.schematic_placement.region_enabled": "区域: %s", + "litematica.gui.button.schematic_placement.reset_sub_region_placements": "重置所有子区域", + "litematica.gui.button.schematic_placement.toggle_all_off": "全部 §c关闭§r", + "litematica.gui.button.schematic_placement.toggle_all_on": "全部 §a开§r", + "litematica.gui.button.schematic_placement.hover.enclosing_box": "封闭框呈现: %s", + "litematica.gui.button.schematic_placement.hover.lock": "锁定位置可防止移动\n以其他方式更改它(意外地)", + "litematica.gui.button.schematic_placement.hover.rendering": "呈现: %s\n请注意,这有点奇怪\n并且不会阻止实体呈现.\n通常,您应该完全禁用\n完全放置", + "litematica.gui.button.schematic_placements.configure": "配置", + "litematica.gui.button.schematic_placements.disable": "禁用", + "litematica.gui.button.schematic_placements.locked": "已锁定: %s", + "litematica.gui.button.schematic_placements.placement_enabled": "位置: %s", + "litematica.gui.button.schematic_placements.remove": "删除", + "litematica.gui.button.schematic_placements.rendering_enabled": "渲染: %s", + "litematica.gui.button.schematic_placements.select": "选择", + "litematica.gui.button.schematic_projects.close_project": "关闭当前项目", + "litematica.gui.button.schematic_projects.create_project": "创建项目", + "litematica.gui.button.schematic_projects.delete_area": "删除区域", + "litematica.gui.button.schematic_projects.load_project": "加载项目", + "litematica.gui.button.schematic_projects.move_origin_to_player": "移动到玩家", + "litematica.gui.button.schematic_projects.open_area_editor": "区域编辑", + "litematica.gui.button.schematic_projects.open_manager_gui": "打开管理器", + "litematica.gui.button.schematic_projects.open_project_browser": "项目浏览器", + "litematica.gui.button.schematic_projects.place_to_world": "在世界上放置", + "litematica.gui.button.schematic_projects.save_version": "保存版本", + "litematica.gui.button.schematic_verifier.ignore": "忽略", + "litematica.gui.button.schematic_verifier.range_type": "范围: %s", + "litematica.gui.button.schematic_verifier.reset_ignored": "重置被忽略", + "litematica.gui.button.schematic_verifier.reset_verifier": "重置数据", + "litematica.gui.button.schematic_verifier.resume": "摘要验证", + "litematica.gui.button.schematic_verifier.start": "开始验证", + "litematica.gui.button.schematic_verifier.stop": "停止验证", + "litematica.gui.button.schematic_verifier.toggle_info_hud": "信息HUD: %s", + "litematica.gui.button.cancel": "取消", + "litematica.gui.button.configure": "配置", + "litematica.gui.button.copy": "复制", + "litematica.gui.button.create_directory": "新建目录", + "litematica.gui.button.create_placement": "创造放置", + "litematica.gui.button.delete": "删除", + "litematica.gui.button.disable": "禁用", + "litematica.gui.button.enable": "启用", + "litematica.gui.button.import": "导入", + "litematica.gui.button.load_schematic_to_memory": "加载原理图", + "litematica.gui.button.mirror_value": "镜像: %s", + "litematica.gui.button.move_to_player": "移动到玩家", + "litematica.gui.button.ok": "Ok", + "litematica.gui.button.reload": "重载", + "litematica.gui.button.remove": "删除", + "litematica.gui.button.remove_placement": "删除放置", + "litematica.gui.button.rename": "重命名", + "litematica.gui.button.rotation_value": "旋转: %s", + "litematica.gui.button.save_new_schematic_version": "保存版本", + "litematica.gui.button.save_schematic": "保存原理图", + "litematica.gui.button.save_to_file": "保存到文件", + "litematica.gui.button.schematic_verifier": "原理图验证程序", + "litematica.gui.button.set_preview": "设置预览", + "litematica.gui.button.tool_mode": "工具模式: %s", + "litematica.gui.button.unload": "卸载", + "litematica.gui.button.unlocked": "解锁", + "litematica.gui.label.area_editor.box_name": "子区域框名称", + "litematica.gui.label.area_editor.selection_name": "选择名称", + "litematica.gui.label.area_editor.corner_1": "角1", + "litematica.gui.label.area_editor.corner_2": "角2", + "litematica.gui.label.area_editor.origin": "原点", + "litematica.gui.label.area_editor.dimensions": "尺寸", + "litematica.gui.label.area_editor.pos1": "角1", + "litematica.gui.label.area_editor.pos2": "角2", + "litematica.gui.label.area_editor.sub_regions": "子区域 (%s)", + "litematica.gui.label.area_selection_manager.current_selection": "所选区域: %s", + "litematica.gui.label.area_selection_box_count": "框数: %d", + "litematica.gui.label.area_selection_origin": "原点: %s", + "litematica.gui.label.area_selection.mode.normal": "正常", + "litematica.gui.label.area_selection.mode.simple": "简单", + "litematica.gui.label.block_info.state_client": "客户端世界的方块信息", + "litematica.gui.label.block_info.state_schematic": "原理图世界的方块信息", + "litematica.gui.label.block_info_list_type.all": "ALL", + "litematica.gui.label.block_info_list_type.render_layers": "渲染层", + "litematica.gui.label.data_fixer_mode.always": "總是", + "litematica.gui.label.data_fixer_mode.below_1205": "僅低於 1.20.5", + "litematica.gui.label.data_fixer_mode.below_120X": "僅低於 1.20.x", + "litematica.gui.label.data_fixer_mode.below_119X": "僅低於 1.19.x", + "litematica.gui.label.data_fixer_mode.below_117X": "僅低於 1.17.x", + "litematica.gui.label.data_fixer_mode.below_116X": "僅低於 1.16.x", + "litematica.gui.label.data_fixer_mode.below_113X": "僅低於 1.13.x", + "litematica.gui.label.data_fixer_mode.below_112X": "僅低於 1.12.x", + "litematica.gui.label.data_fixer_mode.never": "絕不", + "litematica.gui.label.easy_place_protocol.auto": "自动", + "litematica.gui.label.easy_place_protocol.none": "关闭", + "litematica.gui.label.easy_place_protocol.slabs_only": "仅台阶", + "litematica.gui.label.easy_place_protocol.v2": "版本 2", + "litematica.gui.label.easy_place_protocol.v3": "版本 3", + "litematica.gui.label.loaded_schematic.modified_on": "§6Modified on %s§r", + "litematica.gui.label.material_list.abbr.shulker_box": "SB", + "litematica.gui.label.material_list.title.available": "可用", + "litematica.gui.label.material_list.title.item": "项目", + "litematica.gui.label.material_list.title.missing": "缺少", + "litematica.gui.label.material_list.title.total": "总计", + "litematica.gui.label.material_list.multiplier": "倍数:", + "litematica.gui.label.material_list.name": "名称", + "litematica.gui.label.material_list.progress": "进度: %s", + "litematica.gui.label.material_list.progress.done": "完成 %s", + "litematica.gui.label.material_list.progress.mismatch": "不匹配的 %s", + "litematica.gui.label.material_list.progress.missing": "缺少 %s", + "litematica.gui.label.material_list.total": "总计: %s 个物品", + "litematica.gui.label.origin.auto": "自动", + "litematica.gui.label.origin.manual": "手动", + "litematica.gui.label.paste_nbt_behavior.none": "无", + "litematica.gui.label.paste_nbt_behavior.place_data_modify": "放置 & /data modify", + "litematica.gui.label.paste_nbt_behavior.place_clone": "放置 & /clone", + "litematica.gui.label.placement_sub.region_name": "区域名: %s", + "litematica.gui.label.placement_sub.region_position": "区域位置", + "litematica.gui.label.placement_sub.region_size": "区域大小: %s", + "litematica.gui.label.placement_settings.placement_origin": "放置原点", + "litematica.gui.label.render_layers.hotkey": "热键", + "litematica.gui.label.render_layers.hover.hotkey": "下一个/上一个图层热键将影响此边界\n如果两者都被选中,那么热键将被影响\n在最接近玩家的边界", + "litematica.gui.label.replace_behavior.all": "所有", + "litematica.gui.label.replace_behavior.none": "无", + "litematica.gui.label.replace_behavior.with_non_air": "非空气", + "litematica.gui.label.schematic_info.schematic_author": "原理图作者: §f%s§r", + "litematica.gui.label.schematic_info.description": "说明:", + "litematica.gui.label.schematic_info.enclosing_size": "框大小:", + "litematica.gui.label.schematic_info.enclosing_size_value": "框大小: §f%s§r", + "litematica.gui.label.schematic_info.name": "名字:", + "litematica.gui.label.schematic_info.region_count": "区域: §f%d§r", + "litematica.gui.label.schematic_info.time_created": "已创建: §f%s§r", + "litematica.gui.label.schematic_info.time_modified": "修改自: §f%s§r", + "litematica.gui.label.schematic_info.total_blocks": "方块总数: §f%d§r", + "litematica.gui.label.schematic_info.total_blocks_and_volume": "方块/体积: §f%d§r/§f%d§r", + "litematica.gui.label.schematic_info.total_volume": "总体积: §f%d§r 个方块", + "litematica.gui.label.schematic_load.checkbox.create_placement": "创建放置", + "litematica.gui.label.schematic_load.hoverinfo.create_placement": "立即创建新位置并选择该位置", + "litematica.gui.label.schematic_placement.enclosing_size": "框尺寸: %s", + "litematica.gui.label.schematic_placement.hoverinfo.hold_shift_to_create_as_disabled": "按住shift以在创建时禁用放置", + "litematica.gui.label.schematic_placement.in_memory": "仅限内存", + "litematica.gui.label.schematic_placement.origin": "来源: %s", + "litematica.gui.label.schematic_placement.rename_placement": "重命名放置:", + "litematica.gui.label.schematic_placement.schematic_file": "文件: %s", + "litematica.gui.label.schematic_placement.schematic_name": "原理图: %s", + "litematica.gui.label.schematic_placement.sub_region_count": "子区域: %s", + "litematica.gui.label.schematic_placement.sub_regions": "子区域 (%s):", + "litematica.gui.label.schematic_projects.currently_open_project": "当前打开的项目: %s", + "litematica.gui.label.schematic_projects.origin": "来源:", + "litematica.gui.label.schematic_projects.project": "项目:", + "litematica.gui.label.schematic_projects.version": "版本: %s (of %s)", + "litematica.gui.label.schematic_projects.version_entry": "请参见. %d - %s", + "litematica.gui.label.schematic_projects.version_name": "版本名:", + "litematica.gui.label.schematic_save.checkbox.ignore_entities": "忽略实体", + "litematica.gui.label.schematic_save.hoverinfo.hold_shift_to_overwrite": "按住shift覆盖现有文件", + "litematica.gui.label.schematic_verifier.count": "数量", + "litematica.gui.label.schematic_verifier.expected": "预期", + "litematica.gui.label.schematic_verifier.found": "找到", + "litematica.gui.label.schematic_verifier_display_type.all": "全部 (非忽略的)", + "litematica.gui.label.schematic_verifier_display_type.correct_state": "正确状态", + "litematica.gui.label.schematic_verifier_display_type.extra": "额外的方块", + "litematica.gui.label.schematic_verifier_display_type.missing": "缺失的方块", + "litematica.gui.label.schematic_verifier_display_type.wrong_blocks": "错误的方块", + "litematica.gui.label.schematic_verifier_display_type.wrong_state": "错误的状态", + "litematica.gui.label.schematic_verifier.status.done_errors": "警告: §c方块: %s§r, §6状态: %s§r, §b缺失: %s§r, §d额外: %s§r", + "litematica.gui.label.schematic_verifier.status.done_correct_total": "§a正确: %s§r, 总共: %s", + "litematica.gui.label.schematic_verifier.status.verifying": "不可见的区块: %s / %s", + "litematica.gui.label.schematic_verifier.verifier": "原理图验证程序", + "litematica.gui.label.task.title.remaining_chunks": "%s, 剩余区块 (%s)", + "litematica.gui.label.task_name.area_analyzer": "区域分析器", + "litematica.gui.label.task_name.delete": "删除任务", + "litematica.gui.label.task_name.fill": "填充任务", + "litematica.gui.label.task_name.material_list": "材料列表", + "litematica.gui.label.task_name.paste": "粘贴原理图", + "litematica.gui.label.task_name.save_schematic": "保存原理图", + "litematica.gui.label.task_name.verifier": "验证程序", + "litematica.gui.message.confirm_file_deletion": "是否要删除文件 '%s'", + "litematica.gui.message.schematic_projects.confirm_delete_area": "是否删除“上次受影响”的区域?\n这将删除这个工程管理器上次放置在世界上的,或者上次保存为一个版本文件的区域中任何方块实体\n(基本上是“最后一次看到受影响的区域”,这样如果你要循环版本,它就不会留下以前版本的方块)", + "litematica.gui.message.schematic_projects.confirm_place_to_world": "你想把这个版本放到世界吗?\n这将删除项目管理器最后放置到世界的区域内的任何方块和实体,或最后保存为版本. (基本上 \\\"最后见过受影响的区域\\\", 这样,如果你要循环版本,它不会留下以前版本的方块.)", + "litematica.gui.title.area_editor_normal": "区域编辑器(普通/多框模式)", + "litematica.gui.title.area_editor_normal_schematic_projects": "区域编辑器 (§6§l图形项目区域§r)", + "litematica.gui.title.area_editor_simple": "区域编辑器 (简单模式)", + "litematica.gui.title.area_editor_sub_region": "区域编辑器 (子区域)", + "litematica.gui.title.area_editor.sub_region_name": "子区域名称", + "litematica.gui.title.area_selection_manager": "区域选择管理器", + "litematica.gui.title.configure_schematic_placement": "配置原理图放置", + "litematica.gui.title.configure_schematic_sub_region": "配置放置子区域", + "litematica.gui.title.configs": "%s 配置 - %s", + "litematica.gui.title.confirm_file_deletion": "确认文件删除", + "litematica.gui.title.copy_area_selection": "复制区域选择 '%s'", + "litematica.gui.title.create_area_selection": "新建区域选择", + "litematica.gui.title.create_area_selection_from_placement": "从原理图位置创建新的区域选择", + "litematica.gui.title.create_directory": "新建目录", + "litematica.gui.title.create_in_memory_schematic": "创建内存中的原理图", + "litematica.gui.title.create_schematic_project": "新建原理图项目", + "litematica.gui.title.litematica_main_menu": "投影 %s", + "litematica.gui.title.load_schematic": "加载原理图", + "litematica.gui.title.manage_loaded_schematics": "管理加载的原理图", + "litematica.gui.title.manage_schematic_placements": "管理原理图放置", + "litematica.gui.title.material_list.area_analyzer": "选择区域分析 '%s'", + "litematica.gui.title.material_list.placement": "放置材料列表 '%s'", + "litematica.gui.title.material_list.schematic": "原理图的材料清单 '%s' (%s of %s 区域)", + "litematica.gui.title.material_list.select_schematic_regions": "选择材料列表的子区域 '%s'", + "litematica.gui.title.rename_area_selection": "重命名区域选择", + "litematica.gui.title.rename_area_sub_region": "重命名子区域", + "litematica.gui.title.rename_schematic": "重命名原理图", + "litematica.gui.title.create_schematic_from_selection": "将当前选定的区域另存为原理图", + "litematica.gui.title.save_exported_schematic": "保存导出 %s 属于 '%s'", + "litematica.gui.title.save_imported_schematic": "保存导入的原理图", + "litematica.gui.title.save_schematic_from_memory": "将内存中的原理图保存到文件", + "litematica.gui.title.save_schematic_filename": "原理图文件名", + "litematica.gui.title.schematic_browser": "原理图浏览器", + "litematica.gui.title.schematic_manager": "原理图管理器", + "litematica.gui.title.schematic_project_manager": "原理图工程目录", + "litematica.gui.title.schematic_projects.confirm_delete_area": "确认删除区域", + "litematica.gui.title.schematic_projects.confirm_place_to_world": "确认在世界中放置的操作", + "litematica.gui.title.schematic_projects.save_new_version": "保存一个新的原理图版本", + "litematica.gui.title.schematic_projects_browser": "原理图工程浏览器", + "litematica.gui.title.schematic_verifier": "验证 '%s' 原理图", + "litematica.gui.title.schematic_verifier_errors": "原理图验证错误", + "litematica.gui.title.task_manager": "任务管理器", + "litematica.hud.area_selection.box_count": "框数: %s", + "litematica.hud.area_selection.dimensions_position": "尺寸: %s - p1: %s, p2: %s", + "litematica.hud.area_selection.mode.corners": "角点", + "litematica.hud.area_selection.mode.expand": "展开", + "litematica.hud.area_selection.origin": "原点: %s", + "litematica.hud.area_selection.selected_area_normal": "区域: %s", + "litematica.hud.area_selection.selected_area_simple": "区域 [§6简单模式§r]: %s", + "litematica.hud.area_selection.selected_sub_region": "子区域: %s", + "litematica.hud.area_selection.selection_corners_mode": "角点模式: %s", + "litematica.hud.delete.target_mode": "删除目标模式: %s", + "litematica.hud.delete.target_mode.area": "当前区域", + "litematica.hud.delete.target_mode.placement": "当前放置", + "litematica.hud.misc.easy_place_mode_enabled": "简单放置模式 §aON§r", + "litematica.hud.misc.none_brackets": "", + "litematica.hud.misc.placement_restriction_mode_enabled": "限制放置模式 §a开启§r", + "litematica.hud.misc.render_layer_mode": "图层模式: %s - %s", + "litematica.hud.misc.render_layer_mode_all": "图层模式: %s", + "litematica.hud.misc.renderer_status": "渲染器: A: %s S: %s B: %s O: %s SEL: %s", + "litematica.hud.misc.schematic_paste.data_restore_mode": "数据粘贴模式: §b%s", + "litematica.hud.misc.schematic_paste.replace_mode": "替换模式: %s", + "litematica.hud.schematic_placement.hover_info.lock_coordinate": "锁定此坐标\n这允许改变其他坐标\n不影响锁定的", + "litematica.hud.schematic_placement.hover_info.placement_locked": "此位置已锁定,如果不先解锁,则无法修改", + "litematica.hud.schematic_placement.hover_info.placement_modified": "此位置已修改", + "litematica.hud.schematic_placement.hover_info.placement_sub_region_modified": "此子区域已修改", + "litematica.hud.schematic_placement.selected_placement": "放置", + "litematica.hud.schematic_placement.selected_sub_region": "子区域", + "litematica.hud.schematic_placement.sub_region_count": "区域", + "litematica.hud.schematic_placement.sub_region_modified": "修改", + "litematica.hud.schematic_placement.sub_region_origin": "区域原点: %s", + "litematica.hud.schematic_placement.sub_regions_modified": "修改区域", + "litematica.hud.selected_mode": "模式", + "litematica.hud.schematic_projects.current_version_date": "数据: %s", + "litematica.hud.schematic_projects.current_version": "版本: %s/%s - 名字: %s", + "litematica.hud.schematic_projects.no_project_open": "<没有项目打开>", + "litematica.hud.schematic_projects.no_versions": "<没有该版本>", + "litematica.hud.schematic_projects.origin": "项目来源: %s", + "litematica.hud.schematic_projects.project_name": "项目: %s", + "litematica.hud.schematic_projects_mode": "§6原理图项目模式§r", + "litematica.info.material_list": "- 材料清单热键将打开上次查看的材料清单,\n 如果有一个存储\n- 要切换到其他材料列表,请打开一个\n 放置配置GUI中的GUI按钮或原理图浏览器\n- 存储/上次查看的列表也会被忘记\n 如果选择的原理图放置已更改\n- 如果还没有最后查看的材料清单,\n 然后使用选定的放置,如果有的话", + "litematica.label.alignment.center": "中心", + "litematica.label.alignment.top_center": "顶部中心", + "litematica.label.none_lower": "none", + "litematica.label.no": "no", + "litematica.label.yes": "yes", + "litematica.message.error.area_deletion_aborted": "区域删除中断或中止", + "litematica.message.error.empty_area_selection": "空白区域选择(无框)", + "litematica.message.error.invalid_schematic_name": "无效的原理图名称 '%s'", + "litematica.message.error.no_area_selected": "§c没有区域被选择§r", + "litematica.message.error.no_placement_selected": "§c没有选择展示位置§r", + "litematica.message.error.only_works_in_single_player": "§c此操作仅在单个玩家中运行§r", + "litematica.message.error.move.pending_tasks": "§c当有待处理的任务时,无法进行移动§r", + "litematica.message.error.placement_paste_outside_world": "无法将放置粘贴到当前位置,因为它超出了世界边界", + "litematica.message.error.schematic_paste_failed": "§c原理图粘贴到世界失败§r", + "litematica.message.error.schematic_save_failed": "无法将原理图保存到文件 '%s'", + "litematica.message.error.schematic_save_interrupted": "原理图保存中断或停止", + "litematica.message.error.schematic_save_no_area_selected": "§c原理图保存失败,未选择任何区域§r", + "litematica.message.warn.pickblock.no_suitable_slot_found": "没有可用的槽位来放置方块!\n检查 Generic -> §epickBlockableSlots§r 配置项.\n这也取决于 §epickBlockAvoid*§6 配置, 只要某个槽位中有具有耐久度的物品,投影将不会选取它用来放置方块", + "litematica.message.warn.pickblock.no_valid_slots_configured": "Generic -> §epickBlockableSlots§6 中的配置无效!", + "litematica.message.added_selection_box": "添加了一个新的选择框在 %s", + "litematica.message.area_clear_fail": "§c清除区域失败§r", + "litematica.message.area_cleared": "已清除区域", + "litematica.message.area_filled": "已填充区域", + "litematica.message.area_fill_fail": "填充区域失败", + "litematica.message.area_selections.selection_created_from_placement": "创建了新的选择在位置 '%s'", + "litematica.message.easy_place_fail": "由轻松放置模式阻止的操作", + "litematica.message.grabbed_element_for_moving": "抓住要移动的元件", + "litematica.message.in_memory_schematic_created": "已将内存中的原理图创建为 '%s'", + "litematica.message.litematic_saved_as": "已成功升级投影射数据版本版本\n投影已保存为 '%s'", + "litematica.message.material_list.material_cache_cleared": "已清除材料缓存", + "litematica.message.material_list_written_to_file": "材料列表写入文件 '%s'", + "litematica.message.moved_area_origin": "移动区域原点 %s => %s", + "litematica.message.moved_selection": "移动所选内容 %s => %s", + "litematica.message.paste_with_servux": "§6正在将展示位置上传至 Servux 进行粘贴", + "litematica.message.placement.cant_modify_is_locked": "§c展示位置已锁定且无法修改§r", + "litematica.message.placement.moved_placement_origin": "已移动展示位置 原点%s => %s", + "litematica.message.placement.moved_subregion_to": "移动子区域 to %s", + "litematica.message.placement.rotation_set_to": "放置旋转为 %s 方向", + "litematica.message.placement.mirror_set_to": "放置镜像为 %s 方向", + "litematica.message.placement_restriction_fail": "放置限制模式阻止的操作", + "litematica.message.removed_area_origin": "删除了展示的/手动区域原点", + "litematica.message.removed_selection_box": "已删除选择框 %s", + "litematica.message.scheduled_task_added": "添加的计划任务...", + "litematica.message.schematic_exported_as": "原理图导出为 '%s'", + "litematica.message.schematic_pasted": "在世界上粘贴原理图", + "litematica.message.schematic_pasted_using_fill_and_setblock": "Schematic pasted using §b%s§r fill and §b%s§r setblock commands", + "litematica.message.schematic_pasted_using_setblock": "原理图粘贴使用 %s 放置命令", + "litematica.message.schematic_pasted_using_world_edit": "Schematic pasted using §b%s§r World Edit //set commands", + "litematica.message.schematic_placement_created": "创建放置 '%s'", + "litematica.message.schematic_preview_cancelled": "预览任务已取消", + "litematica.message.schematic_read_from_file_success": "加载原理图从文件中 '%s'", + "litematica.message.schematic_rendering_refreshed": "原理图渲染已刷新", + "litematica.message.schematic_saved_as": "原理图保存为 '%s'", + "litematica.message.schematic_save_task_created": "已创建原理图保存任务", + "litematica.message.set_area_origin": "将区域原点设置为%s", + "litematica.message.set_selection_box_point": "设置/移动点从 %d 到 %s", + "litematica.message.toggled": "已切换 %s %s", + "litematica.message.value.on": "NO", + "litematica.message.value.off": "OFF", + "litematica.message.schematic_projects.project_created": "已创建项目 '%s'", + "litematica.message.schematic_projects.project_loaded": "已加载项目 '%s'", + "litematica.message.schematic_projects.version_saved": "新版本 (#%s) 保存为 '%s'", + "litematica.message.warn.area_selection.browser_open_in_simple_mode": "注意:您当前处于简单区域选择模式", + "litematica.message.warn.layer_mode_currently_at": "注意:你当前处在 '%s' 显示层模式", + "litematica.message.warn.main_rendering_disabled": "警告:主渲染当前已禁用\n查看视觉效果 -> %s, 或者热键 -> %s ['%s']", + "litematica.message.warn.schematic_blocks_rendering_disabled": "警告:原理图块呈现当前被禁用\n查看视觉效果 -> %s, or 或者热键 -> %s ['%s']", + "litematica.message.warn.schematic_load_non_litematica": "警告:直接加载非Litematica原理图时,创建的展示位置不会持久。\n此外,如果您必须多次加载原理图,那么每次加载时都会发生原理图类型转换滞后尖峰(对于大型原理图)。\n\n因此,建议导入原理图并通过原理图管理器菜单以Litematica格式保存,或者更好的是,使用MCEdit或Litematica中的粘贴模式将原始原理图粘贴到临时世界中,然后制作新的Litematica原理图 从那里开始,在适用的情况下,最好使用多个子区域来紧密捕获构建。", + "litematica.message.warn.schematic_rebuild_placement_not_selected": "目前未选择目标展示位置。 “全部替换”热键仅适用于您单击的放置的当前选定子区域。 因此,要仅替换一个子区域中的块,请选择该子区域。 要替换整个原理图(所有太阳区域),请选择整个位置而不是其子区域。 这些块也仅在当前“渲染层”设置限制的区域内被替换。", + "litematica.message.warn.schematic_rendering_disabled": "警告:当前禁用了原理图渲染\n查看视觉效果 -> %s, 或者热键 -> %s ['%s']", + "litematica.message.warn.schematic_verifier.overlay_disabled": "警告:验证程序重叠渲染当前已禁用! 请参阅信息 -> %s (或者热键 -> %s ['%s'])", + "litematica.message.warning.invalid_number": "输入无效的数字 '%s'", + "litematica.message.warning.schematic_projects_hidden": "警告:原理图版本控制系统当前处于隐藏状态。 一般来说,你不应该使用它,除非你真的知道它是如何工作的并改变了一些 mod 行为。如果您想使用它,请启用选项 Generic -> unhideSchematicVCS", + "litematica.warning.area_editor.area_rendering_disabled": "注意:区域选择框呈现当前被禁用\n查看视觉效果 -> %s, 或者热键 -> %s ['%s']", + "litematica.tool_hud.block_1": "方块: %s", + "litematica.tool_hud.block_2": "替换: %s", + "litematica.tool_hud.facing": "朝向: %s", + "litematica.tool_mode.name.area_selection": "区域选择", + "litematica.tool_mode.name.delete": "删除", + "litematica.tool_mode.name.fill": "填充", + "litematica.tool_mode.name.grid_paste": "在世界上粘贴原理图网格", + "litematica.tool_mode.name.move": "移动", + "litematica.tool_mode.name.paste_schematic": "在世界上粘贴原理图", + "litematica.tool_mode.name.rebuild": "重建原理", + "litematica.tool_mode.name.replace_block": "替换方块", + "litematica.tool_mode.name.schematic_placement": "原理图放置", + "litematica.config.hotkeys.name.addSelectionBox": "添加选区", + "litematica.config.hotkeys.comment.addSelectionBox": "在当前位置添加一个新的选区(位置 1)", + "litematica.config.hotkeys.name.cloneSelection": "克隆选区", + "litematica.config.hotkeys.comment.cloneSelection": "快速克隆当前选定的区域,基本上是创建了一个储存中的示意图\n然后在当前位置创建一个示意图并选择它,并将工具模式切换为粘贴。", + "litematica.config.hotkeys.name.deleteSelectionBox": "删除选区", + "litematica.config.hotkeys.comment.deleteSelectionBox": "删除当前选区", + "litematica.config.hotkeys.name.easyPlaceToggle": "简单放置(模式切换)", + "litematica.config.hotkeys.comment.easyPlaceToggle": "允许玩家快速的切换简单放置的模式。", + "litematica.config.hotkeys.name.executeOperation": "执行操作", + "litematica.config.hotkeys.comment.executeOperation": "在填充、替换、粘贴原理图等模式中,\n以当前选择模式或放置方式执行当前选择的工具操作", + "litematica.config.hotkeys.name.invertGhostBlockRenderState": "调整投影方块渲染状态", + "litematica.config.hotkeys.comment.invertGhostBlockRenderState": "当按住该按键后,对投影的方块渲染效果是否开启进行调整。", + "litematica.config.hotkeys.name.invertOverlayRenderState": "调整投影线框渲染状态", + "litematica.config.hotkeys.comment.invertOverlayRenderState": "当按住该按键后,对投影的线框渲染效果是否开启进行调整", + "litematica.config.hotkeys.name.layerModeNext": "下一渲染模式", + "litematica.config.hotkeys.comment.layerModeNext": "切换为下一个渲染模式", + "litematica.config.hotkeys.name.layerModePrevious": "上一渲染模式", + "litematica.config.hotkeys.comment.layerModePrevious": "切换为上一个渲染模式", + "litematica.config.hotkeys.name.layerNext": "下一层", + "litematica.config.hotkeys.comment.layerNext": "将渲染的图层向上移动一层", + "litematica.config.hotkeys.name.layerPrevious": "上一层", + "litematica.config.hotkeys.comment.layerPrevious": "将渲染的图层向下移动一层", + "litematica.config.hotkeys.name.layerSetHere": "设置初始层", + "litematica.config.hotkeys.comment.layerSetHere": "将渲染层的初始位置设定为玩家当前位置", + "litematica.config.hotkeys.name.nudgeSelectionNegative": "正向推动选区", + "litematica.config.hotkeys.comment.nudgeSelectionNegative": "向面向方向前移选区位置,其效果与 Alt + 鼠标滚轮效果类似", + "litematica.config.hotkeys.name.nudgeSelectionPositive": "反向推动选区", + "litematica.config.hotkeys.comment.nudgeSelectionPositive": "向面向方向后移选区位置,其效果与 Alt + 鼠标滚轮效果类似", + "litematica.config.hotkeys.name.moveEntireSelection": "选区定位", + "litematica.config.hotkeys.comment.moveEntireSelection": "移动整个选区至玩家所在的当前位置", + "litematica.config.hotkeys.name.openGuiAreaSettings": "区域编辑器", + "litematica.config.hotkeys.comment.openGuiAreaSettings": "打开当前选区的区域设置 GUI 界面", + "litematica.config.hotkeys.name.openGuiLoadedSchematics": "原理图加载", + "litematica.config.hotkeys.comment.openGuiLoadedSchematics": "打开原理图加载的 GUI 界面", + "litematica.config.hotkeys.name.openGuiMainMenu": "主界面", + "litematica.config.hotkeys.comment.openGuiMainMenu": "打开Litematica的主界面菜单", + "litematica.config.hotkeys.name.openGuiMaterialList": "材料列表", + "litematica.config.hotkeys.comment.openGuiMaterialList": "打开当前选择的投影材料列表 GUI ", + "litematica.config.hotkeys.name.openGuiPlacementSettings": "配置原理图放置", + "litematica.config.hotkeys.comment.openGuiPlacementSettings": "打开当前选区或其子区域的配置原理图放置 GUI ", + "litematica.config.hotkeys.name.openGuiSchematicPlacements": "管理原理图放置", + "litematica.config.hotkeys.comment.openGuiSchematicPlacements": "打开管理原理图放置 GUI ", + "litematica.config.hotkeys.name.openGuiSchematicProjects": "原理图文件夹", + "litematica.config.hotkeys.comment.openGuiSchematicProjects": "打开原理图工程文件夹 GUI ", + "litematica.config.hotkeys.name.openGuiSchematicVerifier": "原理图验证器", + "litematica.config.hotkeys.comment.openGuiSchematicVerifier": "打开当前选定的原理图的示意图验证器 GUI ", + "litematica.config.hotkeys.name.openGuiSelectionManager": "区域选择管理器", + "litematica.config.hotkeys.comment.openGuiSelectionManager": "打开区域选择管理器的 GUI ", + "litematica.config.hotkeys.name.openGuiSettings": "配置菜单", + "litematica.config.hotkeys.comment.openGuiSettings": "打开投影配置菜单的 GUI ", + "litematica.config.hotkeys.name.operationModeChangeModifier": "模式选择", + "litematica.config.hotkeys.comment.operationModeChangeModifier": "快速修改模式,当玩家手持木棍时。\n玩家可以按住该按键滚动滚轮快速调整模式。", + "litematica.config.hotkeys.name.pickBlockFirst": "选择当前方块", + "litematica.config.hotkeys.comment.pickBlockFirst": "该按键可以选中指向的表面方块,\n并将将其切换至手中", + "litematica.config.hotkeys.name.pickBlockLast": "选择可放置方块", + "litematica.config.hotkeys.comment.pickBlockLast": "该按键可以选中当前可以放置的方块\n怎么解释呢?就是说,这个键会选择你现在可以放置的最远的方块,\n当然这得看你对准了哪个面", + "litematica.config.hotkeys.name.pickBlockToggle": "选择方块开关", + "litematica.config.hotkeys.comment.pickBlockToggle": "在通用配置当中快速关闭或开启方块选择的快捷键\n这是一种快速切换其模式的方法。\n如果它们产生了什么干扰(比如功能冲突)", + "litematica.config.hotkeys.name.renderInfoOverlay": "方块信息", + "litematica.config.hotkeys.comment.renderInfoOverlay": "在方块放置后,如果是错误的放置,会提示投影原本的方块信息\n如果是正确的,投影会显示当前方块的信息", + "litematica.config.hotkeys.name.renderOverlayThroughBlocks": "原理图透视渲染", + "litematica.config.hotkeys.comment.renderOverlayThroughBlocks": "该快捷键将高亮显示投影原理图未完成部分\n高亮的部分会穿透显示,无视方块遮挡。", + "litematica.config.hotkeys.name.rerenderSchematic": "重载渲染图", + "litematica.config.hotkeys.comment.rerenderSchematic": "使用该快捷键重载原理图,而不需要使用 F3 + A 刷新区块", + "litematica.config.hotkeys.name.saveAreaAsInMemorySchematic": "将原理图存至内存", + "litematica.config.hotkeys.comment.saveAreaAsInMemorySchematic": "将当前选中区域的原理图保存于内存当中", + "litematica.config.hotkeys.name.saveAreaAsSchematicToFile": "将原理图存至文件", + "litematica.config.hotkeys.comment.saveAreaAsSchematicToFile": "将当前选中区域的原理图保存于文件当中", + "litematica.config.hotkeys.name.schematicVersionCycleModifier": "投影版本选择", + "litematica.config.hotkeys.comment.schematicVersionCycleModifier": "按住该键滚动滚轮可以选择投影的版本", + "litematica.config.hotkeys.name.schematicVersionCycleNext": "下一个投影版本", + "litematica.config.hotkeys.comment.schematicVersionCycleNext": "在版本控制工具模式下,循环到上一个投影版本的热键", + "litematica.config.hotkeys.name.schematicVersionCyclePrevious": "上一个投影版本", + "litematica.config.hotkeys.name.selectionGrabModifier": "移动选区", + "litematica.config.hotkeys.comment.selectionGrabModifier": "按住快捷键,抓取选择框角点,\n移动选区(模式 7_移动)", + "litematica.config.hotkeys.name.selectionGrow": "扩大选区", + "litematica.config.hotkeys.comment.selectionGrow": "点击快捷键后,在任何相邻的/对角线连接的块周围自动扩大选区范围\n(§4然而它直接选中了我能看到的整个地图 384*72*384 ——来自 ZMDF 的吐槽§r)", + "litematica.config.hotkeys.name.selectionGrowModifier": "扩大选区调节器", + "litematica.config.hotkeys.comment.selectionGrowModifier": "按住快捷键,滑动滚轮\n可以延长体对角线的长度", + "litematica.config.hotkeys.name.selectionNudgeModifier": "位移调节器", + "litematica.config.hotkeys.comment.selectionNudgeModifier": "按住快捷键,滑动滚轮\n可以移动选区位置", + "litematica.config.hotkeys.name.selectionModeCycle": "选区模式选择", + "litematica.config.hotkeys.comment.selectionModeCycle": "在选区模式当中切换角点或展开模式。", + "litematica.config.hotkeys.name.selectionShrink": "精简选框", + "litematica.config.hotkeys.comment.selectionShrink": "使用该快捷键使得选区达到最小范围\n意思就是删除了多余的选定区域\n区域的长宽高就是选定的长宽高\n(§2这个愚蠢的汉化者 ZMDF 在说屁§r)", + "litematica.config.hotkeys.name.setAreaOrigin": "设置初始角点", + "litematica.config.hotkeys.comment.setAreaOrigin": "设置/移动当前区域选择的原点到玩家的位置", + "litematica.config.hotkeys.name.setSelectionBoxPosition1": "设置角点 1", + "litematica.config.hotkeys.comment.setSelectionBoxPosition1": "将选区第一个角点的位置设置为玩家当前位置", + "litematica.config.hotkeys.name.setSelectionBoxPosition2": "设置角点 2", + "litematica.config.hotkeys.comment.setSelectionBoxPosition2": "将选区第二个角点的位置设置为玩家当前位置", + "litematica.config.hotkeys.name.toggleAllRendering": "切换所有渲染", + "litematica.config.hotkeys.comment.toggleAllRendering": "打开或关闭所有的渲染", + "litematica.config.hotkeys.name.toggleAreaSelectionBoxesRendering": "区域选框渲染", + "litematica.config.hotkeys.comment.toggleAreaSelectionBoxesRendering": "切换区域选择的框线是否显示的快捷键", + "litematica.config.hotkeys.name.toggleSchematicRendering": "投影方块渲染", + "litematica.config.hotkeys.comment.toggleSchematicRendering": "切换投影区域内方块是否显示的快捷键", + "litematica.config.hotkeys.name.toggleInfoOverlayRendering": "方块信息显示", + "litematica.config.hotkeys.comment.toggleInfoOverlayRendering": "切换准心所指向的方块信息是否显示的快捷键", + "litematica.config.hotkeys.name.toggleOverlayRendering": "投影方块显示", + "litematica.config.hotkeys.comment.toggleOverlayRendering": "切换投影区域的方块是否显示方块边框及方块色差的快捷键", + "litematica.config.hotkeys.name.toggleOverlayOutlineRendering": "方块描边显示", + "litematica.config.hotkeys.comment.toggleOverlayOutlineRendering": "切换投影区域的方块是否显示方块边框的快捷键", + "litematica.config.hotkeys.name.toggleOverlaySideRendering": "方块表面显示", + "litematica.config.hotkeys.comment.toggleOverlaySideRendering": "切换投影区域的方块是否显示方块色差的快捷键", + "litematica.config.hotkeys.name.togglePlacementBoxesRendering": "范围框线显示", + "litematica.config.hotkeys.comment.togglePlacementBoxesRendering": "切换投影范围框线是否显示的快捷键", + "litematica.config.hotkeys.name.togglePlacementRestriction": "放置位置限制", + "litematica.config.hotkeys.comment.togglePlacementRestriction": "切换放置位置限制模式的快捷键", + "litematica.config.hotkeys.name.toggleSchematicBlockRendering": "投影方块视觉", + "litematica.config.hotkeys.comment.toggleSchematicBlockRendering": "切换投影范围中所有方块的贴图是否显示的快捷键", + "litematica.config.hotkeys.name.toggleTranslucentRendering": "透明切换", + "litematica.config.hotkeys.comment.toggleTranslucentRendering": "切换投影范围中所有方块是否为透明显示的快捷键", + "litematica.config.hotkeys.name.toggleVerifierOverlayRendering": "验证覆盖", + "litematica.config.hotkeys.comment.toggleVerifierOverlayRendering": "切换示意图验证器覆盖渲染\n(§4然而我并不知道怎么用——ZMDF§r)", + "litematica.config.hotkeys.name.toolEnabledToggle": "工具切换", + "litematica.config.hotkeys.comment.toolEnabledToggle": "切换是否开启范围设定工具(木棍)的快捷键", + "litematica.config.hotkeys.name.toolPlaceCorner1": "角点 1 放置", + "litematica.config.hotkeys.comment.toolPlaceCorner1": "当手持范围设定工具(木棍)时放置角点 1", + "litematica.config.hotkeys.name.toolPlaceCorner2": "角点 2 放置", + "litematica.config.hotkeys.comment.toolPlaceCorner2": "当手持范围设定工具(木棍)时放置角点 2", + "litematica.config.hotkeys.name.toolSelectElements": "区域选择", + "litematica.config.hotkeys.comment.toolSelectElements": "当手持范围设定工具(木棍)时指向角点或区域将选中角点或区域", + "litematica.config.hotkeys.name.toolSelectModifierBlock1": "主方块选择", + "litematica.config.hotkeys.comment.toolSelectModifierBlock1": "按住该键时按下§6区域选择§f\n选择要在某些工具模式中使用的主要块类型\n(§4适用于替换填充等功能§r)", + "litematica.config.hotkeys.name.toolSelectModifierBlock2": "副方块选择", + "litematica.config.hotkeys.comment.toolSelectModifierBlock2": "按住该键时按下§6区域选择§f\n选择要在某些工具模式中使用的辅助块类型\n(§4适用于替换填充等功能§r)", + "litematica.config.hotkeys.name.unloadCurrentSchematic": "卸载投影", + "litematica.config.colors.name.areaSelectionBoxSideColor": "选区边框颜色", + "litematica.config.colors.comment.areaSelectionBoxSideColor": "选区未被选中时边框的颜色", + "litematica.config.colors.name.materialListHudItemCountsColor": "材料数量颜色", + "litematica.config.colors.comment.materialListHudItemCountsColor": "材料列表开启 HUD 后的游戏内材料数量的颜色", + "litematica.config.colors.name.schematicRebuildBreakPlaceOverlayColor": "重建原理图删除指示器", + "litematica.config.colors.comment.schematicRebuildBreakPlaceOverlayColor": "在重建原理图模式的批量删除当中,\n在方向选择器上的指示器颜色", + "litematica.config.colors.name.schematicRebuildReplaceOverlayColor": "重建原理图替换指示器", + "litematica.config.colors.comment.schematicRebuildReplaceOverlayColor": "在重建原理图模式的批量替换当中,\n在方向选择器上的指示器颜色", + "litematica.config.colors.name.schematicOverlayColorExtra": "多余方块颜色", + "litematica.config.colors.comment.schematicOverlayColorExtra": "多余方块在投影内显示的颜色", + "litematica.config.colors.name.schematicOverlayColorMissing": "缺失方块颜色", + "litematica.config.colors.comment.schematicOverlayColorMissing": "缺失方块在投影内显示的颜色", + "litematica.config.colors.name.schematicOverlayColorWrongBlock": "错误方块颜色", + "litematica.config.colors.comment.schematicOverlayColorWrongBlock": "错误方块在投影内显示的颜色", + "litematica.config.colors.name.schematicOverlayColorWrongState": "错误方向颜色", + "litematica.config.colors.comment.schematicOverlayColorWrongState": "方块方向错误在投影内显示的颜色", + "litematica.config.info_overlays.name.blockInfoLinesAlignment": "方块提示位置", + "litematica.config.info_overlays.comment.blockInfoLinesAlignment": "方块信息弹窗的显示位置", + "litematica.config.info_overlays.name.blockInfoLinesEnabled": "方块信息启用", + "litematica.config.info_overlays.comment.blockInfoLinesEnabled": "如果开启该功能,MiniHUD 将显示方块信息\n默认位于屏幕右上角", + "litematica.config.info_overlays.name.blockInfoLinesFontScale": "方块信息大小", + "litematica.config.info_overlays.comment.blockInfoLinesFontScale": "默认在右上角的方块信息的字体大小控制", + "litematica.config.info_overlays.name.blockInfoLinesOffsetX": "方块信息横移", + "litematica.config.info_overlays.comment.blockInfoLinesOffsetX": "方块信息与边框的横向偏移量(横向距离)", + "litematica.config.info_overlays.name.blockInfoLinesOffsetY": "方块信息纵移", + "litematica.config.info_overlays.comment.blockInfoLinesOffsetY": "方块信息与边框的纵向偏移量(纵向距离)", + "litematica.config.info_overlays.name.blockInfoOverlayAlignment": "方块信息位置", + "litematica.config.info_overlays.comment.blockInfoOverlayAlignment": "方块信息在屏幕位置调整的选项", + "litematica.config.info_overlays.name.blockInfoOverlayOffsetY": "方块提示位置纵移", + "litematica.config.info_overlays.comment.blockInfoOverlayOffsetY": "方块信息弹窗的纵向偏移量", + "litematica.config.info_overlays.name.blockInfoOverlayEnabled": "方块提示启用", + "litematica.config.info_overlays.comment.blockInfoOverlayEnabled": "启用方块信息弹窗,其功能为图形显示方块贴图\n主要是可以在投影放错时,为你提供投影原本方块的信息。", + "litematica.config.info_overlays.name.infoHudAlignment": "材料 HUD 位置", + "litematica.config.info_overlays.comment.infoHudAlignment": "材料信息位置的调整\n(其实和材料有关的 HUD 显示都是这玩意)", + "litematica.config.info_overlays.name.infoHudMaxLines": "材料 HUD 行数", + "litematica.config.info_overlays.comment.infoHudMaxLines": "控制材料HUD的最大行数", + "litematica.config.info_overlays.name.infoHudOffsetX": "材料 HUD 横移", + "litematica.config.info_overlays.comment.infoHudOffsetX": "工具 HUD 与边框的纵向偏移量(纵向距离)", + "litematica.config.info_overlays.name.infoHudOffsetY": "材料 HUD 纵移", + "litematica.config.info_overlays.comment.infoHudOffsetY": "材料 HUD 与边框的纵向偏移量(纵向距离)", + "litematica.config.info_overlays.name.infoHudScale": "材料 HUD 缩放", + "litematica.config.info_overlays.comment.infoHudScale": "控制材料HUD的缩放大小", + "litematica.config.info_overlays.name.materialListHudMaxLines": "材料 HUD 最大行数", + "litematica.config.info_overlays.comment.materialListHudMaxLines": "控制材料 HUD 的最大行数", + "litematica.config.info_overlays.name.materialListHudScale": "材料 HUD 缩放", + "litematica.config.info_overlays.comment.materialListHudScale": "控制材料 HUD 的缩放大小", + "litematica.config.info_overlays.name.statusInfoHud": "状态信息 HUD ", + "litematica.config.info_overlays.comment.statusInfoHud": "启用状态信息的显示,该显示内容默认位于左下角\n其内容包含当前渲染层的状态与层数\n当然,这是在手持非木棍的情况下显示的。", + "litematica.config.info_overlays.name.statusInfoHudAuto": "状态 HUD 自动显示", + "litematica.config.info_overlays.comment.statusInfoHudAuto": "允许自动暂时开启状态信息 HUD 比如当需要时,\n例如当创建一个位置或者渲染禁用时", + "litematica.config.info_overlays.name.toolHudAlignment": "工具 HUD 位置", + "litematica.config.info_overlays.comment.toolHudAlignment": "当你使用木棍时,将工具的 HUD 选择区域定位与该位置", + "litematica.config.info_overlays.name.toolHudOffsetX": "工具 HUD 横移", + "litematica.config.info_overlays.name.toolHudOffsetY": "工具 HUD 纵移", + "litematica.config.info_overlays.name.toolHudScale": "工具 HUD 缩放", + "litematica.config.info_overlays.comment.toolHudScale": "控制工具 HUD 的文本缩放大小", + "litematica.config.info_overlays.name.verifierErrorHilightAlpha": "验证错误方块高亮", + "litematica.config.info_overlays.comment.verifierErrorHilightAlpha": "在打开原理图验证程序对当前放置进行验证后,\n点击验证当中出现问题的方块,\n错误的方块将在透视状态下所产生的亮度显示", + "litematica.config.info_overlays.name.verifierErrorHilightMaxPositions": "验证错误方块上限", + "litematica.config.info_overlays.comment.verifierErrorHilightMaxPositions": "在打开原理图验证程序对当前放置进行验证后,\n点击验证当中出现问题的方块,\n错误的方块在透视状态下的最大数量显示", + "litematica.config.info_overlays.name.verifierOverlayEnabled": "原理图验证渲染", + "litematica.config.info_overlays.comment.verifierOverlayEnabled": "启用原理图验证渲染", + "litematica.config.info_overlays.name.warnDisabledRendering": "关闭告警信息", + "litematica.config.info_overlays.comment.warnDisabledRendering": "当加载一个新的示意图或创建一个新的位置时,\n是否应该显示关于该层的一些警告消息", + "litematica.config.visuals.name.enableAreaSelectionBoxesRendering": "选区边框启用切换", + "litematica.config.visuals.comment.enableAreaSelectionBoxesRendering": "该选项可以切换是否显示选区的边框", + "litematica.config.visuals.name.enablePlacementBoxesRendering": "投影边框启用切换", + "litematica.config.visuals.comment.enablePlacementBoxesRendering": "该选项可以切换是否显示投影区域的边框", + "litematica.config.visuals.name.enableRendering": "开启全部渲染", + "litematica.config.visuals.comment.enableRendering": "主渲染切换选项,该选项可切换所有渲染是否开启", + "litematica.config.visuals.name.enableSchematicBlocksRendering": "投影方块显示", + "litematica.config.visuals.comment.enableSchematicBlocksRendering": "该选项可以切换是否在投影内显示方块的贴图\n(开启后可以更好辨识出投影缺失的是什么方块)", + "litematica.config.visuals.name.enableSchematicOverlay": "渲染方块特征", + "litematica.config.visuals.comment.enableSchematicOverlay": "该选项可以切换是否在投影内使用边框表示未放置的方块\n未被放置的方块虽然没有边框,但是仍可以显示(显示状态由透明度决定)", + "litematica.config.visuals.name.enableSchematicRendering": "渲染投影", + "litematica.config.visuals.comment.enableSchematicRendering": "该选项可以切换是否显示投影原理图", + "litematica.config.visuals.name.ghostBlockAlpha": "虚影方块透明度", + "litematica.config.visuals.name.placementBoxSideAlpha": "放置边框透明度", + "litematica.config.visuals.comment.placementBoxSideAlpha": "子区域边框的透明度(§2没有找到实际的功能体现——ZMDF§r)", + "litematica.config.visuals.name.overlayReducedInnerSides": "减少内侧面渲染", + "litematica.config.visuals.comment.overlayReducedInnerSides": "如果启用,可以使得投影内方块接触的侧面不被显示\n有两个优点\n-1. 首先减少了投影的渲染工作量\n-2. 在投影内部时,内部的杂色会变淡\n(§6虽然默认是关闭但建议开启-ZMDF§r)", + "litematica.config.visuals.name.renderAreaSelectionBoxSides": "选择框边渲染", + "litematica.config.visuals.comment.renderAreaSelectionBoxSides": "该选项可以选择是否开启选区边框显示(渲染)", + "litematica.config.visuals.name.renderBlocksAsTranslucent": "方块半透明化", + "litematica.config.visuals.comment.renderBlocksAsTranslucent": "如果启用该选项,投影原理图内的方块展示将由\n不透明变为半透明状态", + "litematica.config.visuals.name.renderCollidingSchematicBlocks": "渲染重叠块", + "litematica.config.visuals.comment.renderCollidingSchematicBlocks": "如果启用该选项,那么当客户端世界中存在错误的方块时\n投影原理图内的方块仍然会进行显示\n当你试图在一些有水或着雪层的地方建造时。\n(就是无视雪片与流动液体的意思,大概)", + "litematica.config.visuals.name.renderErrorMarkerConnections": "验证器错误连接", + "litematica.config.visuals.comment.renderErrorMarkerConnections": "启用该选项时,当用户在使用验证器验证原理图是否正确后,\n当你在验证器内选中了错误方块\n错误方块间会有连线。\n(这个功能有部分bug,但是作者应该是为了方便错误方块的定位)", + "litematica.config.visuals.name.renderErrorMarkerSides": "验证器错误显示", + "litematica.config.visuals.comment.renderErrorMarkerSides": "关闭该选项时,用户在使用验证器验证原理图是否正确后,\n当你在验证器内选中了错误方块\n它的展示方式将不仅仅标明颜色,\n还会标明它的贴图(便于用户知道错误的方块是什么)", + "litematica.config.visuals.name.renderPlacementBoxSides": "放置框渲染", + "litematica.config.visuals.comment.renderPlacementBoxSides": "如果启用该选项,则放置区域会显示侧面颜色\n(§6就是侧面将显示默认的选区颜色,影响视线——ZMDF§r)", + "litematica.config.visuals.name.renderPlacementEnclosingBox": "渲染封闭放置", + "litematica.config.visuals.comment.renderPlacementEnclosingBox": "如果启用,则在投影中的所有子区域周围呈现一个封闭框", + "litematica.config.visuals.name.renderPlacementEnclosingBoxSides": "渲染封闭放置边缘", + "litematica.config.visuals.comment.renderPlacementEnclosingBoxSides": "如果启用,则在投影中的所有子区域周围的封闭框会显示一个完整的面", + "litematica.config.visuals.name.renderTranslucentBlockInnerSides": "渲染投影方块", + "litematica.config.visuals.comment.renderTranslucentBlockInnerSides": "如果启用该选项,则投影内所有方块的面将成为透明\n(这将使得你可以看透很多方块,嗯没错,看透。)", + "litematica.config.visuals.name.schematicOverlayEnableOutlines": "渲染框线", + "litematica.config.visuals.comment.schematicOverlayEnableOutlines": "如果启用该选项,投影原理图方块边框的框线将会显示", + "litematica.config.visuals.name.schematicOverlayEnableSides": "渲染块面", + "litematica.config.visuals.comment.schematicOverlayEnableSides": "如果启用该选项,投影原理图方块的块面将会显示", + "litematica.config.visuals.name.schematicOverlayModelOutline": "覆盖模型框线", + "litematica.config.visuals.comment.schematicOverlayModelOutline": "如果启用,那么示意图覆盖将使用块模型的四块/顶点,而不是传统的全块覆盖\n(主要针对不完整方块)", + "litematica.config.visuals.name.schematicOverlayModelSides": "覆盖模型块面", + "litematica.config.visuals.name.schematicOverlayOutlineWidth": "轮廓线宽度", + "litematica.config.visuals.comment.schematicOverlayOutlineWidth": "投影原理图当中方块轮廓线的宽度设置", + "litematica.config.visuals.name.schematicOverlayOutlineWidthThrough": "透视轮廓线宽度", + "litematica.config.visuals.comment.schematicOverlayOutlineWidthThrough": "投影原理图当中透视方块轮廓线的宽度设置", + "litematica.config.visuals.name.schematicOverlayRenderThroughBlocks": "原理图透视", + "litematica.config.visuals.comment.schematicOverlayRenderThroughBlocks": "如果启用,那么原理图将可透视观察。\n这可能只在您完成构建并希望更容易地看到任何错误时才有用", + "litematica.config.visuals.name.schematicOverlayTypeExtra": "原理图透视多余", + "litematica.config.visuals.comment.schematicOverlayTypeExtra": "当开启了原理图透视后,关闭该选项将不再显示多余的方块", + "litematica.config.visuals.name.schematicOverlayTypeMissing": "原理图透视缺失", + "litematica.config.visuals.comment.schematicOverlayTypeMissing": "当开启了原理图透视后,关闭该选项将不再显示缺失的方块", + "litematica.config.visuals.name.schematicOverlayTypeWrongBlock": "原理图透视错误", + "litematica.config.visuals.comment.schematicOverlayTypeWrongBlock": "当开启了原理图透视后,关闭该选项将不再显示错误的方块", + "litematica.config.visuals.name.schematicOverlayTypeWrongState": "原理图透视错位", + "litematica.config.visuals.comment.schematicOverlayTypeWrongState": "当开启了原理图透视后,关闭该选项将不再显示错位的方块", + "litematica.config.visuals.name.schematicVerifierUseBlockModels": "原理图验证图片", + "litematica.config.visuals.comment.schematicVerifierUseBlockModels": "当你使用原理图验证的时候,如果你开启了该选项,\n那么原理图验证界面当中,只会存在文字,而并非方块贴图", + "litematica.config.generic.name.areaSelectionsPerWorld": "世界区域选择", + "litematica.config.generic.name.changeSelectedCornerOnMove": "更改角点选择", + "litematica.config.generic.comment.changeSelectedCornerOnMove": "如果启用,那么在使用角点模式进行区域选择时\n区域选择的角总是被设置为最后选择的角\n(最后选择的角就是角点的框线与面都有颜色)\n(PS:虽然在实际使用过程当中没有太大影响)", + "litematica.config.generic.name.easyPlaceMode": "简单放置模式", + "litematica.config.generic.name.easyPlaceHoldEnabled": "简单放置状态", + "litematica.config.generic.name.executeRequireHoldingTool": "执行长按工具", + "litematica.config.generic.comment.executeRequireHoldingTool": "需要持有已启用的工具项以使 executeOperation 热键工作", + "litematica.config.generic.name.fixRailRotation": "铁路旋转修复", + "litematica.config.generic.comment.fixRailRotation": "如果为真,那么就对轨道中常见的 Bug 进行了修正,\n即南北方向和东西方向的直线轨道 180 度旋转时逆时针旋转90度,而不是 >_>\n应该是对于轨道显示做了调整", + "litematica.config.generic.name.loadEntireSchematics": "加载全部投影", + "litematica.config.generic.comment.loadEntireSchematics": "如果启用,那么整个投影总是同时加载。如果为关闭,则只加载客户端视距内的部分。", + "litematica.config.generic.name.pasteIgnoreInventories": "忽略粘贴库存", + "litematica.config.generic.comment.pasteIgnoreInventories": "粘贴示意图时不要粘贴库存内容\n(大概指箱子内物品)", + "litematica.config.generic.name.pasteReplaceBehavior": "粘贴替换模式", + "litematica.config.generic.comment.pasteReplaceBehavior": "在粘贴原理图工具模式中替换现有块的方式", + "litematica.config.generic.name.pickBlockEnabled": "方块抓取启用", + "litematica.config.generic.name.pickBlockableSlots": "快捷选择栏位", + "litematica.config.generic.comment.pickBlockableSlots": "允许用于投影原理图挑选的快捷栏\n(12345 大概是整个背包加上副手)", + "litematica.config.generic.name.placementRestrictionWarn": "放置限制警告", + "litematica.config.generic.name.renderMaterialListInGuis": "在 GUI 中显示材质列表", + "litematica.config.generic.comment.renderMaterialListInGuis": "材质列表是否应该在 GUI 中呈现", + "litematica.config.generic.name.renderThreadNoTimeout": "移除渲染超时", + "litematica.config.generic.comment.renderThreadNoTimeout": "从渲染工作线程中移除超时。\n如果你在处理大型原理图的时候渲染的很不流畅,\n试着禁用它。但是在某些情况下,它会使示意图的渲染速度慢很多。", + "litematica.config.generic.name.selectionCornersMode": "选择选区模式", + "litematica.config.generic.comment.selectionCornersMode": "要使用的区域选择模式(角点,或展开)", + "litematica.config.generic.name.toolItem": "工具", + "litematica.config.generic.comment.toolItem": "作为用于选择的工具,虽然默认是木棍\n(§3但是其实你想拿末影龙头也是可以的hhh§r)", + "litematica.config.generic.name.toolItemEnabled": "启用工具项目", + "litematica.config.generic.comment.toolItemEnabled": "如果启用该选项,那么你可以使用工具进行操作\n如果你关了的话,那它就是一根朴素的木棍\n§6如果你没有改默认工具的话——ZMDF§r", + "litematica.config.colors.name.schematicRebuildBreakExceptPlaceOverlayColor": "重建原理图保留指示器", + "litematica.config.colors.comment.schematicRebuildBreakExceptPlaceOverlayColor": "在重建原理图模式当中,选择保留方块的指示器颜色", + "litematica.config.colors.name.hightlightBlockInInventoryColor": "高亮显示颜色", + "litematica.config.colors.comment.hightlightBlockInInventoryColor": "在物品栏中高亮显示目标方块的颜色", + "litematica.config.generic.name.debugLogging": "调试日志", + "litematica.config.generic.comment.debugLogging": "在游戏控制台中启用一些调试日志消息,用于调试某些问题或崩溃。", + "litematica.config.generic.name.highlightBlockInInventory": "物品栏高亮显示", + "litematica.config.generic.comment.highlightBlockInInventory": "当启用时,背包内高亮显示指向原理图的方块\n(无论是物品栏还是潜影盒)", + "litematica.config.generic.name.layerModeFollowsPlayer": "图层显示跟随", + "litematica.config.generic.comment.layerModeFollowsPlayer": "如果开启,则渲染层跟随玩家,但是只能跟随当前高度", + "litematica.config.generic.name.pickBlockShulkers": "潜影盒选块", + "litematica.config.generic.comment.pickBlockShulkers": "如果启用,那么如果选取方块物品没有在玩家背包找到\n那么就切换出包含他的潜影盒", + "litematica.config.visuals.name.ignoreExistingFluids": "忽略投影内液体", + "litematica.config.visuals.comment.ignoreExistingFluids": "如果启用该选项,原理图中如果有空气或其他块,\n那么任何的「额外块」或「错误块」的液体将被忽略。\n基本上,这使得在水下建造东西少了很多麻烦。\n注意:你很可能还想同时启用「renderCollidingSchematicBlocks(渲染重叠块)」,以允许块在流体中渲染。", + "litematica.config.generic.comment.areaSelectionsPerWorld": "使用每个世界或服务器根目录进行区域选择\n§6注意:直播时请勿关闭此功能,\n§6否则区域选择浏览器将显示服务器 IP\n§6在指南以及当前选择名称/路径中\n§6直到您再次更改当前目录和选择", + "litematica.config.generic.comment.easyPlaceHoldEnabled": "启用后,您可以按住使用键\n根据投影以放置它们,\n而无需单独点击每个方块", + "litematica.config.generic.comment.easyPlaceMode": "启用后,只需根据投影以放置它们", + "litematica.config.visuals.comment.ghostBlockAlpha": "虚影方块的 alpha 值,当它们渲染为半透明时\n§6注意:§7您还需要单独启用方块半透明化,\n使用「renderBlocksAsTranslucent」选项!", + "litematica.config.generic.name.easyPlaceFirst": "简单放置最近块", + "litematica.config.generic.comment.easyPlaceFirst": "这将使得简单放置模式放置你首先看到的方块\n而不是最远的方块,设置为关闭将可以放置多层\n因为是由远到近放置。", + "litematica.config.generic.name.easyPlaceSinglePlayerHandling": "单机精准放置", + "litematica.config.generic.name.generateLowercaseNames": "命名建议", + "litematica.config.generic.comment.generateLowercaseNames": "如果启用,则默认情况下建议的原理图名称将为小写并使用下划线而不是空格", + "litematica.config.generic.name.pasteIgnoreEntities": "实体屏蔽", + "litematica.config.generic.comment.pasteIgnoreEntities": "如果启用,则粘贴功能将不会粘贴任何实体", + "litematica.config.generic.name.pasteNbtRestoreBehavior": "NBT 迁移", + "litematica.config.generic.comment.pasteNbtRestoreBehavior": "需要用何种方法尝试恢复方块 NBT 数据? \n- Place & Data Modify,会把带 NBT 的方块放在玩家附近后 \n 用 data modify 指令转换这些用 setblock 放的方块 \n- Place & Clone,会尝试放置带 NBT 方块在玩家附近然后 \n 用 clone 指令复制到最终位置 \n- Teleport & Place,会尝试 tp 到附近位置然后直接在 \n 正确的位置放下带 NBT 方块 \n请注意 Teleport & Place 方法现在不太好用甚至完全用不了。 \n建议的方法是 Place & Data Modify,然而要让这种方法生效 \n得降低粘贴命令限制到 1/tick 并将粘贴间隔增加到 \n1-4 个 tick 或者调别的什么东西 \n因此你只应当用这种方法粘贴需要迁移数据的重要方块。 \n例如,做了包含库存内容的原理图, \n然后在替换规则被设置为 None 的时候粘贴原理图。", + "litematica.config.generic.name.pasteToMcFunctionFiles": "原理图转存", + "litematica.config.generic.comment.pasteToMcFunctionFiles": "如果启用,则不是将实际的原理图粘贴到世界,\n它们将作为 setblock 命令写入文本文件。", + "litematica.config.info_overlays.name.infoOverlaysTargetFluids": "流体信息穿透", + "litematica.config.info_overlays.comment.infoOverlaysTargetFluids": "启用后,方块信息叠加时\n将能够焦点定位到流体块而不是穿过它们", + "litematica.config.hotkeys.name.easyPlaceUseKey": "简单放置应用", + "litematica.config.hotkeys.comment.easyPlaceUseKey": "当启用简单放置时,此键用于放置方块", + "litematica.config.generic.name.easyPlaceProtocolVersion": "简单放置协议", + "litematica.config.generic.name.easyPlaceVanillaReach": "简单放置原版修正", + "litematica.config.generic.comment.easyPlaceVanillaReach": "如果启用,手长将从 6 改为 4.5\n服务器便不会拒绝放置方块", + "litematica.config.generic.name.unhideSchematicVCS": "不隐藏原理图版本控制系统", + "litematica.config.generic.comment.unhideSchematicVCS": "取消隐藏 Schematic VCS(版本控制系统)菜单按钮,\n并启用热键和 VCS 功能。(这之前被称为原理图项目。)\n\n一般来说,你不应该使用这个功能,\n除非你真的知道它是如何工作的。\n它在一定程度上改变了区域选择、放置和粘贴的工作方式,\n特别是在粘贴时还存在一个区域删除操作。\n\n基本上,这个功能是为更新、修改原理图而设计的,\n它允许你更容易地为同一版本原理图创建多个版本/快照,\n也可以通过先删除当前版本,\n然后粘贴下一个版本来在不同版本之间切换。", + "litematica.config.generic.name.easyPlaceSwapInterval": "简单放置延迟补正", + "litematica.config.generic.comment.easyPlaceSwapInterval": "简单放置模式在背包和手中块交换后等待的间隔(以毫秒为单位)。有效避免因为高 ping 放置错误的方块。", + "litematica.config.generic.name.cloneAtOriginalPosition": "原位克隆", + "litematica.config.generic.comment.cloneAtOriginalPosition": "如果启用,那么使用克隆快捷键时\n将在原来选择的区域位置克隆,\n而不是在玩家的当前位置", + "litematica.config.generic.name.commandDisableFeedback": "禁用命令反馈", + "litematica.config.generic.comment.commandDisableFeedback": "如果启用,命令反馈将被自动禁用,\n然后在多人游戏中的粘贴,填充和删除操作\n(使用 /setblock 和 /fill命令)将没有反馈,\n即在仅仅在任务开始时禁用 sendCommandFeedback 游戏规则\n在任务结束时重新启用 sendCommandFeedback 游戏规则", + "litematica.config.generic.name.commandUseWorldEdit": "使用 WorldEdit 指令", + "litematica.config.generic.comment.commandUseWorldEdit": "如果启用该功能,而不是使用已经配置的 setblock 或 fill 命令,\n则使用 World Edit 的 //pos1、//pos2 和 //set 命令。\n注意,使用 WorldEdit 指令会比正常粘贴大约慢 3 倍\n且由于每 tick 的命令限制,比起使用普通命令,\n我们需要每个块或区域执行多个命令(//pos1 //pos2 //set)。\n§6警告:如果使用 WorldEdit 指令或 fill 命令而不是单独的 setblock 命令!\n§6粘贴与替换功能将无法使用!\n因此,如果您有权限运行它们,建议使用普通命令。\n另一件让你在某些情况下更喜欢使用 WE 命令的事情是,\n如果服务器没有 Carpet mod 所导致的「/Carpet fillUpdates false」\n规则不可用时,可以使用该功能防止方块更新。", + "litematica.config.generic.name.customSchematicBaseDirectoryEnabled": "自定目录路径", + "litematica.config.generic.comment.customSchematicBaseDirectoryEnabled": "如果启用该功能,则在「customSchematicBaseDirectory」\n中设置的目录路径将用为原理图的根目录,\n而不是正常的§1 .minecraft/schematics/ §r目录", + "litematica.config.generic.comment.easyPlaceSinglePlayerHandling": "如果启用该功能,那么投影将在单人游戏中处理所谓的「地毯精确放置协议」。\n如果你打算在单人游戏中使用简单放置,建议保持启用。", + "litematica.config.generic.name.pasteUseFillCommand": "使用 fill 填充", + "litematica.config.generic.comment.pasteUseFillCommand": "如果启用了该功能,那么粘贴时不是只使用单独的 /setblock 命令,\n而是基于命令的粘贴操作(比如在服务器后台使用)会尝试对\n同一块的任何连续区域使用 /fill 命令。这在单人游戏中没有效果,\n因为 Mod 直接在服务器的世界中设置方块,而且根本不使用命令。", + "litematica.config.generic.comment.placementRestrictionWarn": "当简单放置模式或放置限制阻止玩家放置一个方块时,\n选择要显示的警告信息类型\n-物品栏模式:显示在物品栏上方\n-消息模式:橙色的弹出消息样式", + "litematica.config.generic.name.commandFillMaxVolume": "最大命令填充体积", + "litematica.config.generic.comment.commandFillMaxVolume": "可以通过命令填充/删除操作更改的每个单独框的最大的大小/体积。\n更大的区域/体积将被分割为多个命令去执行。\n但无论如何,所有区域在一开始也被分割为多个区块。", + "litematica.config.generic.name.commandLimitPerTick": "命令限速", + "litematica.config.generic.comment.commandLimitPerTick": "当玩家在服务器上使用粘贴,填充和删除功能时,他们将使用 setblock 和 fill 指令,\n该变量控制每个游戏周期所发送的最大指令数。请注意,在使用 NBT 恢复功能时,\n粘贴功能可能会因几个命令而失败,这需要为每个块添加两个额外的指令。", + "litematica.config.generic.name.commandNameClone": "Clone 命名", + "litematica.config.generic.comment.commandNameClone": "在服务器的创造模式中使用 clone 命令时要使用的 clone 命令名\n如果 NBT 迁移选项设置为「Place & Clone」,则当前功能仅使用粘贴。", + "litematica.config.generic.name.commandNameFill": "fill 命名", + "litematica.config.generic.comment.commandNameFill": "在服务器的创造模式中使用 fill 命令时要使用的 fill 命令名", + "litematica.config.generic.name.commandNameSetblock": "Setblock 命名", + "litematica.config.generic.comment.commandNameSetblock": "在服务器的创造模式中使用 setblock 命令时要使用的\nsetblock 命令名,即在世界上粘贴原理图功能", + "litematica.config.generic.name.commandNameSummon": "Summon 命名", + "litematica.config.generic.comment.commandNameSummon": "在服务器的创造模式中使用Summon 命令时要使用的\nSummon 命令名,即在世界上粘贴原理图功能", + "litematica.config.generic.name.commandTaskInterval": "任务间隔", + "litematica.config.generic.comment.commandTaskInterval": "游戏中的粘贴,填充和删除任务的 tick 间隔。\ncommandLimitPerTick 配置设置每次执行发送的命令的最大数量,\n这个变量配置下一次执行命令之前的游戏时间间隔。", + "litematica.config.generic.comment.customSchematicBaseDirectory": "如果启用了自定义原理图目录\n所要使用的原理图的根目录", + "litematica.config.hotkeys.name.schematicEditBreakPlaceAll": "删除同类方块", + "litematica.config.hotkeys.comment.schematicEditBreakPlaceAll": "在重建原理图模式当中\n按住该按键可以删除所有同类方块", + "litematica.config.hotkeys.name.schematicEditBreakAllExcept": "删除其他方块", + "litematica.config.hotkeys.comment.schematicEditBreakAllExcept": "在重建原理图的模式当中\n按住该键可使得玩家在原理图当中仅保留指定的选中方块\n这也就意味着除了你选中的方块,其他投影方块将被删除。", + "litematica.config.hotkeys.name.schematicEditBreakPlaceDirection": "同方块线性增删", + "litematica.config.hotkeys.comment.schematicEditBreakPlaceDirection": "在重建原理图的模式当中\n按住该键可添加或删除原理图内指定方向的相同方块\n如果使用添加,该方块会填满该方向的所有空位", + "litematica.config.hotkeys.name.schematicEditReplaceAll": "替换同类方块", + "litematica.config.hotkeys.comment.schematicEditReplaceAll": "在重建原理图的模式当中\n按住该键可使用手中方块替换原理图内的相同方块", + "litematica.config.hotkeys.name.schematicEditReplaceBlock": "替换其他方块", + "litematica.config.hotkeys.comment.schematicEditReplaceBlock": "在重建原理图的模式当中\n按住该键可使用手中方块替换原理图内的相同类型方块\n然而这个类型很模糊", + "litematica.config.hotkeys.name.schematicEditReplaceDirection": "同方块线性替换", + "litematica.config.hotkeys.comment.schematicEditReplaceDirection": "在重建原理图的模式当中\n按住该键可使用手中方块替换原理图内指定方向的相同方块", + "litematica.config.generic.name.commandFillNoChunkClamp": "命令填充无区块限制", + "litematica.config.generic.comment.commandFillNoChunkClamp": "禁用将填充体积划分为子区块\n(在填充、替换和删除模式下)\n效果:填充、替换和删除操作在功能开启前是按子区块操作的\n开启功能候是直接批量删\n(样本较少没有看出是什么方式)", + "litematica.config.generic.name.itemUsePacketCheckBypass": "物品使用校验", + "litematica.config.generic.comment.itemUsePacketCheckBypass": "该功能绕过了 1.18.2 中新添加的距离/坐标校验。\n该校验破坏了「精确放置协议」的功能\n并导致任何带有旋转(或其他属性)\n请求放置的方块变成了幽灵方块\n基本上没有必要禁用这个校验。\n因为在 1.18.2 之前,这个校验甚至都不存在", + "litematica.config.generic.name.pasteAlwaysUseFill": "粘贴总是使用 fill", + "litematica.config.generic.comment.pasteAlwaysUseFill": "这将会强制使用 fill 命令(而不是 setblock),即使是单个方块", + "litematica.config.generic.name.pasteIgnoreBlockEntitiesEntirely": "粘贴忽略实体方块", + "litematica.config.generic.comment.pasteIgnoreBlockEntitiesEntirely": "如果启用,则在多人游戏中通过基于命令的粘贴根本不粘贴实体方块。\n如果你想在第二遍中对箱子等方块使用 NBT-restore(NBT 迁移)选项,\n这使您可以更轻松地在第二遍中粘贴,\n然而这通常需要更慢的粘贴速度/命令速率。", + "litematica.config.generic.name.pasteIgnoreBlockEntitiesFromFill": "fill 忽略实体方块", + "litematica.config.generic.comment.pasteIgnoreBlockEntitiesFromFill": "如果启用,那么在使用填充命令(fill)粘贴时将忽略所有实体方块。\n这使得实体方块可以单独粘贴,如果想要使用 NBT-restore(NBT 迁移)恢复选项,\n这是必需的。", + "litematica.config.generic.name.pasteIgnoreCommandLimitWithNbtRestore": "粘贴忽略命令限制与 NBT 恢复", + "litematica.config.generic.comment.pasteIgnoreCommandLimitWithNbtRestore": "如果启用,则在粘贴带有启用了 NBT-restore(NBT 迁移)选项的实体方块时将忽略命令限制。\n 这似乎以某种方式解决了一个问题,即NBT-restore(NBT 迁移)会因许多命令速率低的方块而失败。", + "litematica.config.hotkeys.name.toggleSignTextPaste": "告示牌文本", + "litematica.config.hotkeys.comment.toggleSignTextPaste": "开关告示牌文本的选项(在通用类别中)", + "litematica.config.generic.name.signTextPaste": "告示牌文本", + "litematica.config.generic.comment.signTextPaste": "该功能能在原理图的覆盖层显示投影中告示牌的内容\n§d这样就不用背了捏~", + "litematica.config.generic.name.fixChestMirror": "大箱子修复", + "litematica.config.generic.comment.fixChestMirror": "修复投影中破碎的大箱子", + "litematica.config.generic.name.pasteUsingCommandsInSp": "部分粘贴", + "litematica.config.generic.comment.pasteUsingCommandsInSp": "这是一个临时的方法,可以在单人游戏中基于命令粘贴,\n这使得在单人游戏中可以使用部分渲染层粘贴原理图,\n但这目前不适用于单人游戏通常使用的粘贴方式。", + "litematica.config.generic.name.pickBlockAvoidDamageable": "避免选择耐久物品", + "litematica.config.generic.comment.pickBlockAvoidDamageable": "在开启简单放置后,避免方块替换掉任何在快捷栏中\n有耐久度的物品。§d例如:打火石,毛刷等§r", + "litematica.config.generic.name.pickBlockAvoidTools": "避免选择工具", + "litematica.config.generic.comment.pickBlockAvoidTools": "在开启简单放置后,避免方块替换掉任何在快捷栏中的工具。", + "litematica.config.generic.name.placementReplaceBehavior": "粘贴替换模式优化", + "litematica.config.generic.name.materialListIgnoreState": "材料清单忽略状态", + "litematica.config.generic.comment.materialListIgnoreState": "启用后,将忽略确切的方块状态,仅需要匹配方块类型。", + "litematica.config.generic.name.customSchematicBaseDirectory": "customSchematicBaseDirectory", + "litematica.config.generic.name.betterRenderOrder": "betterRenderOrder", + "litematica.config.generic.name.datafixerMode": "datafixerMode", + "litematica.config.generic.name.datafixerDefaultSchema": "datafixerDefaultSchema", + "litematica.config.generic.name.entityDataSync": "entityDataSync", + "litematica.config.generic.name.entityDataSyncBackup": "entityDataSyncBackup", + "litematica.config.generic.name.pasteUsingServux": "pasteUsingServux", + "litematica.config.generic.name.placementRestriction": "placementRestriction", + "litematica.config.generic.name.serverNbtRequestRate": "serverNbtRequestRate", + "litematica.config.visuals.name.renderSchematicMaxThreads": "renderSchematicMaxThreads", + "litematica.config.visuals.name.schematicOverlayEnableResorting": "schematicOverlayEnableResorting", + "litematica.config.generic.comment.easyPlaceProtocolVersion": "The type of \"accurate placement protocol\" to use.\n- Auto: Uses v3 in single player, and by default Slabs-only in multiplayer,\n unless the server has Carpet mod that sends a 'carpet:hello'\n packet, in which case v2 is used on that server.\n- Version 3: Only supported by Litematica itself (in single player) or with Servux.\n- Version 2: Compatible with servers with the Carpet mod\n (either QuickCarpet by skyrising and DeadlyMC,\n or CarpetExtra in addition to FabricCarpet.\n And in both cases the 'accurateBlockPlacement' Carpet rule needs\n to be enabled on the server).\n- Slabs only: Only fixes top slabs. Compatible with Paper servers.\n- None: Does not modify coordinates.", + "litematica.config.generic.comment.placementReplaceBehavior": "The block replace behavior when adding blocks\nto the schematic world.\n\nThis allows using overlapped placements without the\nlater handled placement always overwriting earlier ones with air.\nOn the other hand some blocks like light blocks are considered\nto be air, so they would need the \"All\" replace behavior\nto get placed at all.", + "litematica.config.generic.comment.betterRenderOrder": "If enabled, then the schematic rendering is done\nby injecting the different render call into the vanilla\nrendering code. This should result in better translucent block\nrendering/ordering and schematic blocks not getting rendered\nthrough the client world blocks/terrain.\nIf the rendering doesn't work (for example with Optifine),\ntry disabling this option.", + "litematica.config.generic.comment.datafixerMode": "The configurable data fixer level to apply to loaded schematics.\nThis option can improve performance of loading\nschematics by bypassing the Vanilla Data Fixer,\nbut this can also cause severe data loss if it is disabled.", + "litematica.config.generic.comment.datafixerDefaultSchema": "Default Schema Value for the Vanilla Data Fixer\n\nUsed to adjust the lowest possible value, and the value used\nwhen the loaded schematic does not contain this information.\n\n§6WARNING: This setting is meant to be used at the direction\n§6from a Litematica developer such as masa themselves.\n§6When in doubt, keep the default for Minecraft 1.12.", + "litematica.config.generic.comment.entityDataSync": "Use the Entity Data Sync protocol from Servux\nto obtain Entity Data from the server", + "litematica.config.generic.comment.entityDataSyncBackup": "Use the Vanilla NBT Query method when Servux\nis not available. This method requires Operator Privileges.", + "litematica.config.generic.comment.pasteUsingServux": "Use Servux to paste a schematic directly to the server.\nThis method is much faster than the traditional\ncommand-based method, and it supports restoring\nEntity NBT Data.", + "litematica.config.generic.comment.pickBlockEnabled": "Enables the schematic world pick block hotkeys.\nThere is also a hotkey for toggling this option to toggle those hotkeys... o.o", + "litematica.config.generic.comment.placementRestriction": "When enabled, the use key can only be used\nwhen holding the correct item for the targeted position,\nand the targeted position must have a missing block in the schematic", + "litematica.config.generic.comment.serverNbtRequestRate": "Limit request rate for server entity data syncer", + "litematica.config.visuals.comment.renderSchematicMaxThreads": "Maximum Schematic World Rendering Thread Size\nThis will directly effect overall multi-threaded performance\n\n§6USE WITH CAUTION!! This will only take effect\n§6after you leave the game, and rejoin.", + "litematica.config.visuals.comment.schematicOverlayEnableResorting": "Enables Translucent Sorting for\nthe schematic block overlay", + "litematica.config.visuals.comment.schematicOverlayModelSides": "If enabled, then the schematic overlay will use the\nblock model quads/vertices instead of the\ntraditional full block overlay", + "litematica.config.info_overlays.comment.toolHudOffsetX": "The X offset of the Info HUD from the screen edge", + "litematica.config.info_overlays.comment.toolHudOffsetY": "The Y offset of the Info HUD from the screen edge", + "litematica.config.hotkeys.comment.schematicVersionCyclePrevious": "A hotkey to cycle to the next schematic version in the Version Control tool mode", + "litematica.config.hotkeys.comment.unloadCurrentSchematic": "Unloads the schematic of the currently selected placement,and thus also removes all placements created from it", + "litematica.config.generic.prettyName.pickBlockEnabled": "方块抓取启用", + "litematica.config.generic.prettyName.easyPlaceMode": "简单放置模式", + "litematica.config.generic.prettyName.placementRestriction": "放置位置限制", + "litematica.config.generic.prettyName.signTextPaste": "告示牌文本", + "litematica.config.generic.prettyName.toolItemEnabled": "启用工具项目", + "litematica.config.visuals.prettyName.enableAreaSelectionBoxesRendering": "选区边框启用切换", + "litematica.config.visuals.prettyName.enablePlacementBoxesRendering": "投影边框启用切换", + "litematica.config.visuals.prettyName.enableRendering": "开启全部渲染", + "litematica.config.visuals.prettyName.enableSchematicBlocksRendering": "投影方块显示", + "litematica.config.visuals.prettyName.enableSchematicOverlay": "渲染方块特征", + "litematica.config.visuals.prettyName.enableSchematicRendering": "渲染投影", + "litematica.config.visuals.prettyName.renderBlocksAsTranslucent": "方块半透明化", + "litematica.config.visuals.prettyName.schematicOverlayEnableOutlines": "渲染框线", + "litematica.config.visuals.prettyName.schematicOverlayEnableResorting": "schematicOverlayEnableResorting", + "litematica.config.visuals.prettyName.schematicOverlayEnableSides": "渲染块面", + "litematica.config.info_overlays.prettyName.blockInfoOverlayEnabled": "方块提示启用", + "litematica.config.info_overlays.prettyName.verifierOverlayEnabled": "原理图验证渲染", + "litematica.config.hotkeys.prettyName.toggleAllRendering": "全部渲染" +}