From fac1337f50db7ef3f3fb97fefc2a6297124ec857 Mon Sep 17 00:00:00 2001
From: ABKQPO <93412322+ABKQPO@users.noreply.github.com>
Date: Tue, 6 Oct 2026 14:07:07 +0800
Subject: [PATCH 1/6] add channel and tier locked
---
.../guide/compiler/tags/RecipeCompiler.java | 4 +-
.../guidenh/guide/document/DefaultStyles.java | 2 +-
.../document/block/LytBalancedColumns.java | 94 ++++++++++---------
.../internal/host/scripts/RecipeScript.java | 4 +
.../syntax/BuiltinSyntaxContributor.java | 16 +++-
.../guide/scene/LytGuidebookScene.java | 6 ++
.../guide/scene/StructureLibSceneBinding.java | 31 +++++-
.../ImportStructureLibElementCompiler.java | 1 +
.../StructureLibSceneOptionParser.java | 21 ++++-
.../site/GuideSiteRecipeTagRenderer.java | 19 ++++
.../GuideNhClientIntegrationBootstrap.java | 2 -
.../GuideNhIntegrationBootstrap.java | 2 -
.../StructureLibSceneMetadata.java | 74 ++++++++++++++-
.../StructureLibSceneOptions.java | 71 ++++++++++++++
.../assets/guidenh/siteexport/app.css | 10 +-
.../public/reference/de/_de/GameScene.md | 12 ++-
.../public/reference/de/_de/Tags-Reference.md | 4 +-
.../public/reference/en/_us/GameScene.md | 12 ++-
.../public/reference/en/_us/Tags-Reference.md | 4 +-
.../public/reference/es/_es/GameScene.md | 12 ++-
.../public/reference/es/_es/Tags-Reference.md | 4 +-
.../public/reference/fr/_fr/GameScene.md | 12 ++-
.../public/reference/fr/_fr/Tags-Reference.md | 4 +-
.../public/reference/ja/_jp/GameScene.md | 12 ++-
.../public/reference/ja/_jp/Tags-Reference.md | 4 +-
.../public/reference/nl/_nl/GameScene.md | 12 ++-
.../public/reference/nl/_nl/Tags-Reference.md | 4 +-
.../public/reference/pl/_pl/GameScene.md | 12 ++-
.../public/reference/pl/_pl/Tags-Reference.md | 4 +-
.../public/reference/pt/_br/GameScene.md | 12 ++-
.../public/reference/pt/_br/Tags-Reference.md | 4 +-
.../public/reference/ru/_ru/GameScene.md | 12 ++-
.../public/reference/ru/_ru/Tags-Reference.md | 4 +-
.../public/reference/uk/_ua/GameScene.md | 12 ++-
.../public/reference/uk/_ua/Tags-Reference.md | 4 +-
.../public/reference/zh/_cn/GameScene.md | 12 ++-
.../public/reference/zh/_cn/Tags-Reference.md | 4 +-
.../public/reference/zh/_tw/GameScene.md | 12 ++-
.../public/reference/zh/_tw/Tags-Reference.md | 4 +-
web-editor/public/styles.css | 2 +-
wiki/GameScene-zh-CN.md | 12 ++-
wiki/GameScene.md | 12 ++-
wiki/Tags-Reference-zh-CN.md | 4 +-
wiki/Tags-Reference.md | 4 +-
.../guidenh/guidenh/_en_us/scene-import.md | 8 +-
.../guidenh/guidenh/_zh_cn/scene-import.md | 8 +-
46 files changed, 476 insertions(+), 123 deletions(-)
diff --git a/src/main/java/com/hfstudio/guidenh/guide/compiler/tags/RecipeCompiler.java b/src/main/java/com/hfstudio/guidenh/guide/compiler/tags/RecipeCompiler.java
index 7dce43aef..6826d1357 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/compiler/tags/RecipeCompiler.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/compiler/tags/RecipeCompiler.java
@@ -12,6 +12,7 @@
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTBase;
+import net.minecraftforge.oredict.OreDictionary;
import org.jetbrains.annotations.Nullable;
@@ -404,7 +405,8 @@ public static boolean stackMatches(@Nullable ItemStack stack, IdUtils.ParsedItem
if (stack == null) return false;
Item refItem = (Item) Item.itemRegistry.getObject(ref.rawKey());
if (refItem == null || stack.getItem() != refItem) return false;
- if (!ref.isWildcardMeta() && stack.getItemDamage() != ref.meta()) return false;
+ if (!ref.isWildcardMeta() && stack.getItemDamage() != ref.meta()
+ && stack.getItemDamage() != OreDictionary.WILDCARD_VALUE) return false;
if (ref.nbt() != null) {
if (stack.stackTagCompound == null) return false;
if (!ref.nbt()
diff --git a/src/main/java/com/hfstudio/guidenh/guide/document/DefaultStyles.java b/src/main/java/com/hfstudio/guidenh/guide/document/DefaultStyles.java
index 4b9288dc9..2607c983c 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/document/DefaultStyles.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/document/DefaultStyles.java
@@ -58,7 +58,7 @@ private DefaultStyles() {}
.font(null)
.build();
public static final TextStyle HEADING3 = TextStyle.builder()
- .fontScale(1f)
+ .fontScale(1.17f)
.font(null)
.build();
public static final TextStyle HEADING4 = TextStyle.builder()
diff --git a/src/main/java/com/hfstudio/guidenh/guide/document/block/LytBalancedColumns.java b/src/main/java/com/hfstudio/guidenh/guide/document/block/LytBalancedColumns.java
index edc1c5672..51cd27a52 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/document/block/LytBalancedColumns.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/document/block/LytBalancedColumns.java
@@ -8,11 +8,11 @@
import lombok.Setter;
/**
- * Places children into columns as wide as the widest of them, filling the shortest column first.
+ * Places children into the shortest available column while preserving each child's measured width.
*
*
- * Column count is based on the widest child and limited by {@link #getMaxColumns()}.
- * Children wider than a column are laid out at their own width, falling back to a vertical stack.
+ * The highest column count whose measured column widths fit the available width is selected, up to
+ * {@link #getMaxColumns()}. If even two columns cannot fit, children are laid out as a vertical stack.
*/
@Getter
@Setter
@@ -34,56 +34,62 @@ protected LytRect computeBoxLayout(LayoutContext context, int x, int y, int avai
return verticalStack(context, x, y, availableWidth);
}
- int widest = widestChildWidth(context, x, y, availableWidth);
- int columns = columnCountFor(availableWidth, widest);
- if (columns <= 1) {
- return verticalStack(context, x, y, availableWidth);
+ int[] itemWidths = new int[count];
+ int[] itemHeights = new int[count];
+ for (int i = 0; i < count; i++) {
+ LytBlock child = children.get(i);
+ LytRect measured = child.layout(context, x, y, availableWidth);
+ itemWidths[i] = Math.max(1, measured.width() + child.getMarginLeft() + child.getMarginRight());
+ itemHeights[i] = Math.max(1, measured.height() + child.getMarginTop() + child.getMarginBottom());
}
- int columnWidth = widest;
+ int columns = Math.min(count, maxColumns);
+ while (columns > 1) {
+ int[] assignments = new int[count];
+ int[] columnWidths = new int[columns];
+ int[] columnBottoms = new int[columns];
+ for (int i = 0; i < count; i++) {
+ int column = shortestColumn(columnBottoms);
+ assignments[i] = column;
+ columnWidths[column] = Math.max(columnWidths[column], itemWidths[i]);
+ columnBottoms[column] += itemHeights[i] + gap;
+ }
+ int requiredWidth = Math.max(0, columns - 1) * gap;
+ for (int width : columnWidths) {
+ requiredWidth += width;
+ }
+ if (requiredWidth <= availableWidth) {
+ return layoutColumns(context, x, y, availableWidth, assignments, columnWidths, columns);
+ }
+ columns--;
+ }
+ return verticalStack(context, x, y, availableWidth);
+ }
+
+ private LytRect layoutColumns(LayoutContext context, int x, int y, int availableWidth, int[] assignments,
+ int[] columnWidths, int columns) {
int[] columnBottoms = new int[columns];
LytBlock[] previousBlocks = new LytBlock[columns];
int contentWidth = 0;
int contentHeight = 0;
-
- for (LytBlock child : children) {
- int blockWidth = Math.max(1, columnWidth - child.getMarginLeft() - child.getMarginRight());
- int columnIndex = shortestColumn(columnBottoms);
-
- int columnX = x + columnIndex * (columnWidth + gap) + child.getMarginLeft();
- int columnY = Layouts.offsetIntoContentArea(
- LytAxis.VERTICAL,
- y + columnBottoms[columnIndex],
- previousBlocks[columnIndex],
- child);
- LytRect childBounds = child.layout(context, columnX, columnY, blockWidth);
-
- columnBottoms[columnIndex] = childBounds.bottom() - y + child.getMarginBottom() + gap;
- previousBlocks[columnIndex] = child;
+ int[] columnX = new int[columns];
+ for (int i = 1; i < columns; i++) {
+ columnX[i] = columnX[i - 1] + columnWidths[i - 1] + gap;
+ }
+ for (int i = 0; i < children.size(); i++) {
+ LytBlock child = children.get(i);
+ int column = assignments[i];
+ int blockWidth = Math.max(1, columnWidths[column] - child.getMarginLeft() - child.getMarginRight());
+ int childX = x + columnX[column] + child.getMarginLeft();
+ int childY = Layouts
+ .offsetIntoContentArea(LytAxis.VERTICAL, y + columnBottoms[column], previousBlocks[column], child);
+ LytRect childBounds = child.layout(context, childX, childY, blockWidth);
+ columnBottoms[column] = childBounds.bottom() - y + child.getMarginBottom() + gap;
+ previousBlocks[column] = child;
contentWidth = Math.max(contentWidth, childBounds.right() - x);
contentHeight = Math.max(contentHeight, childBounds.bottom() - y);
}
-
- return new LytRect(x, y, contentWidth, contentHeight);
- }
-
- private int widestChildWidth(LayoutContext context, int x, int y, int availableWidth) {
- int widest = 0;
- for (LytBlock child : children) {
- LytRect bounds = child.layout(context, x, y, availableWidth);
- widest = Math.max(widest, bounds.width() + child.getMarginLeft() + child.getMarginRight());
- }
- return widest;
- }
-
- private int columnCountFor(int availableWidth, int widest) {
- int limit = Math.min(children.size(), maxColumns);
- if (widest <= 0) {
- return Math.max(1, limit);
- }
- // Columns are as wide as the widest child, so n of them need n widths and n-1 gaps.
- int byWidth = (availableWidth + gap) / (widest + gap);
- return Math.max(1, Math.min(limit, byWidth));
+ return new LytRect(x, y, Math.min(availableWidth, contentWidth), contentHeight);
}
private static int shortestColumn(int[] columnBottoms) {
diff --git a/src/main/java/com/hfstudio/guidenh/guide/internal/host/scripts/RecipeScript.java b/src/main/java/com/hfstudio/guidenh/guide/internal/host/scripts/RecipeScript.java
index b92a6a0f5..ebefff62f 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/internal/host/scripts/RecipeScript.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/internal/host/scripts/RecipeScript.java
@@ -138,6 +138,10 @@ public List readIngredientSlots(Object h, int ri) {
int recipeStart = Math.max(ph.recipeIndex, 0);
int recipeEnd = ph.recipeIndex >= 0 ? Math.min(num, ph.recipeIndex + 1) : num;
for (int ri = recipeStart; ri < recipeEnd && boxes.size() < limit; ri++) {
+ if (!usageQuery
+ && !RecipeCompiler.resultSlotContains(recipeAccess.readResultSlot(handler, ri), ph.ref)) {
+ continue;
+ }
if (hasRecipeFilter
&& !RecipeCompiler.recipeMatches(handler, ri, ph.inputExpr, ph.outputExpr, recipeAccess))
continue;
diff --git a/src/main/java/com/hfstudio/guidenh/guide/internal/syntax/BuiltinSyntaxContributor.java b/src/main/java/com/hfstudio/guidenh/guide/internal/syntax/BuiltinSyntaxContributor.java
index 85083a1d7..bda6e677a 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/internal/syntax/BuiltinSyntaxContributor.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/internal/syntax/BuiltinSyntaxContributor.java
@@ -590,17 +590,20 @@ public void contribute(SyntaxSink sink) {
AttributeSyntax.of("flip", SyntaxValueKind.STRING),
AttributeSyntax.of("offsetX", SyntaxValueKind.INT),
AttributeSyntax.of("offsetY", SyntaxValueKind.INT),
- AttributeSyntax.of("offsetZ", SyntaxValueKind.INT));
+ AttributeSyntax.of("offsetZ", SyntaxValueKind.INT),
+ AttributeSyntax.of("locked", SyntaxValueKind.BOOLEAN));
sink.attributes(
"Tier",
AttributeSyntax.of("value", SyntaxValueKind.INT),
- AttributeSyntax.of("expr", SyntaxValueKind.INT));
+ AttributeSyntax.of("expr", SyntaxValueKind.INT),
+ AttributeSyntax.of("locked", SyntaxValueKind.BOOLEAN));
sink.attributes(
"Channel",
AttributeSyntax.of("name", SyntaxValueKind.STRING),
AttributeSyntax.of("id", SyntaxValueKind.STRING),
AttributeSyntax.of("value", SyntaxValueKind.INT),
- AttributeSyntax.of("expr", SyntaxValueKind.INT));
+ AttributeSyntax.of("expr", SyntaxValueKind.INT),
+ AttributeSyntax.of("locked", SyntaxValueKind.BOOLEAN));
sink.attributes("Facing", AttributeSyntax.of("value", SyntaxValueKind.STRING));
sink.attributes("Rotation", AttributeSyntax.of("value", SyntaxValueKind.STRING));
sink.attributes("Flip", AttributeSyntax.of("value", SyntaxValueKind.STRING));
@@ -1027,6 +1030,7 @@ private static void registerStructureLibAttributes(SyntaxSink sink) {
AttributeSyntax.of("facing", SyntaxValueKind.STRING),
AttributeSyntax.of("rotation", SyntaxValueKind.STRING),
AttributeSyntax.of("flip", SyntaxValueKind.STRING),
+ AttributeSyntax.of("locked", SyntaxValueKind.BOOLEAN),
AttributeSyntax.of("gtActiveController", SyntaxValueKind.BOOLEAN),
AttributeSyntax.of("gtPlaceHatches", SyntaxValueKind.BOOLEAN),
AttributeSyntax.of("channelName", SyntaxValueKind.STRING),
@@ -1041,12 +1045,14 @@ private static void registerStructureLibAttributes(SyntaxSink sink) {
"Tier",
AttributeSyntax.of("value", SyntaxValueKind.STRING),
AttributeSyntax.of("expr", SyntaxValueKind.STRING),
- AttributeSyntax.of("tier", SyntaxValueKind.INT));
+ AttributeSyntax.of("tier", SyntaxValueKind.INT),
+ AttributeSyntax.of("locked", SyntaxValueKind.BOOLEAN));
sink.attributes(
"Channel",
AttributeSyntax.of("value", SyntaxValueKind.STRING),
AttributeSyntax.of("expr", SyntaxValueKind.STRING),
- AttributeSyntax.of("name", SyntaxValueKind.STRING));
+ AttributeSyntax.of("name", SyntaxValueKind.STRING),
+ AttributeSyntax.of("locked", SyntaxValueKind.BOOLEAN));
}
private static void registerAttributeCorrections(SyntaxSink sink) {
diff --git a/src/main/java/com/hfstudio/guidenh/guide/scene/LytGuidebookScene.java b/src/main/java/com/hfstudio/guidenh/guide/scene/LytGuidebookScene.java
index e96da6595..ef374e640 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/scene/LytGuidebookScene.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/scene/LytGuidebookScene.java
@@ -1572,6 +1572,9 @@ public void setStructureLibSelectionChangeListener(
private void setStructureLibCurrentTierInternal(int structureLibCurrentTier, boolean notifyListener) {
StructureLibSceneMetadata.TierData tierData = getStructureLibTierData();
+ if (tierData != null && tierData.isLocked()) {
+ return;
+ }
int previousValue = this.structureLibCurrentTier;
if (tierData == null) {
this.structureLibCurrentTier = Math.max(1, structureLibCurrentTier);
@@ -1641,6 +1644,9 @@ private void setStructureLibChannelValueInternal(String channelId, int value, bo
if (normalized == null) {
return;
}
+ if (channelData != null && channelData.isLocked()) {
+ return;
+ }
int previousValue = getStructureLibChannelValue(normalized);
int nextValue;
if (channelData == null) {
diff --git a/src/main/java/com/hfstudio/guidenh/guide/scene/StructureLibSceneBinding.java b/src/main/java/com/hfstudio/guidenh/guide/scene/StructureLibSceneBinding.java
index be472c43c..9011821ef 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/scene/StructureLibSceneBinding.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/scene/StructureLibSceneBinding.java
@@ -1,6 +1,7 @@
package com.hfstudio.guidenh.guide.scene;
import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
@@ -11,6 +12,7 @@
import com.hfstudio.guidenh.integration.structurelib.StructureLibImportResult;
import com.hfstudio.guidenh.integration.structurelib.StructureLibPreviewSelection;
import com.hfstudio.guidenh.integration.structurelib.StructureLibSceneMetadata;
+import com.hfstudio.guidenh.integration.structurelib.StructureLibSceneOptions;
import lombok.Getter;
@@ -29,6 +31,8 @@ public class StructureLibSceneBinding {
@Getter
private int currentTier = StructureLibPreviewSelection.DEFAULT_MASTER_TIER;
private final LinkedHashMap channelOverrides = new LinkedHashMap<>();
+ private boolean tierLocked;
+ private final LinkedHashSet lockedChannels = new LinkedHashSet<>();
@Nullable
private Consumer selectionChangeListener;
@@ -65,7 +69,7 @@ public void setMetadata(@Nullable StructureLibSceneMetadata metadata) {
int previousTier = currentTier;
LinkedHashMap previousChannels = new LinkedHashMap<>(channelOverrides);
boolean hadMetadata = this.metadata != null;
- this.metadata = metadata;
+ this.metadata = metadata != null ? metadata.withControlLocks(tierLocked, lockedChannels) : null;
if (metadata == null) {
currentTier = StructureLibPreviewSelection.DEFAULT_MASTER_TIER;
channelOverrides.clear();
@@ -87,8 +91,20 @@ public void setMetadata(@Nullable StructureLibSceneMetadata metadata) {
}
}
+ public void setControlLocks(@Nullable StructureLibSceneOptions options) {
+ tierLocked = options != null && options.isTierLocked();
+ lockedChannels.clear();
+ if (options != null) {
+ lockedChannels.addAll(options.getLockedChannels());
+ }
+ if (metadata != null) {
+ setMetadata(metadata);
+ }
+ }
+
public void setCurrentTier(int tier) {
StructureLibSceneMetadata.TierData td = metadata != null ? metadata.getTierData() : null;
+ if (td != null && td.isLocked()) return;
this.currentTier = td != null ? StructureLibSceneMetadata.clamp(tier, td.getMinValue(), td.getMaxValue())
: Math.max(1, tier);
}
@@ -102,6 +118,7 @@ public void setChannelValue(String channelId, int value) {
String normalized = StructureLibPreviewSelection.normalizeChannelId(channelId);
if (normalized == null) return;
StructureLibSceneMetadata.ChannelData cd = metadata != null ? metadata.getChannelData(normalized) : null;
+ if (cd != null && cd.isLocked()) return;
int next = cd != null ? StructureLibSceneMetadata.clamp(value, cd.getMinValue(), cd.getMaxValue())
: Math.max(0, value);
if (next > 0) channelOverrides.put(normalized, next);
@@ -131,7 +148,19 @@ public void setPendingSelection(@Nullable StructureLibPreviewSelection pendingSe
public void applyPreviewSelection(StructureLibPreviewSelection selection) {
if (selection == null) return;
setCurrentTier(selection.getMasterTier());
+ LinkedHashMap lockedValues = new LinkedHashMap<>();
+ if (metadata != null) {
+ for (StructureLibSceneMetadata.ChannelData channel : metadata.getChannelDataList()) {
+ if (channel != null && channel.isLocked()) {
+ Integer value = channelOverrides.get(channel.getChannelId());
+ if (value != null) {
+ lockedValues.put(channel.getChannelId(), value);
+ }
+ }
+ }
+ }
channelOverrides.clear();
+ channelOverrides.putAll(lockedValues);
for (Map.Entry entry : selection.getChannelOverrides()
.entrySet()) {
setChannelValue(entry.getKey(), entry.getValue());
diff --git a/src/main/java/com/hfstudio/guidenh/guide/scene/element/ImportStructureLibElementCompiler.java b/src/main/java/com/hfstudio/guidenh/guide/scene/element/ImportStructureLibElementCompiler.java
index 7124aad61..8b774f2ce 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/scene/element/ImportStructureLibElementCompiler.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/scene/element/ImportStructureLibElementCompiler.java
@@ -91,6 +91,7 @@ public void compile(GuidebookLevel level, CameraSettings camera, PageCompiler co
selection.getIntegrationOptions());
StructureLibSceneBinding binding = scene.registerStructureLibBinding(structureName);
+ binding.setControlLocks(mergedOptions);
binding.setRebuildRecipe(request, offsetX, offsetY, offsetZ, formed);
// Build initial metadata from ConstructableData (not a world operation).
diff --git a/src/main/java/com/hfstudio/guidenh/guide/scene/element/StructureLibSceneOptionParser.java b/src/main/java/com/hfstudio/guidenh/guide/scene/element/StructureLibSceneOptionParser.java
index ac66b4ec3..87fc0a605 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/scene/element/StructureLibSceneOptionParser.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/scene/element/StructureLibSceneOptionParser.java
@@ -38,6 +38,9 @@ public static StructureLibSceneOptions parseAttributes(PageCompiler compiler, Ly
MdxJsxElementFields element) {
StructureLibSceneOptions.Builder builder = StructureLibSceneOptions.builder();
applyIntAttribute(compiler, errorSink, element, builder, "tier");
+ if (element.getAttribute("tier") != null && readLockFlag(compiler, errorSink, element)) {
+ builder.tierLocked(true);
+ }
applyStringAttribute(compiler, errorSink, element, builder, "facing");
applyStringAttribute(compiler, errorSink, element, builder, "rotation");
applyStringAttribute(compiler, errorSink, element, builder, "flip");
@@ -58,6 +61,9 @@ public static StructureLibSceneOptions parseAttributes(PageCompiler compiler, Ly
}
if (value > 0) {
builder.channel(channelName, value);
+ if (readLockFlag(compiler, errorSink, element)) {
+ builder.channelLocked(channelName, true);
+ }
}
}
return builder.build();
@@ -68,7 +74,13 @@ private static void applyChild(PageCompiler compiler, LytErrorSink errorSink,
String name = childElement.name();
switch (name) {
case "Tier":
- builder.tier(resolveIntValue(compiler, errorSink, childElement));
+ Integer tier = resolveIntValue(compiler, errorSink, childElement);
+ if (tier != null) {
+ builder.tier(tier);
+ if (readLockFlag(compiler, errorSink, childElement)) {
+ builder.tierLocked(true);
+ }
+ }
break;
case "Channel":
applyChannel(compiler, errorSink, builder, childElement);
@@ -107,6 +119,9 @@ private static void applyChannel(PageCompiler compiler, LytErrorSink errorSink,
Integer value = resolveIntValue(compiler, errorSink, childElement);
if (name != null && value != null) {
builder.channel(name, value);
+ if (readLockFlag(compiler, errorSink, childElement)) {
+ builder.channelLocked(name, true);
+ }
}
}
@@ -212,4 +227,8 @@ private static int readInt(PageCompiler compiler, LytErrorSink errorSink, MdxJsx
String attribute, int defaultValue) {
return MdxAttrs.getInt(compiler, errorSink, element, attribute, defaultValue);
}
+
+ private static boolean readLockFlag(PageCompiler compiler, LytErrorSink errorSink, MdxJsxElementFields element) {
+ return MdxAttrs.getBoolean(compiler, errorSink, element, "locked", false);
+ }
}
diff --git a/src/main/java/com/hfstudio/guidenh/guide/siteexport/site/GuideSiteRecipeTagRenderer.java b/src/main/java/com/hfstudio/guidenh/guide/siteexport/site/GuideSiteRecipeTagRenderer.java
index e68f92bf0..05591caef 100644
--- a/src/main/java/com/hfstudio/guidenh/guide/siteexport/site/GuideSiteRecipeTagRenderer.java
+++ b/src/main/java/com/hfstudio/guidenh/guide/siteexport/site/GuideSiteRecipeTagRenderer.java
@@ -507,6 +507,12 @@ private RawHandlerRenderResult renderFromRawHandlers(RenderRequest request, Item
int recipeEnd = request.recipeIndex >= 0 ? Math.min(recipeCount, request.recipeIndex + 1) : recipeCount;
for (int recipeIndex = recipeStart; recipeIndex < recipeEnd
&& renderedRecipes.size() < request.limit; recipeIndex++) {
+ if (!request.usageQuery && !resultMatchesTarget(
+ handlerRuntime.readResultSlot(handler, recipeIndex),
+ request.recipeId,
+ request.defaultNamespace)) {
+ continue;
+ }
if (hasRecipeFilter && !RecipeCompiler
.recipeMatches(handler, recipeIndex, request.inputExpr, request.outputExpr, handlerRuntime)) {
continue;
@@ -540,6 +546,9 @@ private List renderFromNeiEntries(RenderRequest request, ItemStack targe
if (entry == null || !neiEntryHasAnySlots(entry)) {
continue;
}
+ if (!resultMatchesTarget(entry.result, request.recipeId, request.defaultNamespace)) {
+ continue;
+ }
if (hasRecipeFilter && !RecipeCompiler.entryMatches(entry, request.inputExpr, request.outputExpr)) {
continue;
}
@@ -665,6 +674,16 @@ private static boolean neiEntryHasAnySlots(NeiRecipeLookup.Entry entry) {
return entry.result != null;
}
+ private static boolean resultMatchesTarget(@Nullable NeiRecipeLookup.Slot result, String recipeId,
+ String defaultNamespace) {
+ try {
+ IdUtils.ParsedItemRef target = IdUtils.parseItemRef(recipeId, defaultNamespace);
+ return target != null && RecipeCompiler.resultSlotContains(result, target);
+ } catch (IllegalArgumentException ignored) {
+ return false;
+ }
+ }
+
private static SiteRecipeRawHandlerAccess rawHandlerSlots(final HandlerRuntime hr) {
return new SiteRecipeRawHandlerAccess() {
diff --git a/src/main/java/com/hfstudio/guidenh/integration/GuideNhClientIntegrationBootstrap.java b/src/main/java/com/hfstudio/guidenh/integration/GuideNhClientIntegrationBootstrap.java
index 7b4f42f0c..cb2c75291 100644
--- a/src/main/java/com/hfstudio/guidenh/integration/GuideNhClientIntegrationBootstrap.java
+++ b/src/main/java/com/hfstudio/guidenh/integration/GuideNhClientIntegrationBootstrap.java
@@ -54,8 +54,6 @@
public class GuideNhClientIntegrationBootstrap {
- private GuideNhClientIntegrationBootstrap() {}
-
public static void preInitClient() {
registerBlockDisplayProviders();
registerPreviewTileEntityProviders();
diff --git a/src/main/java/com/hfstudio/guidenh/integration/GuideNhIntegrationBootstrap.java b/src/main/java/com/hfstudio/guidenh/integration/GuideNhIntegrationBootstrap.java
index 1b80b7c9b..30709cc4e 100644
--- a/src/main/java/com/hfstudio/guidenh/integration/GuideNhIntegrationBootstrap.java
+++ b/src/main/java/com/hfstudio/guidenh/integration/GuideNhIntegrationBootstrap.java
@@ -9,8 +9,6 @@
public class GuideNhIntegrationBootstrap {
- private GuideNhIntegrationBootstrap() {}
-
public static void preInitCommon() {
registerKnownModDescriptors();
GuideNhIntegrationRegistry.global()
diff --git a/src/main/java/com/hfstudio/guidenh/integration/structurelib/StructureLibSceneMetadata.java b/src/main/java/com/hfstudio/guidenh/integration/structurelib/StructureLibSceneMetadata.java
index dbae54cfb..44140f9f1 100644
--- a/src/main/java/com/hfstudio/guidenh/integration/structurelib/StructureLibSceneMetadata.java
+++ b/src/main/java/com/hfstudio/guidenh/integration/structurelib/StructureLibSceneMetadata.java
@@ -94,13 +94,18 @@ public StructureLibSceneMetadata offsetBlockTooltips(int offsetX, int offsetY, i
}
public StructureLibSceneMetadata withTierData(int minValue, int maxValue, int defaultValue, int currentValue) {
+ return withTierData(minValue, maxValue, defaultValue, currentValue, false);
+ }
+
+ public StructureLibSceneMetadata withTierData(int minValue, int maxValue, int defaultValue, int currentValue,
+ boolean locked) {
return new StructureLibSceneMetadata(
controller,
piece,
facing,
rotation,
flip,
- new TierData(minValue, maxValue, defaultValue, currentValue),
+ new TierData(minValue, maxValue, defaultValue, currentValue, locked),
channelDataList,
blockTooltipDataByPos);
}
@@ -123,8 +128,13 @@ public StructureLibSceneMetadata withTierAndChannelData(int minValue, int maxVal
}
public StructureLibSceneMetadata withChannelData(String channelId, String label, int maxValue, int currentValue) {
+ return withChannelData(channelId, label, maxValue, currentValue, false);
+ }
+
+ public StructureLibSceneMetadata withChannelData(String channelId, String label, int maxValue, int currentValue,
+ boolean locked) {
LinkedHashMap updated = new LinkedHashMap<>(channelDataById);
- ChannelData next = new ChannelData(channelId, label, maxValue, 0, currentValue);
+ ChannelData next = new ChannelData(channelId, label, maxValue, 0, currentValue, locked);
updated.put(next.getChannelId(), next);
return new StructureLibSceneMetadata(
controller,
@@ -137,6 +147,49 @@ public StructureLibSceneMetadata withChannelData(String channelId, String label,
blockTooltipDataByPos);
}
+ public StructureLibSceneMetadata withControlLocks(boolean tierLocked, @Nullable Set lockedChannels) {
+ TierData lockedTier = tierData;
+ if (tierData != null) {
+ lockedTier = new TierData(
+ tierData.minValue,
+ tierData.maxValue,
+ tierData.defaultValue,
+ tierData.currentValue,
+ tierData.locked || tierLocked);
+ }
+ Set normalizedChannels = new LinkedHashSet<>();
+ if (lockedChannels != null) {
+ for (String channel : lockedChannels) {
+ String normalized = StructureLibPreviewSelection.normalizeChannelId(channel);
+ if (normalized != null) {
+ normalizedChannels.add(normalized);
+ }
+ }
+ }
+ List lockedChannelData = new ArrayList<>(channelDataList.size());
+ for (ChannelData channel : channelDataList) {
+ if (channel != null) {
+ lockedChannelData.add(
+ new ChannelData(
+ channel.channelId,
+ channel.label,
+ channel.maxValue,
+ channel.defaultValue,
+ channel.currentValue,
+ channel.locked || normalizedChannels.contains(channel.channelId)));
+ }
+ }
+ return new StructureLibSceneMetadata(
+ controller,
+ piece,
+ facing,
+ rotation,
+ flip,
+ lockedTier,
+ lockedChannelData,
+ blockTooltipDataByPos);
+ }
+
@Nullable
public BlockTooltipData getBlockTooltipData(int x, int y, int z) {
return blockTooltipDataByPos.get(packBlockPos(x, y, z));
@@ -379,18 +432,24 @@ public static class TierData {
private final int maxValue;
private final int defaultValue;
private final int currentValue;
+ private final boolean locked;
public TierData(int minValue, int maxValue, int defaultValue, int currentValue) {
+ this(minValue, maxValue, defaultValue, currentValue, false);
+ }
+
+ public TierData(int minValue, int maxValue, int defaultValue, int currentValue, boolean locked) {
int normalizedMin = Math.max(1, minValue);
int normalizedMax = Math.max(normalizedMin, maxValue);
this.minValue = normalizedMin;
this.maxValue = normalizedMax;
this.defaultValue = clamp(defaultValue, normalizedMin, normalizedMax);
this.currentValue = clamp(currentValue, normalizedMin, normalizedMax);
+ this.locked = locked;
}
public boolean isSelectable() {
- return maxValue > minValue;
+ return !locked && maxValue > minValue;
}
}
@@ -402,8 +461,14 @@ public static class ChannelData {
private final int maxValue;
private final int defaultValue;
private final int currentValue;
+ private final boolean locked;
public ChannelData(String channelId, String label, int maxValue, int defaultValue, int currentValue) {
+ this(channelId, label, maxValue, defaultValue, currentValue, false);
+ }
+
+ public ChannelData(String channelId, String label, int maxValue, int defaultValue, int currentValue,
+ boolean locked) {
String normalizedChannelId = StructureLibPreviewSelection.normalizeChannelId(channelId);
String normalizedLabel = normalizeOptional(label);
int normalizedMax = Math.max(0, maxValue);
@@ -412,6 +477,7 @@ public ChannelData(String channelId, String label, int maxValue, int defaultValu
this.maxValue = normalizedMax;
this.defaultValue = clamp(defaultValue, 0, normalizedMax);
this.currentValue = clamp(currentValue, 0, normalizedMax);
+ this.locked = locked;
}
public int getMinValue() {
@@ -419,7 +485,7 @@ public int getMinValue() {
}
public boolean isSelectable() {
- return maxValue > 0;
+ return !locked && maxValue > 0;
}
}
}
diff --git a/src/main/java/com/hfstudio/guidenh/integration/structurelib/StructureLibSceneOptions.java b/src/main/java/com/hfstudio/guidenh/integration/structurelib/StructureLibSceneOptions.java
index 8304b3415..0f618b36b 100644
--- a/src/main/java/com/hfstudio/guidenh/integration/structurelib/StructureLibSceneOptions.java
+++ b/src/main/java/com/hfstudio/guidenh/integration/structurelib/StructureLibSceneOptions.java
@@ -2,7 +2,9 @@
import java.util.Collections;
import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.Set;
import org.jetbrains.annotations.Nullable;
@@ -24,6 +26,10 @@ public class StructureLibSceneOptions {
@Getter
private final Map channelOverrides;
@Getter
+ private final boolean tierLocked;
+ @Getter
+ private final Set lockedChannels;
+ @Getter
private final boolean gregTechActiveController;
@Getter
private final boolean gregTechPlaceHatches;
@@ -31,11 +37,28 @@ public class StructureLibSceneOptions {
public StructureLibSceneOptions(@Nullable String facing, @Nullable String rotation, @Nullable String flip,
@Nullable Integer tier, @Nullable Map channelOverrides, boolean gregTechActiveController,
boolean gregTechPlaceHatches) {
+ this(
+ facing,
+ rotation,
+ flip,
+ tier,
+ channelOverrides,
+ false,
+ Collections.emptySet(),
+ gregTechActiveController,
+ gregTechPlaceHatches);
+ }
+
+ public StructureLibSceneOptions(@Nullable String facing, @Nullable String rotation, @Nullable String flip,
+ @Nullable Integer tier, @Nullable Map channelOverrides, boolean tierLocked,
+ @Nullable Set lockedChannels, boolean gregTechActiveController, boolean gregTechPlaceHatches) {
this.facing = normalizeOptional(facing);
this.rotation = normalizeOptional(rotation);
this.flip = normalizeOptional(flip);
this.tier = tier != null && tier > 0 ? tier : null;
this.channelOverrides = StructureLibPreviewSelection.immutableChannelOverrides(channelOverrides);
+ this.tierLocked = tier != null && tier > 0 && tierLocked;
+ this.lockedChannels = immutableChannelIds(lockedChannels);
this.gregTechActiveController = gregTechActiveController;
this.gregTechPlaceHatches = gregTechPlaceHatches;
}
@@ -73,6 +96,8 @@ public boolean hasOverrides() {
|| flip != null
|| tier != null
|| !channelOverrides.isEmpty()
+ || tierLocked
+ || !lockedChannels.isEmpty()
|| gregTechActiveController
|| gregTechPlaceHatches;
}
@@ -99,6 +124,8 @@ public StructureLibSceneOptions merge(StructureLibSceneOptions overrides) {
overrides.flip != null ? overrides.flip : flip,
overrides.tier != null ? overrides.tier : tier,
channels,
+ overrides.tier != null ? overrides.tierLocked : tierLocked,
+ mergeLockedChannels(overrides.lockedChannels),
overrides.gregTechActiveController || gregTechActiveController,
overrides.gregTechPlaceHatches || gregTechPlaceHatches);
}
@@ -127,6 +154,29 @@ public static String normalizeOptional(@Nullable String value) {
return trimmed.isEmpty() ? null : trimmed;
}
+ private static Set immutableChannelIds(@Nullable Set source) {
+ if (source == null || source.isEmpty()) {
+ return Set.of();
+ }
+ LinkedHashSet normalized = new LinkedHashSet<>();
+ for (String value : source) {
+ String channel = StructureLibPreviewSelection.normalizeChannelId(value);
+ if (channel != null) {
+ normalized.add(channel);
+ }
+ }
+ return normalized.isEmpty() ? Set.of() : Set.copyOf(normalized);
+ }
+
+ private Set mergeLockedChannels(Set overrides) {
+ if (overrides == null || overrides.isEmpty()) {
+ return lockedChannels;
+ }
+ LinkedHashSet merged = new LinkedHashSet<>(lockedChannels);
+ merged.addAll(overrides);
+ return merged;
+ }
+
public static class Builder {
@Nullable
@@ -138,6 +188,8 @@ public static class Builder {
@Nullable
private Integer tier;
private final Map channels = new LinkedHashMap<>();
+ private boolean tierLocked;
+ private final Set lockedChannels = new LinkedHashSet<>();
private boolean gregTechActiveController;
private boolean gregTechPlaceHatches;
@@ -161,6 +213,11 @@ public Builder tier(@Nullable Integer tier) {
return this;
}
+ public Builder tierLocked(boolean tierLocked) {
+ this.tierLocked = tierLocked;
+ return this;
+ }
+
public Builder channel(String name, int value) {
String normalized = StructureLibPreviewSelection.normalizeChannelId(name);
if (normalized != null && value > 0) {
@@ -169,6 +226,18 @@ public Builder channel(String name, int value) {
return this;
}
+ public Builder channelLocked(String name, boolean locked) {
+ String normalized = StructureLibPreviewSelection.normalizeChannelId(name);
+ if (normalized != null) {
+ if (locked) {
+ lockedChannels.add(normalized);
+ } else {
+ lockedChannels.remove(normalized);
+ }
+ }
+ return this;
+ }
+
public Builder channels(@Nullable Map channels) {
if (channels != null) {
for (Map.Entry entry : channels.entrySet()) {
@@ -198,6 +267,8 @@ public StructureLibSceneOptions build() {
flip,
tier,
channels.isEmpty() ? Collections.emptyMap() : channels,
+ tierLocked,
+ lockedChannels,
gregTechActiveController,
gregTechPlaceHatches);
}
diff --git a/src/main/resources/assets/guidenh/siteexport/app.css b/src/main/resources/assets/guidenh/siteexport/app.css
index 68d3f0598..e7d3122a4 100644
--- a/src/main/resources/assets/guidenh/siteexport/app.css
+++ b/src/main/resources/assets/guidenh/siteexport/app.css
@@ -105,7 +105,7 @@ h2 {
}
h3 {
- font-size: 1rem;
+ font-size: 1.17rem;
font-family: var(--minecraft-font);
}
@@ -1584,9 +1584,17 @@ p {
}
.guide-recipe-gallery {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: flex-start;
+ gap: 0.8em;
margin-bottom: 0.8em;
}
+.guide-recipe-gallery > .recipe-grid {
+ margin-bottom: 0;
+}
+
.guide-quest-link {
color: var(--color-link);
}
diff --git a/web-editor/public/reference/de/_de/GameScene.md b/web-editor/public/reference/de/_de/GameScene.md
index b8194f7b1..08e5b6f9c 100644
--- a/web-editor/public/reference/de/_de/GameScene.md
+++ b/web-editor/public/reference/de/_de/GameScene.md
@@ -411,6 +411,10 @@ Imports Eine StructureLib multiblock Vorschau by controller id.
| `rotation` | nein | Drehung Überschreibung passed zu Die importer |
| `flip` | nein | flip/mirror Überschreibung passed zu Die importer |
| `channel` | nein | Ganzzahl channel Überschreibung für channel-aware structures |
+| `tier` | nein | initialer tier-Wert für tier-aware structures |
+| `channelName` | nein | Name des Kanals für den root `channel`- oder `value`-Override |
+| `value` | nein | Kanalwert zusammen mit `channelName` |
+| `locked` | nein | sperrt den ausdrücklich gesetzten tier- oder Kanalwert |
| `offsetX` | nein | Ganzzahl X offset applied zu alle placed Blöcke (Standard `0`) |
| `offsetY` | nein | Ganzzahl Y offset applied zu alle placed Blöcke, clamped zu `[0, worldHeight-1]` (Standard `0`) |
| `offsetZ` | nein | Ganzzahl Z offset applied zu alle placed Blöcke (Standard `0`) |
@@ -431,6 +435,8 @@ Beispiel:
````md
+
+
````
@@ -468,7 +474,9 @@ channel sliders.
| untergeordnetes Element Tag | Bedeutung |
| --- | --- |
| `` | Master tier Wert. |
+| `` | sperrt den ausdrücklich gesetzten tier- oder Kanalwert. |
| `` | Named StructureLib channel Überschreibung. Repeat für mehrere Kanäle. |
+| `` | sperrt den ausdrücklich gesetzten tier- oder Kanalwert. |
| `` | Standard facing. |
| `` | Standard Drehung. |
| `` | Standard flip/mirror. |
@@ -483,8 +491,8 @@ keeping Fallback casings by Standard.
````md
-
-
+
+
diff --git a/web-editor/public/reference/de/_de/Tags-Reference.md b/web-editor/public/reference/de/_de/Tags-Reference.md
index 0adfcb03e..375c13125 100644
--- a/web-editor/public/reference/de/_de/Tags-Reference.md
+++ b/web-editor/public/reference/de/_de/Tags-Reference.md
@@ -77,7 +77,7 @@ Inline markdown auch unterstützt action Links für sound playback:
| `` | Block-level BetterQuesting quest summary card (compat Tag, nur registriert wenn BetterQuesting ist geladen) | `id`, `show_desc`, `show_tooltip` |
`` ist ein `` untergeordnetes Element Tag. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, und `channel` Attribut, und auch unterstützt StructureLib Standard untergeordnetes Element Tags:
+`rotation`, `flip`, und `tier`, `channel`, `channelName`, `value`, `locked` Attribut, und auch unterstützt StructureLib Standard untergeordnetes Element Tags:
``, ``, ``, ``, ``, ``,
``, und ``.
@@ -679,7 +679,7 @@ diese Tags nur funktionieren innerhalb `` / ``:
| Tag | Zweck | Schlüssel Attribut |
| --- | --- | --- |
| `` | import Eine extern SNBT/NBT structure Ressource | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import Eine StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import Eine StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | entfernen bereits-placed Blöcke dass übereinstimmen Eine Block matcher | `id` |
| `` | stamp Die gleich untergeordnetes Element Annotationen onto jede passend placed Block | `id` |
diff --git a/web-editor/public/reference/en/_us/GameScene.md b/web-editor/public/reference/en/_us/GameScene.md
index 53663eb6c..043282564 100644
--- a/web-editor/public/reference/en/_us/GameScene.md
+++ b/web-editor/public/reference/en/_us/GameScene.md
@@ -407,7 +407,11 @@ Imports a StructureLib multiblock preview by controller id.
| `facing` | no | facing override passed to the importer |
| `rotation` | no | rotation override passed to the importer |
| `flip` | no | flip/mirror override passed to the importer |
+| `tier` | no | initial tier value for tier-aware structures |
| `channel` | no | integer channel override for channel-aware structures |
+| `channelName` | no | name of the channel used with the root `channel` or `value` override |
+| `value` | no | channel value used with `channelName` |
+| `locked` | no | when `true`, locks the explicitly supplied root tier or channel value during interaction |
| `offsetX` | no | integer X offset applied to all placed blocks (default `0`) |
| `offsetY` | no | integer Y offset applied to all placed blocks, clamped to `[0, worldHeight-1]` (default `0`) |
| `offsetZ` | no | integer Z offset applied to all placed blocks (default `0`) |
@@ -428,6 +432,8 @@ Example:
````md
+
+
````
@@ -465,7 +471,9 @@ channel sliders.
| Child tag | Meaning |
| --- | --- |
| `` | Master tier value. |
+| `` | Master tier value that cannot be changed by the user. |
| `` | Named StructureLib channel override. Repeat for multiple channels. |
+| `` | Named channel override that cannot be changed by the user. |
| `` | Default facing. |
| `` | Default rotation. |
| `` | Default flip/mirror. |
@@ -480,8 +488,8 @@ keeping fallback casings by default.
````md
-
-
+
+
diff --git a/web-editor/public/reference/en/_us/Tags-Reference.md b/web-editor/public/reference/en/_us/Tags-Reference.md
index e3abdf309..5b52ee60a 100644
--- a/web-editor/public/reference/en/_us/Tags-Reference.md
+++ b/web-editor/public/reference/en/_us/Tags-Reference.md
@@ -74,7 +74,7 @@ Inline markdown also supports action links for sound playback:
| `` | block-level BetterQuesting quest summary card (compat tag, only registered when BetterQuesting is loaded) | `id`, `show_desc`, `show_tooltip` |
`` is a `` child tag. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, and `channel` attributes, and also supports StructureLib default child tags:
+`rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, and `locked` attributes, and also supports StructureLib default child tags:
``, ``, ``, ``, ``, ``,
``, and ``.
@@ -676,7 +676,7 @@ These tags only work inside `` / ``:
| Tag | Purpose | Key attributes |
| --- | --- | --- |
| `` | import an external SNBT/NBT structure asset | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import a StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import a StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | remove already-placed blocks that match a block matcher | `id` |
| `` | stamp the same child annotations onto every matching placed block | `id` |
diff --git a/web-editor/public/reference/es/_es/GameScene.md b/web-editor/public/reference/es/_es/GameScene.md
index d851a8797..c86222c5c 100644
--- a/web-editor/public/reference/es/_es/GameScene.md
+++ b/web-editor/public/reference/es/_es/GameScene.md
@@ -411,6 +411,10 @@ importaciones Un StructureLib multiblock vista previa by controller id.
| `rotation` | no | rotación anular passed Un El importer |
| `flip` | no | flip/mirror anular passed Un El importer |
| `channel` | no | entero channel anular para channel-aware estructuras |
+| `tier` | no | valor inicial de tier para estructuras compatibles |
+| `channelName` | no | nombre del canal usado con la anulación raíz `channel` o `value` |
+| `value` | no | valor del canal usado con `channelName` |
+| `locked` | no | bloquea el valor de tier o canal indicado explícitamente |
| `offsetX` | no | entero X offset applied Un todos colocado bloques (predeterminado `0`) |
| `offsetY` | no | entero Y offset applied Un todos colocado bloques, clamped a `[0, worldHeight-1]` (predeterminado `0`) |
| `offsetZ` | no | entero Z offset applied Un todos colocado bloques (predeterminado `0`) |
@@ -431,6 +435,8 @@ Ejemplo:
````md
+
+
````
@@ -468,7 +474,9 @@ channel sliders.
| hijo etiqueta | significado |
| --- | --- |
| `` | Master tier valor. |
+| `` | bloquea el valor de tier o canal indicado explícitamente. |
| `` | Named StructureLib channel anular. Repeat para varios canales. |
+| `` | bloquea el valor de tier o canal indicado explícitamente. |
| `` | predeterminado facing. |
| `` | predeterminado rotación. |
| `` | predeterminado flip/mirror. |
@@ -483,8 +491,8 @@ keeping reserva casings by predeterminado.
````md
-
-
+
+
diff --git a/web-editor/public/reference/es/_es/Tags-Reference.md b/web-editor/public/reference/es/_es/Tags-Reference.md
index c74cd4f56..fe544cb30 100644
--- a/web-editor/public/reference/es/_es/Tags-Reference.md
+++ b/web-editor/public/reference/es/_es/Tags-Reference.md
@@ -77,7 +77,7 @@ Inline markdown también admite action enlaces para sound playback:
| `` | bloque-level BetterQuesting quest summary card (compat etiqueta, solo registrado cuando BetterQuesting es cargado) | `id`, `show_desc`, `show_tooltip` |
`` es un `` hijo etiqueta. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, y `channel` atributos, y también admite StructureLib predeterminado hijo etiquetas:
+`rotation`, `flip`, y `tier`, `channel`, `channelName`, `value`, `locked` atributos, y también admite StructureLib predeterminado hijo etiquetas:
``, ``, ``, ``, ``, ``,
``, y ``.
@@ -679,7 +679,7 @@ These etiquetas solo funcionan dentro de `` / ``:
| etiqueta | Purpose | clave atributos |
| --- | --- | --- |
| `` | import Un externo SNBT/NBT estructura recurso | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import Un StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import Un StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | eliminar ya-colocado bloques que coincidir Un bloque matcher | `id` |
| `` | stamp El mismo hijo anotaciones onto cada coincidente colocado bloque | `id` |
diff --git a/web-editor/public/reference/fr/_fr/GameScene.md b/web-editor/public/reference/fr/_fr/GameScene.md
index bea15e0f6..bbabee6e5 100644
--- a/web-editor/public/reference/fr/_fr/GameScene.md
+++ b/web-editor/public/reference/fr/_fr/GameScene.md
@@ -411,6 +411,10 @@ Imports Un StructureLib multiblock aperçu by controller id.
| `rotation` | non | rotation remplacer passed vers Le importer |
| `flip` | non | flip/mirror remplacer passed vers Le importer |
| `channel` | non | entier channel remplacer pour channel-aware structures |
+| `tier` | non | valeur tier initiale pour les structures compatibles |
+| `channelName` | non | nom du canal utilisé avec la surcharge racine `channel` ou `value` |
+| `value` | non | valeur du canal utilisée avec `channelName` |
+| `locked` | non | verrouille la valeur de tier ou de canal fournie explicitement |
| `offsetX` | non | entier X offset applied vers tous placed blocs (par défaut `0`) |
| `offsetY` | non | entier Y offset applied vers tous placed blocs, clamped vers `[0, worldHeight-1]` (par défaut `0`) |
| `offsetZ` | non | entier Z offset applied vers tous placed blocs (par défaut `0`) |
@@ -431,6 +435,8 @@ Exemple:
````md
+
+
````
@@ -468,7 +474,9 @@ channel sliders.
| enfant balise | Meaning |
| --- | --- |
| `` | Master tier valeur. |
+| `` | verrouille la valeur de tier ou de canal fournie explicitement. |
| `` | Named StructureLib channel remplacer. Repeat pour plusieurs channels. |
+| `` | verrouille la valeur de tier ou de canal fournie explicitement. |
| `` | par défaut facing. |
| `` | par défaut rotation. |
| `` | par défaut flip/mirror. |
@@ -483,8 +491,8 @@ keeping repli casings by par défaut.
````md
-
-
+
+
diff --git a/web-editor/public/reference/fr/_fr/Tags-Reference.md b/web-editor/public/reference/fr/_fr/Tags-Reference.md
index 162e57171..14f158ee3 100644
--- a/web-editor/public/reference/fr/_fr/Tags-Reference.md
+++ b/web-editor/public/reference/fr/_fr/Tags-Reference.md
@@ -77,7 +77,7 @@ Inline markdown aussi prend en charge action liens pour sound playback:
| `` | bloc-level BetterQuesting quest summary card (compat balise, seulement enregistré lorsque BetterQuesting est chargé) | `id`, `show_desc`, `show_tooltip` |
`` est un `` enfant balise. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, et `channel` attributs, et aussi prend en charge StructureLib par défaut enfant balises:
+`rotation`, `flip`, et `tier`, `channel`, `channelName`, `value`, `locked` attributs, et aussi prend en charge StructureLib par défaut enfant balises:
``, ``, ``, ``, ``, ``,
``, et ``.
@@ -679,7 +679,7 @@ These balises seulement fonctionnent dans `` / ``:
| balise | Purpose | clé attributs |
| --- | --- | --- |
| `` | import Un externe SNBT/NBT structure ressource | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import Un StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import Un StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | supprimer déjà-placed blocs que correspondre Un bloc matcher | `id` |
| `` | stamp Le même enfant annotations onto chaque correspondant placed bloc | `id` |
diff --git a/web-editor/public/reference/ja/_jp/GameScene.md b/web-editor/public/reference/ja/_jp/GameScene.md
index 5a67a3590..fc8699ae0 100644
--- a/web-editor/public/reference/ja/_jp/GameScene.md
+++ b/web-editor/public/reference/ja/_jp/GameScene.md
@@ -411,6 +411,10 @@ Imports StructureLib multiblock プレビュー by controller id.
| `rotation` | いいえ | 回転 上書き passed へ importer |
| `flip` | いいえ | flip/mirror 上書き passed へ importer |
| `channel` | いいえ | 整数 channel 上書き 用 channel-aware structures |
+| `tier` | いいえ | tier 対応構造の初期 tier 値 |
+| `channelName` | いいえ | ルートの `channel` または `value` 上書きに使う channel 名 |
+| `value` | いいえ | `channelName` と組み合わせる channel 値 |
+| `locked` | いいえ | 明示した tier または channel の値を固定 |
| `offsetX` | いいえ | 整数 X offset applied へ すべての placed ブロック (既定値 `0`) |
| `offsetY` | いいえ | 整数 Y offset applied へ すべての placed ブロック, clamped へ `[0, worldHeight-1]` (既定値 `0`) |
| `offsetZ` | いいえ | 整数 Z offset applied へ すべての placed ブロック (既定値 `0`) |
@@ -431,6 +435,8 @@ Imports StructureLib multiblock プレビュー by controller id.
````md
+
+
````
@@ -468,7 +474,9 @@ channel sliders.
| 子 タグ | 意味 |
| --- | --- |
| `` | Master tier 値. |
+| `` | 明示した tier または channel の値を固定. |
| `` | Named StructureLib channel 上書き. Repeat 用 複数の channels. |
+| `` | 明示した tier または channel の値を固定. |
| `` | 既定値 facing. |
| `` | 既定値 回転. |
| `` | 既定値 flip/mirror. |
@@ -483,8 +491,8 @@ keeping フォールバック casings by 既定値.
````md
-
-
+
+
diff --git a/web-editor/public/reference/ja/_jp/Tags-Reference.md b/web-editor/public/reference/ja/_jp/Tags-Reference.md
index e4849d948..639e01c4c 100644
--- a/web-editor/public/reference/ja/_jp/Tags-Reference.md
+++ b/web-editor/public/reference/ja/_jp/Tags-Reference.md
@@ -77,7 +77,7 @@ Inline Markdown も 対応します action リンク 用 sound playback:
| `` | ブロック-level BetterQuesting quest summary card (compat タグ, のみ 登録済み 場合 BetterQuesting です 読み込み済み) | `id`, `show_desc`, `show_tooltip` |
`` は `` 子 タグ. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, と `channel` 属性, と も 対応します StructureLib 既定値 子 タグ:
+`rotation`, `flip`, と `tier`, `channel`, `channelName`, `value`, `locked` 属性, と も 対応します StructureLib 既定値 子 タグ:
``, ``, ``, ``, ``, ``,
``, と ``.
@@ -679,7 +679,7 @@ $$\begin{pmatrix} a & b \\ c & d \end{pmatrix}$$
| タグ | Purpose | キー 属性 |
| --- | --- | --- |
| `` | import 外部 SNBT/NBT structure アセット | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | 削除 すでに-placed ブロック that 一致 a ブロック matcher | `id` |
| `` | stamp 同じ 子 注釈 onto すべての 一致する placed ブロック | `id` |
diff --git a/web-editor/public/reference/nl/_nl/GameScene.md b/web-editor/public/reference/nl/_nl/GameScene.md
index 20d709e58..c3f301380 100644
--- a/web-editor/public/reference/nl/_nl/GameScene.md
+++ b/web-editor/public/reference/nl/_nl/GameScene.md
@@ -411,6 +411,10 @@ Imports Een StructureLib multiblock voorbeeldweergave by controller id.
| `rotation` | no | rotatie override passed naar De importer |
| `flip` | no | flip/mirror override passed naar De importer |
| `channel` | no | geheel getal channel override voor channel-aware structures |
+| `tier` | nee | initiële tier-waarde voor tier-bewuste structuren |
+| `channelName` | nee | naam van het kanaal voor de root `channel`- of `value`-override |
+| `value` | nee | kanaalwaarde samen met `channelName` |
+| `locked` | nee | vergrendelt de expliciet opgegeven tier- of kanaalwaarde |
| `offsetX` | no | geheel getal X offset applied naar alle placed blokken (Standaard `0`) |
| `offsetY` | no | geheel getal Y offset applied naar alle placed blokken, clamped naar `[0, worldHeight-1]` (Standaard `0`) |
| `offsetZ` | no | geheel getal Z offset applied naar alle placed blokken (Standaard `0`) |
@@ -431,6 +435,8 @@ Example:
````md
+
+
````
@@ -468,7 +474,9 @@ channel sliders.
| kind tag | Betekenis |
| --- | --- |
| `` | Master tier waarde. |
+| `` | vergrendelt de expliciet opgegeven tier- of kanaalwaarde. |
| `` | Named StructureLib channel override. Repeat voor meerdere channels. |
+| `` | vergrendelt de expliciet opgegeven tier- of kanaalwaarde. |
| `` | Standaard facing. |
| `` | Standaard rotatie. |
| `` | Standaard flip/mirror. |
@@ -483,8 +491,8 @@ keeping fallback casings by Standaard.
````md
-
-
+
+
diff --git a/web-editor/public/reference/nl/_nl/Tags-Reference.md b/web-editor/public/reference/nl/_nl/Tags-Reference.md
index 477c7c3f7..61eb2bbcf 100644
--- a/web-editor/public/reference/nl/_nl/Tags-Reference.md
+++ b/web-editor/public/reference/nl/_nl/Tags-Reference.md
@@ -77,7 +77,7 @@ Inline Markdown ook ondersteunt action links voor sound playback:
| `` | blok-level BetterQuesting quest summary card (compat tag, alleen registered wanneer BetterQuesting is loaded) | `id`, `show_desc`, `show_tooltip` |
`` is a `` kind tag. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, en `channel` attributen, en ook ondersteunt StructureLib Standaard kind tags:
+`rotation`, `flip`, en `tier`, `channel`, `channelName`, `value`, `locked` attributen, en ook ondersteunt StructureLib Standaard kind tags:
``, ``, ``, ``, ``, ``,
``, en ``.
@@ -679,7 +679,7 @@ Deze tags alleen work binnen `` / ``:
| tag | Purpose | Key attributen |
| --- | --- | --- |
| `` | import Een external SNBT/NBT structure asset | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import Een StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import Een StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | verwijderen al-placed blokken that match Een blok matcher | `id` |
| `` | stamp De zelfde kind Annotaties onto iedere matching placed blok | `id` |
diff --git a/web-editor/public/reference/pl/_pl/GameScene.md b/web-editor/public/reference/pl/_pl/GameScene.md
index e5e203e40..44995a21e 100644
--- a/web-editor/public/reference/pl/_pl/GameScene.md
+++ b/web-editor/public/reference/pl/_pl/GameScene.md
@@ -411,6 +411,10 @@ importy StructureLib multiblock podgląd by controller id.
| `rotation` | no | obrót nadpisywać passed do importer |
| `flip` | no | flip/mirror nadpisywać passed do importer |
| `channel` | no | liczba całkowita channel nadpisywać dla channel-aware struktury |
+| `tier` | nie | początkowa wartość tier dla struktur obsługujących tier |
+| `channelName` | nie | nazwa kanału używana z głównym nadpisaniem `channel` lub `value` |
+| `value` | nie | wartość kanału używana z `channelName` |
+| `locked` | nie | blokuje jawnie podaną wartość tier lub channel |
| `offsetX` | no | liczba całkowita X offset applied do wszystkie umieszczony bloki (Domyślne `0`) |
| `offsetY` | no | liczba całkowita Y offset applied do wszystkie umieszczony bloki, clamped do `[0, worldHeight-1]` (Domyślne `0`) |
| `offsetZ` | no | liczba całkowita Z offset applied do wszystkie umieszczony bloki (Domyślne `0`) |
@@ -431,6 +435,8 @@ Przykład:
````md
+
+
````
@@ -468,7 +474,9 @@ channel sliders.
| element podrzędny tag | Znaczenie |
| --- | --- |
| `` | Master tier wartość. |
+| `` | blokuje jawnie podaną wartość tier lub channel. |
| `` | Named StructureLib channel nadpisywać. Repeat dla wiele kanały. |
+| `` | blokuje jawnie podaną wartość tier lub channel. |
| `` | Domyślne facing. |
| `` | Domyślne obrót. |
| `` | Domyślne flip/mirror. |
@@ -483,8 +491,8 @@ keeping awaryjny casings by Domyślne.
````md
-
-
+
+
diff --git a/web-editor/public/reference/pl/_pl/Tags-Reference.md b/web-editor/public/reference/pl/_pl/Tags-Reference.md
index ec84143d6..fb8f5c9b9 100644
--- a/web-editor/public/reference/pl/_pl/Tags-Reference.md
+++ b/web-editor/public/reference/pl/_pl/Tags-Reference.md
@@ -77,7 +77,7 @@ Inline Markdown także obsługuje action links dla sound playback:
| `` | blok-level BetterQuesting quest summary card (compat tag, tylko zarejestrowany gdy BetterQuesting is załadowany) | `id`, `show_desc`, `show_tooltip` |
`` is a `` element podrzędny tag. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, i `channel` atrybuty, i także obsługuje StructureLib Domyślne element podrzędny tagi:
+`rotation`, `flip`, i `tier`, `channel`, `channelName`, `value`, `locked` atrybuty, i także obsługuje StructureLib Domyślne element podrzędny tagi:
``, ``, ``, ``, ``, ``,
``, i ``.
@@ -679,7 +679,7 @@ Te tagi tylko działa wewnątrz `` / ``:
| tag | Purpose | klucz atrybuty |
| --- | --- | --- |
| `` | import zewnętrzny SNBT/NBT struktura zasób | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | usuwać już-umieszczony bloki który pasować blok matcher | `id` |
| `` | stamp ten sam element podrzędny Adnotacje onto każdy pasujący umieszczony blok | `id` |
diff --git a/web-editor/public/reference/pt/_br/GameScene.md b/web-editor/public/reference/pt/_br/GameScene.md
index 7528d8140..cfd7e7461 100644
--- a/web-editor/public/reference/pt/_br/GameScene.md
+++ b/web-editor/public/reference/pt/_br/GameScene.md
@@ -411,6 +411,10 @@ Imports Uma StructureLib multiblock visualização by controller id.
| `rotation` | não | rotação substituir passed para O importer |
| `flip` | não | flip/mirror substituir passed para O importer |
| `channel` | não | inteiro channel substituir para channel-aware structures |
+| `tier` | não | valor inicial de tier para estruturas compatíveis |
+| `channelName` | não | nome do canal usado com a substituição raiz `channel` ou `value` |
+| `value` | não | valor do canal usado com `channelName` |
+| `locked` | não | bloqueia o valor de tier ou canal fornecido explicitamente |
| `offsetX` | não | inteiro X offset applied para todos placed blocos (Padrão `0`) |
| `offsetY` | não | inteiro Y offset applied para todos placed blocos, clamped para `[0, worldHeight-1]` (Padrão `0`) |
| `offsetZ` | não | inteiro Z offset applied para todos placed blocos (Padrão `0`) |
@@ -431,6 +435,8 @@ Exemplo:
````md
+
+
````
@@ -468,7 +474,9 @@ channel sliders.
| filho tag | Significado |
| --- | --- |
| `` | Master tier valor. |
+| `` | bloqueia o valor de tier ou canal fornecido explicitamente. |
| `` | Named StructureLib channel substituir. Repeat para vários channels. |
+| `` | bloqueia o valor de tier ou canal fornecido explicitamente. |
| `` | Padrão facing. |
| `` | Padrão rotação. |
| `` | Padrão flip/mirror. |
@@ -483,8 +491,8 @@ keeping reserva casings by Padrão.
````md
-
-
+
+
diff --git a/web-editor/public/reference/pt/_br/Tags-Reference.md b/web-editor/public/reference/pt/_br/Tags-Reference.md
index b8d4673e4..3d866190c 100644
--- a/web-editor/public/reference/pt/_br/Tags-Reference.md
+++ b/web-editor/public/reference/pt/_br/Tags-Reference.md
@@ -77,7 +77,7 @@ Inline Markdown também suporta action links para sound playback:
| `` | bloco-level BetterQuesting quest summary card (compat tag, somente registrado quando BetterQuesting é carregado) | `id`, `show_desc`, `show_tooltip` |
`` é a `` filho tag. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, e `channel` atributos, e também suporta StructureLib Padrão filho tags:
+`rotation`, `flip`, e `tier`, `channel`, `channelName`, `value`, `locked` atributos, e também suporta StructureLib Padrão filho tags:
``, ``, ``, ``, ``, ``,
``, e ``.
@@ -679,7 +679,7 @@ Estes tags somente funcionam dentro de `` / ``:
| tag | Purpose | chave atributos |
| --- | --- | --- |
| `` | import Um externo SNBT/NBT structure recurso | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import Uma StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import Uma StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | remover já-placed blocos que corresponder Uma bloco matcher | `id` |
| `` | stamp O mesmo filho Anotações onto cada correspondente placed bloco | `id` |
diff --git a/web-editor/public/reference/ru/_ru/GameScene.md b/web-editor/public/reference/ru/_ru/GameScene.md
index 5a09f1b6e..c81b48a06 100644
--- a/web-editor/public/reference/ru/_ru/GameScene.md
+++ b/web-editor/public/reference/ru/_ru/GameScene.md
@@ -405,6 +405,10 @@ GuideNH в настоящее время регистрирует следующ
| `rotation` | нет | переопределение поворота передано импортеру |
| `flip` | нет | переопределение переворота/зеркала передано импортеру |
| `channel` | нет | переопределение целочисленного канала для структур, поддерживающих канал. |
+| `tier` | нет | начальное значение tier для структур с уровнями |
+| `channelName` | нет | имя канала для корневого переопределения `channel` или `value` |
+| `value` | нет | значение канала вместе с `channelName` |
+| `locked` | нет | блокирует явно заданное значение tier или канала |
| `offsetX` | нет | целочисленное смещение по оси X, применяемое ко всем размещенным блокам (по умолчанию `0`). |
| `offsetY` | нет | целочисленное смещение по оси Y, применяемое ко всем размещенным блокам, ограниченное значением `[0, worldHeight-1]` (по умолчанию `0`). |
| `offsetZ` | нет | целочисленное смещение по оси Z, применяемое ко всем размещенным блокам (по умолчанию `0`). |
@@ -425,6 +429,8 @@ GuideNH в настоящее время регистрирует следующ
````md
+
+
````
@@ -462,7 +468,9 @@ GuideNH в настоящее время регистрирует следующ
| Дочерний тег | Значение |
| --- | --- |
| `` | Значение уровня «Мастер». |
+| `` | блокирует явно заданное значение tier или канала. |
| `` | переопределение именованного канала StructureLib. Повторите для нескольких каналов. |
+| `` | блокирует явно заданное значение tier или канала. |
| `` | Облицовка по умолчанию. |
| `` | вращение по умолчанию. |
| `` | Переворот/зеркало по умолчанию. |
@@ -477,8 +485,8 @@ GuideNH в настоящее время регистрирует следующ
````md
-
-
+
+
diff --git a/web-editor/public/reference/ru/_ru/Tags-Reference.md b/web-editor/public/reference/ru/_ru/Tags-Reference.md
index 240c124da..c939b8922 100644
--- a/web-editor/public/reference/ru/_ru/Tags-Reference.md
+++ b/web-editor/public/reference/ru/_ru/Tags-Reference.md
@@ -74,7 +74,7 @@
| `` | сводная карточка квеста BetterQuesting на уровне блока (тег совместимости, регистрируется только при загрузке BetterQuesting) | `id`, `show_desc`, `show_tooltip` |
`` — это дочерний тег ``. Он принимает `controller`, `piece`, `facing`,
-атрибуты `rotation`, `flip` и `channel`, а также поддерживают дочерние теги StructureLib по умолчанию:
+атрибуты `rotation`, `flip` и `tier`, `channel`, `channelName`, `value`, `locked`, а также поддерживают дочерние теги StructureLib по умолчанию:
``, ``, ``, ``, ``, ``,
`` и ``.
@@ -676,7 +676,7 @@ $$\begin{pmatrix} a & b \\ c & d \end{pmatrix}$$
| Тег | Цель | Ключевые атрибуты |
| --- | --- | --- |
| `` | импорт внешнего актива структуры SNBT/NBT. | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | импортируйте мультиблок StructureLib по идентификатору контроллера. | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | импортируйте мультиблок StructureLib по идентификатору контроллера. | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | удалить уже размещенные блоки, соответствующие сопоставителю блоков. | `id` |
| `` | наносить одни и те же дочерние аннотации на каждый соответствующий размещенный блок. | `id` |
diff --git a/web-editor/public/reference/uk/_ua/GameScene.md b/web-editor/public/reference/uk/_ua/GameScene.md
index 2dcd5360f..a6d801101 100644
--- a/web-editor/public/reference/uk/_ua/GameScene.md
+++ b/web-editor/public/reference/uk/_ua/GameScene.md
@@ -411,6 +411,10 @@ Places a блок до перегляд світ.
| `rotation` | no | обертання перевизначати passed до importer |
| `flip` | no | flip/mirror перевизначати passed до importer |
| `channel` | no | ціле число channel перевизначати для channel-aware структури |
+| `tier` | ні | початкове значення tier для структур із рівнями |
+| `channelName` | ні | назва каналу для кореневого перевизначення `channel` або `value` |
+| `value` | ні | значення каналу разом із `channelName` |
+| `locked` | ні | блокує явно задане значення tier або каналу |
| `offsetX` | no | ціле число X offset applied до усі розміщений блоки (Типове `0`) |
| `offsetY` | no | ціле число Y offset applied до усі розміщений блоки, clamped до `[0, worldHeight-1]` (Типове `0`) |
| `offsetZ` | no | ціле число Z offset applied до усі розміщений блоки (Типове `0`) |
@@ -431,6 +435,8 @@ Places a блок до перегляд світ.
````md
+
+
````
@@ -468,7 +474,9 @@ channel sliders.
| дочірній елемент тег | Значення |
| --- | --- |
| `` | Master tier значення. |
+| `` | блокує явно задане значення tier або каналу. |
| `` | Named StructureLib channel перевизначати. Repeat для кілька канали. |
+| `` | блокує явно задане значення tier або каналу. |
| `` | Типове facing. |
| `` | Типове обертання. |
| `` | Типове flip/mirror. |
@@ -483,8 +491,8 @@ keeping резервний варіант casings by Типове.
````md
-
-
+
+
diff --git a/web-editor/public/reference/uk/_ua/Tags-Reference.md b/web-editor/public/reference/uk/_ua/Tags-Reference.md
index cf3ce2e3e..d0e1cf62c 100644
--- a/web-editor/public/reference/uk/_ua/Tags-Reference.md
+++ b/web-editor/public/reference/uk/_ua/Tags-Reference.md
@@ -77,7 +77,7 @@ Inline Markdown також підтримує action links для sound playback
| `` | блок-level BetterQuesting quest summary card (compat тег, лише зареєстрований коли BetterQuesting is завантажений) | `id`, `show_desc`, `show_tooltip` |
`` is a `` дочірній елемент тег. It accepts `controller`, `piece`, `facing`,
-`rotation`, `flip`, і `channel` атрибути, і також підтримує StructureLib Типове дочірній елемент теги:
+`rotation`, `flip`, і `tier`, `channel`, `channelName`, `value`, `locked` атрибути, і також підтримує StructureLib Типове дочірній елемент теги:
``, ``, ``, ``, ``, ``,
``, і ``.
@@ -679,7 +679,7 @@ $$\begin{pmatrix} a & b \\ c & d \end{pmatrix}$$
| тег | Purpose | ключ атрибути |
| --- | --- | --- |
| `` | import зовнішній SNBT/NBT структура ресурс | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | import StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | import StructureLib multiblock by controller id | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | видалити вже-розміщений блоки який відповідати a блок matcher | `id` |
| `` | stamp той самий дочірній елемент Анотації onto кожен відповідний розміщений блок | `id` |
diff --git a/web-editor/public/reference/zh/_cn/GameScene.md b/web-editor/public/reference/zh/_cn/GameScene.md
index 2d52c618b..c4d5328f6 100644
--- a/web-editor/public/reference/zh/_cn/GameScene.md
+++ b/web-editor/public/reference/zh/_cn/GameScene.md
@@ -382,7 +382,11 @@ GuideNH 当前注册了以下场景子标签:
| `facing` | 否 | 传给导入器的朝向覆盖值 |
| `rotation` | 否 | 传给导入器的旋转覆盖值 |
| `flip` | 否 | 传给导入器的镜像覆盖值 |
+| `tier` | 否 | 支持 tier 的结构的初始 tier 值 |
| `channel` | 否 | 支持频道结构的频道整数覆盖值 |
+| `channelName` | 否 | 与根标签 `channel` 或 `value` 覆盖值配合使用的频道名称 |
+| `value` | 否 | 与 `channelName` 配合使用的频道值 |
+| `locked` | 否 | 为 `true` 时锁定根标签显式提供的 tier 或频道值,交互时不能修改 |
| `offsetX` | 否 | 所有放置方块的 X 偏移,整数,默认 `0` |
| `offsetY` | 否 | 所有放置方块的 Y 偏移,整数,会被限制在 `[0, 世界高度-1]`,默认 `0` |
| `offsetZ` | 否 | 所有放置方块的 Z 偏移,整数,默认 `0` |
@@ -403,6 +407,8 @@ GuideNH 当前注册了以下场景子标签:
````md
+
+
````
@@ -439,7 +445,9 @@ StructureLib 默认值也可以写成子标签。这些默认值会成为场景
| 子标签 | 含义 |
| --- | --- |
| `` | 主 tier 值。 |
+| `` | 锁定为 4 的主 tier 值,用户不能修改。 |
| `` | 具名 StructureLib channel 覆盖值;可以重复。 |
+| `` | 锁定的具名 channel 覆盖值,用户不能修改。 |
| `` | 默认朝向。 |
| `` | 默认旋转。 |
| `` | 默认翻转 / 镜像。 |
@@ -453,8 +461,8 @@ StructureLib 默认值也可以写成子标签。这些默认值会成为场景
````md
-
-
+
+
diff --git a/web-editor/public/reference/zh/_cn/Tags-Reference.md b/web-editor/public/reference/zh/_cn/Tags-Reference.md
index 1163bbbf0..4020e2524 100644
--- a/web-editor/public/reference/zh/_cn/Tags-Reference.md
+++ b/web-editor/public/reference/zh/_cn/Tags-Reference.md
@@ -76,7 +76,7 @@
| `` | 块级 BetterQuesting 任务摘要卡片(兼容标签,仅当 BetterQuesting 已加载时注册) | `id`, `show_desc`, `show_tooltip` |
`` 是 `` 的子标签。它支持 `controller`、`piece`、`facing`、
-`rotation`、`flip`、`channel` 属性,也支持用于设置 StructureLib 默认值的子标签:
+`rotation`、`flip`、`tier`、`channel`、`channelName`、`value`、`locked` 属性,也支持用于设置 StructureLib 默认值的子标签:
``、``、``、``、``、``、
``、``。
@@ -673,7 +673,7 @@ $$\begin{pmatrix} a & b \\ c & d \end{pmatrix}$$
| 标签 | 用途 | 关键属性 |
| --- | --- | --- |
| `` | 导入外部 SNBT/NBT 结构资源 | `src`, `x`, `y`, `z`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
-| `` | 通过控制器 id 导入 StructureLib 多方块 | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `channel`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
+| `` | 通过控制器 id 导入 StructureLib 多方块 | `controller`, `name`, `piece`, `facing`, `rotation`, `flip`, `tier`, `channel`, `channelName`, `value`, `locked`, `offsetX`, `offsetY`, `offsetZ`, `formed` |
| `` | 移除已放置且匹配指定方块匹配器的方块 | `id` |
| `` | 把同一组子注解扩展到场景中所有匹配方块上 | `id` |
diff --git a/web-editor/public/reference/zh/_tw/GameScene.md b/web-editor/public/reference/zh/_tw/GameScene.md
index 556aec206..3a5b225e7 100644
--- a/web-editor/public/reference/zh/_tw/GameScene.md
+++ b/web-editor/public/reference/zh/_tw/GameScene.md
@@ -383,6 +383,10 @@ GuideNH 目前註冊了以下場景子標籤:
| `rotation` | 否 | 傳給導入器的旋轉覆蓋值 |
| `flip` | 否 | 傳給導入器的鏡像覆蓋值 |
| `channel` | 否 | 支援頻道結構的頻道整數覆蓋值 |
+| `tier` | 否 | 支援 tier 的結構初始 tier 值 |
+| `channelName` | 否 | 與根標籤 `channel` 或 `value` 覆蓋值搭配的頻道名稱 |
+| `value` | 否 | 與 `channelName` 搭配使用的頻道值 |
+| `locked` | 否 | 鎖定明確提供的 tier 或頻道值 |
| `offsetX` | 否 | 所有放置方塊的 X 偏移,整數,預設 `0` |
| `offsetY` | 否 | 所有放置方塊的 Y 偏移,整數,會被限制在 `[0, 世界高度-1]`,預設 `0` |
| `offsetZ` | 否 | 所有放置方塊的 Z 偏移,整數,預設 `0` |
@@ -403,6 +407,8 @@ GuideNH 目前註冊了以下場景子標籤:
````md
+
+
````
@@ -439,7 +445,9 @@ StructureLib 預設值也可以寫成子標籤。這些預設值會成為場景
| 子標籤 | 意義 |
| --- | --- |
| `` | 主 tier 值。 |
+| `` | 鎖定明確提供的 tier 或頻道值. |
| `` | 具名 StructureLib channel 覆蓋值;可重複。 |
+| `` | 鎖定明確提供的 tier 或頻道值. |
| `` | 預設朝向。 |
| `` | 默认旋转。 |
| `` | 默认翻转 / 镜像。 |
@@ -453,8 +461,8 @@ StructureLib 預設值也可以寫成子標籤。這些預設值會成為場景
````md
-
-
+
+
diff --git a/web-editor/public/reference/zh/_tw/Tags-Reference.md b/web-editor/public/reference/zh/_tw/Tags-Reference.md
index f5ad56af2..112999310 100644
--- a/web-editor/public/reference/zh/_tw/Tags-Reference.md
+++ b/web-editor/public/reference/zh/_tw/Tags-Reference.md
@@ -76,7 +76,7 @@
| `` | 區塊級 BetterQuesting 任務摘要卡片(相容標籤,僅當 BetterQuesting 已載入時註冊) | `id`, `show_desc`, `show_tooltip` |
`` 是 `` 的子標籤。它支援 `controller`、`piece`、`facing`、
-`rotation`、`flip`、`channel` 屬性,也支援用於設定 StructureLib 預設值的子標籤:
+`rotation`、`flip`、`tier`, `channel`, `channelName`, `value`, `locked` 屬性,也支援用於設定 StructureLib 預設值的子標籤:
``、``、``、``、``、``、
``、``。
@@ -673,7 +673,7 @@ $$\begin{pmatrix} a & b \\ c & d \end{pmatrix}$$
| 标签 | 用途 | 关键属性 |
| --- | --- | --- |
| `