promotional bannermobile promotional banner

JetTools

Multi purpose addon with features such as: personal crosshair for dodging, AH expansion filter and auto accepting queues.

File Details

v1.4.6

  • R
  • Mar 29, 2026
  • 68.11 KB
  • 9
  • 12.0.0
  • Retail

File Name

JetTools-v1.4.6.zip

Supported Versions

  • 12.0.0

JetTools

v1.4.6 (2026-03-29)

Full Changelog Previous Releases

  • Merge feature/af-removal-and-new-modules into main
  • chore: update beads interactions log
  • fix: always show previews in options panel regardless of enabled state
    The previous fix (jettools-iyn) added an settings.enabled guard to the
    OnShow preview logic, which broke previews for all users since CombatTimer
    and CombatRes both default to enabled=false. Previews should always display
    when the options panel opens — that's their entire purpose.
  • fix: button artwork bleed, preview guard, and anchor frame resolution
    • Options.lua: add JT_StripButtonTextures() helper that overrides all four
      texture slots (normal, pushed, highlight, disabled) on UIPanelButtonTemplate
      buttons; apply to JT_CreateButton (all styles incl. unstyled), the dropdown
      button, and the sidebar nav buttons — eliminates the red/orange Blizzard
      artwork bleed in all interactive states (jettools-tf6)
    • Options.lua OnShow: only call ShowPreview() when settings.enabled is true,
      so disabled modules don't pop up their overlay when the options panel opens
      (jettools-iyn)
    • CombatTimer + CombatRes ApplyPosition(): replace bare _G[anchorName] lookup
      with ResolveAnchorFrame() which (a) supports case-insensitive friendly
      aliases (chat, minimap, playerframe, targetframe, etc.), (b) validates the
      resolved object has GetObjectType before using it, (c) prints a helpful
      warning and falls back to UIParent on invalid input, and (d) temporarily
      clears SetClampedToScreen before SetPoint so large X/Y offsets are applied
      correctly then re-enables clamping (jettools-4ro)
  • fix: add isPreviewMode flag to keep previews visible while options panel is open
    CombatTimer and CombatRes previews were unreliable when modules were
    disabled because Disable() hid the frame and OnUpdate had no mechanism
    to keep it shown. Introduce isPreviewMode to:
    • Block Disable() from hiding the frame during a preview session
    • Prevent UpdateDisplay() from hiding the CombatRes frame in preview mode
    • Ensure OnUpdate skips its normal logic (which would overwrite preview text)
      while preview is active, but still keeps the frame shown
    • Use isPreviewMode directly in OnSettingChanged instead of querying the
      global frame state, making the logic self-contained
  • chore: update beads interactions log
  • fix: hoist groupState to module-level local in Options.lua
    BuildOptionControl._groupState was attaching a field to a function value,
    which is illegal in Lua 5.1 and caused a crash:
    'attempt to index upvalue BuildOptionControl (a function value)'
    Fix: declare 'local groupState = ' at module scope before
    BuildOptionControl is defined, and update all references.
  • chore: sync beads interactions log
  • fix: replace dropdown arrow FontString with Texture to fix missing glyph
    U+25BE (▾) is not present in WoW's bundled fonts (FRIZQT__, ARIALN),
    causing the arrow indicator to render as an empty box. Switch to a
    native WoW texture (Interface\Buttons\Arrow-Down-Up) cropped to the
    down-arrow half via SetTexCoord — no font dependency, always visible.
    Closes jettools-8xk
  • Options: merge character tabs; fix spacing; expand position range + anchor points for combat overlays
    • Options.lua: merge CharacterSheet, GearUpgradeRanks, CharacterStatFormatting into a single 'Character' sidebar tab
    • Options.lua: fix vertical overlap — slider bottom gap +10px, input +8px; dropdown shifted down 14px to absorb label overhang
    • CombatTimer/CombatRes: posX range expanded to ±2000, posY to ±1200
    • CombatTimer/CombatRes: add anchorPoint + relativePoint dropdowns (9 WoW anchor points each)
    • CombatTimer/CombatRes: ApplyPosition() now uses anchorPoint/relativePoint settings
    • CombatTimer/CombatRes: OnSettingChanged triggers on anchorPoint/relativePoint changes
    • Core.lua: add anchorPoint/relativePoint defaults (CENTER/CENTER) for both modules
  • feat: auto-preview, anchor frame input, and global font dropdown
    • CombatTimer/CombatRes: ShowPreview()/HidePreview() for live preview while
      options panel is open; OnSettingChanged re-calls ShowPreview() if panel open
    • CombatTimer/CombatRes: anchorFrame input setting; ApplyPosition() resolves
      _G[anchorFrame] with UIParent fallback
    • Core: JT:GetAvailableFonts() helper (LSM or FALLBACK_FONTS); JT:ApplyGlobalFont()
      broadcasts fontFace to all font-aware modules and persists to JetToolsDB.globalFont
    • Options: global font dropdown in title bar; refreshes on OnShow from JetToolsDB
  • fix: dropdown double-wraps pre-built {text,value} options tables
    BuildOptionControl was wrapping all options[1]-truthy arrays, but
    GetAvailableFonts() already returns {text,value} pairs. Detect that
    case (first entry is a table with a .text field) and use the list
    directly instead of re-wrapping, which produced item.text =
    and a SetText() error.
  • fix: options UI widget bugs
    • Slider: replace OptionsSliderTemplate with plain Slider to eliminate
      Low/High/Text child frames that overlapped our value readout; add
      track background, styled thumb, flanking min/max labels
    • Dropdown arrow: fix garbled ▾ glyph (\xbe is not valid Lua 5.1;
      use \226\150\190 decimal escapes for U+25BE)
    • Dropdown singleton bug: rows are now children of scrollContent inside
      the popup, hidden on OnHide, and always assigned fresh OnClick
      closures so the second (and later) dropdowns on a page work correctly
    • Dropdown long lists: added scroll frame + UIPanelScrollBarTemplate
      inside the popup, capped at maxVisible rows height; bar shown only
      when items exceed maxVisible
    • Main scrollbar: hide bar entirely when scrollRange == 0 so short
      module pages don't show a spuriously active scrollbar
  • fix(Options): resolve four nil-safety issues in widget helpers
    • JT_CreateCheckButton: remove bogus CheckButton.SetChecked shim that
      referenced a non-existent global; CheckButton frames already have
      SetChecked built-in
    • JT_CreateButton: call SetNormalTexture() before GetNormalTexture()
      so tinting doesn't crash when UIPanelButtonTemplate has no NormalTexture
    • JT_CreateDropdown: same SetNormalTexture fix for the dropdown button
    • ClearFrame: remove SetParent(nil) which reparents to WorldFrame in
      modern WoW; Hide() alone is correct and sufficient
  • fix: use explicit background texture for sidebar button tinting
    GetNormalTexture() returns nil on UIPanelButtonTemplate buttons in modern
    WoW. Store an explicit WHITE8X8 texture on btn._bg and tint that instead.
  • Add CombatTimer and CombatRes modules; consolidate sidebar tabs
    • Remove AbstractFramework dependency (toc, pkgmeta, Core.lua)
    • Add Modules/CombatTimer.lua: elapsed combat time overlay (MM:SS / MM:SS.d,
      print-on-end, font, position settings)
    • Add Modules/CombatRes.lua: Rebirth charge+cooldown tracker (group-only,
      charge coloring, optional label, font, position settings)
    • Update JetTools.toc with new module load order
    • Options.lua rewritten with pure WoW API (no AbstractFramework)
    • Consolidate sidebar: CombatStatus/CombatTimer/CombatRes → 'Combat' tab;
      PetReminders/StealthReminder → 'Reminders' tab
  • Add BuffBarStyling module with collapsible options groups
    Implements the BuffBarStyling module per plans 011/012/013: a 0.1s ticker
    styles BuffBarCooldownViewer children with configurable texture, bar size,
    font, icon visibility, and 1px black border, then repositions the viewer to
    a named anchor frame with configurable anchor points and X/Y offsets.
    Options.lua gains a new 'group' schema type for collapsible sections,
    with state stored per-group and repopulation triggered via
    JT._requestOptionsRepopulate.