GuideNH
66 merged pull requests.
New Features
- #91 GuideSiteWriter now writes site-config.json, locale.js and lang/*.json with an index. GuideSiteItemIconExporter renders icons at 96px with no inset to remove scaling jitter, nav icons load lazily, and the export result reports mod ids and languages exported. - @ABKQPO
- Added: hide annotations button in exported scenes, JSON site localization, site-config.json, online editor link in README
- Fixed: item icon scaling jitter in exported site
- #90 Reworked the GuideSite exporter with diagnostics, parallel language preparation, shared/compressed assets and scene state manifests. The export command's ponder-every-tick default flipped to true, GuideNavBar gained scrollbar dragging, and OpenGuideHotkey got a thread-local switch to suppress tooltip hints while building export tooltips. - @ABKQPO
- Added: export diagnostics with line and column, export stage timing output, navigation bar scrollbar drag, npm static site build for GitHub Pages
- Fixed: indentation warning line numbers off by one
- #84 Added TemplateCompiler and template handling in PageCompiler and DetailsTagCompiler, with dependency tracking, diagnostics and hot reload invalidation through GuideSourceWatcher and GuideLightweightReloadService. Editor autocomplete gets TemplateArgumentCandidate and MDX attribute name context. The diff was too large to fetch, so this is based on the file list and body. - @ABKQPO
- Added: MediaWiki style MDX templates, template argument completion in the editor, generated Templates page in the editor, template documentation (English and Chinese), example template resource pack
- #80 Adds an immutable, cached GuideSyntaxModel with revision tracking, extensible SyntaxValueKind, 19 built-in value sources and 28 guarded registration methods on GuideNhIntegrationRegistry. RecipeCompiler gains handlerWhitelist/handlerBlacklist, and ModConfig gets a recipeHandlerBlacklist list. IdUtils.resolveLink and asset lookups reject unsafe paths, and symbolic color resolvers run guarded. - @ABKQPO
- Added: Pluggable guide editor syntax registry, Recipe tag handlerWhitelist and handlerBlacklist attributes, recipeHandlerBlacklist config option, Code fence renderer extension point
- Fixed: Guide editor completion failing on unparsable documents and incomplete tags, Tag, attribute, value and quote range detection in completion
- #71 Adds registries with reversible handles for toolbar buttons and Export/Snap items, an action context, an icon model, a menu-widget contract and a slider widget. Built-in controls move to a default control registry. Adds the sceneEditorExportOpenFolderAfterExport config. ARGB, Colors, SymbolicColor and LightDarkMode are removed in favour of ColorUtils with GTNHLib ColorResource colors, and the three debug color config options are removed. - @ABKQPO
- Added: Scene Editor toolbar and menu control API, Open Structure Folder After SNBT Export option, ColorUtils resource-pack overridable colors
- Removed: debug text, outline and cursor color config options, ARGB, Colors, SymbolicColor, LightDarkMode classes
- Fixed: mouse wheel not reaching interactive scenes in the Guide Editor preview
- #69 Extended Frontmatter and FrontmatterNavigation to support navigation.keyword and navigation.keywords fields, updated GuideSearch and IndexSchema to index and search these aliases separately from titles. - @ABKQPO
- Added: navigation keyword search, keyword alias support
- #53 Added displayWidth and displayHeight parameters to FloatingImageCompiler and LytImage, updated rendering logic in LytImageBlock to apply display dimensions, updated documentation and autocomplete registry. - @ABKQPO
- Added: displayWidth attribute for FloatingImage, displayHeight attribute for FloatingImage
- #52 Added ELK-based layout for flowcharts, implemented nested subgraph support, enhanced navigation tree with expand/collapse logic, built background search indexer with markdown stripping, improved viewport culling and debug hit detection. - @ABKQPO
- Added: native Mermaid flowchart rendering, navigation expand/collapse controls, background search indexing, guide search improvements
- Fixed: guide search for large packs, navigation state, snippet generation
- #50 Fixed edge routing in LytMermaidFlowchartCanvas, added EllipseShape and other shape implementations to FlowchartShapes registry, enhanced shape rendering system. - @sbancuz
- Added: website export for Mermaid flowcharts, ellipse shape support, additional flowchart shape options
- Fixed: dangling edges in Mermaid flowcharts
- #39 Added
GuideWelcomeScreenandGuideWelcomeContentthat render localized markdown fromassets/guidenh/welcome/. Per-player/per-save seen state tracked in config. - @DreamYao520- Added: welcome popup on first open, localized welcome resources (en_us, zh_cn), per-player seen state
- #37 Generalized Mermaid rendering pipeline, added
LytMermaidFlowchartCanvasusing ELK layout engine, implementedMermaidNodeRendererfor shape/edge rendering. - @sbancuz- Added: Mermaid flowchart support, ELK layout engine integration, LytButton for toolbar buttons, shape and edge type renderers
- #36 Added the internal.debug package with DebugControlPanel, DebugComponent, DebugFlowContainer and a DebugInfoExtractor registry. Extractors cover documents, paragraphs, headings, items, images, charts, Mermaid, scenes, code blocks, LaTeX and containers. Tabs, Mermaid mindmap nodes and chart parts implement DebugComponent. ModConfig.Debug gained many display toggles, with guiDebugMode defaulting to false. - @ABKQPO
- Added: GUI debug overlay, debug control panel, debug info extractor registry, debug config options
- #35 Added
BqGuidePageLinkstag processor andBqGuidePageUriHandlerfor URI routing. Implemented mixins forPanelTextBoxto support custom link rendering. - @ABKQPO- Added: BetterQuesting integration for guide page links, guidenh: URI scheme handler, BQ-gated mixin classes
- #33 Added
DefaultGuideResourcePackManagerimplementingIResourcePack, createdDirectoryResourcePackfor loose filesystem packs, injected into client resource chain. - @ABKQPO- Added: DefaultGuideResourcePackManager for user-created guides, DirectoryResourcePack implementation, config/guidenh/DefaultGuide/ auto-creation
- Removed: GuideDevelopmentResourcePack (replaced by DirectoryResourcePack)
- #29 Modified
GuideSiteExportTaskandGuideSiteWriterto use language-aware resource resolution. AddedGuideSiteLocalizedTextclass for language lookups and new lang file entries. - @ABKQPO- Added: GuideSiteLocalizedText class for language resolution, lang file entries for site export
- #15 Introduced AsyncWorker (4-thread pool) and CompileWorker (daemon) for background heavy lifting. Rewrote SceneScript with 3-phase state machine and materialization tasks. Fixed GuideScreen and NavigationState to properly scope and persist per-guide state (scroll, expansion). Changed nei-custom-diagram to compileOnlyApi. - @Windorain
- Added: AsyncWorker, CompileWorker, SceneScript 3-phase state machine
- Removed: DeferredTask
- Fixed: navigation state persistence across guides, ponder scene localization
- #14 Frontmatter now parses icon entries through parseIconEntryString into an item id, meta and NBTTagCompound using JsonToNBT. FrontmatterNavigation and NavigationIconEntry hold NBTTagCompound in place of the old icon_components map. PageJsonWriter and NavigationUtil are updated, and GuideLightweightReloadService.loadPages becomes public. - @ABKQPO
- Added: NBT support in navigation icon, icons list for cycling item icons, icon_textures list
- Removed: icon_components front matter key
- #10 Extended RecipeCompiler to support RecipesUsage (multi) tag alongside RecipeUsage (single). Updated GuideSiteRecipeTagRenderer and documentation (wiki/Recipes.md) to reflect new tag variants. - @koolkrafter5
- Added: RecipesUsage tag, Usage short form
Changes
- #88 Refactored siteexport: GuideSiteWriter slimmed, GuideSiteHtmlCompiler expanded, GuideSiteLocalServer and GuideSiteLocalServerJarWriter deleted. Updated app.js, app.css and layout.html, the resource pack scanner and the pages deploy workflow. - @ABKQPO
- Added: more web editor features, more web editor translations
- Removed: built-in local server for site export
- #64
BlockImageCompiler's default scale went from 1f to 4f, andGuideSiteMdxTagRenderer.readBlockImageScalematches it. - @ABKQPO - #46 Added dependencies = "required-after:gtnhlib;" to the @Mod annotation in GuideNH.java. README.md and README_zh.md got a Required Dependencies section. - @ABKQPO
- Added: required dependency on GTNHLib
- #23 FloatingImageCompiler parses crop and scale specs, and LytImage and LytImageBlock gain crop and scale fields that replace the explicit width and height layout. The render contexts, site export HTML compiler, app.css and app.js, the editor autocomplete registry and the wiki pages are updated. Also adds alt, wrap, sound, soundSrc and trigger attribute specs. - @ABKQPO
- Added: FloatingImage x, y, width, height crop attributes, FloatingImage scaleX and scaleY attributes
- Removed: FloatingImage width and height as size attributes
- Closes #22
- #18 In GuideLightweightReloadService.loadPages, replaced GuideDebugLog.warnAlways with GuideDebugLog.warn for the failed page load message. - @ABKQPO
- #9 - @ABKQPO
Bug Fixes
- #93 GuideSiteSceneAnnotationSerializer was expanded to serialize rich tooltip content. Getters were added to the chart, LytFileTree.Row and Mermaid layout classes so the serializer can read them. - @ABKQPO
- Fixed: rich text missing from tooltips in exported site
- #89 Added IdUtils.normalizeAssetPath, used in MutableGuide.readAssetPath. Fixed GuideResourceAccess to read the candidate's own resource location. The export command times the run and formats elapsed time into its messages. Several warnAlways calls became warn, and StructureLib binding debug logs were removed from SceneScript. - @ABKQPO
- Added: elapsed time in the export site command output
- Removed: StructureLib binding debug logging
- Fixed: guide assets wrongly detected as outside the guide directory
- #86 Bumps BlockRenderer6343 to 1.4.23 and GT5-Unofficial to 5.09.54.158. Uses the new ConstructableData API (getChannelMaxTierMap, the static constructable data map getter) and removes the AccessorConstructableData mixin. StructureLibDefinitionCache uses Lombok @Getter for scan state. - @ABKQPO
- Removed: AccessorConstructableData mixin
- Fixed: Client crash when opening a GuideNH page of a multiblock
- Closes GTNH#26918
- #83 Removes the MinimumHatchStructureElement wrapper and the MixinStructureHacksMinimumHatch mixin, which broke BlockRenderer's reliance on the anonymous class's this$0 field. Adds MixinHatchElementPlacementPreview and a WeakHashMap in StructureLibMinimumHatchPlacement, active only during GuideNH preview builds. - @ABKQPO
- Added: MixinHatchElementPlacementPreview
- Removed: MinimumHatchStructureElement wrapper, MixinStructureHacksMinimumHatch
- Fixed: NEI initialization failure caused by reflection on wrapped hatch elements
- #82 ClientProxy.completeInit now calls StructureLibDefinitionCache.startScans() so BlockRenderer6343 scans see the full controller registry. Also adds a GTNHExtLib dependency, fastutil at runtime, and removes @Desugar from records. - @ABKQPO
- Fixed: Missing StructureLib hatch candidates in previews, Incomplete tier and channel ranges in ConstructableData from early scans
- #78 GuideIconButton.Role.TOGGLE_BLOCK_STATS sprite coordinates changed from (0, 0) to (1, 3). - @ABKQPO
- Added: Block stats toggle button icon
- #76 GuidePage, ParsedGuidePage and LazyParsedGuidePage now carry the IResourcePack selected at load time. GuideScreen.getSourceDisplayName uses its pack name and no longer scans the repository entries by domain. - @ABKQPO
- Fixed: Guide page footer crediting the wrong resource pack
- Closes #75
- #60 Added ResourcePackContentManifest for reload cache invalidation, file name fields in the search index, and an NBT-aware filter split in RecipeCompiler. LytDocument.render catches Throwable per block, and replaceChild sends attach and detach notifications. - @ABKQPO
- Added: file name search, NBT support in RecipeFor, mixed indentation warning
- Fixed: oversized Ponder offset values, resource pack reload cache ignoring file changes, one failing block aborting the whole document render
- #57 Bumped BetterQuesting dev dependency to 3.8.77-GTNH. Moved BQ mixins into compat.betterquesting. The hot zone accessor now reads the link field instead of url, and MixinPanelTextBox checks that it is a String. - @ABKQPO
- Fixed: BetterQuesting compatibility mixins after upstream field change
- #55 In GregTechHelpers, all @Optional.Method annotations change modid from gregtech to gregtech_nh. - @felixfour
- Fixed: optional GregTech method checks matching GT6
- #51 Restored polling in DevWatchWorkItem with proper shouldRun() logic, exposed GuideSourceWatcher.takeChanges() through MutableGuide, maintained 20-tick polling interval. - @DancingSnow0517
- Fixed: development source file watcher execution, guide live reload from development sources
- #49 NeiGuideNavigation now calls RecipeId.getHandlerName instead of getHandleName, following NotEnoughItems PR 971. dependencies.gradle updates GTNHLib to 0.11.30, NEI to 2.8.114-GTNH and other dev dependencies. - @slprime
- Fixed: incompatibility with the renamed NEI RecipeId method
- #48 Modified
GuideWelcomeScreenevent handling, improved scrollbar with frame-rate-independent tick logic, restored tooltip rendering. - @DreamYao520- Added: scrollbar drag/click support, frame-rate-independent scroll, tooltip rendering
- Removed: stone-brick preview image
- Fixed: mouse event leakage to guide screen, missing tooltips, scroll frame-rate dependency
- #47 In DataDrivenGuideLoader, parseLoadPriorityFromZipEntry and parseLoadPriorityFromFile now catch Exception instead of IOException, so parse errors return priority 0. - @Algent
- Fixed: crash on startup from invalid guide frontmatter
- #34 Enhanced
SceneScriptandLytGuidebookScenewith improved block transformation and tier detection. AddedStructureLibPreviewBootstrapand related preview infrastructure for robust tier/channel resolution. - @Windorain- Added: StructureLibPreviewBootstrap for tier detection, StructureLibPreviewTask/Worker for async preview loading, GregTech integration helpers
- Fixed: tier 2 steam controller rendering (#19)
- Closes #19
- #28 Set default scale values in
LytImageconstructor. - @ABKQPO- Fixed: image rendering without explicit scale
- #12 Added GtCoverIdNormalizer, which rewrites gt.covers[*].id between packed numeric ids and registry-name strings for gregtech:gt.blockmachines and gt.blockframes palette entries. GuideTextNbtCodec.rewriteStructureTileTags calls it on encode and decode. - @ABKQPO
- Added: cover id normalization for guide structures
- Fixed: GT cover numeric ids differing between saves in guide structures
- #8 en_US.lang and zh_CN.lang: config GUI keys such as guideme.gui.config.debug.enabledebugmode are lowercased, and other entries are changed. - @ABKQPO
- Fixed: mismatched lang keys
- #5 ScriptContextImpl inherits the UID on node replacement and six scripts call ctx.replace() to stop duplicate dispatch on remount. NavigationState stores expand state. The MDX parser treats HTML void elements as self-closing. Chart and function graph children use a name attribute instead of label, Series accepts Point children, and LineChartCompiler sets numericX when no categories are given. - @Windorain
- Added: Point children in chart Series, persistent navbar expand state
- Fixed: duplicate script dispatch on page remount, lost inline formatting in table cells, GameScene source extraction inside ContentTabs, StructureLib slider rendering, GT multiblock hatch placement, function graph point hover snap
- #3 Enhanced keybind rendering to support mouse buttons, improved resource pack loading in
DataDrivenGuideLoader, fixed LaTeX alignment in table cells viaLytLatexBlock. - @ABKQPO- Added: mouse button keybind support
- Fixed: mouse keybind display, guide resource loading failures in txloader, LaTeX misalignment in tables
- #2 Added GuideNhServerStructureAccess (permission level 3, scene export config check, singleplayer bypass, same-dimension check). The AE2 base tile and cable batch handlers, the region export and structure request handlers, and GuideCommand reload now use it. The region export request message carries a dimension id, and structure transfers get a size limit of 8 MiB and a 30 second TTL. - @ABKQPO
- Added: server-side permission check for scene export
- Fixed: packets bypassing permission checks to read structure data
Performance
- #74 Reduces work after bulk block placement, removal and replacement, and reuses scene bounds, camera state, layout rectangles, weather selections and sound buffers in GuidebookLevelRenderer, LytGuidebookScene and related classes. Adds a build height provider to GuidebookLevel that replaces the fixed clamp, and GuideScreen.hasBottomBar now depends on the content route instead of currentPage. - @ABKQPO
- Fixed: GT index printing plate missing pixels, Bottom bar layout flash on first open of the guide screen
- Closes #44
- #73 Merged GuidePageLanguageIndex and GuideResourceLanguageIndex into a single GuideLanguageIndex with a shared cache and a new LangEntryReader, so .lang files are read once. Page priority is parsed only when several candidates compete, and ZIP pack scanning avoids temporary path strings. - @danyadev
- #72 LytDocument gets a contentRevision counter that advances on invalidateLayout, and LytNode.invalidateLayout is called from container mutations. GuidePage.refreshMaterializedScenes re-collects GameScene nodes only when the revision changed, using an identity-based set for registration. - @ABKQPO
- #70 Refactored DataDrivenGuideLoader to use new GuideResourcePackScanner for single-pass scanning with direct index building; removed separate manifest walk. ZIP packs use mtime-based caching, directory packs are rescanned each load. - @danyadev
- Added: GuideResourcePackScanner
- Removed: ResourcePackContentManifest (manifest-based caching)
- #68 ResourcePackContentManifest.Pack now holds a normalized path, size, lastModified, count and fingerprint. ZIP entries are no longer enumerated, and ScanCache drops its List<File> of pack roots. Directory pack GuideNH and lang files keep streamed CRC checksums. - @ABKQPO
- #67 ResourcePackContentManifest.Pack now stores an entry count and an order-independent fingerprint instead of per-file Entry objects, with streamed CRC32 for GuideNH files and common image/resource formats in directory packs. GregTechHelpers drops redundant null checks. - @ABKQPO
- #66 GuidebookLevel now keys its chunk and tile entity maps with primitive long keys in fastutil Long2ObjectLinkedOpenHashMap, using ChunkCoordIntPair.chunkXZ2Int instead of allocating a ChunkCoordIntPair per lookup. - @boubou19
- #65 Implemented lazy guide page compilation via LazyParsedGuidePage, added bounded language file indexing, persistent search fingerprints, improved AE2 storage cell state tracking from actual network state instead of presence detection. - @ABKQPO
- Added: lazy page compilation, persistent search fingerprints, bounded language file indexing
- Fixed: guide reload performance, stale async work after reloads, AE2 preview state
- #61 Added block-level viewport culling to guide document rendering. Only the title and body are available, with no diff, so details are inferred. - @Windorain
- Added: viewport block culling
- #43 Created unified
GuideResourceIndexto scan all packs once per reload, replaced per-phase scans with cached lookups. Eliminated redundant YAML parsing andZipFiletraversals in page selection. - @Windorain- Added: GuideResourceIndex for unified pack scanning, page priority caching system
- Removed: per-phase zip traversals, redundant ZipFile instances in language index
- #41 Modified
GuideReloadListenerto skip redundant early reloads, retaining only the final FML-triggered refresh. - @Algent- Added: GuideReloadListener to gate reloads
- Removed: redundant reload calls during boot
- #40 Modified
DefaultGuideResourcePackManagerto prevent duplicate reload triggering on initialization. - @Algent- Fixed: duplicate reload on startup
- #26 Added concurrent client world initialization, refactored camera rotation logic to use central pivot point, optimized reflection rendering. Extracted resource pack loading to new facade classes. - @ABKQPO
- Added: concurrent scene initialization, optimized camera pivot point logic, performance metrics
- Removed: old sequential scene loading, legacy settings from GuideNhRuntimeBridgeSettings
- Fixed: structure preview tier not persisting on reopen (#20), resource pack loading from external directories (#11)
- Closes #11, #20
Removals
- #54 Removed GUIDE_ITEM and REGION_WAND registrations, the shapeless recipe, GuideItem and GuideItemSettings. The region wand now works through RegionWandSelection bindings on held items, and RegionWandRenderer and the hotkeys were adapted. onMissingMappings ignores the guidenh:guide and guidenh:region_wand item mappings. - @ABKQPO
- Removed: guide book item, region wand item, guide book recipe
Internal / Refactor
- #94 Deleted the BetterQuesting, BuildCraft and GregTech accessor and compat mixins and switched to the upstream APIs, for example IQuestHoverListener in BetterQuestingQuestHoverProvider. Bumped GT5-Unofficial, BetterQuesting, nei-custom-diagram and BuildCraft dev dependencies. - @ABKQPO
- Removed: BetterQuesting compat mixins, BuildCraft accessor mixin, GregTech accessor mixin
- #81 Removes the AccessorDiagramGroup and AccessorInteractiveComponentGroup mixins and reads diagramState and slotTooltip directly in NeiCustomDiagramBridge. Bumps nei-custom-diagram to 1.8.35. - @ABKQPO
- Removed: AccessorDiagramGroup mixin, AccessorInteractiveComponentGroup mixin
Documentation
- #21 Doc-only edits to Tags-Reference.md, Tags-Reference-zh-CN.md and the en_us/zh_cn markdown.md resource pages. Inline examples changed from $$formula$$ to $formula$. - @ABKQPO
- Fixed: wrong inline LaTeX syntax in the docs
Chores
- #87 New workflow deploy-web-editor-pages.yml publishes web-editor/public to GitHub Pages on pushes to master that touch that folder, and on manual dispatch. - @ABKQPO
- Added: web editor GitHub Pages deploy workflow
- #85 DistantHorizonsCompat identifies event bus targets via FML's listener owner mod id "distanthorizons" instead of instanceof ForgeClientProxy. The DistantHorizonsStandalone compileOnly dependency is removed, and jspecify @NonNull is swapped for javax.annotation.Nonnull. - @ABKQPO
- Removed: Distant Horizons compile-time dependency
- #16 Updates en_US.lang with minor label fixes and zh_CN.lang with the ParaTranz sync. - @ChromicRedBrick
- Fixed: English config label wording
- #1 Upstream sync touching about 340 files, including Frontmatter, ClientProxy, a new GuidePageHistoryHotkey, runtime bridge classes, gradle.properties and dependencies.gradle. No diff was available, so this is inferred from file paths. - @ABKQPO
- Added: page history hotkey
Contributors
Everyone who authored, reviewed or co-authored a change on this page, with how many of them:
@ABKQPO (65), @Windorain (9), @Nana-Sakura (4), @Algent (3), @UltraProdigy (3), @boubou19 (2), @ChromicRedBrick (2), @danyadev (2), @DreamYao520 (2), @koolkrafter5 (2), @sbancuz (2), @YannickMG (2), @DancingSnow0517 (1), @felixfour (1), @slprime (1)