91 Commits

Author SHA1 Message Date
Dusk-92 1b85c7687c release v2.0 2026-08-28 10:41:33 +02:00
Dusk-92 accab7f77b release: prepare v2.0 2026-08-28 10:40:53 +02:00
Dusk-92 8f095a52d9 Enable AutoLogin encryption by default 2026-08-27 19:04:46 +02:00
Dusk-92 358d6d3d87 Test AutoLogin encryption key safety 2026-08-27 18:58:40 +02:00
Dusk-92 61fa616d7a Secure AutoLogin encryption key setup 2026-08-27 18:58:12 +02:00
Dusk-92 17606f2f1b feat: add Play Modernized WoW desktop shortcut 2026-08-27 17:34:11 +02:00
Dusk-92 b7d3fc97ef ui: clarify AutoLogin password encryption warning 2026-08-27 17:31:03 +02:00
Dusk-92 14786b5c8c fix: enforce native DirectX 9 without deleting wrappers 2026-08-27 17:23:19 +02:00
Dusk-92 d041363779 fix: harden DXVK ownership and local builds 2026-08-27 17:17:13 +02:00
Dusk-92 f6629a72cf ci: pin Windows Python and build dependencies 2026-08-27 16:41:59 +02:00
Dusk-92 1adaf7abfe build: pin PyInstaller toolchain versions 2026-08-27 16:41:44 +02:00
Dusk-92 d9bac1d0db ci: run installer safety tests before build 2026-08-27 16:37:17 +02:00
Dusk-92 fda823d21b tests: cover installer safety invariants 2026-08-27 16:37:03 +02:00
Dusk-92 f92341f98f ui: clarify AutoLogin credential storage 2026-08-27 16:34:06 +02:00
Dusk-92 f856170b01 payload: record WorldMarkers v0.7.1 2026-08-27 16:31:18 +02:00
Dusk-92 1a10d63989 ci: remove one-time WorldMarkers updater 2026-08-27 16:30:59 +02:00
github-actions[bot] 561e83876d weirdutils: update WorldMarkers to v0.7.1 2026-08-27 14:29:58 +00:00
Dusk-92 78fbcc04fd ci: update WorldMarkers from verified v0.7.1 asset 2026-08-27 16:29:48 +02:00
Dusk-92 329656a96a ci: remove one-time WorldMarkers audit 2026-08-27 16:29:30 +02:00
Dusk-92 2aaa40f0f1 ci: inspect WorldMarkers v0.7.1 2026-08-27 16:28:28 +02:00
Dusk-92 fc01b30fee payload: document bundled binary provenance 2026-08-27 16:22:42 +02:00
Dusk-92 ff00eb2024 ci: remove one-time provenance audit 2026-08-27 16:22:14 +02:00
Dusk-92 abecbbe46e ci: audit bundled binary provenance 2026-08-27 16:19:42 +02:00
Dusk-92 be814efbd1 wdb: track blocker ownership before removal 2026-08-27 16:16:30 +02:00
Dusk-92 6fc07001dd patcher: preserve valid modernized exe when offline 2026-08-27 16:12:19 +02:00
Dusk-92 305b7e8d3c patcher: make WoW_Modernized replacement transactional 2026-08-27 16:11:42 +02:00
Dusk-92 9200c5ea54 fallbacks: validate bundled and installed x86 DLLs 2026-08-27 16:08:37 +02:00
Dusk-92 6de77922a5 downloads: validate x86 PE DLLs before install 2026-08-27 16:07:58 +02:00
Dusk-92 8e566e9536 audio: make managed sound-pack installs transactional 2026-08-27 16:04:29 +02:00
Dusk-92 c388431f01 visuals: skip unchanged managed MPQ downloads 2026-08-27 16:00:52 +02:00
Dusk-92 d12a5bbe03 visuals: track MPQ source revisions 2026-08-27 16:00:25 +02:00
Dusk-92 ae9a56903c dxvk: use VanillaFixes 1.5.3 default config 2026-08-27 15:58:25 +02:00
Dusk-92 dae43b5172 dxvk: document bundled binary provenance 2026-08-27 15:55:37 +02:00
Dusk-92 222ad6059c dxvk: remove unused duplicate configuration 2026-08-27 15:55:26 +02:00
Dusk-92 30b1a4842b dxvk: align config with bundled 2.6.1 x86 2026-08-27 15:55:16 +02:00
Dusk-92 f7313a4f6c ci: remove one-time DXVK identifier 2026-08-27 15:54:54 +02:00
Dusk-92 d7fc1ec651 ci: identify bundled DXVK version 2026-08-27 15:52:57 +02:00
Dusk-92 5cdb9a34ba windows: verify DEP mitigation and launcher creation 2026-08-27 15:44:19 +02:00
Dusk-92 8b5e0710f8 safety: keep install UI state stable during downloads 2026-08-27 15:41:33 +02:00
Dusk-92 d5f0e4cfb4 safety: lock Apply and validate Vanilla client 2026-08-27 15:41:14 +02:00
Dusk-92 b109f2b79e settings: isolate profiles and recover damaged state safely 2026-08-27 15:37:52 +02:00
Dusk-92 c3d0fa3275 plugins: preserve manual dlls.txt entries in dynamic installer 2026-08-27 15:34:54 +02:00
Dusk-92 8c46301939 plugins: preserve manual dlls.txt entries 2026-08-27 15:34:40 +02:00
Dusk-92 3110ee3484 fallbacks: keep DLL addon bundles consistent 2026-08-27 15:30:39 +02:00
Dusk-92 c726d89268 installer: make DLL addon updates transactional 2026-08-27 15:30:16 +02:00
Dusk-92 6298ad9aa2 ci: remove one-time bundled fallback refresh 2026-08-27 15:08:48 +02:00
github-actions[bot] 542d6a07fa payload: refresh bundled known-good fallbacks [skip ci] 2026-08-27 13:08:13 +00:00
Dusk-92 0ff3b156ea ci: add one-time bundled fallback refresh 2026-08-27 15:07:56 +02:00
Dusk-92 52086ae178 fallbacks: preserve installed versions and use bundled backups 2026-08-27 15:06:50 +02:00
Dusk-92 c30f00a9fe mods: add bundled managed fallback helpers 2026-08-27 15:05:53 +02:00
Dusk-92 92380df3a4 settings: persist per-install choices and protect offline mods 2026-08-27 15:05:37 +02:00
Dusk-92 a1f7338034 ci: remove one-time WeirdPerformance importer 2026-08-27 11:57:56 +02:00
github-actions[bot] 658a9d9031 payload: update WeirdPerformance to 0.7.3 2026-08-27 09:57:34 +00:00
Dusk-92 10b859fe7d ci: one-time WeirdPerformance 0.7.3 import 2026-08-27 11:57:25 +02:00
Dusk-92 c0610a0353 cleanup: remove legacy Tweaked files and tidy support icon 2026-08-27 11:46:29 +02:00
Dusk-92 76d2cceb88 credits: document visual audio and WDB sources 2026-08-27 11:26:51 +02:00
Dusk-92 936a715efb ui: add Visual Audio tab and WDB automation 2026-08-27 11:26:24 +02:00
Dusk-92 433e38b36e mods: add managed visual and audio installers 2026-08-27 11:25:15 +02:00
Dusk-92 042c5a967a ui: sync SuperWoW checkbox with tweak controls 2026-08-27 10:56:04 +02:00
Dusk-92 2f95c8a504 ui: make SuperWoW-managed tweaks explicit 2026-08-27 10:55:45 +02:00
Dusk-92 ec10bbd213 fix: rebuild plugin UI section cleanly 2026-08-27 10:42:30 +02:00
Dusk-92 f0af7e50c9 credits: add Interact VMMFix and optional sources 2026-08-27 10:41:27 +02:00
Dusk-92 f628ecb8d1 ui: reorganize plugins and add Interact VMMFix 2026-08-27 10:40:47 +02:00
Dusk-92 1a192c7e6a tweaks: adopt tubtubs patcher options and new defaults 2026-08-27 10:39:54 +02:00
Dusk-92 62f722fcc9 updater: add Interact VMMFix and latest vanilla-tweaks 2026-08-27 10:38:59 +02:00
Dusk-92 5faf3646d4 credits: correct PerfBoost attribution 2026-08-27 09:37:50 +02:00
Dusk-92 9815c54d5d ui: correct plugin attributions 2026-08-27 09:36:59 +02:00
Dusk-92 9b26694316 fix: handle readonly config and permission errors 2026-08-27 09:36:47 +02:00
Dusk-92 7ab2361a11 ui: polish plugin names authors and defaults 2026-08-27 09:28:32 +02:00
Dusk-92 aae75164c1 defaults: prefer DirectX 9 and unlimited addon memory 2026-08-27 09:27:54 +02:00
Dusk-92 2558bd0537 build: keep local icon packaging in sync 2026-08-27 09:18:54 +02:00
Dusk-92 240b45ba13 build: bundle window icon resource 2026-08-27 09:18:50 +02:00
Dusk-92 9dfcf734a9 updater: wire live core refreshes and clearer tooltips 2026-08-27 09:18:34 +02:00
Dusk-92 417364f449 ui: simplify rendering and add requested client tweaks 2026-08-27 09:18:18 +02:00
Dusk-92 59328f2942 updater: refresh Nampower VanillaHelpers and no1600 2026-08-27 09:17:38 +02:00
Dusk-92 79ee9e7064 ui: make updater progress window readable 2026-08-27 08:54:20 +02:00
Dusk-92 8ca8b6d69f ui: show live package download progress 2026-08-27 08:49:46 +02:00
Dusk-92 343f3b3ce3 ui: report download progress and harden addon replacement 2026-08-27 08:49:05 +02:00
Dusk-92 36ad039025 credits: add live plugins and missing bundled sources 2026-08-27 08:40:07 +02:00
Dusk-92 d39a95ead5 core: allow ClassicAPI and AuctionQueryThrottle together 2026-08-27 08:39:24 +02:00
Dusk-92 0519a7a9d0 ui: move live API plugins into recommended core 2026-08-27 08:37:41 +02:00
Dusk-92 29a3c88c46 ci: supersede stale queued test builds 2026-08-27 08:31:32 +02:00
Dusk-92 b5ed777869 harden: enforce tweak exclusivity and restore addon fallbacks 2026-08-26 17:13:48 +02:00
Dusk-92 4dd6198517 harden: tolerate upstream asset naming changes 2026-08-26 17:12:25 +02:00
Dusk-92 8f4f1fb69a ci: allow isolated PR build tests 2026-08-26 17:07:08 +02:00
Dusk-92 9abe6a7f8b ci: add safe branch test build artifact 2026-08-26 17:01:20 +02:00
Dusk-92 fdda765a7b ci: build live-updating tool entry point 2026-08-26 16:58:05 +02:00
Dusk-92 e8da41b128 build: keep local EXE name aligned with releases 2026-08-26 16:57:58 +02:00
Dusk-92 50ebd6d4ee build: use dynamic updater entry point 2026-08-26 16:57:19 +02:00
Dusk-92 df4e294a2f feat: add live-updating Tweaks UI and core packages 2026-08-26 16:57:14 +02:00
Dusk-92 4427a1bab1 feat: add live GitHub package updater 2026-08-26 16:56:49 +02:00
121 changed files with 24416 additions and 19028 deletions
+67 -7
View File
@@ -2,13 +2,26 @@ name: Build Windows EXE
on:
push:
branches:
- 'main'
- 'feature/client-tweaks'
tags:
- 'v*'
pull_request:
branches:
- 'main'
workflow_dispatch:
permissions:
contents: write
concurrency:
group: modernization-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
runs-on: windows-latest
runs-on: windows-2025
steps:
- name: Checkout repository
@@ -17,10 +30,22 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
python-version: '3.11.9'
- name: Install PyInstaller
run: pip install pyinstaller
- name: Install pinned build toolchain
run: python -m pip install --disable-pip-version-check -r requirements-build.txt
- name: Verify build toolchain
run: |
python --version
pyinstaller --version
python -m pip show pyinstaller pyinstaller-hooks-contrib
- name: Syntax check
run: python -m py_compile setup_tool.py setup_tool_dynamic.py remote_packages.py tests/test_safety.py
- name: Unit safety tests
run: python -m unittest discover -s tests -v
- name: Build EXE
run: >
@@ -28,14 +53,49 @@ jobs:
--noconsole
--onefile
--icon=PurpleWowLogo.ico
--add-data "PurpleWowLogo.ico;."
--add-data "Payload;Payload"
--add-data "vanilla-tweaks.exe;."
--name "WoW_Modernization_Tool"
setup_tool.py
setup_tool_dynamic.py
- name: Verify EXE exists
shell: pwsh
run: |
if (-not (Test-Path "dist/WoW_Modernization_Tool.exe")) { throw "Build output missing" }
Get-Item "dist/WoW_Modernization_Tool.exe" | Format-List Name,Length,LastWriteTime
- name: Upload test artifact
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
uses: actions/upload-artifact@v4
with:
name: WoW_Modernization_Tool-test
path: dist/WoW_Modernization_Tool.exe
if-no-files-found: error
# One-time production promotion for v2.0. The exact commit message keeps
# normal main pushes from publishing or modifying the v2.0 release.
- name: Create GitHub Release v2.0
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && github.event.head_commit.message == 'release v2.0' }}
uses: softprops/action-gh-release@v3
with:
tag_name: v2.0
target_commitish: ${{ github.sha }}
files: dist/WoW_Modernization_Tool.exe
fail_on_unmatched_files: true
name: "WoW Modernization Tool v2.0"
body_path: RELEASE_NOTES.md
generate_release_notes: true
previous_tag: v1.1
make_latest: true
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
if: ${{ startsWith(github.ref, 'refs/tags/') }}
uses: softprops/action-gh-release@v3
with:
files: dist/WoW_Modernization_Tool.exe
fail_on_unmatched_files: true
name: "WoW Modernization Tool ${{ github.ref_name }}"
body: "Release automatique générée par GitHub Actions."
body_path: RELEASE_NOTES.md
generate_release_notes: true
make_latest: true
+39 -1
View File
@@ -1 +1,39 @@
pyinstaller --noconsole --onefile --add-data "Payload;Payload" --add-data "vanilla-tweaks.exe;." setup_tool.py
@echo off
setlocal
cd /d "%~dp0"
where py >nul 2>nul
if errorlevel 1 (
echo ERROR: Python launcher ^(py.exe^) was not found.
exit /b 1
)
py -3.11 -c "import sys; a=sys.version_info[:3]; sys.exit(0 if a==(3,11,9) else f'ERROR: Python 3.11.9 is required; found {a[0]}.{a[1]}.{a[2]}')"
if errorlevel 1 exit /b 1
py -3.11 -m pip install --disable-pip-version-check -r requirements-build.txt
if errorlevel 1 exit /b 1
py -3.11 -m py_compile setup_tool.py setup_tool_dynamic.py remote_packages.py tests/test_safety.py
if errorlevel 1 exit /b 1
py -3.11 -m unittest discover -s tests -v
if errorlevel 1 exit /b 1
py -3.11 -m PyInstaller ^
--noconsole ^
--onefile ^
--icon=PurpleWowLogo.ico ^
--add-data "PurpleWowLogo.ico;." ^
--add-data "Payload;Payload" ^
--add-data "vanilla-tweaks.exe;." ^
--name "WoW_Modernization_Tool" ^
setup_tool_dynamic.py
if errorlevel 1 exit /b 1
if not exist "dist\WoW_Modernization_Tool.exe" (
echo ERROR: Build output is missing.
exit /b 1
)
echo Build complete: dist\WoW_Modernization_Tool.exe
+11
View File
@@ -0,0 +1,11 @@
DXVK bundled component
Version: 2.6.1
Architecture: x86 / 32-bit
Component: x32/d3d9.dll
Source: https://github.com/doitsujin/dxvk/releases/tag/v2.6.1
SHA-256: 0349923a6618f2383451c170a0f24d9c8f328392179aca71826a853655982405
Size: 4452366 bytes
Identification was verified by byte-for-byte comparison against the official
DXVK 2.6.1 release archive.
-20
View File
@@ -1,20 +0,0 @@
# DXVK configuration for World of Warcraft
# Uncomment to set framerate limit
# d3d9.maxFrameRate = 1000
# Uncomment to force borderless fullscreen
# d3d9.enableDialogMode = True
# Enable GPL if supported to reduce stuttering (NVIDIA 473.33+, AMD 24.6.1+)
dxvk.enableGraphicsPipelineLibrary = Auto
# Track pipeline lifetimes to reduce memory usage
dxvk.trackPipelineLifetime = True
# Limit compiler threads to reduce memory usage
dxvk.numCompilerThreads = 4
# Allow exclusive fullscreen mode on Windows
dxvk.allowFse = True
# Disabled because VanillaFixes sets process DPI awareness
d3d9.dpiAware = False
@@ -382,6 +382,13 @@ function LoginManager:LoadAccounts()
self.State.accounts = {}
self.State.last = nil
-- Secure-by-default: when Nampower encryption is available, enable it for
-- fresh/legacy AutoLogin state. A saved explicit false value is restored
-- below, so users who deliberately turned Encrypt off keep their choice.
if has_encryption and self.State.encrypt_passwords == nil then
self.State.encrypt_passwords = true
end
local login_data = ImportFile("logins")
local file = self:FromFile("logins")
if file then
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,8 @@
<Bindings>
<Binding name="Interact" header="INTERACT">
Interact(0)
</Binding>
<Binding name="Interact (auto-loot)">
Interact(1)
</Binding>
</Bindings>
@@ -0,0 +1,21 @@
BINDING_HEADER_INTERACT = 'Interact'
StaticPopupDialogs['INTERACT_WARNING'] = {
text = 'Failed to load |cffffd200Interact|cffffffff. Follow the installation instructions to ensure proper installation.',
button1 = 'Okay',
timeout = 0,
whileDead = true,
}
if not InteractNearest then
StaticPopup_Show('INTERACT_WARNING')
end
function Interact(autoloot)
if not InteractNearest then
StaticPopup_Show('INTERACT_WARNING')
return
end
InteractNearest(autoloot)
end
@@ -0,0 +1,9 @@
## Interface: 11200
## Title: Interact |cff808080by luskanek
## Author: luskanek
## Notes: Interact Key from Retail ported to Vanilla.
## Version: GIT
Interact.lua
Bindings.xml
Binary file not shown.
+606
View File
@@ -0,0 +1,606 @@
{
"schema": 1,
"components": {
"AuctionQueryThrottle fallback": {
"files": [
{
"path": "Payload/Fallback/AuctionQueryThrottle.dll",
"sha256": "720b7ad72941206249df23cb9d36addafa2634f190081f7b33834b84af184f5e",
"size": 92672
}
],
"source": "https://github.com/brues-code/AuctionQueryThrottle/releases/download/v1.2.0/AuctionQueryThrottle.dll",
"version": "v1.2.0"
},
"ClassicAPI fallback": {
"files": [
{
"path": "Payload/Fallback/ClassicAPI.dll",
"sha256": "2a823b141326383a56fba100d09f5a72f34798b08f38fa9340e5bdc2ee31dc65",
"size": 1145856
}
],
"source": "https://github.com/brues-code/ClassicAPI/releases/download/v1.12.7/ClassicAPI.dll",
"version": "v1.12.7"
},
"DXVK": {
"version": "v2.6.1 x86",
"source": "https://github.com/doitsujin/dxvk/releases/tag/v2.6.1",
"files": [
{
"path": "Payload/DXVK_Standard/d3d9.dll",
"size": 4452366,
"sha256": "0349923a6618f2383451c170a0f24d9c8f328392179aca71826a853655982405"
}
]
},
"FishPing fallback": {
"files": [
{
"path": "Payload/Fallback/Audio/FishPing/Sound/Spells/Tradeskills/FishBite.wav",
"sha256": "80497c141e2dfe1dde5cc78d0afc7e1381363e8f1dd491af8dd8faa70d872def",
"size": 44596
}
],
"source": "https://codeload.github.com/notsureawake/FishPing/zip/refs/heads/master",
"version": "master"
},
"Interact fallback": {
"files": [
{
"path": "Payload/Fallback/Interact/Interact.dll",
"sha256": "ab716314eed559a10607ecdc655f71911196ffae69706cf1d373d01df86a915d",
"size": 55808
}
],
"source": "https://github.com/lookino/Interact/releases/download/v1.0.4/Interact.zip",
"version": "v1.0.4"
},
"Nampower": {
"files": [
{
"path": "Payload/nampower.dll",
"sha256": "304bdb35bc00b18ee092b3bc01195319f717c37d9c6babe6775e8fe278229d22",
"size": 1058816
}
],
"source": "https://github.com/brues-code/nampower/releases/download/v4.6.1/nampower-v4.6.1.zip",
"version": "v4.6.1"
},
"no1600x1200": {
"files": [
{
"path": "Payload/no1600x1200.dll",
"sha256": "0df2274116278e8330dd7069902b642f1a83f33fefd909807a22eda197d88652",
"size": 104960
}
],
"source": "https://raw.githubusercontent.com/RetroCro/TurtleWoW-Mods/refs/heads/main/Archive/DLL%20BACKUP/no1600x1200.dll",
"version": "RetroCro main"
},
"NoErrorSounds fallback": {
"files": [
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/interface/uChatScrollButton.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/interface/iUiInterfaceButtonA.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/interface/uEscapeScreenClose.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/interface/uEscapeScreenOpen.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/Spells/Fizzle/FizzleFrostA.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/Spells/Fizzle/FizzleNatureA.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/Spells/Fizzle/FizzleHolyA.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/Spells/Fizzle/FizzleFireA.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/NoErrorSounds/Sound/Spells/Fizzle/FizzleShadowA.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
}
],
"source": "https://codeload.github.com/Macumbafeh/NoErrorSounds/zip/refs/heads/main",
"version": "main"
},
"PerfBoost": {
"files": [
{
"path": "Payload/perf_boost.dll",
"sha256": "7019e2f31c4f56caa616f1b4b2587c56ff276f2c27c9f35535e2578eafbd4dbe",
"size": 578560
}
],
"source": "https://raw.githubusercontent.com/RetroCro/TurtleWoW-Mods/refs/heads/main/Archive/DLL%20BACKUP/perf_boost.dll",
"version": "RetroCro main"
},
"SuperWoW": {
"files": [
{
"path": "Payload/SuperWoWhook.dll",
"sha256": "bd214b32c878649e94ce654835946bd05e0ce7710e8f01bae10d8ab50a89351d",
"size": 1000448
}
],
"source": "https://github.com/balakethelock/SuperWoW/releases/download/Release/SuperWoW.release.2.2.zip",
"version": "Release"
},
"UnitXP_SP3": {
"files": [
{
"path": "Payload/UnitXP_SP3.dll",
"sha256": "1d1a622fc4fd74864bdd5aa29d8c4ed2dd5cbb0340f978cbf4daca815235d10a",
"size": 185344
}
],
"source": "https://github.com/brues-code/UnitXP_SP3/releases/download/v90/UnitXP_SP3-v90.zip",
"version": "v90"
},
"vanilla-tweaks fallback": {
"files": [
{
"path": "vanilla-tweaks.exe",
"sha256": "e386132fd0e5713818893a9cef9e5ae41d99baff2da03f190911d351cc5ed090",
"size": 5927433
}
],
"source": "https://github.com/tubtubs/vanilla-tweaks/releases/download/tag/vanilla-tweaks_tag_x86_64-pc-windows-gnu.zip",
"version": "tag"
},
"VanillaFixes": {
"version": "v1.5.3",
"source": "https://github.com/hannesmann/vanillafixes/releases/tag/v1.5.3",
"files": [
{
"path": "Payload/VanillaFixes.exe",
"size": 88576,
"sha256": "228d7bb5e3b5b0c2062d6c5f40c38c2a173e4c80d8a5d9e4077be800431b48a3"
},
{
"path": "Payload/VfPatcher.dll",
"size": 72704,
"sha256": "f283b6b5ad8042e7995eff9768c150042dd47de6e5f00ffe530d2e67743df81d"
}
]
},
"VanillaHelpers": {
"files": [
{
"path": "Payload/VanillaHelpers.dll",
"sha256": "1e74ddf6484c23482550d5f9e5f9d291085c4ac538d3b3ed9d87155521841196",
"size": 254976
}
],
"source": "https://github.com/isfir/VanillaHelpers/releases/download/v1.1.2/VanillaHelpers.dll",
"version": "v1.1.2"
},
"VanillaMultiMonitorFix fallback": {
"files": [
{
"path": "Payload/Fallback/VanillaMultiMonitorFix/VanillaMultiMonitorFix.dll",
"sha256": "7fa033e744c4b8794a4c97a45d563a8870264244bfa1e478a1c0f85e0c6e3371",
"size": 28160
},
{
"path": "Payload/Fallback/VanillaMultiMonitorFix/VMMFix_preferred_monitor.txt",
"sha256": "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b",
"size": 1
}
],
"source": "https://github.com/Mates1500/VanillaMultiMonitorFix/releases/download/0.2/release.zip",
"version": "0.2"
},
"WarlockMutedDemons fallback": {
"files": [
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_KILL03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_KILL02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_DISMISS03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_DISMISS04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_SUMMON04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_ORDER01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_SUMMON02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_FUNNY.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_ORDER03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_DISMISS01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_SUMMON03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_SUMMON01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_ORDER02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_KILL01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_KILL04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_DISMISS02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/DoomGuardVO/DOOM_ORDER05.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_SUMMON02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_ORDER03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_KILL04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_ORDER05.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_ORDER01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_DISMISS03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_SUMMON01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_SUMMON03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_FUNNY.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_ORDER02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_SUMMON04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_KILL02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_DISMISS02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_DISMISS01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_DISMISS04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_KILL01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/VoidWalkerVO/VOID_KILL03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_KILL02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_ORDER04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_DISMISS03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_DISMISS02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_KILL03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_ORDER02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_ORDER01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_DISMISS04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_KILL04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_DISMISS05.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_ORDER03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_FUNNY.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/ImpVO/IMP_KILL01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_DISMISS04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_FUNNY.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_SUMMON02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_KILL03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_SUMMON03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_KILL04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_SUMMON01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_KILL02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_ORDER02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_DISMISS03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_DISMISS01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_ORDER01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_KILL01.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_ORDER05.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_DISMISS02.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_ORDER03.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
},
{
"path": "Payload/Fallback/Audio/WarlockMutedDemons/Data/Sound/Creature/SuccubusVO/SUCCUBUS_SUMMON04.wav",
"sha256": "4f1c48e911f813417f6f7324e68e0b09dab1ebb09032c7d7a940168c5d92a954",
"size": 482
}
],
"source": "https://codeload.github.com/spzilyk/Warlock-Muted-Demons/zip/refs/heads/main",
"version": "main"
},
"WeirdPerformance": {
"files": [
{
"path": "Payload/weirdperformance.dll",
"sha256": "872b73e9074b8fd95f968b099adf4139591c10ab6cd916c96082ed4a7b7b8c69",
"size": 204288
}
],
"source": "https://codeberg.org/Dusk92/WeirdUtils/releases/download/0.7.3/weirdperformance.dll",
"version": "0.7.3"
},
"WeirdUtils bundled modules": {
"version": "v0.7.0",
"source": "https://codeberg.org/MarcelineVQ/WeirdUtils/releases/tag/v0.7.0",
"note": "All listed bundled modules were verified byte-for-byte against WeirdUtils v0.7.0. WorldMarkers is tracked separately because it was updated to v0.7.1.",
"files": [
{
"path": "Payload/transmogfix.dll",
"size": 12800,
"sha256": "cd9e4c6ce033b0923cf045269f590f5e0b886bd03f43bd81406670d781452210"
},
{
"path": "Payload/WeirdUtils/bigcursor.dll",
"size": 14848,
"sha256": "daa85d8e29e5458fd9962f922ba1e2a65ff2ac6cddff1242a2d6240c287a22d8"
},
{
"path": "Payload/WeirdUtils/customassets.dll",
"size": 16384,
"sha256": "86f3a24cfbaa8d775bdab280d63fbf48b445d8789c2759fe912183462f36f06f"
},
{
"path": "Payload/WeirdUtils/logsessions.dll",
"size": 14848,
"sha256": "f5f37e449dc4646b6d2de8c01e57b954ab2fb7950bef372ddba2c744fb7b9841"
},
{
"path": "Payload/WeirdUtils/minimapicons.dll",
"size": 142848,
"sha256": "a6821e088d0f8ffa7806e88e1b8686f4ec715a218f74f62d6f33bd9bcf91583e"
},
{
"path": "Payload/WeirdUtils/pngscreenshots.dll",
"size": 16896,
"sha256": "44ca42ac8428eb4e69017ad264b8e86206e803ccbe3a3591d6ba1916d7888dca"
}
]
},
"WeirdUtils WorldMarkers": {
"version": "v0.7.1",
"source": "https://codeberg.org/MarcelineVQ/WeirdUtils/releases/tag/v0.7.1",
"note": "Bug-fix release: relaxes overly strict zone checking that could prevent valid world markers from appearing.",
"files": [
{
"path": "Payload/WeirdUtils/worldmarkers.dll",
"size": 488448,
"sha256": "7b0b0fcdb8bb9e82c5a18ab395af670f57da3e03035b27d5e244e4f8b457fdf2"
}
]
}
}
}
@@ -1,2 +0,0 @@
# UnitXP_SP3_Addon
Vanilla 1.12 Lua Addon for supporting [UnitXP SP3 mod](https://codeberg.org/konaka/UnitXP_SP3)
@@ -374,12 +374,13 @@ local function UnitXP_SP3_setShowInCombatNameplatesNearPlayer(enable)
end
local function UnitXP_SP3_setWeatherAlwaysClear(enable)
local test, result;
if enable then
test, result = pcall(UnitXP, "weatherAlwaysClear", "disableRain");
local subcmd;
if enable == "enable" then
subcmd = "disableRain";
else
test, result = pcall(UnitXP, "weatherAlwaysClear", "enableRain");
subcmd = "enableRain";
end
local test, result = pcall(UnitXP, "weatherAlwaysClear", subcmd);
if not test then
if not skipUpdateMessage then
@@ -612,10 +613,10 @@ local function UnitXP_SP3_reloadConfig()
end
if UnitXP_SP3_Addon["weatherAlwaysClear"] then
UnitXP_SP3_setWeatherAlwaysClear(true);
UnitXP_SP3_setWeatherAlwaysClear("enable");
xpsp3_checkButton_weatherAlwaysClear:SetChecked(true);
else
UnitXP_SP3_setWeatherAlwaysClear(false);
UnitXP_SP3_setWeatherAlwaysClear("disable");
xpsp3_checkButton_weatherAlwaysClear:SetChecked(false);
end
@@ -1,371 +1,371 @@
local L = AceLibrary("AceLocale-2.2"):new("NampowerSettings")
L:RegisterTranslations("enUS", function()
return {
["|cffffcc00Nampower v2|cffffaaaa not present hiding settings."] = true,
["update available"] = "|cffffcc00Nampower update v2.20.0 available.|cffffcc00 Some settings may be hidden until you update. Replace your existing nampower.dll with the latest from https://gitea.com/avitasia/nampower/releases",
["Superwow required to display queued spells."] = true,
["Enable Per Character Settings"] = true,
["Whether to use per character settings for all of the NP_ settings. This will cause settings saved in your character's NampowerSettings.lua to override any global settings in Config.wtf."] = true,
["Queue Cast Time Spells"] = true,
["Whether to enable spell queuing for spells with a cast time"] = true,
["Queue Instant Spells"] = true,
["Whether to enable spell queuing for instant cast spells tied to gcd"] = true,
["Queue On Swing Spells"] = true,
["Whether to enable on swing spell queuing"] = true,
["Queue Channeling Spells"] = true,
["Whether to enable channeling spell queuing"] = true,
["Queue Targeting Spells"] = true,
["Whether to enable terrain targeting spell queuing"] = true,
["Queue Spells Coming Off Cooldown"] = true,
["Whether to enable spell queuing for spells coming off cooldown"] = true,
["Queue Windows"] = true,
["How much time in ms you have before a cast ends to queue different types of spells"] = true,
["Spell Queue Window (ms)"] = true,
["The window in ms before a cast finishes where the next will get queued"] = true,
["On Swing Buffer Cooldown (ms)"] = true,
["The cooldown time in ms after an on swing spell before you can queue on swing spells"] = true,
["Channel Queue Window (ms)"] = true,
["The window in ms before a channel finishes where the next will get queued"] = true,
["Targeting Queue Window (ms)"] = true,
["The window in ms before a terrain targeting spell finishes where the next will get queued"] = true,
["Cooldown Queue Window (ms)"] = true,
["The window in ms before a spell coming off cooldown finishes where the next will get queued"] = true,
["Cast Options"] = true,
["Options for controlling casting behavior"] = true,
["QOL Options"] = true,
["Quality of life options to prevent common issues"] = true,
["Chat Bubbles"] = true,
["Chat bubble options"] = true,
["Chat Bubbles (Say/Yell)"] = true,
["Whether to enable chat bubbles for /say and /yell messages."] = true,
["Chat Bubbles (Party)"] = true,
["Whether to enable chat bubbles for /party messages."] = true,
["Chat Bubbles (Whisper)"] = true,
["Whether to enable chat bubbles for /whisper messages."] = true,
["Chat Bubbles (Raid)"] = true,
["Whether to enable chat bubbles for /raid messages."] = true,
["Chat Bubbles (Battleground)"] = true,
["Whether to enable chat bubbles for battleground messages."] = true,
["Chat Bubble Distance"] = true,
["The distance in yards to show chat bubbles"] = true,
["Advanced options"] = true,
["Collection of various advanced options"] = true,
["Spell Events"] = true,
["Controls optional spell and combat event CVars."] = true,
["Double Cast to End Channel Early"] = true,
["Whether to allow double casting a spell within 350ms to end channeling on the next tick. Takes into account your ChannelLatencyReductionPercentage."] = true,
["Quickcast Targeting Spells on Double Cast"] = true,
["Allows casting targeting spells by attempting to cast them twice as opposed to the default client behavior which cancels the targeting indicator"] = true,
["Interrupt Channels Outside Queue Window"] = true,
["Whether to allow interrupting channels (the original client behavior) when trying to cast a spell outside the channeling queue window"] = true,
["Retry Server Rejected Spells"] = true,
["Whether to retry spells that are rejected by the server for these reasons: SPELL_FAILED_ITEM_NOT_READY, SPELL_FAILED_NOT_READY, SPELL_FAILED_SPELL_IN_PROGRESS"] = true,
["Quickcast Targeting Spells"] = true,
["Whether to enable quick casting for ALL spells with terrain targeting"] = true,
["Replace Matching Non GCD Category"] = true,
["Whether to replace any queued non gcd spell when a new non gcd spell with the same non zero StartRecoveryCategory is cast. Most trinkets and spells are category 0 which are ignored by this setting. The primary use case is to switch which potion you have queued."] = true,
["Optimize Buffer Using Packet Timings"] = true,
["Whether to attempt to optimize your buffer using your latency and server packet timings"] = true,
["Minimum Buffer Time (ms)"] = true,
["The minimum buffer delay in ms added to each cast"] = true,
["Non GCD Buffer Time (ms)"] = true,
["The buffer delay in ms added AFTER each cast that is not tied to the gcd"] = true,
["Max Buffer Increase (ms)"] = true,
["The maximum amount of time in ms to increase the buffer by when the server rejects a cast"] = true,
["Channel Latency Reduction (%)"] = true,
["The percentage of your latency to subtract from the end of a channel duration to optimize cast time while hopefully not losing any ticks"] = true,
["Queued Spell Display Options"] = true,
["Options for displaying an icon for the queued spell"] = true,
["Display queued spell icon"] = true,
["Whether to display an icon of the queued spell"] = true,
["Icon size"] = true,
["Change the spell icon size"] = true,
["Allow dragging"] = true,
["Whether to allow interaction with the queued spell icon so you can move it around"] = true,
["Reset Position"] = true,
["Reset the position of the queued spell icon"] = true,
["Show/Hide for positioning"] = true,
["Test the queued spell icon and position it to your liking"] = true,
["Prevent Right Click Target Change"] = true,
["Whether to prevent right-clicking from changing your current target when in combat. If you don't have a target right click will still change your target even with this on. This is mainly to prevent accidentally changing targets in combat when trying to adjust your camera."] = true,
["Nameplate Distance"] = true,
["The distance in yards to show nameplates"] = true,
["Spam Protection"] = true,
["Whether to enable spam protection functionality that blocks spamming spells while waiting for the server to respond to your initial cast due to issues spamming can cause"] = true,
["Prevent Right Click PvP Attack"] = true,
["Whether to prevent right-clicking on PvP flagged players to avoid accidental PvP attacks"] = true,
["Prevent Mounting When Buff Capped"] = true,
["Whether to prevent mounting when you have 32 buffs (buff capped) and are not already mounted. This prevents the issue where you mount but cannot dismount because the mount aura fails to apply due to the buff cap. When blocked, displays an error message."] = true,
["Enable Enhanced Tooltips"] = true,
["Whether to enable nampower's tooltip additions such as spell proc chance, ICD, and item cooldown text."] = true,
["Enable Aura Cast Events"] = true,
["Whether to enable AURA_CAST_ON_SELF and AURA_CAST_ON_OTHER events."] = true,
["Enable Auto Attack Events"] = true,
["Whether to enable AUTO_ATTACK_SELF and AUTO_ATTACK_OTHER events."] = true,
["Enable Spell Start Events"] = true,
["Whether to enable SPELL_START_SELF and SPELL_START_OTHER events."] = true,
["Enable Spell Go Events"] = true,
["Whether to enable SPELL_GO_SELF and SPELL_GO_OTHER events."] = true,
["Enable Spell Heal Events"] = true,
["Whether to enable SPELL_HEAL_BY_SELF, SPELL_HEAL_BY_OTHER, and SPELL_HEAL_ON_SELF events."] = true,
["Enable Spell Energize Events"] = true,
["Whether to enable SPELL_ENERGIZE_BY_SELF, SPELL_ENERGIZE_BY_OTHER, and SPELL_ENERGIZE_ON_SELF events."] = true,
["Unit Event Filters"] = true,
["Controls which unit identifiers trigger unit events (UNIT_HEALTH, UNIT_COMBAT, etc.). In the base game the same event can fire multiple times for the same unit, once per identifying string (e.g. 'party1', 'raid1', 'mouseover'). Disabling unused identifiers reduces redundant event calls. Note: 'player', 'target', and 'pet' (your own pet) always trigger regardless of these settings, as they are critical."] = true,
["Enable Pet Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for party and raid pet identifiers ('party1pet', 'raid1pet', etc.). Party pets additionally require Enable Party Unit Events to be on; raid pets additionally require Enable Raid Unit Events to be on. Your own pet ('pet') always fires events regardless of this setting."] = true,
["Enable Party Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for party member identifiers ('party1', 'party2', 'party3', 'party4'). Also required alongside Enable Pet Unit Events for party pet identifiers to fire."] = true,
["Enable Raid Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for raid member identifiers ('raid1' through 'raid40'). Also required alongside Enable Pet Unit Events for raid pet identifiers to fire."] = true,
["Enable Mouseover Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for the 'mouseover' unit identifier."] = true,
["Enable GUID Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_MANA, UNIT_AURA, etc.) using the raw GUID as the unit token, mirroring SuperWoW behavior. Fires for every unit the client tracks — not just named tokens like 'player', 'party1', 'raid1' — which can cause significant event spam in raids, BGs, and crowded zones. Older addons (e.g. pfUI) written for standard named tokens may have performance issues receiving GUID-based events. Addons needing GUID tracking (e.g. Automarker, Cursive) should use the new dedicated UNIT_HEALTH_GUID, UNIT_MANA_GUID, etc. events instead, allowing this to be safely disabled."] = true,
["Enable GUID Unit Event Filtering"] = true,
["When enabled, suppresses high-frequency GUID events that cause spam in older addons — specifically UNIT_AURA, UNIT_HEALTH, UNIT_MANA, and similar events below UNIT_COMBAT, plus UNIT_NAME_UPDATE, UNIT_PORTRAIT_UPDATE, UNIT_INVENTORY_CHANGED, and PLAYER_GUILD_UPDATE. UNIT_COMBAT_GUID and other less frequent GUID events are still fired. Has no effect if Enable GUID Unit Events is disabled. This is a direct replacement for the 'Filter GUID Events' option in PerfBoost."] = true,
["Preserve Greater Demon Autocast"] = true,
["Whether to remember and restore Felguard/Doomguard autocast preferences when swapping or resummoning those greater demons."] = true,
}
end)
L:RegisterTranslations("zhCN", function()
return {
["|cffffcc00Nampower v2|cffffaaaa not present hiding settings."] = "|cffffcc00Nampower v2|cffffaaaa 未安装,隐藏设置项。",
["update available"] = "|cffffcc00Nampower v2.20.0 更新可用。|cffffcc00 更新前部分设置可能隐藏。请从 https://gitea.com/avitasia/nampower/releases 下载最新 nampower.dll 替换当前版本。",
["Superwow required to display queued spells."] = "需 Superwow 插件显示队列中法术。",
["Enable Per Character Settings"] = "启用角色独立设置",
["Whether to use per character settings for all of the NP_ settings. This will cause settings saved in your character's NampowerSettings.lua to override any global settings in Config.wtf."] = "是否为所有 NP_ 设置启用角色独立配置。启用后,角色 NampowerSettings.lua 中的设置将覆盖 Config.wtf 中的全局设置。",
["Queue Cast Time Spells"] = "队列施法时间法术",
["Whether to enable spell queuing for spells with a cast time"] = "是否对施法时间类法术启用队列功能",
["Queue Instant Spells"] = "队列瞬发法术",
["Whether to enable spell queuing for instant cast spells tied to gcd"] = "是否对涉及公共冷却的瞬发法术启用队列功能",
["Queue On Swing Spells"] = "队列特殊攻击法术",
["Whether to enable on swing spell queuing"] = "是否对特殊攻击类法术(如战士压制)启用队列功能",
["Queue Channeling Spells"] = "队列引导法术",
["Whether to enable channeling spell queuing"] = "是否对引导类法术(如暴风雪)启用队列功能",
["Queue Targeting Spells"] = "队列目标区域法术",
["Whether to enable terrain targeting spell queuing"] = "是否对目标区域类法术(如暴风雪)启用队列功能",
["Queue Spells Coming Off Cooldown"] = "队列冷却结束法术",
["Whether to enable spell queuing for spells coming off cooldown"] = "是否对即将结束冷却的法术启用队列功能",
["Queue Windows"] = "队列窗口设置",
["How much time in ms you have before a cast ends to queue different types of spells"] = "各种法术类型在施法结束前多少毫秒(ms)开始进入队列",
["Spell Queue Window (ms)"] = "法术队列窗口(ms",
["The window in ms before a cast finishes where the next will get queued"] = "当前施法结束前多少毫秒(ms)可将下一个法术加入队列",
["On Swing Buffer Cooldown (ms)"] = "特殊攻击缓冲冷却(ms",
["The cooldown time in ms after an on swing spell before you can queue on swing spells"] = "特殊攻击法术施放后,多少毫秒(ms)内无法再次将同类法术加入队列",
["Channel Queue Window (ms)"] = "引导法术队列窗口(ms",
["The window in ms before a channel finishes where the next will get queued"] = "引导法术结束前多少毫秒(ms)可将下一个法术加入队列",
["Targeting Queue Window (ms)"] = "目标区域法术队列窗口(ms",
["The window in ms before a terrain targeting spell finishes where the next will get queued"] = "目标区域法术结束前多少毫秒(ms)可将下一个法术加入队列",
["Cooldown Queue Window (ms)"] = "冷却结束队列窗口(ms",
["The window in ms before a spell coming off cooldown finishes where the next will get queued"] = "法术冷却结束前多少毫秒(ms)可将该法术加入队列",
["Cast Options"] = "施法选项",
["Options for controlling casting behavior"] = "控制施法行为的选项",
["QOL Options"] = "便利性选项",
["Quality of life options to prevent common issues"] = "用于防止常见错误的便利性选项",
["Chat Bubbles"] = "聊天气泡",
["Chat bubble options"] = "聊天气泡相关选项",
["Chat Bubbles (Say/Yell)"] = "聊天气泡(说话/大喊)",
["Whether to enable chat bubbles for /say and /yell messages."] = "是否为 /say 与 /yell 消息启用聊天气泡。",
["Chat Bubbles (Party)"] = "聊天气泡(队伍)",
["Whether to enable chat bubbles for /party messages."] = "是否为 /party 消息启用聊天气泡。",
["Chat Bubbles (Whisper)"] = "聊天气泡(密语)",
["Whether to enable chat bubbles for /whisper messages."] = "是否为 /whisper 消息启用聊天气泡。",
["Chat Bubbles (Raid)"] = "聊天气泡(团队)",
["Whether to enable chat bubbles for /raid messages."] = "是否为 /raid 消息启用聊天气泡。",
["Chat Bubbles (Battleground)"] = "聊天气泡(战场)",
["Whether to enable chat bubbles for battleground messages."] = "是否为战场消息启用聊天气泡。",
["Chat Bubble Distance"] = "聊天气泡距离",
["The distance in yards to show chat bubbles"] = "显示聊天气泡的最大距离(码)",
["Advanced options"] = "高级选项",
["Collection of various advanced options"] = "各类高级选项集合",
["Spell Events"] = "法术事件",
["Controls optional spell and combat event CVars."] = "控制可选的法术和战斗事件 CVar。",
["Double Cast to End Channel Early"] = "双重施法提前结束引导",
["Whether to allow double casting a spell within 350ms to end channeling on the next tick. Takes into account your ChannelLatencyReductionPercentage."] = "是否允许350毫秒内双重施法以在下一个伤害周期提前结束引导。受引导延迟削减比例影响。",
["Quickcast Targeting Spells on Double Cast"] = "双重施法快速施放目标区域法术",
["Allows casting targeting spells by attempting to cast them twice as opposed to the default client behavior which cancels the targeting indicator"] = "允许通过双次尝试施法来释放目标区域法术,而非默认客户端行为(取消目标指示器)",
["Interrupt Channels Outside Queue Window"] = "队列窗口外允许打断引导",
["Whether to allow interrupting channels (the original client behavior) when trying to cast a spell outside the channeling queue window"] = "在引导法术队列窗口外尝试施法时,是否允许打断引导(默认客户端行为)",
["Retry Server Rejected Spells"] = "重试服务器拒绝的法术",
["Whether to retry spells that are rejected by the server for these reasons: SPELL_FAILED_ITEM_NOT_READY, SPELL_FAILED_NOT_READY, SPELL_FAILED_SPELL_IN_PROGRESS"] = "是否对因以下原因被服务器拒绝的法术进行重试:未准备就绪、未冷却、已有法术施放中",
["Quickcast Targeting Spells"] = "快速施放目标区域法术",
["Whether to enable quick casting for ALL spells with terrain targeting"] = "是否为所有目标区域法术启用快速施放功能",
["Replace Matching Non GCD Category"] = "替换同类型非公共冷却法术",
["Whether to replace any queued non gcd spell when a new non gcd spell with the same non zero StartRecoveryCategory is cast. Most trinkets and spells are category 0 which are ignored by this setting. The primary use case is to switch which potion you have queued."] = "当施放新的非公共冷却法术且其启动类别相同时,是否替换队列中的同类法术。饰品和多数法术属类别0(不受影响),主要用于替换已队列的药水。",
["Optimize Buffer Using Packet Timings"] = "基于封包时间优化缓冲",
["Whether to attempt to optimize your buffer using your latency and server packet timings"] = "是否根据延迟和服务器封包时间优化法术缓冲机制",
["Minimum Buffer Time (ms)"] = "最低缓冲时间(ms",
["The minimum buffer delay in ms added to each cast"] = "为每次施法添加的最小缓冲延迟(毫秒)",
["Non GCD Buffer Time (ms)"] = "非公共冷却缓冲时间(ms",
["The buffer delay in ms added AFTER each cast that is not tied to the gcd"] = "在非公共冷却法术施放后添加的缓冲延迟(毫秒)",
["Max Buffer Increase (ms)"] = "最大缓冲增加量(ms",
["The maximum amount of time in ms to increase the buffer by when the server rejects a cast"] = "当法术被服务器拒绝时,缓冲时间可增加的最大毫秒数",
["Channel Latency Reduction (%)"] = "引导延迟削减比例(%",
["The percentage of your latency to subtract from the end of a channel duration to optimize cast time while hopefully not losing any ticks"] = "为优化施法时间,从引导结束时序中扣除延迟的百分比(避免丢失伤害周期)",
["Queued Spell Display Options"] = "队列法术显示选项",
["Options for displaying an icon for the queued spell"] = "队列中法术图标的显示设置",
["Display queued spell icon"] = "显示队列法术图标",
["Whether to display an icon of the queued spell"] = "是否显示队列中法术的图标",
["Icon size"] = "图标尺寸",
["Change the spell icon size"] = "修改法术图标大小",
["Allow dragging"] = "允许拖动",
["Whether to allow interaction with the queued spell icon so you can move it around"] = "是否允许通过拖动交互调整队列法术图标位置",
["Reset Position"] = "重置位置",
["Reset the position of the queued spell icon"] = "重置队列法术图标位置",
["Show/Hide for positioning"] = "显示/隐藏(用于定位)",
["Test the queued spell icon and position it to your liking"] = "测试队列法术图标位置,按需调整",
["Prevent Right Click Target Change"] = "阻止右键切换目标",
["Whether to prevent right-clicking from changing your current target when in combat. If you don't have a target right click will still change your target even with this on. This is mainly to prevent accidentally changing targets in combat when trying to adjust your camera."] = "战斗中右键点击是否不改变当前目标(无目标时仍可切换)。主要用于调整镜头时避免误切目标。",
["Nameplate Distance"] = "姓名板显示距离",
["The distance in yards to show nameplates"] = "显示姓名板的最大距离(码)",
["Spam Protection"] = "防连点保护",
["Whether to enable spam protection functionality that blocks spamming spells while waiting for the server to respond to your initial cast due to issues spamming can cause"] = "是否启用防连点保护功能,避免在等待服务器响应期间连点施法导致的问题",
["Prevent Right Click PvP Attack"] = "阻止右键PvP攻击",
["Whether to prevent right-clicking on PvP flagged players to avoid accidental PvP attacks"] = "是否防止右键点击PvP标记玩家以避免误触发PvP攻击",
["Prevent Mounting When Buff Capped"] = "Buff满时阻止上坐骑",
["Whether to prevent mounting when you have 32 buffs (buff capped) and are not already mounted. This prevents the issue where you mount but cannot dismount because the mount aura fails to apply due to the buff cap. When blocked, displays an error message."] = "当已有32个增益(Buff已满)且未在坐骑状态时,是否阻止上坐骑,以避免坐骑光环因Buff上限无法施加导致无法下马的问题。被阻止时会显示错误提示。",
["Enable Enhanced Tooltips"] = "启用增强工具提示",
["Whether to enable nampower's tooltip additions such as spell proc chance, ICD, and item cooldown text."] = "是否启用 nampower 的工具提示增强内容,例如法术触发几率、内置冷却时间(ICD)和物品冷却文本。",
["Enable Aura Cast Events"] = "启用光环施放事件",
["Whether to enable AURA_CAST_ON_SELF and AURA_CAST_ON_OTHER events."] = "是否启用 AURA_CAST_ON_SELF 和 AURA_CAST_ON_OTHER 事件。",
["Enable Auto Attack Events"] = "启用自动攻击事件",
["Whether to enable AUTO_ATTACK_SELF and AUTO_ATTACK_OTHER events."] = "是否启用 AUTO_ATTACK_SELF 和 AUTO_ATTACK_OTHER 事件。",
["Enable Spell Start Events"] = "启用法术开始事件",
["Whether to enable SPELL_START_SELF and SPELL_START_OTHER events."] = "是否启用 SPELL_START_SELF 和 SPELL_START_OTHER 事件。",
["Enable Spell Go Events"] = "启用法术释放事件",
["Whether to enable SPELL_GO_SELF and SPELL_GO_OTHER events."] = "是否启用 SPELL_GO_SELF 和 SPELL_GO_OTHER 事件。",
["Enable Spell Heal Events"] = "启用法术治疗事件",
["Whether to enable SPELL_HEAL_BY_SELF, SPELL_HEAL_BY_OTHER, and SPELL_HEAL_ON_SELF events."] = "是否启用 SPELL_HEAL_BY_SELF、SPELL_HEAL_BY_OTHER 和 SPELL_HEAL_ON_SELF 事件。",
["Enable Spell Energize Events"] = "启用法术回能事件",
["Whether to enable SPELL_ENERGIZE_BY_SELF, SPELL_ENERGIZE_BY_OTHER, and SPELL_ENERGIZE_ON_SELF events."] = "是否启用 SPELL_ENERGIZE_BY_SELF、SPELL_ENERGIZE_BY_OTHER 和 SPELL_ENERGIZE_ON_SELF 事件。",
["Unit Event Filters"] = "单位事件过滤器",
["Controls which unit identifiers trigger unit events (UNIT_HEALTH, UNIT_COMBAT, etc.). In the base game the same event can fire multiple times for the same unit, once per identifying string (e.g. 'party1', 'raid1', 'mouseover'). Disabling unused identifiers reduces redundant event calls. Note: 'player', 'target', and 'pet' (your own pet) always trigger regardless of these settings, as they are critical."] = "控制哪些单位标识符触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。在原版游戏中,同一单位可能因多个标识符(如 'party1'、'raid1'、'mouseover')重复触发同一事件。禁用不需要的标识符可减少冗余事件调用。注意:'player'(自身)、'target'(目标)和 'pet'(自己的宠物)始终会触发,不受此处设置影响,因为它们是关键标识符。",
["Enable Pet Unit Events"] = "启用宠物单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for party and raid pet identifiers ('party1pet', 'raid1pet', etc.). Party pets additionally require Enable Party Unit Events to be on; raid pets additionally require Enable Raid Unit Events to be on. Your own pet ('pet') always fires events regardless of this setting."] = "是否为队伍和团队宠物标识符('party1pet'、'raid1pet' 等)触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。队伍宠物还需同时开启「启用队伍单位事件」;团队宠物还需同时开启「启用团队单位事件」。自己的宠物('pet')始终触发事件,不受此设置影响。",
["Enable Party Unit Events"] = "启用队伍单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for party member identifiers ('party1', 'party2', 'party3', 'party4'). Also required alongside Enable Pet Unit Events for party pet identifiers to fire."] = "是否为队伍成员标识符('party1'、'party2'、'party3'、'party4')触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。同时也是队伍宠物标识符触发的必要条件(需与「启用宠物单位事件」共同开启)。",
["Enable Raid Unit Events"] = "启用团队单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for raid member identifiers ('raid1' through 'raid40'). Also required alongside Enable Pet Unit Events for raid pet identifiers to fire."] = "是否为团队成员标识符('raid1' 至 'raid40')触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。同时也是团队宠物标识符触发的必要条件(需与「启用宠物单位事件」共同开启)。",
["Enable Mouseover Unit Events"] = "启用鼠标悬停单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for the 'mouseover' unit identifier."] = "是否为 'mouseover'(鼠标悬停)单位标识符触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。",
["Enable GUID Unit Events"] = "启用GUID单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_MANA, UNIT_AURA, etc.) using the raw GUID as the unit token, mirroring SuperWoW behavior. Fires for every unit the client tracks — not just named tokens like 'player', 'party1', 'raid1' — which can cause significant event spam in raids, BGs, and crowded zones. Older addons (e.g. pfUI) written for standard named tokens may have performance issues receiving GUID-based events. Addons needing GUID tracking (e.g. Automarker, Cursive) should use the new dedicated UNIT_HEALTH_GUID, UNIT_MANA_GUID, etc. events instead, allowing this to be safely disabled."] = "是否使用原始 GUID 作为单位标识符触发单位事件(UNIT_HEALTH、UNIT_MANA、UNIT_AURA 等),模拟 SuperWoW 行为。此功能会对客户端跟踪的所有单位触发事件——不仅限于 'player'、'party1'、'raid1' 等命名标识符——在团队、战场和人口密集区域可能产生大量事件。为标准命名标识符设计的旧版插件(如 pfUI)在收到 GUID 事件时可能出现性能问题。需要 GUID 跟踪的插件(如 Automarker、Cursive)应改用专用的 UNIT_HEALTH_GUID、UNIT_MANA_GUID 等事件,届时可安全禁用此选项。",
["Enable GUID Unit Event Filtering"] = "启用GUID单位事件过滤",
["When enabled, suppresses high-frequency GUID events that cause spam in older addons — specifically UNIT_AURA, UNIT_HEALTH, UNIT_MANA, and similar events below UNIT_COMBAT, plus UNIT_NAME_UPDATE, UNIT_PORTRAIT_UPDATE, UNIT_INVENTORY_CHANGED, and PLAYER_GUILD_UPDATE. UNIT_COMBAT_GUID and other less frequent GUID events are still fired. Has no effect if Enable GUID Unit Events is disabled. This is a direct replacement for the 'Filter GUID Events' option in PerfBoost."] = "启用后,将屏蔽对旧版插件造成刷屏的高频 GUID 事件——具体包括 UNIT_COMBAT 以下的事件(如 UNIT_AURA、UNIT_HEALTH、UNIT_MANA 等),以及 UNIT_NAME_UPDATE、UNIT_PORTRAIT_UPDATE、UNIT_INVENTORY_CHANGED 和 PLAYER_GUILD_UPDATE。UNIT_COMBAT_GUID 及其他低频 GUID 事件仍会正常触发。若已禁用「启用GUID单位事件」,则此设置无效。此选项直接替代 PerfBoost 中的「过滤GUID事件」功能。",
["Preserve Greater Demon Autocast"] = "保留大型恶魔自动施法",
["Whether to remember and restore Felguard/Doomguard autocast preferences when swapping or resummoning those greater demons."] = "切换或重新召唤地狱守卫/末日守卫时,是否记忆并恢复其自动施法设置。",
}
end)
local L = AceLibrary("AceLocale-2.2"):new("NampowerSettings")
L:RegisterTranslations("enUS", function()
return {
["|cffffcc00Nampower v2|cffffaaaa not present hiding settings."] = true,
["update available"] = "|cffffcc00Nampower update v2.20.0 available.|cffffcc00 Some settings may be hidden until you update. Replace your existing nampower.dll with the latest from https://gitea.com/avitasia/nampower/releases",
["Superwow required to display queued spells."] = true,
["Enable Per Character Settings"] = true,
["Whether to use per character settings for all of the NP_ settings. This will cause settings saved in your character's NampowerSettings.lua to override any global settings in Config.wtf."] = true,
["Queue Cast Time Spells"] = true,
["Whether to enable spell queuing for spells with a cast time"] = true,
["Queue Instant Spells"] = true,
["Whether to enable spell queuing for instant cast spells tied to gcd"] = true,
["Queue On Swing Spells"] = true,
["Whether to enable on swing spell queuing"] = true,
["Queue Channeling Spells"] = true,
["Whether to enable channeling spell queuing"] = true,
["Queue Targeting Spells"] = true,
["Whether to enable terrain targeting spell queuing"] = true,
["Queue Spells Coming Off Cooldown"] = true,
["Whether to enable spell queuing for spells coming off cooldown"] = true,
["Queue Windows"] = true,
["How much time in ms you have before a cast ends to queue different types of spells"] = true,
["Spell Queue Window (ms)"] = true,
["The window in ms before a cast finishes where the next will get queued"] = true,
["On Swing Buffer Cooldown (ms)"] = true,
["The cooldown time in ms after an on swing spell before you can queue on swing spells"] = true,
["Channel Queue Window (ms)"] = true,
["The window in ms before a channel finishes where the next will get queued"] = true,
["Targeting Queue Window (ms)"] = true,
["The window in ms before a terrain targeting spell finishes where the next will get queued"] = true,
["Cooldown Queue Window (ms)"] = true,
["The window in ms before a spell coming off cooldown finishes where the next will get queued"] = true,
["Cast Options"] = true,
["Options for controlling casting behavior"] = true,
["QOL Options"] = true,
["Quality of life options to prevent common issues"] = true,
["Chat Bubbles"] = true,
["Chat bubble options"] = true,
["Chat Bubbles (Say/Yell)"] = true,
["Whether to enable chat bubbles for /say and /yell messages."] = true,
["Chat Bubbles (Party)"] = true,
["Whether to enable chat bubbles for /party messages."] = true,
["Chat Bubbles (Whisper)"] = true,
["Whether to enable chat bubbles for /whisper messages."] = true,
["Chat Bubbles (Raid)"] = true,
["Whether to enable chat bubbles for /raid messages."] = true,
["Chat Bubbles (Battleground)"] = true,
["Whether to enable chat bubbles for battleground messages."] = true,
["Chat Bubble Distance"] = true,
["The distance in yards to show chat bubbles"] = true,
["Advanced options"] = true,
["Collection of various advanced options"] = true,
["Spell Events"] = true,
["Controls optional spell and combat event CVars."] = true,
["Double Cast to End Channel Early"] = true,
["Whether to allow double casting a spell within 350ms to end channeling on the next tick. Takes into account your ChannelLatencyReductionPercentage."] = true,
["Quickcast Targeting Spells on Double Cast"] = true,
["Allows casting targeting spells by attempting to cast them twice as opposed to the default client behavior which cancels the targeting indicator"] = true,
["Interrupt Channels Outside Queue Window"] = true,
["Whether to allow interrupting channels (the original client behavior) when trying to cast a spell outside the channeling queue window"] = true,
["Retry Server Rejected Spells"] = true,
["Whether to retry spells that are rejected by the server for these reasons: SPELL_FAILED_ITEM_NOT_READY, SPELL_FAILED_NOT_READY, SPELL_FAILED_SPELL_IN_PROGRESS"] = true,
["Quickcast Targeting Spells"] = true,
["Whether to enable quick casting for ALL spells with terrain targeting"] = true,
["Replace Matching Non GCD Category"] = true,
["Whether to replace any queued non gcd spell when a new non gcd spell with the same non zero StartRecoveryCategory is cast. Most trinkets and spells are category 0 which are ignored by this setting. The primary use case is to switch which potion you have queued."] = true,
["Optimize Buffer Using Packet Timings"] = true,
["Whether to attempt to optimize your buffer using your latency and server packet timings"] = true,
["Minimum Buffer Time (ms)"] = true,
["The minimum buffer delay in ms added to each cast"] = true,
["Non GCD Buffer Time (ms)"] = true,
["The buffer delay in ms added AFTER each cast that is not tied to the gcd"] = true,
["Max Buffer Increase (ms)"] = true,
["The maximum amount of time in ms to increase the buffer by when the server rejects a cast"] = true,
["Channel Latency Reduction (%)"] = true,
["The percentage of your latency to subtract from the end of a channel duration to optimize cast time while hopefully not losing any ticks"] = true,
["Queued Spell Display Options"] = true,
["Options for displaying an icon for the queued spell"] = true,
["Display queued spell icon"] = true,
["Whether to display an icon of the queued spell"] = true,
["Icon size"] = true,
["Change the spell icon size"] = true,
["Allow dragging"] = true,
["Whether to allow interaction with the queued spell icon so you can move it around"] = true,
["Reset Position"] = true,
["Reset the position of the queued spell icon"] = true,
["Show/Hide for positioning"] = true,
["Test the queued spell icon and position it to your liking"] = true,
["Prevent Right Click Target Change"] = true,
["Whether to prevent right-clicking from changing your current target when in combat. If you don't have a target right click will still change your target even with this on. This is mainly to prevent accidentally changing targets in combat when trying to adjust your camera."] = true,
["Nameplate Distance"] = true,
["The distance in yards to show nameplates"] = true,
["Spam Protection"] = true,
["Whether to enable spam protection functionality that blocks spamming spells while waiting for the server to respond to your initial cast due to issues spamming can cause"] = true,
["Prevent Right Click PvP Attack"] = true,
["Whether to prevent right-clicking on PvP flagged players to avoid accidental PvP attacks"] = true,
["Prevent Mounting When Buff Capped"] = true,
["Whether to prevent mounting when you have 32 buffs (buff capped) and are not already mounted. This prevents the issue where you mount but cannot dismount because the mount aura fails to apply due to the buff cap. When blocked, displays an error message."] = true,
["Enable Enhanced Tooltips"] = true,
["Whether to enable nampower's tooltip additions such as spell proc chance, ICD, and item cooldown text."] = true,
["Enable Aura Cast Events"] = true,
["Whether to enable AURA_CAST_ON_SELF and AURA_CAST_ON_OTHER events."] = true,
["Enable Auto Attack Events"] = true,
["Whether to enable AUTO_ATTACK_SELF and AUTO_ATTACK_OTHER events."] = true,
["Enable Spell Start Events"] = true,
["Whether to enable SPELL_START_SELF and SPELL_START_OTHER events."] = true,
["Enable Spell Go Events"] = true,
["Whether to enable SPELL_GO_SELF and SPELL_GO_OTHER events."] = true,
["Enable Spell Heal Events"] = true,
["Whether to enable SPELL_HEAL_BY_SELF, SPELL_HEAL_BY_OTHER, and SPELL_HEAL_ON_SELF events."] = true,
["Enable Spell Energize Events"] = true,
["Whether to enable SPELL_ENERGIZE_BY_SELF, SPELL_ENERGIZE_BY_OTHER, and SPELL_ENERGIZE_ON_SELF events."] = true,
["Unit Event Filters"] = true,
["Controls which unit identifiers trigger unit events (UNIT_HEALTH, UNIT_COMBAT, etc.). In the base game the same event can fire multiple times for the same unit, once per identifying string (e.g. 'party1', 'raid1', 'mouseover'). Disabling unused identifiers reduces redundant event calls. Note: 'player', 'target', and 'pet' (your own pet) always trigger regardless of these settings, as they are critical."] = true,
["Enable Pet Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for party and raid pet identifiers ('party1pet', 'raid1pet', etc.). Party pets additionally require Enable Party Unit Events to be on; raid pets additionally require Enable Raid Unit Events to be on. Your own pet ('pet') always fires events regardless of this setting."] = true,
["Enable Party Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for party member identifiers ('party1', 'party2', 'party3', 'party4'). Also required alongside Enable Pet Unit Events for party pet identifiers to fire."] = true,
["Enable Raid Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for raid member identifiers ('raid1' through 'raid40'). Also required alongside Enable Pet Unit Events for raid pet identifiers to fire."] = true,
["Enable Mouseover Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for the 'mouseover' unit identifier."] = true,
["Enable GUID Unit Events"] = true,
["Whether to fire unit events (UNIT_HEALTH, UNIT_MANA, UNIT_AURA, etc.) using the raw GUID as the unit token, mirroring SuperWoW behavior. Fires for every unit the client tracks — not just named tokens like 'player', 'party1', 'raid1' — which can cause significant event spam in raids, BGs, and crowded zones. Older addons (e.g. pfUI) written for standard named tokens may have performance issues receiving GUID-based events. Addons needing GUID tracking (e.g. Automarker, Cursive) should use the new dedicated UNIT_HEALTH_GUID, UNIT_MANA_GUID, etc. events instead, allowing this to be safely disabled."] = true,
["Enable GUID Unit Event Filtering"] = true,
["When enabled, suppresses high-frequency GUID events that cause spam in older addons — specifically UNIT_AURA, UNIT_HEALTH, UNIT_MANA, and similar events below UNIT_COMBAT, plus UNIT_NAME_UPDATE, UNIT_PORTRAIT_UPDATE, UNIT_INVENTORY_CHANGED, and PLAYER_GUILD_UPDATE. UNIT_COMBAT_GUID and other less frequent GUID events are still fired. Has no effect if Enable GUID Unit Events is disabled. This is a direct replacement for the 'Filter GUID Events' option in PerfBoost."] = true,
["Preserve Greater Demon Autocast"] = true,
["Whether to remember and restore Felguard/Doomguard autocast preferences when swapping or resummoning those greater demons."] = true,
}
end)
L:RegisterTranslations("zhCN", function()
return {
["|cffffcc00Nampower v2|cffffaaaa not present hiding settings."] = "|cffffcc00Nampower v2|cffffaaaa 未安装,隐藏设置项。",
["update available"] = "|cffffcc00Nampower v2.20.0 更新可用。|cffffcc00 更新前部分设置可能隐藏。请从 https://gitea.com/avitasia/nampower/releases 下载最新 nampower.dll 替换当前版本。",
["Superwow required to display queued spells."] = "需 Superwow 插件显示队列中法术。",
["Enable Per Character Settings"] = "启用角色独立设置",
["Whether to use per character settings for all of the NP_ settings. This will cause settings saved in your character's NampowerSettings.lua to override any global settings in Config.wtf."] = "是否为所有 NP_ 设置启用角色独立配置。启用后,角色 NampowerSettings.lua 中的设置将覆盖 Config.wtf 中的全局设置。",
["Queue Cast Time Spells"] = "队列施法时间法术",
["Whether to enable spell queuing for spells with a cast time"] = "是否对施法时间类法术启用队列功能",
["Queue Instant Spells"] = "队列瞬发法术",
["Whether to enable spell queuing for instant cast spells tied to gcd"] = "是否对涉及公共冷却的瞬发法术启用队列功能",
["Queue On Swing Spells"] = "队列特殊攻击法术",
["Whether to enable on swing spell queuing"] = "是否对特殊攻击类法术(如战士压制)启用队列功能",
["Queue Channeling Spells"] = "队列引导法术",
["Whether to enable channeling spell queuing"] = "是否对引导类法术(如暴风雪)启用队列功能",
["Queue Targeting Spells"] = "队列目标区域法术",
["Whether to enable terrain targeting spell queuing"] = "是否对目标区域类法术(如暴风雪)启用队列功能",
["Queue Spells Coming Off Cooldown"] = "队列冷却结束法术",
["Whether to enable spell queuing for spells coming off cooldown"] = "是否对即将结束冷却的法术启用队列功能",
["Queue Windows"] = "队列窗口设置",
["How much time in ms you have before a cast ends to queue different types of spells"] = "各种法术类型在施法结束前多少毫秒(ms)开始进入队列",
["Spell Queue Window (ms)"] = "法术队列窗口(ms",
["The window in ms before a cast finishes where the next will get queued"] = "当前施法结束前多少毫秒(ms)可将下一个法术加入队列",
["On Swing Buffer Cooldown (ms)"] = "特殊攻击缓冲冷却(ms",
["The cooldown time in ms after an on swing spell before you can queue on swing spells"] = "特殊攻击法术施放后,多少毫秒(ms)内无法再次将同类法术加入队列",
["Channel Queue Window (ms)"] = "引导法术队列窗口(ms",
["The window in ms before a channel finishes where the next will get queued"] = "引导法术结束前多少毫秒(ms)可将下一个法术加入队列",
["Targeting Queue Window (ms)"] = "目标区域法术队列窗口(ms",
["The window in ms before a terrain targeting spell finishes where the next will get queued"] = "目标区域法术结束前多少毫秒(ms)可将下一个法术加入队列",
["Cooldown Queue Window (ms)"] = "冷却结束队列窗口(ms",
["The window in ms before a spell coming off cooldown finishes where the next will get queued"] = "法术冷却结束前多少毫秒(ms)可将该法术加入队列",
["Cast Options"] = "施法选项",
["Options for controlling casting behavior"] = "控制施法行为的选项",
["QOL Options"] = "便利性选项",
["Quality of life options to prevent common issues"] = "用于防止常见错误的便利性选项",
["Chat Bubbles"] = "聊天气泡",
["Chat bubble options"] = "聊天气泡相关选项",
["Chat Bubbles (Say/Yell)"] = "聊天气泡(说话/大喊)",
["Whether to enable chat bubbles for /say and /yell messages."] = "是否为 /say 与 /yell 消息启用聊天气泡。",
["Chat Bubbles (Party)"] = "聊天气泡(队伍)",
["Whether to enable chat bubbles for /party messages."] = "是否为 /party 消息启用聊天气泡。",
["Chat Bubbles (Whisper)"] = "聊天气泡(密语)",
["Whether to enable chat bubbles for /whisper messages."] = "是否为 /whisper 消息启用聊天气泡。",
["Chat Bubbles (Raid)"] = "聊天气泡(团队)",
["Whether to enable chat bubbles for /raid messages."] = "是否为 /raid 消息启用聊天气泡。",
["Chat Bubbles (Battleground)"] = "聊天气泡(战场)",
["Whether to enable chat bubbles for battleground messages."] = "是否为战场消息启用聊天气泡。",
["Chat Bubble Distance"] = "聊天气泡距离",
["The distance in yards to show chat bubbles"] = "显示聊天气泡的最大距离(码)",
["Advanced options"] = "高级选项",
["Collection of various advanced options"] = "各类高级选项集合",
["Spell Events"] = "法术事件",
["Controls optional spell and combat event CVars."] = "控制可选的法术和战斗事件 CVar。",
["Double Cast to End Channel Early"] = "双重施法提前结束引导",
["Whether to allow double casting a spell within 350ms to end channeling on the next tick. Takes into account your ChannelLatencyReductionPercentage."] = "是否允许350毫秒内双重施法以在下一个伤害周期提前结束引导。受引导延迟削减比例影响。",
["Quickcast Targeting Spells on Double Cast"] = "双重施法快速施放目标区域法术",
["Allows casting targeting spells by attempting to cast them twice as opposed to the default client behavior which cancels the targeting indicator"] = "允许通过双次尝试施法来释放目标区域法术,而非默认客户端行为(取消目标指示器)",
["Interrupt Channels Outside Queue Window"] = "队列窗口外允许打断引导",
["Whether to allow interrupting channels (the original client behavior) when trying to cast a spell outside the channeling queue window"] = "在引导法术队列窗口外尝试施法时,是否允许打断引导(默认客户端行为)",
["Retry Server Rejected Spells"] = "重试服务器拒绝的法术",
["Whether to retry spells that are rejected by the server for these reasons: SPELL_FAILED_ITEM_NOT_READY, SPELL_FAILED_NOT_READY, SPELL_FAILED_SPELL_IN_PROGRESS"] = "是否对因以下原因被服务器拒绝的法术进行重试:未准备就绪、未冷却、已有法术施放中",
["Quickcast Targeting Spells"] = "快速施放目标区域法术",
["Whether to enable quick casting for ALL spells with terrain targeting"] = "是否为所有目标区域法术启用快速施放功能",
["Replace Matching Non GCD Category"] = "替换同类型非公共冷却法术",
["Whether to replace any queued non gcd spell when a new non gcd spell with the same non zero StartRecoveryCategory is cast. Most trinkets and spells are category 0 which are ignored by this setting. The primary use case is to switch which potion you have queued."] = "当施放新的非公共冷却法术且其启动类别相同时,是否替换队列中的同类法术。饰品和多数法术属类别0(不受影响),主要用于替换已队列的药水。",
["Optimize Buffer Using Packet Timings"] = "基于封包时间优化缓冲",
["Whether to attempt to optimize your buffer using your latency and server packet timings"] = "是否根据延迟和服务器封包时间优化法术缓冲机制",
["Minimum Buffer Time (ms)"] = "最低缓冲时间(ms",
["The minimum buffer delay in ms added to each cast"] = "为每次施法添加的最小缓冲延迟(毫秒)",
["Non GCD Buffer Time (ms)"] = "非公共冷却缓冲时间(ms",
["The buffer delay in ms added AFTER each cast that is not tied to the gcd"] = "在非公共冷却法术施放后添加的缓冲延迟(毫秒)",
["Max Buffer Increase (ms)"] = "最大缓冲增加量(ms",
["The maximum amount of time in ms to increase the buffer by when the server rejects a cast"] = "当法术被服务器拒绝时,缓冲时间可增加的最大毫秒数",
["Channel Latency Reduction (%)"] = "引导延迟削减比例(%",
["The percentage of your latency to subtract from the end of a channel duration to optimize cast time while hopefully not losing any ticks"] = "为优化施法时间,从引导结束时序中扣除延迟的百分比(避免丢失伤害周期)",
["Queued Spell Display Options"] = "队列法术显示选项",
["Options for displaying an icon for the queued spell"] = "队列中法术图标的显示设置",
["Display queued spell icon"] = "显示队列法术图标",
["Whether to display an icon of the queued spell"] = "是否显示队列中法术的图标",
["Icon size"] = "图标尺寸",
["Change the spell icon size"] = "修改法术图标大小",
["Allow dragging"] = "允许拖动",
["Whether to allow interaction with the queued spell icon so you can move it around"] = "是否允许通过拖动交互调整队列法术图标位置",
["Reset Position"] = "重置位置",
["Reset the position of the queued spell icon"] = "重置队列法术图标位置",
["Show/Hide for positioning"] = "显示/隐藏(用于定位)",
["Test the queued spell icon and position it to your liking"] = "测试队列法术图标位置,按需调整",
["Prevent Right Click Target Change"] = "阻止右键切换目标",
["Whether to prevent right-clicking from changing your current target when in combat. If you don't have a target right click will still change your target even with this on. This is mainly to prevent accidentally changing targets in combat when trying to adjust your camera."] = "战斗中右键点击是否不改变当前目标(无目标时仍可切换)。主要用于调整镜头时避免误切目标。",
["Nameplate Distance"] = "姓名板显示距离",
["The distance in yards to show nameplates"] = "显示姓名板的最大距离(码)",
["Spam Protection"] = "防连点保护",
["Whether to enable spam protection functionality that blocks spamming spells while waiting for the server to respond to your initial cast due to issues spamming can cause"] = "是否启用防连点保护功能,避免在等待服务器响应期间连点施法导致的问题",
["Prevent Right Click PvP Attack"] = "阻止右键PvP攻击",
["Whether to prevent right-clicking on PvP flagged players to avoid accidental PvP attacks"] = "是否防止右键点击PvP标记玩家以避免误触发PvP攻击",
["Prevent Mounting When Buff Capped"] = "Buff满时阻止上坐骑",
["Whether to prevent mounting when you have 32 buffs (buff capped) and are not already mounted. This prevents the issue where you mount but cannot dismount because the mount aura fails to apply due to the buff cap. When blocked, displays an error message."] = "当已有32个增益(Buff已满)且未在坐骑状态时,是否阻止上坐骑,以避免坐骑光环因Buff上限无法施加导致无法下马的问题。被阻止时会显示错误提示。",
["Enable Enhanced Tooltips"] = "启用增强工具提示",
["Whether to enable nampower's tooltip additions such as spell proc chance, ICD, and item cooldown text."] = "是否启用 nampower 的工具提示增强内容,例如法术触发几率、内置冷却时间(ICD)和物品冷却文本。",
["Enable Aura Cast Events"] = "启用光环施放事件",
["Whether to enable AURA_CAST_ON_SELF and AURA_CAST_ON_OTHER events."] = "是否启用 AURA_CAST_ON_SELF 和 AURA_CAST_ON_OTHER 事件。",
["Enable Auto Attack Events"] = "启用自动攻击事件",
["Whether to enable AUTO_ATTACK_SELF and AUTO_ATTACK_OTHER events."] = "是否启用 AUTO_ATTACK_SELF 和 AUTO_ATTACK_OTHER 事件。",
["Enable Spell Start Events"] = "启用法术开始事件",
["Whether to enable SPELL_START_SELF and SPELL_START_OTHER events."] = "是否启用 SPELL_START_SELF 和 SPELL_START_OTHER 事件。",
["Enable Spell Go Events"] = "启用法术释放事件",
["Whether to enable SPELL_GO_SELF and SPELL_GO_OTHER events."] = "是否启用 SPELL_GO_SELF 和 SPELL_GO_OTHER 事件。",
["Enable Spell Heal Events"] = "启用法术治疗事件",
["Whether to enable SPELL_HEAL_BY_SELF, SPELL_HEAL_BY_OTHER, and SPELL_HEAL_ON_SELF events."] = "是否启用 SPELL_HEAL_BY_SELF、SPELL_HEAL_BY_OTHER 和 SPELL_HEAL_ON_SELF 事件。",
["Enable Spell Energize Events"] = "启用法术回能事件",
["Whether to enable SPELL_ENERGIZE_BY_SELF, SPELL_ENERGIZE_BY_OTHER, and SPELL_ENERGIZE_ON_SELF events."] = "是否启用 SPELL_ENERGIZE_BY_SELF、SPELL_ENERGIZE_BY_OTHER 和 SPELL_ENERGIZE_ON_SELF 事件。",
["Unit Event Filters"] = "单位事件过滤器",
["Controls which unit identifiers trigger unit events (UNIT_HEALTH, UNIT_COMBAT, etc.). In the base game the same event can fire multiple times for the same unit, once per identifying string (e.g. 'party1', 'raid1', 'mouseover'). Disabling unused identifiers reduces redundant event calls. Note: 'player', 'target', and 'pet' (your own pet) always trigger regardless of these settings, as they are critical."] = "控制哪些单位标识符触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。在原版游戏中,同一单位可能因多个标识符(如 'party1'、'raid1'、'mouseover')重复触发同一事件。禁用不需要的标识符可减少冗余事件调用。注意:'player'(自身)、'target'(目标)和 'pet'(自己的宠物)始终会触发,不受此处设置影响,因为它们是关键标识符。",
["Enable Pet Unit Events"] = "启用宠物单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for party and raid pet identifiers ('party1pet', 'raid1pet', etc.). Party pets additionally require Enable Party Unit Events to be on; raid pets additionally require Enable Raid Unit Events to be on. Your own pet ('pet') always fires events regardless of this setting."] = "是否为队伍和团队宠物标识符('party1pet'、'raid1pet' 等)触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。队伍宠物还需同时开启「启用队伍单位事件」;团队宠物还需同时开启「启用团队单位事件」。自己的宠物('pet')始终触发事件,不受此设置影响。",
["Enable Party Unit Events"] = "启用队伍单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for party member identifiers ('party1', 'party2', 'party3', 'party4'). Also required alongside Enable Pet Unit Events for party pet identifiers to fire."] = "是否为队伍成员标识符('party1'、'party2'、'party3'、'party4')触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。同时也是队伍宠物标识符触发的必要条件(需与「启用宠物单位事件」共同开启)。",
["Enable Raid Unit Events"] = "启用团队单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for raid member identifiers ('raid1' through 'raid40'). Also required alongside Enable Pet Unit Events for raid pet identifiers to fire."] = "是否为团队成员标识符('raid1' 至 'raid40')触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。同时也是团队宠物标识符触发的必要条件(需与「启用宠物单位事件」共同开启)。",
["Enable Mouseover Unit Events"] = "启用鼠标悬停单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_COMBAT, etc.) for the 'mouseover' unit identifier."] = "是否为 'mouseover'(鼠标悬停)单位标识符触发单位事件(UNIT_HEALTH、UNIT_COMBAT 等)。",
["Enable GUID Unit Events"] = "启用GUID单位事件",
["Whether to fire unit events (UNIT_HEALTH, UNIT_MANA, UNIT_AURA, etc.) using the raw GUID as the unit token, mirroring SuperWoW behavior. Fires for every unit the client tracks — not just named tokens like 'player', 'party1', 'raid1' — which can cause significant event spam in raids, BGs, and crowded zones. Older addons (e.g. pfUI) written for standard named tokens may have performance issues receiving GUID-based events. Addons needing GUID tracking (e.g. Automarker, Cursive) should use the new dedicated UNIT_HEALTH_GUID, UNIT_MANA_GUID, etc. events instead, allowing this to be safely disabled."] = "是否使用原始 GUID 作为单位标识符触发单位事件(UNIT_HEALTH、UNIT_MANA、UNIT_AURA 等),模拟 SuperWoW 行为。此功能会对客户端跟踪的所有单位触发事件——不仅限于 'player'、'party1'、'raid1' 等命名标识符——在团队、战场和人口密集区域可能产生大量事件。为标准命名标识符设计的旧版插件(如 pfUI)在收到 GUID 事件时可能出现性能问题。需要 GUID 跟踪的插件(如 Automarker、Cursive)应改用专用的 UNIT_HEALTH_GUID、UNIT_MANA_GUID 等事件,届时可安全禁用此选项。",
["Enable GUID Unit Event Filtering"] = "启用GUID单位事件过滤",
["When enabled, suppresses high-frequency GUID events that cause spam in older addons — specifically UNIT_AURA, UNIT_HEALTH, UNIT_MANA, and similar events below UNIT_COMBAT, plus UNIT_NAME_UPDATE, UNIT_PORTRAIT_UPDATE, UNIT_INVENTORY_CHANGED, and PLAYER_GUILD_UPDATE. UNIT_COMBAT_GUID and other less frequent GUID events are still fired. Has no effect if Enable GUID Unit Events is disabled. This is a direct replacement for the 'Filter GUID Events' option in PerfBoost."] = "启用后,将屏蔽对旧版插件造成刷屏的高频 GUID 事件——具体包括 UNIT_COMBAT 以下的事件(如 UNIT_AURA、UNIT_HEALTH、UNIT_MANA 等),以及 UNIT_NAME_UPDATE、UNIT_PORTRAIT_UPDATE、UNIT_INVENTORY_CHANGED 和 PLAYER_GUILD_UPDATE。UNIT_COMBAT_GUID 及其他低频 GUID 事件仍会正常触发。若已禁用「启用GUID单位事件」,则此设置无效。此选项直接替代 PerfBoost 中的「过滤GUID事件」功能。",
["Preserve Greater Demon Autocast"] = "保留大型恶魔自动施法",
["Whether to remember and restore Felguard/Doomguard autocast preferences when swapping or resummoning those greater demons."] = "切换或重新召唤地狱守卫/末日守卫时,是否记忆并恢复其自动施法设置。",
}
end)
@@ -1,27 +1,27 @@
## Interface: 11200
## Title: Nampower Settings
## Notes: the companion compatibility addon to the mod of the same name.
## Title-zhCN:|CFFEE7600[模组增强]|R |cff00ffffNampower设置|R|cffff1450[需Nampower模组]
## Notes-zhCN: Nampower模组配套的设置工具,能够根据自己的网络和需要设置该模组内部的各种参数。
## SavedVariablesPerCharacter: NampowerSettingsDB
## X-Embeds: Ace2, FuBarPlugin-2.0, CompostLib, DewDropLib, TabletLib
libs\AceLibrary\AceLibrary.lua
libs\AceOO-2.0\AceOO-2.0.lua
libs\AceAddon-2.0\AceAddon-2.0.lua
libs\AceConsole-2.0\AceConsole-2.0.lua
libs\AceHook-2.1\AceHook-2.1.lua
libs\AceDB-2.0\AceDB-2.0.lua
libs\AceDebug-2.0\AceDebug-2.0.lua
libs\AceEvent-2.0\AceEvent-2.0.lua
libs\AceLocale-2.2\AceLocale-2.2.lua
libs\AceModuleCore-2.0\AceModuleCore-2.0.lua
libs\Dewdrop\Dewdrop-2.0.lua
libs\Tablet\Tablet-2.0.lua
libs\FuBarPlugin\FuBarPlugin-2.0.lua
Localization.lua
settings.lua
helper.lua
## Interface: 11200
## Title: Nampower Settings
## Notes: the companion compatibility addon to the mod of the same name.
## Title-zhCN:|CFFEE7600[模组增强]|R |cff00ffffNampower设置|R|cffff1450[需Nampower模组]
## Notes-zhCN: Nampower模组配套的设置工具,能够根据自己的网络和需要设置该模组内部的各种参数。
## SavedVariablesPerCharacter: NampowerSettingsDB
## X-Embeds: Ace2, FuBarPlugin-2.0, CompostLib, DewDropLib, TabletLib
libs\AceLibrary\AceLibrary.lua
libs\AceOO-2.0\AceOO-2.0.lua
libs\AceAddon-2.0\AceAddon-2.0.lua
libs\AceConsole-2.0\AceConsole-2.0.lua
libs\AceHook-2.1\AceHook-2.1.lua
libs\AceDB-2.0\AceDB-2.0.lua
libs\AceDebug-2.0\AceDebug-2.0.lua
libs\AceEvent-2.0\AceEvent-2.0.lua
libs\AceLocale-2.2\AceLocale-2.2.lua
libs\AceModuleCore-2.0\AceModuleCore-2.0.lua
libs\Dewdrop\Dewdrop-2.0.lua
libs\Tablet\Tablet-2.0.lua
libs\FuBarPlugin\FuBarPlugin-2.0.lua
Localization.lua
settings.lua
helper.lua
@@ -1,12 +0,0 @@
### Nampower settings
See ~~https://gitea.com/avitasia/nampower~~ https://github.com/Emyrk/nampower for in game tooltip for description of each setting.
Access settings in game by right clicking the minimap icon.
### Per Character settings
You can now use different nampower settings for each character. When you enable this option it will save all of your current nampower settings into
WTF\Account\YOUR_ACCOUNT\Nordanaar\YOUR_CHARACTER\SavedVariables\NampowerSettings.lua. Then every time the game loads the settings in that file will overwrite both the nampower defaults and whatever cvars were saved in your main Config.wtf. If you make changes to any settings while this option is enabled it will save to that character's settings file AS WELL AS the main Config.wtf.
#### Queued spell icon display
If you have superwow there is an option (default off) to display an icon for the most recently queued spell (the mini fireball in the castbar). You can resize and position it anywhere.
![img.png](img.png)
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,245 +1,245 @@
--[[
Name: AceDebug-2.0
Revision: $Rev: 17638 $
Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
Inspired By: Ace 1.x by Turan (turan@gryphon.com)
Website: http://www.wowace.com/
Documentation: http://www.wowace.com/index.php/AceDebug-2.0
SVN: http://svn.wowace.com/root/trunk/Ace2/AceDebug-2.0
Description: Mixin to allow for simple debugging capabilities.
Dependencies: AceLibrary, AceOO-2.0
]]
local MAJOR_VERSION = "AceDebug-2.0"
local MINOR_VERSION = "$Revision: 17639 $"
if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end
if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end
if loadstring("return function(...) return ... end") and AceLibrary:HasInstance(MAJOR_VERSION) then return end -- lua51 check
if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0") end
local DEBUGGING, TOGGLE_DEBUGGING
if GetLocale() == "frFR" then
DEBUGGING = "D\195\169boguage"
TOGGLE_DEBUGGING = "Activer/d\195\169sactiver le d\195\169boguage"
elseif GetLocale() == "esES" then
DEBUGGING = "Depurar"
TOGGLE_DEBUGGING = "Activar/desactivar depurar"
elseif GetLocale() == "deDE" then
DEBUGGING = "Debuggen"
TOGGLE_DEBUGGING = "Aktiviert/Deaktiviert Debugging"
elseif GetLocale() == "koKR" then
DEBUGGING = "디버깅"
TOGGLE_DEBUGGING = "디버깅 기능 사용함/사용안함"
elseif GetLocale() == "zhTW" then
DEBUGGING = "除錯"
TOGGLE_DEBUGGING = "啟用/停用除錯功能"
elseif GetLocale() == "zhCN" then
DEBUGGING = "\232\176\131\232\175\149"
TOGGLE_DEBUGGING = "\229\144\175\231\148\168/\231\166\129\231\148\168 \232\176\131\232\175\149"
elseif GetLocale() == "ruRU" then
DEBUGGING = "Отладка"
TOGGLE_DEBUGGING = "Вкл/Выкл отладку для этого аддона."
else -- enUS
DEBUGGING = "Debugging"
TOGGLE_DEBUGGING = "Enable/disable debugging"
end
local table_setn
do
local version = GetBuildInfo()
if string.find(version, "^2%.") then
-- 2.0.0
table_setn = function() end
else
table_setn = table.setn
end
end
local math_mod = math.mod or math.fmod
local AceOO = AceLibrary:GetInstance("AceOO-2.0")
local AceDebug = AceOO.Mixin {"Debug", "CustomDebug", "IsDebugging", "SetDebugging", "SetDebugLevel", "LevelDebug", "CustomLevelDebug", "GetDebugLevel"}
local function print(text, r, g, b, frame, delay)
(frame or DEFAULT_CHAT_FRAME):AddMessage(text, r, g, b, 1, delay or 5)
end
local tmp
function AceDebug:CustomDebug(r, g, b, frame, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
if not self.debugging then return end
local output = string.format("|cff7fff7f(DEBUG) %s:[%s%3d]|r", tostring(self), date("%H:%M:%S"), math_mod(GetTime(), 1) * 1000)
if string.find(tostring(a1), "%%") then
output = output .. " " .. string.format(tostring(a1), tostring(a2), tostring(a3), tostring(a4), tostring(a5), tostring(a6), tostring(a7), tostring(a8), tostring(a9), tostring(a10), tostring(a11), tostring(a12), tostring(a13), tostring(a14), tostring(a15), tostring(a16), tostring(a17), tostring(a18), tostring(a19), tostring(a20))
else
if not tmp then
tmp = {}
end
-- This block dynamically rebuilds the tmp array stopping on the first nil.
table.insert(tmp, output)
table.insert(tmp, tostring(a1))
table.insert(tmp, a2)
table.insert(tmp, a3)
table.insert(tmp, a4)
table.insert(tmp, a5)
table.insert(tmp, a6)
table.insert(tmp, a7)
table.insert(tmp, a8)
table.insert(tmp, a9)
table.insert(tmp, a10)
table.insert(tmp, a11)
table.insert(tmp, a12)
table.insert(tmp, a13)
table.insert(tmp, a14)
table.insert(tmp, a15)
table.insert(tmp, a16)
table.insert(tmp, a17)
table.insert(tmp, a18)
table.insert(tmp, a19)
table.insert(tmp, a20)
while tmp[table.getn(tmp)] == nil do
table.remove(tmp)
end
for k = 1, table.getn(tmp) do
tmp[k] = tostring(tmp[k])
end
output = table.concat(tmp, " ")
for k,v in pairs(tmp) do
tmp[k] = nil
end
table_setn(tmp, 0)
end
print(output, r, g, b, frame or self.debugFrame, delay)
end
function AceDebug:Debug(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
AceDebug.CustomDebug(self, nil, nil, nil, nil, nil, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
end
function AceDebug:IsDebugging()
return self.debugging
end
function AceDebug:SetDebugging(debugging)
self.debugging = debugging
end
-- Takes a number 1-3
-- Level 1: Critical messages that every user should receive
-- Level 2: Should be used for local debugging (function calls, etc)
-- Level 3: Very verbose debugging, will dump everything and anything
-- If set to nil, you will receive no debug information
function AceDebug:SetDebugLevel(level)
AceDebug:argCheck(level, 1, "number", "nil")
if not level then
self.debuglevel = nil
return
end
if level < 1 or level > 3 then
AceDebug:error("Bad argument #1 to `SetDebugLevel`, must be a number 1-3")
end
self.debuglevel = level
end
function AceDebug:GetDebugLevel()
return self.debuglevel
end
function AceDebug:CustomLevelDebug(level, r, g, b, frame, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
if not self.debugging or not self.debuglevel then return end
AceDebug:argCheck(level, 1, "number")
if level < 1 or level > 3 then
AceDebug:error("Bad argument #1 to `LevelDebug`, must be a number 1-3")
end
if level > self.debuglevel then return end
local output = string.format("|cff7fff7f(DEBUG) %s:[%s.%3d]|r", tostring(self), date("%H:%M:%S"), math_mod(GetTime(), 1) * 1000)
if string.find(tostring(a1), "%%") then
output = output .. " " .. string.format(tostring(a1), tostring(a2), tostring(a3), tostring(a4), tostring(a5), tostring(a6), tostring(a7), tostring(a8), tostring(a9), tostring(a10), tostring(a11), tostring(a12), tostring(a13), tostring(a14), tostring(a15), tostring(a16), tostring(a17), tostring(a18), tostring(a19), tostring(a20))
else
if not tmp then
tmp = {}
end
-- This block dynamically rebuilds the tmp array stopping on the first nil.
table.insert(tmp, output)
table.insert(tmp, tostring(a1))
table.insert(tmp, a2)
table.insert(tmp, a3)
table.insert(tmp, a4)
table.insert(tmp, a5)
table.insert(tmp, a6)
table.insert(tmp, a7)
table.insert(tmp, a8)
table.insert(tmp, a9)
table.insert(tmp, a10)
table.insert(tmp, a11)
table.insert(tmp, a12)
table.insert(tmp, a13)
table.insert(tmp, a14)
table.insert(tmp, a15)
table.insert(tmp, a16)
table.insert(tmp, a17)
table.insert(tmp, a18)
table.insert(tmp, a19)
table.insert(tmp, a20)
while tmp[table.getn(tmp)] == nil do
table.remove(tmp)
end
for k = 1, table.getn(tmp) do
tmp[k] = tostring(tmp[k])
end
output = table.concat(tmp, " ")
for k,v in pairs(tmp) do
tmp[k] = nil
end
table_setn(tmp, 0)
end
print(output, r, g, b, frame or self.debugFrame, delay)
end
function AceDebug:LevelDebug(level, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
if not self.debugging or not self.debuglevel then return end
AceDebug:argCheck(level, 1, "number")
if level < 1 or level > 3 then
AceDebug:error("Bad argument #1 to `LevelDebug`, must be a number 1-3")
end
if level > self.debuglevel then return end
AceDebug.CustomLevelDebug(self, level, nil, nil, nil, nil, nil, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
end
local options
function AceDebug:GetAceOptionsDataTable(target)
if not options then
options = {
debug = {
name = DEBUGGING,
desc = TOGGLE_DEBUGGING,
type = "toggle",
get = "IsDebugging",
set = "SetDebugging",
order = -2,
}
}
end
return options
end
AceLibrary:Register(AceDebug, MAJOR_VERSION, MINOR_VERSION, AceDebug.activate)
AceDebug = AceLibrary(MAJOR_VERSION)
--[[
Name: AceDebug-2.0
Revision: $Rev: 17638 $
Developed by: The Ace Development Team (http://www.wowace.com/index.php/The_Ace_Development_Team)
Inspired By: Ace 1.x by Turan (turan@gryphon.com)
Website: http://www.wowace.com/
Documentation: http://www.wowace.com/index.php/AceDebug-2.0
SVN: http://svn.wowace.com/root/trunk/Ace2/AceDebug-2.0
Description: Mixin to allow for simple debugging capabilities.
Dependencies: AceLibrary, AceOO-2.0
]]
local MAJOR_VERSION = "AceDebug-2.0"
local MINOR_VERSION = "$Revision: 17639 $"
if not AceLibrary then error(MAJOR_VERSION .. " requires AceLibrary") end
if not AceLibrary:IsNewVersion(MAJOR_VERSION, MINOR_VERSION) then return end
if loadstring("return function(...) return ... end") and AceLibrary:HasInstance(MAJOR_VERSION) then return end -- lua51 check
if not AceLibrary:HasInstance("AceOO-2.0") then error(MAJOR_VERSION .. " requires AceOO-2.0") end
local DEBUGGING, TOGGLE_DEBUGGING
if GetLocale() == "frFR" then
DEBUGGING = "D\195\169boguage"
TOGGLE_DEBUGGING = "Activer/d\195\169sactiver le d\195\169boguage"
elseif GetLocale() == "esES" then
DEBUGGING = "Depurar"
TOGGLE_DEBUGGING = "Activar/desactivar depurar"
elseif GetLocale() == "deDE" then
DEBUGGING = "Debuggen"
TOGGLE_DEBUGGING = "Aktiviert/Deaktiviert Debugging"
elseif GetLocale() == "koKR" then
DEBUGGING = "디버깅"
TOGGLE_DEBUGGING = "디버깅 기능 사용함/사용안함"
elseif GetLocale() == "zhTW" then
DEBUGGING = "除錯"
TOGGLE_DEBUGGING = "啟用/停用除錯功能"
elseif GetLocale() == "zhCN" then
DEBUGGING = "\232\176\131\232\175\149"
TOGGLE_DEBUGGING = "\229\144\175\231\148\168/\231\166\129\231\148\168 \232\176\131\232\175\149"
elseif GetLocale() == "ruRU" then
DEBUGGING = "Отладка"
TOGGLE_DEBUGGING = "Вкл/Выкл отладку для этого аддона."
else -- enUS
DEBUGGING = "Debugging"
TOGGLE_DEBUGGING = "Enable/disable debugging"
end
local table_setn
do
local version = GetBuildInfo()
if string.find(version, "^2%.") then
-- 2.0.0
table_setn = function() end
else
table_setn = table.setn
end
end
local math_mod = math.mod or math.fmod
local AceOO = AceLibrary:GetInstance("AceOO-2.0")
local AceDebug = AceOO.Mixin {"Debug", "CustomDebug", "IsDebugging", "SetDebugging", "SetDebugLevel", "LevelDebug", "CustomLevelDebug", "GetDebugLevel"}
local function print(text, r, g, b, frame, delay)
(frame or DEFAULT_CHAT_FRAME):AddMessage(text, r, g, b, 1, delay or 5)
end
local tmp
function AceDebug:CustomDebug(r, g, b, frame, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
if not self.debugging then return end
local output = string.format("|cff7fff7f(DEBUG) %s:[%s%3d]|r", tostring(self), date("%H:%M:%S"), math_mod(GetTime(), 1) * 1000)
if string.find(tostring(a1), "%%") then
output = output .. " " .. string.format(tostring(a1), tostring(a2), tostring(a3), tostring(a4), tostring(a5), tostring(a6), tostring(a7), tostring(a8), tostring(a9), tostring(a10), tostring(a11), tostring(a12), tostring(a13), tostring(a14), tostring(a15), tostring(a16), tostring(a17), tostring(a18), tostring(a19), tostring(a20))
else
if not tmp then
tmp = {}
end
-- This block dynamically rebuilds the tmp array stopping on the first nil.
table.insert(tmp, output)
table.insert(tmp, tostring(a1))
table.insert(tmp, a2)
table.insert(tmp, a3)
table.insert(tmp, a4)
table.insert(tmp, a5)
table.insert(tmp, a6)
table.insert(tmp, a7)
table.insert(tmp, a8)
table.insert(tmp, a9)
table.insert(tmp, a10)
table.insert(tmp, a11)
table.insert(tmp, a12)
table.insert(tmp, a13)
table.insert(tmp, a14)
table.insert(tmp, a15)
table.insert(tmp, a16)
table.insert(tmp, a17)
table.insert(tmp, a18)
table.insert(tmp, a19)
table.insert(tmp, a20)
while tmp[table.getn(tmp)] == nil do
table.remove(tmp)
end
for k = 1, table.getn(tmp) do
tmp[k] = tostring(tmp[k])
end
output = table.concat(tmp, " ")
for k,v in pairs(tmp) do
tmp[k] = nil
end
table_setn(tmp, 0)
end
print(output, r, g, b, frame or self.debugFrame, delay)
end
function AceDebug:Debug(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
AceDebug.CustomDebug(self, nil, nil, nil, nil, nil, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
end
function AceDebug:IsDebugging()
return self.debugging
end
function AceDebug:SetDebugging(debugging)
self.debugging = debugging
end
-- Takes a number 1-3
-- Level 1: Critical messages that every user should receive
-- Level 2: Should be used for local debugging (function calls, etc)
-- Level 3: Very verbose debugging, will dump everything and anything
-- If set to nil, you will receive no debug information
function AceDebug:SetDebugLevel(level)
AceDebug:argCheck(level, 1, "number", "nil")
if not level then
self.debuglevel = nil
return
end
if level < 1 or level > 3 then
AceDebug:error("Bad argument #1 to `SetDebugLevel`, must be a number 1-3")
end
self.debuglevel = level
end
function AceDebug:GetDebugLevel()
return self.debuglevel
end
function AceDebug:CustomLevelDebug(level, r, g, b, frame, delay, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
if not self.debugging or not self.debuglevel then return end
AceDebug:argCheck(level, 1, "number")
if level < 1 or level > 3 then
AceDebug:error("Bad argument #1 to `LevelDebug`, must be a number 1-3")
end
if level > self.debuglevel then return end
local output = string.format("|cff7fff7f(DEBUG) %s:[%s.%3d]|r", tostring(self), date("%H:%M:%S"), math_mod(GetTime(), 1) * 1000)
if string.find(tostring(a1), "%%") then
output = output .. " " .. string.format(tostring(a1), tostring(a2), tostring(a3), tostring(a4), tostring(a5), tostring(a6), tostring(a7), tostring(a8), tostring(a9), tostring(a10), tostring(a11), tostring(a12), tostring(a13), tostring(a14), tostring(a15), tostring(a16), tostring(a17), tostring(a18), tostring(a19), tostring(a20))
else
if not tmp then
tmp = {}
end
-- This block dynamically rebuilds the tmp array stopping on the first nil.
table.insert(tmp, output)
table.insert(tmp, tostring(a1))
table.insert(tmp, a2)
table.insert(tmp, a3)
table.insert(tmp, a4)
table.insert(tmp, a5)
table.insert(tmp, a6)
table.insert(tmp, a7)
table.insert(tmp, a8)
table.insert(tmp, a9)
table.insert(tmp, a10)
table.insert(tmp, a11)
table.insert(tmp, a12)
table.insert(tmp, a13)
table.insert(tmp, a14)
table.insert(tmp, a15)
table.insert(tmp, a16)
table.insert(tmp, a17)
table.insert(tmp, a18)
table.insert(tmp, a19)
table.insert(tmp, a20)
while tmp[table.getn(tmp)] == nil do
table.remove(tmp)
end
for k = 1, table.getn(tmp) do
tmp[k] = tostring(tmp[k])
end
output = table.concat(tmp, " ")
for k,v in pairs(tmp) do
tmp[k] = nil
end
table_setn(tmp, 0)
end
print(output, r, g, b, frame or self.debugFrame, delay)
end
function AceDebug:LevelDebug(level, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
if not self.debugging or not self.debuglevel then return end
AceDebug:argCheck(level, 1, "number")
if level < 1 or level > 3 then
AceDebug:error("Bad argument #1 to `LevelDebug`, must be a number 1-3")
end
if level > self.debuglevel then return end
AceDebug.CustomLevelDebug(self, level, nil, nil, nil, nil, nil, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
end
local options
function AceDebug:GetAceOptionsDataTable(target)
if not options then
options = {
debug = {
name = DEBUGGING,
desc = TOGGLE_DEBUGGING,
type = "toggle",
get = "IsDebugging",
set = "SetDebugging",
order = -2,
}
}
end
return options
end
AceLibrary:Register(AceDebug, MAJOR_VERSION, MINOR_VERSION, AceDebug.activate)
AceDebug = AceLibrary(MAJOR_VERSION)
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More