BetterQuesting
70 merged pull requests.
New Features
- #248 Added
ItemPatternPlaceholderand integrated it withQuestRecipeHandlerin NEI support code to enable quest bookmark import functionality. - @Nana-Sakura- Added: ItemPatternPlaceholder item, NEI recipe overlay support, Quest bookmark import from NEI
- Closes GTNH#26307
- #245 Adds IQuestTooltipProvider, IQuestHoverListener and the QuestTooltipRegistry/QuestHoverRegistry so integrations can handle raw hover targets. Also updates PanelTextBox formatting token handling (RenderUtils.getFormattingTokenLength), adds a scrollbar to GuiTextEditor, and limits popup tooltips to the popup bounds in the canvas classes. - @ABKQPO
- Added: quest link tooltips, text editor vertical scrollbar, copy quest description tooltip, quest tooltip and hover APIs
- Fixed: quest link underline formatting
- #242 Added silent completion flag to
RewardQuestCompletionand updatedEventHandlerto respect this setting when broadcasting quest completions. - @UltraProdigy- Added: Silent quest completion setting
- #241 Introduced
TextEditorAction,TextEditorActionRegistry, andTextEditorSyntaxHighlighterto the API; refactoredPanelTextFieldandGuiTextEditorto use the registry and support syntax highlighting with cached visual lines. - @ABKQPO- Added: TextEditorAction interface, TextEditorActionRegistry, TextEditorActionContext, TextEditorMacro interface, TextEditorSyntaxHighlighter, Syntax highlighting support
- Fixed: Multi-line cursor navigation
- #237 Added quest line visibility toggle to
GuiQuestLines, refactored lock tray positioning, improved scroll bar scaling, and added UI logic for auto-selecting the first quest line on new games. - @Algent- Added: Quest line visibility toggle button, Icon for hidden view mode
- Fixed: Scroll bar size calculation
- #236 Modified
CommonProxyto enable automatic quest book update reloading on data refresh. - @UltraProdigy- Added: automatic QB reload on update
- #232 Extended
FormattingTagto support quest link formatting; modifiedPanelTextBoxto render and handle quest links; added quest link support toGuiTextEditor. - @NotKaizul- Added: quest link formatting tag, quest link rendering
- #231 Added
NoticeConfigholder class for notification settings; createdGuiQuestNotificationSettingsfor player settings and quest-level overrides inGuiQuestNotificationSettingswithin quest editor; extendedQuestInstanceandNativePropswith notification properties; modifiedQuestNotificationrendering and event handling. - @alppp- Added: GuiQuestNotificationSettings, NoticeConfig, notification customization properties
- #230 Introduced
PopItemListfor item selection and cycling; extendedPanelInteractiveItemSlotwith cycling logic; refactored duplicate code from task panels intoPanelTaskItemBase. - @tiffit- Added: PopItemList popup, ore dict item cycling UI
- Removed: duplicate code in task panels
- #227 Adds the IQuestContextMenuEntry interface and QuestContextMenuRegistry, which keeps a synchronized list and returns a copy from getEntries. GuiQuestLines adds the registered entries to the quest popup and closes the popup after each action runs. - @Eldrinn-Elantey
- Added: QuestContextMenuRegistry, IQuestContextMenuEntry
- #226 Extended
TaskRetrievalandPanelTaskRetrievalto support a new mode requiring only one item from a group. - @NotKaizul- Added: single-item retrieval task type
- #224 Added
countAsQuestproperty (default true) toNativePropsandQuestInstance; exposed toggle in quest editor advanced settings. - @Caedis- Added: countAsQuest quest property
- #223 Modified
GuiQuestLinesto calculate and display completion percentages; updated language files with new translation keys. - @Caedis- Added: completion percentage display, quest line progress tracking
- #210 PanelScrollingNBT.onButtonPress checks for LSHIFT/RSHIFT on list tags (id 9) and calls a new insertDefaultItem, which appends or inserts a stone item compound at the index, then refreshes the list. - @UltraProdigy
- Added: shift-click quick add of a default item in the NBT editor
- #209 DirectionalLine takes a new widthScale parameter (DefWidthScale = 1f) read by FactoryDirectionalLine from theme JSON and applied to the line quad width. bq_themes.json gets widthScale 1 on the existing directional line entries. The DirectionalLine constructor now takes four arguments. - @tiffit
- Added: widthScale theme property for directional lines
- #205 Added
DirectionalLine.javaandFactoryDirectionalLine.javafor chevron rendering, extendedCanvasQuestLine.javaandPanelLine.javawith directional rendering, added config options for arrow display and hover animation, line scaling with zoom applied. - @tiffit- Added: directional line rendering, arrow animation, line hover effects
- Closes GTNH#22515
- #201 Modified
QuestInstance#setCompleteto iterate through quest tasks and mark allignored()tasks as complete when quest completion is set. - @Eldrinn-Elantey - #200 Extended
QuestNotification.javato use GTNHLib's TitleAPI via Class.forName reflection, addedQuestNotificationEvent.java, newGuiNotificationSettings.javaUI, updatedNetNotices.javato include title data, added title timing config (10/40/10 fade). - @alppp- Added: title notification display, notification settings GUI, title API integration
- #199 Rewrote
RenderUtils.javacolor handling, addedPopColorInput.javaHSV color picker with preset palette and recent colors, modifiedGuiTextEditor.javato include color/effect buttons, updated format parser to handle both § and & codes, new color continuation across line wraps. - @alppp- Added: HSV color picker popup, color formatting buttons, gradient continuation, format code parser rewrite
- #198 Added
PopContextMenuHoverSub.javafor context menu rendering, extendedGuiQuest.javaandGuiQuestLines.javato display view dependency relationships with new language strings. - @ABKQPO- Added: view dependency context menu, quest dependency visualization
- #191 Modified
NetQuestSync.javato check servernoRewardsflag and conditionally skip reward panel rendering. - @vulcandragi - #189 Added new toggle setting in
BQ_Settings.java, modifiedGuiTextToggles.javaand text rendering pipeline to strip color codes when toggle is disabled, preserves formatting directives on all themes. - @UltraProdigy- Added: color toggle setting, monochrome rendering mode
- #186 QuestCommandComplete accepts "all" as the quest argument, calls NetQuestEdit.setQuestStates for every key in QuestDatabase, and adds the betterquesting.cmd.complete_all lang key. Autocomplete and usage text include all. - @UltraProdigy
- Added: /bq_admin complete all command
- #181 Added copy button control in GuiQuest with clipboard text handling. - @Faotik
- Added: copy quest description button in questbook
- Closes GTNH#23084
- #176 Integrated VmAdapter for Vending Machine 0.4.0 into QuestCache and quest UI; added quest command support for vending trades. - @cubefury
- Added: VmAdapter integration with Vending Machine, vending machine trade support in quest cache, vending machine quest commands
New Content
- #221 Added and updated Russian locale entries across multiple language files. - @Eldrinn-Elantey
- Added: Russian translation entries
Changes
- #262 GuiQuestSearch.initPanel calls Keyboard.enableRepeatEvents(true) to enable key repeat. - @MLGfruitshoot
- Added: Held backspace repeat in questbook search
- #259 PanelTextField.onMouseClick only runs filter.parseValue on unfocus when the text is non-null and non-empty. - @koolkrafter5
- Fixed: empty number fields auto-filling with 0 on unfocus
- #222 bq_themes.json: changed the betterquesting:gui_divider static colour in two existing themes and added a gui_divider colour entry to the other themes. - @Ranzuu
- Added: per-theme gui divider colours
- Fixed: black or white gui divider clashing with quest book themes
- #220 Removed the QBConfig.fullySyncQuests checks from NetTaskCheckbox, TaskFluid and TaskRetrieval so they always use pInfo.ALL_UUIDS and markDirtyParty. Renamed the option to syncQuestRewards, which QuestInstance.claimReward still reads, and changed its description. - @tiffit
- Removed: fullySyncQuests config option
- Fixed: checkbox and consume task progress not syncing between party members
- #203 Modified
GuiTextEditor.javato wrap native style button text with corresponding formatting codes (e.g., wrapping with&6...&rfor gold). - @sudojunior - #177 Updated theme name in bq_themes.json. - @Ranzuu
Bug Fixes
- #263 Added GuiQuest.updateScrollBar, which enables the scrollbar only when the canvas scroll bounds height is above 0. It is now called for the desc, task and reward panels. - @mattiasploesch-cpu
- Fixed: Questbook scrollbars showing with nothing to scroll
- Closes GTNH#26769
- #261 HQMUtilities.HQMStackT1 now parses item NBT with JsonToNBT.func_150315_a instead of NBTJson.toNbt on a Gson-parsed object, and the backslash-stripping hack is removed. NBT reading is deduplicated and variables renamed. - @koolkrafter5
- Fixed: HQM importer misparsing item NBT
- #260 HQMTaskLocation.convertTask reads x, y and z instead of posX, posY and posZ. hideInfo is now read from the visible key and compared to None, where before it read an empty key. - @koolkrafter5
- Fixed: HQM location task importer using wrong coordinate keys, HQM location task importer ignoring visibility
- #258 Corrected synchronization logic in
NetQuestSyncto properly handle quest completion packets across LAN sessions. - @danyadev- Fixed: LAN quest synchronization, Duplicate completion notifications
- Closes GTNH#19269
- #257 Corrected framebuffer caching logic in
CanvasQuestLine, texture rendering inSimpleTextureandSlicedTexture, and scrolling viewport calculations inCanvasScrolling. - @boubou19- Fixed: Quest line rendering artifacts, Texture rendering glitches, Viewport rendering issues
- Closes GTNH#26554
- #254 Changes the value of betterquesting.btn.view_dependants in en_US.lang. The key is unchanged. - @fbfnysnshnsgnwg
- Fixed: British spelling in the View Dependents button
- #250 Added TextFormattingUtils.stripFormatting, moved from GuiTextEditor, which now delegates to it. QuestCommandDefaults.removeChatFormatting now calls it instead of a section sign regex. - @UltraProdigy
- Added: TextFormattingUtils.stripFormatting utility
- Fixed: colour formatting codes ending up in quest file names
- #234 PanelRewardChoice, PanelRewardItem and PanelTaskItemBase now wrap the stack display name in EnumChatFormatting.getTextWithoutFormattingCodes. - @UltraProdigy
- Fixed: hard to read item names with vanilla rarity colours in quest book panels
- Closes GTNH#25108
- #229 GuiQuestLines and GuiBookmarks copyQuestId used java.awt Toolkit clipboard access. Replaced it with GuiScreen.setClipboardString, which lwjgl3ify patches via mixin, and dropped the IllegalStateException fallback message. - @danyadev
- Fixed: crash to main menu after copying a quest ID on macOS
- Closes GTNH#24492
- #217 DirectionalLine swaps org.joml.Vector2f for org.lwjgl.util.vector.Vector2f and computes the difference with Vector2f.sub(end, start, null). - @tiffit
- Fixed: joml Vector2f missing at runtime in the dev environment
- #214 EventHandler only handled InputEvent.KeyInputEvent. Added an InputEvent.MouseInputEvent handler and moved the open-quests check into a shared handleOnOpenQuests method. - @fowdre
- Fixed: Open Quests keybind ignored mouse buttons until a keyboard key was pressed
- #206 Added cleanup logic to
SceneController.javaandGuiQuestLines.javato properly dereference resources on screen close, preventing memory accumulation. - @Alexdoru- Fixed: 4 client memory leaks
- #204 CanvasItemDatabase.addResult saves the scroll Y before adding a slot panel and restores it with updatePanelScroll if it moved. - @sudojunior
- Fixed: scroll drift in the item database list while results load
- #202 GuiQuest.initPanel now creates rectReward outside the rewards-enabled branch, so refreshRewardPanel no longer loops with initPanel on a null transform. - @cubefury
- Fixed: crash opening quests with vending machine trades and no rewards in multiplayer
- Closes GTNH#24324
- #197 FormattingTag.getColourFormattingString returns an empty string for URL when forceMonochromeText is set. GuiTextToggles.BQ_TAG_REMOVER no longer strips the url tags. - @UltraProdigy
- Fixed: URLs not clickable or underlined with monochrome text enabled
- #196 Removed static server thread field initialization from
BetterQuesting.java, moved server lifecycle management toCommonProxy.javaand newServerTaskScheduler.javaclass to use instance-based references that update per-world load. - @Alexdoru- Added: ServerTaskScheduler class
- Removed: static server reference in core
- Fixed: server thread leak on world reload
- #192 Corrected text tag ordering in
GuiTextToggles.javato properly render Note and Warn formatting. - @UltraProdigy- Fixed: Note and Warn text formatting
- #190 EventHandler.postPresetNotice returns early when the NativeProps.ICON property is null instead of calling getBaseStack on it. - @Alexdoru
- Fixed: NPE in quest notice for quests without an icon
- Closes GTNH#23646
- #188 TaskRetrieval.getTextsForSearch skips null BigItemStack entries in requiredItems, which threw an NPE in CanvasQuestSearch.queryMatches. - @Alexdoru
- Fixed: NPE when searching quests with a null retrieval item
- #187 NetNotices.sendNotice takes a separate questId string in the payload, and EventHandler.postPresetNotice passes the quest name as subText. NetNotices.onClient uses the sent name as fallback and only uses the id string when no name is present. - @Eldrinn-Elantey
- Fixed: quest UUID shown in notice popups before quest database sync
- Closes GTNH#23296
- #184 Added file filtering in QuestCommandDefaults to skip non-quest files when loading quest data. - @danyadev
- Added: file type validation in quest loading
- Fixed: quest loading failure with unrelated files in config folder
- #183 PopChoice.initPanel sets the message PanelTextBox colour to PresetColor.TEXT_MAIN. - @UltraProdigy
- Fixed: reward claim popup text always white regardless of theme
- #180 PanelEntityPreview.drawPanel now resets BossStatus (bossName, healthScale, statusBarTime) after rendering the preview entity. In-world bosses overwrite this state when they render. - @ModularityEnjoyer
- Fixed: boss bar showing when viewing a Mob Hunt task entity preview
- Closes GTNH#22849
- #179 Added proper cleanup of world references in PlayerContainerListener and QuestBook event handlers on world unload. - @Alexdoru
- Added: world reference cleanup on unload
- Fixed: world reference memory leak
- #178 Added localization support to QuestTranslation and EventHandler server-side quest notifications. - @iouter
- Added: server-side quest name localization method
- Fixed: unlocalized quest names in server notifications
- #175 RenderUtils string splitting now uses java.text.BreakIterator to find line break positions instead of splitting on spaces. It also adds a shared scissorStack field and reformats some comments. - @ghostflyby
- Fixed: wrong line break position in non-space-separated languages
- #173 Adds IPropertyContainer.getOrDefault, which falls back when the property is null. PanelButtonQuest uses it with a BigItemStack of the placeholder item for NativeProps.ICON, and OreDictTexture parameters are marked @Nonnull. ItemPlaceholder.addInformation gets generic tooltip types and its onUpdate a pattern-matching instanceof. The PR also adds a compileOnly dependency on JetBrains annotations. - @ah-OOG-ah
- Added: getOrDefault on property containers
- Fixed: NullPointerException in quest icon rendering when a quest has no icon
- #172 RenderUtils.sizeStringToWidth and getStringWidth delegate to GTNHLib FontRendering when BetterQuesting.isGTNHLibLoaded. Adds a compileOnly GTNHLib 0.7.0 dependency and an after:gtnhlib@[0.7.0,) soft dependency. - @DeathFuel
- Added: GTNHLib string width support
- Fixed: quest text width with custom fonts
Performance
- #255 Implemented geometry batching through Tessellator with 4,095 quad cap, cached quest frames in display lists, added framebuffer-based icon/line caching, viewport culling, and configurable cache modes (off/low-fps/freeze) borrowed from NEI architecture. - @boubou19
- Added: QuestFrameCache for display list caching, Viewport culling in CanvasCullingManager, Configurable cache refresh modes, Tessellator batching for dependencies, Framebuffer caching for quest icons and lines
- #243 Adds a cached SliceMode.VALUES array and uses it in FactorySlicedTexture and SlicedTexture instead of calling values(). - @boubou19
- Added: cached SliceMode.VALUES
- #211 Modified
CanvasScrolling,CanvasSearch, and related database panels to batch panel additions rather than adding individually, conditionally sort by depth only when needed, and reduced max panel-add time from 100ms to 10ms. - @tiffit- Fixed: UI lag when loading large item lists
Internal / Refactor
- #239 PanelTaskItemBase.getRequiredItemText is now protected and split into protected addItemName, addOreDict, addProgress and addCompleteOrIncomplete methods so subclasses can override individual parts. - @koolkrafter5
- Added: overridable text methods in PanelTaskItemBase
- #235 Adds ColorUtils with ColorResource entries neiQuestNameColor and neiQuestNameHoveredColor. QuestRecipeHandler uses them, QuestTranslation.getColor is removed, and the two lang keys are dropped. Bumps NEI, GTNHLib and TX-Loader versions. - @Ranzuu
- Added: ColorUtils with NEI quest name color resources
- Removed: QuestTranslation.getColor, NEI quest name color lang keys
- #228 Adds ColorUtils with ColorResource entries for neiQuestNameColor and neiQuestNameHoveredColor. Removes QuestTranslation.getColor and the two lang keys. Shadows GTNHLib 0.11.5 and turns on usesShadowedDependencies. - @Ranzuu
- Added: ColorUtils color resources
- Removed: QuestTranslation.getColor, NEI quest name color lang keys
- #215 Removes GuiScreenTest, PanelVBarFill and the METER_V_0/METER_V_1 preset textures. BQLivingUpdateEvent drops its entity field and entityLiving becomes EntityPlayerMP. NetQuestAction.requestClaimForced is renamed to requestClaimForceChoice. NetChapterEdit gets a requestEdit helper used by GuiQuestLineAddRemove. Addons that use the removed or renamed members need updating. - @danyadev
- Removed: GuiScreenTest, PanelVBarFill, METER_V_0 and METER_V_1 preset textures, BQLivingUpdateEvent entity field
- Migration: GuiScreenTest, PanelVBarFill, BQ_CommandDebug, PresetTexture.METER_V_0 and METER_V_1 and the BQLivingUpdateEvent.entity field are removed, and BQLivingUpdateEvent.entityLiving is now an EntityPlayerMP, so addons that read it must be recompiled. NetQuestAction.requestClaimForced is now requestClaimForceChoice, forceClaimQuest is now claimQuestForceChoice, and BQ_CopyProgress.getPlayerAdvanced takes a UUID.
- #212 NetQuestEdit gets helper methods (requestEdit, requestDelete, requestCreate, completeQuests and others) replacing hand-built NBTTagCompound payloads with hardcoded keys in the editor GUIs, toolbox tools and QuestCommandComplete. setQuestStates is renamed to completeQuests. ToolboxToolCopy now copies the quest object and changes it instead of changing NBT. createQuests no longer modifies an existing quest. Old API methods are kept for compatibility. - @danyadev
- Added: NetQuestEdit request helper methods
Chores
- #233 Reverts #228: removes ColorUtils and the shadowed GTNHLib dependency, sets usesShadowedDependencies to false, and restores QuestTranslation.getColor and the lang keys. - @Ranzuu
- Removed: ColorUtils, shadowed GTNHLib dependency
- #168 CanvasQuestSearch.queryMatches is wrapped in a try/catch that logs the failing entry. .gitignore gains .java-version. - @glektarssza
- Added: error logging in quest search
Contributors
Everyone who authored, reviewed or co-authored a change on this page, with how many of them:
@UltraProdigy (41), @Dream-Master (16), @Ranzuu (9), @tiffit (8), @cubefury (7), @danyadev (6), @sisyphussy (6), @Alexdoru (5), @boubou19 (5), @ABKQPO (4), @alppp (4), @Eldrinn-Elantey (4), @Ethryan (4), @koolkrafter5 (4), @Algent (3), @Caedis (3), @Nana-Sakura (3), @Nikolay-Sitnikov (3), @NotKaizul (2), @PLASMAchicken (2), @sudojunior (2), @ah-OOG-ah (1), @chrombread (1), @DeathFuel (1), @eigenraven (1), @Faotik (1), @fbfnysnshnsgnwg (1), @fowdre (1), @ghostflyby (1), @glektarssza (1), @iouter (1), @Justxs (1), @kurrycat2004 (1), @mattiasploesch-cpu (1), @MCTBL (1), @mitchej123 (1), @MLGfruitshoot (1), @ModularityEnjoyer (1), @Ruling-0 (1), @slprime (1), @vermz99 (1), @vulcandragi (1), @wlhlm (1)