Compare commits
91 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 297c3813d3 | |||
| bb98661212 | |||
| 6f1fdcb48d | |||
| 3568a580aa | |||
| 310bff4e06 | |||
| c3f679ab74 | |||
| 6a1f8eec89 | |||
| 0bb6b0ef84 | |||
| 295cb6df52 | |||
| fbd6ea47f2 | |||
| a64279ed7e | |||
| 87219cb4eb | |||
| da17074a63 | |||
| b8826370c6 | |||
| d1d68cb44a | |||
| 999f7e94bd | |||
| 7c57abd69f | |||
| e649402163 | |||
| a1c9172beb | |||
| b408c8a95d | |||
| f88a303327 | |||
| 8ad6a2aca3 | |||
| 36ac3dbd1d | |||
| 24d1ae71d9 | |||
| 9cef99f0ff | |||
| f409ffad12 | |||
| c1f7eaa153 | |||
| b455db0db8 | |||
| 1fb284cb5c | |||
| ebd8d81924 | |||
| 362084b829 | |||
| 656cf2d07d | |||
| bfe51f6ad4 | |||
| 2a3107a78d | |||
| 48826e21d6 | |||
| 15c476c12d | |||
| 6c4d7244c3 | |||
| 9fb80102c8 | |||
| 7028258084 | |||
| 5966eb0ffc | |||
| 90c8db0b04 | |||
| 9240bf1243 | |||
| 88f8dcb0e7 | |||
| 9cb3c79dbe | |||
| 75e3b59442 | |||
| 030c2307c2 | |||
| 27d54f15a2 | |||
| 5e18c2b766 | |||
| 1c85341b1f | |||
| ef02839ea0 | |||
| 377927b878 | |||
| a251e56c59 | |||
| 7de018f7eb | |||
| abb25f56d1 | |||
| 7a92231614 | |||
| f2952c905a | |||
| 8abd40f217 | |||
| 34cc87a5f9 | |||
| f986fdcddd | |||
| a212717c37 | |||
| 49cb354133 | |||
| 7298d89c9a | |||
| 3a2ae82593 | |||
| 16717acdd3 | |||
| d96123e661 | |||
| 8a0da95ed2 | |||
| 8363b1b6c8 | |||
| 2874119c6d | |||
| 56fa2fc7f7 | |||
| 5deb9e3255 | |||
| ecd8eacb1f | |||
| 1811c0ec35 | |||
| fae3ff5028 | |||
| 20a24b7935 | |||
| 526022e2bc | |||
| 4a1f4d02f0 | |||
| 4d2a80ddb8 | |||
| 81df32963f | |||
| 2b98ddeadd | |||
| 4c999bee3f | |||
| ba1cca9521 | |||
| b797877558 | |||
| 326644bbac | |||
| 36fdf9af82 | |||
| 579574acb3 | |||
| 63ab74b4fb | |||
| df7e943a74 | |||
| 203356aca8 | |||
| e2bed00b5c | |||
| fdc5849a69 | |||
| 2f8c374569 |
@@ -0,0 +1,161 @@
|
|||||||
|
# When a release is published on this repo (or manual dispatch):
|
||||||
|
# 1. Builds the Electron launcher from that tag (npm run pack:win).
|
||||||
|
# 2. Downloads any assets attached to the same release on this repo (patches, Wow exe, …).
|
||||||
|
# 3. Merges them (launcher files win on name collision) and creates/updates the matching
|
||||||
|
# release on Fractured-Distro.
|
||||||
|
#
|
||||||
|
# Setup (GitHub → Settings → Secrets and variables → Actions):
|
||||||
|
# DISTRO_SYNC_TOKEN — PAT with releases write on Fractured-Distro (see repo README).
|
||||||
|
#
|
||||||
|
# Change DISTRO_REPO or the job `if:` if your GitHub slugs differ.
|
||||||
|
|
||||||
|
name: Sync release to Fractured-Distro
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: 'Release tag on this repo (must exist; e.g. v1.0.0)'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
DISTRO_REPO: Dawnforger/Fractured-Distro
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
meta:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.repository == 'HighSocietyRaiding/Fractured'
|
||||||
|
outputs:
|
||||||
|
tag: ${{ steps.t.outputs.tag }}
|
||||||
|
steps:
|
||||||
|
- name: Resolve tag
|
||||||
|
id: t
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||||
|
echo "tag=${{ inputs.tag }}" >> "$GITHUB_OUTPUT"
|
||||||
|
else
|
||||||
|
echo "tag=${{ github.event.release.tag_name }}" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
|
||||||
|
build-electron:
|
||||||
|
needs: meta
|
||||||
|
if: github.repository == 'HighSocietyRaiding/Fractured'
|
||||||
|
runs-on: windows-latest
|
||||||
|
timeout-minutes: 45
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ needs.meta.outputs.tag }}
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: tools/fractured-launcher-electron/package-lock.json
|
||||||
|
|
||||||
|
- name: Install and pack (NSIS + portable)
|
||||||
|
working-directory: tools/fractured-launcher-electron
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
npm run pack:win
|
||||||
|
|
||||||
|
- name: Stage launcher files for upload
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
New-Item -ItemType Directory -Force -Path launcher-publish | Out-Null
|
||||||
|
Copy-Item tools/fractured-launcher-electron/dist/*.exe launcher-publish/
|
||||||
|
if (Test-Path tools/fractured-launcher-electron/dist/latest.yml) {
|
||||||
|
Copy-Item tools/fractured-launcher-electron/dist/latest.yml launcher-publish/
|
||||||
|
}
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: electron-dist
|
||||||
|
path: launcher-publish/
|
||||||
|
|
||||||
|
sync-distro:
|
||||||
|
needs: [meta, build-electron]
|
||||||
|
if: github.repository == 'HighSocietyRaiding/Fractured'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.repository.default_branch }}
|
||||||
|
sparse-checkout: |
|
||||||
|
tools/fractured-launcher-electron/scripts
|
||||||
|
sparse-checkout-cone-mode: true
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: electron-dist
|
||||||
|
path: /tmp/electron
|
||||||
|
|
||||||
|
- name: Merge main release assets + Electron build
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
. tools/fractured-launcher-electron/scripts/release-sync-filters.sh
|
||||||
|
TAG="${{ needs.meta.outputs.tag }}"
|
||||||
|
mkdir -p combined
|
||||||
|
mkdir -p /tmp/from-main
|
||||||
|
if gh release download "$TAG" -R "${{ github.repository }}" -D /tmp/from-main 2>/tmp/dl.err; then
|
||||||
|
shopt -s nullglob
|
||||||
|
for f in /tmp/from-main/*; do
|
||||||
|
if [ -f "$f" ]; then
|
||||||
|
bn=$(basename "$f")
|
||||||
|
if should_skip_existing_launcher_artifact "$bn"; then
|
||||||
|
echo "Skipping GitHub release asset (CI launcher or excluded): $bn"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
cp -f "$f" combined/
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "Merged assets from ${{ github.repository }} release $TAG"
|
||||||
|
else
|
||||||
|
echo "Main release download note (continuing with launcher only):"
|
||||||
|
cat /tmp/dl.err || true
|
||||||
|
fi
|
||||||
|
shopt -s nullglob
|
||||||
|
for f in /tmp/electron/*; do
|
||||||
|
if [ -f "$f" ]; then
|
||||||
|
cp -f "$f" combined/
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "Combined directory:"
|
||||||
|
ls -la combined/
|
||||||
|
|
||||||
|
- name: Upload to Fractured-Distro
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.DISTRO_SYNC_TOKEN }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
if [ -z "${GH_TOKEN:-}" ]; then
|
||||||
|
echo "Missing secret DISTRO_SYNC_TOKEN (PAT with access to $DISTRO_REPO)."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
TAG="${{ needs.meta.outputs.tag }}"
|
||||||
|
shopt -s nullglob
|
||||||
|
files=(combined/*)
|
||||||
|
if [ "${#files[@]}" -eq 0 ]; then
|
||||||
|
echo "Nothing to upload (Electron pack produced no files?)."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
SRC_URL="https://github.com/${{ github.repository }}/releases/tag/${TAG}"
|
||||||
|
if gh release view "$TAG" -R "$DISTRO_REPO" &>/dev/null; then
|
||||||
|
gh release upload "$TAG" -R "$DISTRO_REPO" "${files[@]}" --clobber
|
||||||
|
echo "Uploaded (clobber) to $DISTRO_REPO release $TAG"
|
||||||
|
else
|
||||||
|
gh release create "$TAG" -R "$DISTRO_REPO" \
|
||||||
|
--title "Fractured $TAG" \
|
||||||
|
--notes "Synced from [$TAG]($SRC_URL) on ${{ github.repository }}. Includes CI-built Electron launcher + release assets." \
|
||||||
|
"${files[@]}"
|
||||||
|
echo "Created $DISTRO_REPO release $TAG with ${#files[@]} asset(s)."
|
||||||
|
fi
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# Verifies Electron launcher Windows pack and uploads installers for testing.
|
||||||
|
|
||||||
|
name: Fractured launcher CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [master, main]
|
||||||
|
paths:
|
||||||
|
- 'tools/fractured-launcher-electron/**'
|
||||||
|
- '.github/workflows/fractured-launcher-ci.yml'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'tools/fractured-launcher-electron/**'
|
||||||
|
- '.github/workflows/fractured-launcher-ci.yml'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: fractured-launcher-ci-${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
electron-launcher-windows:
|
||||||
|
runs-on: windows-latest
|
||||||
|
timeout-minutes: 45
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: tools/fractured-launcher-electron
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: tools/fractured-launcher-electron/package-lock.json
|
||||||
|
|
||||||
|
- name: Install and pack (NSIS + portable)
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
npm run pack:win
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: fractured-launcher-electron-windows-${{ github.run_id }}
|
||||||
|
if-no-files-found: warn
|
||||||
|
path: |
|
||||||
|
tools/fractured-launcher-electron/dist/*.exe
|
||||||
|
tools/fractured-launcher-electron/dist/latest.yml
|
||||||
|
|
||||||
|
electron-launcher-linux:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 45
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: tools/fractured-launcher-electron
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: tools/fractured-launcher-electron/package-lock.json
|
||||||
|
|
||||||
|
- name: Install and pack (AppImage)
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
npm run pack:linux
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: fractured-launcher-electron-linux-${{ github.run_id }}
|
||||||
|
if-no-files-found: warn
|
||||||
|
path: |
|
||||||
|
tools/fractured-launcher-electron/dist/*.AppImage
|
||||||
|
tools/fractured-launcher-electron/dist/latest.yml
|
||||||
|
tools/fractured-launcher-electron/dist/latest-linux.yml
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
# Player-facing binaries live on self-hosted Gitea releases (same tag as this run).
|
||||||
|
# This workflow builds the Electron launcher (Windows + Linux) and uploads it together with
|
||||||
|
# whatever attachments already exist on that Gitea release (patches, Wow exe, …). It does **not**
|
||||||
|
# copy from GitHub releases anymore — create/publish the release on Gitea first, then run CI.
|
||||||
|
#
|
||||||
|
# Triggers:
|
||||||
|
# - release: published / released → GitHub “Release” (optional hook; tag must match Gitea).
|
||||||
|
# - workflow_dispatch → Actions → this workflow → “Run workflow” (enter tag = Gitea release tag).
|
||||||
|
#
|
||||||
|
# Troubleshooting: “Re-run failed jobs” on an OLD run replays the *original* workflow
|
||||||
|
# YAML. After changing this file on default branch, start a *new* run via “Run workflow”.
|
||||||
|
#
|
||||||
|
# Important: the Gitea release for the chosen tag must already exist with non-launcher assets
|
||||||
|
# if you expect them on the final upload (CI rewrites all attachments on that release).
|
||||||
|
#
|
||||||
|
# Steps: Windows (NSIS+portable) + Linux (AppImage) in parallel, launcher from DEFAULT BRANCH
|
||||||
|
# overlay on tag checkout → download existing Gitea attachments → merge CI launcher → upload to Gitea.
|
||||||
|
#
|
||||||
|
# Secrets: GITEA_BASE_URL, GITEA_TOKEN, GITEA_OWNER, GITEA_REPO
|
||||||
|
# Optional variable: GITEA_TARGET_REF (see tools/fractured-launcher-electron/README.md)
|
||||||
|
#
|
||||||
|
# Job guard: edit `if:` if github.repository is not HighSocietyRaiding/Fractured.
|
||||||
|
|
||||||
|
name: Gitea release — attach launcher builds
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published, released]
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: 'Gitea release tag (e.g. v0.7.11-paragon-foo). Must match an existing Gitea release on GITEA_OWNER/GITEA_REPO.'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: gitea-release-sync-${{ github.repository }}-${{ github.event_name == 'workflow_dispatch' && github.event.inputs.tag || github.event.release.tag_name }}
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
meta:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.repository == 'HighSocietyRaiding/Fractured'
|
||||||
|
outputs:
|
||||||
|
tag: ${{ steps.t.outputs.tag }}
|
||||||
|
steps:
|
||||||
|
- name: Resolve tag
|
||||||
|
id: t
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||||
|
RAW="${{ github.event.inputs.tag }}"
|
||||||
|
else
|
||||||
|
RAW="${{ github.event.release.tag_name }}"
|
||||||
|
fi
|
||||||
|
TAG="$(printf '%s' "$RAW" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
|
||||||
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||||
|
if [ -z "$TAG" ]; then
|
||||||
|
echo '::error::Tag input is empty. Paste the git tag (e.g. v0.7.11-…).'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if printf '%s' "$TAG" | grep -q '[[:space:]]'; then
|
||||||
|
echo '::error::Tag contains whitespace — use the exact Gitea tag (e.g. v0.7.11-…), not the release title.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
{
|
||||||
|
echo "tag<<__TAG_EOF__"
|
||||||
|
echo "$TAG"
|
||||||
|
echo "__TAG_EOF__"
|
||||||
|
} >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
build-electron:
|
||||||
|
needs: meta
|
||||||
|
if: github.repository == 'HighSocietyRaiding/Fractured'
|
||||||
|
runs-on: windows-latest
|
||||||
|
timeout-minutes: 45
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ needs.meta.outputs.tag }}
|
||||||
|
|
||||||
|
# Release tags often point at server/game commits that predate launcher lib fixes.
|
||||||
|
# Always pack the launcher from default branch so app.asar includes the full tree.
|
||||||
|
- name: Overlay launcher from default branch
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
DB="${{ github.event.repository.default_branch }}"
|
||||||
|
git fetch --no-tags --depth=1 origin "+refs/heads/${DB}:refs/remotes/origin/${DB}"
|
||||||
|
git checkout "origin/${DB}" -- tools/fractured-launcher-electron
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: tools/fractured-launcher-electron/package-lock.json
|
||||||
|
|
||||||
|
- name: Install and pack (NSIS + portable)
|
||||||
|
working-directory: tools/fractured-launcher-electron
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
node -p "'Launcher package.json version: ' + require('./package.json').version"
|
||||||
|
npm run pack:win
|
||||||
|
|
||||||
|
- name: Stage launcher files for upload
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
New-Item -ItemType Directory -Force -Path launcher-publish | Out-Null
|
||||||
|
Copy-Item tools/fractured-launcher-electron/dist/*.exe launcher-publish/
|
||||||
|
if (Test-Path tools/fractured-launcher-electron/dist/latest.yml) {
|
||||||
|
Copy-Item tools/fractured-launcher-electron/dist/latest.yml launcher-publish/
|
||||||
|
}
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: electron-dist-windows
|
||||||
|
path: launcher-publish/
|
||||||
|
|
||||||
|
build-electron-linux:
|
||||||
|
needs: meta
|
||||||
|
if: github.repository == 'HighSocietyRaiding/Fractured'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 45
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ needs.meta.outputs.tag }}
|
||||||
|
|
||||||
|
- name: Overlay launcher from default branch
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
DB="${{ github.event.repository.default_branch }}"
|
||||||
|
git fetch --no-tags --depth=1 origin "+refs/heads/${DB}:refs/remotes/origin/${DB}"
|
||||||
|
git checkout "origin/${DB}" -- tools/fractured-launcher-electron
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: tools/fractured-launcher-electron/package-lock.json
|
||||||
|
|
||||||
|
- name: Install and pack (AppImage)
|
||||||
|
working-directory: tools/fractured-launcher-electron
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
node -p "'Launcher package.json version: ' + require('./package.json').version"
|
||||||
|
npm run pack:linux
|
||||||
|
|
||||||
|
- name: Stage Linux launcher for upload
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
mkdir -p launcher-linux-publish
|
||||||
|
shopt -s nullglob
|
||||||
|
cp -f tools/fractured-launcher-electron/dist/*.AppImage launcher-linux-publish/ 2>/dev/null || true
|
||||||
|
for f in tools/fractured-launcher-electron/dist/latest.yml tools/fractured-launcher-electron/dist/latest-linux.yml; do
|
||||||
|
if [ -f "$f" ]; then cp -f "$f" launcher-linux-publish/; fi
|
||||||
|
done
|
||||||
|
ls -la launcher-linux-publish/
|
||||||
|
if ! compgen -G "launcher-linux-publish/*.AppImage" > /dev/null; then
|
||||||
|
echo "No AppImage under dist/ — electron-builder linux target failed" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: electron-dist-linux
|
||||||
|
path: launcher-linux-publish/
|
||||||
|
|
||||||
|
sync-gitea:
|
||||||
|
needs: [meta, build-electron, build-electron-linux]
|
||||||
|
if: github.repository == 'HighSocietyRaiding/Fractured'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
GITEA_BASE_URL: ${{ secrets.GITEA_BASE_URL }}
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
GITEA_OWNER: ${{ secrets.GITEA_OWNER }}
|
||||||
|
GITEA_REPO: ${{ secrets.GITEA_REPO }}
|
||||||
|
GITEA_TARGET_REF: ${{ vars.GITEA_TARGET_REF }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
# Script may not exist on older release tags; always use default branch.
|
||||||
|
ref: ${{ github.event.repository.default_branch }}
|
||||||
|
sparse-checkout: |
|
||||||
|
tools/fractured-launcher-electron/scripts
|
||||||
|
sparse-checkout-cone-mode: true
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: electron-dist-windows
|
||||||
|
path: /tmp/electron-win
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: electron-dist-linux
|
||||||
|
path: /tmp/electron-linux
|
||||||
|
|
||||||
|
- name: Merge Gitea release assets + Electron build
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
TAG="${{ needs.meta.outputs.tag }}"
|
||||||
|
mkdir -p combined
|
||||||
|
mkdir -p /tmp/from-gitea
|
||||||
|
bash tools/fractured-launcher-electron/scripts/download-release-from-gitea.sh /tmp/from-gitea "$TAG"
|
||||||
|
shopt -s nullglob
|
||||||
|
for f in /tmp/from-gitea/*; do
|
||||||
|
if [ -f "$f" ]; then
|
||||||
|
cp -f "$f" combined/
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
for f in /tmp/electron-win/* /tmp/electron-linux/*; do
|
||||||
|
if [ -f "$f" ]; then
|
||||||
|
cp -f "$f" combined/
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
ls -la combined/
|
||||||
|
|
||||||
|
- name: Upload to Gitea
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
for v in GITEA_BASE_URL GITEA_TOKEN GITEA_OWNER GITEA_REPO; do
|
||||||
|
if [ -z "${!v:-}" ]; then
|
||||||
|
echo "Missing secret $v — add it under repo Settings → Secrets and variables → Actions." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
bash tools/fractured-launcher-electron/scripts/upload-release-to-gitea.sh combined "${{ needs.meta.outputs.tag }}"
|
||||||
+11
@@ -23,6 +23,7 @@
|
|||||||
/data/sql/custom/*
|
/data/sql/custom/*
|
||||||
/src/server/scripts/Custom/*
|
/src/server/scripts/Custom/*
|
||||||
!/src/server/scripts/Custom/README.md
|
!/src/server/scripts/Custom/README.md
|
||||||
|
!/src/server/scripts/Custom/custom_script_loader.cpp
|
||||||
|
|
||||||
/*.override.yml
|
/*.override.yml
|
||||||
/*.override.yaml
|
/*.override.yaml
|
||||||
@@ -117,5 +118,15 @@ local.properties
|
|||||||
!/modules/mod-paragon/**
|
!/modules/mod-paragon/**
|
||||||
!/modules/mod-ale/
|
!/modules/mod-ale/
|
||||||
!/modules/mod-ale/**
|
!/modules/mod-ale/**
|
||||||
|
!/modules/mod-transmog/
|
||||||
|
!/modules/mod-transmog/**
|
||||||
|
!/modules/mod-aoe-loot/
|
||||||
|
!/modules/mod-aoe-loot/**
|
||||||
# Team Docker: ALE needs Lua at configure time (see mod-ale docs)
|
# Team Docker: ALE needs Lua at configure time (see mod-ale docs)
|
||||||
!docker-compose.override.yml
|
!docker-compose.override.yml
|
||||||
|
|
||||||
|
# Local build artifacts (do not commit)
|
||||||
|
build-worldserver.log
|
||||||
|
|
||||||
|
# Local logs parked under contrib/fractured-dev-extras (see README there)
|
||||||
|
contrib/fractured-dev-extras/*.log
|
||||||
|
|||||||
+1
-1
@@ -106,7 +106,7 @@ include(ConfigInstall)
|
|||||||
CU_RUN_HOOK("AFTER_LOAD_CMAKE_MODULES")
|
CU_RUN_HOOK("AFTER_LOAD_CMAKE_MODULES")
|
||||||
|
|
||||||
find_package(PCHSupport)
|
find_package(PCHSupport)
|
||||||
find_package(MySQL REQUIRED)
|
find_package(MySQL REQUIRED COMPONENTS lib)
|
||||||
|
|
||||||
if(UNIX AND WITH_PERFTOOLS)
|
if(UNIX AND WITH_PERFTOOLS)
|
||||||
find_package(Gperftools)
|
find_package(Gperftools)
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
# Fractured / Paragon — Balance Backlog
|
||||||
|
|
||||||
|
Open balance / scaling questions surfaced by play-testers that have not yet
|
||||||
|
been actioned. Each entry should record the *symptom*, the *suspected cause*
|
||||||
|
based on a quick code dive, the *option set* we discussed, and any *links*
|
||||||
|
to relevant code. Knock items off as they ship.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Feral Cat scaling feels weak (2026-05-11)
|
||||||
|
|
||||||
|
**Reporter feedback:**
|
||||||
|
|
||||||
|
> "Weapons don't automatically feature feral AP on this server and nothing
|
||||||
|
> is currently rescaled resulting in a super low feral scale. We can either
|
||||||
|
> rescale their abilities or add the AP back to all weapons."
|
||||||
|
>
|
||||||
|
> Resident Feral expert: "this is not a bear issue unfortunately, I have
|
||||||
|
> 11k AP" / "Stam > AP and Armor > AP means this is completely a cat issue."
|
||||||
|
|
||||||
|
**What's actually happening on the server:**
|
||||||
|
|
||||||
|
Feral AP *is* being granted on weapons — `ItemTemplate::getFeralBonus`
|
||||||
|
(`src/server/game/Entities/Item/ItemTemplate.h`) synthesises it from the
|
||||||
|
weapon's DPS for any weapon with `INVTYPE_WEAPON / 2HWEAPON / WEAPONMAINHAND
|
||||||
|
/ WEAPONOFFHAND`:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
int32 bonus = int32((extraDPS + getDPS()) * 14.0f) - 767;
|
||||||
|
```
|
||||||
|
|
||||||
|
That's then routed through `Player::ApplyFeralAPBonus` (Player.cpp ~6896)
|
||||||
|
into `m_baseFeralAP`, which `Player::UpdateAttackPowerAndDamage` adds into
|
||||||
|
the cat / bear formulas in `src/server/game/Entities/Unit/StatSystem.cpp`
|
||||||
|
(~line 477):
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
case FORM_CAT:
|
||||||
|
val2 = (level * mLevelMult) + STR*2 + AGI - 20 + weapon_bonus + m_baseFeralAP;
|
||||||
|
break;
|
||||||
|
case FORM_BEAR:
|
||||||
|
case FORM_DIREBEAR:
|
||||||
|
val2 = (level * mLevelMult) + STR*2 - 20 + weapon_bonus + m_baseFeralAP;
|
||||||
|
break;
|
||||||
|
```
|
||||||
|
|
||||||
|
So bear and cat get the same `m_baseFeralAP` — the only delta is `+ AGI` for
|
||||||
|
cat. The "bears feel fine, cats feel weak" complaint is real; it's because
|
||||||
|
bear damage is rage / proc / mitigation driven (Lacerate stack, Savage
|
||||||
|
Defense, Pulverize-style talents) while cat damage is much more
|
||||||
|
AP-coefficient driven (Shred, Mangle, Rake, Rip, FB).
|
||||||
|
|
||||||
|
**Options discussed (pick when we revisit):**
|
||||||
|
|
||||||
|
| ID | Lever | Pros | Cons |
|
||||||
|
|----|-------|------|------|
|
||||||
|
| A | Bump the cat AP formula (e.g. `+ AGI*1.5`) | Cleanest, very tunable, hits both auto-attacks and abilities | Blunt instrument, also affects PvP |
|
||||||
|
| B | Boost cat-form ability coefficients (Shred / Rake / Rip / Mangle / FB) via spellmod auras | Most retail-faithful, surgical | More moving parts, harder to communicate |
|
||||||
|
| C | Increase `getFeralBonus` payout for druid weapons (e.g. `* 18.0f` or drop the `-767` floor) | Single-line change | Buffs bears too — bears are already fine, would over-buff |
|
||||||
|
| D | New Cat-only passive "Predator's Edge" = `+X% physical damage in Cat Form` | Easy to balance, easy to communicate, easy to undo | Adds another aura to track |
|
||||||
|
|
||||||
|
**Recommendation when we pick this back up:** start with **D + small A** —
|
||||||
|
D is the readable "+15-20% cat damage" knob, A is a backup if AP-scaling
|
||||||
|
abilities (Mangle / FB) still feel weak relative to bleeds. Both are
|
||||||
|
trivially tunable via a single config knob during play-testing.
|
||||||
|
|
||||||
|
Do **not** pick C — it over-buffs bears, which the Feral expert explicitly
|
||||||
|
said are already fine.
|
||||||
|
|
||||||
|
**Resolution (2026-05-11, second pass):** Per the resident Feral expert
|
||||||
|
("instead of adding a new passive, you could probably just increase Cat
|
||||||
|
Form's Master Shapeshifter value along with its tooltip, alongside buffing
|
||||||
|
the agi scaling") we shipped a hybrid of **A** and a *cat-only* knob that
|
||||||
|
sits next to **D** but reuses an existing aura instead of inventing a new
|
||||||
|
one:
|
||||||
|
|
||||||
|
* `StatSystem.cpp` `UpdateAttackPowerAndDamage` FORM_CAT branch now
|
||||||
|
reads `+ GetStat(STAT_AGILITY) * 2.0f` (stock 1.0). FORM_BEAR /
|
||||||
|
FORM_DIREBEAR / FORM_MOONKIN are untouched, so bear's "already fine"
|
||||||
|
state is preserved.
|
||||||
|
* `SpellAuraEffects.cpp` Master Shapeshifter FORM_CAT branch multiplies
|
||||||
|
the talent's value by 2 before triggering 48420 (cat-form aura).
|
||||||
|
Talent ranks: 2% -> 4% (R1), 4% -> 8% (R2) crit chance in Cat Form.
|
||||||
|
Bear / Moonkin / Tree branches still pass `bp` through unchanged.
|
||||||
|
* Client tooltip drift handled by
|
||||||
|
`fractured-tooling/from-workspace-root/_patch_spell_dbc_feral_tooltips.py`,
|
||||||
|
which appends a `[Fractured]` paragraph to the Description column of
|
||||||
|
Cat Form (768) and Master Shapeshifter ranks (48411 / 48412).
|
||||||
|
|
||||||
|
If field reports after this lands still say cat is weak, the next levers
|
||||||
|
are (in order): bump `2.0f` to `2.5f` in StatSystem.cpp, then bump the
|
||||||
|
Master Shapeshifter cat multiplier from `* 2` to `* 3` in
|
||||||
|
SpellAuraEffects.cpp, then -- only if those are exhausted -- revisit
|
||||||
|
**B** (per-ability spellmod coefficients).
|
||||||
@@ -15,6 +15,58 @@ prerequisites; everything here is just the deltas you need on top of it.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Fractured client + network defaults
|
||||||
|
|
||||||
|
Stock-friendly defaults for fresh local installs. A `git clone` ->
|
||||||
|
`docker compose up` (or native install) lets a single developer log in
|
||||||
|
from the same machine without any post-install config tweaks.
|
||||||
|
|
||||||
|
- **`authserver.conf` -> `RealmServerPort`** = **3724** (stock WoW). A
|
||||||
|
patched `Wow.exe` with `set realmlist 127.0.0.1` (no port) reaches
|
||||||
|
the auth handshake.
|
||||||
|
- **`realmlist` table -> `port`** is the **world** port (default
|
||||||
|
**8085**, matches `WorldServerPort` in `worldserver.conf.dist`).
|
||||||
|
Auth tells the client to handshake to this port for the world hand-off.
|
||||||
|
- **`realmlist` table -> `address`** defaults to **`127.0.0.1`** in the
|
||||||
|
base SQL. The auth server hands this address to clients after login,
|
||||||
|
so 127.0.0.1 means "talk to the world server on the same machine
|
||||||
|
auth is running on" -- correct for solo dev. **Override on production
|
||||||
|
deploys**, see *Production deployment overrides* below.
|
||||||
|
|
||||||
|
### Production deployment overrides
|
||||||
|
|
||||||
|
Production Fractured runs on a remote VPS at `hsrwow.net` with auth
|
||||||
|
bound to a non-stock port (47497 -- 3724 was unavailable on that host).
|
||||||
|
Apply the overrides **once per fresh dbimport** on the production box.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Run against acore_auth on the production database after first dbimport:
|
||||||
|
UPDATE realmlist
|
||||||
|
SET address = 'hsrwow.net',
|
||||||
|
port = 8085 -- world port; leave at 8085 unless changed
|
||||||
|
WHERE id = 1;
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit the production `authserver.conf` (NOT `authserver.conf.dist`)
|
||||||
|
to bind the auth listener to the production port:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
RealmServerPort = 47497
|
||||||
|
```
|
||||||
|
|
||||||
|
Restart the auth server. Production clients connect with:
|
||||||
|
|
||||||
|
```text
|
||||||
|
set realmlist hsrwow.net:47497
|
||||||
|
```
|
||||||
|
|
||||||
|
The Fractured-patched 3.3.5 client supports the `host:port` syntax;
|
||||||
|
stock 3.3.5 clients do not, so any contributor distributing the
|
||||||
|
client bundle for production must include the patched `Wow.exe` from
|
||||||
|
the GitHub release.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## What you get when you build this fork
|
## What you get when you build this fork
|
||||||
|
|
||||||
- Worldserver with `CLASS_PARAGON` and Paragon-aware DK rune / sticky
|
- Worldserver with `CLASS_PARAGON` and Paragon-aware DK rune / sticky
|
||||||
@@ -75,7 +127,7 @@ brew install cmake boost openssl@3 mysql readline ncurses p7zip
|
|||||||
## 2. Clone the repo
|
## 2. Clone the repo
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/Dawnforger/Fractured.git
|
git clone https://git.hisora.dev/HighSocietyRaiding/Fractured.git
|
||||||
cd Fractured
|
cd Fractured
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -172,22 +224,19 @@ The standard AzerothCore three-database layout (`acore_auth`,
|
|||||||
|
|
||||||
Easiest path: run the worldserver once with empty databases and let
|
Easiest path: run the worldserver once with empty databases and let
|
||||||
`AC_FORCE_CREATE_DB=1` populate them, **or** use `dbimport` from the
|
`AC_FORCE_CREATE_DB=1` populate them, **or** use `dbimport` from the
|
||||||
install dir. Then layer the Fractured-specific SQL on top:
|
install dir.
|
||||||
|
|
||||||
```bash
|
The Fractured-specific SQL (mod-paragon) lives under
|
||||||
cd <repo>/modules/mod-paragon/sql
|
`modules/mod-paragon/data/sql/db-{world,characters}/base/` — that's the
|
||||||
|
**AzerothCore-standard module layout**, which means AC's built-in
|
||||||
|
DBUpdater picks it up automatically on every `worldserver` /
|
||||||
|
`dbimport` start. New SQL files are applied; previously-applied ones
|
||||||
|
are skipped via the hash recorded in `acore_world.updates` /
|
||||||
|
`acore_characters.updates`. No manual `mysql < ...` steps required for
|
||||||
|
deploys.
|
||||||
|
|
||||||
# world DB
|
Modify-and-redeploy works the same way: change the file, push, pull on
|
||||||
mysql -u acore -p acore_world < world/base/paragon_gametables.sql
|
the VPS, and the next `dbimport` run sees the new hash and re-applies.
|
||||||
mysql -u acore -p acore_world < world/base/paragon_spell_ae_cost.sql
|
|
||||||
mysql -u acore -p acore_world < world/base/player_class_stats_paragon_basemana.sql
|
|
||||||
|
|
||||||
# characters DB
|
|
||||||
mysql -u acore -p acore_characters < characters/base/character_paragon_currency.sql
|
|
||||||
```
|
|
||||||
|
|
||||||
Re-run any module-specific SQL whenever you pull updates that touch
|
|
||||||
`modules/*/sql/`.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -0,0 +1,269 @@
|
|||||||
|
# Fractured Client Patches
|
||||||
|
|
||||||
|
Binary client artifacts that pair with this server. They live on the
|
||||||
|
[Releases page](https://git.hisora.dev/HighSocietyRaiding/Fractured/releases),
|
||||||
|
**not** in the tree, so the repo stays lean and binaries can be
|
||||||
|
re-downloaded without bloating `git clone`.
|
||||||
|
|
||||||
|
This file is the table of contents and install guide.
|
||||||
|
|
||||||
|
**Launcher (Windows):** The maintained client launcher lives in
|
||||||
|
[`tools/fractured-launcher-electron/`](../../tools/fractured-launcher-electron/)
|
||||||
|
(see its README for build and config). **Public downloads** for the launcher
|
||||||
|
and mirrored patch assets are pushed to
|
||||||
|
[Fractured-Distro releases](https://github.com/Dawnforger/Fractured-Distro/releases)
|
||||||
|
when a release is published here (workflow **Sync release to Fractured-Distro**).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What ships in a release
|
||||||
|
|
||||||
|
| Artifact | Size | Purpose |
|
||||||
|
|---|---|---|
|
||||||
|
| `patch-enUS-4.MPQ` | ~5 MB | DBC + GlueXML bake. Adds `CLASS_PARAGON` (id 12), the character-create slot, glue strings, game-table DBCs, and a patched `Spell.dbc`: **(1)** `RuneCostID` zeroed on every rune-cost spell so non–Death Knight clients still send DK casts (rune costs are shown via `RuneFrame.lua`); **(2)** `Reagent[]` / `ReagentCount[]` zeroed on every spell whose `SpellFamilyName` is non-zero (all class abilities), while profession crafts (`SpellFamilyName == 0`) keep their materials. Both edits mirror server load-time corrections so client preflight and server validation stay aligned. Required for character creation as Paragon to even show up. |
|
||||||
|
| `patch-enUS-5.MPQ` | ~64 KB | FrameXML overrides. Replaces stock `PlayerFrame.lua` / `RuneFrame.lua` / `ComboFrame.lua` / `UnitFrame.lua` / `SpellBookFrame.lua` + `SpellBookFrame.xml` with Paragon-aware versions: rune simulator, combo-point simulator, server-authoritative resource sync over the `PARAA` addon channel, action-button usability + click guards, an expanded spellbook (higher `MAX_SPELLS`, 24 skill-line tabs instead of stock 8) so all-class spells render, Paragon stat tooltips on the character sheet (including filtering duplicate “attack power from strength” lines so the paper doll matches server AP), a tooltip post-processor that appends ", Paragon" to the "Classes:" line on class-restricted gear / glyphs (the server bypasses `AllowableClass` for class 12, but the engine paints the line red and omits Paragon — the Lua hook recolors it green and adds the name so the player can tell it's wearable), a **spell-tooltip post-processor** that (1) recolors and appends "(Paragon: bypassed)" to "Requires *Stance*" lines on Warrior abilities (server-side `SpellInfo::CheckShapeshift` skips stance enforcement for Paragons on `SPELLFAMILY_WARRIOR` spells, but the client still renders the requirement from the stock `Stances` DBC field which we deliberately leave unzeroed so stock Warriors keep enforcement), (2) appends a Paragon line to **Maelstrom Weapon** (53817) noting that Fireball / Frostbolt / Arcane Blast also benefit, and (3) appends a Paragon line to **Mirror Image** (55342) noting that the images cast random damage spells with a cast time from the caster's spellbook instead of Frostbolt — all three patches gate on `UnitClass("player") == "PARAGON"` so stock-class tooltips are byte-identical to vanilla, and **PetFrame** re-anchored so the **pet unit frame sits below the rune row** for Paragon (stock layout had runes overlapping the pet portrait). A **Warrior stance click bypass** wraps `UseAction` so that for Paragon characters, clicking an action slot bound to a stance-gated Warrior ability (Whirlwind, Charge, Pummel, Shield Slam, Hamstring, Overpower, Shield Bash, Shield Block, Disarm, Revenge, Spell Reflection, Recklessness, Bladestorm, Shockwave, Concussion Blow, Last Stand, Sweeping Strikes, Mocking Blow, Heroic Fury, Slam, Devastate, Intercept) routes through `CastSpellByName(name)` instead of the engine's stance-gated `UseAction` path; the engine's stance pre-check inside `UseAction` would otherwise drop the cast packet client-side and our server-side `CheckShapeshift` bypass would never get to run. Stock classes never enter the bypass branch. The paper-doll **ammo slot** follows stock visibility rules (shown for hunters / ranged weapons; hidden when `UnitHasRelicSlot` applies). |
|
||||||
|
| `patch-enUS-6.MPQ` | ~134 KB | The `ParagonAdvancement` addon. Replaces the talent pane (`N` key) for Paragon characters with the Character Advancement panel: per-class spell tabs, talent grid, Overview/Search tabs, AE/TE currency, commit / reset / preview, login-time toast suppression, a **PETS** tab with live hunter pet talent trees (preview learn, no TE/AE cost), a dedicated **Reset Pet Talents** control (server `PARAA` `C RESET PET TALENTS` — instant, no gold, no confirmation; requires matching worldserver), bottom-row **Reset all Abilities / Reset Build / Reset all Talents** disabled while on the PETS tab so those paths cannot dismiss the pet or unlearn Tame Beast, and a **Builds** page (full-pane overlay opened from the bottom-row Builds button) for saving named, icon-tagged loadouts: New Build (+) icon picker reuses `MACRO_ICON_FILENAMES`, right-click for edit/delete, shift-left-click to favorite (favorites bubble to the top), left-click pops a Load Build confirm. Build swaps reset + refund AE/TE, re-spend on the saved recipe, and **park hunter pets** to `PET_SAVE_NOT_IN_SLOT` so their name/talents/exp are preserved across swaps. |
|
||||||
|
| `Wow.exe` | ~7.5 MB | 3.3.5a (build 12340) client byte-patched to skip the MPQ signature check so custom `patch-enUS-N.MPQ` files load. Diff against stock is a few bytes; everything else is unchanged. |
|
||||||
|
|
||||||
|
Server and client work as a pair: the addon talks to `mod-paragon` on the
|
||||||
|
worldserver via `WHISPER` addon-channel messages with the `PARAA` prefix
|
||||||
|
(currency push, spell/talent snapshot, commit, combo points, rune
|
||||||
|
cooldowns, learn-toast silence window, **`C RESET PET TALENTS`**
|
||||||
|
for hunter pet talent resets from the Character Advancement PETS tab,
|
||||||
|
and the **build catalog** verbs `Q BUILDS` / `C BUILD NEW` / `C BUILD
|
||||||
|
EDIT` / `C BUILD DELETE` / `C BUILD FAVORITE` / `C BUILD LOAD` for the
|
||||||
|
saved-loadout system on the Builds page). Build swaps require the
|
||||||
|
matching worldserver image because the swap path is server-driven
|
||||||
|
(snapshot → reset → re-spend → pet park/unpark). Mismatched versions
|
||||||
|
usually manifest as the panel rendering blank or AE/TE reading 0/0.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
You need a 3.3.5a (build 12340) WoW client. ChromieCraft's free 3.3.5a
|
||||||
|
download is the canonical clean source if you don't already have one.
|
||||||
|
|
||||||
|
1. Download every artifact from the latest release matching this server
|
||||||
|
build:
|
||||||
|
`https://git.hisora.dev/HighSocietyRaiding/Fractured/releases` (open the latest release that matches this server build)
|
||||||
|
2. Replace `Wow.exe` at the root of your client install with the patched
|
||||||
|
one from the release. Keep a backup of the original if you want.
|
||||||
|
3. Drop `patch-enUS-4.MPQ`, `patch-enUS-5.MPQ`, `patch-enUS-6.MPQ` into
|
||||||
|
`Data/enUS/`. (For other locales, rename the suffix accordingly —
|
||||||
|
contents are locale-independent, only the filename ordering matters
|
||||||
|
to the loader.)
|
||||||
|
4. Edit `Data/enUS/realmlist.wtf` to point at your server, e.g.
|
||||||
|
`set realmlist your.host.tld`.
|
||||||
|
5. Launch `Wow.exe`. The login screen should reach the realm list. Make
|
||||||
|
a Paragon character (the new class entry on the create screen) and
|
||||||
|
press `N` in-world to open the Character Advancement panel.
|
||||||
|
|
||||||
|
If the panel opens empty / AE+TE read 0/0 / `N` opens the stock talent
|
||||||
|
pane: your client is loading an older `patch-enUS-6.MPQ`, or the
|
||||||
|
worldserver image is older than commit `4d2a80d` (the
|
||||||
|
`character_paragon_panel_spell_revoked` migration). Pull both ends to
|
||||||
|
the same release tag and rebuild the worldserver image.
|
||||||
|
|
||||||
|
If the **client** shows the Paragon class on the create screen but the
|
||||||
|
server replies **Character Creation Failed** (sometimes shown as
|
||||||
|
"Error creating character") when you pick it -- **or** the character
|
||||||
|
is created but spawns with no weapon / armor proficiencies (auto-attack
|
||||||
|
greys out, can't equip anything beyond a fist), or with the proficiency
|
||||||
|
**skills** but no **passive spells** like Block, Parry, Dual Wield --
|
||||||
|
the worldserver is missing one of four pieces of class-12 data. All
|
||||||
|
ship as SQL migrations under
|
||||||
|
`modules/mod-paragon/data/sql/db-world/updates/` and are auto-applied
|
||||||
|
by AzerothCore's DBUpdater on every `ac-db-import` run, but the SQL
|
||||||
|
files are baked into the dbimport Docker image at build time -- so a
|
||||||
|
stale image won't pick up new migrations. Fix:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git pull origin main
|
||||||
|
docker compose build ac-db-import ac-worldserver
|
||||||
|
docker compose up -d ac-db-import
|
||||||
|
docker compose restart ac-worldserver
|
||||||
|
```
|
||||||
|
|
||||||
|
Existing class-12 characters created before these migrations will
|
||||||
|
keep their broken state -- the cascade only fires inside
|
||||||
|
`Player::Create` and `Player::LearnDefaultSkill` at character spawn.
|
||||||
|
Delete the old Paragon and re-roll after the rebuild.
|
||||||
|
|
||||||
|
The four migrations:
|
||||||
|
|
||||||
|
- `2026_05_09_00.sql` -- DBC overlay rows for `chrclasses_dbc` and
|
||||||
|
`skillraceclassinfo_dbc`. Without this the server can't even
|
||||||
|
resolve class 12 in `sChrClassesStore`. See **Server-side Paragon
|
||||||
|
DBC overlay** below.
|
||||||
|
- `2026_05_10_00.sql` -- `playercreateinfo`, `playercreateinfo_action`,
|
||||||
|
and `player_class_stats` rows for class 12. Without this
|
||||||
|
`Player::Create` rejects every (race, class=12) pair as an
|
||||||
|
"invalid race/class pair" and the worldserver prints
|
||||||
|
`class-N Level-L does not have stats data!` integrity warnings on
|
||||||
|
load.
|
||||||
|
- `2026_05_10_01.sql` -- 20 `playercreateinfo_skills` rows
|
||||||
|
(`classMask = 2048` = class 12) granting every weapon /
|
||||||
|
armor proficiency at level 1. Without this a Paragon spawns with
|
||||||
|
only the universal `classMask = 0` skills (Defense, Unarmed,
|
||||||
|
Cloth, languages, Mounts) -- no Swords, no Mail, no Shield, etc.
|
||||||
|
- `2026_05_10_02.sql` -- 3,314 `skilllineability_dbc` rows opening
|
||||||
|
the class-12 bit on every SkillLineAbility row our patched
|
||||||
|
`SkillLineAbility.dbc` modified. AC reads these rows in
|
||||||
|
`Player::LearnDefaultSkill` to drive the `skill -> passive spell`
|
||||||
|
cascade. Without it the proficiency *skills* from `_01.sql` exist
|
||||||
|
but the *passive spells* (Block, Parry, Dual Wield, Defense,
|
||||||
|
weapon Shoot, racial Mace/Sword Specialization, etc.) never auto-
|
||||||
|
learn, so the spellbook past the racials looks empty.
|
||||||
|
|
||||||
|
After the rebuild + restart, `ac-worldserver` should log
|
||||||
|
`>> Loaded 72 Player Create Definitions` (was 62 pre-Paragon),
|
||||||
|
`>> Loaded 1391 Player Create Skills` (was 1371),
|
||||||
|
`>> Loaded 10219 SkillLineAbility MultiMap Data` (unchanged total --
|
||||||
|
the SQL overlay replaces existing rows by ID, doesn't add new ones),
|
||||||
|
and character creation succeeds for any DK-eligible race with a full
|
||||||
|
weapon / armor kit and the matching passive spells.
|
||||||
|
|
||||||
|
If the client **logs in** successfully but **disconnects immediately**
|
||||||
|
when entering the realm: the auth server is handing your client the
|
||||||
|
wrong world-server address. On a fresh local install the seed defaults
|
||||||
|
to `127.0.0.1` (commit landing this paragraph). If your DB was
|
||||||
|
imported from an older Fractured checkout, the seed may still point at
|
||||||
|
`hsrwow.net`, which sends the client to our production world server
|
||||||
|
instead of yours. Fix:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Docker:
|
||||||
|
docker exec ac-database mysql -uroot -ppassword \
|
||||||
|
-e "UPDATE acore_auth.realmlist SET address='127.0.0.1' WHERE id=1;"
|
||||||
|
docker compose restart ac-authserver
|
||||||
|
```
|
||||||
|
|
||||||
|
Substitute your public hostname/IP for `127.0.0.1` if remote players
|
||||||
|
will be connecting. See `BUILD-NATIVE.md` -> *Production deployment
|
||||||
|
overrides* for the full list of values to set on a production box.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Server-side Paragon DBC overlay (automatic)
|
||||||
|
|
||||||
|
The Fractured **client** learns about Paragon from `patch-enUS-4.MPQ`
|
||||||
|
(DBC + GlueXML). The **worldserver** never reads your MPQs — it reads
|
||||||
|
plain `.dbc` files under its `DataDir` (`.../data/dbc/` by default).
|
||||||
|
|
||||||
|
Stock Docker installs populate `data/dbc/` from a vanilla 3.3.5a
|
||||||
|
extract (`ac-client-data-init` in `docker-compose.yml`). That tree has
|
||||||
|
no `ChrClasses` row for id **12** and no class-12 bit on
|
||||||
|
`SkillRaceClassInfo` rows, which would normally trigger:
|
||||||
|
|
||||||
|
`Class (12) not found in DBC while creating new char ... wrong DBC files or cheater?`
|
||||||
|
|
||||||
|
…and reject the create with `CHAR_CREATE_FAILED`.
|
||||||
|
|
||||||
|
To remove that gap, the repo ships
|
||||||
|
`modules/mod-paragon/data/sql/db-world/updates/2026_05_09_00.sql`,
|
||||||
|
which `INSERT`s the Paragon class-12 deltas into:
|
||||||
|
|
||||||
|
- `chrclasses_dbc` — 1 row defining class 12 ("Paragon", power=Mana,
|
||||||
|
family=Warrior, expansion=2).
|
||||||
|
- `skillraceclassinfo_dbc` — 235 rows replacing stock entries with the
|
||||||
|
patched ClassMask (class-12 bit OR'd in) so every baseline skill is
|
||||||
|
available to Paragon characters.
|
||||||
|
|
||||||
|
`AzerothCore`'s DBC loader (`DBCStores.cpp::LoadDBC` -> `LoadFromDB`)
|
||||||
|
merges these rows on top of whatever `data/dbc/` contains at every
|
||||||
|
worldserver boot. The DBUpdater in `ac-db-import` (Docker) or the
|
||||||
|
worldserver itself (native) applies the migration automatically — so
|
||||||
|
the **only** steps a fresh contributor needs are `git clone` and
|
||||||
|
`docker compose up -d`.
|
||||||
|
|
||||||
|
### Regenerating the migration
|
||||||
|
|
||||||
|
The SQL is auto-generated from the patched DBCs that already live
|
||||||
|
inside `patch-enUS-4.MPQ`. The bake script lives outside this repo
|
||||||
|
(per the repo-tidy policy) at:
|
||||||
|
|
||||||
|
`fractured-tooling/from-workspace-root/_gen_paragon_dbc_overlay_sql.py`
|
||||||
|
|
||||||
|
Re-run it whenever you change the Paragon DBC bake — for example,
|
||||||
|
adding a new race to the Paragon class mask. It diffs the patched
|
||||||
|
DBCs against a stock 3.3.5a DBC extract and emits a fresh
|
||||||
|
`2026_05_09_00.sql` (or successor migration with a new timestamp if
|
||||||
|
deltas change). Workflow:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# Extract the patched DBCs once:
|
||||||
|
.\tools\mpq\mpqcli.exe extract `
|
||||||
|
"ChromieCraft_3.3.5a\Data\enUS\patch-enUS-4.MPQ" `
|
||||||
|
-o "$env:TEMP\paragon-dbc-extract"
|
||||||
|
|
||||||
|
# Regenerate the SQL migration:
|
||||||
|
python fractured-tooling\from-workspace-root\_gen_paragon_dbc_overlay_sql.py
|
||||||
|
```
|
||||||
|
|
||||||
|
If the regenerated SQL has new content, commit it as a **new** dated
|
||||||
|
migration filename (e.g. `2026_06_01_00.sql`) — never edit a file that
|
||||||
|
has already been applied to live databases, AC's DBUpdater will detect
|
||||||
|
the hash change and re-run the SQL, which can be fine but is best
|
||||||
|
reserved for emergencies.
|
||||||
|
|
||||||
|
### Manual DBC overlay (rare, fallback)
|
||||||
|
|
||||||
|
If you ever need the patched DBCs *on disk* — e.g. for a tool that
|
||||||
|
reads `data/dbc/` directly outside the worldserver, or to verify a
|
||||||
|
client-vs-server DBC mismatch — extract `patch-enUS-4.MPQ` and copy
|
||||||
|
its `DBFilesClient/*.dbc` into `data/dbc/`:
|
||||||
|
|
||||||
|
**Docker:**
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
docker run --rm `
|
||||||
|
-v ac-client-data:/data `
|
||||||
|
-v ${PWD}\paragon-dbc-extract:/patch:ro `
|
||||||
|
alpine sh -c "cp -f /patch/*.dbc /data/dbc/"
|
||||||
|
docker compose restart ac-worldserver
|
||||||
|
```
|
||||||
|
|
||||||
|
**Native:** copy into `<CMAKE_INSTALL_PREFIX>/data/dbc/` and restart.
|
||||||
|
|
||||||
|
This is **not required** for normal operation — the SQL migration
|
||||||
|
covers everything `mod-paragon` needs at runtime. Use the manual
|
||||||
|
overlay only when you're consciously bypassing the SQL merge layer.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Building the patches yourself
|
||||||
|
|
||||||
|
The MPQs are reproducible from the dev tree (not in this repo —
|
||||||
|
`Classless Dev/Paragon Patch UI/` and
|
||||||
|
`Classless Dev/Paragon Advancement/` on the maintainer's workstation)
|
||||||
|
via two PowerShell scripts in `tools/`:
|
||||||
|
|
||||||
|
```
|
||||||
|
tools\build_paragon_ui_patch.ps1 -Deploy # -> patch-enUS-5.MPQ
|
||||||
|
tools\build_paragon_advancement_patch.ps1 -Deploy # -> patch-enUS-6.MPQ
|
||||||
|
```
|
||||||
|
|
||||||
|
`patch-enUS-4.MPQ` is the DBC + GlueXML bake; the bake scripts live with
|
||||||
|
the rest of the dev tooling and are not part of this repo by design
|
||||||
|
(see the repo-tidy policy in `README.txt` next to this file). Typical
|
||||||
|
order on a maintainer machine:
|
||||||
|
|
||||||
|
1. `fractured-tooling/from-workspace-root/_patch_spell_dbc_runes.py` — stage `Spell.dbc` with `RuneCostID` cleared.
|
||||||
|
2. `fractured-tooling/from-workspace-root/_patch_spell_dbc_reagents.py` — same staged `Spell.dbc`, clear class-spell reagents for client preflight.
|
||||||
|
3. `fractured-tooling/from-workspace-root/_patch_spell_dbc_stances.py` — same staged `Spell.dbc`, zero the `Stances` field on every `SpellFamilyName == 4` (Warrior) row so the client engine's "Must be in Battle/Defensive/Berserker Stance" pre-cast check stops eating `CMSG_CAST_SPELL` packets for Paragon casters who never picked the stance form. The server's `SpellInfo::CheckShapeshift` Paragon bypass takes over from there. Stock Warriors still see the server-side stance error mid-cast if they actually click while out of stance.
|
||||||
|
4. `fractured-tooling/from-workspace-root/_make_paragon_dbc_patch.py` — rebuild `ChrClasses` / `CharBaseInfo` / game tables, then pack `patch-enUS-4.MPQ`.
|
||||||
|
|
||||||
|
The patched `Wow.exe` is a one-time hex-edit of the stock 3.3.5a
|
||||||
|
client. The diff is publicly documented in the WoW emulation community
|
||||||
|
under names like "MPQ signature patch" / "no-CD-signature patch".
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Versioning
|
||||||
|
|
||||||
|
Releases are tagged to match the state of `main` they were built from.
|
||||||
|
The release notes call out which server commit shipped alongside each
|
||||||
|
artifact set, so a contributor running `git checkout <tag>` on this
|
||||||
|
repo can pull the matching client bundle and have a guaranteed-aligned
|
||||||
|
end-to-end build.
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
Fractured / Paragon — non-runtime repo extras
|
||||||
|
==============================================
|
||||||
|
|
||||||
|
This folder holds material that is not required to configure, build, or run
|
||||||
|
AzerothCore. Upstream AzerothCore does not ship these paths.
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
- BUILD-NATIVE.md — fork-specific native build notes (moved from repo root).
|
||||||
|
- BALANCE-TODO.md — open balance / scaling questions raised by play-testers
|
||||||
|
that have not yet been actioned (e.g. Feral Cat scaling). Knock items off
|
||||||
|
as they ship.
|
||||||
|
- CLAUDE.md — optional AI assistant context (moved from repo root).
|
||||||
|
- CLIENT-PATCHES.md — what ships in a Fractured client release (MPQs +
|
||||||
|
patched Wow.exe), where to download them (Releases page), and how
|
||||||
|
to install them. Binaries themselves are NOT in the tree.
|
||||||
|
- *.log — local build logs (moved from repo root when present).
|
||||||
|
|
||||||
|
Operational files (docker-compose.override.yml, env/dist, modules/mod-paragon,
|
||||||
|
etc.) stay at their normal locations.
|
||||||
@@ -58,16 +58,16 @@ INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`,
|
|||||||
(90991, 90993, 4, 270, 515);
|
(90991, 90993, 4, 270, 515);
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (91247,91248,91249,90985,90986,90987,90988,90989,90990);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (91247,91248,91249,90985,90986,90987,90988,90989,90990);
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(91247, 91247, 3),
|
(91247, 91247, 0, 0, 3),
|
||||||
(91247, 91248, 3),
|
(91247, 91248, 0, 0, 3),
|
||||||
(91247, 91249, 3),
|
(91247, 91249, 0, 0, 3),
|
||||||
(90985, 90985, 3),
|
(90985, 90985, 0, 0, 3),
|
||||||
(90985, 90986, 3),
|
(90985, 90986, 0, 0, 3),
|
||||||
(90985, 90987, 3),
|
(90985, 90987, 0, 0, 3),
|
||||||
(90988, 90988, 3),
|
(90988, 90988, 0, 0, 3),
|
||||||
(90988, 90989, 3),
|
(90988, 90989, 0, 0, 3),
|
||||||
(90988, 90990, 3);
|
(90988, 90990, 0, 0, 3);
|
||||||
|
|
||||||
UPDATE `creature` SET `id1` = 15384 WHERE `guid` = 91250 AND `id1` = 19871;
|
UPDATE `creature` SET `id1` = 15384 WHERE `guid` = 91250 AND `id1` = 19871;
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,13 @@ INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_
|
|||||||
(17653, 0, 3, 0, 4, 0, 100, 512, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 9, 17653, 0, 100, 1, 0, 0, 0, 0, 'Shadowmoon Channeler - On Aggro - Set In Combat With Zone');
|
(17653, 0, 3, 0, 4, 0, 100, 512, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 9, 17653, 0, 100, 1, 0, 0, 0, 0, 'Shadowmoon Channeler - On Aggro - Set In Combat With Zone');
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+0,@CGUID+1,@CGUID+2,@CGUID+3,@CGUID+4,@CGUID+5);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+0,@CGUID+1,@CGUID+2,@CGUID+3,@CGUID+4,@CGUID+5);
|
||||||
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(@CGUID+0, @CGUID+5, 24),
|
(@CGUID+0, @CGUID+5, 0, 0, 24),
|
||||||
(@CGUID+1, @CGUID+5, 24),
|
(@CGUID+1, @CGUID+5, 0, 0, 24),
|
||||||
(@CGUID+2, @CGUID+5, 24),
|
(@CGUID+2, @CGUID+5, 0, 0, 24),
|
||||||
(@CGUID+3, @CGUID+5, 24),
|
(@CGUID+3, @CGUID+5, 0, 0, 24),
|
||||||
(@CGUID+4, @CGUID+5, 24),
|
(@CGUID+4, @CGUID+5, 0, 0, 24),
|
||||||
(@CGUID+5, @CGUID+5, 24);
|
(@CGUID+5, @CGUID+5, 0, 0, 24);
|
||||||
|
|
||||||
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-138519,-138519,-138520,-138521,-138522,-138523));
|
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` IN (-138519,-138519,-138520,-138521,-138522,-138523));
|
||||||
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry
|
|||||||
(13, 1, 30952, 0, 0, 31, 0, 3, 17687, 0, 0, 0, 0, '', 'Shoot Flame Arrow (30952) only hit Flame Arrow (17687)');
|
(13, 1, 30952, 0, 0, 31, 0, 3, 17687, 0, 0, 0, 0, '', 'Shoot Flame Arrow (30952) only hit Flame Arrow (17687)');
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (151094,151095,151096,151097);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (151094,151095,151096,151097);
|
||||||
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(151095,151095,3),
|
(151095, 151095, 0, 0, 3),
|
||||||
(151096,151095,3),
|
(151096, 151095, 0, 0, 3),
|
||||||
(151097,151095,3);
|
(151097, 151095, 0, 0, 3);
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
-- DB update 2023_07_10_00 -> 2023_07_10_01
|
-- DB update 2023_07_10_00 -> 2023_07_10_01
|
||||||
--
|
--
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (90978, 90979, 90980, 90981, 90982);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (90978, 90979, 90980, 90981, 90982);
|
||||||
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(90978, 90978, 3),
|
(90978, 90978, 0, 0, 3),
|
||||||
(90979, 90978, 3),
|
(90979, 90978, 0, 0, 3),
|
||||||
(90980, 90978, 3),
|
(90980, 90978, 0, 0, 3),
|
||||||
(90981, 90978, 3),
|
(90981, 90978, 0, 0, 3),
|
||||||
(90982, 90978, 3);
|
(90982, 90978, 0, 0, 3);
|
||||||
|
|||||||
@@ -1,3 +1,19 @@
|
|||||||
-- DB update 2023_07_17_00 -> 2023_07_17_01
|
-- DB update 2023_07_17_00 -> 2023_07_17_01
|
||||||
--
|
--
|
||||||
|
SET @attrmask_exists := (
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_SCHEMA = DATABASE()
|
||||||
|
AND TABLE_NAME = 'spell_enchant_proc_data'
|
||||||
|
AND COLUMN_NAME = 'attributeMask'
|
||||||
|
);
|
||||||
|
SET @sql := IF(
|
||||||
|
@attrmask_exists > 0,
|
||||||
|
'SELECT 1',
|
||||||
|
'ALTER TABLE `spell_enchant_proc_data` ADD COLUMN `attributeMask` INT UNSIGNED NOT NULL DEFAULT 0 AFTER `procEx`'
|
||||||
|
);
|
||||||
|
PREPARE stmt FROM @sql;
|
||||||
|
EXECUTE stmt;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
UPDATE `spell_enchant_proc_data` SET `attributeMask` = 0x2 WHERE `entry` = 2675;
|
UPDATE `spell_enchant_proc_data` SET `attributeMask` = 0x2 WHERE `entry` = 2675;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ UPDATE `creature_template` SET `scriptname` = '' WHERE `entry` = 27326;
|
|||||||
|
|
||||||
DELETE FROM `spell_target_position` WHERE `ID` = 48324 AND `EffectIndex` = 0;
|
DELETE FROM `spell_target_position` WHERE `ID` = 48324 AND `EffectIndex` = 0;
|
||||||
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES
|
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `VerifiedBuild`) VALUES
|
||||||
(48324, 0, 571, 3454.11, -2802.37, 202.14, 0, 34149345);
|
(48324, 0, 571, 3454.11, -2802.37, 202.14, 0, 0);
|
||||||
|
|
||||||
DELETE FROM `spell_script_names` WHERE `spell_id` IN (48382, 47533);
|
DELETE FROM `spell_script_names` WHERE `spell_id` IN (48382, 47533);
|
||||||
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||||
|
|||||||
@@ -1,5 +1,21 @@
|
|||||||
-- DB update 2023_08_12_02 -> 2023_08_13_00
|
-- DB update 2023_08_12_02 -> 2023_08_13_00
|
||||||
--
|
--
|
||||||
|
SET @csg_comment_exists := (
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_SCHEMA = DATABASE()
|
||||||
|
AND TABLE_NAME = 'creature_summon_groups'
|
||||||
|
AND COLUMN_NAME = 'Comment'
|
||||||
|
);
|
||||||
|
SET @sql := IF(
|
||||||
|
@csg_comment_exists > 0,
|
||||||
|
'SELECT 1',
|
||||||
|
'ALTER TABLE `creature_summon_groups` ADD COLUMN `Comment` varchar(255) NOT NULL DEFAULT '''' AFTER `summonTime`'
|
||||||
|
);
|
||||||
|
PREPARE stmt FROM @sql;
|
||||||
|
EXECUTE stmt;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
DELETE FROM `event_scripts` WHERE `id` = 14376;
|
DELETE FROM `event_scripts` WHERE `id` = 14376;
|
||||||
|
|
||||||
UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` = 185220;
|
UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` = 185220;
|
||||||
|
|||||||
@@ -1362,132 +1362,132 @@ UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE (`entry` IN (21224, 2122
|
|||||||
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428 WHERE (`entry` IN (21218, 21301));
|
UPDATE `creature_template` SET `speed_walk` = 1.6, `speed_run` = 1.71428 WHERE (`entry` IN (21218, 21301));
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+1 ,@CGUID+2 ,@CGUID+3 ,@CGUID+4 ,@CGUID+5 ,@CGUID+6 ,@CGUID+7 ,@CGUID+8 ,@CGUID+9 ,@CGUID+10 ,@CGUID+11 ,@CGUID+12 ,@CGUID+13 ,@CGUID+14 ,@CGUID+15 ,@CGUID+22 ,@CGUID+23 ,@CGUID+24 ,@CGUID+25 ,@CGUID+26 ,@CGUID+27 ,@CGUID+28 ,@CGUID+29 ,@CGUID+30 ,@CGUID+31 ,@CGUID+32 ,@CGUID+33 ,@CGUID+34 ,@CGUID+35 ,@CGUID+36 ,@CGUID+37 ,@CGUID+38 ,@CGUID+39 ,@CGUID+40 ,@CGUID+41 ,@CGUID+42 ,@CGUID+43 ,@CGUID+44 ,@CGUID+45 ,@CGUID+46 ,@CGUID+47 ,@CGUID+48 ,@CGUID+49 ,@CGUID+50 ,@CGUID+51 ,@CGUID+52 ,@CGUID+53 ,@CGUID+54 ,@CGUID+55 ,@CGUID+56 ,@CGUID+57 ,@CGUID+58 ,@CGUID+59 ,@CGUID+60 ,@CGUID+61 ,@CGUID+62 ,@CGUID+63 ,@CGUID+64 ,@CGUID+65 ,@CGUID+66 ,@CGUID+67 ,@CGUID+68 ,@CGUID+69 ,@CGUID+70 ,@CGUID+71 ,@CGUID+72 ,@CGUID+73 ,@CGUID+74 ,@CGUID+75 ,@CGUID+76 ,@CGUID+77 ,@CGUID+78 ,@CGUID+79 ,@CGUID+80 ,@CGUID+81 ,@CGUID+82 ,@CGUID+83 ,@CGUID+84 ,@CGUID+85 ,@CGUID+86 ,@CGUID+87 ,@CGUID+88 ,@CGUID+89 ,@CGUID+90 ,@CGUID+91 ,@CGUID+92 ,@CGUID+93 ,@CGUID+94 ,@CGUID+95 ,@CGUID+96 ,@CGUID+97 ,@CGUID+98 ,@CGUID+99 ,@CGUID+102,@CGUID+103,@CGUID+104,@CGUID+105,@CGUID+106,@CGUID+107,@CGUID+108,@CGUID+109,@CGUID+115,@CGUID+116,@CGUID+117,@CGUID+118,@CGUID+119,@CGUID+120,@CGUID+121,@CGUID+122,@CGUID+123,@CGUID+124,@CGUID+125,@CGUID+126,@CGUID+127,@CGUID+128,@CGUID+129,@CGUID+130,@CGUID+131,@CGUID+132,@CGUID+133,@CGUID+134,@CGUID+135,@CGUID+136,@CGUID+137,@CGUID+138);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+1 ,@CGUID+2 ,@CGUID+3 ,@CGUID+4 ,@CGUID+5 ,@CGUID+6 ,@CGUID+7 ,@CGUID+8 ,@CGUID+9 ,@CGUID+10 ,@CGUID+11 ,@CGUID+12 ,@CGUID+13 ,@CGUID+14 ,@CGUID+15 ,@CGUID+22 ,@CGUID+23 ,@CGUID+24 ,@CGUID+25 ,@CGUID+26 ,@CGUID+27 ,@CGUID+28 ,@CGUID+29 ,@CGUID+30 ,@CGUID+31 ,@CGUID+32 ,@CGUID+33 ,@CGUID+34 ,@CGUID+35 ,@CGUID+36 ,@CGUID+37 ,@CGUID+38 ,@CGUID+39 ,@CGUID+40 ,@CGUID+41 ,@CGUID+42 ,@CGUID+43 ,@CGUID+44 ,@CGUID+45 ,@CGUID+46 ,@CGUID+47 ,@CGUID+48 ,@CGUID+49 ,@CGUID+50 ,@CGUID+51 ,@CGUID+52 ,@CGUID+53 ,@CGUID+54 ,@CGUID+55 ,@CGUID+56 ,@CGUID+57 ,@CGUID+58 ,@CGUID+59 ,@CGUID+60 ,@CGUID+61 ,@CGUID+62 ,@CGUID+63 ,@CGUID+64 ,@CGUID+65 ,@CGUID+66 ,@CGUID+67 ,@CGUID+68 ,@CGUID+69 ,@CGUID+70 ,@CGUID+71 ,@CGUID+72 ,@CGUID+73 ,@CGUID+74 ,@CGUID+75 ,@CGUID+76 ,@CGUID+77 ,@CGUID+78 ,@CGUID+79 ,@CGUID+80 ,@CGUID+81 ,@CGUID+82 ,@CGUID+83 ,@CGUID+84 ,@CGUID+85 ,@CGUID+86 ,@CGUID+87 ,@CGUID+88 ,@CGUID+89 ,@CGUID+90 ,@CGUID+91 ,@CGUID+92 ,@CGUID+93 ,@CGUID+94 ,@CGUID+95 ,@CGUID+96 ,@CGUID+97 ,@CGUID+98 ,@CGUID+99 ,@CGUID+102,@CGUID+103,@CGUID+104,@CGUID+105,@CGUID+106,@CGUID+107,@CGUID+108,@CGUID+109,@CGUID+115,@CGUID+116,@CGUID+117,@CGUID+118,@CGUID+119,@CGUID+120,@CGUID+121,@CGUID+122,@CGUID+123,@CGUID+124,@CGUID+125,@CGUID+126,@CGUID+127,@CGUID+128,@CGUID+129,@CGUID+130,@CGUID+131,@CGUID+132,@CGUID+133,@CGUID+134,@CGUID+135,@CGUID+136,@CGUID+137,@CGUID+138);
|
||||||
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(@CGUID+1 , @CGUID+1 , 3),
|
(@CGUID+1, @CGUID+1, 0, 0, 3),
|
||||||
(@CGUID+2 , @CGUID+1 , 3),
|
(@CGUID+2, @CGUID+1, 0, 0, 3),
|
||||||
(@CGUID+3 , @CGUID+1 , 3),
|
(@CGUID+3, @CGUID+1, 0, 0, 3),
|
||||||
(@CGUID+4 , @CGUID+1 , 3),
|
(@CGUID+4, @CGUID+1, 0, 0, 3),
|
||||||
(@CGUID+5 , @CGUID+1 , 3),
|
(@CGUID+5, @CGUID+1, 0, 0, 3),
|
||||||
(@CGUID+6 , @CGUID+6 , 3),
|
(@CGUID+6, @CGUID+6, 0, 0, 3),
|
||||||
(@CGUID+7 , @CGUID+6 , 3),
|
(@CGUID+7, @CGUID+6, 0, 0, 3),
|
||||||
(@CGUID+8 , @CGUID+6 , 3),
|
(@CGUID+8, @CGUID+6, 0, 0, 3),
|
||||||
(@CGUID+9 , @CGUID+6 , 3),
|
(@CGUID+9, @CGUID+6, 0, 0, 3),
|
||||||
(@CGUID+10 , @CGUID+6 , 3),
|
(@CGUID+10, @CGUID+6, 0, 0, 3),
|
||||||
(@CGUID+11 , @CGUID+11 , 3),
|
(@CGUID+11, @CGUID+11, 0, 0, 3),
|
||||||
(@CGUID+12 , @CGUID+11 , 3),
|
(@CGUID+12, @CGUID+11, 0, 0, 3),
|
||||||
(@CGUID+13 , @CGUID+11 , 3),
|
(@CGUID+13, @CGUID+11, 0, 0, 3),
|
||||||
(@CGUID+14 , @CGUID+11 , 3),
|
(@CGUID+14, @CGUID+11, 0, 0, 3),
|
||||||
(@CGUID+15 , @CGUID+11 , 3),
|
(@CGUID+15, @CGUID+11, 0, 0, 3),
|
||||||
(@CGUID+22 , @CGUID+22 , 3),
|
(@CGUID+22, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+23 , @CGUID+22 , 3),
|
(@CGUID+23, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+24 , @CGUID+22 , 3),
|
(@CGUID+24, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+25 , @CGUID+22 , 3),
|
(@CGUID+25, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+26 , @CGUID+22 , 3),
|
(@CGUID+26, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+27 , @CGUID+22 , 3),
|
(@CGUID+27, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+28 , @CGUID+22 , 3),
|
(@CGUID+28, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+29 , @CGUID+22 , 3),
|
(@CGUID+29, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+30 , @CGUID+22 , 3),
|
(@CGUID+30, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+31 , @CGUID+31 , 3),
|
(@CGUID+31, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+32 , @CGUID+31 , 3),
|
(@CGUID+32, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+33 , @CGUID+31 , 3),
|
(@CGUID+33, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+34 , @CGUID+31 , 3),
|
(@CGUID+34, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+35 , @CGUID+31 , 3),
|
(@CGUID+35, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+36 , @CGUID+31 , 3),
|
(@CGUID+36, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+37 , @CGUID+31 , 3),
|
(@CGUID+37, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+38 , @CGUID+31 , 3),
|
(@CGUID+38, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+39 , @CGUID+31 , 3),
|
(@CGUID+39, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+40 , @CGUID+40 , 3),
|
(@CGUID+40, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+41 , @CGUID+40 , 3),
|
(@CGUID+41, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+42 , @CGUID+40 , 3),
|
(@CGUID+42, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+43 , @CGUID+40 , 3),
|
(@CGUID+43, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+44 , @CGUID+40 , 3),
|
(@CGUID+44, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+45 , @CGUID+40 , 3),
|
(@CGUID+45, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+46 , @CGUID+40 , 3),
|
(@CGUID+46, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+47 , @CGUID+40 , 3),
|
(@CGUID+47, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+48 , @CGUID+40 , 3),
|
(@CGUID+48, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+49 , @CGUID+49 , 3),
|
(@CGUID+49, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+50 , @CGUID+49 , 3),
|
(@CGUID+50, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+51 , @CGUID+49 , 3),
|
(@CGUID+51, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+52 , @CGUID+49 , 3),
|
(@CGUID+52, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+53 , @CGUID+49 , 3),
|
(@CGUID+53, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+54 , @CGUID+49 , 3),
|
(@CGUID+54, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+55 , @CGUID+49 , 3),
|
(@CGUID+55, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+56 , @CGUID+49 , 3),
|
(@CGUID+56, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+57 , @CGUID+49 , 3),
|
(@CGUID+57, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+58 , @CGUID+58 , 3),
|
(@CGUID+58, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+59 , @CGUID+58 , 3),
|
(@CGUID+59, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+60 , @CGUID+58 , 3),
|
(@CGUID+60, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+61 , @CGUID+58 , 3),
|
(@CGUID+61, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+62 , @CGUID+58 , 3),
|
(@CGUID+62, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+63 , @CGUID+58 , 3),
|
(@CGUID+63, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+64 , @CGUID+58 , 3),
|
(@CGUID+64, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+65 , @CGUID+58 , 3),
|
(@CGUID+65, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+66 , @CGUID+58 , 3),
|
(@CGUID+66, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+67 , @CGUID+67 , 3),
|
(@CGUID+67, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+68 , @CGUID+67 , 3),
|
(@CGUID+68, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+69 , @CGUID+67 , 3),
|
(@CGUID+69, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+70 , @CGUID+67 , 3),
|
(@CGUID+70, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+71 , @CGUID+67 , 3),
|
(@CGUID+71, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+72 , @CGUID+67 , 3),
|
(@CGUID+72, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+73 , @CGUID+67 , 3),
|
(@CGUID+73, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+74 , @CGUID+67 , 3),
|
(@CGUID+74, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+75 , @CGUID+67 , 3),
|
(@CGUID+75, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+76 , @CGUID+76 , 3),
|
(@CGUID+76, @CGUID+76, 0, 0, 3),
|
||||||
(@CGUID+77 , @CGUID+76 , 3),
|
(@CGUID+77, @CGUID+76, 0, 0, 3),
|
||||||
(@CGUID+78 , @CGUID+76 , 3),
|
(@CGUID+78, @CGUID+76, 0, 0, 3),
|
||||||
(@CGUID+79 , @CGUID+76 , 3),
|
(@CGUID+79, @CGUID+76, 0, 0, 3),
|
||||||
(@CGUID+80 , @CGUID+76 , 3),
|
(@CGUID+80, @CGUID+76, 0, 0, 3),
|
||||||
(@CGUID+81 , @CGUID+76 , 3),
|
(@CGUID+81, @CGUID+76, 0, 0, 3),
|
||||||
(@CGUID+82 , @CGUID+82 , 3),
|
(@CGUID+82, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+83 , @CGUID+82 , 3),
|
(@CGUID+83, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+84 , @CGUID+82 , 3),
|
(@CGUID+84, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+85 , @CGUID+82 , 3),
|
(@CGUID+85, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+86 , @CGUID+82 , 3),
|
(@CGUID+86, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+87 , @CGUID+82 , 3),
|
(@CGUID+87, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+88 , @CGUID+88 , 3),
|
(@CGUID+88, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+89 , @CGUID+88 , 3),
|
(@CGUID+89, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+90 , @CGUID+88 , 3),
|
(@CGUID+90, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+91 , @CGUID+88 , 3),
|
(@CGUID+91, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+92 , @CGUID+88 , 3),
|
(@CGUID+92, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+93 , @CGUID+88 , 3),
|
(@CGUID+93, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+94 , @CGUID+94 , 3),
|
(@CGUID+94, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+95 , @CGUID+94 , 3),
|
(@CGUID+95, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+96 , @CGUID+94 , 3),
|
(@CGUID+96, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+97 , @CGUID+94 , 3),
|
(@CGUID+97, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+98 , @CGUID+94 , 3),
|
(@CGUID+98, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+99 , @CGUID+94 , 3),
|
(@CGUID+99, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+102, @CGUID+102, 3),
|
(@CGUID+102, @CGUID+102, 0, 0, 3),
|
||||||
(@CGUID+103, @CGUID+102, 3),
|
(@CGUID+103, @CGUID+102, 0, 0, 3),
|
||||||
(@CGUID+104, @CGUID+102, 3),
|
(@CGUID+104, @CGUID+102, 0, 0, 3),
|
||||||
(@CGUID+105, @CGUID+102, 3),
|
(@CGUID+105, @CGUID+102, 0, 0, 3),
|
||||||
(@CGUID+106, @CGUID+106, 3),
|
(@CGUID+106, @CGUID+106, 0, 0, 3),
|
||||||
(@CGUID+107, @CGUID+106, 3),
|
(@CGUID+107, @CGUID+106, 0, 0, 3),
|
||||||
(@CGUID+108, @CGUID+106, 3),
|
(@CGUID+108, @CGUID+106, 0, 0, 3),
|
||||||
(@CGUID+109, @CGUID+106, 3),
|
(@CGUID+109, @CGUID+106, 0, 0, 3),
|
||||||
(@CGUID+115, @CGUID+115, 3),
|
(@CGUID+115, @CGUID+115, 0, 0, 3),
|
||||||
(@CGUID+116, @CGUID+115, 3),
|
(@CGUID+116, @CGUID+115, 0, 0, 3),
|
||||||
(@CGUID+117, @CGUID+115, 3),
|
(@CGUID+117, @CGUID+115, 0, 0, 3),
|
||||||
(@CGUID+118, @CGUID+118, 3),
|
(@CGUID+118, @CGUID+118, 0, 0, 3),
|
||||||
(@CGUID+119, @CGUID+118, 3),
|
(@CGUID+119, @CGUID+118, 0, 0, 3),
|
||||||
(@CGUID+120, @CGUID+118, 3),
|
(@CGUID+120, @CGUID+118, 0, 0, 3),
|
||||||
(@CGUID+121, @CGUID+118, 3),
|
(@CGUID+121, @CGUID+118, 0, 0, 3),
|
||||||
(@CGUID+122, @CGUID+122, 3),
|
(@CGUID+122, @CGUID+122, 0, 0, 3),
|
||||||
(@CGUID+123, @CGUID+122, 3),
|
(@CGUID+123, @CGUID+122, 0, 0, 3),
|
||||||
(@CGUID+124, @CGUID+122, 3),
|
(@CGUID+124, @CGUID+122, 0, 0, 3),
|
||||||
(@CGUID+125, @CGUID+122, 3),
|
(@CGUID+125, @CGUID+122, 0, 0, 3),
|
||||||
(@CGUID+126, @CGUID+122, 3),
|
(@CGUID+126, @CGUID+122, 0, 0, 3),
|
||||||
(@CGUID+127, @CGUID+127, 3),
|
(@CGUID+127, @CGUID+127, 0, 0, 3),
|
||||||
(@CGUID+128, @CGUID+127, 3),
|
(@CGUID+128, @CGUID+127, 0, 0, 3),
|
||||||
(@CGUID+129, @CGUID+127, 3),
|
(@CGUID+129, @CGUID+127, 0, 0, 3),
|
||||||
(@CGUID+130, @CGUID+127, 3),
|
(@CGUID+130, @CGUID+127, 0, 0, 3),
|
||||||
(@CGUID+131, @CGUID+127, 3),
|
(@CGUID+131, @CGUID+127, 0, 0, 3),
|
||||||
(@CGUID+132, @CGUID+127, 3),
|
(@CGUID+132, @CGUID+127, 0, 0, 3),
|
||||||
(@CGUID+133, @CGUID+133, 3),
|
(@CGUID+133, @CGUID+133, 0, 0, 3),
|
||||||
(@CGUID+134, @CGUID+133, 3),
|
(@CGUID+134, @CGUID+133, 0, 0, 3),
|
||||||
(@CGUID+135, @CGUID+133, 3),
|
(@CGUID+135, @CGUID+133, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+133, 3),
|
(@CGUID+136, @CGUID+133, 0, 0, 3),
|
||||||
(@CGUID+137, @CGUID+133, 3),
|
(@CGUID+137, @CGUID+133, 0, 0, 3),
|
||||||
(@CGUID+138, @CGUID+133, 3);
|
(@CGUID+138, @CGUID+133, 0, 0, 3);
|
||||||
|
|
||||||
UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=21230 AND `source_type`=0 AND `id`=1 AND `link`=0;
|
UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=21230 AND `source_type`=0 AND `id`=1 AND `link`=0;
|
||||||
UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=21230 AND `source_type`=0 AND `id`=5 AND `link`=0;
|
UPDATE `smart_scripts` SET `action_param2`=0 WHERE `entryorguid`=21230 AND `source_type`=0 AND `id`=5 AND `link`=0;
|
||||||
|
|||||||
@@ -183,11 +183,11 @@ INSERT INTO `linked_respawn`(`guid`, `linkedGuid`, `linkType`) VALUES
|
|||||||
|
|
||||||
-- Leotheras formation
|
-- Leotheras formation
|
||||||
DELETE FROM `creature_formations` WHERE `leaderGUID` = @LEOTHERAS;
|
DELETE FROM `creature_formations` WHERE `leaderGUID` = @LEOTHERAS;
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(@LEOTHERAS, @LEOTHERAS, 24),
|
(@LEOTHERAS, @LEOTHERAS, 0, 0, 24),
|
||||||
(@LEOTHERAS, @LEOTHERAS+1, 24),
|
(@LEOTHERAS, @LEOTHERAS+1, 0, 0, 24),
|
||||||
(@LEOTHERAS, @LEOTHERAS+2, 24),
|
(@LEOTHERAS, @LEOTHERAS+2, 0, 0, 24),
|
||||||
(@LEOTHERAS, @LEOTHERAS+3, 24);
|
(@LEOTHERAS, @LEOTHERAS+3, 0, 0, 24);
|
||||||
|
|
||||||
SET @KARATHRESS := 153154;
|
SET @KARATHRESS := 153154;
|
||||||
DELETE FROM `linked_respawn` WHERE `linkedGuid` = @KARATHRESS;
|
DELETE FROM `linked_respawn` WHERE `linkedGuid` = @KARATHRESS;
|
||||||
|
|||||||
@@ -869,176 +869,176 @@ INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_
|
|||||||
|
|
||||||
-- Static Formations
|
-- Static Formations
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+03,@CGUID+04,@CGUID+05,@CGUID+06,@CGUID+07,@CGUID+08,@CGUID+09,@CGUID+10,@CGUID+11,@CGUID+12,@CGUID+13,@CGUID+14,@CGUID+15,@CGUID+16,@CGUID+17,@CGUID+18,@CGUID+19,@CGUID+20,@CGUID+52,@CGUID+53,@CGUID+54,@CGUID+55,@CGUID+59,@CGUID+60,@CGUID+61,@CGUID+62,@CGUID+63,@CGUID+64,@CGUID+65,@CGUID+66,@CGUID+67,@CGUID+68,@CGUID+69,@CGUID+70,@CGUID+74,@CGUID+75,@CGUID+76,@CGUID+77,@CGUID+78,@CGUID+79,@CGUID+80,@CGUID+81,@CGUID+82,@CGUID+83,@CGUID+84,@CGUID+85,@CGUID+86,@CGUID+87,@CGUID+88,@CGUID+89,@CGUID+90,@CGUID+91,@CGUID+93,@CGUID+94,@CGUID+98,@CGUID+99,@CGUID+100,@CGUID+101,@CGUID+102,@CGUID+103,@CGUID+104,@CGUID+105,@CGUID+106,@CGUID+107,@CGUID+108,@CGUID+109,@CGUID+110,@CGUID+111,@CGUID+112,@CGUID+113,@CGUID+114,@CGUID+115,@CGUID+116,@CGUID+117,@CGUID+118,@CGUID+119,@CGUID+120,@CGUID+121,@CGUID+125,@CGUID+126,@CGUID+127,@CGUID+128,@CGUID+129,@CGUID+130,@CGUID+131,@CGUID+132,@CGUID+133,@CGUID+134,@CGUID+135,@CGUID+136,@CGUID+143,@CGUID+144,@CGUID+145,@CGUID+146,@CGUID+147,@CGUID+148,@CGUID+149,@CGUID+150,@CGUID+151,@CGUID+152,@CGUID+153,@CGUID+154,@CGUID+155,@CGUID+156,@CGUID+157,@CGUID+158,@CGUID+159,@CGUID+160,@CGUID+161,@CGUID+162,@CGUID+163,@CGUID+164,@CGUID+165,@CGUID+166,@CGUID+167,@CGUID+168,@CGUID+169,@CGUID+170,@CGUID+171,@CGUID+172,@CGUID+173,@CGUID+174,@CGUID+175,@CGUID+176,@CGUID+177,@CGUID+178,@CGUID+180,@CGUID+181,@CGUID+182,@CGUID+183,@CGUID+184,@CGUID+185,@CGUID+186,@CGUID+187,@CGUID+188,@CGUID+189,@CGUID+190,@CGUID+191,@CGUID+218,@CGUID+219,@CGUID+220,@CGUID+221,@CGUID+222) AND `groupAI` IN (3, 24);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+03,@CGUID+04,@CGUID+05,@CGUID+06,@CGUID+07,@CGUID+08,@CGUID+09,@CGUID+10,@CGUID+11,@CGUID+12,@CGUID+13,@CGUID+14,@CGUID+15,@CGUID+16,@CGUID+17,@CGUID+18,@CGUID+19,@CGUID+20,@CGUID+52,@CGUID+53,@CGUID+54,@CGUID+55,@CGUID+59,@CGUID+60,@CGUID+61,@CGUID+62,@CGUID+63,@CGUID+64,@CGUID+65,@CGUID+66,@CGUID+67,@CGUID+68,@CGUID+69,@CGUID+70,@CGUID+74,@CGUID+75,@CGUID+76,@CGUID+77,@CGUID+78,@CGUID+79,@CGUID+80,@CGUID+81,@CGUID+82,@CGUID+83,@CGUID+84,@CGUID+85,@CGUID+86,@CGUID+87,@CGUID+88,@CGUID+89,@CGUID+90,@CGUID+91,@CGUID+93,@CGUID+94,@CGUID+98,@CGUID+99,@CGUID+100,@CGUID+101,@CGUID+102,@CGUID+103,@CGUID+104,@CGUID+105,@CGUID+106,@CGUID+107,@CGUID+108,@CGUID+109,@CGUID+110,@CGUID+111,@CGUID+112,@CGUID+113,@CGUID+114,@CGUID+115,@CGUID+116,@CGUID+117,@CGUID+118,@CGUID+119,@CGUID+120,@CGUID+121,@CGUID+125,@CGUID+126,@CGUID+127,@CGUID+128,@CGUID+129,@CGUID+130,@CGUID+131,@CGUID+132,@CGUID+133,@CGUID+134,@CGUID+135,@CGUID+136,@CGUID+143,@CGUID+144,@CGUID+145,@CGUID+146,@CGUID+147,@CGUID+148,@CGUID+149,@CGUID+150,@CGUID+151,@CGUID+152,@CGUID+153,@CGUID+154,@CGUID+155,@CGUID+156,@CGUID+157,@CGUID+158,@CGUID+159,@CGUID+160,@CGUID+161,@CGUID+162,@CGUID+163,@CGUID+164,@CGUID+165,@CGUID+166,@CGUID+167,@CGUID+168,@CGUID+169,@CGUID+170,@CGUID+171,@CGUID+172,@CGUID+173,@CGUID+174,@CGUID+175,@CGUID+176,@CGUID+177,@CGUID+178,@CGUID+180,@CGUID+181,@CGUID+182,@CGUID+183,@CGUID+184,@CGUID+185,@CGUID+186,@CGUID+187,@CGUID+188,@CGUID+189,@CGUID+190,@CGUID+191,@CGUID+218,@CGUID+219,@CGUID+220,@CGUID+221,@CGUID+222) AND `groupAI` IN (3, 24);
|
||||||
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
-- Entrance Group 1
|
-- Entrance Group 1
|
||||||
(@CGUID+3, @CGUID+3, 3),
|
(@CGUID+3, @CGUID+3, 0, 0, 3),
|
||||||
(@CGUID+4, @CGUID+3, 3),
|
(@CGUID+4, @CGUID+3, 0, 0, 3),
|
||||||
(@CGUID+5, @CGUID+3, 3),
|
(@CGUID+5, @CGUID+3, 0, 0, 3),
|
||||||
(@CGUID+6, @CGUID+3, 3),
|
(@CGUID+6, @CGUID+3, 0, 0, 3),
|
||||||
(@CGUID+7, @CGUID+3, 3),
|
(@CGUID+7, @CGUID+3, 0, 0, 3),
|
||||||
(@CGUID+8, @CGUID+3, 3),
|
(@CGUID+8, @CGUID+3, 0, 0, 3),
|
||||||
-- Entrance Group 2
|
-- Entrance Group 2
|
||||||
(@CGUID+9 , @CGUID+9, 3),
|
(@CGUID+9, @CGUID+9, 0, 0, 3),
|
||||||
(@CGUID+10, @CGUID+9, 3),
|
(@CGUID+10, @CGUID+9, 0, 0, 3),
|
||||||
(@CGUID+11, @CGUID+9, 3),
|
(@CGUID+11, @CGUID+9, 0, 0, 3),
|
||||||
(@CGUID+12, @CGUID+9, 3),
|
(@CGUID+12, @CGUID+9, 0, 0, 3),
|
||||||
(@CGUID+13, @CGUID+9, 3),
|
(@CGUID+13, @CGUID+9, 0, 0, 3),
|
||||||
(@CGUID+14, @CGUID+9, 3),
|
(@CGUID+14, @CGUID+9, 0, 0, 3),
|
||||||
-- Entrance Group 3
|
-- Entrance Group 3
|
||||||
(@CGUID+15, @CGUID+15, 3),
|
(@CGUID+15, @CGUID+15, 0, 0, 3),
|
||||||
(@CGUID+16, @CGUID+15, 3),
|
(@CGUID+16, @CGUID+15, 0, 0, 3),
|
||||||
(@CGUID+17, @CGUID+15, 3),
|
(@CGUID+17, @CGUID+15, 0, 0, 3),
|
||||||
(@CGUID+18, @CGUID+15, 3),
|
(@CGUID+18, @CGUID+15, 0, 0, 3),
|
||||||
(@CGUID+19, @CGUID+15, 3),
|
(@CGUID+19, @CGUID+15, 0, 0, 3),
|
||||||
(@CGUID+20, @CGUID+15, 3),
|
(@CGUID+20, @CGUID+15, 0, 0, 3),
|
||||||
-- Sentinel Group 1
|
-- Sentinel Group 1
|
||||||
(@CGUID+52, @CGUID+52, 3),
|
(@CGUID+52, @CGUID+52, 0, 0, 3),
|
||||||
(@CGUID+53, @CGUID+52, 3),
|
(@CGUID+53, @CGUID+52, 0, 0, 3),
|
||||||
-- Sentinel Group 2
|
-- Sentinel Group 2
|
||||||
(@CGUID+54, @CGUID+54, 3),
|
(@CGUID+54, @CGUID+54, 0, 0, 3),
|
||||||
(@CGUID+55, @CGUID+54, 3),
|
(@CGUID+55, @CGUID+54, 0, 0, 3),
|
||||||
-- Inquisitor Adds 1
|
-- Inquisitor Adds 1
|
||||||
(@CGUID+59, @CGUID+59, 3),
|
(@CGUID+59, @CGUID+59, 0, 0, 3),
|
||||||
(@CGUID+60, @CGUID+59, 3),
|
(@CGUID+60, @CGUID+59, 0, 0, 3),
|
||||||
(@CGUID+61, @CGUID+59, 3),
|
(@CGUID+61, @CGUID+59, 0, 0, 3),
|
||||||
(@CGUID+62, @CGUID+59, 3),
|
(@CGUID+62, @CGUID+59, 0, 0, 3),
|
||||||
(@CGUID+63, @CGUID+59, 3),
|
(@CGUID+63, @CGUID+59, 0, 0, 3),
|
||||||
(@CGUID+64, @CGUID+59, 3),
|
(@CGUID+64, @CGUID+59, 0, 0, 3),
|
||||||
-- Inquisitor Adds 2
|
-- Inquisitor Adds 2
|
||||||
(@CGUID+65, @CGUID+65, 3),
|
(@CGUID+65, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+66, @CGUID+65, 3),
|
(@CGUID+66, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+67, @CGUID+65, 3),
|
(@CGUID+67, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+68, @CGUID+65, 3),
|
(@CGUID+68, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+69, @CGUID+65, 3),
|
(@CGUID+69, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+70, @CGUID+65, 3),
|
(@CGUID+70, @CGUID+65, 0, 0, 3),
|
||||||
-- Void Reaver Trash Group 1
|
-- Void Reaver Trash Group 1
|
||||||
(@CGUID+74, @CGUID+74, 3),
|
(@CGUID+74, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+75, @CGUID+74, 3),
|
(@CGUID+75, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+76, @CGUID+74, 3),
|
(@CGUID+76, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+77, @CGUID+74, 3),
|
(@CGUID+77, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+78, @CGUID+74, 3),
|
(@CGUID+78, @CGUID+74, 0, 0, 3),
|
||||||
-- Void Reaver Trash Group 2
|
-- Void Reaver Trash Group 2
|
||||||
(@CGUID+79, @CGUID+79, 3),
|
(@CGUID+79, @CGUID+79, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+79, 3),
|
(@CGUID+80, @CGUID+79, 0, 0, 3),
|
||||||
(@CGUID+81, @CGUID+79, 3),
|
(@CGUID+81, @CGUID+79, 0, 0, 3),
|
||||||
(@CGUID+82, @CGUID+79, 3),
|
(@CGUID+82, @CGUID+79, 0, 0, 3),
|
||||||
(@CGUID+83, @CGUID+79, 3),
|
(@CGUID+83, @CGUID+79, 0, 0, 3),
|
||||||
-- Void Reaver Trash Group 3
|
-- Void Reaver Trash Group 3
|
||||||
(@CGUID+84, @CGUID+84, 3),
|
(@CGUID+84, @CGUID+84, 0, 0, 3),
|
||||||
(@CGUID+85, @CGUID+84, 3),
|
(@CGUID+85, @CGUID+84, 0, 0, 3),
|
||||||
(@CGUID+86, @CGUID+84, 3),
|
(@CGUID+86, @CGUID+84, 0, 0, 3),
|
||||||
(@CGUID+87, @CGUID+84, 3),
|
(@CGUID+87, @CGUID+84, 0, 0, 3),
|
||||||
-- Void Reaver Trash Group 4
|
-- Void Reaver Trash Group 4
|
||||||
(@CGUID+88, @CGUID+88, 3),
|
(@CGUID+88, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+89, @CGUID+88, 3),
|
(@CGUID+89, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+90, @CGUID+88, 3),
|
(@CGUID+90, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+91, @CGUID+88, 3),
|
(@CGUID+91, @CGUID+88, 0, 0, 3),
|
||||||
-- Solarium Sentinel Group 1
|
-- Solarium Sentinel Group 1
|
||||||
(@CGUID+93, @CGUID+93, 3),
|
(@CGUID+93, @CGUID+93, 0, 0, 3),
|
||||||
(@CGUID+94, @CGUID+93, 3),
|
(@CGUID+94, @CGUID+93, 0, 0, 3),
|
||||||
-- Solarium Large Group 1
|
-- Solarium Large Group 1
|
||||||
(@CGUID+98 , @CGUID+98, 3),
|
(@CGUID+98, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+99 , @CGUID+98, 3),
|
(@CGUID+99, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+100, @CGUID+98, 3),
|
(@CGUID+100, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+101, @CGUID+98, 3),
|
(@CGUID+101, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+102, @CGUID+98, 3),
|
(@CGUID+102, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+103, @CGUID+98, 3),
|
(@CGUID+103, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+104, @CGUID+98, 3),
|
(@CGUID+104, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+105, @CGUID+98, 3),
|
(@CGUID+105, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+106, @CGUID+98, 3),
|
(@CGUID+106, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+107, @CGUID+98, 3),
|
(@CGUID+107, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+108, @CGUID+98, 3),
|
(@CGUID+108, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+109, @CGUID+98, 3),
|
(@CGUID+109, @CGUID+98, 0, 0, 3),
|
||||||
-- Solarium Large Group 2
|
-- Solarium Large Group 2
|
||||||
(@CGUID+110, @CGUID+110, 3),
|
(@CGUID+110, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+111, @CGUID+110, 3),
|
(@CGUID+111, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+112, @CGUID+110, 3),
|
(@CGUID+112, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+113, @CGUID+110, 3),
|
(@CGUID+113, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+114, @CGUID+110, 3),
|
(@CGUID+114, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+115, @CGUID+110, 3),
|
(@CGUID+115, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+116, @CGUID+110, 3),
|
(@CGUID+116, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+117, @CGUID+110, 3),
|
(@CGUID+117, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+118, @CGUID+110, 3),
|
(@CGUID+118, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+119, @CGUID+110, 3),
|
(@CGUID+119, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+120, @CGUID+110, 3),
|
(@CGUID+120, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+121, @CGUID+110, 3),
|
(@CGUID+121, @CGUID+110, 0, 0, 3),
|
||||||
-- Inquisitor Adds 3
|
-- Inquisitor Adds 3
|
||||||
(@CGUID+125, @CGUID+125, 3),
|
(@CGUID+125, @CGUID+125, 0, 0, 3),
|
||||||
(@CGUID+126, @CGUID+125, 3),
|
(@CGUID+126, @CGUID+125, 0, 0, 3),
|
||||||
(@CGUID+127, @CGUID+125, 3),
|
(@CGUID+127, @CGUID+125, 0, 0, 3),
|
||||||
(@CGUID+128, @CGUID+125, 3),
|
(@CGUID+128, @CGUID+125, 0, 0, 3),
|
||||||
(@CGUID+129, @CGUID+125, 3),
|
(@CGUID+129, @CGUID+125, 0, 0, 3),
|
||||||
(@CGUID+130, @CGUID+125, 3),
|
(@CGUID+130, @CGUID+125, 0, 0, 3),
|
||||||
-- Inquisitor Adds 4
|
-- Inquisitor Adds 4
|
||||||
(@CGUID+131, @CGUID+131, 3),
|
(@CGUID+131, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+132, @CGUID+131, 3),
|
(@CGUID+132, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+133, @CGUID+131, 3),
|
(@CGUID+133, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+134, @CGUID+131, 3),
|
(@CGUID+134, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+135, @CGUID+131, 3),
|
(@CGUID+135, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+131, 3),
|
(@CGUID+136, @CGUID+131, 0, 0, 3),
|
||||||
-- Solarian Adds 1
|
-- Solarian Adds 1
|
||||||
(@CGUID+143, @CGUID+143, 3),
|
(@CGUID+143, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+144, @CGUID+143, 3),
|
(@CGUID+144, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+145, @CGUID+143, 3),
|
(@CGUID+145, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+146, @CGUID+143, 3),
|
(@CGUID+146, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+147, @CGUID+143, 3),
|
(@CGUID+147, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+148, @CGUID+143, 3),
|
(@CGUID+148, @CGUID+143, 0, 0, 3),
|
||||||
-- Solarian Adds 2
|
-- Solarian Adds 2
|
||||||
(@CGUID+149, @CGUID+149, 3),
|
(@CGUID+149, @CGUID+149, 0, 0, 3),
|
||||||
(@CGUID+150, @CGUID+149, 3),
|
(@CGUID+150, @CGUID+149, 0, 0, 3),
|
||||||
(@CGUID+151, @CGUID+149, 3),
|
(@CGUID+151, @CGUID+149, 0, 0, 3),
|
||||||
(@CGUID+152, @CGUID+149, 3),
|
(@CGUID+152, @CGUID+149, 0, 0, 3),
|
||||||
(@CGUID+153, @CGUID+149, 3),
|
(@CGUID+153, @CGUID+149, 0, 0, 3),
|
||||||
(@CGUID+154, @CGUID+149, 3),
|
(@CGUID+154, @CGUID+149, 0, 0, 3),
|
||||||
-- Solarian Adds 3
|
-- Solarian Adds 3
|
||||||
(@CGUID+155, @CGUID+155, 3),
|
(@CGUID+155, @CGUID+155, 0, 0, 3),
|
||||||
(@CGUID+156, @CGUID+155, 3),
|
(@CGUID+156, @CGUID+155, 0, 0, 3),
|
||||||
(@CGUID+157, @CGUID+155, 3),
|
(@CGUID+157, @CGUID+155, 0, 0, 3),
|
||||||
(@CGUID+158, @CGUID+155, 3),
|
(@CGUID+158, @CGUID+155, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+155, 3),
|
(@CGUID+159, @CGUID+155, 0, 0, 3),
|
||||||
(@CGUID+160, @CGUID+155, 3),
|
(@CGUID+160, @CGUID+155, 0, 0, 3),
|
||||||
-- Solarian Adds 4
|
-- Solarian Adds 4
|
||||||
(@CGUID+161, @CGUID+161, 3),
|
(@CGUID+161, @CGUID+161, 0, 0, 3),
|
||||||
(@CGUID+162, @CGUID+161, 3),
|
(@CGUID+162, @CGUID+161, 0, 0, 3),
|
||||||
(@CGUID+163, @CGUID+161, 3),
|
(@CGUID+163, @CGUID+161, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+161, 3),
|
(@CGUID+164, @CGUID+161, 0, 0, 3),
|
||||||
(@CGUID+165, @CGUID+161, 3),
|
(@CGUID+165, @CGUID+161, 0, 0, 3),
|
||||||
(@CGUID+166, @CGUID+161, 3),
|
(@CGUID+166, @CGUID+161, 0, 0, 3),
|
||||||
-- Solarian Adds 5
|
-- Solarian Adds 5
|
||||||
(@CGUID+167, @CGUID+167, 3),
|
(@CGUID+167, @CGUID+167, 0, 0, 3),
|
||||||
(@CGUID+168, @CGUID+167, 3),
|
(@CGUID+168, @CGUID+167, 0, 0, 3),
|
||||||
(@CGUID+169, @CGUID+167, 3),
|
(@CGUID+169, @CGUID+167, 0, 0, 3),
|
||||||
(@CGUID+170, @CGUID+167, 3),
|
(@CGUID+170, @CGUID+167, 0, 0, 3),
|
||||||
(@CGUID+171, @CGUID+167, 3),
|
(@CGUID+171, @CGUID+167, 0, 0, 3),
|
||||||
(@CGUID+172, @CGUID+167, 3),
|
(@CGUID+172, @CGUID+167, 0, 0, 3),
|
||||||
-- Solarian Adds 6
|
-- Solarian Adds 6
|
||||||
(@CGUID+173, @CGUID+173, 3),
|
(@CGUID+173, @CGUID+173, 0, 0, 3),
|
||||||
(@CGUID+174, @CGUID+173, 3),
|
(@CGUID+174, @CGUID+173, 0, 0, 3),
|
||||||
(@CGUID+175, @CGUID+173, 3),
|
(@CGUID+175, @CGUID+173, 0, 0, 3),
|
||||||
(@CGUID+176, @CGUID+173, 3),
|
(@CGUID+176, @CGUID+173, 0, 0, 3),
|
||||||
(@CGUID+177, @CGUID+173, 3),
|
(@CGUID+177, @CGUID+173, 0, 0, 3),
|
||||||
(@CGUID+178, @CGUID+173, 3),
|
(@CGUID+178, @CGUID+173, 0, 0, 3),
|
||||||
-- Kael Trash 1
|
-- Kael Trash 1
|
||||||
(@CGUID+180, @CGUID+180, 3),
|
(@CGUID+180, @CGUID+180, 0, 0, 3),
|
||||||
(@CGUID+181, @CGUID+180, 3),
|
(@CGUID+181, @CGUID+180, 0, 0, 3),
|
||||||
(@CGUID+182, @CGUID+180, 3),
|
(@CGUID+182, @CGUID+180, 0, 0, 3),
|
||||||
(@CGUID+183, @CGUID+180, 3),
|
(@CGUID+183, @CGUID+180, 0, 0, 3),
|
||||||
-- Kael Trash 2
|
-- Kael Trash 2
|
||||||
(@CGUID+184, @CGUID+184, 3),
|
(@CGUID+184, @CGUID+184, 0, 0, 3),
|
||||||
(@CGUID+185, @CGUID+184, 3),
|
(@CGUID+185, @CGUID+184, 0, 0, 3),
|
||||||
(@CGUID+186, @CGUID+184, 3),
|
(@CGUID+186, @CGUID+184, 0, 0, 3),
|
||||||
(@CGUID+187, @CGUID+184, 3),
|
(@CGUID+187, @CGUID+184, 0, 0, 3),
|
||||||
-- Kael Trash 3
|
-- Kael Trash 3
|
||||||
(@CGUID+188, @CGUID+188, 3),
|
(@CGUID+188, @CGUID+188, 0, 0, 3),
|
||||||
(@CGUID+189, @CGUID+188, 3),
|
(@CGUID+189, @CGUID+188, 0, 0, 3),
|
||||||
(@CGUID+190, @CGUID+188, 3),
|
(@CGUID+190, @CGUID+188, 0, 0, 3),
|
||||||
(@CGUID+191, @CGUID+188, 3),
|
(@CGUID+191, @CGUID+188, 0, 0, 3),
|
||||||
-- Kael & Advisors
|
-- Kael & Advisors
|
||||||
(@CGUID+218, @CGUID+218, 24),
|
(@CGUID+218, @CGUID+218, 0, 0, 24),
|
||||||
(@CGUID+219, @CGUID+218, 24),
|
(@CGUID+219, @CGUID+218, 0, 0, 24),
|
||||||
(@CGUID+220, @CGUID+218, 24),
|
(@CGUID+220, @CGUID+218, 0, 0, 24),
|
||||||
(@CGUID+221, @CGUID+218, 24),
|
(@CGUID+221, @CGUID+218, 0, 0, 24),
|
||||||
(@CGUID+222, @CGUID+218, 24);
|
(@CGUID+222, @CGUID+218, 0, 0, 24);
|
||||||
|
|
||||||
-- Update SheatheState en masse
|
-- Update SheatheState en masse
|
||||||
UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE `entry` IN (18805,19514,19516,19622,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20052,20060,20062,20063,20064,22515,22517);
|
UPDATE `creature_template_addon` SET `bytes2` = 1 WHERE `entry` IN (18805,19514,19516,19622,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20052,20060,20062,20063,20064,22515,22517);
|
||||||
|
|||||||
@@ -3770,411 +3770,411 @@ INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`
|
|||||||
-- 0x203CA44680168B80007C2000008127DD .go xyz 409.20535 785.9281 14.643406
|
-- 0x203CA44680168B80007C2000008127DD .go xyz 409.20535 785.9281 14.643406
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+1,@CGUID+2,@CGUID+3,@CGUID+4,@CGUID+5,@CGUID+6,@CGUID+7,@CGUID+8,@CGUID+9,@CGUID+10,@CGUID+11,@CGUID+12,@CGUID+23,@CGUID+24,@CGUID+25,@CGUID+26,@CGUID+27,@CGUID+28,@CGUID+29,@CGUID+30,@CGUID+31,@CGUID+32,@CGUID+33,@CGUID+34,@CGUID+35,@CGUID+36,@CGUID+37,@CGUID+38,@CGUID+39,@CGUID+40,@CGUID+41,@CGUID+42,@CGUID+43,@CGUID+44,@CGUID+45,@CGUID+46,@CGUID+47,@CGUID+48,@CGUID+49,@CGUID+50,@CGUID+51,@CGUID+52,@CGUID+53,@CGUID+54,@CGUID+62,@CGUID+63,@CGUID+64,@CGUID+65,@CGUID+66,@CGUID+67,@CGUID+68,@CGUID+69,@CGUID+70,@CGUID+71,@CGUID+74,@CGUID+75,@CGUID+76,@CGUID+77,@CGUID+78,@CGUID+79,@CGUID+82,@CGUID+83,@CGUID+84,@CGUID+85,@CGUID+86,@CGUID+87,@CGUID+88,@CGUID+89,@CGUID+90,@CGUID+91,@CGUID+92,@CGUID+93,@CGUID+94,@CGUID+95,@CGUID+96,@CGUID+97,@CGUID+98,@CGUID+99,@CGUID+146,@CGUID+147,@CGUID+148,@CGUID+149,@CGUID+150,@CGUID+151,@CGUID+152,@CGUID+153,@CGUID+154,@CGUID+155,@CGUID+156,@CGUID+157,@CGUID+158,@CGUID+159,@CGUID+160,@CGUID+161,@CGUID+162,@CGUID+163,@CGUID+164,@CGUID+165,@CGUID+166,@CGUID+167,@CGUID+168,@CGUID+169,@CGUID+170,@CGUID+171,@CGUID+172,@CGUID+173,@CGUID+174,@CGUID+175,@CGUID+188,@CGUID+189,@CGUID+190,@CGUID+191,@CGUID+192,@CGUID+193,@CGUID+194,@CGUID+195,@CGUID+196,@CGUID+197,@CGUID+198,@CGUID+199,@CGUID+200,@CGUID+201,@CGUID+202,@CGUID+203,@CGUID+204,@CGUID+205,@CGUID+206,@CGUID+207,@CGUID+208,@CGUID+209,@CGUID+210,@CGUID+211,@CGUID+212,@CGUID+213,@CGUID+222,@CGUID+223,@CGUID+224,@CGUID+225,@CGUID+226,@CGUID+227,@CGUID+228,@CGUID+229,@CGUID+253,@CGUID+254,@CGUID+255,@CGUID+256,@CGUID+266,@CGUID+267,@CGUID+268,@CGUID+269,@CGUID+270,@CGUID+271,@CGUID+272,@CGUID+273,@CGUID+274,@CGUID+275,@CGUID+276,@CGUID+277,@CGUID+278,@CGUID+279,@CGUID+280,@CGUID+281,@CGUID+282,@CGUID+283,@CGUID+284,@CGUID+287,@CGUID+289,@CGUID+290,@CGUID+291,@CGUID+292,@CGUID+293,@CGUID+294,@CGUID+295,@CGUID+296,@CGUID+297,@CGUID+298,@CGUID+299,@CGUID+300,@CGUID+301,@CGUID+302,@CGUID+303,@CGUID+304,@CGUID+305,@CGUID+318,@CGUID+319,@CGUID+320,@CGUID+321,@CGUID+322,@CGUID+323,@CGUID+324,@CGUID+325,@CGUID+326,@CGUID+327,@CGUID+328,@CGUID+329,@CGUID+330,@CGUID+331,@CGUID+365,@CGUID+366,@CGUID+367,@CGUID+368,@CGUID+369,@CGUID+370,@CGUID+371,@CGUID+372,@CGUID+373,@CGUID+374,@CGUID+375,@CGUID+376,@CGUID+377,@CGUID+378,@CGUID+379,@CGUID+380,@CGUID+383,@CGUID+384,@CGUID+385,@CGUID+386,@CGUID+387,@CGUID+388,@CGUID+389,@CGUID+390,@CGUID+391,@CGUID+392,@CGUID+393,@CGUID+396,@CGUID+397,@CGUID+398,@CGUID+399,@CGUID+400,@CGUID+401,@CGUID+402,@CGUID+403,@CGUID+404,@CGUID+405,@CGUID+406,@CGUID+418,@CGUID+419,@CGUID+420,@CGUID+421,@CGUID+422,@CGUID+423,@CGUID+540,@CGUID+541,@CGUID+542,@CGUID+543,@CGUID+544,@CGUID+545,@CGUID+546,@CGUID+547,@CGUID+548,@CGUID+549,@CGUID+550,@CGUID+551,@CGUID+552,@CGUID+553,@CGUID+554,@CGUID+555,@CGUID+556,@CGUID+557,@CGUID+558,@CGUID+559,@CGUID+560,@CGUID+561,@CGUID+562,@CGUID+563,@CGUID+564,@CGUID+565,@CGUID+566,@CGUID+567,@CGUID+568,@CGUID+569,@CGUID+570,@CGUID+571,@CGUID+572,@CGUID+573,@CGUID+574,@CGUID+575,@CGUID+576,@CGUID+577,@CGUID+578,@CGUID+579,@CGUID+580,@CGUID+581,@CGUID+582,@CGUID+583,@CGUID+584,@CGUID+585,@CGUID+586,@CGUID+587,@CGUID+588,@CGUID+589,@CGUID+592,@CGUID+593,@CGUID+594,@CGUID+595,@CGUID+596,@CGUID+597,@CGUID+598,@CGUID+599,@CGUID+600,@CGUID+601,@CGUID+602,@CGUID+603,@CGUID+605,@CGUID+606,@CGUID+607,@CGUID+608,@CGUID+609,@CGUID+610,@CGUID+611,@CGUID+612,@CGUID+613,@CGUID+614,@CGUID+615,@CGUID+616,@CGUID+617,@CGUID+618,@CGUID+619,@CGUID+620,@CGUID+621,@CGUID+622,@CGUID+623,@CGUID+624,@CGUID+625,@CGUID+626,@CGUID+627,@CGUID+628,@CGUID+629,@CGUID+630,@CGUID+631,@CGUID+632,@CGUID+633,@CGUID+634,@CGUID+635,@CGUID+636,@CGUID+637,@CGUID+638,@CGUID+639,@CGUID+640,@CGUID+641,@CGUID+642,@CGUID+643,@CGUID+644,@CGUID+645,@CGUID+646,@CGUID+647,@CGUID+648,@CGUID+649,@CGUID+650,@CGUID+651,@CGUID+652,@CGUID+653,@CGUID+654,@CGUID+655,@CGUID+656,@CGUID+657,@CGUID+658,@CGUID+659,@CGUID+660,@CGUID+661,@CGUID+662,@CGUID+663,@CGUID+664,@CGUID+665,@CGUID+666,@CGUID+667,@CGUID+668,@CGUID+669,@CGUID+670,@CGUID+671,@CGUID+672,@CGUID+673,@CGUID+674,@CGUID+675,@CGUID+676,@CGUID+677,@CGUID+691,@CGUID+692,@CGUID+693,@CGUID+694,@CGUID+695,@CGUID+696,@CGUID+697,@CGUID+698,@CGUID+699,@CGUID+700,@CGUID+701,@CGUID+702,@CGUID+703,@CGUID+704,@CGUID+705,@CGUID+706,@CGUID+707,@CGUID+708,@CGUID+709,@CGUID+710,@CGUID+711,@CGUID+712,@CGUID+713,@CGUID+714,@CGUID+716,@CGUID+717,@CGUID+718,@CGUID+719) AND `groupAI` IN (3, 27);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+1,@CGUID+2,@CGUID+3,@CGUID+4,@CGUID+5,@CGUID+6,@CGUID+7,@CGUID+8,@CGUID+9,@CGUID+10,@CGUID+11,@CGUID+12,@CGUID+23,@CGUID+24,@CGUID+25,@CGUID+26,@CGUID+27,@CGUID+28,@CGUID+29,@CGUID+30,@CGUID+31,@CGUID+32,@CGUID+33,@CGUID+34,@CGUID+35,@CGUID+36,@CGUID+37,@CGUID+38,@CGUID+39,@CGUID+40,@CGUID+41,@CGUID+42,@CGUID+43,@CGUID+44,@CGUID+45,@CGUID+46,@CGUID+47,@CGUID+48,@CGUID+49,@CGUID+50,@CGUID+51,@CGUID+52,@CGUID+53,@CGUID+54,@CGUID+62,@CGUID+63,@CGUID+64,@CGUID+65,@CGUID+66,@CGUID+67,@CGUID+68,@CGUID+69,@CGUID+70,@CGUID+71,@CGUID+74,@CGUID+75,@CGUID+76,@CGUID+77,@CGUID+78,@CGUID+79,@CGUID+82,@CGUID+83,@CGUID+84,@CGUID+85,@CGUID+86,@CGUID+87,@CGUID+88,@CGUID+89,@CGUID+90,@CGUID+91,@CGUID+92,@CGUID+93,@CGUID+94,@CGUID+95,@CGUID+96,@CGUID+97,@CGUID+98,@CGUID+99,@CGUID+146,@CGUID+147,@CGUID+148,@CGUID+149,@CGUID+150,@CGUID+151,@CGUID+152,@CGUID+153,@CGUID+154,@CGUID+155,@CGUID+156,@CGUID+157,@CGUID+158,@CGUID+159,@CGUID+160,@CGUID+161,@CGUID+162,@CGUID+163,@CGUID+164,@CGUID+165,@CGUID+166,@CGUID+167,@CGUID+168,@CGUID+169,@CGUID+170,@CGUID+171,@CGUID+172,@CGUID+173,@CGUID+174,@CGUID+175,@CGUID+188,@CGUID+189,@CGUID+190,@CGUID+191,@CGUID+192,@CGUID+193,@CGUID+194,@CGUID+195,@CGUID+196,@CGUID+197,@CGUID+198,@CGUID+199,@CGUID+200,@CGUID+201,@CGUID+202,@CGUID+203,@CGUID+204,@CGUID+205,@CGUID+206,@CGUID+207,@CGUID+208,@CGUID+209,@CGUID+210,@CGUID+211,@CGUID+212,@CGUID+213,@CGUID+222,@CGUID+223,@CGUID+224,@CGUID+225,@CGUID+226,@CGUID+227,@CGUID+228,@CGUID+229,@CGUID+253,@CGUID+254,@CGUID+255,@CGUID+256,@CGUID+266,@CGUID+267,@CGUID+268,@CGUID+269,@CGUID+270,@CGUID+271,@CGUID+272,@CGUID+273,@CGUID+274,@CGUID+275,@CGUID+276,@CGUID+277,@CGUID+278,@CGUID+279,@CGUID+280,@CGUID+281,@CGUID+282,@CGUID+283,@CGUID+284,@CGUID+287,@CGUID+289,@CGUID+290,@CGUID+291,@CGUID+292,@CGUID+293,@CGUID+294,@CGUID+295,@CGUID+296,@CGUID+297,@CGUID+298,@CGUID+299,@CGUID+300,@CGUID+301,@CGUID+302,@CGUID+303,@CGUID+304,@CGUID+305,@CGUID+318,@CGUID+319,@CGUID+320,@CGUID+321,@CGUID+322,@CGUID+323,@CGUID+324,@CGUID+325,@CGUID+326,@CGUID+327,@CGUID+328,@CGUID+329,@CGUID+330,@CGUID+331,@CGUID+365,@CGUID+366,@CGUID+367,@CGUID+368,@CGUID+369,@CGUID+370,@CGUID+371,@CGUID+372,@CGUID+373,@CGUID+374,@CGUID+375,@CGUID+376,@CGUID+377,@CGUID+378,@CGUID+379,@CGUID+380,@CGUID+383,@CGUID+384,@CGUID+385,@CGUID+386,@CGUID+387,@CGUID+388,@CGUID+389,@CGUID+390,@CGUID+391,@CGUID+392,@CGUID+393,@CGUID+396,@CGUID+397,@CGUID+398,@CGUID+399,@CGUID+400,@CGUID+401,@CGUID+402,@CGUID+403,@CGUID+404,@CGUID+405,@CGUID+406,@CGUID+418,@CGUID+419,@CGUID+420,@CGUID+421,@CGUID+422,@CGUID+423,@CGUID+540,@CGUID+541,@CGUID+542,@CGUID+543,@CGUID+544,@CGUID+545,@CGUID+546,@CGUID+547,@CGUID+548,@CGUID+549,@CGUID+550,@CGUID+551,@CGUID+552,@CGUID+553,@CGUID+554,@CGUID+555,@CGUID+556,@CGUID+557,@CGUID+558,@CGUID+559,@CGUID+560,@CGUID+561,@CGUID+562,@CGUID+563,@CGUID+564,@CGUID+565,@CGUID+566,@CGUID+567,@CGUID+568,@CGUID+569,@CGUID+570,@CGUID+571,@CGUID+572,@CGUID+573,@CGUID+574,@CGUID+575,@CGUID+576,@CGUID+577,@CGUID+578,@CGUID+579,@CGUID+580,@CGUID+581,@CGUID+582,@CGUID+583,@CGUID+584,@CGUID+585,@CGUID+586,@CGUID+587,@CGUID+588,@CGUID+589,@CGUID+592,@CGUID+593,@CGUID+594,@CGUID+595,@CGUID+596,@CGUID+597,@CGUID+598,@CGUID+599,@CGUID+600,@CGUID+601,@CGUID+602,@CGUID+603,@CGUID+605,@CGUID+606,@CGUID+607,@CGUID+608,@CGUID+609,@CGUID+610,@CGUID+611,@CGUID+612,@CGUID+613,@CGUID+614,@CGUID+615,@CGUID+616,@CGUID+617,@CGUID+618,@CGUID+619,@CGUID+620,@CGUID+621,@CGUID+622,@CGUID+623,@CGUID+624,@CGUID+625,@CGUID+626,@CGUID+627,@CGUID+628,@CGUID+629,@CGUID+630,@CGUID+631,@CGUID+632,@CGUID+633,@CGUID+634,@CGUID+635,@CGUID+636,@CGUID+637,@CGUID+638,@CGUID+639,@CGUID+640,@CGUID+641,@CGUID+642,@CGUID+643,@CGUID+644,@CGUID+645,@CGUID+646,@CGUID+647,@CGUID+648,@CGUID+649,@CGUID+650,@CGUID+651,@CGUID+652,@CGUID+653,@CGUID+654,@CGUID+655,@CGUID+656,@CGUID+657,@CGUID+658,@CGUID+659,@CGUID+660,@CGUID+661,@CGUID+662,@CGUID+663,@CGUID+664,@CGUID+665,@CGUID+666,@CGUID+667,@CGUID+668,@CGUID+669,@CGUID+670,@CGUID+671,@CGUID+672,@CGUID+673,@CGUID+674,@CGUID+675,@CGUID+676,@CGUID+677,@CGUID+691,@CGUID+692,@CGUID+693,@CGUID+694,@CGUID+695,@CGUID+696,@CGUID+697,@CGUID+698,@CGUID+699,@CGUID+700,@CGUID+701,@CGUID+702,@CGUID+703,@CGUID+704,@CGUID+705,@CGUID+706,@CGUID+707,@CGUID+708,@CGUID+709,@CGUID+710,@CGUID+711,@CGUID+712,@CGUID+713,@CGUID+714,@CGUID+716,@CGUID+717,@CGUID+718,@CGUID+719) AND `groupAI` IN (3, 27);
|
||||||
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(@CGUID+1 , @CGUID+1 , 3),
|
(@CGUID+1, @CGUID+1, 0, 0, 3),
|
||||||
(@CGUID+2 , @CGUID+1 , 3),
|
(@CGUID+2, @CGUID+1, 0, 0, 3),
|
||||||
(@CGUID+3 , @CGUID+1 , 3),
|
(@CGUID+3, @CGUID+1, 0, 0, 3),
|
||||||
(@CGUID+4 , @CGUID+4 , 3),
|
(@CGUID+4, @CGUID+4, 0, 0, 3),
|
||||||
(@CGUID+5 , @CGUID+4 , 3),
|
(@CGUID+5, @CGUID+4, 0, 0, 3),
|
||||||
(@CGUID+6 , @CGUID+4 , 3),
|
(@CGUID+6, @CGUID+4, 0, 0, 3),
|
||||||
(@CGUID+7 , @CGUID+7 , 3),
|
(@CGUID+7, @CGUID+7, 0, 0, 3),
|
||||||
(@CGUID+8 , @CGUID+7 , 3),
|
(@CGUID+8, @CGUID+7, 0, 0, 3),
|
||||||
(@CGUID+9 , @CGUID+7 , 3),
|
(@CGUID+9, @CGUID+7, 0, 0, 3),
|
||||||
(@CGUID+10 , @CGUID+10 , 3),
|
(@CGUID+10, @CGUID+10, 0, 0, 3),
|
||||||
(@CGUID+11 , @CGUID+10 , 3),
|
(@CGUID+11, @CGUID+10, 0, 0, 3),
|
||||||
(@CGUID+12 , @CGUID+10 , 3),
|
(@CGUID+12, @CGUID+10, 0, 0, 3),
|
||||||
(@CGUID+23 , @CGUID+23 , 3),
|
(@CGUID+23, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+24 , @CGUID+23 , 3),
|
(@CGUID+24, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+25 , @CGUID+23 , 3),
|
(@CGUID+25, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+26 , @CGUID+23 , 3),
|
(@CGUID+26, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+27 , @CGUID+23 , 3),
|
(@CGUID+27, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+28 , @CGUID+23 , 3),
|
(@CGUID+28, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+29 , @CGUID+23 , 3),
|
(@CGUID+29, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+30 , @CGUID+23 , 3),
|
(@CGUID+30, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+31 , @CGUID+23 , 3),
|
(@CGUID+31, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+32 , @CGUID+23 , 3),
|
(@CGUID+32, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+33 , @CGUID+33 , 3),
|
(@CGUID+33, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+34 , @CGUID+33 , 3),
|
(@CGUID+34, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+35 , @CGUID+33 , 3),
|
(@CGUID+35, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+36 , @CGUID+33 , 3),
|
(@CGUID+36, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+37 , @CGUID+33 , 3),
|
(@CGUID+37, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+38 , @CGUID+33 , 3),
|
(@CGUID+38, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+39 , @CGUID+33 , 3),
|
(@CGUID+39, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+40 , @CGUID+33 , 3),
|
(@CGUID+40, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+41 , @CGUID+33 , 3),
|
(@CGUID+41, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+42 , @CGUID+33 , 3),
|
(@CGUID+42, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+43 , @CGUID+43 , 3),
|
(@CGUID+43, @CGUID+43, 0, 0, 3),
|
||||||
(@CGUID+44 , @CGUID+43 , 3),
|
(@CGUID+44, @CGUID+43, 0, 0, 3),
|
||||||
(@CGUID+45 , @CGUID+43 , 3),
|
(@CGUID+45, @CGUID+43, 0, 0, 3),
|
||||||
(@CGUID+46 , @CGUID+43 , 3),
|
(@CGUID+46, @CGUID+43, 0, 0, 3),
|
||||||
(@CGUID+47 , @CGUID+43 , 3),
|
(@CGUID+47, @CGUID+43, 0, 0, 3),
|
||||||
(@CGUID+48 , @CGUID+43 , 3),
|
(@CGUID+48, @CGUID+43, 0, 0, 3),
|
||||||
(@CGUID+49 , @CGUID+49 , 3),
|
(@CGUID+49, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+50 , @CGUID+49 , 3),
|
(@CGUID+50, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+51 , @CGUID+49 , 3),
|
(@CGUID+51, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+52 , @CGUID+49 , 3),
|
(@CGUID+52, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+53 , @CGUID+49 , 3),
|
(@CGUID+53, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+54 , @CGUID+49 , 3),
|
(@CGUID+54, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+62 , @CGUID+62 , 27),
|
(@CGUID+62, @CGUID+62, 0, 0, 27),
|
||||||
(@CGUID+63 , @CGUID+62 , 27),
|
(@CGUID+63, @CGUID+62, 0, 0, 27),
|
||||||
(@CGUID+64 , @CGUID+62 , 27),
|
(@CGUID+64, @CGUID+62, 0, 0, 27),
|
||||||
(@CGUID+65 , @CGUID+65 , 3),
|
(@CGUID+65, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+66 , @CGUID+65 , 3),
|
(@CGUID+66, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+67 , @CGUID+65 , 3),
|
(@CGUID+67, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+68 , @CGUID+65 , 3),
|
(@CGUID+68, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+69 , @CGUID+65 , 3),
|
(@CGUID+69, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+70 , @CGUID+65 , 3),
|
(@CGUID+70, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+71 , @CGUID+65 , 3),
|
(@CGUID+71, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+74 , @CGUID+74 , 3),
|
(@CGUID+74, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+75 , @CGUID+74 , 3),
|
(@CGUID+75, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+76 , @CGUID+74 , 3),
|
(@CGUID+76, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+77 , @CGUID+74 , 3),
|
(@CGUID+77, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+78 , @CGUID+74 , 3),
|
(@CGUID+78, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+79 , @CGUID+74 , 3),
|
(@CGUID+79, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+82 , @CGUID+82 , 3),
|
(@CGUID+82, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+83 , @CGUID+82 , 3),
|
(@CGUID+83, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+84 , @CGUID+82 , 3),
|
(@CGUID+84, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+85 , @CGUID+82 , 3),
|
(@CGUID+85, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+86 , @CGUID+82 , 3),
|
(@CGUID+86, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+87 , @CGUID+87 , 3),
|
(@CGUID+87, @CGUID+87, 0, 0, 3),
|
||||||
(@CGUID+88 , @CGUID+87 , 3),
|
(@CGUID+88, @CGUID+87, 0, 0, 3),
|
||||||
(@CGUID+89 , @CGUID+87 , 3),
|
(@CGUID+89, @CGUID+87, 0, 0, 3),
|
||||||
(@CGUID+90 , @CGUID+87 , 3),
|
(@CGUID+90, @CGUID+87, 0, 0, 3),
|
||||||
(@CGUID+91 , @CGUID+87 , 3),
|
(@CGUID+91, @CGUID+87, 0, 0, 3),
|
||||||
(@CGUID+92 , @CGUID+87 , 3),
|
(@CGUID+92, @CGUID+87, 0, 0, 3),
|
||||||
(@CGUID+93 , @CGUID+87 , 3),
|
(@CGUID+93, @CGUID+87, 0, 0, 3),
|
||||||
(@CGUID+94 , @CGUID+94 , 3),
|
(@CGUID+94, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+95 , @CGUID+94 , 3),
|
(@CGUID+95, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+96 , @CGUID+94 , 3),
|
(@CGUID+96, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+97 , @CGUID+94 , 3),
|
(@CGUID+97, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+98 , @CGUID+94 , 3),
|
(@CGUID+98, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+99 , @CGUID+94 , 3),
|
(@CGUID+99, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+146, @CGUID+146, 3),
|
(@CGUID+146, @CGUID+146, 0, 0, 3),
|
||||||
(@CGUID+147, @CGUID+146, 3),
|
(@CGUID+147, @CGUID+146, 0, 0, 3),
|
||||||
(@CGUID+148, @CGUID+146, 3),
|
(@CGUID+148, @CGUID+146, 0, 0, 3),
|
||||||
(@CGUID+149, @CGUID+146, 3),
|
(@CGUID+149, @CGUID+146, 0, 0, 3),
|
||||||
(@CGUID+150, @CGUID+146, 3),
|
(@CGUID+150, @CGUID+146, 0, 0, 3),
|
||||||
(@CGUID+151, @CGUID+146, 3),
|
(@CGUID+151, @CGUID+146, 0, 0, 3),
|
||||||
(@CGUID+152, @CGUID+152, 3),
|
(@CGUID+152, @CGUID+152, 0, 0, 3),
|
||||||
(@CGUID+153, @CGUID+152, 3),
|
(@CGUID+153, @CGUID+152, 0, 0, 3),
|
||||||
(@CGUID+154, @CGUID+152, 3),
|
(@CGUID+154, @CGUID+152, 0, 0, 3),
|
||||||
(@CGUID+155, @CGUID+152, 3),
|
(@CGUID+155, @CGUID+152, 0, 0, 3),
|
||||||
(@CGUID+156, @CGUID+152, 3),
|
(@CGUID+156, @CGUID+152, 0, 0, 3),
|
||||||
(@CGUID+157, @CGUID+152, 3),
|
(@CGUID+157, @CGUID+152, 0, 0, 3),
|
||||||
(@CGUID+158, @CGUID+158, 3),
|
(@CGUID+158, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+158, 3),
|
(@CGUID+159, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+160, @CGUID+158, 3),
|
(@CGUID+160, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+161, @CGUID+158, 3),
|
(@CGUID+161, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+162, @CGUID+158, 3),
|
(@CGUID+162, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+163, @CGUID+158, 3),
|
(@CGUID+163, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+164, 3),
|
(@CGUID+164, @CGUID+164, 0, 0, 3),
|
||||||
(@CGUID+165, @CGUID+164, 3),
|
(@CGUID+165, @CGUID+164, 0, 0, 3),
|
||||||
(@CGUID+166, @CGUID+164, 3),
|
(@CGUID+166, @CGUID+164, 0, 0, 3),
|
||||||
(@CGUID+167, @CGUID+164, 3),
|
(@CGUID+167, @CGUID+164, 0, 0, 3),
|
||||||
(@CGUID+168, @CGUID+164, 3),
|
(@CGUID+168, @CGUID+164, 0, 0, 3),
|
||||||
(@CGUID+169, @CGUID+164, 3),
|
(@CGUID+169, @CGUID+164, 0, 0, 3),
|
||||||
(@CGUID+170, @CGUID+170, 3),
|
(@CGUID+170, @CGUID+170, 0, 0, 3),
|
||||||
(@CGUID+171, @CGUID+170, 3),
|
(@CGUID+171, @CGUID+170, 0, 0, 3),
|
||||||
(@CGUID+172, @CGUID+170, 3),
|
(@CGUID+172, @CGUID+170, 0, 0, 3),
|
||||||
(@CGUID+173, @CGUID+170, 3),
|
(@CGUID+173, @CGUID+170, 0, 0, 3),
|
||||||
(@CGUID+174, @CGUID+170, 3),
|
(@CGUID+174, @CGUID+170, 0, 0, 3),
|
||||||
(@CGUID+175, @CGUID+170, 3),
|
(@CGUID+175, @CGUID+170, 0, 0, 3),
|
||||||
(@CGUID+188, @CGUID+188, 3),
|
(@CGUID+188, @CGUID+188, 0, 0, 3),
|
||||||
(@CGUID+189, @CGUID+188, 3),
|
(@CGUID+189, @CGUID+188, 0, 0, 3),
|
||||||
(@CGUID+190, @CGUID+190, 3),
|
(@CGUID+190, @CGUID+190, 0, 0, 3),
|
||||||
(@CGUID+191, @CGUID+190, 3),
|
(@CGUID+191, @CGUID+190, 0, 0, 3),
|
||||||
(@CGUID+192, @CGUID+192, 3),
|
(@CGUID+192, @CGUID+192, 0, 0, 3),
|
||||||
(@CGUID+193, @CGUID+192, 3),
|
(@CGUID+193, @CGUID+192, 0, 0, 3),
|
||||||
(@CGUID+194, @CGUID+194, 3),
|
(@CGUID+194, @CGUID+194, 0, 0, 3),
|
||||||
(@CGUID+195, @CGUID+194, 3),
|
(@CGUID+195, @CGUID+194, 0, 0, 3),
|
||||||
(@CGUID+196, @CGUID+196, 3),
|
(@CGUID+196, @CGUID+196, 0, 0, 3),
|
||||||
(@CGUID+197, @CGUID+196, 3),
|
(@CGUID+197, @CGUID+196, 0, 0, 3),
|
||||||
(@CGUID+198, @CGUID+198, 3),
|
(@CGUID+198, @CGUID+198, 0, 0, 3),
|
||||||
(@CGUID+199, @CGUID+198, 3),
|
(@CGUID+199, @CGUID+198, 0, 0, 3),
|
||||||
(@CGUID+200, @CGUID+198, 3),
|
(@CGUID+200, @CGUID+198, 0, 0, 3),
|
||||||
(@CGUID+201, @CGUID+198, 3),
|
(@CGUID+201, @CGUID+198, 0, 0, 3),
|
||||||
(@CGUID+202, @CGUID+198, 3),
|
(@CGUID+202, @CGUID+198, 0, 0, 3),
|
||||||
(@CGUID+203, @CGUID+198, 3),
|
(@CGUID+203, @CGUID+198, 0, 0, 3),
|
||||||
(@CGUID+204, @CGUID+198, 3),
|
(@CGUID+204, @CGUID+198, 0, 0, 3),
|
||||||
(@CGUID+205, @CGUID+198, 3),
|
(@CGUID+205, @CGUID+198, 0, 0, 3),
|
||||||
(@CGUID+206, @CGUID+206, 3),
|
(@CGUID+206, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+207, @CGUID+206, 3),
|
(@CGUID+207, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+208, @CGUID+206, 3),
|
(@CGUID+208, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+209, @CGUID+206, 3),
|
(@CGUID+209, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+210, @CGUID+206, 3),
|
(@CGUID+210, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+211, @CGUID+206, 3),
|
(@CGUID+211, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+212, @CGUID+206, 3),
|
(@CGUID+212, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+213, @CGUID+206, 3),
|
(@CGUID+213, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+222, @CGUID+222, 3),
|
(@CGUID+222, @CGUID+222, 0, 0, 3),
|
||||||
(@CGUID+223, @CGUID+222, 3),
|
(@CGUID+223, @CGUID+222, 0, 0, 3),
|
||||||
(@CGUID+224, @CGUID+222, 3),
|
(@CGUID+224, @CGUID+222, 0, 0, 3),
|
||||||
(@CGUID+225, @CGUID+222, 3),
|
(@CGUID+225, @CGUID+222, 0, 0, 3),
|
||||||
(@CGUID+226, @CGUID+226, 3),
|
(@CGUID+226, @CGUID+226, 0, 0, 3),
|
||||||
(@CGUID+227, @CGUID+226, 3),
|
(@CGUID+227, @CGUID+226, 0, 0, 3),
|
||||||
(@CGUID+228, @CGUID+226, 3),
|
(@CGUID+228, @CGUID+226, 0, 0, 3),
|
||||||
(@CGUID+229, @CGUID+226, 3),
|
(@CGUID+229, @CGUID+226, 0, 0, 3),
|
||||||
(@CGUID+253, @CGUID+253, 3),
|
(@CGUID+253, @CGUID+253, 0, 0, 3),
|
||||||
(@CGUID+254, @CGUID+253, 3),
|
(@CGUID+254, @CGUID+253, 0, 0, 3),
|
||||||
(@CGUID+255, @CGUID+253, 3),
|
(@CGUID+255, @CGUID+253, 0, 0, 3),
|
||||||
(@CGUID+256, @CGUID+253, 3),
|
(@CGUID+256, @CGUID+253, 0, 0, 3),
|
||||||
(@CGUID+266, @CGUID+266, 3),
|
(@CGUID+266, @CGUID+266, 0, 0, 3),
|
||||||
(@CGUID+267, @CGUID+266, 3),
|
(@CGUID+267, @CGUID+266, 0, 0, 3),
|
||||||
(@CGUID+268, @CGUID+266, 3),
|
(@CGUID+268, @CGUID+266, 0, 0, 3),
|
||||||
(@CGUID+269, @CGUID+266, 3),
|
(@CGUID+269, @CGUID+266, 0, 0, 3),
|
||||||
(@CGUID+270, @CGUID+266, 3),
|
(@CGUID+270, @CGUID+266, 0, 0, 3),
|
||||||
(@CGUID+271, @CGUID+266, 3),
|
(@CGUID+271, @CGUID+266, 0, 0, 3),
|
||||||
(@CGUID+272, @CGUID+266, 3),
|
(@CGUID+272, @CGUID+266, 0, 0, 3),
|
||||||
(@CGUID+273, @CGUID+273, 3),
|
(@CGUID+273, @CGUID+273, 0, 0, 3),
|
||||||
(@CGUID+274, @CGUID+273, 3),
|
(@CGUID+274, @CGUID+273, 0, 0, 3),
|
||||||
(@CGUID+275, @CGUID+273, 3),
|
(@CGUID+275, @CGUID+273, 0, 0, 3),
|
||||||
(@CGUID+276, @CGUID+273, 3),
|
(@CGUID+276, @CGUID+273, 0, 0, 3),
|
||||||
(@CGUID+277, @CGUID+273, 3),
|
(@CGUID+277, @CGUID+273, 0, 0, 3),
|
||||||
(@CGUID+278, @CGUID+273, 3),
|
(@CGUID+278, @CGUID+273, 0, 0, 3),
|
||||||
(@CGUID+279, @CGUID+273, 3),
|
(@CGUID+279, @CGUID+273, 0, 0, 3),
|
||||||
(@CGUID+280, @CGUID+280, 3),
|
(@CGUID+280, @CGUID+280, 0, 0, 3),
|
||||||
(@CGUID+281, @CGUID+280, 3),
|
(@CGUID+281, @CGUID+280, 0, 0, 3),
|
||||||
(@CGUID+282, @CGUID+280, 3),
|
(@CGUID+282, @CGUID+280, 0, 0, 3),
|
||||||
(@CGUID+283, @CGUID+280, 3),
|
(@CGUID+283, @CGUID+280, 0, 0, 3),
|
||||||
(@CGUID+284, @CGUID+280, 3),
|
(@CGUID+284, @CGUID+280, 0, 0, 3),
|
||||||
(@CGUID+287, @CGUID+287, 3),
|
(@CGUID+287, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+289, @CGUID+287, 3),
|
(@CGUID+289, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+290, @CGUID+287, 3),
|
(@CGUID+290, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+291, @CGUID+287, 3),
|
(@CGUID+291, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+292, @CGUID+287, 3),
|
(@CGUID+292, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+293, @CGUID+287, 3),
|
(@CGUID+293, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+294, @CGUID+287, 3),
|
(@CGUID+294, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+295, @CGUID+287, 3),
|
(@CGUID+295, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+296, @CGUID+287, 3),
|
(@CGUID+296, @CGUID+287, 0, 0, 3),
|
||||||
(@CGUID+297, @CGUID+297, 3),
|
(@CGUID+297, @CGUID+297, 0, 0, 3),
|
||||||
(@CGUID+298, @CGUID+297, 3),
|
(@CGUID+298, @CGUID+297, 0, 0, 3),
|
||||||
(@CGUID+299, @CGUID+297, 3),
|
(@CGUID+299, @CGUID+297, 0, 0, 3),
|
||||||
(@CGUID+300, @CGUID+297, 3),
|
(@CGUID+300, @CGUID+297, 0, 0, 3),
|
||||||
(@CGUID+301, @CGUID+297, 3),
|
(@CGUID+301, @CGUID+297, 0, 0, 3),
|
||||||
(@CGUID+302, @CGUID+302, 3),
|
(@CGUID+302, @CGUID+302, 0, 0, 3),
|
||||||
(@CGUID+303, @CGUID+302, 3),
|
(@CGUID+303, @CGUID+302, 0, 0, 3),
|
||||||
(@CGUID+304, @CGUID+302, 3),
|
(@CGUID+304, @CGUID+302, 0, 0, 3),
|
||||||
(@CGUID+305, @CGUID+302, 3),
|
(@CGUID+305, @CGUID+302, 0, 0, 3),
|
||||||
(@CGUID+318, @CGUID+318, 3),
|
(@CGUID+318, @CGUID+318, 0, 0, 3),
|
||||||
(@CGUID+319, @CGUID+318, 3),
|
(@CGUID+319, @CGUID+318, 0, 0, 3),
|
||||||
(@CGUID+320, @CGUID+318, 3),
|
(@CGUID+320, @CGUID+318, 0, 0, 3),
|
||||||
(@CGUID+321, @CGUID+318, 3),
|
(@CGUID+321, @CGUID+318, 0, 0, 3),
|
||||||
(@CGUID+322, @CGUID+318, 3),
|
(@CGUID+322, @CGUID+318, 0, 0, 3),
|
||||||
(@CGUID+323, @CGUID+323, 3),
|
(@CGUID+323, @CGUID+323, 0, 0, 3),
|
||||||
(@CGUID+324, @CGUID+323, 3),
|
(@CGUID+324, @CGUID+323, 0, 0, 3),
|
||||||
(@CGUID+325, @CGUID+323, 3),
|
(@CGUID+325, @CGUID+323, 0, 0, 3),
|
||||||
(@CGUID+326, @CGUID+323, 3),
|
(@CGUID+326, @CGUID+323, 0, 0, 3),
|
||||||
(@CGUID+327, @CGUID+323, 3),
|
(@CGUID+327, @CGUID+323, 0, 0, 3),
|
||||||
(@CGUID+328, @CGUID+328, 3),
|
(@CGUID+328, @CGUID+328, 0, 0, 3),
|
||||||
(@CGUID+329, @CGUID+328, 3),
|
(@CGUID+329, @CGUID+328, 0, 0, 3),
|
||||||
(@CGUID+330, @CGUID+330, 3),
|
(@CGUID+330, @CGUID+330, 0, 0, 3),
|
||||||
(@CGUID+331, @CGUID+330, 3),
|
(@CGUID+331, @CGUID+330, 0, 0, 3),
|
||||||
(@CGUID+365, @CGUID+365, 3),
|
(@CGUID+365, @CGUID+365, 0, 0, 3),
|
||||||
(@CGUID+366, @CGUID+365, 3),
|
(@CGUID+366, @CGUID+365, 0, 0, 3),
|
||||||
(@CGUID+367, @CGUID+365, 3),
|
(@CGUID+367, @CGUID+365, 0, 0, 3),
|
||||||
(@CGUID+368, @CGUID+365, 3),
|
(@CGUID+368, @CGUID+365, 0, 0, 3),
|
||||||
(@CGUID+369, @CGUID+365, 3),
|
(@CGUID+369, @CGUID+365, 0, 0, 3),
|
||||||
(@CGUID+370, @CGUID+365, 3),
|
(@CGUID+370, @CGUID+365, 0, 0, 3),
|
||||||
(@CGUID+371, @CGUID+365, 3),
|
(@CGUID+371, @CGUID+365, 0, 0, 3),
|
||||||
(@CGUID+372, @CGUID+365, 3),
|
(@CGUID+372, @CGUID+365, 0, 0, 3),
|
||||||
(@CGUID+373, @CGUID+373, 3),
|
(@CGUID+373, @CGUID+373, 0, 0, 3),
|
||||||
(@CGUID+374, @CGUID+373, 3),
|
(@CGUID+374, @CGUID+373, 0, 0, 3),
|
||||||
(@CGUID+375, @CGUID+373, 3),
|
(@CGUID+375, @CGUID+373, 0, 0, 3),
|
||||||
(@CGUID+376, @CGUID+373, 3),
|
(@CGUID+376, @CGUID+373, 0, 0, 3),
|
||||||
(@CGUID+377, @CGUID+373, 3),
|
(@CGUID+377, @CGUID+373, 0, 0, 3),
|
||||||
(@CGUID+378, @CGUID+373, 3),
|
(@CGUID+378, @CGUID+373, 0, 0, 3),
|
||||||
(@CGUID+379, @CGUID+373, 3),
|
(@CGUID+379, @CGUID+373, 0, 0, 3),
|
||||||
(@CGUID+380, @CGUID+373, 3),
|
(@CGUID+380, @CGUID+373, 0, 0, 3),
|
||||||
(@CGUID+383, @CGUID+383, 3),
|
(@CGUID+383, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+384, @CGUID+383, 3),
|
(@CGUID+384, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+385, @CGUID+383, 3),
|
(@CGUID+385, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+386, @CGUID+383, 3),
|
(@CGUID+386, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+387, @CGUID+383, 3),
|
(@CGUID+387, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+388, @CGUID+383, 3),
|
(@CGUID+388, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+389, @CGUID+383, 3),
|
(@CGUID+389, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+390, @CGUID+383, 3),
|
(@CGUID+390, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+391, @CGUID+383, 3),
|
(@CGUID+391, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+392, @CGUID+383, 3),
|
(@CGUID+392, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+393, @CGUID+383, 3),
|
(@CGUID+393, @CGUID+383, 0, 0, 3),
|
||||||
(@CGUID+396, @CGUID+396, 3),
|
(@CGUID+396, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+397, @CGUID+396, 3),
|
(@CGUID+397, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+398, @CGUID+396, 3),
|
(@CGUID+398, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+399, @CGUID+396, 3),
|
(@CGUID+399, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+400, @CGUID+396, 3),
|
(@CGUID+400, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+401, @CGUID+396, 3),
|
(@CGUID+401, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+402, @CGUID+396, 3),
|
(@CGUID+402, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+403, @CGUID+396, 3),
|
(@CGUID+403, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+404, @CGUID+396, 3),
|
(@CGUID+404, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+405, @CGUID+396, 3),
|
(@CGUID+405, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+406, @CGUID+396, 3),
|
(@CGUID+406, @CGUID+396, 0, 0, 3),
|
||||||
(@CGUID+418, @CGUID+418, 3),
|
(@CGUID+418, @CGUID+418, 0, 0, 3),
|
||||||
(@CGUID+419, @CGUID+418, 3),
|
(@CGUID+419, @CGUID+418, 0, 0, 3),
|
||||||
(@CGUID+420, @CGUID+418, 3),
|
(@CGUID+420, @CGUID+418, 0, 0, 3),
|
||||||
(@CGUID+421, @CGUID+418, 3),
|
(@CGUID+421, @CGUID+418, 0, 0, 3),
|
||||||
(@CGUID+422, @CGUID+418, 3),
|
(@CGUID+422, @CGUID+418, 0, 0, 3),
|
||||||
(@CGUID+423, @CGUID+418, 3),
|
(@CGUID+423, @CGUID+418, 0, 0, 3),
|
||||||
(@CGUID+540, @CGUID+540, 3),
|
(@CGUID+540, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+541, @CGUID+540, 3),
|
(@CGUID+541, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+542, @CGUID+540, 3),
|
(@CGUID+542, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+543, @CGUID+540, 3),
|
(@CGUID+543, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+544, @CGUID+540, 3),
|
(@CGUID+544, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+545, @CGUID+540, 3),
|
(@CGUID+545, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+546, @CGUID+540, 3),
|
(@CGUID+546, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+547, @CGUID+540, 3),
|
(@CGUID+547, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+548, @CGUID+540, 3),
|
(@CGUID+548, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+549, @CGUID+540, 3),
|
(@CGUID+549, @CGUID+540, 0, 0, 3),
|
||||||
(@CGUID+550, @CGUID+550, 3),
|
(@CGUID+550, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+551, @CGUID+550, 3),
|
(@CGUID+551, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+552, @CGUID+550, 3),
|
(@CGUID+552, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+553, @CGUID+550, 3),
|
(@CGUID+553, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+554, @CGUID+550, 3),
|
(@CGUID+554, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+555, @CGUID+550, 3),
|
(@CGUID+555, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+556, @CGUID+550, 3),
|
(@CGUID+556, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+557, @CGUID+550, 3),
|
(@CGUID+557, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+558, @CGUID+550, 3),
|
(@CGUID+558, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+559, @CGUID+550, 3),
|
(@CGUID+559, @CGUID+550, 0, 0, 3),
|
||||||
(@CGUID+560, @CGUID+560, 3),
|
(@CGUID+560, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+561, @CGUID+560, 3),
|
(@CGUID+561, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+562, @CGUID+560, 3),
|
(@CGUID+562, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+563, @CGUID+560, 3),
|
(@CGUID+563, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+564, @CGUID+560, 3),
|
(@CGUID+564, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+565, @CGUID+560, 3),
|
(@CGUID+565, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+566, @CGUID+560, 3),
|
(@CGUID+566, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+567, @CGUID+560, 3),
|
(@CGUID+567, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+568, @CGUID+560, 3),
|
(@CGUID+568, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+569, @CGUID+560, 3),
|
(@CGUID+569, @CGUID+560, 0, 0, 3),
|
||||||
(@CGUID+570, @CGUID+570, 3),
|
(@CGUID+570, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+571, @CGUID+570, 3),
|
(@CGUID+571, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+572, @CGUID+570, 3),
|
(@CGUID+572, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+573, @CGUID+570, 3),
|
(@CGUID+573, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+574, @CGUID+570, 3),
|
(@CGUID+574, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+575, @CGUID+570, 3),
|
(@CGUID+575, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+576, @CGUID+570, 3),
|
(@CGUID+576, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+577, @CGUID+570, 3),
|
(@CGUID+577, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+578, @CGUID+570, 3),
|
(@CGUID+578, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+579, @CGUID+570, 3),
|
(@CGUID+579, @CGUID+570, 0, 0, 3),
|
||||||
(@CGUID+580, @CGUID+580, 3),
|
(@CGUID+580, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+581, @CGUID+580, 3),
|
(@CGUID+581, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+582, @CGUID+580, 3),
|
(@CGUID+582, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+583, @CGUID+580, 3),
|
(@CGUID+583, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+584, @CGUID+580, 3),
|
(@CGUID+584, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+585, @CGUID+580, 3),
|
(@CGUID+585, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+586, @CGUID+580, 3),
|
(@CGUID+586, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+587, @CGUID+580, 3),
|
(@CGUID+587, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+588, @CGUID+580, 3),
|
(@CGUID+588, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+589, @CGUID+580, 3),
|
(@CGUID+589, @CGUID+580, 0, 0, 3),
|
||||||
(@CGUID+592, @CGUID+592, 3),
|
(@CGUID+592, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+593, @CGUID+592, 3),
|
(@CGUID+593, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+594, @CGUID+592, 3),
|
(@CGUID+594, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+595, @CGUID+592, 3),
|
(@CGUID+595, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+596, @CGUID+592, 3),
|
(@CGUID+596, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+597, @CGUID+592, 3),
|
(@CGUID+597, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+598, @CGUID+592, 3),
|
(@CGUID+598, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+599, @CGUID+592, 3),
|
(@CGUID+599, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+600, @CGUID+592, 3),
|
(@CGUID+600, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+601, @CGUID+592, 3),
|
(@CGUID+601, @CGUID+592, 0, 0, 3),
|
||||||
(@CGUID+602, @CGUID+602, 3),
|
(@CGUID+602, @CGUID+602, 0, 0, 3),
|
||||||
(@CGUID+603, @CGUID+602, 3),
|
(@CGUID+603, @CGUID+602, 0, 0, 3),
|
||||||
(@CGUID+605, @CGUID+605, 3),
|
(@CGUID+605, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+606, @CGUID+605, 3),
|
(@CGUID+606, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+607, @CGUID+605, 3),
|
(@CGUID+607, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+608, @CGUID+605, 3),
|
(@CGUID+608, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+609, @CGUID+605, 3),
|
(@CGUID+609, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+610, @CGUID+605, 3),
|
(@CGUID+610, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+611, @CGUID+605, 3),
|
(@CGUID+611, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+612, @CGUID+605, 3),
|
(@CGUID+612, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+613, @CGUID+605, 3),
|
(@CGUID+613, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+614, @CGUID+605, 3),
|
(@CGUID+614, @CGUID+605, 0, 0, 3),
|
||||||
(@CGUID+615, @CGUID+615, 3),
|
(@CGUID+615, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+616, @CGUID+615, 3),
|
(@CGUID+616, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+617, @CGUID+615, 3),
|
(@CGUID+617, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+618, @CGUID+615, 3),
|
(@CGUID+618, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+619, @CGUID+615, 3),
|
(@CGUID+619, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+620, @CGUID+615, 3),
|
(@CGUID+620, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+621, @CGUID+615, 3),
|
(@CGUID+621, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+622, @CGUID+615, 3),
|
(@CGUID+622, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+623, @CGUID+615, 3),
|
(@CGUID+623, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+624, @CGUID+615, 3),
|
(@CGUID+624, @CGUID+615, 0, 0, 3),
|
||||||
(@CGUID+625, @CGUID+625, 3),
|
(@CGUID+625, @CGUID+625, 0, 0, 3),
|
||||||
(@CGUID+626, @CGUID+625, 3),
|
(@CGUID+626, @CGUID+625, 0, 0, 3),
|
||||||
(@CGUID+627, @CGUID+625, 3),
|
(@CGUID+627, @CGUID+625, 0, 0, 3),
|
||||||
(@CGUID+628, @CGUID+628, 3),
|
(@CGUID+628, @CGUID+628, 0, 0, 3),
|
||||||
(@CGUID+629, @CGUID+628, 3),
|
(@CGUID+629, @CGUID+628, 0, 0, 3),
|
||||||
(@CGUID+630, @CGUID+628, 3),
|
(@CGUID+630, @CGUID+628, 0, 0, 3),
|
||||||
(@CGUID+631, @CGUID+631, 3),
|
(@CGUID+631, @CGUID+631, 0, 0, 3),
|
||||||
(@CGUID+632, @CGUID+631, 3),
|
(@CGUID+632, @CGUID+631, 0, 0, 3),
|
||||||
(@CGUID+633, @CGUID+631, 3),
|
(@CGUID+633, @CGUID+631, 0, 0, 3),
|
||||||
(@CGUID+634, @CGUID+631, 3),
|
(@CGUID+634, @CGUID+631, 0, 0, 3),
|
||||||
(@CGUID+635, @CGUID+635, 3),
|
(@CGUID+635, @CGUID+635, 0, 0, 3),
|
||||||
(@CGUID+636, @CGUID+635, 3),
|
(@CGUID+636, @CGUID+635, 0, 0, 3),
|
||||||
(@CGUID+637, @CGUID+635, 3),
|
(@CGUID+637, @CGUID+635, 0, 0, 3),
|
||||||
(@CGUID+638, @CGUID+638, 3),
|
(@CGUID+638, @CGUID+638, 0, 0, 3),
|
||||||
(@CGUID+639, @CGUID+638, 3),
|
(@CGUID+639, @CGUID+638, 0, 0, 3),
|
||||||
(@CGUID+640, @CGUID+638, 3),
|
(@CGUID+640, @CGUID+638, 0, 0, 3),
|
||||||
(@CGUID+641, @CGUID+638, 3),
|
(@CGUID+641, @CGUID+638, 0, 0, 3),
|
||||||
(@CGUID+642, @CGUID+638, 3),
|
(@CGUID+642, @CGUID+638, 0, 0, 3),
|
||||||
(@CGUID+643, @CGUID+638, 3),
|
(@CGUID+643, @CGUID+638, 0, 0, 3),
|
||||||
(@CGUID+644, @CGUID+644, 3),
|
(@CGUID+644, @CGUID+644, 0, 0, 3),
|
||||||
(@CGUID+645, @CGUID+644, 3),
|
(@CGUID+645, @CGUID+644, 0, 0, 3),
|
||||||
(@CGUID+646, @CGUID+644, 3),
|
(@CGUID+646, @CGUID+644, 0, 0, 3),
|
||||||
(@CGUID+647, @CGUID+644, 3),
|
(@CGUID+647, @CGUID+644, 0, 0, 3),
|
||||||
(@CGUID+648, @CGUID+648, 3),
|
(@CGUID+648, @CGUID+648, 0, 0, 3),
|
||||||
(@CGUID+649, @CGUID+648, 3),
|
(@CGUID+649, @CGUID+648, 0, 0, 3),
|
||||||
(@CGUID+650, @CGUID+648, 3),
|
(@CGUID+650, @CGUID+648, 0, 0, 3),
|
||||||
(@CGUID+651, @CGUID+648, 3),
|
(@CGUID+651, @CGUID+648, 0, 0, 3),
|
||||||
(@CGUID+652, @CGUID+648, 3),
|
(@CGUID+652, @CGUID+648, 0, 0, 3),
|
||||||
(@CGUID+653, @CGUID+648, 3),
|
(@CGUID+653, @CGUID+648, 0, 0, 3),
|
||||||
(@CGUID+654, @CGUID+654, 3),
|
(@CGUID+654, @CGUID+654, 0, 0, 3),
|
||||||
(@CGUID+655, @CGUID+654, 3),
|
(@CGUID+655, @CGUID+654, 0, 0, 3),
|
||||||
(@CGUID+656, @CGUID+654, 3),
|
(@CGUID+656, @CGUID+654, 0, 0, 3),
|
||||||
(@CGUID+657, @CGUID+654, 3),
|
(@CGUID+657, @CGUID+654, 0, 0, 3),
|
||||||
(@CGUID+658, @CGUID+658, 3),
|
(@CGUID+658, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+659, @CGUID+658, 3),
|
(@CGUID+659, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+660, @CGUID+658, 3),
|
(@CGUID+660, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+661, @CGUID+658, 3),
|
(@CGUID+661, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+662, @CGUID+658, 3),
|
(@CGUID+662, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+663, @CGUID+658, 3),
|
(@CGUID+663, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+664, @CGUID+658, 3),
|
(@CGUID+664, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+665, @CGUID+658, 3),
|
(@CGUID+665, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+666, @CGUID+658, 3),
|
(@CGUID+666, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+667, @CGUID+658, 3),
|
(@CGUID+667, @CGUID+658, 0, 0, 3),
|
||||||
(@CGUID+668, @CGUID+668, 3),
|
(@CGUID+668, @CGUID+668, 0, 0, 3),
|
||||||
(@CGUID+669, @CGUID+668, 3),
|
(@CGUID+669, @CGUID+668, 0, 0, 3),
|
||||||
(@CGUID+670, @CGUID+668, 3),
|
(@CGUID+670, @CGUID+668, 0, 0, 3),
|
||||||
(@CGUID+671, @CGUID+668, 3),
|
(@CGUID+671, @CGUID+668, 0, 0, 3),
|
||||||
(@CGUID+672, @CGUID+668, 3),
|
(@CGUID+672, @CGUID+668, 0, 0, 3),
|
||||||
(@CGUID+673, @CGUID+673, 3),
|
(@CGUID+673, @CGUID+673, 0, 0, 3),
|
||||||
(@CGUID+674, @CGUID+673, 3),
|
(@CGUID+674, @CGUID+673, 0, 0, 3),
|
||||||
(@CGUID+675, @CGUID+673, 3),
|
(@CGUID+675, @CGUID+673, 0, 0, 3),
|
||||||
(@CGUID+676, @CGUID+673, 3),
|
(@CGUID+676, @CGUID+673, 0, 0, 3),
|
||||||
(@CGUID+677, @CGUID+673, 3),
|
(@CGUID+677, @CGUID+673, 0, 0, 3),
|
||||||
(@CGUID+691, @CGUID+691, 3),
|
(@CGUID+691, @CGUID+691, 0, 0, 3),
|
||||||
(@CGUID+692, @CGUID+691, 3),
|
(@CGUID+692, @CGUID+691, 0, 0, 3),
|
||||||
(@CGUID+693, @CGUID+691, 3),
|
(@CGUID+693, @CGUID+691, 0, 0, 3),
|
||||||
(@CGUID+694, @CGUID+691, 3),
|
(@CGUID+694, @CGUID+691, 0, 0, 3),
|
||||||
(@CGUID+695, @CGUID+691, 3),
|
(@CGUID+695, @CGUID+691, 0, 0, 3),
|
||||||
(@CGUID+696, @CGUID+691, 3),
|
(@CGUID+696, @CGUID+691, 0, 0, 3),
|
||||||
(@CGUID+697, @CGUID+697, 3),
|
(@CGUID+697, @CGUID+697, 0, 0, 3),
|
||||||
(@CGUID+698, @CGUID+697, 3),
|
(@CGUID+698, @CGUID+697, 0, 0, 3),
|
||||||
(@CGUID+699, @CGUID+697, 3),
|
(@CGUID+699, @CGUID+697, 0, 0, 3),
|
||||||
(@CGUID+700, @CGUID+697, 3),
|
(@CGUID+700, @CGUID+697, 0, 0, 3),
|
||||||
(@CGUID+701, @CGUID+697, 3),
|
(@CGUID+701, @CGUID+697, 0, 0, 3),
|
||||||
(@CGUID+702, @CGUID+697, 3),
|
(@CGUID+702, @CGUID+697, 0, 0, 3),
|
||||||
(@CGUID+703, @CGUID+703, 3),
|
(@CGUID+703, @CGUID+703, 0, 0, 3),
|
||||||
(@CGUID+704, @CGUID+703, 3),
|
(@CGUID+704, @CGUID+703, 0, 0, 3),
|
||||||
(@CGUID+705, @CGUID+703, 3),
|
(@CGUID+705, @CGUID+703, 0, 0, 3),
|
||||||
(@CGUID+706, @CGUID+703, 3),
|
(@CGUID+706, @CGUID+703, 0, 0, 3),
|
||||||
(@CGUID+707, @CGUID+703, 3),
|
(@CGUID+707, @CGUID+703, 0, 0, 3),
|
||||||
(@CGUID+708, @CGUID+703, 3),
|
(@CGUID+708, @CGUID+703, 0, 0, 3),
|
||||||
(@CGUID+709, @CGUID+709, 3),
|
(@CGUID+709, @CGUID+709, 0, 0, 3),
|
||||||
(@CGUID+710, @CGUID+709, 3),
|
(@CGUID+710, @CGUID+709, 0, 0, 3),
|
||||||
(@CGUID+711, @CGUID+709, 3),
|
(@CGUID+711, @CGUID+709, 0, 0, 3),
|
||||||
(@CGUID+712, @CGUID+709, 3),
|
(@CGUID+712, @CGUID+709, 0, 0, 3),
|
||||||
(@CGUID+713, @CGUID+709, 3),
|
(@CGUID+713, @CGUID+709, 0, 0, 3),
|
||||||
(@CGUID+714, @CGUID+709, 3),
|
(@CGUID+714, @CGUID+709, 0, 0, 3),
|
||||||
(@CGUID+716, @CGUID+716, 3),
|
(@CGUID+716, @CGUID+716, 0, 0, 3),
|
||||||
(@CGUID+717, @CGUID+716, 3),
|
(@CGUID+717, @CGUID+716, 0, 0, 3),
|
||||||
(@CGUID+718, @CGUID+716, 3),
|
(@CGUID+718, @CGUID+716, 0, 0, 3),
|
||||||
(@CGUID+719, @CGUID+716, 3);
|
(@CGUID+719, @CGUID+716, 0, 0, 3);
|
||||||
|
|
||||||
DELETE FROM `creature_addon` WHERE `guid` IN (12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12760,12776,12778,12779,12780,12781,12782,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12843,12866,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880,12881,12882,12883,12884,12886,12888,12889,12892,12894,13230,13235,40446,40526,40527,42920,46817,52411,52418,52420,52423,52424,52427,52428,52429,52430,52431,52432,52433,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52739,52740,52743,52768,52769,52772,52773,52846,52847,52848,52850,52854,52855,52857,53054,53055,53056,53057,53058,53059,53210,53229,53586,53710,53711,53816,84716);
|
DELETE FROM `creature_addon` WHERE `guid` IN (12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12760,12776,12778,12779,12780,12781,12782,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12843,12866,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880,12881,12882,12883,12884,12886,12888,12889,12892,12894,13230,13235,40446,40526,40527,42920,46817,52411,52418,52420,52423,52424,52427,52428,52429,52430,52431,52432,52433,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52739,52740,52743,52768,52769,52772,52773,52846,52847,52848,52850,52854,52855,52857,53054,53055,53056,53057,53058,53059,53210,53229,53586,53710,53711,53816,84716);
|
||||||
DELETE FROM `waypoint_data` WHERE `id` IN (128660,128690,128840,128860,128880,128890,404460,405260,429200,468170,524110,524180,524200,524230,524240,524270,527390,527400,527430,527680,527690,527720,527730,528460,528470,528480,528500,528540,528550,528570,530540,530550,530560,530570,530580,530590,538160);
|
DELETE FROM `waypoint_data` WHERE `id` IN (128660,128690,128840,128860,128880,128890,404460,405260,429200,468170,524110,524180,524200,524230,524240,524270,527390,527400,527430,527680,527690,527720,527730,528460,528470,528480,528500,528540,528550,528570,530540,530550,530560,530570,530580,530590,538160);
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Lan
|
|||||||
UPDATE `creature` SET `spawntimesecs` = 300 WHERE `id1` = 23191 AND `map` = 564;
|
UPDATE `creature` SET `spawntimesecs` = 300 WHERE `id1` = 23191 AND `map` = 564;
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `leaderGUID` = 148236;
|
DELETE FROM `creature_formations` WHERE `leaderGUID` = 148236;
|
||||||
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(148236, 148236, 24),
|
(148236, 148236, 0, 0, 24),
|
||||||
(148237, 148236, 24),
|
(148237, 148236, 0, 0, 24),
|
||||||
(148238, 148236, 24),
|
(148238, 148236, 0, 0, 24),
|
||||||
(148239, 148236, 24),
|
(148239, 148236, 0, 0, 24),
|
||||||
(148240, 148236, 24),
|
(148240, 148236, 0, 0, 24),
|
||||||
(148241, 148236, 24),
|
(148241, 148236, 0, 0, 24),
|
||||||
(148242, 148236, 24);
|
(148242, 148236, 0, 0, 24);
|
||||||
|
|
||||||
-- Delete leftover gobs
|
-- Delete leftover gobs
|
||||||
DELETE FROM `gameobject` WHERE `guid` IN (20523,20558,20559,20561,20563,20567) AND `map` = 564;
|
DELETE FROM `gameobject` WHERE `guid` IN (20523,20558,20559,20561,20563,20567) AND `map` = 564;
|
||||||
|
|||||||
@@ -1,42 +1,42 @@
|
|||||||
-- DB update 2024_07_09_06 -> 2024_07_09_07
|
-- DB update 2024_07_09_06 -> 2024_07_09_07
|
||||||
--
|
--
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154);
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(158167, 158167, 3),
|
(158167, 158167, 0, 0, 3),
|
||||||
(158167, 158168, 3),
|
(158167, 158168, 0, 0, 3),
|
||||||
(158167, 158169, 3),
|
(158167, 158169, 0, 0, 3),
|
||||||
(158167, 158170, 3),
|
(158167, 158170, 0, 0, 3),
|
||||||
(158167, 158171, 3),
|
(158167, 158171, 0, 0, 3),
|
||||||
(158167, 158172, 3),
|
(158167, 158172, 0, 0, 3),
|
||||||
(158167, 158173, 3),
|
(158167, 158173, 0, 0, 3),
|
||||||
(158167, 158174, 3),
|
(158167, 158174, 0, 0, 3),
|
||||||
(158167, 158175, 3),
|
(158167, 158175, 0, 0, 3),
|
||||||
(158167, 158176, 3),
|
(158167, 158176, 0, 0, 3),
|
||||||
(158167, 158177, 3),
|
(158167, 158177, 0, 0, 3),
|
||||||
(158167, 158178, 3),
|
(158167, 158178, 0, 0, 3),
|
||||||
|
|
||||||
(158155, 158155, 3),
|
(158155, 158155, 0, 0, 3),
|
||||||
(158155, 158156, 3),
|
(158155, 158156, 0, 0, 3),
|
||||||
(158155, 158157, 3),
|
(158155, 158157, 0, 0, 3),
|
||||||
(158155, 158158, 3),
|
(158155, 158158, 0, 0, 3),
|
||||||
(158155, 158159, 3),
|
(158155, 158159, 0, 0, 3),
|
||||||
(158155, 158160, 3),
|
(158155, 158160, 0, 0, 3),
|
||||||
(158155, 158161, 3),
|
(158155, 158161, 0, 0, 3),
|
||||||
(158155, 158162, 3),
|
(158155, 158162, 0, 0, 3),
|
||||||
(158155, 158163, 3),
|
(158155, 158163, 0, 0, 3),
|
||||||
(158155, 158164, 3),
|
(158155, 158164, 0, 0, 3),
|
||||||
(158155, 158165, 3),
|
(158155, 158165, 0, 0, 3),
|
||||||
(158155, 158166, 3),
|
(158155, 158166, 0, 0, 3),
|
||||||
|
|
||||||
(158143, 158143, 3),
|
(158143, 158143, 0, 0, 3),
|
||||||
(158143, 158144, 3),
|
(158143, 158144, 0, 0, 3),
|
||||||
(158143, 158145, 3),
|
(158143, 158145, 0, 0, 3),
|
||||||
(158143, 158146, 3),
|
(158143, 158146, 0, 0, 3),
|
||||||
(158143, 158147, 3),
|
(158143, 158147, 0, 0, 3),
|
||||||
(158143, 158148, 3),
|
(158143, 158148, 0, 0, 3),
|
||||||
(158143, 158149, 3),
|
(158143, 158149, 0, 0, 3),
|
||||||
(158143, 158150, 3),
|
(158143, 158150, 0, 0, 3),
|
||||||
(158143, 158151, 3),
|
(158143, 158151, 0, 0, 3),
|
||||||
(158143, 158152, 3),
|
(158143, 158152, 0, 0, 3),
|
||||||
(158143, 158153, 3),
|
(158143, 158153, 0, 0, 3),
|
||||||
(158143, 158154, 3);
|
(158143, 158154, 0, 0, 3);
|
||||||
|
|||||||
@@ -42,11 +42,26 @@ CREATE TABLE `realmlist` (
|
|||||||
--
|
--
|
||||||
-- Dumping data for table `realmlist`
|
-- Dumping data for table `realmlist`
|
||||||
--
|
--
|
||||||
|
-- Defaults are tuned for fresh local installs: `address` is what the auth
|
||||||
|
-- server hands clients after login as the WORLD server endpoint. Stock
|
||||||
|
-- 127.0.0.1 means "the same box auth is running on", so a fresh
|
||||||
|
-- `git clone` -> `docker compose up` works without any post-install
|
||||||
|
-- tweaks for a developer hosting on their own machine.
|
||||||
|
--
|
||||||
|
-- Production deployments must override `address` after first dbimport,
|
||||||
|
-- e.g.:
|
||||||
|
-- UPDATE realmlist SET address = 'your.public.host', port = 8085 WHERE id = 1;
|
||||||
|
-- See contrib/fractured-dev-extras/BUILD-NATIVE.md for the full deploy
|
||||||
|
-- checklist (auth/world ports, firewall, public hostnames).
|
||||||
|
--
|
||||||
|
-- `port` is the WORLD server port (must match WorldServerPort in
|
||||||
|
-- worldserver.conf). The auth-server LISTEN port is separately configured
|
||||||
|
-- via RealmServerPort in authserver.conf (stock default 3724).
|
||||||
|
|
||||||
LOCK TABLES `realmlist` WRITE;
|
LOCK TABLES `realmlist` WRITE;
|
||||||
/*!40000 ALTER TABLE `realmlist` DISABLE KEYS */;
|
/*!40000 ALTER TABLE `realmlist` DISABLE KEYS */;
|
||||||
INSERT INTO `realmlist` VALUES
|
INSERT INTO `realmlist` VALUES
|
||||||
(1,'AzerothCore','127.0.0.1','127.0.0.1','255.255.255.0',8085,0,0,1,0,0,12340);
|
(1,'Fractured WoW','127.0.0.1','127.0.0.1','255.255.255.0',8085,0,0,1,0,0,12340);
|
||||||
/*!40000 ALTER TABLE `realmlist` ENABLE KEYS */;
|
/*!40000 ALTER TABLE `realmlist` ENABLE KEYS */;
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ CREATE TABLE `world_state` (
|
|||||||
`Id` int unsigned NOT NULL COMMENT 'Internal save ID',
|
`Id` int unsigned NOT NULL COMMENT 'Internal save ID',
|
||||||
`Data` longtext,
|
`Data` longtext,
|
||||||
PRIMARY KEY (`Id`)
|
PRIMARY KEY (`Id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='WorldState save system';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='WorldState save system';
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ CREATE TABLE `player_shapeshift_model` (
|
|||||||
`GenderID` tinyint unsigned NOT NULL,
|
`GenderID` tinyint unsigned NOT NULL,
|
||||||
`ModelID` int unsigned NOT NULL,
|
`ModelID` int unsigned NOT NULL,
|
||||||
PRIMARY KEY (`ShapeshiftID`,`RaceID`,`CustomizationID`,`GenderID`)
|
PRIMARY KEY (`ShapeshiftID`,`RaceID`,`CustomizationID`,`GenderID`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci PACK_KEYS=0;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci PACK_KEYS=0;
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ CREATE TABLE `player_totem_model` (
|
|||||||
`RaceID` tinyint unsigned NOT NULL,
|
`RaceID` tinyint unsigned NOT NULL,
|
||||||
`ModelID` int unsigned NOT NULL,
|
`ModelID` int unsigned NOT NULL,
|
||||||
PRIMARY KEY (`TotemID`,`RaceID`)
|
PRIMARY KEY (`TotemID`,`RaceID`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci PACK_KEYS=0;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci PACK_KEYS=0;
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|||||||
@@ -546,7 +546,7 @@ INSERT INTO `spell_target_position` VALUES
|
|||||||
(48274,0,575,302.36,-352.01,90.54,2.2,0),
|
(48274,0,575,302.36,-352.01,90.54,2.2,0),
|
||||||
(48275,0,575,291.39,-352.01,90.54,0.91,0),
|
(48275,0,575,291.39,-352.01,90.54,0.91,0),
|
||||||
(48276,0,575,296.651,-346.293,108.547,1.58,0),
|
(48276,0,575,296.651,-346.293,108.547,1.58,0),
|
||||||
(48324,0,571,3454.11,-2802.37,202.14,0,34149345),
|
(48324,0,571,3454.11,-2802.37,202.14,0,0),
|
||||||
(48622,0,571,4274.53,-3055.55,319.463,2.535,0),
|
(48622,0,571,4274.53,-3055.55,319.463,2.535,0),
|
||||||
(48760,0,571,3876.16,6984.44,106.32,6.279,0),
|
(48760,0,571,3876.16,6984.44,106.32,6.279,0),
|
||||||
(48960,0,571,4313.37,-2958.17,318.463,1.98,0),
|
(48960,0,571,4313.37,-2958.17,318.463,1.98,0),
|
||||||
|
|||||||
@@ -665,97 +665,97 @@ INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`,
|
|||||||
|
|
||||||
-- Static Linking
|
-- Static Linking
|
||||||
DELETE FROM `creature_formations` WHERE `groupAI` IN (3, 27) AND `leaderGUID` IN (@CGUID+22,@CGUID+23,@CGUID+26,@CGUID+28,@CGUID+30,@CGUID+31,@CGUID+36,@CGUID+37,@CGUID+41,@CGUID+42,@CGUID+43,@CGUID+44,@CGUID+61,@CGUID+63,@CGUID+72,@CGUID+80,@CGUID+86,@CGUID+102,@CGUID+103,@CGUID+110,@CGUID+117,@CGUID+120,@CGUID+139,@CGUID+140) AND `memberGUID` IN (@CGUID+21,@CGUID+22,@CGUID+23,@CGUID+24,@CGUID+25,@CGUID+26,@CGUID+27,@CGUID+28,@CGUID+29,@CGUID+30,@CGUID+31,@CGUID+32,@CGUID+33,@CGUID+34,@CGUID+36,@CGUID+37,@CGUID+38,@CGUID+40,@CGUID+41,@CGUID+42,@CGUID+43,@CGUID+44,@CGUID+61,@CGUID+62,@CGUID+63,@CGUID+64,@CGUID+65,@CGUID+66,@CGUID+67,@CGUID+70,@CGUID+71,@CGUID+72,@CGUID+73,@CGUID+74,@CGUID+75,@CGUID+76,@CGUID+77,@CGUID+78,@CGUID+79,@CGUID+80,@CGUID+82,@CGUID+83,@CGUID+84,@CGUID+86,@CGUID+87,@CGUID+89,@CGUID+90,@CGUID+91,@CGUID+92,@CGUID+93,@CGUID+94,@CGUID+95,@CGUID+96,@CGUID+98,@CGUID+99,@CGUID+100,@CGUID+101,@CGUID+102,@CGUID+103,@CGUID+106,@CGUID+110,@CGUID+111,@CGUID+112,@CGUID+113,@CGUID+114,@CGUID+115,@CGUID+116,@CGUID+117,@CGUID+118,@CGUID+119,@CGUID+120,@CGUID+122,@CGUID+124,@CGUID+125,@CGUID+126,@CGUID+127,@CGUID+128,@CGUID+139,@CGUID+140,@CGUID+141,@CGUID+142,@CGUID+143,@CGUID+144,@CGUID+145,@CGUID+146,@CGUID+147,@CGUID+148,@CGUID+149,@CGUID+150,@CGUID+151,@CGUID+152,@CGUID+153,@CGUID+154);
|
DELETE FROM `creature_formations` WHERE `groupAI` IN (3, 27) AND `leaderGUID` IN (@CGUID+22,@CGUID+23,@CGUID+26,@CGUID+28,@CGUID+30,@CGUID+31,@CGUID+36,@CGUID+37,@CGUID+41,@CGUID+42,@CGUID+43,@CGUID+44,@CGUID+61,@CGUID+63,@CGUID+72,@CGUID+80,@CGUID+86,@CGUID+102,@CGUID+103,@CGUID+110,@CGUID+117,@CGUID+120,@CGUID+139,@CGUID+140) AND `memberGUID` IN (@CGUID+21,@CGUID+22,@CGUID+23,@CGUID+24,@CGUID+25,@CGUID+26,@CGUID+27,@CGUID+28,@CGUID+29,@CGUID+30,@CGUID+31,@CGUID+32,@CGUID+33,@CGUID+34,@CGUID+36,@CGUID+37,@CGUID+38,@CGUID+40,@CGUID+41,@CGUID+42,@CGUID+43,@CGUID+44,@CGUID+61,@CGUID+62,@CGUID+63,@CGUID+64,@CGUID+65,@CGUID+66,@CGUID+67,@CGUID+70,@CGUID+71,@CGUID+72,@CGUID+73,@CGUID+74,@CGUID+75,@CGUID+76,@CGUID+77,@CGUID+78,@CGUID+79,@CGUID+80,@CGUID+82,@CGUID+83,@CGUID+84,@CGUID+86,@CGUID+87,@CGUID+89,@CGUID+90,@CGUID+91,@CGUID+92,@CGUID+93,@CGUID+94,@CGUID+95,@CGUID+96,@CGUID+98,@CGUID+99,@CGUID+100,@CGUID+101,@CGUID+102,@CGUID+103,@CGUID+106,@CGUID+110,@CGUID+111,@CGUID+112,@CGUID+113,@CGUID+114,@CGUID+115,@CGUID+116,@CGUID+117,@CGUID+118,@CGUID+119,@CGUID+120,@CGUID+122,@CGUID+124,@CGUID+125,@CGUID+126,@CGUID+127,@CGUID+128,@CGUID+139,@CGUID+140,@CGUID+141,@CGUID+142,@CGUID+143,@CGUID+144,@CGUID+145,@CGUID+146,@CGUID+147,@CGUID+148,@CGUID+149,@CGUID+150,@CGUID+151,@CGUID+152,@CGUID+153,@CGUID+154);
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(@CGUID+103, @CGUID+103, 3),
|
(@CGUID+103, @CGUID+103, 0, 0, 3),
|
||||||
(@CGUID+103, @CGUID+21, 3),
|
(@CGUID+103, @CGUID+21, 0, 0, 3),
|
||||||
(@CGUID+103, @CGUID+25, 3),
|
(@CGUID+103, @CGUID+25, 0, 0, 3),
|
||||||
(@CGUID+30, @CGUID+30, 3),
|
(@CGUID+30, @CGUID+30, 0, 0, 3),
|
||||||
(@CGUID+30, @CGUID+95, 3),
|
(@CGUID+30, @CGUID+95, 0, 0, 3),
|
||||||
(@CGUID+30, @CGUID+114, 3),
|
(@CGUID+30, @CGUID+114, 0, 0, 3),
|
||||||
(@CGUID+30, @CGUID+83, 3),
|
(@CGUID+30, @CGUID+83, 0, 0, 3),
|
||||||
(@CGUID+110, @CGUID+110, 3),
|
(@CGUID+110, @CGUID+110, 0, 0, 3),
|
||||||
(@CGUID+110, @CGUID+77, 3),
|
(@CGUID+110, @CGUID+77, 0, 0, 3),
|
||||||
(@CGUID+110, @CGUID+79, 3),
|
(@CGUID+110, @CGUID+79, 0, 0, 3),
|
||||||
(@CGUID+22, @CGUID+22, 3),
|
(@CGUID+22, @CGUID+22, 0, 0, 3),
|
||||||
(@CGUID+22, @CGUID+84, 3),
|
(@CGUID+22, @CGUID+84, 0, 0, 3),
|
||||||
(@CGUID+22, @CGUID+99, 3),
|
(@CGUID+22, @CGUID+99, 0, 0, 3),
|
||||||
(@CGUID+26, @CGUID+26, 3),
|
(@CGUID+26, @CGUID+26, 0, 0, 3),
|
||||||
(@CGUID+26, @CGUID+96, 3),
|
(@CGUID+26, @CGUID+96, 0, 0, 3),
|
||||||
(@CGUID+26, @CGUID+112, 3),
|
(@CGUID+26, @CGUID+112, 0, 0, 3),
|
||||||
(@CGUID+26, @CGUID+27, 3),
|
(@CGUID+26, @CGUID+27, 0, 0, 3),
|
||||||
(@CGUID+28, @CGUID+28, 3),
|
(@CGUID+28, @CGUID+28, 0, 0, 3),
|
||||||
(@CGUID+28, @CGUID+29, 3),
|
(@CGUID+28, @CGUID+29, 0, 0, 3),
|
||||||
(@CGUID+28, @CGUID+100, 3),
|
(@CGUID+28, @CGUID+100, 0, 0, 3),
|
||||||
(@CGUID+28, @CGUID+111, 3),
|
(@CGUID+28, @CGUID+111, 0, 0, 3),
|
||||||
(@CGUID+23, @CGUID+23, 3),
|
(@CGUID+23, @CGUID+23, 0, 0, 3),
|
||||||
(@CGUID+23, @CGUID+78, 3),
|
(@CGUID+23, @CGUID+78, 0, 0, 3),
|
||||||
(@CGUID+23, @CGUID+101, 3),
|
(@CGUID+23, @CGUID+101, 0, 0, 3),
|
||||||
(@CGUID+23, @CGUID+24, 3),
|
(@CGUID+23, @CGUID+24, 0, 0, 3),
|
||||||
(@CGUID+86, @CGUID+86, 3),
|
(@CGUID+86, @CGUID+86, 0, 0, 3),
|
||||||
(@CGUID+86, @CGUID+87, 3),
|
(@CGUID+86, @CGUID+87, 0, 0, 3),
|
||||||
(@CGUID+86, @CGUID+115, 3),
|
(@CGUID+86, @CGUID+115, 0, 0, 3),
|
||||||
(@CGUID+86, @CGUID+106, 3),
|
(@CGUID+86, @CGUID+106, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+80, 3),
|
(@CGUID+80, @CGUID+80, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+98, 3),
|
(@CGUID+80, @CGUID+98, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+82, 3),
|
(@CGUID+80, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+113, 3),
|
(@CGUID+80, @CGUID+113, 0, 0, 3),
|
||||||
(@CGUID+44, @CGUID+44, 27),
|
(@CGUID+44, @CGUID+44, 0, 0, 27),
|
||||||
(@CGUID+44, @CGUID+124, 27),
|
(@CGUID+44, @CGUID+124, 0, 0, 27),
|
||||||
(@CGUID+44, @CGUID+125, 27),
|
(@CGUID+44, @CGUID+125, 0, 0, 27),
|
||||||
(@CGUID+61, @CGUID+61, 3),
|
(@CGUID+61, @CGUID+61, 0, 0, 3),
|
||||||
(@CGUID+61, @CGUID+62, 3),
|
(@CGUID+61, @CGUID+62, 0, 0, 3),
|
||||||
(@CGUID+102, @CGUID+102, 3),
|
(@CGUID+102, @CGUID+102, 0, 0, 3),
|
||||||
(@CGUID+102, @CGUID+33, 3),
|
(@CGUID+102, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+102, @CGUID+34, 3),
|
(@CGUID+102, @CGUID+34, 0, 0, 3),
|
||||||
(@CGUID+37, @CGUID+37, 3),
|
(@CGUID+37, @CGUID+37, 0, 0, 3),
|
||||||
(@CGUID+37, @CGUID+91, 3),
|
(@CGUID+37, @CGUID+91, 0, 0, 3),
|
||||||
(@CGUID+37, @CGUID+67, 3),
|
(@CGUID+37, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+37, @CGUID+66, 3),
|
(@CGUID+37, @CGUID+66, 0, 0, 3),
|
||||||
(@CGUID+36, @CGUID+36, 3),
|
(@CGUID+36, @CGUID+36, 0, 0, 3),
|
||||||
(@CGUID+36, @CGUID+90, 3),
|
(@CGUID+36, @CGUID+90, 0, 0, 3),
|
||||||
(@CGUID+36, @CGUID+89, 3),
|
(@CGUID+36, @CGUID+89, 0, 0, 3),
|
||||||
(@CGUID+36, @CGUID+64, 3),
|
(@CGUID+36, @CGUID+64, 0, 0, 3),
|
||||||
(@CGUID+31, @CGUID+31, 3),
|
(@CGUID+31, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+31, @CGUID+32, 3),
|
(@CGUID+31, @CGUID+32, 0, 0, 3),
|
||||||
(@CGUID+31, @CGUID+38, 3),
|
(@CGUID+31, @CGUID+38, 0, 0, 3),
|
||||||
(@CGUID+31, @CGUID+70, 3),
|
(@CGUID+31, @CGUID+70, 0, 0, 3),
|
||||||
(@CGUID+63, @CGUID+63, 3),
|
(@CGUID+63, @CGUID+63, 0, 0, 3),
|
||||||
(@CGUID+63, @CGUID+65, 3),
|
(@CGUID+63, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+120, @CGUID+120, 3),
|
(@CGUID+120, @CGUID+120, 0, 0, 3),
|
||||||
(@CGUID+120, @CGUID+122, 3),
|
(@CGUID+120, @CGUID+122, 0, 0, 3),
|
||||||
(@CGUID+139, @CGUID+139, 3),
|
(@CGUID+139, @CGUID+139, 0, 0, 3),
|
||||||
(@CGUID+139, @CGUID+146, 3),
|
(@CGUID+139, @CGUID+146, 0, 0, 3),
|
||||||
(@CGUID+139, @CGUID+143, 3),
|
(@CGUID+139, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+139, @CGUID+145, 3),
|
(@CGUID+139, @CGUID+145, 0, 0, 3),
|
||||||
(@CGUID+139, @CGUID+147, 3),
|
(@CGUID+139, @CGUID+147, 0, 0, 3),
|
||||||
(@CGUID+139, @CGUID+149, 3),
|
(@CGUID+139, @CGUID+149, 0, 0, 3),
|
||||||
(@CGUID+139, @CGUID+154, 3),
|
(@CGUID+139, @CGUID+154, 0, 0, 3),
|
||||||
(@CGUID+139, @CGUID+144, 3),
|
(@CGUID+139, @CGUID+144, 0, 0, 3),
|
||||||
(@CGUID+140, @CGUID+140, 3),
|
(@CGUID+140, @CGUID+140, 0, 0, 3),
|
||||||
(@CGUID+140, @CGUID+152, 3),
|
(@CGUID+140, @CGUID+152, 0, 0, 3),
|
||||||
(@CGUID+140, @CGUID+142, 3),
|
(@CGUID+140, @CGUID+142, 0, 0, 3),
|
||||||
(@CGUID+140, @CGUID+150, 3),
|
(@CGUID+140, @CGUID+150, 0, 0, 3),
|
||||||
(@CGUID+140, @CGUID+153, 3),
|
(@CGUID+140, @CGUID+153, 0, 0, 3),
|
||||||
(@CGUID+140, @CGUID+151, 3),
|
(@CGUID+140, @CGUID+151, 0, 0, 3),
|
||||||
(@CGUID+140, @CGUID+141, 3),
|
(@CGUID+140, @CGUID+141, 0, 0, 3),
|
||||||
(@CGUID+140, @CGUID+148, 3),
|
(@CGUID+140, @CGUID+148, 0, 0, 3),
|
||||||
(@CGUID+43, @CGUID+43, 3),
|
(@CGUID+43, @CGUID+43, 0, 0, 3),
|
||||||
(@CGUID+43, @CGUID+127, 3),
|
(@CGUID+43, @CGUID+127, 0, 0, 3),
|
||||||
(@CGUID+43, @CGUID+126, 3),
|
(@CGUID+43, @CGUID+126, 0, 0, 3),
|
||||||
(@CGUID+43, @CGUID+128, 3),
|
(@CGUID+43, @CGUID+128, 0, 0, 3),
|
||||||
(@CGUID+72, @CGUID+72, 3),
|
(@CGUID+72, @CGUID+72, 0, 0, 3),
|
||||||
(@CGUID+72, @CGUID+116, 3),
|
(@CGUID+72, @CGUID+116, 0, 0, 3),
|
||||||
(@CGUID+72, @CGUID+71, 3),
|
(@CGUID+72, @CGUID+71, 0, 0, 3),
|
||||||
(@CGUID+72, @CGUID+40, 3),
|
(@CGUID+72, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+117, @CGUID+117, 3),
|
(@CGUID+117, @CGUID+117, 0, 0, 3),
|
||||||
(@CGUID+117, @CGUID+74, 3),
|
(@CGUID+117, @CGUID+74, 0, 0, 3),
|
||||||
(@CGUID+117, @CGUID+73, 3),
|
(@CGUID+117, @CGUID+73, 0, 0, 3),
|
||||||
(@CGUID+117, @CGUID+92, 3),
|
(@CGUID+117, @CGUID+92, 0, 0, 3),
|
||||||
(@CGUID+41, @CGUID+41, 3),
|
(@CGUID+41, @CGUID+41, 0, 0, 3),
|
||||||
(@CGUID+41, @CGUID+75, 3),
|
(@CGUID+41, @CGUID+75, 0, 0, 3),
|
||||||
(@CGUID+41, @CGUID+118, 3),
|
(@CGUID+41, @CGUID+118, 0, 0, 3),
|
||||||
(@CGUID+41, @CGUID+93, 3),
|
(@CGUID+41, @CGUID+93, 0, 0, 3),
|
||||||
(@CGUID+42, @CGUID+42, 3),
|
(@CGUID+42, @CGUID+42, 0, 0, 3),
|
||||||
(@CGUID+42, @CGUID+76, 3),
|
(@CGUID+42, @CGUID+76, 0, 0, 3),
|
||||||
(@CGUID+42, @CGUID+94, 3),
|
(@CGUID+42, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+42, @CGUID+119, 3);
|
(@CGUID+42, @CGUID+119, 0, 0, 3);
|
||||||
|
|||||||
@@ -1239,162 +1239,162 @@ INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `groupAI` = 3 AND `leaderGUID` IN (@CGUID+28,@CGUID+29,@CGUID+34,@CGUID+36,@CGUID+39,@CGUID+43,@CGUID+44,@CGUID+45,@CGUID+50,@CGUID+52,@CGUID+53,@CGUID+58,@CGUID+66,@CGUID+68,@CGUID+80,@CGUID+81,@CGUID+89,@CGUID+91,@CGUID+113,@CGUID+116,@CGUID+121,@CGUID+122,@CGUID+125,@CGUID+126,@CGUID+136,@CGUID+141,@CGUID+159,@CGUID+164,@CGUID+183,@CGUID+186,@CGUID+206,@CGUID+211,@CGUID+213,@CGUID+217,@CGUID+221,@CGUID+26) AND `memberGUID` IN (@CGUID+50,@CGUID+70,@CGUID+71,@CGUID+52,@CGUID+73,@CGUID+89,@CGUID+99,@CGUID+97,@CGUID+96,@CGUID+95,@CGUID+93,@CGUID+68,@CGUID+69,@CGUID+66,@CGUID+47,@CGUID+46,@CGUID+43,@CGUID+64,@CGUID+45,@CGUID+65,@CGUID+39,@CGUID+88,@CGUID+94,@CGUID+60,@CGUID+58,@CGUID+37,@CGUID+38,@CGUID+116,@CGUID+114,@CGUID+117,@CGUID+231,@CGUID+121,@CGUID+119,@CGUID+120,@CGUID+233,@CGUID+113,@CGUID+118,@CGUID+115,@CGUID+230,@CGUID+122,@CGUID+124,@CGUID+123,@CGUID+234,@CGUID+125,@CGUID+127,@CGUID+128,@CGUID+235,@CGUID+126,@CGUID+129,@CGUID+130,@CGUID+232,@CGUID+44,@CGUID+79,@CGUID+63,@CGUID+31,@CGUID+80,@CGUID+41,@CGUID+62,@CGUID+42,@CGUID+32,@CGUID+81,@CGUID+49,@CGUID+33,@CGUID+48,@CGUID+67,@CGUID+34,@CGUID+82,@CGUID+72,@CGUID+51,@CGUID+102,@CGUID+92,@CGUID+53,@CGUID+35,@CGUID+91,@CGUID+101,@CGUID+40,@CGUID+78,@CGUID+61,@CGUID+30,@CGUID+29,@CGUID+57,@CGUID+186,@CGUID+188,@CGUID+187,@CGUID+185,@CGUID+36,@CGUID+55,@CGUID+56,@CGUID+28,@CGUID+54,@CGUID+183,@CGUID+181,@CGUID+182,@CGUID+180,@CGUID+159,@CGUID+158,@CGUID+161,@CGUID+165,@CGUID+166,@CGUID+177,@CGUID+172,@CGUID+176,@CGUID+168,@CGUID+160,@CGUID+164,@CGUID+163,@CGUID+162,@CGUID+167,@CGUID+169,@CGUID+175,@CGUID+173,@CGUID+170,@CGUID+171,@CGUID+174,@CGUID+136,@CGUID+149,@CGUID+145,@CGUID+152,@CGUID+155,@CGUID+153,@CGUID+144,@CGUID+140,@CGUID+137,@CGUID+147,@CGUID+141,@CGUID+150,@CGUID+154,@CGUID+151,@CGUID+146,@CGUID+142,@CGUID+148,@CGUID+143,@CGUID+138,@CGUID+139,@CGUID+211,@CGUID+212,@CGUID+213,@CGUID+214,@CGUID+215,@CGUID+216,@CGUID+217,@CGUID+218,@CGUID+219,@CGUID+220,@CGUID+221,@CGUID+222,@CGUID+223,@CGUID+224,@CGUID+206,@CGUID+207,@CGUID+208,@CGUID+26,@CGUID+191,@CGUID+195,@CGUID+85);
|
DELETE FROM `creature_formations` WHERE `groupAI` = 3 AND `leaderGUID` IN (@CGUID+28,@CGUID+29,@CGUID+34,@CGUID+36,@CGUID+39,@CGUID+43,@CGUID+44,@CGUID+45,@CGUID+50,@CGUID+52,@CGUID+53,@CGUID+58,@CGUID+66,@CGUID+68,@CGUID+80,@CGUID+81,@CGUID+89,@CGUID+91,@CGUID+113,@CGUID+116,@CGUID+121,@CGUID+122,@CGUID+125,@CGUID+126,@CGUID+136,@CGUID+141,@CGUID+159,@CGUID+164,@CGUID+183,@CGUID+186,@CGUID+206,@CGUID+211,@CGUID+213,@CGUID+217,@CGUID+221,@CGUID+26) AND `memberGUID` IN (@CGUID+50,@CGUID+70,@CGUID+71,@CGUID+52,@CGUID+73,@CGUID+89,@CGUID+99,@CGUID+97,@CGUID+96,@CGUID+95,@CGUID+93,@CGUID+68,@CGUID+69,@CGUID+66,@CGUID+47,@CGUID+46,@CGUID+43,@CGUID+64,@CGUID+45,@CGUID+65,@CGUID+39,@CGUID+88,@CGUID+94,@CGUID+60,@CGUID+58,@CGUID+37,@CGUID+38,@CGUID+116,@CGUID+114,@CGUID+117,@CGUID+231,@CGUID+121,@CGUID+119,@CGUID+120,@CGUID+233,@CGUID+113,@CGUID+118,@CGUID+115,@CGUID+230,@CGUID+122,@CGUID+124,@CGUID+123,@CGUID+234,@CGUID+125,@CGUID+127,@CGUID+128,@CGUID+235,@CGUID+126,@CGUID+129,@CGUID+130,@CGUID+232,@CGUID+44,@CGUID+79,@CGUID+63,@CGUID+31,@CGUID+80,@CGUID+41,@CGUID+62,@CGUID+42,@CGUID+32,@CGUID+81,@CGUID+49,@CGUID+33,@CGUID+48,@CGUID+67,@CGUID+34,@CGUID+82,@CGUID+72,@CGUID+51,@CGUID+102,@CGUID+92,@CGUID+53,@CGUID+35,@CGUID+91,@CGUID+101,@CGUID+40,@CGUID+78,@CGUID+61,@CGUID+30,@CGUID+29,@CGUID+57,@CGUID+186,@CGUID+188,@CGUID+187,@CGUID+185,@CGUID+36,@CGUID+55,@CGUID+56,@CGUID+28,@CGUID+54,@CGUID+183,@CGUID+181,@CGUID+182,@CGUID+180,@CGUID+159,@CGUID+158,@CGUID+161,@CGUID+165,@CGUID+166,@CGUID+177,@CGUID+172,@CGUID+176,@CGUID+168,@CGUID+160,@CGUID+164,@CGUID+163,@CGUID+162,@CGUID+167,@CGUID+169,@CGUID+175,@CGUID+173,@CGUID+170,@CGUID+171,@CGUID+174,@CGUID+136,@CGUID+149,@CGUID+145,@CGUID+152,@CGUID+155,@CGUID+153,@CGUID+144,@CGUID+140,@CGUID+137,@CGUID+147,@CGUID+141,@CGUID+150,@CGUID+154,@CGUID+151,@CGUID+146,@CGUID+142,@CGUID+148,@CGUID+143,@CGUID+138,@CGUID+139,@CGUID+211,@CGUID+212,@CGUID+213,@CGUID+214,@CGUID+215,@CGUID+216,@CGUID+217,@CGUID+218,@CGUID+219,@CGUID+220,@CGUID+221,@CGUID+222,@CGUID+223,@CGUID+224,@CGUID+206,@CGUID+207,@CGUID+208,@CGUID+26,@CGUID+191,@CGUID+195,@CGUID+85);
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(@CGUID+50, @CGUID+50, 3),
|
(@CGUID+50, @CGUID+50, 0, 0, 3),
|
||||||
(@CGUID+50, @CGUID+70, 3),
|
(@CGUID+50, @CGUID+70, 0, 0, 3),
|
||||||
(@CGUID+50, @CGUID+71, 3),
|
(@CGUID+50, @CGUID+71, 0, 0, 3),
|
||||||
(@CGUID+52, @CGUID+52, 3),
|
(@CGUID+52, @CGUID+52, 0, 0, 3),
|
||||||
(@CGUID+52, @CGUID+73, 3),
|
(@CGUID+52, @CGUID+73, 0, 0, 3),
|
||||||
(@CGUID+89, @CGUID+89, 3),
|
(@CGUID+89, @CGUID+89, 0, 0, 3),
|
||||||
(@CGUID+89, @CGUID+99, 3),
|
(@CGUID+89, @CGUID+99, 0, 0, 3),
|
||||||
(@CGUID+89, @CGUID+97, 3),
|
(@CGUID+89, @CGUID+97, 0, 0, 3),
|
||||||
(@CGUID+89, @CGUID+96, 3),
|
(@CGUID+89, @CGUID+96, 0, 0, 3),
|
||||||
(@CGUID+89, @CGUID+95, 3),
|
(@CGUID+89, @CGUID+95, 0, 0, 3),
|
||||||
(@CGUID+89, @CGUID+93, 3),
|
(@CGUID+89, @CGUID+93, 0, 0, 3),
|
||||||
(@CGUID+68, @CGUID+68, 3),
|
(@CGUID+68, @CGUID+68, 0, 0, 3),
|
||||||
(@CGUID+68, @CGUID+69, 3),
|
(@CGUID+68, @CGUID+69, 0, 0, 3),
|
||||||
(@CGUID+66, @CGUID+66, 3),
|
(@CGUID+66, @CGUID+66, 0, 0, 3),
|
||||||
(@CGUID+66, @CGUID+47, 3),
|
(@CGUID+66, @CGUID+47, 0, 0, 3),
|
||||||
(@CGUID+66, @CGUID+46, 3),
|
(@CGUID+66, @CGUID+46, 0, 0, 3),
|
||||||
(@CGUID+43, @CGUID+43, 3),
|
(@CGUID+43, @CGUID+43, 0, 0, 3),
|
||||||
(@CGUID+43, @CGUID+64, 3),
|
(@CGUID+43, @CGUID+64, 0, 0, 3),
|
||||||
(@CGUID+45, @CGUID+45, 3),
|
(@CGUID+45, @CGUID+45, 0, 0, 3),
|
||||||
(@CGUID+45, @CGUID+65, 3),
|
(@CGUID+45, @CGUID+65, 0, 0, 3),
|
||||||
(@CGUID+39, @CGUID+39, 3),
|
(@CGUID+39, @CGUID+39, 0, 0, 3),
|
||||||
(@CGUID+39, @CGUID+88, 3),
|
(@CGUID+39, @CGUID+88, 0, 0, 3),
|
||||||
(@CGUID+39, @CGUID+94, 3),
|
(@CGUID+39, @CGUID+94, 0, 0, 3),
|
||||||
(@CGUID+39, @CGUID+60, 3),
|
(@CGUID+39, @CGUID+60, 0, 0, 3),
|
||||||
(@CGUID+58, @CGUID+58, 3),
|
(@CGUID+58, @CGUID+58, 0, 0, 3),
|
||||||
(@CGUID+58, @CGUID+37, 3),
|
(@CGUID+58, @CGUID+37, 0, 0, 3),
|
||||||
(@CGUID+58, @CGUID+38, 3),
|
(@CGUID+58, @CGUID+38, 0, 0, 3),
|
||||||
(@CGUID+116, @CGUID+116, 3),
|
(@CGUID+116, @CGUID+116, 0, 0, 3),
|
||||||
(@CGUID+116, @CGUID+114, 3),
|
(@CGUID+116, @CGUID+114, 0, 0, 3),
|
||||||
(@CGUID+116, @CGUID+117, 3),
|
(@CGUID+116, @CGUID+117, 0, 0, 3),
|
||||||
(@CGUID+116, @CGUID+231, 3),
|
(@CGUID+116, @CGUID+231, 0, 0, 3),
|
||||||
(@CGUID+121, @CGUID+121, 3),
|
(@CGUID+121, @CGUID+121, 0, 0, 3),
|
||||||
(@CGUID+121, @CGUID+119, 3),
|
(@CGUID+121, @CGUID+119, 0, 0, 3),
|
||||||
(@CGUID+121, @CGUID+120, 3),
|
(@CGUID+121, @CGUID+120, 0, 0, 3),
|
||||||
(@CGUID+121, @CGUID+233, 3),
|
(@CGUID+121, @CGUID+233, 0, 0, 3),
|
||||||
(@CGUID+113, @CGUID+113, 3),
|
(@CGUID+113, @CGUID+113, 0, 0, 3),
|
||||||
(@CGUID+113, @CGUID+118, 3),
|
(@CGUID+113, @CGUID+118, 0, 0, 3),
|
||||||
(@CGUID+113, @CGUID+115, 3),
|
(@CGUID+113, @CGUID+115, 0, 0, 3),
|
||||||
(@CGUID+113, @CGUID+230, 3),
|
(@CGUID+113, @CGUID+230, 0, 0, 3),
|
||||||
(@CGUID+122, @CGUID+122, 3),
|
(@CGUID+122, @CGUID+122, 0, 0, 3),
|
||||||
(@CGUID+122, @CGUID+124, 3),
|
(@CGUID+122, @CGUID+124, 0, 0, 3),
|
||||||
(@CGUID+122, @CGUID+123, 3),
|
(@CGUID+122, @CGUID+123, 0, 0, 3),
|
||||||
(@CGUID+122, @CGUID+234, 3),
|
(@CGUID+122, @CGUID+234, 0, 0, 3),
|
||||||
(@CGUID+125, @CGUID+125, 3),
|
(@CGUID+125, @CGUID+125, 0, 0, 3),
|
||||||
(@CGUID+125, @CGUID+127, 3),
|
(@CGUID+125, @CGUID+127, 0, 0, 3),
|
||||||
(@CGUID+125, @CGUID+128, 3),
|
(@CGUID+125, @CGUID+128, 0, 0, 3),
|
||||||
(@CGUID+125, @CGUID+235, 3),
|
(@CGUID+125, @CGUID+235, 0, 0, 3),
|
||||||
(@CGUID+126, @CGUID+126, 3),
|
(@CGUID+126, @CGUID+126, 0, 0, 3),
|
||||||
(@CGUID+126, @CGUID+129, 3),
|
(@CGUID+126, @CGUID+129, 0, 0, 3),
|
||||||
(@CGUID+126, @CGUID+130, 3),
|
(@CGUID+126, @CGUID+130, 0, 0, 3),
|
||||||
(@CGUID+126, @CGUID+232, 3),
|
(@CGUID+126, @CGUID+232, 0, 0, 3),
|
||||||
(@CGUID+44, @CGUID+44, 3),
|
(@CGUID+44, @CGUID+44, 0, 0, 3),
|
||||||
(@CGUID+44, @CGUID+79, 3),
|
(@CGUID+44, @CGUID+79, 0, 0, 3),
|
||||||
(@CGUID+44, @CGUID+63, 3),
|
(@CGUID+44, @CGUID+63, 0, 0, 3),
|
||||||
(@CGUID+44, @CGUID+31, 3),
|
(@CGUID+44, @CGUID+31, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+80, 3),
|
(@CGUID+80, @CGUID+80, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+41, 3),
|
(@CGUID+80, @CGUID+41, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+62, 3),
|
(@CGUID+80, @CGUID+62, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+42, 3),
|
(@CGUID+80, @CGUID+42, 0, 0, 3),
|
||||||
(@CGUID+80, @CGUID+32, 3),
|
(@CGUID+80, @CGUID+32, 0, 0, 3),
|
||||||
(@CGUID+81, @CGUID+81, 3),
|
(@CGUID+81, @CGUID+81, 0, 0, 3),
|
||||||
(@CGUID+81, @CGUID+49, 3),
|
(@CGUID+81, @CGUID+49, 0, 0, 3),
|
||||||
(@CGUID+81, @CGUID+33, 3),
|
(@CGUID+81, @CGUID+33, 0, 0, 3),
|
||||||
(@CGUID+81, @CGUID+48, 3),
|
(@CGUID+81, @CGUID+48, 0, 0, 3),
|
||||||
(@CGUID+81, @CGUID+67, 3),
|
(@CGUID+81, @CGUID+67, 0, 0, 3),
|
||||||
(@CGUID+34, @CGUID+34, 3),
|
(@CGUID+34, @CGUID+34, 0, 0, 3),
|
||||||
(@CGUID+34, @CGUID+82, 3),
|
(@CGUID+34, @CGUID+82, 0, 0, 3),
|
||||||
(@CGUID+34, @CGUID+72, 3),
|
(@CGUID+34, @CGUID+72, 0, 0, 3),
|
||||||
(@CGUID+34, @CGUID+51, 3),
|
(@CGUID+34, @CGUID+51, 0, 0, 3),
|
||||||
(@CGUID+34, @CGUID+102, 3),
|
(@CGUID+34, @CGUID+102, 0, 0, 3),
|
||||||
(@CGUID+34, @CGUID+92, 3),
|
(@CGUID+34, @CGUID+92, 0, 0, 3),
|
||||||
(@CGUID+53, @CGUID+53, 3),
|
(@CGUID+53, @CGUID+53, 0, 0, 3),
|
||||||
(@CGUID+53, @CGUID+35, 3),
|
(@CGUID+53, @CGUID+35, 0, 0, 3),
|
||||||
(@CGUID+91, @CGUID+91, 3),
|
(@CGUID+91, @CGUID+91, 0, 0, 3),
|
||||||
(@CGUID+91, @CGUID+101, 3),
|
(@CGUID+91, @CGUID+101, 0, 0, 3),
|
||||||
(@CGUID+91, @CGUID+40, 3),
|
(@CGUID+91, @CGUID+40, 0, 0, 3),
|
||||||
(@CGUID+91, @CGUID+78, 3),
|
(@CGUID+91, @CGUID+78, 0, 0, 3),
|
||||||
(@CGUID+91, @CGUID+61, 3),
|
(@CGUID+91, @CGUID+61, 0, 0, 3),
|
||||||
(@CGUID+91, @CGUID+30, 3),
|
(@CGUID+91, @CGUID+30, 0, 0, 3),
|
||||||
(@CGUID+29, @CGUID+29, 3),
|
(@CGUID+29, @CGUID+29, 0, 0, 3),
|
||||||
(@CGUID+29, @CGUID+57, 3),
|
(@CGUID+29, @CGUID+57, 0, 0, 3),
|
||||||
(@CGUID+186, @CGUID+186, 3),
|
(@CGUID+186, @CGUID+186, 0, 0, 3),
|
||||||
(@CGUID+186, @CGUID+188, 3),
|
(@CGUID+186, @CGUID+188, 0, 0, 3),
|
||||||
(@CGUID+186, @CGUID+187, 3),
|
(@CGUID+186, @CGUID+187, 0, 0, 3),
|
||||||
(@CGUID+186, @CGUID+185, 3),
|
(@CGUID+186, @CGUID+185, 0, 0, 3),
|
||||||
(@CGUID+36, @CGUID+36, 3),
|
(@CGUID+36, @CGUID+36, 0, 0, 3),
|
||||||
(@CGUID+36, @CGUID+55, 3),
|
(@CGUID+36, @CGUID+55, 0, 0, 3),
|
||||||
(@CGUID+36, @CGUID+56, 3),
|
(@CGUID+36, @CGUID+56, 0, 0, 3),
|
||||||
(@CGUID+28, @CGUID+28, 3),
|
(@CGUID+28, @CGUID+28, 0, 0, 3),
|
||||||
(@CGUID+28, @CGUID+54, 3),
|
(@CGUID+28, @CGUID+54, 0, 0, 3),
|
||||||
(@CGUID+183, @CGUID+183, 3),
|
(@CGUID+183, @CGUID+183, 0, 0, 3),
|
||||||
(@CGUID+183, @CGUID+181, 3),
|
(@CGUID+183, @CGUID+181, 0, 0, 3),
|
||||||
(@CGUID+183, @CGUID+182, 3),
|
(@CGUID+183, @CGUID+182, 0, 0, 3),
|
||||||
(@CGUID+183, @CGUID+180, 3),
|
(@CGUID+183, @CGUID+180, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+159, 3),
|
(@CGUID+159, @CGUID+159, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+158, 3),
|
(@CGUID+159, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+161, 3),
|
(@CGUID+159, @CGUID+161, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+165, 3),
|
(@CGUID+159, @CGUID+165, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+166, 3),
|
(@CGUID+159, @CGUID+166, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+177, 3),
|
(@CGUID+159, @CGUID+177, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+172, 3),
|
(@CGUID+159, @CGUID+172, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+176, 3),
|
(@CGUID+159, @CGUID+176, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+168, 3),
|
(@CGUID+159, @CGUID+168, 0, 0, 3),
|
||||||
(@CGUID+159, @CGUID+160, 3),
|
(@CGUID+159, @CGUID+160, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+164, 3),
|
(@CGUID+164, @CGUID+164, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+163, 3),
|
(@CGUID+164, @CGUID+163, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+162, 3),
|
(@CGUID+164, @CGUID+162, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+167, 3),
|
(@CGUID+164, @CGUID+167, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+169, 3),
|
(@CGUID+164, @CGUID+169, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+175, 3),
|
(@CGUID+164, @CGUID+175, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+173, 3),
|
(@CGUID+164, @CGUID+173, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+170, 3),
|
(@CGUID+164, @CGUID+170, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+171, 3),
|
(@CGUID+164, @CGUID+171, 0, 0, 3),
|
||||||
(@CGUID+164, @CGUID+174, 3),
|
(@CGUID+164, @CGUID+174, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+136, 3),
|
(@CGUID+136, @CGUID+136, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+149, 3),
|
(@CGUID+136, @CGUID+149, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+145, 3),
|
(@CGUID+136, @CGUID+145, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+152, 3),
|
(@CGUID+136, @CGUID+152, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+155, 3),
|
(@CGUID+136, @CGUID+155, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+153, 3),
|
(@CGUID+136, @CGUID+153, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+144, 3),
|
(@CGUID+136, @CGUID+144, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+140, 3),
|
(@CGUID+136, @CGUID+140, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+137, 3),
|
(@CGUID+136, @CGUID+137, 0, 0, 3),
|
||||||
(@CGUID+136, @CGUID+147, 3),
|
(@CGUID+136, @CGUID+147, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+141, 3),
|
(@CGUID+141, @CGUID+141, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+150, 3),
|
(@CGUID+141, @CGUID+150, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+154, 3),
|
(@CGUID+141, @CGUID+154, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+151, 3),
|
(@CGUID+141, @CGUID+151, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+146, 3),
|
(@CGUID+141, @CGUID+146, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+142, 3),
|
(@CGUID+141, @CGUID+142, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+148, 3),
|
(@CGUID+141, @CGUID+148, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+143, 3),
|
(@CGUID+141, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+138, 3),
|
(@CGUID+141, @CGUID+138, 0, 0, 3),
|
||||||
(@CGUID+141, @CGUID+139, 3),
|
(@CGUID+141, @CGUID+139, 0, 0, 3),
|
||||||
(@CGUID+211, @CGUID+211, 3),
|
(@CGUID+211, @CGUID+211, 0, 0, 3),
|
||||||
(@CGUID+211, @CGUID+212, 3),
|
(@CGUID+211, @CGUID+212, 0, 0, 3),
|
||||||
(@CGUID+213, @CGUID+213, 3),
|
(@CGUID+213, @CGUID+213, 0, 0, 3),
|
||||||
(@CGUID+213, @CGUID+214, 3),
|
(@CGUID+213, @CGUID+214, 0, 0, 3),
|
||||||
(@CGUID+213, @CGUID+215, 3),
|
(@CGUID+213, @CGUID+215, 0, 0, 3),
|
||||||
(@CGUID+213, @CGUID+216, 3),
|
(@CGUID+213, @CGUID+216, 0, 0, 3),
|
||||||
(@CGUID+217, @CGUID+217, 3),
|
(@CGUID+217, @CGUID+217, 0, 0, 3),
|
||||||
(@CGUID+217, @CGUID+218, 3),
|
(@CGUID+217, @CGUID+218, 0, 0, 3),
|
||||||
(@CGUID+217, @CGUID+219, 3),
|
(@CGUID+217, @CGUID+219, 0, 0, 3),
|
||||||
(@CGUID+217, @CGUID+220, 3),
|
(@CGUID+217, @CGUID+220, 0, 0, 3),
|
||||||
(@CGUID+221, @CGUID+221, 3),
|
(@CGUID+221, @CGUID+221, 0, 0, 3),
|
||||||
(@CGUID+221, @CGUID+222, 3),
|
(@CGUID+221, @CGUID+222, 0, 0, 3),
|
||||||
(@CGUID+221, @CGUID+223, 3),
|
(@CGUID+221, @CGUID+223, 0, 0, 3),
|
||||||
(@CGUID+221, @CGUID+224, 3),
|
(@CGUID+221, @CGUID+224, 0, 0, 3),
|
||||||
(@CGUID+206, @CGUID+206, 3),
|
(@CGUID+206, @CGUID+206, 0, 0, 3),
|
||||||
(@CGUID+206, @CGUID+207, 3),
|
(@CGUID+206, @CGUID+207, 0, 0, 3),
|
||||||
(@CGUID+206, @CGUID+208, 3),
|
(@CGUID+206, @CGUID+208, 0, 0, 3),
|
||||||
(@CGUID+26, @CGUID+26, 3),
|
(@CGUID+26, @CGUID+26, 0, 0, 3),
|
||||||
(@CGUID+26, @CGUID+191, 3),
|
(@CGUID+26, @CGUID+191, 0, 0, 3),
|
||||||
(@CGUID+26, @CGUID+195, 3),
|
(@CGUID+26, @CGUID+195, 0, 0, 3),
|
||||||
(@CGUID+26, @CGUID+85, 3);
|
(@CGUID+26, @CGUID+85, 0, 0, 3);
|
||||||
|
|
||||||
-- Linked Respawn for the respawning creatures in Murmur's Room
|
-- Linked Respawn for the respawning creatures in Murmur's Room
|
||||||
DELETE FROM `linked_respawn` WHERE `guid` IN (@CGUID+225, @CGUID+226, @CGUID+227, @CGUID+228, @CGUID+229) AND `linkType`=0;
|
DELETE FROM `linked_respawn` WHERE `guid` IN (@CGUID+225, @CGUID+226, @CGUID+227, @CGUID+228, @CGUID+229) AND `linkType`=0;
|
||||||
|
|||||||
@@ -1395,90 +1395,90 @@ INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`,
|
|||||||
(@CGUID+180, @CGUID+182, 3, 270, 515);
|
(@CGUID+180, @CGUID+182, 3, 270, 515);
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+006,@CGUID+007,@CGUID+010,@CGUID+011,@CGUID+012,@CGUID+013,@CGUID+014,@CGUID+015,@CGUID+016,@CGUID+017,@CGUID+018,@CGUID+008,@CGUID+009,@CGUID+019,@CGUID+023,@CGUID+021,@CGUID+022,@CGUID+020,@CGUID+024,@CGUID+027,@CGUID+025,@CGUID+028,@CGUID+026,@CGUID+029,@CGUID+032,@CGUID+030,@CGUID+033,@CGUID+031,@CGUID+034,@CGUID+035,@CGUID+036,@CGUID+037,@CGUID+038,@CGUID+039,@CGUID+040,@CGUID+041,@CGUID+094,@CGUID+095,@CGUID+096,@CGUID+097,@CGUID+121,@CGUID+122,@CGUID+123,@CGUID+124,@CGUID+131,@CGUID+134,@CGUID+132,@CGUID+135,@CGUID+133,@CGUID+136,@CGUID+137,@CGUID+138,@CGUID+139,@CGUID+140,@CGUID+141,@CGUID+142,@CGUID+175,@CGUID+176,@CGUID+177,@CGUID+178,@CGUID+183,@CGUID+184,@CGUID+192,@CGUID+193,@CGUID+046,@CGUID+047,@CGUID+048,@CGUID+148,@CGUID+149,@CGUID+150,@CGUID+151,@CGUID+152,@CGUID+143,@CGUID+144,@CGUID+145,@CGUID+147,@CGUID+146,@CGUID+153,@CGUID+155,@CGUID+157,@CGUID+154,@CGUID+156,@CGUID+158,@CGUID+159,@CGUID+160,@CGUID+161,@CGUID+162);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (@CGUID+006,@CGUID+007,@CGUID+010,@CGUID+011,@CGUID+012,@CGUID+013,@CGUID+014,@CGUID+015,@CGUID+016,@CGUID+017,@CGUID+018,@CGUID+008,@CGUID+009,@CGUID+019,@CGUID+023,@CGUID+021,@CGUID+022,@CGUID+020,@CGUID+024,@CGUID+027,@CGUID+025,@CGUID+028,@CGUID+026,@CGUID+029,@CGUID+032,@CGUID+030,@CGUID+033,@CGUID+031,@CGUID+034,@CGUID+035,@CGUID+036,@CGUID+037,@CGUID+038,@CGUID+039,@CGUID+040,@CGUID+041,@CGUID+094,@CGUID+095,@CGUID+096,@CGUID+097,@CGUID+121,@CGUID+122,@CGUID+123,@CGUID+124,@CGUID+131,@CGUID+134,@CGUID+132,@CGUID+135,@CGUID+133,@CGUID+136,@CGUID+137,@CGUID+138,@CGUID+139,@CGUID+140,@CGUID+141,@CGUID+142,@CGUID+175,@CGUID+176,@CGUID+177,@CGUID+178,@CGUID+183,@CGUID+184,@CGUID+192,@CGUID+193,@CGUID+046,@CGUID+047,@CGUID+048,@CGUID+148,@CGUID+149,@CGUID+150,@CGUID+151,@CGUID+152,@CGUID+143,@CGUID+144,@CGUID+145,@CGUID+147,@CGUID+146,@CGUID+153,@CGUID+155,@CGUID+157,@CGUID+154,@CGUID+156,@CGUID+158,@CGUID+159,@CGUID+160,@CGUID+161,@CGUID+162);
|
||||||
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`memberGUID`, `leaderGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(@CGUID+006,@CGUID+006,3),
|
(@CGUID+006, @CGUID+006, 0, 0, 3),
|
||||||
(@CGUID+007,@CGUID+006,3),
|
(@CGUID+007, @CGUID+006, 0, 0, 3),
|
||||||
(@CGUID+011,@CGUID+011,3),
|
(@CGUID+011, @CGUID+011, 0, 0, 3),
|
||||||
(@CGUID+012,@CGUID+011,3),
|
(@CGUID+012, @CGUID+011, 0, 0, 3),
|
||||||
(@CGUID+013,@CGUID+013,3),
|
(@CGUID+013, @CGUID+013, 0, 0, 3),
|
||||||
(@CGUID+014,@CGUID+013,3),
|
(@CGUID+014, @CGUID+013, 0, 0, 3),
|
||||||
(@CGUID+015,@CGUID+015,3),
|
(@CGUID+015, @CGUID+015, 0, 0, 3),
|
||||||
(@CGUID+016,@CGUID+015,3),
|
(@CGUID+016, @CGUID+015, 0, 0, 3),
|
||||||
(@CGUID+017,@CGUID+017,3),
|
(@CGUID+017, @CGUID+017, 0, 0, 3),
|
||||||
(@CGUID+018,@CGUID+017,3),
|
(@CGUID+018, @CGUID+017, 0, 0, 3),
|
||||||
(@CGUID+008,@CGUID+008,3),
|
(@CGUID+008, @CGUID+008, 0, 0, 3),
|
||||||
(@CGUID+009,@CGUID+008,3),
|
(@CGUID+009, @CGUID+008, 0, 0, 3),
|
||||||
(@CGUID+019,@CGUID+019,3),
|
(@CGUID+019, @CGUID+019, 0, 0, 3),
|
||||||
(@CGUID+023,@CGUID+019,3),
|
(@CGUID+023, @CGUID+019, 0, 0, 3),
|
||||||
(@CGUID+021,@CGUID+019,3),
|
(@CGUID+021, @CGUID+019, 0, 0, 3),
|
||||||
(@CGUID+022,@CGUID+019,3),
|
(@CGUID+022, @CGUID+019, 0, 0, 3),
|
||||||
(@CGUID+020,@CGUID+019,3),
|
(@CGUID+020, @CGUID+019, 0, 0, 3),
|
||||||
(@CGUID+024,@CGUID+024,3),
|
(@CGUID+024, @CGUID+024, 0, 0, 3),
|
||||||
(@CGUID+027,@CGUID+024,3),
|
(@CGUID+027, @CGUID+024, 0, 0, 3),
|
||||||
(@CGUID+025,@CGUID+024,3),
|
(@CGUID+025, @CGUID+024, 0, 0, 3),
|
||||||
(@CGUID+028,@CGUID+024,3),
|
(@CGUID+028, @CGUID+024, 0, 0, 3),
|
||||||
(@CGUID+026,@CGUID+024,3),
|
(@CGUID+026, @CGUID+024, 0, 0, 3),
|
||||||
(@CGUID+029,@CGUID+029,3),
|
(@CGUID+029, @CGUID+029, 0, 0, 3),
|
||||||
(@CGUID+032,@CGUID+029,3),
|
(@CGUID+032, @CGUID+029, 0, 0, 3),
|
||||||
(@CGUID+030,@CGUID+029,3),
|
(@CGUID+030, @CGUID+029, 0, 0, 3),
|
||||||
(@CGUID+033,@CGUID+029,3),
|
(@CGUID+033, @CGUID+029, 0, 0, 3),
|
||||||
(@CGUID+031,@CGUID+029,3),
|
(@CGUID+031, @CGUID+029, 0, 0, 3),
|
||||||
(@CGUID+034,@CGUID+029,3),
|
(@CGUID+034, @CGUID+029, 0, 0, 3),
|
||||||
(@CGUID+035,@CGUID+035,3),
|
(@CGUID+035, @CGUID+035, 0, 0, 3),
|
||||||
(@CGUID+036,@CGUID+035,3),
|
(@CGUID+036, @CGUID+035, 0, 0, 3),
|
||||||
(@CGUID+037,@CGUID+035,3),
|
(@CGUID+037, @CGUID+035, 0, 0, 3),
|
||||||
(@CGUID+038,@CGUID+035,3),
|
(@CGUID+038, @CGUID+035, 0, 0, 3),
|
||||||
(@CGUID+039,@CGUID+035,3),
|
(@CGUID+039, @CGUID+035, 0, 0, 3),
|
||||||
(@CGUID+040,@CGUID+035,3),
|
(@CGUID+040, @CGUID+035, 0, 0, 3),
|
||||||
(@CGUID+041,@CGUID+035,3),
|
(@CGUID+041, @CGUID+035, 0, 0, 3),
|
||||||
(@CGUID+094,@CGUID+094,3),
|
(@CGUID+094, @CGUID+094, 0, 0, 3),
|
||||||
(@CGUID+095,@CGUID+094,3),
|
(@CGUID+095, @CGUID+094, 0, 0, 3),
|
||||||
(@CGUID+096,@CGUID+094,3),
|
(@CGUID+096, @CGUID+094, 0, 0, 3),
|
||||||
(@CGUID+097,@CGUID+094,3),
|
(@CGUID+097, @CGUID+094, 0, 0, 3),
|
||||||
(@CGUID+121,@CGUID+121,3),
|
(@CGUID+121, @CGUID+121, 0, 0, 3),
|
||||||
(@CGUID+122,@CGUID+121,3),
|
(@CGUID+122, @CGUID+121, 0, 0, 3),
|
||||||
(@CGUID+123,@CGUID+121,3),
|
(@CGUID+123, @CGUID+121, 0, 0, 3),
|
||||||
(@CGUID+124,@CGUID+121,3),
|
(@CGUID+124, @CGUID+121, 0, 0, 3),
|
||||||
(@CGUID+131,@CGUID+131,3),
|
(@CGUID+131, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+134,@CGUID+131,3),
|
(@CGUID+134, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+132,@CGUID+131,3),
|
(@CGUID+132, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+135,@CGUID+131,3),
|
(@CGUID+135, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+133,@CGUID+131,3),
|
(@CGUID+133, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+136,@CGUID+131,3),
|
(@CGUID+136, @CGUID+131, 0, 0, 3),
|
||||||
(@CGUID+137,@CGUID+137,3),
|
(@CGUID+137, @CGUID+137, 0, 0, 3),
|
||||||
(@CGUID+138,@CGUID+137,3),
|
(@CGUID+138, @CGUID+137, 0, 0, 3),
|
||||||
(@CGUID+139,@CGUID+137,3),
|
(@CGUID+139, @CGUID+137, 0, 0, 3),
|
||||||
(@CGUID+140,@CGUID+137,3),
|
(@CGUID+140, @CGUID+137, 0, 0, 3),
|
||||||
(@CGUID+141,@CGUID+137,3),
|
(@CGUID+141, @CGUID+137, 0, 0, 3),
|
||||||
(@CGUID+142,@CGUID+137,3),
|
(@CGUID+142, @CGUID+137, 0, 0, 3),
|
||||||
(@CGUID+175,@CGUID+175,3),
|
(@CGUID+175, @CGUID+175, 0, 0, 3),
|
||||||
(@CGUID+176,@CGUID+175,3),
|
(@CGUID+176, @CGUID+175, 0, 0, 3),
|
||||||
(@CGUID+177,@CGUID+177,3),
|
(@CGUID+177, @CGUID+177, 0, 0, 3),
|
||||||
(@CGUID+178,@CGUID+177,3),
|
(@CGUID+178, @CGUID+177, 0, 0, 3),
|
||||||
(@CGUID+183,@CGUID+183,3),
|
(@CGUID+183, @CGUID+183, 0, 0, 3),
|
||||||
(@CGUID+184,@CGUID+183,3),
|
(@CGUID+184, @CGUID+183, 0, 0, 3),
|
||||||
(@CGUID+192,@CGUID+192,3),
|
(@CGUID+192, @CGUID+192, 0, 0, 3),
|
||||||
(@CGUID+193,@CGUID+192,3),
|
(@CGUID+193, @CGUID+192, 0, 0, 3),
|
||||||
(@CGUID+046,@CGUID+046,3),
|
(@CGUID+046, @CGUID+046, 0, 0, 3),
|
||||||
(@CGUID+047,@CGUID+046,3),
|
(@CGUID+047, @CGUID+046, 0, 0, 3),
|
||||||
(@CGUID+048,@CGUID+046,3),
|
(@CGUID+048, @CGUID+046, 0, 0, 3),
|
||||||
(@CGUID+148,@CGUID+148,3),
|
(@CGUID+148, @CGUID+148, 0, 0, 3),
|
||||||
(@CGUID+149,@CGUID+148,3),
|
(@CGUID+149, @CGUID+148, 0, 0, 3),
|
||||||
(@CGUID+150,@CGUID+148,3),
|
(@CGUID+150, @CGUID+148, 0, 0, 3),
|
||||||
(@CGUID+151,@CGUID+148,3),
|
(@CGUID+151, @CGUID+148, 0, 0, 3),
|
||||||
(@CGUID+152,@CGUID+148,3),
|
(@CGUID+152, @CGUID+148, 0, 0, 3),
|
||||||
(@CGUID+143,@CGUID+143,3),
|
(@CGUID+143, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+144,@CGUID+143,3),
|
(@CGUID+144, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+145,@CGUID+143,3),
|
(@CGUID+145, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+147,@CGUID+143,3),
|
(@CGUID+147, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+146,@CGUID+143,3),
|
(@CGUID+146, @CGUID+143, 0, 0, 3),
|
||||||
(@CGUID+153,@CGUID+153,3),
|
(@CGUID+153, @CGUID+153, 0, 0, 3),
|
||||||
(@CGUID+155,@CGUID+153,3),
|
(@CGUID+155, @CGUID+153, 0, 0, 3),
|
||||||
(@CGUID+157,@CGUID+153,3),
|
(@CGUID+157, @CGUID+153, 0, 0, 3),
|
||||||
(@CGUID+154,@CGUID+153,3),
|
(@CGUID+154, @CGUID+153, 0, 0, 3),
|
||||||
(@CGUID+156,@CGUID+153,3),
|
(@CGUID+156, @CGUID+153, 0, 0, 3),
|
||||||
(@CGUID+158,@CGUID+158,3),
|
(@CGUID+158, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+159,@CGUID+158,3),
|
(@CGUID+159, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+160,@CGUID+158,3),
|
(@CGUID+160, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+161,@CGUID+158,3),
|
(@CGUID+161, @CGUID+158, 0, 0, 3),
|
||||||
(@CGUID+162,@CGUID+158,3);
|
(@CGUID+162, @CGUID+158, 0, 0, 3);
|
||||||
|
|||||||
@@ -0,0 +1,271 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Clamp VerifiedBuild literals to signed MEDIUMINT range for DBs that still use
|
||||||
|
MEDIUMINT on VerifiedBuild (see data/sql/old/db_world/8.x/2022_10_30_01.sql).
|
||||||
|
|
||||||
|
Processes INSERT (explicit column lists) and simple UPDATE ... VerifiedBuild = N.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
MAX_SIGNED_MEDIUMINT = 8388607
|
||||||
|
MIN_SIGNED_MEDIUMINT = -8388608
|
||||||
|
|
||||||
|
INSERT_RE = re.compile(
|
||||||
|
r"INSERT\s+INTO\s+`(?P<table>\w+)`\s*\((?P<cols>[^)]+)\)\s*VALUES\s*",
|
||||||
|
re.IGNORECASE,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Base dumps: full row order ends with VerifiedBuild (6- or 8-column layouts).
|
||||||
|
INSERT_SPELL_TP_VALUES_RE = re.compile(
|
||||||
|
r"INSERT\s+INTO\s+`spell_target_position`\s*VALUES\s*",
|
||||||
|
re.IGNORECASE,
|
||||||
|
)
|
||||||
|
|
||||||
|
STMT_START = (
|
||||||
|
"INSERT ",
|
||||||
|
"DELETE ",
|
||||||
|
"UPDATE ",
|
||||||
|
"ALTER ",
|
||||||
|
"DROP ",
|
||||||
|
"CREATE ",
|
||||||
|
"SET ",
|
||||||
|
"REPLACE ",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def split_fields(inner: str) -> list[str]:
|
||||||
|
fields: list[str] = []
|
||||||
|
cur: list[str] = []
|
||||||
|
depth = 0
|
||||||
|
in_str = False
|
||||||
|
str_ch = ""
|
||||||
|
esc = False
|
||||||
|
for ch in inner:
|
||||||
|
if in_str:
|
||||||
|
cur.append(ch)
|
||||||
|
if esc:
|
||||||
|
esc = False
|
||||||
|
elif ch == "\\":
|
||||||
|
esc = True
|
||||||
|
elif ch == str_ch:
|
||||||
|
in_str = False
|
||||||
|
continue
|
||||||
|
if ch in "'\"":
|
||||||
|
in_str = True
|
||||||
|
str_ch = ch
|
||||||
|
cur.append(ch)
|
||||||
|
continue
|
||||||
|
if ch == "(":
|
||||||
|
depth += 1
|
||||||
|
elif ch == ")":
|
||||||
|
depth -= 1
|
||||||
|
if ch == "," and depth == 0:
|
||||||
|
fields.append("".join(cur).strip())
|
||||||
|
cur = []
|
||||||
|
else:
|
||||||
|
cur.append(ch)
|
||||||
|
fields.append("".join(cur).strip())
|
||||||
|
return fields
|
||||||
|
|
||||||
|
|
||||||
|
def join_fields(fields: list[str]) -> str:
|
||||||
|
return ", ".join(fields)
|
||||||
|
|
||||||
|
|
||||||
|
def clamp_tuple(tuple_str: str, vb_idx: int) -> str:
|
||||||
|
t = tuple_str.strip()
|
||||||
|
if not (t.startswith("(") and t.endswith(")")):
|
||||||
|
return tuple_str
|
||||||
|
fields = split_fields(t[1:-1])
|
||||||
|
if vb_idx >= len(fields):
|
||||||
|
return tuple_str
|
||||||
|
raw = fields[vb_idx].strip()
|
||||||
|
if not re.fullmatch(r"-?\d+", raw):
|
||||||
|
return tuple_str
|
||||||
|
n = int(raw)
|
||||||
|
if MIN_SIGNED_MEDIUMINT <= n <= MAX_SIGNED_MEDIUMINT:
|
||||||
|
return tuple_str
|
||||||
|
fields[vb_idx] = "0"
|
||||||
|
return "(" + join_fields(fields) + ")"
|
||||||
|
|
||||||
|
|
||||||
|
def process_value_segment(segment: str, vb_idx: int) -> tuple[str, int]:
|
||||||
|
out: list[str] = []
|
||||||
|
changes = 0
|
||||||
|
i, n = 0, len(segment)
|
||||||
|
while i < n:
|
||||||
|
if segment[i] == "(":
|
||||||
|
depth = 1
|
||||||
|
j = i + 1
|
||||||
|
while j < n and depth > 0:
|
||||||
|
if segment[j] == "(":
|
||||||
|
depth += 1
|
||||||
|
elif segment[j] == ")":
|
||||||
|
depth -= 1
|
||||||
|
j += 1
|
||||||
|
tup = segment[i:j]
|
||||||
|
new_tup = clamp_tuple(tup, vb_idx)
|
||||||
|
if new_tup != tup:
|
||||||
|
changes += 1
|
||||||
|
out.append(new_tup)
|
||||||
|
i = j
|
||||||
|
continue
|
||||||
|
out.append(segment[i])
|
||||||
|
i += 1
|
||||||
|
return "".join(out), changes
|
||||||
|
|
||||||
|
|
||||||
|
def clamp_update_verifiedbuild(line: str) -> tuple[str, int]:
|
||||||
|
changes = 0
|
||||||
|
|
||||||
|
def repl(m: re.Match[str]) -> str:
|
||||||
|
nonlocal changes
|
||||||
|
num = m.group(1)
|
||||||
|
n = int(num)
|
||||||
|
if MIN_SIGNED_MEDIUMINT <= n <= MAX_SIGNED_MEDIUMINT:
|
||||||
|
return m.group(0)
|
||||||
|
changes += 1
|
||||||
|
return f"`VerifiedBuild` = 0"
|
||||||
|
|
||||||
|
new_line = re.sub(
|
||||||
|
r"`VerifiedBuild`\s*=\s*([0-9]+)",
|
||||||
|
repl,
|
||||||
|
line,
|
||||||
|
flags=re.IGNORECASE,
|
||||||
|
)
|
||||||
|
return new_line, changes
|
||||||
|
|
||||||
|
|
||||||
|
def first_tuple_vb_index(segment: str) -> int | None:
|
||||||
|
i, n = 0, len(segment)
|
||||||
|
while i < n:
|
||||||
|
if segment[i] == "(":
|
||||||
|
depth = 1
|
||||||
|
j = i + 1
|
||||||
|
while j < n and depth > 0:
|
||||||
|
if segment[j] == "(":
|
||||||
|
depth += 1
|
||||||
|
elif segment[j] == ")":
|
||||||
|
depth -= 1
|
||||||
|
j += 1
|
||||||
|
tup = segment[i:j]
|
||||||
|
fields = split_fields(tup[1:-1])
|
||||||
|
if fields:
|
||||||
|
return len(fields) - 1
|
||||||
|
return None
|
||||||
|
i += 1
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def process_sql_text(text: str) -> tuple[str, int]:
|
||||||
|
lines = text.splitlines(keepends=True)
|
||||||
|
out: list[str] = []
|
||||||
|
mode: str | None = None
|
||||||
|
vb_idx = 0
|
||||||
|
total_changes = 0
|
||||||
|
|
||||||
|
for line in lines:
|
||||||
|
nl, ch = clamp_update_verifiedbuild(line)
|
||||||
|
total_changes += ch
|
||||||
|
line = nl
|
||||||
|
|
||||||
|
stripped = line.lstrip()
|
||||||
|
|
||||||
|
if mode == "insert_values":
|
||||||
|
if stripped and not stripped.startswith("(") and not stripped.startswith("--"):
|
||||||
|
if any(stripped.startswith(p) for p in STMT_START):
|
||||||
|
mode = None
|
||||||
|
|
||||||
|
if mode == "spell_tp_values":
|
||||||
|
if stripped and not stripped.startswith("(") and not stripped.startswith("--"):
|
||||||
|
if any(stripped.startswith(p) for p in STMT_START):
|
||||||
|
mode = None
|
||||||
|
|
||||||
|
if mode is None:
|
||||||
|
m = INSERT_RE.search(line)
|
||||||
|
if m and "`VerifiedBuild`" in m.group("cols"):
|
||||||
|
cols = [c.strip().strip("`") for c in m.group("cols").split(",")]
|
||||||
|
vb_idx = cols.index("VerifiedBuild")
|
||||||
|
mode = "insert_values"
|
||||||
|
prefix = line[: m.end()]
|
||||||
|
suffix = line[m.end() :]
|
||||||
|
if suffix.strip():
|
||||||
|
new_suf, ch2 = process_value_segment(suffix, vb_idx)
|
||||||
|
total_changes += ch2
|
||||||
|
line = prefix + new_suf
|
||||||
|
if ");" in line or line.rstrip().endswith(");"):
|
||||||
|
mode = None
|
||||||
|
out.append(line)
|
||||||
|
continue
|
||||||
|
m2 = INSERT_SPELL_TP_VALUES_RE.search(line)
|
||||||
|
if m2:
|
||||||
|
mode = "spell_tp_values"
|
||||||
|
vb_idx = -1
|
||||||
|
prefix = line[: m2.end()]
|
||||||
|
suffix = line[m2.end() :]
|
||||||
|
if suffix.strip():
|
||||||
|
vb_idx = first_tuple_vb_index(suffix)
|
||||||
|
if vb_idx is None:
|
||||||
|
vb_idx = 7
|
||||||
|
new_suf, ch2 = process_value_segment(suffix, vb_idx)
|
||||||
|
total_changes += ch2
|
||||||
|
line = prefix + new_suf
|
||||||
|
if ");" in line or line.rstrip().endswith(");"):
|
||||||
|
mode = None
|
||||||
|
out.append(line)
|
||||||
|
continue
|
||||||
|
out.append(line)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if mode == "spell_tp_values":
|
||||||
|
if vb_idx < 0:
|
||||||
|
vb_idx = first_tuple_vb_index(line)
|
||||||
|
if vb_idx is None:
|
||||||
|
vb_idx = 7
|
||||||
|
new_line, ch3 = process_value_segment(line, vb_idx)
|
||||||
|
total_changes += ch3
|
||||||
|
out.append(new_line)
|
||||||
|
if ");" in line or line.rstrip().endswith(");"):
|
||||||
|
mode = None
|
||||||
|
continue
|
||||||
|
|
||||||
|
# insert_values continuation
|
||||||
|
new_line, ch3 = process_value_segment(line, vb_idx)
|
||||||
|
total_changes += ch3
|
||||||
|
out.append(new_line)
|
||||||
|
if ");" in line or line.rstrip().endswith(");"):
|
||||||
|
mode = None
|
||||||
|
|
||||||
|
return "".join(out), total_changes
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
sql_root = Path(__file__).resolve().parents[1]
|
||||||
|
roots = [
|
||||||
|
sql_root / "archive" / "db_world",
|
||||||
|
sql_root / "updates" / "db_world",
|
||||||
|
sql_root / "base" / "db_world",
|
||||||
|
]
|
||||||
|
file_count = 0
|
||||||
|
change_lines = 0
|
||||||
|
for root in roots:
|
||||||
|
if not root.exists():
|
||||||
|
continue
|
||||||
|
for path in sorted(root.glob("*.sql")):
|
||||||
|
text = path.read_text(encoding="utf-8", errors="strict")
|
||||||
|
new_text, ch = process_sql_text(text)
|
||||||
|
if ch:
|
||||||
|
path.write_text(new_text, encoding="utf-8")
|
||||||
|
change_lines += ch
|
||||||
|
file_count += 1
|
||||||
|
print(f"{path.relative_to(sql_root)}: {ch} change(s)")
|
||||||
|
print(f"Done. {file_count} file(s) written, {change_lines} change(s).")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
-- DB update 2026_05_03_00 -> 2026_05_12_00
|
||||||
|
-- RBAC permission for .learn all mounts (Admin 196, Gamemaster 197).
|
||||||
|
DELETE FROM `rbac_permissions` WHERE `id` = 916;
|
||||||
|
INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
|
||||||
|
(916, 'Command: learn all mounts');
|
||||||
|
|
||||||
|
DELETE FROM `rbac_linked_permissions` WHERE `linkedId` = 916;
|
||||||
|
INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES
|
||||||
|
(196, 916),
|
||||||
|
(197, 916);
|
||||||
@@ -31,15 +31,15 @@ INSERT INTO `creature` (`guid`, `id1`, `map`, `zoneId`, `areaId`, `spawnMask`, `
|
|||||||
UPDATE `creature_template` SET `flags_extra` = `flags_extra`|33554432 WHERE `entry` IN (28732, 28733, 28734, 28731, 28730, 28729, 28684, 31612, 31616, 31615, 31617, 31608, 31605, 31606);
|
UPDATE `creature_template` SET `flags_extra` = `flags_extra`|33554432 WHERE `entry` IN (28732, 28733, 28734, 28731, 28730, 28729, 28684, 31612, 31616, 31615, 31617, 31608, 31605, 31606);
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `leaderGUID` IN (12758, 12759, 12760);
|
DELETE FROM `creature_formations` WHERE `leaderGUID` IN (12758, 12759, 12760);
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(12758, 12758, 11),
|
(12758, 12758, 0, 0, 11),
|
||||||
(12758, 12762, 11),
|
(12758, 12762, 0, 0, 11),
|
||||||
(12758, 12761, 11),
|
(12758, 12761, 0, 0, 11),
|
||||||
|
|
||||||
(12759, 12759, 11),
|
(12759, 12759, 0, 0, 11),
|
||||||
(12759, 12763, 11),
|
(12759, 12763, 0, 0, 11),
|
||||||
(12759, 12764, 11),
|
(12759, 12764, 0, 0, 11),
|
||||||
|
|
||||||
(12760, 12760, 11),
|
(12760, 12760, 0, 0, 11),
|
||||||
(12760, 12765, 11),
|
(12760, 12765, 0, 0, 11),
|
||||||
(12760, 12766, 11);
|
(12760, 12766, 0, 0, 11);
|
||||||
|
|||||||
@@ -19,37 +19,37 @@ INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_
|
|||||||
(16505, 0, 3, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 39, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Naxxramas Follower - On Aggro - Call For Help');
|
(16505, 0, 3, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 39, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Naxxramas Follower - On Aggro - Call For Help');
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `memberGUID` IN (127800, 127987, 127988, 127989, 127990, 127991, 127992, 127993, 127994, 127995, 127996, 127997, 127998, 127999, 128000, 128001, 128019, 128020, 128021, 128022, 128023, 128024, 128025, 128026, 128027, 128028, 128029, 128030, 128031, 128032, 128033, 128034, 128035);
|
DELETE FROM `creature_formations` WHERE `memberGUID` IN (127800, 127987, 127988, 127989, 127990, 127991, 127992, 127993, 127994, 127995, 127996, 127997, 127998, 127999, 128000, 128001, 128019, 128020, 128021, 128022, 128023, 128024, 128025, 128026, 128027, 128028, 128029, 128030, 128031, 128032, 128033, 128034, 128035);
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(127800, 127800, 1),
|
(127800, 127800, 0, 0, 1),
|
||||||
(127800, 127987, 1),
|
(127800, 127987, 0, 0, 1),
|
||||||
(127800, 127988, 1),
|
(127800, 127988, 0, 0, 1),
|
||||||
(127800, 127989, 1),
|
(127800, 127989, 0, 0, 1),
|
||||||
(127800, 127990, 1),
|
(127800, 127990, 0, 0, 1),
|
||||||
(127800, 127991, 1),
|
(127800, 127991, 0, 0, 1),
|
||||||
(127800, 127992, 1),
|
(127800, 127992, 0, 0, 1),
|
||||||
(127800, 127993, 1),
|
(127800, 127993, 0, 0, 1),
|
||||||
(127800, 127994, 1),
|
(127800, 127994, 0, 0, 1),
|
||||||
(127800, 127995, 1),
|
(127800, 127995, 0, 0, 1),
|
||||||
(127800, 127996, 1),
|
(127800, 127996, 0, 0, 1),
|
||||||
(127800, 127997, 1),
|
(127800, 127997, 0, 0, 1),
|
||||||
(127800, 127998, 1),
|
(127800, 127998, 0, 0, 1),
|
||||||
(127800, 127999, 1),
|
(127800, 127999, 0, 0, 1),
|
||||||
(127800, 128000, 1),
|
(127800, 128000, 0, 0, 1),
|
||||||
(127800, 128001, 1),
|
(127800, 128001, 0, 0, 1),
|
||||||
(127800, 128019, 1),
|
(127800, 128019, 0, 0, 1),
|
||||||
(127800, 128020, 1),
|
(127800, 128020, 0, 0, 1),
|
||||||
(127800, 128021, 1),
|
(127800, 128021, 0, 0, 1),
|
||||||
(127800, 128022, 1),
|
(127800, 128022, 0, 0, 1),
|
||||||
(127800, 128023, 1),
|
(127800, 128023, 0, 0, 1),
|
||||||
(127800, 128024, 1),
|
(127800, 128024, 0, 0, 1),
|
||||||
(127800, 128025, 1),
|
(127800, 128025, 0, 0, 1),
|
||||||
(127800, 128026, 1),
|
(127800, 128026, 0, 0, 1),
|
||||||
(127800, 128027, 1),
|
(127800, 128027, 0, 0, 1),
|
||||||
(127800, 128028, 1),
|
(127800, 128028, 0, 0, 1),
|
||||||
(127800, 128029, 1),
|
(127800, 128029, 0, 0, 1),
|
||||||
(127800, 128030, 1),
|
(127800, 128030, 0, 0, 1),
|
||||||
(127800, 128031, 1),
|
(127800, 128031, 0, 0, 1),
|
||||||
(127800, 128032, 1),
|
(127800, 128032, 0, 0, 1),
|
||||||
(127800, 128033, 1),
|
(127800, 128033, 0, 0, 1),
|
||||||
(127800, 128034, 1),
|
(127800, 128034, 0, 0, 1),
|
||||||
(127800, 128035, 1);
|
(127800, 128035, 0, 0, 1);
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
-- DB update 2026_01_04_00 -> 2026_01_04_01
|
-- DB update 2026_01_04_00 -> 2026_01_04_01
|
||||||
--
|
--
|
||||||
DELETE FROM `creature_formations` WHERE `leaderGUID` IN (12758, 12759, 12760);
|
DELETE FROM `creature_formations` WHERE `leaderGUID` IN (12758, 12759, 12760);
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(12758, 12758, 7),
|
(12758, 12758, 0, 0, 7),
|
||||||
(12758, 12762, 7),
|
(12758, 12762, 0, 0, 7),
|
||||||
(12758, 12761, 7),
|
(12758, 12761, 0, 0, 7),
|
||||||
(12759, 12759, 7),
|
(12759, 12759, 0, 0, 7),
|
||||||
(12759, 12763, 7),
|
(12759, 12763, 0, 0, 7),
|
||||||
(12759, 12764, 7),
|
(12759, 12764, 0, 0, 7),
|
||||||
(12760, 12760, 7),
|
(12760, 12760, 0, 0, 7),
|
||||||
(12760, 12765, 7),
|
(12760, 12765, 0, 0, 7),
|
||||||
(12760, 12766, 7);
|
(12760, 12766, 0, 0, 7);
|
||||||
|
|
||||||
DELETE FROM `linked_respawn` WHERE `linkedGuid` = 127214 AND `linkType` = 0;
|
DELETE FROM `linked_respawn` WHERE `linkedGuid` = 127214 AND `linkType` = 0;
|
||||||
INSERT INTO `linked_respawn` (`guid`, `linkedGuid`, `linkType`) VALUES
|
INSERT INTO `linked_respawn` (`guid`, `linkedGuid`, `linkType`) VALUES
|
||||||
|
|||||||
@@ -2,41 +2,41 @@
|
|||||||
-- Hellfire Peninsula - Pools of Aggonar ooze aggro linking
|
-- Hellfire Peninsula - Pools of Aggonar ooze aggro linking
|
||||||
DELETE FROM `creature_formations` WHERE `leaderGUID` BETWEEN 58465 and 58497;
|
DELETE FROM `creature_formations` WHERE `leaderGUID` BETWEEN 58465 and 58497;
|
||||||
DELETE FROM `creature_formations` WHERE `leaderGUID` = 58786;
|
DELETE FROM `creature_formations` WHERE `leaderGUID` = 58786;
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(58465, 58465, 3), (58465, 58498, 3), (58465, 58499, 3),
|
(58465, 58465, 0, 0, 3), (58465, 58498, 0, 0, 3), (58465, 58499, 0, 0, 3),
|
||||||
(58466, 58466, 3), (58466, 58500, 3), (58466, 58504, 3),
|
(58466, 58466, 0, 0, 3), (58466, 58500, 0, 0, 3), (58466, 58504, 0, 0, 3),
|
||||||
(58467, 58467, 3), (58467, 58501, 3), (58467, 58503, 3),
|
(58467, 58467, 0, 0, 3), (58467, 58501, 0, 0, 3), (58467, 58503, 0, 0, 3),
|
||||||
(58468, 58468, 3), (58468, 58561, 3), (58468, 58562, 3),
|
(58468, 58468, 0, 0, 3), (58468, 58561, 0, 0, 3), (58468, 58562, 0, 0, 3),
|
||||||
(58469, 58469, 3), (58469, 58507, 3), (58469, 58508, 3),
|
(58469, 58469, 0, 0, 3), (58469, 58507, 0, 0, 3), (58469, 58508, 0, 0, 3),
|
||||||
(58470, 58470, 3), (58470, 58509, 3), (58470, 58510, 3),
|
(58470, 58470, 0, 0, 3), (58470, 58509, 0, 0, 3), (58470, 58510, 0, 0, 3),
|
||||||
(58471, 58471, 3), (58471, 58502, 3), (58471, 58787, 3),
|
(58471, 58471, 0, 0, 3), (58471, 58502, 0, 0, 3), (58471, 58787, 0, 0, 3),
|
||||||
(58786, 58786, 3), (58786, 58513, 3), (58786, 58514, 3),
|
(58786, 58786, 0, 0, 3), (58786, 58513, 0, 0, 3), (58786, 58514, 0, 0, 3),
|
||||||
(58472, 58472, 3), (58472, 58511, 3), (58472, 58512, 3),
|
(58472, 58472, 0, 0, 3), (58472, 58511, 0, 0, 3), (58472, 58512, 0, 0, 3),
|
||||||
(58473, 58473, 3), (58473, 58515, 3), (58473, 58516, 3),
|
(58473, 58473, 0, 0, 3), (58473, 58515, 0, 0, 3), (58473, 58516, 0, 0, 3),
|
||||||
(58474, 58474, 3), (58474, 58517, 3), (58474, 58518, 3),
|
(58474, 58474, 0, 0, 3), (58474, 58517, 0, 0, 3), (58474, 58518, 0, 0, 3),
|
||||||
(58475, 58475, 3), (58475, 58519, 3), (58475, 58520, 3),
|
(58475, 58475, 0, 0, 3), (58475, 58519, 0, 0, 3), (58475, 58520, 0, 0, 3),
|
||||||
(58476, 58476, 3), (58476, 58521, 3), (58476, 58522, 3),
|
(58476, 58476, 0, 0, 3), (58476, 58521, 0, 0, 3), (58476, 58522, 0, 0, 3),
|
||||||
(58477, 58477, 3), (58477, 58523, 3), (58477, 58524, 3),
|
(58477, 58477, 0, 0, 3), (58477, 58523, 0, 0, 3), (58477, 58524, 0, 0, 3),
|
||||||
(58478, 58478, 3), (58478, 58525, 3), (58478, 58526, 3),
|
(58478, 58478, 0, 0, 3), (58478, 58525, 0, 0, 3), (58478, 58526, 0, 0, 3),
|
||||||
(58479, 58479, 3), (58479, 58527, 3), (58479, 58528, 3),
|
(58479, 58479, 0, 0, 3), (58479, 58527, 0, 0, 3), (58479, 58528, 0, 0, 3),
|
||||||
(58480, 58480, 3), (58480, 58529, 3), (58480, 58530, 3),
|
(58480, 58480, 0, 0, 3), (58480, 58529, 0, 0, 3), (58480, 58530, 0, 0, 3),
|
||||||
(58481, 58481, 3), (58481, 58531, 3), (58481, 58532, 3),
|
(58481, 58481, 0, 0, 3), (58481, 58531, 0, 0, 3), (58481, 58532, 0, 0, 3),
|
||||||
(58482, 58482, 3), (58482, 58535, 3), (58482, 58536, 3),
|
(58482, 58482, 0, 0, 3), (58482, 58535, 0, 0, 3), (58482, 58536, 0, 0, 3),
|
||||||
(58483, 58483, 3), (58483, 58533, 3), (58483, 58534, 3),
|
(58483, 58483, 0, 0, 3), (58483, 58533, 0, 0, 3), (58483, 58534, 0, 0, 3),
|
||||||
(58484, 58484, 3), (58484, 58537, 3), (58484, 58538, 3),
|
(58484, 58484, 0, 0, 3), (58484, 58537, 0, 0, 3), (58484, 58538, 0, 0, 3),
|
||||||
(58485, 58485, 3), (58485, 58539, 3), (58485, 58540, 3),
|
(58485, 58485, 0, 0, 3), (58485, 58539, 0, 0, 3), (58485, 58540, 0, 0, 3),
|
||||||
(58486, 58486, 3), (58486, 58541, 3), (58486, 58542, 3),
|
(58486, 58486, 0, 0, 3), (58486, 58541, 0, 0, 3), (58486, 58542, 0, 0, 3),
|
||||||
(58487, 58487, 3), (58487, 58543, 3), (58487, 58544, 3),
|
(58487, 58487, 0, 0, 3), (58487, 58543, 0, 0, 3), (58487, 58544, 0, 0, 3),
|
||||||
(58488, 58488, 3), (58488, 58545, 3), (58488, 58546, 3),
|
(58488, 58488, 0, 0, 3), (58488, 58545, 0, 0, 3), (58488, 58546, 0, 0, 3),
|
||||||
(58489, 58489, 3), (58489, 58552, 3), (58489, 58553, 3),
|
(58489, 58489, 0, 0, 3), (58489, 58552, 0, 0, 3), (58489, 58553, 0, 0, 3),
|
||||||
(58490, 58490, 3), (58490, 58554, 3), (58490, 58547, 3),
|
(58490, 58490, 0, 0, 3), (58490, 58554, 0, 0, 3), (58490, 58547, 0, 0, 3),
|
||||||
(58491, 58491, 3), (58491, 58549, 3), (58491, 58548, 3),
|
(58491, 58491, 0, 0, 3), (58491, 58549, 0, 0, 3), (58491, 58548, 0, 0, 3),
|
||||||
(58492, 58492, 3), (58492, 58550, 3), (58492, 58551, 3),
|
(58492, 58492, 0, 0, 3), (58492, 58550, 0, 0, 3), (58492, 58551, 0, 0, 3),
|
||||||
(58493, 58493, 3), (58493, 58555, 3), (58493, 58556, 3),
|
(58493, 58493, 0, 0, 3), (58493, 58555, 0, 0, 3), (58493, 58556, 0, 0, 3),
|
||||||
(58494, 58494, 3), (58494, 58557, 3), (58494, 58558, 3),
|
(58494, 58494, 0, 0, 3), (58494, 58557, 0, 0, 3), (58494, 58558, 0, 0, 3),
|
||||||
(58495, 58495, 3), (58495, 58559, 3), (58495, 58560, 3),
|
(58495, 58495, 0, 0, 3), (58495, 58559, 0, 0, 3), (58495, 58560, 0, 0, 3),
|
||||||
(58496, 58496, 3), (58496, 58505, 3), (58496, 58506, 3),
|
(58496, 58496, 0, 0, 3), (58496, 58505, 0, 0, 3), (58496, 58506, 0, 0, 3),
|
||||||
(58497, 58497, 3), (58497, 58563, 3), (58497, 58564, 3);
|
(58497, 58497, 0, 0, 3), (58497, 58563, 0, 0, 3), (58497, 58564, 0, 0, 3);
|
||||||
|
|
||||||
-- Reposition oozes to be closer to group members
|
-- Reposition oozes to be closer to group members
|
||||||
UPDATE `creature` SET `position_x`=381.658, `position_y`=3482.38, `position_z`=61.609, `orientation`=5.43889 WHERE `guid` = 58496 AND `id1` = 16901;
|
UPDATE `creature` SET `position_x`=381.658, `position_y`=3482.38, `position_z`=61.609, `orientation`=5.43889 WHERE `guid` = 58496 AND `id1` = 16901;
|
||||||
|
|||||||
@@ -392,27 +392,27 @@ INSERT INTO `creature_addon` (`guid`, `path_id`) VALUES
|
|||||||
(@GUID+28, (@GUID+28)*10);
|
(@GUID+28, (@GUID+28)*10);
|
||||||
|
|
||||||
DELETE FROM `creature_formations` WHERE `leaderGUID` IN (@GUID+32,@GUID+38,@GUID+41,@GUID+47,@GUID+16,@GUID+4,@GUID+9,@GUID+12,@GUID+2,@GUID+26);
|
DELETE FROM `creature_formations` WHERE `leaderGUID` IN (@GUID+32,@GUID+38,@GUID+41,@GUID+47,@GUID+16,@GUID+4,@GUID+9,@GUID+12,@GUID+2,@GUID+26);
|
||||||
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `groupAI`) VALUES
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`) VALUES
|
||||||
(@GUID+32, @GUID+32, 3),
|
(@GUID+32, @GUID+32, 0, 0, 3),
|
||||||
(@GUID+32, @GUID+33, 3),
|
(@GUID+32, @GUID+33, 0, 0, 3),
|
||||||
(@GUID+2, @GUID+2 , 3),
|
(@GUID+2, @GUID+2, 0, 0, 3),
|
||||||
(@GUID+2, @GUID+3 , 3),
|
(@GUID+2, @GUID+3, 0, 0, 3),
|
||||||
(@GUID+26, @GUID+26, 3),
|
(@GUID+26, @GUID+26, 0, 0, 3),
|
||||||
(@GUID+26, @GUID+27, 3),
|
(@GUID+26, @GUID+27, 0, 0, 3),
|
||||||
(@GUID+38, @GUID+38, 3),
|
(@GUID+38, @GUID+38, 0, 0, 3),
|
||||||
(@GUID+38, @GUID+39, 3),
|
(@GUID+38, @GUID+39, 0, 0, 3),
|
||||||
(@GUID+41, @GUID+41, 3),
|
(@GUID+41, @GUID+41, 0, 0, 3),
|
||||||
(@GUID+41, @GUID+42, 3),
|
(@GUID+41, @GUID+42, 0, 0, 3),
|
||||||
(@GUID+47, @GUID+47, 3),
|
(@GUID+47, @GUID+47, 0, 0, 3),
|
||||||
(@GUID+47, @GUID+48, 3),
|
(@GUID+47, @GUID+48, 0, 0, 3),
|
||||||
(@GUID+16, @GUID+16, 3),
|
(@GUID+16, @GUID+16, 0, 0, 3),
|
||||||
(@GUID+16, @GUID+17, 3),
|
(@GUID+16, @GUID+17, 0, 0, 3),
|
||||||
(@GUID+4, @GUID+4 , 3),
|
(@GUID+4, @GUID+4, 0, 0, 3),
|
||||||
(@GUID+4, @GUID+5 , 3),
|
(@GUID+4, @GUID+5, 0, 0, 3),
|
||||||
(@GUID+9, @GUID+9 , 3),
|
(@GUID+9, @GUID+9, 0, 0, 3),
|
||||||
(@GUID+9, @GUID+10, 3),
|
(@GUID+9, @GUID+10, 0, 0, 3),
|
||||||
(@GUID+12, @GUID+12, 3),
|
(@GUID+12, @GUID+12, 0, 0, 3),
|
||||||
(@GUID+12, @GUID+13, 3);
|
(@GUID+12, @GUID+13, 0, 0, 3);
|
||||||
|
|
||||||
DELETE FROM `creature_addon` WHERE `guid` IN (@GUID+32,@GUID+33,@GUID+2 ,@GUID+3 ,@GUID+26,@GUID+27,@GUID+38,@GUID+39,@GUID+41,@GUID+42,@GUID+47,@GUID+48,@GUID+16,@GUID+17,@GUID+4 ,@GUID+5 ,@GUID+9 ,@GUID+10,@GUID+12,@GUID+13);
|
DELETE FROM `creature_addon` WHERE `guid` IN (@GUID+32,@GUID+33,@GUID+2 ,@GUID+3 ,@GUID+26,@GUID+27,@GUID+38,@GUID+39,@GUID+41,@GUID+42,@GUID+47,@GUID+48,@GUID+16,@GUID+17,@GUID+4 ,@GUID+5 ,@GUID+9 ,@GUID+10,@GUID+12,@GUID+13);
|
||||||
INSERT INTO `creature_addon` (`guid`, `bytes1`) VALUES
|
INSERT INTO `creature_addon` (`guid`, `bytes1`) VALUES
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
-- DB update 2026_05_06_00 -> 2026_05_13_00
|
||||||
|
-- Fractured: raise stack size to 200 for socketable gems (item class 3), all Trade Goods
|
||||||
|
-- (class 7: cloth, leather, ore/bar, herbs, parts, elementals, dusts, etc.), and Reagents
|
||||||
|
-- (class 5). Rows with ItemLimitCategory or maxcount still obey those limits when looting/carrying.
|
||||||
|
|
||||||
|
UPDATE `item_template` SET `stackable` = 200
|
||||||
|
WHERE `class` = 3
|
||||||
|
AND `stackable` > 0
|
||||||
|
AND `stackable` < 200
|
||||||
|
AND `stackable` <> 2147483647;
|
||||||
|
|
||||||
|
UPDATE `item_template` SET `stackable` = 200
|
||||||
|
WHERE `class` = 7
|
||||||
|
AND `stackable` > 0
|
||||||
|
AND `stackable` < 200
|
||||||
|
AND `stackable` <> 2147483647;
|
||||||
|
|
||||||
|
UPDATE `item_template` SET `stackable` = 200
|
||||||
|
WHERE `class` = 5
|
||||||
|
AND `stackable` > 0
|
||||||
|
AND `stackable` < 200
|
||||||
|
AND `stackable` <> 2147483647;
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 4
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
max_line_length = 80
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
## AUTO-DETECT
|
||||||
|
## Handle line endings automatically for files detected as
|
||||||
|
## text and leave all files detected as binary untouched.
|
||||||
|
## This will handle all files NOT defined below.
|
||||||
|
* text eol=lf
|
||||||
|
|
||||||
|
# Text
|
||||||
|
*.conf text
|
||||||
|
*.conf.dist text
|
||||||
|
*.cmake text
|
||||||
|
|
||||||
|
## Scripts
|
||||||
|
*.sh text
|
||||||
|
*.fish text
|
||||||
|
*.lua text
|
||||||
|
|
||||||
|
## SQL
|
||||||
|
*.sql text
|
||||||
|
|
||||||
|
## C++
|
||||||
|
*.c text
|
||||||
|
*.cc text
|
||||||
|
*.cxx text
|
||||||
|
*.cpp text
|
||||||
|
*.c++ text
|
||||||
|
*.hpp text
|
||||||
|
*.h text
|
||||||
|
*.h++ text
|
||||||
|
*.hh text
|
||||||
|
|
||||||
|
## For documentation
|
||||||
|
|
||||||
|
# Documents
|
||||||
|
*.doc diff=astextplain
|
||||||
|
*.DOC diff=astextplain
|
||||||
|
*.docx diff=astextplain
|
||||||
|
*.DOCX diff=astextplain
|
||||||
|
*.dot diff=astextplain
|
||||||
|
*.DOT diff=astextplain
|
||||||
|
*.pdf diff=astextplain
|
||||||
|
*.PDF diff=astextplain
|
||||||
|
*.rtf diff=astextplain
|
||||||
|
*.RTF diff=astextplain
|
||||||
|
|
||||||
|
## DOCUMENTATION
|
||||||
|
*.markdown text
|
||||||
|
*.md text
|
||||||
|
*.mdwn text
|
||||||
|
*.mdown text
|
||||||
|
*.mkd text
|
||||||
|
*.mkdn text
|
||||||
|
*.mdtxt text
|
||||||
|
*.mdtext text
|
||||||
|
*.txt text
|
||||||
|
AUTHORS text
|
||||||
|
CHANGELOG text
|
||||||
|
CHANGES text
|
||||||
|
CONTRIBUTING text
|
||||||
|
COPYING text
|
||||||
|
copyright text
|
||||||
|
COPYRIGHT text
|
||||||
|
INSTALL text
|
||||||
|
license text
|
||||||
|
LICENSE text
|
||||||
|
NEWS text
|
||||||
|
readme text
|
||||||
|
README text
|
||||||
|
TODO text
|
||||||
|
|
||||||
|
## GRAPHICS
|
||||||
|
*.ai binary
|
||||||
|
*.bmp binary
|
||||||
|
*.eps binary
|
||||||
|
*.gif binary
|
||||||
|
*.ico binary
|
||||||
|
*.jng binary
|
||||||
|
*.jp2 binary
|
||||||
|
*.jpg binary
|
||||||
|
*.jpeg binary
|
||||||
|
*.jpx binary
|
||||||
|
*.jxr binary
|
||||||
|
*.pdf binary
|
||||||
|
*.png binary
|
||||||
|
*.psb binary
|
||||||
|
*.psd binary
|
||||||
|
*.svg text
|
||||||
|
*.svgz binary
|
||||||
|
*.tif binary
|
||||||
|
*.tiff binary
|
||||||
|
*.wbmp binary
|
||||||
|
*.webp binary
|
||||||
|
|
||||||
|
|
||||||
|
## ARCHIVES
|
||||||
|
*.7z binary
|
||||||
|
*.gz binary
|
||||||
|
*.jar binary
|
||||||
|
*.rar binary
|
||||||
|
*.tar binary
|
||||||
|
*.zip binary
|
||||||
|
|
||||||
|
## EXECUTABLES
|
||||||
|
*.exe binary
|
||||||
|
*.pyc binary
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
name: Bug report
|
||||||
|
description: Create a bug report to help us improve.
|
||||||
|
title: "Bug: "
|
||||||
|
body:
|
||||||
|
- type: textarea
|
||||||
|
id: current
|
||||||
|
attributes:
|
||||||
|
label: Current Behaviour
|
||||||
|
description: |
|
||||||
|
Description of the problem or issue here.
|
||||||
|
Include entries of affected creatures / items / quests / spells etc.
|
||||||
|
If this is a crash, post the crashlog (upload to https://gist.github.com/) and include the link here.
|
||||||
|
Never upload files! Use GIST for text and YouTube for videos!
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: expected
|
||||||
|
attributes:
|
||||||
|
label: Expected Behaviour
|
||||||
|
description: |
|
||||||
|
Tell us what should happen instead.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce the problem
|
||||||
|
description: |
|
||||||
|
What does someone else need to do to encounter the same bug?
|
||||||
|
placeholder: |
|
||||||
|
1. Step 1
|
||||||
|
2. Step 2
|
||||||
|
3. Step 3
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: extra
|
||||||
|
attributes:
|
||||||
|
label: Extra Notes
|
||||||
|
description: |
|
||||||
|
Do you have any extra notes that can help solve the issue that does not fit any other field?
|
||||||
|
placeholder: |
|
||||||
|
None
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
id: commit
|
||||||
|
attributes:
|
||||||
|
label: AC rev. hash/commit
|
||||||
|
description: |
|
||||||
|
Copy the result of the `.server debug` command (if you need to run it from the client get a prat addon)
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: os
|
||||||
|
attributes:
|
||||||
|
label: Operating system
|
||||||
|
description: |
|
||||||
|
The Operating System the Server is running on.
|
||||||
|
i.e. Windows 11 x64, Debian 10 x64, macOS 12, Ubuntu 20.04
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: custom
|
||||||
|
attributes:
|
||||||
|
label: Custom changes or Modules
|
||||||
|
description: |
|
||||||
|
List which custom changes or modules you have applied, i.e. Eluna module, etc.
|
||||||
|
placeholder: |
|
||||||
|
None
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
name: Feature request
|
||||||
|
description: Suggest an idea for this project
|
||||||
|
title: "Feature: "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thank you for taking your time to fill out a feature request. Remember to fill out all fields including the title above.
|
||||||
|
An issue that is not properly filled out will be closed.
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: Describe your feature request or suggestion in detail
|
||||||
|
description: |
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: solution
|
||||||
|
attributes:
|
||||||
|
label: Describe a possible solution to your feature or suggestion in detail
|
||||||
|
description: |
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
id: additional
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: |
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
+294
@@ -0,0 +1,294 @@
|
|||||||
|
#  AzerothCore
|
||||||
|
|
||||||
|
# mod-aoe-loot
|
||||||
|
|
||||||
|
[English](README.md) | [Español](README_ES.md)
|
||||||
|
|
||||||
|
[](https://github.com/azerothcore/mod-aoe-loot/actions)
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
This module enables Area of Effect (AOE) looting functionality for AzerothCore, allowing players to loot multiple nearby corpses by interacting with just one of them. All items and gold from corpses within the configured range are automatically collected into a single loot window.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **AOE Looting**: Automatically collect loot from multiple nearby corpses with a single interaction
|
||||||
|
- **Player Toggle Commands**: Individual players can enable/disable AOE loot using `.aoeloot on/off` commands
|
||||||
|
- **Multi-language Support**: Full internationalization support with English and Spanish translations (easily extensible to other languages)
|
||||||
|
- **Configurable Range**: Server administrators can set the maximum distance for AOE loot collection
|
||||||
|
- **Group Support**: Optional group looting with configurable settings
|
||||||
|
- **Performance Optimized**: Limits number of corpses processed to maintain server stability
|
||||||
|
- **Smart Item Management**:
|
||||||
|
- Automatic gold accumulation with overflow protection
|
||||||
|
- Quest items sent directly to inventory
|
||||||
|
- Maximum 15 items per loot window to prevent UI issues
|
||||||
|
- **Corpse Management**: Automatically cleans up looted corpses to reduce clutter
|
||||||
|
|
||||||
|
## Recent Updates
|
||||||
|
|
||||||
|
### v2.0 - Player Control & Internationalization
|
||||||
|
- ✅ Added `.aoeloot on/off` player commands for individual control
|
||||||
|
- ✅ Implemented multi-language support via `acore_string` system
|
||||||
|
- ✅ Fixed enum ID alignment issues
|
||||||
|
- ✅ Complete English and Spanish translations
|
||||||
|
- ✅ Improved code documentation and structure
|
||||||
|
|
||||||
|
### v1.x - Core Functionality
|
||||||
|
- Initial AOE loot implementation
|
||||||
|
- Configuration system
|
||||||
|
- Range and group settings
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- AzerothCore v3.0.0+ (latest master branch recommended)
|
||||||
|
- MySQL 8.0+
|
||||||
|
- Compiler with C++17 support
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### 1. Clone the Module
|
||||||
|
|
||||||
|
Navigate to your AzerothCore modules directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <ACoreDir>/modules
|
||||||
|
git clone https://github.com/azerothcore/mod-aoe-loot.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Compile
|
||||||
|
|
||||||
|
Re-compile AzerothCore:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <ACoreDir>/build
|
||||||
|
cmake ../ -DCMAKE_INSTALL_PREFIX=/path/to/server -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++
|
||||||
|
make -j $(nproc)
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Configure
|
||||||
|
|
||||||
|
Edit your `worldserver.conf` file (or create `AOELoot.conf` in configs folder):
|
||||||
|
|
||||||
|
```conf
|
||||||
|
###################################################################################################
|
||||||
|
# AOE LOOT MODULE CONFIGURATION
|
||||||
|
###################################################################################################
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Enable
|
||||||
|
# Description: Enable or disable the AOE Loot module globally
|
||||||
|
# Default: 1 (enabled)
|
||||||
|
# 0 (disabled)
|
||||||
|
|
||||||
|
AOELoot.Enable = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Range
|
||||||
|
# Description: Maximum distance (in yards) to collect loot from nearby corpses
|
||||||
|
# Default: 55.0
|
||||||
|
# Range: 5.0 - 100.0
|
||||||
|
|
||||||
|
AOELoot.Range = 55.0
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Group
|
||||||
|
# Description: Allow AOE looting when player is in a group
|
||||||
|
# Default: 1 (allowed)
|
||||||
|
# 0 (not allowed)
|
||||||
|
|
||||||
|
AOELoot.Group = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Message
|
||||||
|
# Description: Show informational message on player login
|
||||||
|
# Default: 1 (show message)
|
||||||
|
# 0 (no message)
|
||||||
|
|
||||||
|
AOELoot.Message = 1
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Corpse Decay Configuration (IMPORTANT)
|
||||||
|
|
||||||
|
For optimal experience, modify the corpse decay settings in `worldserver.conf`:
|
||||||
|
|
||||||
|
```conf
|
||||||
|
#
|
||||||
|
# Rate.Corpse.Decay.Looted
|
||||||
|
# Description: Multiplier for Corpse.Decay.* to configure how long creature corpses stay
|
||||||
|
# after they have been looted.
|
||||||
|
# Default: 0.5
|
||||||
|
# Recommended: 0.01 (for AOE Loot module)
|
||||||
|
|
||||||
|
Rate.Corpse.Decay.Looted = 0.01
|
||||||
|
```
|
||||||
|
|
||||||
|
**Why this is important:** The default decay rate (0.5) can cause corpses to linger after being looted via AOE, creating visual clutter. Setting this to 0.01 ensures corpses disappear quickly after looting.
|
||||||
|
|
||||||
|
### 5. Restart Server
|
||||||
|
|
||||||
|
Restart your worldserver to load the module:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./worldserver
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### For Players
|
||||||
|
|
||||||
|
#### Commands
|
||||||
|
- `.aoeloot on` - Enable AOE looting for your character
|
||||||
|
- `.aoeloot off` - Disable AOE looting for your character
|
||||||
|
|
||||||
|
#### How to Use
|
||||||
|
1. Kill multiple enemies in close proximity
|
||||||
|
2. Right-click on any corpse to loot
|
||||||
|
3. All items from nearby corpses will appear in a single loot window
|
||||||
|
4. Quest items are automatically added to your inventory
|
||||||
|
|
||||||
|
**Note:** Player preferences reset on logout. AOE loot is enabled by default if the module is active.
|
||||||
|
|
||||||
|
### For Administrators
|
||||||
|
|
||||||
|
The module can be controlled through configuration file settings (see Configuration section above).
|
||||||
|
|
||||||
|
## Configuration Options
|
||||||
|
|
||||||
|
| Option | Type | Default | Description |
|
||||||
|
|--------|------|---------|-------------|
|
||||||
|
| `AOELoot.Enable` | Boolean | 1 | Enable/disable module globally |
|
||||||
|
| `AOELoot.Range` | Float | 55.0 | Maximum loot collection radius (5.0 - 100.0) |
|
||||||
|
| `AOELoot.Group` | Boolean | 1 | Allow AOE loot in groups |
|
||||||
|
| `AOELoot.Message` | Boolean | 1 | Show login message |
|
||||||
|
|
||||||
|
## Multi-language Support
|
||||||
|
|
||||||
|
The module includes full multi-language support through AzerothCore's `acore_string` system.
|
||||||
|
|
||||||
|
### Currently Supported Languages
|
||||||
|
- 🇬🇧 English (en_US)
|
||||||
|
- 🇪🇸 Spanish (es_ES / es_MX)
|
||||||
|
|
||||||
|
### Adding More Languages
|
||||||
|
|
||||||
|
To add additional language support, update the SQL file:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
UPDATE `acore_string` SET
|
||||||
|
`locale_frFR` = 'Votre traduction ici',
|
||||||
|
`locale_deDE` = 'Ihre Übersetzung hier',
|
||||||
|
`locale_ruRU` = 'Ваш перевод здесь'
|
||||||
|
WHERE `entry` BETWEEN 50000 AND 50007;
|
||||||
|
```
|
||||||
|
|
||||||
|
Supported locale columns:
|
||||||
|
- `locale_koKR` (Korean)
|
||||||
|
- `locale_frFR` (French)
|
||||||
|
- `locale_deDE` (German)
|
||||||
|
- `locale_zhCN` (Chinese Simplified)
|
||||||
|
- `locale_zhTW` (Chinese Traditional)
|
||||||
|
- `locale_ruRU` (Russian)
|
||||||
|
|
||||||
|
## Technical Details
|
||||||
|
|
||||||
|
### Database Entries
|
||||||
|
|
||||||
|
The module uses `acore_string` entries 50000-50007:
|
||||||
|
|
||||||
|
| Entry | Constant | Purpose |
|
||||||
|
|-------|----------|---------|
|
||||||
|
| 50000 | AOE_ACORE_STRING_MESSAGE | Login message |
|
||||||
|
| 50001 | AOE_ITEM_IN_THE_MAIL | Mail notification (reserved) |
|
||||||
|
| 50002-50003 | - | Reserved for future use |
|
||||||
|
| 50004 | AOE_LOOT_ALREADY_ENABLED | "Already enabled" message |
|
||||||
|
| 50005 | AOE_LOOT_ENABLED | "Enabled" confirmation |
|
||||||
|
| 50006 | AOE_LOOT_ALREADY_DISABLED | "Already disabled" message |
|
||||||
|
| 50007 | AOE_LOOT_DISABLED | "Disabled" confirmation |
|
||||||
|
|
||||||
|
### Performance Considerations
|
||||||
|
|
||||||
|
- Maximum 10 corpses processed per loot operation (hardcoded for stability)
|
||||||
|
- Maximum 15 items per loot window
|
||||||
|
- Gold overflow protection (prevents exceeding uint32 max value)
|
||||||
|
- Efficient corpse filtering and cleanup
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Issue: AOE loot not working
|
||||||
|
|
||||||
|
**Solutions:**
|
||||||
|
- Verify module is enabled: `AOELoot.Enable = 1`
|
||||||
|
- Check if you disabled it personally: use `.aoeloot on`
|
||||||
|
- Ensure you're within range (default 55 yards)
|
||||||
|
- If in group, check `AOELoot.Group` setting
|
||||||
|
|
||||||
|
### Issue: Corpses not disappearing
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
- Set `Rate.Corpse.Decay.Looted = 0.01` in worldserver.conf
|
||||||
|
|
||||||
|
### Issue: Messages in wrong language
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
- Verify SQL was imported correctly
|
||||||
|
- Check client locale settings
|
||||||
|
- Confirm `acore_string` table has translations for your locale
|
||||||
|
|
||||||
|
### Issue: "Already enabled/disabled" messages appearing incorrectly
|
||||||
|
|
||||||
|
**Solution:**
|
||||||
|
- This is expected behavior - preferences reset on logout
|
||||||
|
- On first login, AOE loot is enabled by default
|
||||||
|
|
||||||
|
## Known Limitations
|
||||||
|
|
||||||
|
- Player preferences do not persist across logout/login sessions
|
||||||
|
- Maximum 10 corpses processed at once (performance limit)
|
||||||
|
- Quest items sent to inventory may fill bags quickly
|
||||||
|
- Range limited to 100 yards maximum
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
|
||||||
|
Potential features for future versions:
|
||||||
|
- [ ] Database persistence for player preferences
|
||||||
|
- [ ] Configurable max corpses limit
|
||||||
|
- [ ] Quest item mail option (instead of direct inventory)
|
||||||
|
- [ ] Visual range indicator
|
||||||
|
- [ ] Per-character settings UI
|
||||||
|
- [ ] Statistics tracking (total items/gold looted)
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
- **acidmanifesto** - [Original author and concept](https://github.com/azerothcore/mod-aoe-loot/pull/2)
|
||||||
|
- **AzerothCore Community** - Hooks, updates, and improvements
|
||||||
|
- **Contributors** - Player commands, multi-language support, and bug fixes
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
- **AzerothCore:** [Repository](https://github.com/azerothcore) | [Website](https://azerothcore.org/) | [Discord](https://discord.gg/PaqQRkd)
|
||||||
|
- **Module Repository:** [GitHub](https://github.com/azerothcore/mod-aoe-loot)
|
||||||
|
- **Issues & Suggestions:** [Issue Tracker](https://github.com/azerothcore/mod-aoe-loot/issues)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This module is released under the [GNU AGPL v3 License](https://github.com/azerothcore/mod-aoe-loot/blob/master/LICENSE).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Support
|
||||||
|
|
||||||
|
If you encounter any issues or have suggestions:
|
||||||
|
1. Check the [Troubleshooting](#troubleshooting) section
|
||||||
|
2. Search [existing issues](https://github.com/azerothcore/mod-aoe-loot/issues)
|
||||||
|
3. Join the [AzerothCore Discord](https://discord.gg/PaqQRkd)
|
||||||
|
4. Create a [new issue](https://github.com/azerothcore/mod-aoe-loot/issues/new) with detailed information
|
||||||
|
|
||||||
|
**Please include:**
|
||||||
|
- AzerothCore commit hash
|
||||||
|
- Operating system and version
|
||||||
|
- Complete error messages (if any)
|
||||||
|
- Configuration settings
|
||||||
|
- Steps to reproduce the issue
|
||||||
+293
@@ -0,0 +1,293 @@
|
|||||||
|
#  AzerothCore
|
||||||
|
|
||||||
|
# mod-aoe-loot
|
||||||
|
|
||||||
|
[English](README.md) | [Español](README_ES.md)
|
||||||
|
|
||||||
|
[](https://github.com/azerothcore/mod-aoe-loot/actions)
|
||||||
|
|
||||||
|
## Descripción
|
||||||
|
|
||||||
|
Este módulo habilita la funcionalidad de saqueo en área (AOE) para AzerothCore, permitiendo a los jugadores saquear múltiples cadáveres cercanos interactuando con solo uno de ellos. Todos los objetos y oro de los cadáveres dentro del rango configurado se recopilan automáticamente en una sola ventana de botín.
|
||||||
|
|
||||||
|
## Características
|
||||||
|
|
||||||
|
- **Saqueo AOE**: Recolecta automáticamente el botín de múltiples cadáveres cercanos con una sola interacción
|
||||||
|
- **Comandos de Activación Individual**: Los jugadores pueden activar/desactivar el saqueo AOE usando los comandos `.aoeloot on/off`
|
||||||
|
- **Soporte Multi-idioma**: Internacionalización completa con traducciones en inglés y español (fácilmente extensible a otros idiomas)
|
||||||
|
- **Rango Configurable**: Los administradores del servidor pueden establecer la distancia máxima para la recolección de botín AOE
|
||||||
|
- **Soporte de Grupo**: Saqueo en grupo opcional con configuración personalizable
|
||||||
|
- **Optimizado para Rendimiento**: Limita el número de cadáveres procesados para mantener la estabilidad del servidor
|
||||||
|
- **Gestión Inteligente de Objetos**:
|
||||||
|
- Acumulación automática de oro con protección contra desbordamiento
|
||||||
|
- Objetos de misión enviados directamente al inventario
|
||||||
|
- Máximo de 15 objetos por ventana de botín para evitar problemas de interfaz
|
||||||
|
- **Gestión de Cadáveres**: Limpia automáticamente los cadáveres saqueados para reducir el desorden visual
|
||||||
|
|
||||||
|
## Actualizaciones Recientes
|
||||||
|
|
||||||
|
### v2.0 - Control del Jugador e Internacionalización
|
||||||
|
- ✅ Agregados comandos `.aoeloot on/off` para control individual del jugador
|
||||||
|
- ✅ Implementado soporte multi-idioma mediante el sistema `acore_string`
|
||||||
|
- ✅ Corregidos problemas de alineación de IDs en enums
|
||||||
|
- ✅ Traducciones completas en inglés y español
|
||||||
|
- ✅ Mejorada la documentación y estructura del código
|
||||||
|
|
||||||
|
### v1.x - Funcionalidad Principal
|
||||||
|
- Implementación inicial del saqueo AOE
|
||||||
|
- Sistema de configuración
|
||||||
|
- Ajustes de rango y grupo
|
||||||
|
|
||||||
|
## Requisitos
|
||||||
|
|
||||||
|
- AzerothCore v3.0.0+ (se recomienda la última rama master)
|
||||||
|
- MySQL 8.0+
|
||||||
|
- Compilador con soporte para C++17
|
||||||
|
|
||||||
|
## Instalación
|
||||||
|
|
||||||
|
### 1. Clonar el Módulo
|
||||||
|
|
||||||
|
Navega al directorio de módulos de AzerothCore:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <DirectorioACore>/modules
|
||||||
|
git clone https://github.com/azerothcore/mod-aoe-loot.git
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Compilar
|
||||||
|
|
||||||
|
Recompila AzerothCore:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd <DirectorioACore>/build
|
||||||
|
cmake ../ -DCMAKE_INSTALL_PREFIX=/ruta/al/servidor -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++
|
||||||
|
make -j $(nproc)
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Configurar
|
||||||
|
|
||||||
|
Edita tu archivo `worldserver.conf` (o crea `AOELoot.conf` en la carpeta de configuraciones):
|
||||||
|
|
||||||
|
```conf
|
||||||
|
###################################################################################################
|
||||||
|
# CONFIGURACIÓN DEL MÓDULO AOE LOOT
|
||||||
|
###################################################################################################
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Enable
|
||||||
|
# Descripción: Habilita o deshabilita el módulo AOE Loot globalmente
|
||||||
|
# Por defecto: 1 (habilitado)
|
||||||
|
# 0 (deshabilitado)
|
||||||
|
|
||||||
|
AOELoot.Enable = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Range
|
||||||
|
# Descripción: Distancia máxima (en yardas) para recolectar botín de cadáveres cercanos
|
||||||
|
# Por defecto: 55.0
|
||||||
|
# Rango: 5.0 - 100.0
|
||||||
|
|
||||||
|
AOELoot.Range = 55.0
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Group
|
||||||
|
# Descripción: Permitir saqueo AOE cuando el jugador está en un grupo
|
||||||
|
# Por defecto: 1 (permitido)
|
||||||
|
# 0 (no permitido)
|
||||||
|
|
||||||
|
AOELoot.Group = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Message
|
||||||
|
# Descripción: Mostrar mensaje informativo al iniciar sesión
|
||||||
|
# Por defecto: 1 (mostrar mensaje)
|
||||||
|
# 0 (sin mensaje)
|
||||||
|
|
||||||
|
AOELoot.Message = 1
|
||||||
|
|
||||||
|
###################################################################################################
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Configuración de Degradación de Cadáveres (IMPORTANTE)
|
||||||
|
|
||||||
|
Para una experiencia óptima, modifica la configuración de degradación de cadáveres en `worldserver.conf`:
|
||||||
|
|
||||||
|
```conf
|
||||||
|
#
|
||||||
|
# Rate.Corpse.Decay.Looted
|
||||||
|
# Descripción: Multiplicador para Corpse.Decay.* que configura cuánto tiempo permanecen
|
||||||
|
# los cadáveres de las criaturas después de ser saqueados.
|
||||||
|
# Por defecto: 0.5
|
||||||
|
# Recomendado: 0.01 (para el módulo AOE Loot)
|
||||||
|
|
||||||
|
Rate.Corpse.Decay.Looted = 0.01
|
||||||
|
```
|
||||||
|
|
||||||
|
**Por qué es importante:** La tasa de degradación predeterminada (0.5) puede hacer que los cadáveres permanezcan después de ser saqueados mediante AOE, creando desorden visual. Establecer esto en 0.01 asegura que los cadáveres desaparezcan rápidamente después del saqueo.
|
||||||
|
|
||||||
|
### 5. Reiniciar el Servidor
|
||||||
|
|
||||||
|
Reinicia tu worldserver para cargar el módulo:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./worldserver
|
||||||
|
```
|
||||||
|
|
||||||
|
## Uso
|
||||||
|
|
||||||
|
### Para Jugadores
|
||||||
|
|
||||||
|
#### Comandos
|
||||||
|
- `.aoeloot on` - Activar el saqueo AOE para tu personaje
|
||||||
|
- `.aoeloot off` - Desactivar el saqueo AOE para tu personaje
|
||||||
|
|
||||||
|
#### Cómo Usar
|
||||||
|
1. Mata múltiples enemigos en proximidad cercana
|
||||||
|
2. Haz clic derecho en cualquier cadáver para saquear
|
||||||
|
3. Todos los objetos de los cadáveres cercanos aparecerán en una sola ventana de botín
|
||||||
|
4. Los objetos de misión se agregan automáticamente a tu inventario
|
||||||
|
|
||||||
|
**Nota:** Las preferencias del jugador se restablecen al cerrar sesión. El saqueo AOE está habilitado por defecto si el módulo está activo.
|
||||||
|
|
||||||
|
### Para Administradores
|
||||||
|
|
||||||
|
El módulo puede controlarse a través de la configuración del archivo (ver sección de Configuración arriba).
|
||||||
|
|
||||||
|
## Opciones de Configuración
|
||||||
|
|
||||||
|
| Opción | Tipo | Por Defecto | Descripción |
|
||||||
|
|--------|------|-------------|-------------|
|
||||||
|
| `AOELoot.Enable` | Booleano | 1 | Habilitar/deshabilitar módulo globalmente |
|
||||||
|
| `AOELoot.Range` | Decimal | 55.0 | Radio máximo de recolección de botín (5.0 - 100.0) |
|
||||||
|
| `AOELoot.Group` | Booleano | 1 | Permitir saqueo AOE en grupos |
|
||||||
|
| `AOELoot.Message` | Booleano | 1 | Mostrar mensaje de inicio de sesión |
|
||||||
|
|
||||||
|
## Soporte Multi-idioma
|
||||||
|
|
||||||
|
El módulo incluye soporte completo multi-idioma a través del sistema `acore_string` de AzerothCore.
|
||||||
|
|
||||||
|
### Idiomas Actualmente Soportados
|
||||||
|
- 🇬🇧 Inglés (en_US)
|
||||||
|
- 🇪🇸 Español (es_ES / es_MX)
|
||||||
|
|
||||||
|
### Agregar Más Idiomas
|
||||||
|
|
||||||
|
Para agregar soporte de idiomas adicionales, actualiza el archivo SQL:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
UPDATE `acore_string` SET
|
||||||
|
`locale_frFR` = 'Votre traduction ici',
|
||||||
|
`locale_deDE` = 'Ihre Übersetzung hier',
|
||||||
|
`locale_ruRU` = 'Ваш перевод здесь'
|
||||||
|
WHERE `entry` BETWEEN 50000 AND 50007;
|
||||||
|
```
|
||||||
|
|
||||||
|
Columnas de localización soportadas:
|
||||||
|
- `locale_koKR` (Coreano)
|
||||||
|
- `locale_frFR` (Francés)
|
||||||
|
- `locale_deDE` (Alemán)
|
||||||
|
- `locale_zhCN` (Chino Simplificado)
|
||||||
|
- `locale_zhTW` (Chino Tradicional)
|
||||||
|
- `locale_ruRU` (Ruso)
|
||||||
|
|
||||||
|
## Detalles Técnicos
|
||||||
|
|
||||||
|
### Entradas de Base de Datos
|
||||||
|
|
||||||
|
El módulo utiliza las entradas `acore_string` 50000-50007:
|
||||||
|
|
||||||
|
| Entrada | Constante | Propósito |
|
||||||
|
|---------|-----------|-----------|
|
||||||
|
| 50000 | AOE_ACORE_STRING_MESSAGE | Mensaje de inicio de sesión |
|
||||||
|
| 50001 | AOE_ITEM_IN_THE_MAIL | Notificación de correo (reservado) |
|
||||||
|
| 50002-50003 | - | Reservado para uso futuro |
|
||||||
|
| 50004 | AOE_LOOT_ALREADY_ENABLED | Mensaje "Ya activado" |
|
||||||
|
| 50005 | AOE_LOOT_ENABLED | Confirmación "Activado" |
|
||||||
|
| 50006 | AOE_LOOT_ALREADY_DISABLED | Mensaje "Ya desactivado" |
|
||||||
|
| 50007 | AOE_LOOT_DISABLED | Confirmación "Desactivado" |
|
||||||
|
|
||||||
|
### Consideraciones de Rendimiento
|
||||||
|
|
||||||
|
- Máximo 10 cadáveres procesados por operación de saqueo (fijo para estabilidad)
|
||||||
|
- Máximo 15 objetos por ventana de botín
|
||||||
|
- Protección contra desbordamiento de oro (previene exceder el valor máximo uint32)
|
||||||
|
- Filtrado y limpieza eficiente de cadáveres
|
||||||
|
|
||||||
|
## Solución de Problemas
|
||||||
|
|
||||||
|
### Problema: El saqueo AOE no funciona
|
||||||
|
|
||||||
|
**Soluciones:**
|
||||||
|
- Verifica que el módulo esté habilitado: `AOELoot.Enable = 1`
|
||||||
|
- Comprueba si lo desactivaste personalmente: usa `.aoeloot on`
|
||||||
|
- Asegúrate de estar dentro del rango (55 yardas por defecto)
|
||||||
|
- Si estás en grupo, verifica la configuración `AOELoot.Group`
|
||||||
|
|
||||||
|
### Problema: Los cadáveres no desaparecen
|
||||||
|
**Solución:**
|
||||||
|
- Establece `Rate.Corpse.Decay.Looted = 0.01` en worldserver.conf
|
||||||
|
|
||||||
|
### Problema: Mensajes en idioma incorrecto
|
||||||
|
|
||||||
|
**Solución:**
|
||||||
|
- Verifica que el SQL se importó correctamente
|
||||||
|
- Comprueba la configuración de localización del cliente
|
||||||
|
- Confirma que la tabla `acore_string` tiene traducciones para tu localización
|
||||||
|
|
||||||
|
### Problema: Mensajes "Ya activado/desactivado" aparecen incorrectamente
|
||||||
|
|
||||||
|
**Solución:**
|
||||||
|
- Este es el comportamiento esperado - las preferencias se restablecen al cerrar sesión
|
||||||
|
- En el primer inicio de sesión, el saqueo AOE está habilitado por defecto
|
||||||
|
|
||||||
|
## Limitaciones Conocidas
|
||||||
|
|
||||||
|
- Las preferencias del jugador no persisten entre sesiones de inicio/cierre de sesión
|
||||||
|
- Máximo 10 cadáveres procesados a la vez (límite de rendimiento)
|
||||||
|
- Los objetos de misión enviados al inventario pueden llenar las bolsas rápidamente
|
||||||
|
- Rango limitado a un máximo de 100 yardas
|
||||||
|
|
||||||
|
## Mejoras Futuras
|
||||||
|
|
||||||
|
Características potenciales para versiones futuras:
|
||||||
|
- [ ] Persistencia en base de datos para preferencias del jugador
|
||||||
|
- [ ] Límite configurable de cadáveres máximos
|
||||||
|
- [ ] Opción de envío de objetos de misión por correo (en lugar de inventario directo)
|
||||||
|
- [ ] Indicador visual de rango
|
||||||
|
- [ ] Interfaz de configuración por personaje
|
||||||
|
- [ ] Seguimiento de estadísticas (objetos/oro total saqueado)
|
||||||
|
|
||||||
|
## Créditos
|
||||||
|
|
||||||
|
- **acidmanifesto** - [Autor original y concepto](https://github.com/azerothcore/mod-aoe-loot/pull/2)
|
||||||
|
- **Comunidad AzerothCore** - Hooks, actualizaciones y mejoras
|
||||||
|
- **Colaboradores** - Comandos de jugador, soporte multi-idioma y correcciones de errores
|
||||||
|
|
||||||
|
## Enlaces
|
||||||
|
|
||||||
|
- **AzerothCore:** [Repositorio](https://github.com/azerothcore) | [Sitio Web](https://azerothcore.org/) | [Discord](https://discord.gg/PaqQRkd)
|
||||||
|
- **Repositorio del Módulo:** [GitHub](https://github.com/azerothcore/mod-aoe-loot)
|
||||||
|
- **Problemas y Sugerencias:** [Rastreador de Problemas](https://github.com/azerothcore/mod-aoe-loot/issues)
|
||||||
|
|
||||||
|
## Licencia
|
||||||
|
|
||||||
|
Este módulo se publica bajo la [Licencia GNU AGPL v3](https://github.com/azerothcore/mod-aoe-loot/blob/master/LICENSE).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Soporte
|
||||||
|
|
||||||
|
Si encuentras algún problema o tienes sugerencias:
|
||||||
|
1. Consulta la sección [Solución de Problemas](#solución-de-problemas)
|
||||||
|
2. Busca en [problemas existentes](https://github.com/azerothcore/mod-aoe-loot/issues)
|
||||||
|
3. Únete al [Discord de AzerothCore](https://discord.gg/PaqQRkd)
|
||||||
|
4. Crea un [nuevo problema](https://github.com/azerothcore/mod-aoe-loot/issues/new) con información detallada
|
||||||
|
|
||||||
|
**Por favor incluye:**
|
||||||
|
- Hash del commit de AzerothCore
|
||||||
|
- Sistema operativo y versión
|
||||||
|
- Mensajes de error completos (si los hay)
|
||||||
|
- Configuraciones utilizadas
|
||||||
|
- Pasos para reproducir el problema
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
name: core-build
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
uses: azerothcore/reusable-workflows/.github/workflows/core_build_modules.yml@main
|
||||||
|
with:
|
||||||
|
module_repo: ${{ github.event.repository.name }}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
!.gitignore
|
||||||
|
|
||||||
|
#
|
||||||
|
#Generic
|
||||||
|
#
|
||||||
|
.directory
|
||||||
|
.mailmap
|
||||||
|
* .orig
|
||||||
|
* .rej
|
||||||
|
* .*~
|
||||||
|
.hg /
|
||||||
|
*.kdev *
|
||||||
|
.DS_Store
|
||||||
|
CMakeLists.txt.user
|
||||||
|
* .bak
|
||||||
|
* .patch
|
||||||
|
* .diff
|
||||||
|
* .REMOTE.*
|
||||||
|
* .BACKUP.*
|
||||||
|
* .BASE.*
|
||||||
|
* .LOCAL.*
|
||||||
|
|
||||||
|
#
|
||||||
|
# IDE & other softwares
|
||||||
|
#
|
||||||
|
/ .settings/
|
||||||
|
/.externalToolBuilders/*
|
||||||
|
# exclude in all levels
|
||||||
|
nbproject/
|
||||||
|
.sync.ffs_db
|
||||||
|
*.kate-swp
|
||||||
|
|
||||||
|
#
|
||||||
|
# Eclipse
|
||||||
|
#
|
||||||
|
*.pydevproject
|
||||||
|
.metadata
|
||||||
|
.gradle
|
||||||
|
tmp/
|
||||||
|
*.tmp
|
||||||
|
*.swp
|
||||||
|
*~.nib
|
||||||
|
local.properties
|
||||||
|
.settings/
|
||||||
|
.loadpath
|
||||||
|
.project
|
||||||
|
.cproject
|
||||||
@@ -0,0 +1,661 @@
|
|||||||
|
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 19 November 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU Affero General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works, specifically designed to ensure
|
||||||
|
cooperation with the community in the case of network server software.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
our General Public Licenses are intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
Developers that use our General Public Licenses protect your rights
|
||||||
|
with two steps: (1) assert copyright on the software, and (2) offer
|
||||||
|
you this License which gives you legal permission to copy, distribute
|
||||||
|
and/or modify the software.
|
||||||
|
|
||||||
|
A secondary benefit of defending all users' freedom is that
|
||||||
|
improvements made in alternate versions of the program, if they
|
||||||
|
receive widespread use, become available for other developers to
|
||||||
|
incorporate. Many developers of free software are heartened and
|
||||||
|
encouraged by the resulting cooperation. However, in the case of
|
||||||
|
software used on network servers, this result may fail to come about.
|
||||||
|
The GNU General Public License permits making a modified version and
|
||||||
|
letting the public access it on a server without ever releasing its
|
||||||
|
source code to the public.
|
||||||
|
|
||||||
|
The GNU Affero General Public License is designed specifically to
|
||||||
|
ensure that, in such cases, the modified source code becomes available
|
||||||
|
to the community. It requires the operator of a network server to
|
||||||
|
provide the source code of the modified version running there to the
|
||||||
|
users of that server. Therefore, public use of a modified version, on
|
||||||
|
a publicly accessible server, gives the public access to the source
|
||||||
|
code of the modified version.
|
||||||
|
|
||||||
|
An older license, called the Affero General Public License and
|
||||||
|
published by Affero, was designed to accomplish similar goals. This is
|
||||||
|
a different license, not a version of the Affero GPL, but Affero has
|
||||||
|
released a new version of the Affero GPL which permits relicensing under
|
||||||
|
this license.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, if you modify the
|
||||||
|
Program, your modified version must prominently offer all users
|
||||||
|
interacting with it remotely through a computer network (if your version
|
||||||
|
supports such interaction) an opportunity to receive the Corresponding
|
||||||
|
Source of your version by providing access to the Corresponding Source
|
||||||
|
from a network server at no charge, through some standard or customary
|
||||||
|
means of facilitating copying of software. This Corresponding Source
|
||||||
|
shall include the Corresponding Source for any work covered by version 3
|
||||||
|
of the GNU General Public License that is incorporated pursuant to the
|
||||||
|
following paragraph.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the work with which it is combined will remain governed by version
|
||||||
|
3 of the GNU General Public License.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU Affero General Public License from time to time. Such new versions
|
||||||
|
will be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU Affero General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU Affero General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU Affero General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published
|
||||||
|
by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If your software can interact with users remotely through a computer
|
||||||
|
network, you should also make sure that it provides a way for users to
|
||||||
|
get its source. For example, if your program is a web application, its
|
||||||
|
interface could display a "Source" link that leads users to an archive
|
||||||
|
of the code. There are many ways you could offer source, and different
|
||||||
|
solutions will be better for different programs; see section 13 for the
|
||||||
|
specific requirements.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
#
|
||||||
|
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||||
|
#
|
||||||
|
# This file is free software; as a special exception the author gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
#
|
||||||
|
# User has manually chosen to ignore the git-tests, so throw them a warning.
|
||||||
|
# This is done EACH compile so they can be alerted about the consequences.
|
||||||
|
#
|
||||||
|
|
||||||
|
########################################
|
||||||
|
# AoeLoot module configuration
|
||||||
|
# Fractured: stock defaults; no class-specific logic in this module.
|
||||||
|
########################################
|
||||||
|
#
|
||||||
|
# AOELoot.Enable
|
||||||
|
# Description: Enables Module
|
||||||
|
# Default: 1 - (Enabled)
|
||||||
|
# 0 - (Disabled)
|
||||||
|
#
|
||||||
|
|
||||||
|
AOELoot.Enable = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Message
|
||||||
|
# Description: Enables area loot if the player is in a group
|
||||||
|
# Default: 1 - (Enabled)
|
||||||
|
# 0 - (Disabled)
|
||||||
|
#
|
||||||
|
|
||||||
|
AOELoot.Message = 1
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Range
|
||||||
|
# Description: Maximum reach range search loot.
|
||||||
|
# Default: 55.0
|
||||||
|
# Range: 5.0 - 100.0
|
||||||
|
#
|
||||||
|
|
||||||
|
AOELoot.Range = 55.0
|
||||||
|
|
||||||
|
#
|
||||||
|
# AOELoot.Group
|
||||||
|
# Description: Enables area loot if the player is in a group
|
||||||
|
# Default: 1 - (Enabled)
|
||||||
|
# 0 - (Disabled)
|
||||||
|
#
|
||||||
|
|
||||||
|
AOELoot.Group = 1
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
SET @MODULE_STRING := 'mod-aoe-loot';
|
||||||
|
|
||||||
|
-- module string
|
||||||
|
DELETE FROM `module_string` WHERE `module` = @MODULE_STRING;
|
||||||
|
INSERT INTO `module_string` (`module`, `id`, `string`) VALUES
|
||||||
|
(@MODULE_STRING, 1, 'This server is running the |cff4CFF00Loot aoe|r module.'),
|
||||||
|
(@MODULE_STRING, 2, '|cff4CFF00[Loot aoe]|r Your items has been mailed to you.'),
|
||||||
|
(@MODULE_STRING, 3, 'AOE Loot module is active. Use .aoeloot on/off to toggle it.'),
|
||||||
|
(@MODULE_STRING, 4, 'AOE Loot: Quest item sent to your mailbox.'),
|
||||||
|
(@MODULE_STRING, 5, 'AOE Loot is already enabled for your character.'),
|
||||||
|
(@MODULE_STRING, 6, 'AOE Loot enabled for your character. Type .aoeloot off to disable it.'),
|
||||||
|
(@MODULE_STRING, 7, 'AOE Loot is already disabled for your character.'),
|
||||||
|
(@MODULE_STRING, 8, 'AOE Loot disabled for your character. Type .aoeloot on to enable it.');
|
||||||
|
|
||||||
|
-- localizations
|
||||||
|
DELETE FROM `module_string_locale` WHERE `module` = @MODULE_STRING;
|
||||||
|
INSERT INTO `module_string_locale` (`module`, `id`, `locale`, `string`) VALUES
|
||||||
|
(@MODULE_STRING, 1, 'esES', 'Este servidor está ejecutando el módulo |cff4CFF00Loot aoe|r.'),
|
||||||
|
(@MODULE_STRING, 2, 'esES', '|cff4CFF00[Loot aoe]|r Sus artículos le han sido enviados por correo.'),
|
||||||
|
(@MODULE_STRING, 3, 'esES', 'El módulo de Botín AOE está activo. Usa .aoeloot on/off para activarlo o desactivarlo.'),
|
||||||
|
(@MODULE_STRING, 4, 'esES', 'Botín AOE: Objeto de misión enviado a tu buzón.'),
|
||||||
|
(@MODULE_STRING, 5, 'esES', 'El Botín AOE ya está activado para tu personaje.'),
|
||||||
|
(@MODULE_STRING, 6, 'esES', 'Botín AOE activado para tu personaje. Escribe .aoeloot off para desactivarlo.'),
|
||||||
|
(@MODULE_STRING, 7, 'esES', 'El Botín AOE ya está desactivado para tu personaje.'),
|
||||||
|
(@MODULE_STRING, 8, 'esES', 'Botín AOE desactivado para tu personaje. Escribe .aoeloot on para activarlo.'),
|
||||||
|
(@MODULE_STRING, 1, 'esMX', 'Este servidor está ejecutando el módulo |cff4CFF00Loot aoe|r.'),
|
||||||
|
(@MODULE_STRING, 2, 'esMX', '|cff4CFF00[Loot aoe]|r Sus artículos le han sido enviados por correo.'),
|
||||||
|
(@MODULE_STRING, 3, 'esMX', 'El módulo de Botín AOE está activo. Usa .aoeloot on/off para activarlo o desactivarlo.'),
|
||||||
|
(@MODULE_STRING, 4, 'esMX', 'Botín AOE: Objeto de misión enviado a tu buzón.'),
|
||||||
|
(@MODULE_STRING, 5, 'esMX', 'El Botín AOE ya está activado para tu personaje.'),
|
||||||
|
(@MODULE_STRING, 6, 'esMX', 'Botín AOE activado para tu personaje. Escribe .aoeloot off para desactivarlo.'),
|
||||||
|
(@MODULE_STRING, 7, 'esMX', 'El Botín AOE ya está desactivado para tu personaje.'),
|
||||||
|
(@MODULE_STRING, 8, 'esMX', 'Botín AOE desactivado para tu personaje. Escribe .aoeloot on para activarlo.');
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<!-- First of all, THANK YOU for your contribution. -->
|
||||||
|
|
||||||
|
## Changes Proposed:
|
||||||
|
-
|
||||||
|
-
|
||||||
|
|
||||||
|
## Issues Addressed:
|
||||||
|
<!-- If your fix has a relating issue, link it below -->
|
||||||
|
- Closes
|
||||||
|
|
||||||
|
## SOURCE:
|
||||||
|
<!-- If you can, include a source that can strengthen your claim -->
|
||||||
|
|
||||||
|
## Tests Performed:
|
||||||
|
<!-- Does it build without errors? Did you test in-game? What did you test? On which OS did you test? Describe any other tests performed -->
|
||||||
|
-
|
||||||
|
-
|
||||||
|
|
||||||
|
|
||||||
|
## How to Test the Changes:
|
||||||
|
<!-- Describe in a detailed step-by-step order how to test the changes -->
|
||||||
|
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
@@ -0,0 +1,321 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "aoe_loot.h"
|
||||||
|
#include "ObjectMgr.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
std::map<uint64, bool> AoeLootCommandScript::playerAoeLootEnabled;
|
||||||
|
|
||||||
|
void AOELootPlayer::OnPlayerLogin(Player* player)
|
||||||
|
{
|
||||||
|
if (!player)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (sConfigMgr->GetOption<bool>("AOELoot.Enable", true) && sConfigMgr->GetOption<bool>("AOELoot.Message", true))
|
||||||
|
if (WorldSession* session = player->GetSession())
|
||||||
|
ChatHandler(session).PSendModuleSysMessage(MODULE_STRING, AOE_LOGIN_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AOELootServer::CanPacketReceive(WorldSession* session, WorldPacket const& packet)
|
||||||
|
{
|
||||||
|
// Only handle loot packets
|
||||||
|
if (packet.GetOpcode() != CMSG_LOOT)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Basic validation checks
|
||||||
|
if (!session)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
Player* player = session->GetPlayer();
|
||||||
|
if (!player)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Check if module is enabled
|
||||||
|
if (!sConfigMgr->GetOption<bool>("AOELoot.Enable", true))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Check if player has AOE loot disabled via command
|
||||||
|
uint64 playerGuid = player->GetGUID().GetRawValue();
|
||||||
|
if (AoeLootCommandScript::hasPlayerAoeLootEnabled(playerGuid) &&
|
||||||
|
!AoeLootCommandScript::getPlayerAoeLootEnabled(playerGuid))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Check group settings
|
||||||
|
if (player->GetGroup() && !sConfigMgr->GetOption<bool>("AOELoot.Group", true))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Get configured loot range
|
||||||
|
float range = sConfigMgr->GetOption<float>("AOELoot.Range", 55.0f);
|
||||||
|
|
||||||
|
// Limit range to reasonable values
|
||||||
|
if (range < 5.0f)
|
||||||
|
range = 5.0f;
|
||||||
|
|
||||||
|
if (range > 100.0f)
|
||||||
|
range = 100.0f;
|
||||||
|
|
||||||
|
// Read target GUID from packet
|
||||||
|
WorldPacket packetCopy(packet);
|
||||||
|
ObjectGuid targetGuid;
|
||||||
|
packetCopy >> targetGuid;
|
||||||
|
|
||||||
|
if (!targetGuid)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Get target creature
|
||||||
|
Creature* mainCreature = player->GetMap()->GetCreature(targetGuid);
|
||||||
|
if (!mainCreature)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Check if main creature has loot
|
||||||
|
if (!mainCreature->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// Get nearby corpses
|
||||||
|
std::list<Creature*> nearbyCorpses;
|
||||||
|
player->GetDeadCreatureListInGrid(nearbyCorpses, range);
|
||||||
|
|
||||||
|
// Remove invalid corpses and main target
|
||||||
|
nearbyCorpses.remove_if([&](Creature* c)
|
||||||
|
{
|
||||||
|
return !c ||
|
||||||
|
c->GetGUID() == targetGuid ||
|
||||||
|
!c->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE) ||
|
||||||
|
!player->isAllowedToLoot(c);
|
||||||
|
});
|
||||||
|
|
||||||
|
// If no other corpses, process normally
|
||||||
|
if (nearbyCorpses.empty())
|
||||||
|
{
|
||||||
|
player->SendLoot(targetGuid, LOOT_CORPSE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get main loot
|
||||||
|
Loot* mainLoot = &mainCreature->loot;
|
||||||
|
|
||||||
|
// Limit number of corpses to process
|
||||||
|
size_t const maxCorpses = 10; // set to 10 to improve stability
|
||||||
|
size_t processedCorpses = 0;
|
||||||
|
|
||||||
|
// Track total gold to merge
|
||||||
|
uint32 totalGold = mainLoot->gold;
|
||||||
|
|
||||||
|
// Collect all items to merge (don't modify main loot directly)
|
||||||
|
std::vector<LootItem> itemsToAdd;
|
||||||
|
std::vector<LootItem> questItemsToAdd;
|
||||||
|
|
||||||
|
for (Creature* creature : nearbyCorpses)
|
||||||
|
{
|
||||||
|
if (processedCorpses >= maxCorpses)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!creature)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Loot* loot = &creature->loot;
|
||||||
|
|
||||||
|
// Skip already looted corpses
|
||||||
|
if (loot->isLooted())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Collect gold
|
||||||
|
if (loot->gold > 0)
|
||||||
|
{
|
||||||
|
// Prevent overflow
|
||||||
|
if (totalGold < (std::numeric_limits<uint32>::max() - loot->gold))
|
||||||
|
totalGold += loot->gold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect regular items
|
||||||
|
for (size_t i = 0; i < loot->items.size(); ++i)
|
||||||
|
{
|
||||||
|
// Check if there's still space
|
||||||
|
if ((mainLoot->items.size() + itemsToAdd.size() + mainLoot->quest_items.size() + questItemsToAdd.size()) >= MAX_LOOT_ITEMS)
|
||||||
|
break;
|
||||||
|
|
||||||
|
itemsToAdd.push_back(loot->items[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect quest items (only for active quests, limited to needed count)
|
||||||
|
for (size_t i = 0; i < loot->quest_items.size(); ++i)
|
||||||
|
{
|
||||||
|
// Check if there's still space
|
||||||
|
if ((mainLoot->items.size() + itemsToAdd.size() + mainLoot->quest_items.size() + questItemsToAdd.size()) >= MAX_LOOT_ITEMS)
|
||||||
|
break;
|
||||||
|
|
||||||
|
LootItem const& questItem = loot->quest_items[i];
|
||||||
|
|
||||||
|
// Skip items the player doesn't need for any active quest
|
||||||
|
if (!player->HasQuestForItem(questItem.itemid))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Calculate how many the player still needs across all active quests
|
||||||
|
uint32 maxNeeded = 0;
|
||||||
|
for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot)
|
||||||
|
{
|
||||||
|
uint32 questId = player->GetQuestSlotQuestId(slot);
|
||||||
|
if (!questId)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
|
||||||
|
if (!quest)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
|
||||||
|
{
|
||||||
|
if (quest->RequiredItemId[j] == questItem.itemid && quest->RequiredItemCount[j] > maxNeeded)
|
||||||
|
maxNeeded = quest->RequiredItemCount[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxNeeded == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Count how many the player already has, plus pending adds
|
||||||
|
// and quest items already in the main loot window
|
||||||
|
uint32 ownedCount = player->GetItemCount(questItem.itemid, true);
|
||||||
|
for (auto const& pending : questItemsToAdd)
|
||||||
|
{
|
||||||
|
if (pending.itemid == questItem.itemid)
|
||||||
|
ownedCount += pending.count;
|
||||||
|
}
|
||||||
|
for (auto const& mainQuestItem : mainLoot->quest_items)
|
||||||
|
{
|
||||||
|
if (mainQuestItem.itemid == questItem.itemid)
|
||||||
|
ownedCount += mainQuestItem.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ownedCount >= maxNeeded)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
uint32 stillNeeded = maxNeeded - ownedCount;
|
||||||
|
LootItem cappedItem = questItem;
|
||||||
|
cappedItem.count = std::min(static_cast<uint32>(questItem.count), stillNeeded);
|
||||||
|
|
||||||
|
questItemsToAdd.push_back(cappedItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear source loot (but don't modify vector directly)
|
||||||
|
loot->clear();
|
||||||
|
creature->AllLootRemovedFromCorpse();
|
||||||
|
creature->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE);
|
||||||
|
|
||||||
|
processedCorpses++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now safely add collected items to main loot
|
||||||
|
// Update gold
|
||||||
|
mainLoot->gold = totalGold;
|
||||||
|
|
||||||
|
// Add regular items
|
||||||
|
for (const auto& item : itemsToAdd)
|
||||||
|
{
|
||||||
|
if (mainLoot->items.size() < MAX_LOOT_ITEMS)
|
||||||
|
mainLoot->items.push_back(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add quest items directly to player inventory
|
||||||
|
for (const auto& item : questItemsToAdd)
|
||||||
|
{
|
||||||
|
if (!player->HasQuestForItem(item.itemid))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
player->AddItem(item.itemid, item.count);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send merged loot window
|
||||||
|
player->SendLoot(targetGuid, LOOT_CORPSE);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatCommandTable AoeLootCommandScript::GetCommands() const
|
||||||
|
{
|
||||||
|
static ChatCommandTable aoeLootSubCommandTable =
|
||||||
|
{
|
||||||
|
{ "on", HandleAoeLootOnCommand, SEC_PLAYER, Console::No },
|
||||||
|
{ "off", HandleAoeLootOffCommand, SEC_PLAYER, Console::No }
|
||||||
|
};
|
||||||
|
|
||||||
|
static ChatCommandTable aoeLootCommandTable =
|
||||||
|
{
|
||||||
|
{ "aoeloot", aoeLootSubCommandTable }
|
||||||
|
};
|
||||||
|
|
||||||
|
return aoeLootCommandTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AoeLootCommandScript::hasPlayerAoeLootEnabled(uint64 guid)
|
||||||
|
{
|
||||||
|
return playerAoeLootEnabled.count(guid) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AoeLootCommandScript::getPlayerAoeLootEnabled(uint64 guid)
|
||||||
|
{
|
||||||
|
auto it = playerAoeLootEnabled.find(guid);
|
||||||
|
if (it != playerAoeLootEnabled.end())
|
||||||
|
return it->second;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AoeLootCommandScript::setPlayerAoeLootEnabled(uint64 guid, bool mode)
|
||||||
|
{
|
||||||
|
playerAoeLootEnabled[guid] = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AoeLootCommandScript::HandleAoeLootOnCommand(ChatHandler* handler, Optional<std::string> /*args*/)
|
||||||
|
{
|
||||||
|
Player* player = handler->GetSession()->GetPlayer();
|
||||||
|
if (!player)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
uint64 playerGuid = player->GetGUID().GetRawValue();
|
||||||
|
|
||||||
|
if (AoeLootCommandScript::hasPlayerAoeLootEnabled(playerGuid) &&
|
||||||
|
AoeLootCommandScript::getPlayerAoeLootEnabled(playerGuid))
|
||||||
|
{
|
||||||
|
handler->PSendModuleSysMessage(MODULE_STRING, AOE_LOOT_ALREADY_ENABLED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AoeLootCommandScript::setPlayerAoeLootEnabled(playerGuid, true);
|
||||||
|
handler->PSendModuleSysMessage(MODULE_STRING, AOE_LOOT_ENABLED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AoeLootCommandScript::HandleAoeLootOffCommand(ChatHandler* handler, Optional<std::string> /*args*/)
|
||||||
|
{
|
||||||
|
Player* player = handler->GetSession()->GetPlayer();
|
||||||
|
if (!player)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
uint64 playerGuid = player->GetGUID().GetRawValue();
|
||||||
|
|
||||||
|
if (AoeLootCommandScript::hasPlayerAoeLootEnabled(playerGuid) &&
|
||||||
|
!AoeLootCommandScript::getPlayerAoeLootEnabled(playerGuid))
|
||||||
|
{
|
||||||
|
handler->PSendModuleSysMessage(MODULE_STRING, AOE_LOOT_ALREADY_DISABLED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AoeLootCommandScript::setPlayerAoeLootEnabled(playerGuid, false);
|
||||||
|
handler->PSendModuleSysMessage(MODULE_STRING, AOE_LOOT_DISABLED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODULE_AOELOOT_H
|
||||||
|
#define MODULE_AOELOOT_H
|
||||||
|
|
||||||
|
#include "ScriptMgr.h"
|
||||||
|
#include "Config.h"
|
||||||
|
#include "Chat.h"
|
||||||
|
#include "Player.h"
|
||||||
|
#include "ScriptedGossip.h"
|
||||||
|
#include "Group.h"
|
||||||
|
#include "LootMgr.h"
|
||||||
|
#include "Creature.h"
|
||||||
|
#include "Log.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#define MODULE_STRING "mod-aoe-loot"
|
||||||
|
|
||||||
|
// Maximum loot items count
|
||||||
|
constexpr size_t MAX_LOOT_ITEMS = 16;
|
||||||
|
using namespace Acore::ChatCommands;
|
||||||
|
|
||||||
|
enum AoeLootString
|
||||||
|
{
|
||||||
|
AOE_LOGIN_MESSAGE = 1, // Login message
|
||||||
|
AOE_ITEM_IN_THE_MAIL = 2, // Mail notification
|
||||||
|
AOE_MODULE_ACTIVE = 3, // unused
|
||||||
|
AOE_QUEST_ITEM_SENT = 4, // unused
|
||||||
|
AOE_LOOT_ALREADY_ENABLED = 5, // Already enabled message
|
||||||
|
AOE_LOOT_ENABLED = 6, // Enabled confirmation
|
||||||
|
AOE_LOOT_ALREADY_DISABLED = 7, // Already disabled message
|
||||||
|
AOE_LOOT_DISABLED = 8 // Disabled confirmation
|
||||||
|
};
|
||||||
|
|
||||||
|
class AOELootPlayer : public PlayerScript
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AOELootPlayer() : PlayerScript("AOELootPlayer", { PLAYERHOOK_ON_LOGIN }) {}
|
||||||
|
|
||||||
|
void OnPlayerLogin(Player* player) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class AOELootServer : public ServerScript
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AOELootServer() : ServerScript("AOELootServer", { SERVERHOOK_CAN_PACKET_RECEIVE }) {}
|
||||||
|
|
||||||
|
bool CanPacketReceive(WorldSession* session, WorldPacket const& packet) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Helper function - Check if loot is valid
|
||||||
|
bool IsLootValid(Loot* loot) const;
|
||||||
|
|
||||||
|
// Check if loot can be merged
|
||||||
|
bool CanMergeLoot(Player* player, Creature* creature) const;
|
||||||
|
|
||||||
|
// Safely get item count
|
||||||
|
size_t GetSafeItemCount(Loot* loot) const;
|
||||||
|
|
||||||
|
// Safely merge loot items
|
||||||
|
bool SafeMergeLootItems(Loot* mainLoot, Loot* sourceLoot, size_t& remainingSlots);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Configuration options structure (optional, for better config management)
|
||||||
|
struct AOELootConfig
|
||||||
|
{
|
||||||
|
bool enabled = true;
|
||||||
|
bool messageOnLogin = true;
|
||||||
|
bool allowInGroup = true;
|
||||||
|
float range = 55.0f;
|
||||||
|
uint32 maxCorpses = 20;
|
||||||
|
|
||||||
|
static AOELootConfig* instance()
|
||||||
|
{
|
||||||
|
static AOELootConfig instance;
|
||||||
|
return &instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Load()
|
||||||
|
{
|
||||||
|
enabled = sConfigMgr->GetOption<bool>("AOELoot.Enable", true);
|
||||||
|
messageOnLogin = sConfigMgr->GetOption<bool>("AOELoot.Message", true);
|
||||||
|
allowInGroup = sConfigMgr->GetOption<bool>("AOELoot.Group", true);
|
||||||
|
range = sConfigMgr->GetOption<float>("AOELoot.Range", 55.0f);
|
||||||
|
maxCorpses = sConfigMgr->GetOption<uint32>("AOELoot.MaxCorpses", 20);
|
||||||
|
|
||||||
|
// Validate configuration values
|
||||||
|
if (range < 5.0f) range = 5.0f;
|
||||||
|
if (range > 100.0f) range = 100.0f;
|
||||||
|
if (maxCorpses < 1) maxCorpses = 1;
|
||||||
|
if (maxCorpses > 50) maxCorpses = 50;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class AoeLootCommandScript : public CommandScript
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AoeLootCommandScript() : CommandScript("AoeLootCommandScript") {}
|
||||||
|
ChatCommandTable GetCommands() const override;
|
||||||
|
|
||||||
|
static bool HandleAoeLootOnCommand(ChatHandler* handler, Optional<std::string> args);
|
||||||
|
static bool HandleAoeLootOffCommand(ChatHandler* handler, Optional<std::string> args);
|
||||||
|
|
||||||
|
// Getters and setters for player AOE loot settings
|
||||||
|
static bool getPlayerAoeLootEnabled(uint64 guid);
|
||||||
|
static void setPlayerAoeLootEnabled(uint64 guid, bool mode);
|
||||||
|
static bool hasPlayerAoeLootEnabled(uint64 guid);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::map<uint64, bool> playerAoeLootEnabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
void AddSC_AoeLoot()
|
||||||
|
{
|
||||||
|
new AOELootPlayer();
|
||||||
|
new AOELootServer();
|
||||||
|
new AoeLootCommandScript();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //MODULE_AOELOOT_H
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
* Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// From SC
|
||||||
|
void AddSC_AoeLoot();
|
||||||
|
|
||||||
|
// Add all
|
||||||
|
void Addmod_aoe_lootScripts()
|
||||||
|
{
|
||||||
|
AddSC_AoeLoot();
|
||||||
|
}
|
||||||
@@ -30,3 +30,14 @@ Auto-detected by `modules/CMakeLists.txt` (`GetModuleSourceList` globs
|
|||||||
every subdirectory). No additional CMake plumbing is needed; rebuild
|
every subdirectory). No additional CMake plumbing is needed; rebuild
|
||||||
the worldserver image and the loader symbol `Addmod_paragonScripts`
|
the worldserver image and the loader symbol `Addmod_paragonScripts`
|
||||||
gets linked into the static `modules` target.
|
gets linked into the static `modules` target.
|
||||||
|
|
||||||
|
## SQL layout
|
||||||
|
|
||||||
|
SQL files live under `data/sql/db-world/base/` and
|
||||||
|
`data/sql/db-characters/base/` — the standard AzerothCore module path
|
||||||
|
that the built-in DBUpdater scans (see
|
||||||
|
`src/server/database/Updater/UpdateFetcher.cpp`). Files placed there
|
||||||
|
are applied automatically by `worldserver` / `dbimport` on startup and
|
||||||
|
recorded by hash in the `updates` table of the target database, so
|
||||||
|
re-runs are idempotent. Any new SQL added under those directories will
|
||||||
|
be picked up on the next container/server start without manual import.
|
||||||
|
|||||||
@@ -12,6 +12,11 @@ Paragon.StickyComboPoints = 1
|
|||||||
# in addition to runes/runic power. Required for the patch-enUS-5.MPQ player
|
# in addition to runes/runic power. Required for the patch-enUS-5.MPQ player
|
||||||
# frame to populate Mana/Rage/Energy bars - otherwise the server treats those
|
# frame to populate Mana/Rage/Energy bars - otherwise the server treats those
|
||||||
# powers as inactive and never sends max values, leaving the bars empty.
|
# powers as inactive and never sends max values, leaving the bars empty.
|
||||||
|
# Also required for core rage generation: Unit::DealDamage only calls
|
||||||
|
# RewardRage() when the attacker HasActivePowerType(POWER_RAGE); if this is off,
|
||||||
|
# Paragon white swings never grant rage (users without this line in any loaded
|
||||||
|
# config used to hit the C++ fallback default of false). Default is on; set 0
|
||||||
|
# only if you intentionally want a stripped-down Paragon test build.
|
||||||
Paragon.MultiResource.HasActivePowers = 1
|
Paragon.MultiResource.HasActivePowers = 1
|
||||||
|
|
||||||
# Ability / Talent Essence (AE/TE) — Ascension-inspired currency
|
# Ability / Talent Essence (AE/TE) — Ascension-inspired currency
|
||||||
@@ -23,12 +28,27 @@ Paragon.Currency.GrantLevelMin = 10
|
|||||||
Paragon.Currency.AE.PerLevel = 1
|
Paragon.Currency.AE.PerLevel = 1
|
||||||
Paragon.Currency.TE.PerLevel = 1
|
Paragon.Currency.TE.PerLevel = 1
|
||||||
# Flat TE cost per successful talent rank learn (hook runs once per LearnTalent).
|
# Flat TE cost per successful talent rank learn (hook runs once per LearnTalent).
|
||||||
|
# Applies to passive / aura-only talents (addToSpellBook == 0).
|
||||||
Paragon.Currency.TE.TalentLearnCost = 1
|
Paragon.Currency.TE.TalentLearnCost = 1
|
||||||
|
# AE cost per rank for addToSpellBook talents (Starfall, Bladestorm, …).
|
||||||
|
# Those talents also charge TE.TalentLearnCost per rank — each rank costs
|
||||||
|
# both essences at the configured amounts.
|
||||||
|
Paragon.Currency.AE.TalentLearnCost = 1
|
||||||
# Default AE cost when spell is not listed in world.paragon_spell_ae_cost.
|
# Default AE cost when spell is not listed in world.paragon_spell_ae_cost.
|
||||||
Paragon.Currency.AE.DefaultSpellCost = 2
|
# (Phase 3a: every learnable spell baked into the Character Advancement panel
|
||||||
|
# has an explicit row of value 1 in that table, so this default only kicks in
|
||||||
|
# for spells learned via .paragon learn that aren't in the panel's bake.)
|
||||||
|
Paragon.Currency.AE.DefaultSpellCost = 1
|
||||||
|
|
||||||
# Diagnostics ----------------------------------------------------------------
|
# Diagnostics ----------------------------------------------------------------
|
||||||
# When enabled, dumps every Paragon's rune cooldown state to the server log
|
# When enabled, dumps every Paragon's rune cooldown state to the server log
|
||||||
# every 5 seconds (channel "module"). Use with `.paragon runes` for in-game
|
# every 5 seconds (channel "module"). Use with `.paragon runes` for in-game
|
||||||
# verification. Leave at 0 in production — it's noisy.
|
# verification. Leave at 0 in production — it's noisy.
|
||||||
Paragon.Diag.RuneTrace = 0
|
Paragon.Diag.RuneTrace = 0
|
||||||
|
|
||||||
|
# When enabled, traces every PanelLearnSpellChain commit: chain ids, before/
|
||||||
|
# after spell-map sizes for each rank learn, and the classification of every
|
||||||
|
# auto-granted side spell (chain rank / passive dep / active dep revoked).
|
||||||
|
# Use to diagnose "spell X reappears in spellbook on relog" style bugs.
|
||||||
|
# Leave at 0 in production.
|
||||||
|
Paragon.Diag.PanelLearn = 0
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
-- Spells and talents learned only through Character Advancement (Lock In / .paragon learn).
|
||||||
|
-- Apply to the character database (same as `characters`, `character_spell`, etc.).
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_panel_spells` (
|
||||||
|
`guid` INT UNSIGNED NOT NULL COMMENT 'characters.guid',
|
||||||
|
`spell_id` INT UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY (`guid`, `spell_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: spells purchased via Character Advancement';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_panel_talents` (
|
||||||
|
`guid` INT UNSIGNED NOT NULL COMMENT 'characters.guid',
|
||||||
|
`talent_id` SMALLINT UNSIGNED NOT NULL,
|
||||||
|
`rank` TINYINT UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY (`guid`, `talent_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: talent ranks purchased via Character Advancement';
|
||||||
|
|
||||||
|
-- Passive "dependent" spells that AzerothCore's `addSpell` machinery
|
||||||
|
-- (via spell_learn_spell + SPELL_EFFECT_LEARN_SPELL) auto-grants when a
|
||||||
|
-- panel-purchased spell is learned. We keep them learned (some are
|
||||||
|
-- required for the parent ability to function -- e.g. Frost Fever for
|
||||||
|
-- Icy Touch, Blood Plague for Plague Strike) but record them here so
|
||||||
|
-- Reset Abilities / Reset Everything can unlearn them alongside the
|
||||||
|
-- parent. Only passive auto-learns are tracked here; active dependents
|
||||||
|
-- (Death Coil, Death Grip, ...) are revoked at learn time and never
|
||||||
|
-- reach this table.
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_panel_spell_children` (
|
||||||
|
`guid` INT UNSIGNED NOT NULL COMMENT 'characters.guid',
|
||||||
|
`parent_spell_id` INT UNSIGNED NOT NULL COMMENT 'character_paragon_panel_spells.spell_id',
|
||||||
|
`child_spell_id` INT UNSIGNED NOT NULL COMMENT 'auto-learned passive spell id',
|
||||||
|
PRIMARY KEY (`guid`, `parent_spell_id`, `child_spell_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: passive auto-learn dependents to unlearn on reset';
|
||||||
|
|
||||||
|
-- Active "dependent" spells that AzerothCore's `addSpell` /
|
||||||
|
-- `learnSkillRewardedSpells` machinery auto-grants alongside a
|
||||||
|
-- panel-purchased spell but that the player did NOT buy (e.g. Blood
|
||||||
|
-- Presence, Death Coil, Death Grip from purchasing Plague Strike).
|
||||||
|
-- We revoke them at panel-commit time, but AC's skill cascade re-runs
|
||||||
|
-- on every login (`Player::_LoadSkills` -> `learnSkillRewardedSpells`)
|
||||||
|
-- and silently re-grants them. We persist the revoke decisions here
|
||||||
|
-- and re-revoke at `OnPlayerLogin` so the spellbook stays in sync with
|
||||||
|
-- what the player actually purchased through Character Advancement.
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_panel_spell_revoked` (
|
||||||
|
`guid` INT UNSIGNED NOT NULL COMMENT 'characters.guid',
|
||||||
|
`parent_spell_id` INT UNSIGNED NOT NULL COMMENT 'character_paragon_panel_spells.spell_id',
|
||||||
|
`revoked_spell_id` INT UNSIGNED NOT NULL COMMENT 'active spell id auto-granted by skill cascade and revoked',
|
||||||
|
PRIMARY KEY (`guid`, `parent_spell_id`, `revoked_spell_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: active auto-learn dependents to keep revoked across logins';
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
-- mod-paragon: tracking table for active spell dependents the panel
|
||||||
|
-- revoked at commit time. AzerothCore's `Player::_LoadSkills` ->
|
||||||
|
-- `learnSkillRewardedSpells` re-grants skill-rewarded actives (Blood
|
||||||
|
-- Presence, Death Coil, Death Grip, ...) on every login. Persisting
|
||||||
|
-- the revoke decisions here lets `OnPlayerLogin` re-revoke them after
|
||||||
|
-- the cascade has run, so the spellbook stays in sync with what was
|
||||||
|
-- actually purchased through Character Advancement.
|
||||||
|
--
|
||||||
|
-- This file lives under `updates/` so AC's DBUpdater applies it
|
||||||
|
-- incrementally on existing databases (the matching `CREATE TABLE
|
||||||
|
-- IF NOT EXISTS` block in base/character_paragon_panel_learned.sql
|
||||||
|
-- handles fresh installs).
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_panel_spell_revoked` (
|
||||||
|
`guid` INT UNSIGNED NOT NULL COMMENT 'characters.guid',
|
||||||
|
`parent_spell_id` INT UNSIGNED NOT NULL COMMENT 'character_paragon_panel_spells.spell_id',
|
||||||
|
`revoked_spell_id` INT UNSIGNED NOT NULL COMMENT 'active spell id auto-granted by skill cascade and revoked',
|
||||||
|
PRIMARY KEY (`guid`, `parent_spell_id`, `revoked_spell_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: active auto-learn dependents to keep revoked across logins';
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
-- mod-paragon Character Advancement: Build catalog (saved loadouts).
|
||||||
|
-- ----------------------------------------------------------------------------
|
||||||
|
-- A "build" is a named, icon-tagged loadout of panel-purchased spells and
|
||||||
|
-- talent ranks. Each Paragon character can save many builds and swap
|
||||||
|
-- between them via the Builds page in the Character Advancement panel.
|
||||||
|
--
|
||||||
|
-- Swap workflow (see HandleBuildLoad in Paragon_Builds.cpp):
|
||||||
|
-- 1. If a build is currently active, snapshot the player's current
|
||||||
|
-- panel-purchased spells + per-spec talent ranks into that build's
|
||||||
|
-- recipe rows (overwriting the stored recipe).
|
||||||
|
-- 2. If the active build's hunter pet is currently summoned, unsummon
|
||||||
|
-- it to PET_SAVE_NOT_IN_SLOT and store its `pet_number` on the
|
||||||
|
-- active build row so it can be restored on swap-back.
|
||||||
|
-- 3. Reset all panel-bought abilities and talents (refunding AE/TE).
|
||||||
|
-- 4. Re-buy each spell + talent in the target build's recipe (charging
|
||||||
|
-- AE/TE; aborts if insufficient AE/TE -- player keeps refunded
|
||||||
|
-- currency in that case and active becomes NULL).
|
||||||
|
-- 5. Move the target build's parked pet (if any) back to current.
|
||||||
|
-- 6. Update active_build pointer.
|
||||||
|
--
|
||||||
|
-- Pet ownership: a parked pet sits in `character_pet` with slot=100
|
||||||
|
-- (PET_SAVE_NOT_IN_SLOT), exactly like the engine's stable-master
|
||||||
|
-- offload, but tied to the build via `pet_number` instead of any
|
||||||
|
-- in-game stable slot. Build deletion drops the parked pet rows
|
||||||
|
-- entirely (PET_SAVE_AS_DELETED equivalent) -- player is warned.
|
||||||
|
-- ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_builds` (
|
||||||
|
`build_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`guid` INT UNSIGNED NOT NULL COMMENT 'characters.guid',
|
||||||
|
`name` VARCHAR(32) NOT NULL,
|
||||||
|
`icon` VARCHAR(64) NOT NULL DEFAULT 'INV_Misc_QuestionMark',
|
||||||
|
`is_favorite` TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`pet_number` INT UNSIGNED NULL COMMENT 'character_pet.id of parked hunter pet, NULL when no pet bound to this build',
|
||||||
|
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`build_id`),
|
||||||
|
KEY `idx_guid` (`guid`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: saved Character Advancement build catalog';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_build_spells` (
|
||||||
|
`build_id` INT UNSIGNED NOT NULL,
|
||||||
|
`spell_id` INT UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY (`build_id`, `spell_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: per-build recipe -- panel-purchased spells';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_build_talents` (
|
||||||
|
`build_id` INT UNSIGNED NOT NULL,
|
||||||
|
`spec` TINYINT UNSIGNED NOT NULL COMMENT '0 = primary spec, 1 = secondary (dual spec)',
|
||||||
|
`talent_id` SMALLINT UNSIGNED NOT NULL,
|
||||||
|
`rank` TINYINT UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY (`build_id`, `spec`, `talent_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: per-build recipe -- panel-purchased talent ranks per spec';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_active_build` (
|
||||||
|
`guid` INT UNSIGNED NOT NULL COMMENT 'characters.guid',
|
||||||
|
`build_id` INT UNSIGNED NOT NULL COMMENT 'character_paragon_builds.build_id (per-character active pointer)',
|
||||||
|
PRIMARY KEY (`guid`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: pointer to whichever build is currently loaded (one row per Paragon character)';
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
-- mod-paragon Character Advancement: Builds catalog schema cleanup.
|
||||||
|
-- ----------------------------------------------------------------------------
|
||||||
|
-- Two changes:
|
||||||
|
-- 1. Drop `is_favorite` -- the favorite flag and shift-click-to-favorite
|
||||||
|
-- flow are removed. Builds are now ordered solely by build_id ASC.
|
||||||
|
-- 2. Add `share_code` CHAR(6) -- a random alphanumeric token generated
|
||||||
|
-- server-side at build creation that uniquely identifies a saved
|
||||||
|
-- build across the realm. Players exchange codes out-of-band and
|
||||||
|
-- use the BuildsPane "Load Build!" share box to import a copy of
|
||||||
|
-- the build (name + icon + spell + talent recipe) into their own
|
||||||
|
-- catalog. The copy gets a fresh share_code so re-sharing is
|
||||||
|
-- always traceable to the latest owner; the original isn't touched.
|
||||||
|
--
|
||||||
|
-- The column is NULL-tolerant so any rows that pre-date this migration
|
||||||
|
-- (created under 2026_05_10_03's schema) coexist cleanly. The server
|
||||||
|
-- backfills NULLs lazily in PushBuildCatalog -- the next time a player
|
||||||
|
-- opens the BuildsPane on a Paragon character, any of their builds that
|
||||||
|
-- still have a NULL share_code will get one generated and persisted.
|
||||||
|
--
|
||||||
|
-- Charset: 31 unambiguous chars (A-Z minus I/O minus 0/1) gives 31^6 ~=
|
||||||
|
-- 887M codes; collision retry on insert keeps probability of a duplicate
|
||||||
|
-- vanishing for any realistic catalog size.
|
||||||
|
-- ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ALTER TABLE `character_paragon_builds`
|
||||||
|
DROP COLUMN `is_favorite`,
|
||||||
|
ADD COLUMN `share_code` CHAR(6) NULL DEFAULT NULL
|
||||||
|
COMMENT 'random alphanumeric token for import-by-code; lazily generated'
|
||||||
|
AFTER `icon`,
|
||||||
|
ADD UNIQUE INDEX `uk_share_code` (`share_code`);
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
-- mod-paragon: preserve superseded share codes as importable snapshots.
|
||||||
|
-- ----------------------------------------------------------------------------
|
||||||
|
-- When an active build is updated (Learn All), the live row gets a new
|
||||||
|
-- share_code and a fresh recipe. Older codes the player posted to Discord
|
||||||
|
-- must keep working: each retired code is frozen here with its spell/talent
|
||||||
|
-- recipe so `C BUILD IMPORT <code>` still materializes that exact loadout.
|
||||||
|
-- ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_build_share_archive` (
|
||||||
|
`share_code` CHAR(6) NOT NULL COMMENT 'retired code (same charset as live builds)',
|
||||||
|
`name` VARCHAR(32) NOT NULL,
|
||||||
|
`icon` VARCHAR(64) NOT NULL DEFAULT 'INV_Misc_QuestionMark',
|
||||||
|
`archived_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`share_code`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: frozen build metadata for retired share codes';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_build_share_archive_spells` (
|
||||||
|
`share_code` CHAR(6) NOT NULL,
|
||||||
|
`spell_id` INT UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY (`share_code`, `spell_id`),
|
||||||
|
KEY `idx_share` (`share_code`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: spell recipe rows for an archived share code';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `character_paragon_build_share_archive_talents` (
|
||||||
|
`share_code` CHAR(6) NOT NULL,
|
||||||
|
`spec` TINYINT UNSIGNED NOT NULL,
|
||||||
|
`talent_id` SMALLINT UNSIGNED NOT NULL,
|
||||||
|
`rank` TINYINT UNSIGNED NOT NULL,
|
||||||
|
PRIMARY KEY (`share_code`, `spec`, `talent_id`),
|
||||||
|
KEY `idx_share` (`share_code`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: talent recipe rows for an archived share code';
|
||||||
@@ -0,0 +1,483 @@
|
|||||||
|
-- Per-spell AE costs for Paragon spell purchases (.paragon learn / panel Lock In).
|
||||||
|
-- Auto-generated by tools/_gen_paragon_spell_ae_cost_sql.py.
|
||||||
|
-- Apply to the *world* database (AzerothCore's SQL updater handles this on worldserver start).
|
||||||
|
-- The flat 1-AE cost is a Phase 3 placeholder; tune individual rows here as the
|
||||||
|
-- economy gets balanced (e.g., 5 AE for top-rank baseline like Cyclone).
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `paragon_spell_ae_cost` (
|
||||||
|
`spell_id` INT UNSIGNED NOT NULL,
|
||||||
|
`ae_cost` SMALLINT UNSIGNED NOT NULL DEFAULT '1',
|
||||||
|
PRIMARY KEY (`spell_id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
||||||
|
COMMENT='mod-paragon: AE cost per spell';
|
||||||
|
|
||||||
|
-- Bulk-load: replace the entire table with the current bake. Manual edits
|
||||||
|
-- to specific rows will be lost when this script regenerates the file --
|
||||||
|
-- track per-spell tuning in a separate INSERT ... ON DUPLICATE KEY UPDATE
|
||||||
|
-- file (e.g. paragon_spell_ae_cost_overrides.sql) if needed.
|
||||||
|
DELETE FROM `paragon_spell_ae_cost`;
|
||||||
|
|
||||||
|
INSERT INTO `paragon_spell_ae_cost` (`spell_id`, `ae_cost`) VALUES
|
||||||
|
(10, 1),
|
||||||
|
(17, 1),
|
||||||
|
(53, 1),
|
||||||
|
(66, 1),
|
||||||
|
(72, 1),
|
||||||
|
(75, 1),
|
||||||
|
(78, 1),
|
||||||
|
(99, 1),
|
||||||
|
(100, 1),
|
||||||
|
(116, 1),
|
||||||
|
(118, 1),
|
||||||
|
(120, 1),
|
||||||
|
(122, 1),
|
||||||
|
(126, 1),
|
||||||
|
(130, 1),
|
||||||
|
(131, 1),
|
||||||
|
(132, 1),
|
||||||
|
(133, 1),
|
||||||
|
(136, 1),
|
||||||
|
(139, 1),
|
||||||
|
(168, 1),
|
||||||
|
(172, 1),
|
||||||
|
(324, 1),
|
||||||
|
(331, 1),
|
||||||
|
(339, 1),
|
||||||
|
(348, 1),
|
||||||
|
(370, 1),
|
||||||
|
(403, 1),
|
||||||
|
(408, 1),
|
||||||
|
(421, 1),
|
||||||
|
(453, 1),
|
||||||
|
(465, 1),
|
||||||
|
(467, 1),
|
||||||
|
(469, 1),
|
||||||
|
(475, 1),
|
||||||
|
(498, 1),
|
||||||
|
(526, 1),
|
||||||
|
(527, 1),
|
||||||
|
(528, 1),
|
||||||
|
(543, 1),
|
||||||
|
(546, 1),
|
||||||
|
(552, 1),
|
||||||
|
(556, 1),
|
||||||
|
(585, 1),
|
||||||
|
(586, 1),
|
||||||
|
(587, 1),
|
||||||
|
(588, 1),
|
||||||
|
(589, 1),
|
||||||
|
(596, 1),
|
||||||
|
(603, 1),
|
||||||
|
(604, 1),
|
||||||
|
(605, 1),
|
||||||
|
(633, 1),
|
||||||
|
(635, 1),
|
||||||
|
(642, 1),
|
||||||
|
(676, 1),
|
||||||
|
(686, 1),
|
||||||
|
(687, 1),
|
||||||
|
(688, 1),
|
||||||
|
(689, 1),
|
||||||
|
(691, 1),
|
||||||
|
(693, 1),
|
||||||
|
(694, 1),
|
||||||
|
(697, 1),
|
||||||
|
(698, 1),
|
||||||
|
(702, 1),
|
||||||
|
(703, 1),
|
||||||
|
(706, 1),
|
||||||
|
(710, 1),
|
||||||
|
(712, 1),
|
||||||
|
(740, 1),
|
||||||
|
(755, 1),
|
||||||
|
(759, 1),
|
||||||
|
(768, 1),
|
||||||
|
(770, 1),
|
||||||
|
(772, 1),
|
||||||
|
(774, 1),
|
||||||
|
(779, 1),
|
||||||
|
(781, 1),
|
||||||
|
(783, 1),
|
||||||
|
(845, 1),
|
||||||
|
(853, 1),
|
||||||
|
(871, 1),
|
||||||
|
(879, 1),
|
||||||
|
(883, 1),
|
||||||
|
(921, 1),
|
||||||
|
(976, 1),
|
||||||
|
(980, 1),
|
||||||
|
(982, 1),
|
||||||
|
(1002, 1),
|
||||||
|
(1008, 1),
|
||||||
|
(1022, 1),
|
||||||
|
(1038, 1),
|
||||||
|
(1044, 1),
|
||||||
|
(1064, 1),
|
||||||
|
(1066, 1),
|
||||||
|
(1079, 1),
|
||||||
|
(1082, 1),
|
||||||
|
(1098, 1),
|
||||||
|
(1120, 1),
|
||||||
|
(1126, 1),
|
||||||
|
(1130, 1),
|
||||||
|
(1152, 1),
|
||||||
|
(1160, 1),
|
||||||
|
(1161, 1),
|
||||||
|
(1243, 1),
|
||||||
|
(1449, 1),
|
||||||
|
(1454, 1),
|
||||||
|
(1459, 1),
|
||||||
|
(1462, 1),
|
||||||
|
(1463, 1),
|
||||||
|
(1464, 1),
|
||||||
|
(1490, 1),
|
||||||
|
(1494, 1),
|
||||||
|
(1495, 1),
|
||||||
|
(1499, 1),
|
||||||
|
(1510, 1),
|
||||||
|
(1513, 1),
|
||||||
|
(1515, 1),
|
||||||
|
(1535, 1),
|
||||||
|
(1543, 1),
|
||||||
|
(1680, 1),
|
||||||
|
(1706, 1),
|
||||||
|
(1714, 1),
|
||||||
|
(1715, 1),
|
||||||
|
(1719, 1),
|
||||||
|
(1725, 1),
|
||||||
|
(1752, 1),
|
||||||
|
(1766, 1),
|
||||||
|
(1776, 1),
|
||||||
|
(1784, 1),
|
||||||
|
(1822, 1),
|
||||||
|
(1833, 1),
|
||||||
|
(1842, 1),
|
||||||
|
(1850, 1),
|
||||||
|
(1856, 1),
|
||||||
|
(1943, 1),
|
||||||
|
(1949, 1),
|
||||||
|
(1953, 1),
|
||||||
|
(1966, 1),
|
||||||
|
(1978, 1),
|
||||||
|
(2006, 1),
|
||||||
|
(2008, 1),
|
||||||
|
(2050, 1),
|
||||||
|
(2054, 1),
|
||||||
|
(2060, 1),
|
||||||
|
(2061, 1),
|
||||||
|
(2062, 1),
|
||||||
|
(2094, 1),
|
||||||
|
(2096, 1),
|
||||||
|
(2098, 1),
|
||||||
|
(2120, 1),
|
||||||
|
(2136, 1),
|
||||||
|
(2139, 1),
|
||||||
|
(2362, 1),
|
||||||
|
(2457, 1),
|
||||||
|
(2458, 1),
|
||||||
|
(2484, 1),
|
||||||
|
(2565, 1),
|
||||||
|
(2637, 1),
|
||||||
|
(2641, 1),
|
||||||
|
(2643, 1),
|
||||||
|
(2645, 1),
|
||||||
|
(2687, 1),
|
||||||
|
(2782, 1),
|
||||||
|
(2812, 1),
|
||||||
|
(2825, 1),
|
||||||
|
(2893, 1),
|
||||||
|
(2894, 1),
|
||||||
|
(2908, 1),
|
||||||
|
(2912, 1),
|
||||||
|
(2944, 1),
|
||||||
|
(2948, 1),
|
||||||
|
(2973, 1),
|
||||||
|
(2974, 1),
|
||||||
|
(2983, 1),
|
||||||
|
(3034, 1),
|
||||||
|
(3043, 1),
|
||||||
|
(3044, 1),
|
||||||
|
(3045, 1),
|
||||||
|
(3411, 1),
|
||||||
|
(3561, 1),
|
||||||
|
(3562, 1),
|
||||||
|
(3563, 1),
|
||||||
|
(3565, 1),
|
||||||
|
(3566, 1),
|
||||||
|
(3567, 1),
|
||||||
|
(3714, 1),
|
||||||
|
(3738, 1),
|
||||||
|
(4987, 1),
|
||||||
|
(5116, 1),
|
||||||
|
(5118, 1),
|
||||||
|
(5138, 1),
|
||||||
|
(5143, 1),
|
||||||
|
(5171, 1),
|
||||||
|
(5176, 1),
|
||||||
|
(5185, 1),
|
||||||
|
(5209, 1),
|
||||||
|
(5211, 1),
|
||||||
|
(5215, 1);
|
||||||
|
|
||||||
|
INSERT INTO `paragon_spell_ae_cost` (`spell_id`, `ae_cost`) VALUES
|
||||||
|
(5217, 1),
|
||||||
|
(5221, 1),
|
||||||
|
(5225, 1),
|
||||||
|
(5229, 1),
|
||||||
|
(5246, 1),
|
||||||
|
(5277, 1),
|
||||||
|
(5308, 1),
|
||||||
|
(5384, 1),
|
||||||
|
(5484, 1),
|
||||||
|
(5487, 1),
|
||||||
|
(5500, 1),
|
||||||
|
(5502, 1),
|
||||||
|
(5504, 1),
|
||||||
|
(5675, 1),
|
||||||
|
(5676, 1),
|
||||||
|
(5697, 1),
|
||||||
|
(5730, 1),
|
||||||
|
(5740, 1),
|
||||||
|
(5782, 1),
|
||||||
|
(5938, 1),
|
||||||
|
(6117, 1),
|
||||||
|
(6143, 1),
|
||||||
|
(6196, 1),
|
||||||
|
(6197, 1),
|
||||||
|
(6201, 1),
|
||||||
|
(6229, 1),
|
||||||
|
(6343, 1),
|
||||||
|
(6346, 1),
|
||||||
|
(6353, 1),
|
||||||
|
(6366, 1),
|
||||||
|
(6495, 1),
|
||||||
|
(6552, 1),
|
||||||
|
(6572, 1),
|
||||||
|
(6673, 1),
|
||||||
|
(6770, 1),
|
||||||
|
(6785, 1),
|
||||||
|
(6789, 1),
|
||||||
|
(6795, 1),
|
||||||
|
(6807, 1),
|
||||||
|
(6940, 1),
|
||||||
|
(7294, 1),
|
||||||
|
(7302, 1),
|
||||||
|
(7384, 1),
|
||||||
|
(8004, 1),
|
||||||
|
(8017, 1),
|
||||||
|
(8024, 1),
|
||||||
|
(8033, 1),
|
||||||
|
(8042, 1),
|
||||||
|
(8050, 1),
|
||||||
|
(8056, 1),
|
||||||
|
(8075, 1),
|
||||||
|
(8092, 1),
|
||||||
|
(8122, 1),
|
||||||
|
(8129, 1),
|
||||||
|
(8143, 1),
|
||||||
|
(8170, 1),
|
||||||
|
(8177, 1),
|
||||||
|
(8181, 1),
|
||||||
|
(8184, 1),
|
||||||
|
(8190, 1),
|
||||||
|
(8227, 1),
|
||||||
|
(8232, 1),
|
||||||
|
(8512, 1),
|
||||||
|
(8647, 1),
|
||||||
|
(8676, 1),
|
||||||
|
(8921, 1),
|
||||||
|
(8936, 1),
|
||||||
|
(8998, 1),
|
||||||
|
(9005, 1),
|
||||||
|
(9484, 1),
|
||||||
|
(10059, 1),
|
||||||
|
(10326, 1),
|
||||||
|
(10595, 1),
|
||||||
|
(11416, 1),
|
||||||
|
(11417, 1),
|
||||||
|
(11418, 1),
|
||||||
|
(11419, 1),
|
||||||
|
(11420, 1),
|
||||||
|
(12051, 1),
|
||||||
|
(13159, 1),
|
||||||
|
(13161, 1),
|
||||||
|
(13163, 1),
|
||||||
|
(13165, 1),
|
||||||
|
(13795, 1),
|
||||||
|
(13809, 1),
|
||||||
|
(13813, 1),
|
||||||
|
(14752, 1),
|
||||||
|
(14914, 1),
|
||||||
|
(15237, 1),
|
||||||
|
(16689, 1),
|
||||||
|
(16857, 1),
|
||||||
|
(16914, 1),
|
||||||
|
(18499, 1),
|
||||||
|
(19263, 1),
|
||||||
|
(19740, 1),
|
||||||
|
(19742, 1),
|
||||||
|
(19746, 1),
|
||||||
|
(19750, 1),
|
||||||
|
(19752, 1),
|
||||||
|
(19801, 1),
|
||||||
|
(19876, 1),
|
||||||
|
(19878, 1),
|
||||||
|
(19879, 1),
|
||||||
|
(19880, 1),
|
||||||
|
(19882, 1),
|
||||||
|
(19883, 1),
|
||||||
|
(19884, 1),
|
||||||
|
(19885, 1),
|
||||||
|
(19888, 1),
|
||||||
|
(19891, 1),
|
||||||
|
(20043, 1),
|
||||||
|
(20154, 1),
|
||||||
|
(20164, 1),
|
||||||
|
(20165, 1),
|
||||||
|
(20166, 1),
|
||||||
|
(20217, 1),
|
||||||
|
(20230, 1),
|
||||||
|
(20252, 1),
|
||||||
|
(20484, 1),
|
||||||
|
(20736, 1),
|
||||||
|
(21562, 1),
|
||||||
|
(21849, 1),
|
||||||
|
(22568, 1),
|
||||||
|
(22570, 1),
|
||||||
|
(22812, 1),
|
||||||
|
(22842, 1),
|
||||||
|
(23028, 1),
|
||||||
|
(23161, 1),
|
||||||
|
(23214, 1),
|
||||||
|
(23920, 1),
|
||||||
|
(23922, 1),
|
||||||
|
(24275, 1),
|
||||||
|
(25780, 1),
|
||||||
|
(25782, 1),
|
||||||
|
(25894, 1),
|
||||||
|
(25898, 1),
|
||||||
|
(25899, 1),
|
||||||
|
(26573, 1),
|
||||||
|
(26679, 1),
|
||||||
|
(27243, 1),
|
||||||
|
(27681, 1),
|
||||||
|
(27683, 1),
|
||||||
|
(28176, 1),
|
||||||
|
(29166, 1),
|
||||||
|
(29722, 1),
|
||||||
|
(29858, 1),
|
||||||
|
(29893, 1),
|
||||||
|
(30449, 1),
|
||||||
|
(30451, 1),
|
||||||
|
(30455, 1),
|
||||||
|
(30482, 1),
|
||||||
|
(31224, 1),
|
||||||
|
(31789, 1),
|
||||||
|
(31801, 1),
|
||||||
|
(31884, 1),
|
||||||
|
(32182, 1),
|
||||||
|
(32223, 1),
|
||||||
|
(32266, 1),
|
||||||
|
(32267, 1),
|
||||||
|
(32271, 1),
|
||||||
|
(32272, 1),
|
||||||
|
(32375, 1),
|
||||||
|
(32379, 1),
|
||||||
|
(32546, 1),
|
||||||
|
(32645, 1),
|
||||||
|
(33076, 1),
|
||||||
|
(33690, 1),
|
||||||
|
(33691, 1),
|
||||||
|
(33745, 1),
|
||||||
|
(33763, 1),
|
||||||
|
(33786, 1),
|
||||||
|
(33943, 1),
|
||||||
|
(34026, 1),
|
||||||
|
(34074, 1),
|
||||||
|
(34428, 1),
|
||||||
|
(34433, 1),
|
||||||
|
(34477, 1),
|
||||||
|
(34600, 1),
|
||||||
|
(34767, 1),
|
||||||
|
(35715, 1),
|
||||||
|
(35717, 1),
|
||||||
|
(36936, 1),
|
||||||
|
(42650, 1),
|
||||||
|
(42955, 1),
|
||||||
|
(43265, 1),
|
||||||
|
(43987, 1),
|
||||||
|
(44614, 1),
|
||||||
|
(45438, 1),
|
||||||
|
(45462, 1),
|
||||||
|
(45477, 1),
|
||||||
|
(45524, 1),
|
||||||
|
(45529, 1),
|
||||||
|
(45902, 1),
|
||||||
|
(46584, 1),
|
||||||
|
(47476, 1),
|
||||||
|
(47528, 1),
|
||||||
|
(47541, 1),
|
||||||
|
(47568, 1),
|
||||||
|
(47897, 1),
|
||||||
|
(48018, 1);
|
||||||
|
|
||||||
|
INSERT INTO `paragon_spell_ae_cost` (`spell_id`, `ae_cost`) VALUES
|
||||||
|
(48020, 1),
|
||||||
|
(48045, 1),
|
||||||
|
(48263, 1),
|
||||||
|
(48265, 1),
|
||||||
|
(48266, 1),
|
||||||
|
(48707, 1),
|
||||||
|
(48721, 1),
|
||||||
|
(48743, 1),
|
||||||
|
(48792, 1),
|
||||||
|
(49020, 1),
|
||||||
|
(49358, 1),
|
||||||
|
(49359, 1),
|
||||||
|
(49360, 1),
|
||||||
|
(49361, 1),
|
||||||
|
(49576, 1),
|
||||||
|
(49998, 1),
|
||||||
|
(50464, 1),
|
||||||
|
(50769, 1),
|
||||||
|
(50842, 1),
|
||||||
|
(51505, 1),
|
||||||
|
(51514, 1),
|
||||||
|
(51722, 1),
|
||||||
|
(51723, 1),
|
||||||
|
(51730, 1),
|
||||||
|
(52127, 1),
|
||||||
|
(52610, 1),
|
||||||
|
(53140, 1),
|
||||||
|
(53142, 1),
|
||||||
|
(53271, 1),
|
||||||
|
(53351, 1),
|
||||||
|
(53407, 1),
|
||||||
|
(53408, 1),
|
||||||
|
(53600, 1),
|
||||||
|
(53601, 1),
|
||||||
|
(53736, 1),
|
||||||
|
(54428, 1),
|
||||||
|
(55342, 1),
|
||||||
|
(55694, 1),
|
||||||
|
(56222, 1),
|
||||||
|
(56641, 1),
|
||||||
|
(56815, 1),
|
||||||
|
(57330, 1),
|
||||||
|
(57755, 1),
|
||||||
|
(57934, 1),
|
||||||
|
(57994, 1),
|
||||||
|
(60192, 1),
|
||||||
|
(61846, 1),
|
||||||
|
(61999, 1),
|
||||||
|
(62078, 1),
|
||||||
|
(62124, 1),
|
||||||
|
(62600, 1),
|
||||||
|
(62757, 1),
|
||||||
|
(64382, 1),
|
||||||
|
(64843, 1),
|
||||||
|
(64901, 1),
|
||||||
|
(66842, 1),
|
||||||
|
(66843, 1),
|
||||||
|
(66844, 1);
|
||||||
|
|
||||||
@@ -0,0 +1,270 @@
|
|||||||
|
-- mod-paragon: server-side DBC overlay for class 12 (Paragon).
|
||||||
|
-- Auto-generated by fractured-tooling/from-workspace-root/
|
||||||
|
-- _gen_paragon_dbc_overlay_sql.py
|
||||||
|
--
|
||||||
|
-- AzerothCore's DBCStores.cpp::LoadDBC merges every <table>_dbc
|
||||||
|
-- world-DB row on top of the on-disk DBC store at startup
|
||||||
|
-- (storage.LoadFromDB). We use that to ship Paragon's class-12
|
||||||
|
-- DBC deltas in SQL form so a stock data/dbc/ tree (e.g. the
|
||||||
|
-- vanilla `ac-wotlk-client-data` Docker image) still resolves
|
||||||
|
-- class 12 in sChrClassesStore and class-12 entries in
|
||||||
|
-- sSkillRaceClassInfoStore.
|
||||||
|
--
|
||||||
|
-- Without this migration, fresh installs hit:
|
||||||
|
-- CHAR_CREATE_FAILED -- "Class (12) not found in DBC ..."
|
||||||
|
-- the moment a contributor tries to roll a Paragon character.
|
||||||
|
--
|
||||||
|
-- This file is regenerated end-to-end from patch-enUS-4.MPQ;
|
||||||
|
-- do not hand-edit. Update the patched DBC source and rerun
|
||||||
|
-- the bake script.
|
||||||
|
|
||||||
|
-- chrclasses_dbc: classes added or modified by patch-enUS-4.MPQ.
|
||||||
|
-- AzerothCore merges this on top of the on-disk ChrClasses.dbc
|
||||||
|
-- so a stock data/dbc tree still gets class 12 at runtime.
|
||||||
|
DELETE FROM `chrclasses_dbc` WHERE `ID` IN (12);
|
||||||
|
INSERT INTO `chrclasses_dbc` (`ID`,`Field01`,`DisplayPower`,`PetNameToken`,`Name_Lang_enUS`,`Name_Lang_Mask`,`Name_Female_Lang_Mask`,`Name_Male_Lang_Mask`,`Filename`,`SpellClassSet`,`Flags`,`CinematicSequenceID`,`Required_Expansion`) VALUES
|
||||||
|
(12, 0, 0, 0, 'Paragon', 0, 0, 0, 'PARAGON', 4, 50, 0, 2);
|
||||||
|
|
||||||
|
-- skillraceclassinfo_dbc: rows where patch-enUS-4 OR'd the
|
||||||
|
-- class-12 bit (0x800) into ClassMask, opening every
|
||||||
|
-- baseline skill to Paragon. Replaces the stock row by ID so
|
||||||
|
-- AzerothCore picks the patched mask on the SQL merge pass.
|
||||||
|
DELETE FROM `skillraceclassinfo_dbc` WHERE `ID` IN (
|
||||||
|
57,301,107,82,75,140,328,638,872,880,881,885,886,910,117,335,628,629,630,912,126,127,133,134,635,31,39,135,325,636,637,643,644,888,889,914,125,626,884,898,901,58,60,916,59,40,41,68,48,49,44,45,42,43,50,51,131,132,883,913,105,71,70,69,925,54,25,138,139,91,882,85,84,93,88,865,87,441,94,443,92,481,89,442,123,124,624,625,702,908,6,922,33,243,899,241,122,621,622,701,907,970,129,323,631,632,633,634,641,642,142,143,639,640,28,63,282,29,284,65,97,244,940,72,128,878,879,137,144,136,915,55,79,81,76,149,112,111,106,66,26,83,74,73,108,109,110,113,38,35,36,37,61,62,64,24,34,21,906,46,47,52,53,281,104,102,101,27,95,98,96,30,145,146,147,148,151,155,158,159,271,175,178,183,186,270,189,191,193,198,200,265,266,203,204,205,268,269,246,272,330,381,403,445,446,461,501,463,464,521,522,541,544,581,601,741,742,781,841,861,862,866,867,877,934,892,896,897,951,895,900,936,938,939,947
|
||||||
|
);
|
||||||
|
INSERT INTO `skillraceclassinfo_dbc` (`ID`,`SkillID`,`RaceMask`,`ClassMask`,`Flags`,`MinLevel`,`SkillTierID`,`SkillCostIndex`) VALUES
|
||||||
|
(57,6,-1,2176,1040,0,0,0),
|
||||||
|
(301,8,-1,2176,1040,0,0,0),
|
||||||
|
(107,26,-1,2049,1040,0,0,0),
|
||||||
|
(82,38,-1,2056,1040,0,0,0),
|
||||||
|
(75,39,-1,2056,1040,0,0,0),
|
||||||
|
(140,43,1115,2049,128,0,0,0),
|
||||||
|
(328,43,3071,2052,128,0,0,0),
|
||||||
|
(638,43,164,2049,128,0,0,0),
|
||||||
|
(872,43,32767,2056,128,0,0,0),
|
||||||
|
(880,43,1024,2052,128,0,0,0),
|
||||||
|
(881,43,32767,2432,128,0,0,0),
|
||||||
|
(885,43,1029,2050,128,0,0,0),
|
||||||
|
(886,43,512,2050,128,0,0,0),
|
||||||
|
(910,43,262143,2080,128,0,0,0),
|
||||||
|
(117,44,166,2052,128,0,0,0),
|
||||||
|
(335,44,2147483647,2122,128,0,0,0),
|
||||||
|
(628,44,1544,2052,128,0,0,0),
|
||||||
|
(629,44,167,2049,128,0,0,0),
|
||||||
|
(630,44,1112,2049,128,0,0,0),
|
||||||
|
(912,44,262143,2080,128,0,0,0),
|
||||||
|
(126,45,650,2052,128,0,0,0),
|
||||||
|
(127,45,32767,2061,128,0,0,0),
|
||||||
|
(133,46,36,2052,128,0,0,0),
|
||||||
|
(134,46,32767,2057,128,0,0,0),
|
||||||
|
(635,46,1674,2052,128,0,0,0),
|
||||||
|
(31,50,-1,2052,1040,0,0,0),
|
||||||
|
(39,51,-1,2052,1040,0,0,0),
|
||||||
|
(135,54,2147483647,2128,128,0,0,0),
|
||||||
|
(325,54,-1,2056,128,0,0,0),
|
||||||
|
(636,54,1133,2049,128,0,0,0),
|
||||||
|
(637,54,658,2049,128,0,0,0),
|
||||||
|
(643,54,8,3072,128,0,0,0),
|
||||||
|
(644,54,32,3072,128,0,0,0),
|
||||||
|
(888,54,261631,2050,128,0,0,0),
|
||||||
|
(889,54,512,2050,128,0,0,0),
|
||||||
|
(914,54,262143,2080,128,0,0,0),
|
||||||
|
(125,55,262143,2052,128,0,0,0),
|
||||||
|
(626,55,163839,2049,128,0,0,0),
|
||||||
|
(884,55,512,2050,128,0,0,0),
|
||||||
|
(898,55,262143,2080,128,0,0,0),
|
||||||
|
(901,55,261631,2050,128,0,0,0),
|
||||||
|
(58,56,-1,2064,1040,0,0,0),
|
||||||
|
(60,78,-1,2064,1040,0,0,0),
|
||||||
|
(916,95,524287,2080,640,0,0,0),
|
||||||
|
(59,96,2047,3072,1168,0,0,0),
|
||||||
|
(40,98,1101,3583,128,0,0,0),
|
||||||
|
(41,98,674,3551,160,0,21,0),
|
||||||
|
(68,101,4,3583,1170,0,0,0),
|
||||||
|
(48,109,690,3583,128,0,0,0),
|
||||||
|
(49,109,1101,3551,160,0,21,0),
|
||||||
|
(44,111,4,3583,128,0,0,0),
|
||||||
|
(45,111,2043,3551,160,0,21,0),
|
||||||
|
(42,113,8,3583,128,0,0,0),
|
||||||
|
(43,113,2039,3551,160,0,21,0),
|
||||||
|
(50,115,32,3583,128,0,0,0),
|
||||||
|
(51,115,2015,3551,160,0,21,0),
|
||||||
|
(131,118,32767,2056,146,1,0,0),
|
||||||
|
(132,118,32767,2053,146,20,0,0),
|
||||||
|
(883,118,32767,2112,402,0,0,0),
|
||||||
|
(913,118,262143,2080,146,0,0,0),
|
||||||
|
(105,120,2047,2304,1170,0,0,0),
|
||||||
|
(71,124,32,3583,1170,0,0,0),
|
||||||
|
(70,125,2,3583,146,0,0,0),
|
||||||
|
(69,126,8,3583,1170,0,0,0),
|
||||||
|
(925,129,-1,2080,128,0,63,0),
|
||||||
|
(54,130,2047,2176,1168,4,0,0),
|
||||||
|
(25,134,-1,3072,1040,10,0,0),
|
||||||
|
(138,136,32767,3536,128,0,0,0),
|
||||||
|
(139,136,32767,2053,128,0,0,0),
|
||||||
|
(91,137,1535,3551,160,0,21,0),
|
||||||
|
(882,137,512,3583,128,0,0,0),
|
||||||
|
(85,138,2047,3583,128,0,0,0),
|
||||||
|
(84,139,2047,3583,160,0,21,0),
|
||||||
|
(93,140,2047,3583,128,0,0,0),
|
||||||
|
(88,141,2047,3583,160,0,21,0),
|
||||||
|
(865,142,2047,3583,0,0,0,0),
|
||||||
|
(87,148,1,3551,1170,0,181,0),
|
||||||
|
(441,148,222,3583,1170,0,182,0),
|
||||||
|
(94,149,2,3551,1170,0,181,0),
|
||||||
|
(443,149,509,3583,1170,0,182,0),
|
||||||
|
(92,150,8,3551,1170,0,181,0),
|
||||||
|
(481,150,215,3583,1170,0,182,0),
|
||||||
|
(89,152,4,3551,1170,0,181,0),
|
||||||
|
(442,152,219,3583,1170,0,182,0),
|
||||||
|
(123,160,262143,2050,128,0,0,0),
|
||||||
|
(124,160,-1,3072,128,0,0,0),
|
||||||
|
(624,160,32,2049,128,0,0,0),
|
||||||
|
(625,160,262111,2049,128,0,0,0),
|
||||||
|
(702,160,-1,2112,128,0,0,0),
|
||||||
|
(908,160,262143,2080,128,0,0,0),
|
||||||
|
(6,162,2147483647,3551,128,0,0,0),
|
||||||
|
(922,162,262143,2080,128,0,0,0),
|
||||||
|
(33,163,-1,2052,1040,0,0,0),
|
||||||
|
(243,164,2047,3583,160,0,41,0),
|
||||||
|
(899,165,2047,3583,160,0,41,0),
|
||||||
|
(241,171,2047,3583,160,0,41,0),
|
||||||
|
(122,172,163839,2050,128,0,0,0),
|
||||||
|
(621,172,6,2049,128,0,0,0),
|
||||||
|
(622,172,1529,2049,128,0,0,0),
|
||||||
|
(701,172,163839,2112,128,0,0,0),
|
||||||
|
(907,172,524287,2080,128,0,0,0),
|
||||||
|
(970,172,163839,2052,128,0,0,0),
|
||||||
|
(129,173,32767,2312,128,0,0,0),
|
||||||
|
(323,173,32767,2256,128,0,0,0),
|
||||||
|
(631,173,520,2052,128,0,0,0),
|
||||||
|
(632,173,1190,2052,128,0,0,0),
|
||||||
|
(633,173,216,2049,128,0,0,0),
|
||||||
|
(634,173,1063,2049,128,0,0,0),
|
||||||
|
(641,173,32,3072,128,0,0,0),
|
||||||
|
(642,173,8,3072,128,0,0,0),
|
||||||
|
(142,176,-1,2056,128,0,0,0),
|
||||||
|
(143,176,-1,2052,128,0,0,0),
|
||||||
|
(639,176,128,2049,128,0,0,0),
|
||||||
|
(640,176,262015,2049,128,0,0,0),
|
||||||
|
(28,182,2047,3583,160,0,2,0),
|
||||||
|
(63,184,-1,2050,1040,0,0,0),
|
||||||
|
(282,185,2047,3583,128,0,61,0),
|
||||||
|
(29,186,2047,3583,160,0,2,0),
|
||||||
|
(284,197,2047,3583,160,0,62,0),
|
||||||
|
(65,198,2047,2050,1168,0,0,0),
|
||||||
|
(97,199,2047,2112,1168,0,0,0),
|
||||||
|
(244,202,2047,3583,160,0,41,0),
|
||||||
|
(940,205,524287,2176,2048,0,0,0),
|
||||||
|
(72,220,16,3583,1170,0,0,0),
|
||||||
|
(128,226,32767,2057,128,0,0,0),
|
||||||
|
(878,226,1024,2052,128,0,0,0),
|
||||||
|
(879,226,31743,2052,128,0,0,0),
|
||||||
|
(137,227,2047,3077,128,0,0,0),
|
||||||
|
(144,228,-1,2448,128,0,0,0),
|
||||||
|
(136,229,32767,3079,128,20,0,0),
|
||||||
|
(915,229,262143,2080,128,0,0,0),
|
||||||
|
(55,237,-1,2176,1040,0,0,0),
|
||||||
|
(79,238,2047,2056,1168,4,0,0),
|
||||||
|
(81,239,2047,2056,1168,0,0,0),
|
||||||
|
(76,241,2047,2056,128,40,0,0),
|
||||||
|
(149,242,2047,2056,1168,16,0,0),
|
||||||
|
(112,243,2047,2049,1170,0,0,0),
|
||||||
|
(111,244,2047,2049,1168,0,0,0),
|
||||||
|
(106,245,2047,2049,1168,0,0,0),
|
||||||
|
(66,246,2047,2050,1168,0,0,0),
|
||||||
|
(26,247,2047,3072,1168,20,0,0),
|
||||||
|
(83,252,2047,2057,128,0,0,0),
|
||||||
|
(74,253,-1,2056,1040,0,0,0),
|
||||||
|
(73,254,2047,2056,1168,10,0,0),
|
||||||
|
(108,255,2047,2049,1168,0,0,0),
|
||||||
|
(109,256,-1,2049,1040,0,0,0),
|
||||||
|
(110,257,-1,2049,1040,0,0,0),
|
||||||
|
(113,258,2047,2049,1168,10,0,0),
|
||||||
|
(38,260,2047,2052,128,0,0,0),
|
||||||
|
(35,262,2047,2052,128,0,0,0),
|
||||||
|
(36,263,2047,2052,128,0,0,0),
|
||||||
|
(37,264,2047,2052,128,0,0,0),
|
||||||
|
(61,267,-1,2050,1040,0,0,0),
|
||||||
|
(62,268,2047,2050,1170,0,0,0),
|
||||||
|
(64,269,2047,2050,1168,0,0,0),
|
||||||
|
(24,272,2047,3072,1168,10,0,0),
|
||||||
|
(34,273,2047,2052,128,0,0,0),
|
||||||
|
(21,293,2047,2051,128,40,0,0),
|
||||||
|
(906,293,262143,2080,128,0,0,0),
|
||||||
|
(46,313,64,3583,128,0,0,0),
|
||||||
|
(47,313,1983,3551,160,0,21,0),
|
||||||
|
(52,315,128,3583,128,0,0,0),
|
||||||
|
(53,315,1919,3551,160,0,21,0),
|
||||||
|
(281,333,2047,3583,160,0,62,0),
|
||||||
|
(104,353,2047,2304,1170,0,0,0),
|
||||||
|
(102,354,-1,2304,1040,0,0,0),
|
||||||
|
(101,355,-1,2304,1040,0,0,0),
|
||||||
|
(27,356,2047,3583,128,0,23,0),
|
||||||
|
(95,373,-1,2112,1040,0,0,0),
|
||||||
|
(98,374,262143,2112,1040,0,0,0),
|
||||||
|
(96,375,262143,2112,1040,0,0,0),
|
||||||
|
(30,393,2047,3583,160,0,161,0),
|
||||||
|
(145,413,2047,2116,128,40,0,0),
|
||||||
|
(146,413,2047,2083,128,0,0,0),
|
||||||
|
(147,414,2047,3183,128,0,0,0),
|
||||||
|
(148,415,2047,3583,128,0,0,0),
|
||||||
|
(151,416,2047,2049,192,0,0,0),
|
||||||
|
(155,416,2047,2050,192,0,0,1),
|
||||||
|
(158,416,2047,3136,192,0,0,1),
|
||||||
|
(159,416,2047,2060,192,0,0,1),
|
||||||
|
(271,416,2047,2448,192,0,0,2),
|
||||||
|
(175,418,2047,2049,384,0,0,0),
|
||||||
|
(178,418,2047,2050,384,0,0,0),
|
||||||
|
(183,418,2047,3332,384,0,0,1),
|
||||||
|
(186,418,2047,2192,384,0,0,1),
|
||||||
|
(270,418,2047,2120,384,0,0,1),
|
||||||
|
(189,419,2047,2060,640,0,0,2),
|
||||||
|
(191,419,2047,3072,640,0,0,1),
|
||||||
|
(193,419,2047,2192,640,0,0,0),
|
||||||
|
(198,419,2047,2050,640,0,0,1),
|
||||||
|
(200,419,2047,2049,640,0,0,2),
|
||||||
|
(265,419,2047,2304,640,0,0,0),
|
||||||
|
(266,419,2047,2112,640,0,0,1),
|
||||||
|
(203,420,2047,2061,1152,0,0,2),
|
||||||
|
(204,420,2047,3074,1152,0,0,1),
|
||||||
|
(205,420,2047,2320,1152,0,0,0),
|
||||||
|
(268,420,2047,2176,1152,0,0,0),
|
||||||
|
(269,420,2047,2112,1152,0,0,1),
|
||||||
|
(246,433,2047,2115,128,0,0,0),
|
||||||
|
(272,453,2047,2051,128,0,0,0),
|
||||||
|
(330,473,4095,3149,130,0,0,0),
|
||||||
|
(381,493,8,3583,164,0,0,0),
|
||||||
|
(403,515,2047,3551,128,0,0,0),
|
||||||
|
(445,533,128,3583,1170,0,181,0),
|
||||||
|
(446,533,95,3551,1170,0,182,0),
|
||||||
|
(461,553,64,3551,1170,0,181,0),
|
||||||
|
(501,553,4,3583,1170,0,182,0),
|
||||||
|
(463,554,16,3551,1170,0,181,0),
|
||||||
|
(464,554,207,3583,1170,0,182,0),
|
||||||
|
(521,573,-1,3072,1040,0,0,0),
|
||||||
|
(522,574,-1,3072,1040,0,0,0),
|
||||||
|
(541,593,-1,2304,1040,0,0,0),
|
||||||
|
(544,594,-1,2050,1040,0,0,0),
|
||||||
|
(581,613,-1,2064,1040,0,0,0),
|
||||||
|
(601,633,-1,2056,128,0,0,0),
|
||||||
|
(741,673,16,3583,128,0,0,0),
|
||||||
|
(742,673,2031,3551,160,0,21,0),
|
||||||
|
(781,713,255,3583,1170,0,181,0),
|
||||||
|
(841,733,128,3583,1170,0,0,0),
|
||||||
|
(861,753,64,3583,1170,0,0,0),
|
||||||
|
(862,754,1,3583,1170,0,0,0),
|
||||||
|
(866,755,2047,3583,160,0,41,0),
|
||||||
|
(867,756,512,3583,146,0,0,0),
|
||||||
|
(877,760,1024,3583,146,0,0,0),
|
||||||
|
(934,762,524287,2080,144,0,223,0),
|
||||||
|
(892,769,32767,3583,1040,0,0,0),
|
||||||
|
(896,770,-1,2080,1040,0,0,0),
|
||||||
|
(897,771,262143,2080,1040,0,0,0),
|
||||||
|
(951,771,2097151,3583,0,0,0,0),
|
||||||
|
(895,772,-1,2080,1040,0,0,0),
|
||||||
|
(900,773,262143,3583,160,0,41,0),
|
||||||
|
(936,776,262143,2080,128,0,0,0),
|
||||||
|
(938,777,524287,3583,2,0,0,0),
|
||||||
|
(939,778,524287,3583,2,0,0,0),
|
||||||
|
(947,778,2097151,3583,0,0,0,0);
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
-- mod-paragon: starter spawn data for class 12 (Paragon).
|
||||||
|
--
|
||||||
|
-- Companion to 2026_05_09_00.sql. The DBC overlay teaches the world
|
||||||
|
-- server that class 12 exists; this migration teaches it WHERE
|
||||||
|
-- characters of that class spawn, what action bar they boot with,
|
||||||
|
-- and what per-level base stats to integrity-check against.
|
||||||
|
--
|
||||||
|
-- Without these rows, character creation fails inside Player::Create:
|
||||||
|
--
|
||||||
|
-- PlayerInfo const* info = sObjectMgr->GetPlayerInfo(race, class);
|
||||||
|
-- if (!info) {
|
||||||
|
-- LOG_ERROR("entities.player",
|
||||||
|
-- "Player::Create: ... invalid race/class pair ({}/{})"
|
||||||
|
-- " - refusing to do so.", ..., race, class);
|
||||||
|
-- return false; // -> client sees "Error creating character"
|
||||||
|
-- }
|
||||||
|
--
|
||||||
|
-- and on world load the player_class_stats integrity check trips:
|
||||||
|
--
|
||||||
|
-- "Class N Level L does not have stats data!"
|
||||||
|
--
|
||||||
|
-- Tables touched:
|
||||||
|
-- - playercreateinfo : (race, class=12) -> map/zone/x/y/z
|
||||||
|
-- Race-specific starting zones (Paragon
|
||||||
|
-- spawns in each race's standard newbie
|
||||||
|
-- area, NOT Acherus, since it is a
|
||||||
|
-- from-level-1 class).
|
||||||
|
-- - playercreateinfo_action : (race, class=12, button) -> action,type
|
||||||
|
-- Default action bar layout per race.
|
||||||
|
-- - player_class_stats : (class=12, level 1..80) -> base stats
|
||||||
|
-- Per-level HP/Mana/STR/AGI/STA/INT/SPI
|
||||||
|
-- used by Player::InitStatsForLevel.
|
||||||
|
--
|
||||||
|
-- Tables intentionally NOT touched here:
|
||||||
|
-- - playercreateinfo_item : Paragon ships no per-class starting
|
||||||
|
-- items; gear comes from the racial
|
||||||
|
-- kit only.
|
||||||
|
-- - playercreateinfo_skills / _cast_spell / _spell_custom :
|
||||||
|
-- These are mask-based. Class-12 baseline
|
||||||
|
-- weapon/defense skills come through
|
||||||
|
-- classMask=0 ("all classes") rows that
|
||||||
|
-- already cover Paragon. The DBC overlay
|
||||||
|
-- in 2026_05_09_00.sql opens
|
||||||
|
-- SkillRaceClassInfo for class 12.
|
||||||
|
|
||||||
|
-- Idempotent: blow away any pre-existing class-12 rows first so this
|
||||||
|
-- migration can be replayed cleanly on a partially-seeded DB (e.g.
|
||||||
|
-- after a contributor manually patched their local DB before this
|
||||||
|
-- migration landed).
|
||||||
|
DELETE FROM `playercreateinfo` WHERE `class` = 12;
|
||||||
|
DELETE FROM `playercreateinfo_action` WHERE `class` = 12;
|
||||||
|
DELETE FROM `player_class_stats` WHERE `Class` = 12;
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- playercreateinfo (10 rows: every DK-eligible race, racial start)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
INSERT INTO `playercreateinfo` (`race`, `class`, `map`, `zone`, `position_x`, `position_y`, `position_z`, `orientation`) VALUES
|
||||||
|
( 1, 12, 0, 12, -8949.95, -132.493, 83.5312, 0 ), -- Human -> Northshire, Elwynn Forest
|
||||||
|
( 2, 12, 1, 14, -618.518, -4251.67, 38.718, 0 ), -- Orc -> Valley of Trials, Durotar
|
||||||
|
( 3, 12, 0, 1, -6240.32, 331.033, 382.758, 6.17716 ), -- Dwarf -> Coldridge Valley, Dun Morogh
|
||||||
|
( 4, 12, 1, 141, 10311.3, 832.463, 1326.41, 5.69632 ), -- Night Elf -> Shadowglen, Teldrassil
|
||||||
|
( 5, 12, 0, 85, 1676.71, 1678.31, 121.67, 2.70526 ), -- Undead -> Deathknell, Tirisfal
|
||||||
|
( 6, 12, 1, 215, -2917.58, -257.98, 52.9968, 0 ), -- Tauren -> Camp Narache, Mulgore
|
||||||
|
( 7, 12, 0, 1, -6240.32, 331.033, 382.758, 0 ), -- Gnome -> Coldridge Valley (shared)
|
||||||
|
( 8, 12, 1, 14, -618.518, -4251.67, 38.718, 0 ), -- Troll -> Valley of Trials (shared)
|
||||||
|
(10, 12, 530, 3431, 10349.6, -6357.29, 33.4026, 5.31605 ), -- Blood Elf -> Sunstrider Isle, Eversong
|
||||||
|
(11, 12, 530, 3526, -3961.64,-13931.2, 100.615, 2.08364 ); -- Draenei -> Ammen Vale, Azuremyst Isle
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- playercreateinfo_action (46 rows)
|
||||||
|
-- Buttons: 72=Attack(6603), 73=Eat(78), 74=racial, 75=race-extra,
|
||||||
|
-- 82=Skinning(59752, Tauren only), 84=Attack, 96=Attack
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
INSERT INTO `playercreateinfo_action` (`race`, `class`, `button`, `action`, `type`) VALUES
|
||||||
|
( 1, 12, 72, 6603, 0), ( 1, 12, 73, 78, 0), ( 1, 12, 82, 59752, 0),
|
||||||
|
( 1, 12, 84, 6603, 0), ( 1, 12, 96, 6603, 0),
|
||||||
|
( 2, 12, 72, 6603, 0), ( 2, 12, 73, 78, 0), ( 2, 12, 74, 20572, 0),
|
||||||
|
( 2, 12, 84, 6603, 0), ( 2, 12, 96, 6603, 0),
|
||||||
|
( 3, 12, 72, 6603, 0), ( 3, 12, 73, 78, 0), ( 3, 12, 74, 20594, 0),
|
||||||
|
( 3, 12, 75, 2481, 0), ( 3, 12, 84, 6603, 0), ( 3, 12, 96, 6603, 0),
|
||||||
|
( 4, 12, 72, 6603, 0), ( 4, 12, 73, 78, 0), ( 4, 12, 74, 58984, 0),
|
||||||
|
( 4, 12, 84, 6603, 0), ( 4, 12, 96, 6603, 0),
|
||||||
|
( 5, 12, 72, 6603, 0), ( 5, 12, 73, 78, 0), ( 5, 12, 74, 20577, 0),
|
||||||
|
( 5, 12, 84, 6603, 0), ( 5, 12, 96, 6603, 0),
|
||||||
|
( 6, 12, 72, 6603, 0), ( 6, 12, 73, 78, 0), ( 6, 12, 74, 20549, 0),
|
||||||
|
( 6, 12, 84, 6603, 0), ( 6, 12, 96, 6603, 0),
|
||||||
|
( 7, 12, 72, 6603, 0), ( 7, 12, 73, 78, 0), ( 7, 12, 84, 6603, 0),
|
||||||
|
( 7, 12, 96, 6603, 0),
|
||||||
|
( 8, 12, 72, 6603, 0), ( 8, 12, 73, 78, 0), ( 8, 12, 74, 2764, 0),
|
||||||
|
( 8, 12, 75, 26297, 0), ( 8, 12, 84, 6603, 0), ( 8, 12, 96, 6603, 0),
|
||||||
|
(11, 12, 72, 6603, 0), (11, 12, 73, 78, 0), (11, 12, 74, 28880, 0),
|
||||||
|
(11, 12, 84, 6603, 0), (11, 12, 96, 6603, 0);
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- player_class_stats (80 rows: levels 1..80 per-class base stats)
|
||||||
|
-- Curve mirrors Warrior baseline -> Paladin past 60 (vehicle-style HP
|
||||||
|
-- inflation past 60 to keep Paragon competitive in Wrath content).
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
INSERT INTO `player_class_stats` (`Class`, `Level`, `BaseHP`, `BaseMana`, `Strength`, `Agility`, `Stamina`, `Intellect`, `Spirit`) VALUES
|
||||||
|
(12, 1, 20, 60, 23, 20, 22, 20, 20),
|
||||||
|
(12, 2, 29, 66, 24, 21, 23, 20, 20),
|
||||||
|
(12, 3, 38, 73, 25, 21, 24, 20, 21),
|
||||||
|
(12, 4, 47, 81, 26, 22, 25, 20, 21),
|
||||||
|
(12, 5, 56, 90, 28, 23, 26, 20, 21),
|
||||||
|
(12, 6, 65, 100, 29, 24, 27, 21, 21),
|
||||||
|
(12, 7, 74, 111, 30, 24, 28, 21, 22),
|
||||||
|
(12, 8, 83, 123, 31, 25, 29, 21, 22),
|
||||||
|
(12, 9, 92, 136, 32, 26, 30, 21, 22),
|
||||||
|
(12, 10, 97, 150, 33, 26, 31, 21, 23),
|
||||||
|
(12, 11, 103, 165, 35, 27, 33, 21, 23),
|
||||||
|
(12, 12, 109, 182, 36, 28, 34, 21, 23),
|
||||||
|
(12, 13, 118, 200, 37, 29, 35, 21, 24),
|
||||||
|
(12, 14, 128, 219, 39, 30, 36, 22, 24),
|
||||||
|
(12, 15, 139, 239, 40, 30, 37, 22, 24),
|
||||||
|
(12, 16, 151, 260, 41, 31, 38, 22, 25),
|
||||||
|
(12, 17, 154, 282, 42, 32, 40, 22, 25),
|
||||||
|
(12, 18, 168, 305, 44, 33, 41, 22, 25),
|
||||||
|
(12, 19, 183, 329, 45, 34, 42, 22, 26),
|
||||||
|
(12, 20, 199, 354, 47, 35, 43, 22, 26),
|
||||||
|
(12, 21, 206, 380, 48, 35, 45, 23, 26),
|
||||||
|
(12, 22, 224, 392, 49, 36, 46, 23, 27),
|
||||||
|
(12, 23, 243, 420, 51, 37, 47, 23, 27),
|
||||||
|
(12, 24, 253, 449, 52, 38, 49, 23, 28),
|
||||||
|
(12, 25, 274, 479, 54, 39, 50, 23, 28),
|
||||||
|
(12, 26, 296, 509, 55, 40, 51, 23, 28),
|
||||||
|
(12, 27, 309, 524, 57, 41, 53, 23, 29),
|
||||||
|
(12, 28, 333, 554, 58, 42, 54, 24, 29),
|
||||||
|
(12, 29, 348, 584, 60, 43, 56, 24, 30),
|
||||||
|
(12, 30, 374, 614, 62, 44, 57, 24, 30),
|
||||||
|
(12, 31, 401, 629, 63, 45, 58, 24, 30),
|
||||||
|
(12, 32, 419, 659, 65, 46, 60, 24, 31),
|
||||||
|
(12, 33, 448, 689, 66, 47, 61, 24, 31),
|
||||||
|
(12, 34, 468, 704, 68, 48, 63, 25, 32),
|
||||||
|
(12, 35, 499, 734, 70, 49, 64, 25, 32),
|
||||||
|
(12, 36, 521, 749, 72, 50, 66, 25, 33),
|
||||||
|
(12, 37, 545, 779, 73, 51, 68, 25, 33),
|
||||||
|
(12, 38, 581, 809, 75, 52, 69, 25, 33),
|
||||||
|
(12, 39, 609, 824, 77, 53, 71, 26, 34),
|
||||||
|
(12, 40, 649, 854, 79, 54, 72, 26, 34),
|
||||||
|
(12, 41, 681, 869, 80, 56, 74, 26, 35),
|
||||||
|
(12, 42, 715, 899, 82, 57, 76, 26, 35),
|
||||||
|
(12, 43, 761, 914, 84, 58, 77, 26, 36),
|
||||||
|
(12, 44, 799, 944, 86, 59, 79, 26, 36),
|
||||||
|
(12, 45, 839, 959, 88, 60, 81, 27, 37),
|
||||||
|
(12, 46, 881, 989, 90, 61, 83, 27, 37),
|
||||||
|
(12, 47, 935, 1004, 92, 63, 84, 27, 38),
|
||||||
|
(12, 48, 981, 1019, 94, 64, 86, 27, 38),
|
||||||
|
(12, 49, 1029, 1049, 96, 65, 88, 28, 39),
|
||||||
|
(12, 50, 1079, 1064, 98, 66, 90, 28, 39),
|
||||||
|
(12, 51, 1131, 1079, 100, 68, 92, 28, 40),
|
||||||
|
(12, 52, 1185, 1109, 102, 69, 94, 28, 40),
|
||||||
|
(12, 53, 1241, 1124, 104, 70, 96, 28, 41),
|
||||||
|
(12, 54, 1299, 1139, 106, 72, 98, 29, 42),
|
||||||
|
(12, 55, 1359, 1154, 109, 73, 100, 29, 42),
|
||||||
|
(12, 56, 1421, 1169, 111, 74, 102, 29, 43),
|
||||||
|
(12, 57, 1485, 1199, 113, 76, 104, 29, 43),
|
||||||
|
(12, 58, 1551, 1214, 115, 77, 106, 30, 44),
|
||||||
|
(12, 59, 1619, 1229, 118, 79, 108, 30, 44),
|
||||||
|
(12, 60, 1689, 1244, 120, 80, 110, 30, 45),
|
||||||
|
(12, 61, 1902, 1357, 122, 81, 112, 30, 46),
|
||||||
|
(12, 62, 2129, 1469, 125, 83, 114, 30, 46),
|
||||||
|
(12, 63, 2357, 1582, 127, 84, 117, 31, 47),
|
||||||
|
(12, 64, 2612, 1694, 130, 86, 119, 31, 47),
|
||||||
|
(12, 65, 2883, 1807, 132, 88, 121, 31, 48),
|
||||||
|
(12, 66, 3169, 1919, 135, 89, 123, 32, 49),
|
||||||
|
(12, 67, 3455, 2032, 137, 91, 126, 32, 49),
|
||||||
|
(12, 68, 3774, 2145, 140, 92, 128, 32, 50),
|
||||||
|
(12, 69, 4109, 2257, 142, 94, 130, 32, 51),
|
||||||
|
(12, 70, 4444, 2370, 145, 96, 133, 33, 51),
|
||||||
|
(12, 71, 4720, 2482, 148, 97, 135, 33, 52),
|
||||||
|
(12, 72, 5013, 2595, 150, 99, 138, 33, 53),
|
||||||
|
(12, 73, 5325, 2708, 153, 101, 140, 33, 54),
|
||||||
|
(12, 74, 5656, 2820, 156, 102, 143, 34, 54),
|
||||||
|
(12, 75, 6008, 2933, 159, 104, 145, 34, 55),
|
||||||
|
(12, 76, 6381, 3045, 162, 106, 148, 34, 56),
|
||||||
|
(12, 77, 6778, 3158, 165, 108, 151, 35, 57),
|
||||||
|
(12, 78, 7198, 3270, 168, 109, 153, 35, 57),
|
||||||
|
(12, 79, 7646, 3383, 171, 111, 156, 35, 58),
|
||||||
|
(12, 80, 8121, 3496, 174, 113, 159, 36, 59);
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
-- mod-paragon: starter weapon / armor skills for class 12 (Paragon).
|
||||||
|
--
|
||||||
|
-- Companion to 2026_05_10_00.sql. The spawn-data migration teaches
|
||||||
|
-- Player::Create *that* class 12 exists at a given race; this one
|
||||||
|
-- teaches it which weapon and armor skill lines to grant on first
|
||||||
|
-- character login.
|
||||||
|
--
|
||||||
|
-- Without these rows a fresh Paragon character lands in their newbie
|
||||||
|
-- zone with **no** weapon or armor proficiencies (auto-attack greys
|
||||||
|
-- out the moment they equip anything beyond a fist). The classMask=0
|
||||||
|
-- "all classes" rows in playercreateinfo_skills only cover Defense,
|
||||||
|
-- Unarmed, Cloth, the racial / language skills, Mounts and
|
||||||
|
-- Companion Pets -- which is exactly what bare-fisted, naked
|
||||||
|
-- characters look like.
|
||||||
|
--
|
||||||
|
-- Paragon plays every class, so it grants every weapon / armor
|
||||||
|
-- proficiency at level 1. The skillline rows themselves are still
|
||||||
|
-- gated by skillraceclassinfo_dbc (handled in 2026_05_09_00.sql),
|
||||||
|
-- so the client/server agree on what's allowed.
|
||||||
|
--
|
||||||
|
-- Idempotent: deletes any pre-existing classMask=2048 rows first
|
||||||
|
-- (class 12 owns this bitmask on Fractured) so the migration can
|
||||||
|
-- replay cleanly on a partially-seeded DB.
|
||||||
|
|
||||||
|
DELETE FROM `playercreateinfo_skills` WHERE `classMask` = 2048;
|
||||||
|
|
||||||
|
INSERT INTO `playercreateinfo_skills`
|
||||||
|
(`raceMask`, `classMask`, `skill`, `rank`, `comment`) VALUES
|
||||||
|
-- Weapon proficiencies
|
||||||
|
(0, 2048, 43, 0, 'Paragon - Swords'),
|
||||||
|
(0, 2048, 44, 0, 'Paragon - Axes'),
|
||||||
|
(0, 2048, 45, 0, 'Paragon - Bows'),
|
||||||
|
(0, 2048, 46, 0, 'Paragon - Guns'),
|
||||||
|
(0, 2048, 54, 0, 'Paragon - Maces'),
|
||||||
|
(0, 2048, 55, 0, 'Paragon - Two-Handed Swords'),
|
||||||
|
(0, 2048, 118, 0, 'Paragon - Dual Wield'),
|
||||||
|
(0, 2048, 136, 0, 'Paragon - Staves'),
|
||||||
|
(0, 2048, 160, 0, 'Paragon - Two-Handed Maces'),
|
||||||
|
(0, 2048, 172, 0, 'Paragon - Two-Handed Axes'),
|
||||||
|
(0, 2048, 173, 0, 'Paragon - Daggers'),
|
||||||
|
(0, 2048, 176, 0, 'Paragon - Thrown'),
|
||||||
|
(0, 2048, 226, 0, 'Paragon - Crossbows'),
|
||||||
|
(0, 2048, 228, 0, 'Paragon - Wands'),
|
||||||
|
(0, 2048, 229, 0, 'Paragon - Polearms'),
|
||||||
|
(0, 2048, 473, 0, 'Paragon - Fist Weapons'),
|
||||||
|
-- Armor proficiencies (Cloth is in a classMask=0 row already)
|
||||||
|
(0, 2048, 293, 0, 'Paragon - Plate Mail'),
|
||||||
|
(0, 2048, 413, 0, 'Paragon - Mail'),
|
||||||
|
(0, 2048, 414, 0, 'Paragon - Leather'),
|
||||||
|
(0, 2048, 433, 0, 'Paragon - Shield');
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,27 @@
|
|||||||
|
-- mod-paragon: Blood Elf "Arcane Torrent" uses three spell IDs in WotLK
|
||||||
|
-- (28730 mana/casters, 25046 rogue energy, 50613 death knight runic power),
|
||||||
|
-- all on racial skill line 756. Migration 2026_05_10_02 OR'd class 12 into
|
||||||
|
-- every SkillLineAbility delta from patch-enUS-4, so Paragon Blood Elves
|
||||||
|
-- auto-learned all three and the spellbook showed three identical entries.
|
||||||
|
--
|
||||||
|
-- Paragon should learn a single combined Arcane Torrent that refunds mana,
|
||||||
|
-- energy, AND runic power -- whichever pool the character is using at the
|
||||||
|
-- moment. We keep spell 28730 as the in-book entry for class 12 and attach
|
||||||
|
-- the SpellScript spell_paragon_arcane_torrent (modules/mod-paragon/src/
|
||||||
|
-- Paragon_SC.cpp) so casts by a Paragon also EnergizeBySpell energy + RP on
|
||||||
|
-- top of the stock mana effect. Other classes' Blood Elves are unaffected.
|
||||||
|
--
|
||||||
|
-- IDs 13338 / 17510 match stock WotLK SkillLineAbility rows for spells 25046
|
||||||
|
-- / 50613 on skill line 756.
|
||||||
|
|
||||||
|
UPDATE `skilllineability_dbc`
|
||||||
|
SET `ClassMask` = `ClassMask` & ~2048
|
||||||
|
WHERE `ID` IN (13338, 17510);
|
||||||
|
|
||||||
|
-- Bind spell_paragon_arcane_torrent (defined in Paragon_SC.cpp) to spell
|
||||||
|
-- 28730. AC's `spell_script_names` is the standard mapping: script name on
|
||||||
|
-- the right, spell id on the left. Idempotent via DELETE + INSERT.
|
||||||
|
DELETE FROM `spell_script_names`
|
||||||
|
WHERE `spell_id` = 28730 AND `ScriptName` = 'spell_paragon_arcane_torrent';
|
||||||
|
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||||
|
(28730, 'spell_paragon_arcane_torrent');
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
-- mod-paragon: extend ItemTemplate::AllowableClass to include class 12
|
||||||
|
-- (Paragon, bit 1<<11 = 2048) for every class-restricted item.
|
||||||
|
--
|
||||||
|
-- Server-side, Player::CanUseItem (PlayerStorage.cpp) already short-
|
||||||
|
-- circuits the AllowableClass check for class 12. That's enough for any
|
||||||
|
-- code path the server controls (vendor list filter, AH "usable" filter,
|
||||||
|
-- CanRollForItemInLFG, CanBuyItem). It is NOT enough on the 3.3.5 client:
|
||||||
|
-- the WoW.exe binary independently pre-checks AllowableClass against the
|
||||||
|
-- player's class on right-click of a bag item and refuses *locally* with
|
||||||
|
-- the red "You can't use that item." text in UIErrorsFrame, never sending
|
||||||
|
-- CMSG_USE_ITEM at all. Server logs stay silent; only client knows it
|
||||||
|
-- refused.
|
||||||
|
--
|
||||||
|
-- Fix: OR class 12's bit into AllowableClass on every class-restricted
|
||||||
|
-- row so the client engine's pre-check passes for Paragon. Other
|
||||||
|
-- classes' bits are unchanged, so e.g. a warrior-only item is still
|
||||||
|
-- warrior-only for everyone except Paragon. Items with AllowableClass
|
||||||
|
-- == -1 ("all classes") or 0 ("no restriction recorded") already pass
|
||||||
|
-- the client engine's check and are not touched.
|
||||||
|
--
|
||||||
|
-- After applying this migration the *client* still caches item info in
|
||||||
|
-- Cache/<locale>/itemcache.wdb. Players who already inspected the item
|
||||||
|
-- before the change must delete that file (or the whole Cache folder)
|
||||||
|
-- and reconnect to repopulate it from the worldserver, otherwise the
|
||||||
|
-- stale cached AllowableClass keeps the engine pre-check failing.
|
||||||
|
|
||||||
|
UPDATE `item_template`
|
||||||
|
SET `AllowableClass` = `AllowableClass` | 2048
|
||||||
|
WHERE `AllowableClass` > 0
|
||||||
|
AND (`AllowableClass` & 2048) = 0;
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
-- mod-paragon: backfill paragon_spell_ae_cost rows for spells newly exposed
|
||||||
|
-- by the Character Advancement panel after removing the over-aggressive
|
||||||
|
-- ClassMask=0 filter from tools/_gen_paragon_advancement_spells_lua.py.
|
||||||
|
--
|
||||||
|
-- The base file (data/sql/db-world/base/paragon_spell_ae_cost.sql) was
|
||||||
|
-- regenerated alongside this migration so fresh deployments already have
|
||||||
|
-- these rows. Existing servers do not re-run base files on content change,
|
||||||
|
-- so this update inserts the new (spell_id, ae_cost) pairs idempotently.
|
||||||
|
-- INSERT IGNORE keeps any per-row tuning a server operator may have already
|
||||||
|
-- applied to spell_ids that happen to overlap.
|
||||||
|
--
|
||||||
|
-- New ids include: 51505 Lava Burst (Shaman), 12051 Evocation / 1066 Aqueous
|
||||||
|
-- Form / Hex / Mage Ward / Spellsteal (Mage), 53351 Kill Shot / 19263
|
||||||
|
-- Deterrence / 53271 Master's Call (Hunter), 3714 Path of Frost / 57330
|
||||||
|
-- Horn of Winter / 56815 Rune Strike / 61999 Raise Ally / 56222 Dark Command
|
||||||
|
-- (DK), and 39 other trainer-taught class abilities whose stock
|
||||||
|
-- SkillLineAbility.dbc rows have ClassMask=0 (the skill line itself pins the
|
||||||
|
-- class for these rows; ClassMask is redundant on class-spec lines).
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `paragon_spell_ae_cost` (`spell_id`, `ae_cost`) VALUES
|
||||||
|
(66, 1), -- Invisibility (Mage)
|
||||||
|
(126, 1), -- Eye of Kilrogg (Warlock)
|
||||||
|
(526, 1), -- Cure Toxins (Shaman)
|
||||||
|
(688, 1), -- Summon Imp (Warlock)
|
||||||
|
(691, 1), -- Summon Felhunter (Warlock)
|
||||||
|
(697, 1), -- Summon Voidwalker (Warlock)
|
||||||
|
(712, 1), -- Summon Succubus (Warlock)
|
||||||
|
(768, 1), -- Cat Form (Druid)
|
||||||
|
(783, 1), -- Travel Form (Druid)
|
||||||
|
(1066, 1), -- Aqueous Form (Mage)
|
||||||
|
(2894, 1), -- Fire Resistance Totem (Shaman)
|
||||||
|
(3714, 1), -- Path of Frost (DK)
|
||||||
|
(5215, 1), -- Prowl (Druid)
|
||||||
|
(5487, 1), -- Bear Form (Druid)
|
||||||
|
(5504, 1), -- Conjure Refreshment (Mage)
|
||||||
|
(6795, 1), -- Growl (Druid)
|
||||||
|
(6807, 1), -- Maul (Druid)
|
||||||
|
(12051, 1), -- Evocation (Mage)
|
||||||
|
(19263, 1), -- Deterrence (Hunter)
|
||||||
|
(23161, 1), -- Summon Dreadsteed (Warlock)
|
||||||
|
(23214, 1), -- Summon Charger (Paladin)
|
||||||
|
(30449, 1), -- Spellsteal (Mage)
|
||||||
|
(33943, 1), -- Flight Form (Druid)
|
||||||
|
(34767, 1), -- Summon Felguard (Warlock)
|
||||||
|
(48018, 1), -- Demonic Circle: Summon (Warlock)
|
||||||
|
(50769, 1), -- Revive (Druid)
|
||||||
|
(51505, 1), -- Lava Burst (Shaman)
|
||||||
|
(51514, 1), -- Hex (Shaman)
|
||||||
|
(51730, 1), -- Earthliving Weapon (Shaman)
|
||||||
|
(52127, 1), -- Water Shield (Shaman)
|
||||||
|
(52610, 1), -- Savage Roar (Druid)
|
||||||
|
(53271, 1), -- Master's Call (Hunter)
|
||||||
|
(53351, 1), -- Kill Shot (Hunter)
|
||||||
|
(56222, 1), -- Dark Command (DK)
|
||||||
|
(56815, 1), -- Rune Strike (DK)
|
||||||
|
(57330, 1), -- Horn of Winter (DK)
|
||||||
|
(61999, 1), -- Raise Ally (DK)
|
||||||
|
(64843, 1), -- Divine Hymn (Priest)
|
||||||
|
(64901, 1), -- Hymn of Hope (Priest)
|
||||||
|
(66842, 1), -- Call of the Elements (Shaman totem set)
|
||||||
|
(66843, 1), -- Call of the Ancestors (Shaman totem set)
|
||||||
|
(66844, 1); -- Call of the Spirits (Shaman totem set)
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
-- mod-paragon: Predatory Strikes (16972 / 16974 / 16975) Cataclysm-style
|
||||||
|
-- finisher proc for CLASS_PARAGON characters.
|
||||||
|
--
|
||||||
|
-- The 3.3.5 Predatory Strikes is a passive AP / ranged-attack-power talent
|
||||||
|
-- with no proc payload. The Cataclysm redesign added "Predator's Swiftness"
|
||||||
|
-- (69369), which makes the next Nature spell <10s base cast time instant.
|
||||||
|
-- That buff already exists in the WotLK Spell.dbc (because Blizzard reused
|
||||||
|
-- the spell id), but no server-side trigger ever calls CastSpell(69369) on
|
||||||
|
-- a 3.3.5 server. We need both halves: the proc handler AND a spell_proc
|
||||||
|
-- row so the proc evaluator actually invokes our AuraScript.
|
||||||
|
--
|
||||||
|
-- AuraScript binding: spell_paragon_predatory_strikes is registered in
|
||||||
|
-- modules/mod-paragon/src/Paragon_SC.cpp. It checks
|
||||||
|
-- (a) caster is CLASS_PARAGON,
|
||||||
|
-- (b) source spell consumes combo points (NeedsComboPoints),
|
||||||
|
-- (c) source spell deals damage (DmgClass MELEE/RANGED + at least one
|
||||||
|
-- damage effect or periodic-damage aura -- filters Slice and Dice,
|
||||||
|
-- Savage Roar, Maim, Kidney Shot, Expose Armor, Recuperate),
|
||||||
|
-- then rolls a per-rank chance of (CP * 3 / 5 / 7)% to cast 69369 on
|
||||||
|
-- the caster.
|
||||||
|
--
|
||||||
|
-- spell_proc row params:
|
||||||
|
-- ProcFlags = 0x40000 = PROC_FLAG_DONE_SPELL_MELEE_DMG_CLASS
|
||||||
|
-- SpellTypeMask = 0x3 (DAMAGE | HEAL bitmask in proc engine; we
|
||||||
|
-- filter precisely in CheckProc anyway, the
|
||||||
|
-- mask just gates "spell-type events" through)
|
||||||
|
-- SpellPhaseMask = 0x2 = PROC_SPELL_PHASE_CAST -- fires DURING cast
|
||||||
|
-- so player->GetComboPoints() inside HandleProc
|
||||||
|
-- still returns the pre-_handle_finish_phase
|
||||||
|
-- value.
|
||||||
|
-- Chance = 100 (the per-CP chance is rolled inside the script)
|
||||||
|
--
|
||||||
|
-- Note: this row's SpellFamilyName / SpellFamilyMask are 0 so the proc
|
||||||
|
-- engine's IsAffected check is a wildcard at the entry-level. The
|
||||||
|
-- AuraScript's CheckProc owns all real filtering. Combined with Phase A
|
||||||
|
-- (Paragon SpellFamilyName wildcard) this is harmless on stock classes
|
||||||
|
-- because non-Paragon characters cannot learn Predatory Strikes via the
|
||||||
|
-- Character Advancement panel.
|
||||||
|
|
||||||
|
DELETE FROM `spell_script_names`
|
||||||
|
WHERE `spell_id` IN (16972, 16974, 16975)
|
||||||
|
AND `ScriptName` = 'spell_paragon_predatory_strikes';
|
||||||
|
|
||||||
|
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||||
|
(16972, 'spell_paragon_predatory_strikes'),
|
||||||
|
(16974, 'spell_paragon_predatory_strikes'),
|
||||||
|
(16975, 'spell_paragon_predatory_strikes');
|
||||||
|
|
||||||
|
DELETE FROM `spell_proc` WHERE `SpellId` IN (16972, 16974, 16975);
|
||||||
|
|
||||||
|
INSERT INTO `spell_proc`
|
||||||
|
(`SpellId`, `SchoolMask`, `SpellFamilyName`,
|
||||||
|
`SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`,
|
||||||
|
`ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`,
|
||||||
|
`AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`,
|
||||||
|
`Chance`, `Cooldown`, `Charges`)
|
||||||
|
VALUES
|
||||||
|
(16972, 0, 0, 0, 0, 0, 0x40000, 0x3, 0x2, 0, 0, 0, 0, 100.0, 0, 0),
|
||||||
|
(16974, 0, 0, 0, 0, 0, 0x40000, 0x3, 0x2, 0, 0, 0, 0, 100.0, 0, 0),
|
||||||
|
(16975, 0, 0, 0, 0, 0, 0x40000, 0x3, 0x2, 0, 0, 0, 0, 100.0, 0, 0);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
-- mod-paragon: Vampiric Embrace (15286) cross-family wildcard.
|
||||||
|
--
|
||||||
|
-- Stock 3.3.5 spell_proc row for Vampiric Embrace gates by SpellFamilyName=6
|
||||||
|
-- (PRIEST) plus a Priest-Shadow-damage SpellFamilyMask. That blocks the proc
|
||||||
|
-- engine from ever calling the AuraScript's CheckProc when a Paragon casts a
|
||||||
|
-- non-Priest Shadow-school spell (e.g. Warlock Shadow Bolt, Death Knight
|
||||||
|
-- Death Coil, etc.), because IsAffected's familyFlags gate fails before
|
||||||
|
-- CheckProc runs even though the Phase A wildcard already loosens the
|
||||||
|
-- familyName equality test (see SpellInfo::IsAffected, listenerOwner overload).
|
||||||
|
--
|
||||||
|
-- We relax this row so:
|
||||||
|
-- * SchoolMask=32 (SHADOW) kept -- proc-engine still gates by school
|
||||||
|
-- * SpellTypeMask=1 (DAMAGE) kept -- only damage events trigger CheckProc
|
||||||
|
-- * SpellPhaseMask=2 (HIT) kept -- post-hit phase
|
||||||
|
-- * AttributesMask=2 (TRIGGERED) kept -- triggered-spell payloads still proc
|
||||||
|
-- * SpellFamilyName=0 wildcard -- IsAffected short-circuits to true
|
||||||
|
-- * SpellFamilyMask{0,1,2}=0 wildcard -- no flag-bit gating at this layer
|
||||||
|
--
|
||||||
|
-- Real filtering moves into spell_pri_vampiric_embrace::CheckProc, which
|
||||||
|
-- branches on IsParagonWildcardCaller(GetTarget()):
|
||||||
|
--
|
||||||
|
-- * For Paragon owners with `Paragon.WildcardFamilyMatching = 1`, accept any
|
||||||
|
-- single-target Shadow-school spell (Mind Sear / AoE shadow spells like
|
||||||
|
-- Seed of Corruption / Hellfire are filtered there via IsAffectingArea
|
||||||
|
-- and the existing Mind Sear bit-mask).
|
||||||
|
--
|
||||||
|
-- * For stock Priest owners (and for the non-wildcard runtime path), the
|
||||||
|
-- CheckProc re-enforces the EXACT original gate -- SpellFamilyName=6 plus
|
||||||
|
-- the original 0x0280A010 / 0x00002402 / 0x00000008 SpellFamilyMask bits
|
||||||
|
-- -- so behavior is byte-identical to before this change for any caster
|
||||||
|
-- that is not a Paragon.
|
||||||
|
--
|
||||||
|
-- Net effect: Paragon characters with VE learned now leech-heal off any
|
||||||
|
-- single-target Shadow spell they cast (Death Coil, Shadow Bolt, Searing
|
||||||
|
-- Pain, Drain Soul, etc.); stock Shadow Priests are unchanged.
|
||||||
|
|
||||||
|
DELETE FROM `spell_proc` WHERE `SpellId` = 15286;
|
||||||
|
|
||||||
|
INSERT INTO `spell_proc`
|
||||||
|
(`SpellId`, `SchoolMask`, `SpellFamilyName`,
|
||||||
|
`SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`,
|
||||||
|
`ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`,
|
||||||
|
`AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`,
|
||||||
|
`Chance`, `Cooldown`, `Charges`)
|
||||||
|
VALUES
|
||||||
|
(15286, 32, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 0, 0, 0, 0);
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
-- mod-paragon: Maelstrom Weapon (53817) cross-family wildcard.
|
||||||
|
--
|
||||||
|
-- Stock 3.3.5 spell_proc row for Maelstrom Weapon gates by SpellFamilyName=11
|
||||||
|
-- (SHAMAN) plus a Shaman SpellFamilyMask covering Lightning Bolt, Chain
|
||||||
|
-- Lightning, Lesser Healing Wave, Healing Wave and Hex (Mask0=451,
|
||||||
|
-- Mask1=32768). The proc engine therefore never delivers an event to the
|
||||||
|
-- AuraScript when a Paragon casts a non-Shaman cast-time spell, even if the
|
||||||
|
-- IsAffected wildcard relaxes SpellFamilyName equality (the SpellFamilyMask
|
||||||
|
-- AND-with-target-FamilyFlags check still fails because Mage / Warlock /
|
||||||
|
-- Druid spell-class bits do not overlap with Shaman bits).
|
||||||
|
--
|
||||||
|
-- We relax this row so:
|
||||||
|
-- * SchoolMask=0 wildcard -- proc engine no longer gates by school
|
||||||
|
-- * SpellTypeMask=1 (DAMAGE) kept -- only damage spells trigger CheckProc
|
||||||
|
-- * SpellPhaseMask=8 (FINISH) kept -- post-cast phase, on cast finish
|
||||||
|
-- * SpellFamilyName=0 wildcard -- IsAffected short-circuits to true
|
||||||
|
-- * SpellFamilyMask{0,1,2}=0 wildcard -- no flag-bit gating at this layer
|
||||||
|
--
|
||||||
|
-- Real filtering moves into spell_sha_maelstrom_weapon::CheckProc:
|
||||||
|
--
|
||||||
|
-- * For stock Shaman owners (and for the non-wildcard runtime path), the
|
||||||
|
-- CheckProc re-enforces the EXACT original gate -- SpellFamilyName=11
|
||||||
|
-- plus the original Mask0=451 / Mask1=32768 bits -- so behavior is
|
||||||
|
-- byte-identical to before this change for any caster that is not a
|
||||||
|
-- Paragon.
|
||||||
|
--
|
||||||
|
-- * For Paragon owners with `Paragon.WildcardFamilyMatching = 1`, the
|
||||||
|
-- stock allowlist still passes, AND we additionally accept the curated
|
||||||
|
-- Mage cast-time nukes Fireball / Frostbolt / Arcane Blast (any rank,
|
||||||
|
-- matched via GetFirstRankSpell).
|
||||||
|
--
|
||||||
|
-- The matching IsAffectedBySpellMod hook in SpellInfo.cpp ensures the cast
|
||||||
|
-- time + power cost spellmods on aura 53817 also bridge across families for
|
||||||
|
-- the same Mage spell allowlist, so Paragons get the full Maelstrom Weapon
|
||||||
|
-- experience (instant cast at 5 stacks + reduced mana cost) on Fireball,
|
||||||
|
-- Frostbolt and Arcane Blast.
|
||||||
|
--
|
||||||
|
-- Net effect: Paragon characters with Maelstrom Weapon learned now spend
|
||||||
|
-- stacks on Mage cast-time nukes in addition to the stock Shaman list;
|
||||||
|
-- stock Enhancement Shamans are unchanged.
|
||||||
|
|
||||||
|
DELETE FROM `spell_proc` WHERE `SpellId` = 53817;
|
||||||
|
|
||||||
|
INSERT INTO `spell_proc`
|
||||||
|
(`SpellId`, `SchoolMask`, `SpellFamilyName`,
|
||||||
|
`SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`,
|
||||||
|
`ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`,
|
||||||
|
`AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`,
|
||||||
|
`Chance`, `Cooldown`, `Charges`)
|
||||||
|
VALUES
|
||||||
|
(53817, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0);
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
-- mod-paragon: Frostbite + Fingers of Frost cross-family wildcard.
|
||||||
|
--
|
||||||
|
-- Both talents are normally gated by SpellFamilyName=3 (MAGE) plus a Mage
|
||||||
|
-- SpellFamilyMask covering specific Mage Frost spells (Frostbolt / Frost Nova
|
||||||
|
-- / Cone of Cold / Blizzard / Frostfire Bolt / Deep Freeze for FoF; Frost
|
||||||
|
-- slow-applying spells for Frostbite). That blocks the proc engine from
|
||||||
|
-- delivering an event to the AuraScript when a Paragon casts a non-Mage
|
||||||
|
-- Frost-school chill effect (DK Howling Blast / Icy Touch / Chains of Ice,
|
||||||
|
-- Hunter Frost Trap, Shaman Frost Shock, etc.), because IsAffected's
|
||||||
|
-- familyFlags AND-with-target-FamilyFlags check fails before CheckProc runs
|
||||||
|
-- even after the Paragon family-name wildcard.
|
||||||
|
--
|
||||||
|
-- We relax these rows so:
|
||||||
|
-- * SchoolMask=16 (FROST) gate by Frost school at the proc engine
|
||||||
|
-- * SpellTypeMask=1 (DAMAGE) only damage events trigger CheckProc
|
||||||
|
-- * SpellPhaseMask=2 (HIT) post-hit phase
|
||||||
|
-- * AttributesMask=2 (TRIGGERED) triggered chill payloads still proc
|
||||||
|
-- * SpellFamilyName=0 wildcard -- IsAffected short-circuits to true
|
||||||
|
-- * SpellFamilyMask{0,1,2}=0 wildcard -- no flag-bit gating at this layer
|
||||||
|
--
|
||||||
|
-- Real filtering moves into the Mage AuraScripts:
|
||||||
|
--
|
||||||
|
-- spell_mage_fingers_of_frost_talent attached to 44543 / 44545
|
||||||
|
-- stock Mage : SpellFamilyName=MAGE AND original Mask0 0x100120 / Mask1 0x1000
|
||||||
|
-- Paragon : accept (FROST + DAMAGE gate already enforced)
|
||||||
|
--
|
||||||
|
-- spell_mage_frostbite attached to 11071 / 12496 / 12497
|
||||||
|
-- stock Mage : SpellFamilyName=MAGE AND original Mage Frost-slow Mask
|
||||||
|
-- (Frostbolt / Frost Nova / Cone of Cold / Blizzard / FFB)
|
||||||
|
-- Paragon : accept iff proc spell applies SPELL_AURA_MOD_DECREASE_SPEED
|
||||||
|
-- OR the Paragon already has a slow on the proc target
|
||||||
|
-- (covers the Improved-Blizzard-style "chill via separate
|
||||||
|
-- triggered aura" cross-class case)
|
||||||
|
--
|
||||||
|
-- Net effect: Paragon characters with these talents now have FoF / Frostbite
|
||||||
|
-- proc off cross-class Frost-school chill effects; stock Mages are unchanged.
|
||||||
|
|
||||||
|
DELETE FROM `spell_proc` WHERE `SpellId` IN (44543, 44545, 11071, 12496, 12497);
|
||||||
|
|
||||||
|
INSERT INTO `spell_proc`
|
||||||
|
(`SpellId`, `SchoolMask`, `SpellFamilyName`,
|
||||||
|
`SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`,
|
||||||
|
`ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`,
|
||||||
|
`AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`,
|
||||||
|
`Chance`, `Cooldown`, `Charges`)
|
||||||
|
VALUES
|
||||||
|
-- Fingers of Frost talent ranks (Chance 7% / 15% preserved from stock row).
|
||||||
|
(44543, 16, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 0, 7, 0, 0),
|
||||||
|
(44545, 16, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 0, 15, 0, 0),
|
||||||
|
-- Frostbite talent ranks (5% / 10% / 15% per rank, leave Chance=0 to use
|
||||||
|
-- the DBC ProcChance which already encodes the per-rank percentage).
|
||||||
|
(11071, 16, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 0, 0, 0, 0),
|
||||||
|
(12496, 16, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 0, 0, 0, 0),
|
||||||
|
(12497, 16, 0, 0, 0, 0, 0, 1, 2, 0, 2, 0, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
-- Bind the new AuraScripts (defined in src/server/scripts/Spells/spell_mage.cpp).
|
||||||
|
DELETE FROM `spell_script_names`
|
||||||
|
WHERE `spell_id` IN (44543, 44545, 11071, 12496, 12497)
|
||||||
|
AND `ScriptName` IN ('spell_mage_fingers_of_frost_talent', 'spell_mage_frostbite');
|
||||||
|
|
||||||
|
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||||
|
(44543, 'spell_mage_fingers_of_frost_talent'),
|
||||||
|
(44545, 'spell_mage_fingers_of_frost_talent'),
|
||||||
|
(11071, 'spell_mage_frostbite'),
|
||||||
|
(12496, 'spell_mage_frostbite'),
|
||||||
|
(12497, 'spell_mage_frostbite');
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
-- mod-paragon: Maelstrom Weapon (53817) spell_proc fixup.
|
||||||
|
--
|
||||||
|
-- The previous migration (2026_05_11_02.sql) had two bugs in the rewritten
|
||||||
|
-- spell_proc row that prevented stack consumption from firing at all -- not
|
||||||
|
-- just for our new Mage targets, but also for the stock Shaman cast-time
|
||||||
|
-- spells (Lightning Bolt, Chain Lightning, Lesser Healing Wave, etc.).
|
||||||
|
--
|
||||||
|
-- Bugs:
|
||||||
|
--
|
||||||
|
-- * SpellPhaseMask was set to 8. The valid values for SpellPhaseMask are
|
||||||
|
-- PROC_SPELL_PHASE_CAST = 1
|
||||||
|
-- PROC_SPELL_PHASE_HIT = 2
|
||||||
|
-- PROC_SPELL_PHASE_FINISH = 4
|
||||||
|
-- (see SpellMgr.h). Anything else, including 8, never matches a real
|
||||||
|
-- proc event, so the proc engine silently dropped every event before it
|
||||||
|
-- reached the AuraScript. The original stock row uses 1 (CAST), which
|
||||||
|
-- is what fires when the cast packet's setup phase completes -- exactly
|
||||||
|
-- when we want the spellmod-affected cast to consume the buff.
|
||||||
|
--
|
||||||
|
-- * AttributesMask was set to 0. The original stock row uses 8
|
||||||
|
-- PROC_ATTR_REQ_SPELLMOD = 0x8
|
||||||
|
-- which says "only proc on spells that were affected by one of this
|
||||||
|
-- aura's spellmods". This is the bridge between IsAffectedBySpellMod
|
||||||
|
-- (which records the aura into Spell::m_appliedMods when calculating
|
||||||
|
-- cast time / cost) and the proc system (which then knows that the cast
|
||||||
|
-- used the buff and should consume a charge). Without this attribute,
|
||||||
|
-- the proc would either fire too aggressively or not at all depending
|
||||||
|
-- on subsequent gating, but in practice the engine relies on it to
|
||||||
|
-- correlate spellmod use with stack consumption.
|
||||||
|
--
|
||||||
|
-- Fixed row keeps the same family/mask wildcards from the previous
|
||||||
|
-- migration (so the Paragon Mage allowlist in spell_sha_maelstrom_weapon's
|
||||||
|
-- CheckProc still gets the chance to filter), restores SpellPhaseMask=1
|
||||||
|
-- (CAST) and AttributesMask=8 (REQ_SPELLMOD) to match stock semantics, and
|
||||||
|
-- resets SpellTypeMask to 0 (any spell type -- the REQ_SPELLMOD attribute
|
||||||
|
-- already gates by "was the buff actually used", so an extra DAMAGE filter
|
||||||
|
-- is redundant and would block e.g. Lesser Healing Wave on stock Shamans).
|
||||||
|
--
|
||||||
|
-- This restores stock Shaman behavior byte-identically and lets Paragon
|
||||||
|
-- Mage casts also consume stacks via the IsAffectedBySpellMod allowlist.
|
||||||
|
|
||||||
|
DELETE FROM `spell_proc` WHERE `SpellId` = 53817;
|
||||||
|
|
||||||
|
INSERT INTO `spell_proc`
|
||||||
|
(`SpellId`, `SchoolMask`, `SpellFamilyName`,
|
||||||
|
`SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`,
|
||||||
|
`ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`,
|
||||||
|
`AttributesMask`, `DisableEffectsMask`, `ProcsPerMinute`,
|
||||||
|
`Chance`, `Cooldown`, `Charges`)
|
||||||
|
VALUES
|
||||||
|
(53817, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0);
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
-- mod-paragon: surface Savage Defense (62600) on the Druid Feral spell tab
|
||||||
|
-- of the Character Advancement panel.
|
||||||
|
--
|
||||||
|
-- The bake (tools/_gen_paragon_advancement_spells_lua.py) used to drop every
|
||||||
|
-- SPELL_ATTR0_PASSIVE spell up front, even when the trainer explicitly sells
|
||||||
|
-- it. That filter was correct for class-internal triggers (Feline Grace, etc.)
|
||||||
|
-- but kicked out Savage Defense -- a passive that DRUID trainer 33 sells at
|
||||||
|
-- level 40 (trainer_spell.sql line 2457). Bake now carves out a small
|
||||||
|
-- PASSIVE_TRAINER_ALLOWLIST so legitimate trainer-taught passives survive.
|
||||||
|
--
|
||||||
|
-- The base file (data/sql/db-world/base/paragon_spell_ae_cost.sql) was
|
||||||
|
-- regenerated alongside this migration so fresh deployments already have
|
||||||
|
-- this row. Existing servers do not re-run base files on content change,
|
||||||
|
-- so this update inserts the new (spell_id, ae_cost) pair idempotently.
|
||||||
|
-- INSERT IGNORE keeps any per-row tuning a server operator may have already
|
||||||
|
-- applied.
|
||||||
|
|
||||||
|
INSERT IGNORE INTO `paragon_spell_ae_cost` (`spell_id`, `ae_cost`) VALUES
|
||||||
|
(62600, 1); -- Savage Defense (Druid, trainer 33, level 40)
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
-- Fractured / Paragon: multidot Devouring Plague clone (spell IDs 951000-951008).
|
||||||
|
-- Spell rows live in the patched client Spell.dbc (see fractured-tooling
|
||||||
|
-- from-workspace-root/_patch_spell_dbc_paragon_multidot_devouring_plague.py).
|
||||||
|
-- Deploy the same Spell.dbc into the worldserver `data/dbc/` folder OR import
|
||||||
|
-- equivalent `spell_dbc` rows from a full exporter; stock SQL cannot express
|
||||||
|
-- the SpellEntryfmt NA padding columns safely in one INSERT here.
|
||||||
|
|
||||||
|
DELETE FROM `spell_ranks` WHERE `first_spell_id` = 951000;
|
||||||
|
INSERT INTO `spell_ranks` (`first_spell_id`,`spell_id`,`rank`) VALUES
|
||||||
|
(951000,951000,1),
|
||||||
|
(951000,951001,2),
|
||||||
|
(951000,951002,3),
|
||||||
|
(951000,951003,4),
|
||||||
|
(951000,951004,5),
|
||||||
|
(951000,951005,6),
|
||||||
|
(951000,951006,7),
|
||||||
|
(951000,951007,8),
|
||||||
|
(951000,951008,9);
|
||||||
|
|
||||||
|
DELETE FROM `paragon_spell_ae_cost` WHERE `spell_id` IN (2944,951000);
|
||||||
|
INSERT INTO `paragon_spell_ae_cost` (`spell_id`,`ae_cost`) VALUES (951000, 1);
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
-- Fractured / Paragon: spellbook tab for multidot Devouring Plague (951000 chain).
|
||||||
|
-- Shadow priest skill line (78); ClassMask 2064 matches mod-paragon SLA overlay.
|
||||||
|
-- Client: patched SkillLineAbility.dbc in patch-enUS-4 from the same script.
|
||||||
|
|
||||||
|
DELETE FROM `skilllineability_dbc` WHERE `ID` IN (1951000, 1951001, 1951002, 1951003, 1951004, 1951005, 1951006, 1951007, 1951008);
|
||||||
|
INSERT INTO `skilllineability_dbc` (`ID`,`SkillLine`,`Spell`,`RaceMask`,`ClassMask`,`ExcludeRace`,`ExcludeClass`,`MinSkillLineRank`,`SupercededBySpell`,`AcquireMethod`,`TrivialSkillLineRankHigh`,`TrivialSkillLineRankLow`,`CharacterPoints_1`,`CharacterPoints_2`) VALUES
|
||||||
|
(1951000,78,951000,0,2064,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951001,78,951001,0,2064,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951002,78,951002,0,2064,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951003,78,951003,0,2064,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951004,78,951004,0,2064,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951005,78,951005,0,2064,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951006,78,951006,0,2064,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951007,78,951007,0,2064,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951008,78,951008,0,2064,0,0,1,0,0,0,0,0,0);
|
||||||
+21
@@ -0,0 +1,21 @@
|
|||||||
|
-- Fractured / Paragon: Character Advancement stance/presence clones (951010-951015).
|
||||||
|
-- Client: patched Spell.dbc + SpellShapeshiftForm.dbc + SkillLineAbility.dbc in patch-enUS-4.MPQ.
|
||||||
|
-- Server: copy Spell.dbc + SpellShapeshiftForm.dbc into `data/dbc/` (SpellShapeshiftForm is not in stock MPQ); SkillLineAbility is DB-driven on server.
|
||||||
|
|
||||||
|
DELETE FROM `paragon_spell_ae_cost` WHERE `spell_id` IN (951010,951011,951012,951013,951014,951015);
|
||||||
|
INSERT INTO `paragon_spell_ae_cost` (`spell_id`,`ae_cost`) VALUES
|
||||||
|
(951010, 1),
|
||||||
|
(951011, 1),
|
||||||
|
(951012, 1),
|
||||||
|
(951013, 1),
|
||||||
|
(951014, 1),
|
||||||
|
(951015, 1);
|
||||||
|
|
||||||
|
DELETE FROM `skilllineability_dbc` WHERE `ID` IN (1951020,1951021,1951022,1951023,1951024,1951025);
|
||||||
|
INSERT INTO `skilllineability_dbc` (`ID`,`SkillLine`,`Spell`,`RaceMask`,`ClassMask`,`ExcludeRace`,`ExcludeClass`,`MinSkillLineRank`,`SupercededBySpell`,`AcquireMethod`,`TrivialSkillLineRankHigh`,`TrivialSkillLineRankLow`,`CharacterPoints_1`,`CharacterPoints_2`) VALUES
|
||||||
|
(1951020,26,951010,0,2049,0,0,1,0,2,0,0,0,0),
|
||||||
|
(1951021,257,951011,0,2049,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951022,256,951012,0,2049,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951023,770,951013,0,2080,0,0,1,0,2,0,0,0,0),
|
||||||
|
(1951024,771,951014,0,2080,0,0,1,0,0,0,0,0,0),
|
||||||
|
(1951025,772,951015,0,2080,0,0,1,0,0,0,0,0,0);
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
-- Fractured / Paragon: run spell_dk_presence on Character Advancement DK presence clones (951013-951015).
|
||||||
|
-- Spell.dbc sets SpellFamilyName=0 on these rows (see fractured-tooling/_patch_spell_dbc_paragon_stance_presence_clones.py)
|
||||||
|
-- so the stock client does not map them onto DK stance buttons; core still needs the aura script for Improved Presence.
|
||||||
|
|
||||||
|
DELETE FROM `spell_script_names` WHERE `spell_id` IN (951013, 951014, 951015);
|
||||||
|
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
|
||||||
|
(951013, 'spell_dk_presence'),
|
||||||
|
(951014, 'spell_dk_presence'),
|
||||||
|
(951015, 'spell_dk_presence');
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
-- Fractured / Paragon: Character Advancement stance/presence clones — spellbook + client bits.
|
||||||
|
-- 1) SkillLineAbility: DK presence clones belong on 770/771/772 (Blood/Frost/Unholy tabs), not 760 (General).
|
||||||
|
-- (760 was an experiment; stance bar visibility is driven by Spell.dbc AttributesEx2 USE_SHAPESHIFT_BAR.)
|
||||||
|
-- 2) Idempotent if rows already match.
|
||||||
|
|
||||||
|
UPDATE `skilllineability_dbc` SET `SkillLine` = 770 WHERE `ID` = 1951023 AND `Spell` = 951013;
|
||||||
|
UPDATE `skilllineability_dbc` SET `SkillLine` = 771 WHERE `ID` = 1951024 AND `Spell` = 951014;
|
||||||
|
UPDATE `skilllineability_dbc` SET `SkillLine` = 772 WHERE `ID` = 1951025 AND `Spell` = 951015;
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
-- Optional per-spell AE costs for Paragon spell purchases (.paragon learn).
|
|
||||||
-- Apply to the *world* database.
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `paragon_spell_ae_cost` (
|
|
||||||
`spell_id` INT UNSIGNED NOT NULL,
|
|
||||||
`ae_cost` SMALLINT UNSIGNED NOT NULL DEFAULT '2',
|
|
||||||
PRIMARY KEY (`spell_id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='mod-paragon: AE cost per spell';
|
|
||||||
|
|
||||||
-- Example (uncomment to use):
|
|
||||||
-- INSERT INTO `paragon_spell_ae_cost` (`spell_id`, `ae_cost`) VALUES (55050, 2);
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -5,15 +5,24 @@
|
|||||||
* so Paragon can reuse other classes' mechanics in narrowly scoped contexts.
|
* so Paragon can reuse other classes' mechanics in narrowly scoped contexts.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "Chat.h"
|
||||||
|
#include "Config.h"
|
||||||
|
#include "Creature.h"
|
||||||
|
#include "CreatureData.h"
|
||||||
|
#include "GameTime.h"
|
||||||
|
#include "Log.h"
|
||||||
|
#include "ObjectGuid.h"
|
||||||
|
#include "Pet.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "ScriptMgr.h"
|
#include "ScriptMgr.h"
|
||||||
#include "SharedDefines.h"
|
#include "SharedDefines.h"
|
||||||
#include "UnitDefines.h"
|
#include "SpellScript.h"
|
||||||
#include "Config.h"
|
#include "SpellScriptLoader.h"
|
||||||
#include "Log.h"
|
#include "WorldPacket.h"
|
||||||
#include "GameTime.h"
|
#include "WorldSession.h"
|
||||||
#include "ObjectGuid.h"
|
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
class Paragon_PlayerScript : public PlayerScript
|
class Paragon_PlayerScript : public PlayerScript
|
||||||
@@ -30,7 +39,7 @@ public:
|
|||||||
{
|
{
|
||||||
LOG_INFO("module", "[paragon] Paragon_PlayerScript registered "
|
LOG_INFO("module", "[paragon] Paragon_PlayerScript registered "
|
||||||
"(MultiResource.HasActivePowers={})",
|
"(MultiResource.HasActivePowers={})",
|
||||||
sConfigMgr->GetOption<bool>("Paragon.MultiResource.HasActivePowers", false));
|
sConfigMgr->GetOption<bool>("Paragon.MultiResource.HasActivePowers", true));
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] Optional<bool> OnPlayerIsClass(Player const* player, Classes unitClass, ClassContext context) override
|
[[nodiscard]] Optional<bool> OnPlayerIsClass(Player const* player, Classes unitClass, ClassContext context) override
|
||||||
@@ -38,27 +47,218 @@ public:
|
|||||||
if (!player || player->getClass() != CLASS_PARAGON)
|
if (!player || player->getClass() != CLASS_PARAGON)
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
|
|
||||||
// Death Knight rune / runic power ability stack (narrow on purpose).
|
// ============================================================
|
||||||
if (unitClass == CLASS_DEATH_KNIGHT && context == CLASS_CONTEXT_ABILITY)
|
// Ability stack -- claim ALL nine vanilla classes.
|
||||||
|
// ============================================================
|
||||||
|
// CLASS_CONTEXT_ABILITY is read by every class-specific spell
|
||||||
|
// gate in core / scripts: DK rune mechanics (Spell.cpp,
|
||||||
|
// SpellEffects.cpp, spell_dk.cpp, SpellAuraEffects.cpp),
|
||||||
|
// Warrior Titan's Grip / Bladestorm (Player.cpp 3783, 15432,
|
||||||
|
// PlayerUpdates.cpp 1547), Paladin Rebuke (Player.cpp 15441),
|
||||||
|
// Shaman dual-wield bookkeeping (Player.cpp 5028), Hunter pet
|
||||||
|
// / Hunter's Mark gates (spell_item.cpp 3718), Druid Insect
|
||||||
|
// Swarm / Wild Growth (SpellAuraEffects.cpp 2153, 2232),
|
||||||
|
// Priest Spirit of Redemption out-of-bounds check (Unit.cpp
|
||||||
|
// 14238), Rogue pickpocketing (LootHandler.cpp 86/165/385,
|
||||||
|
// Vehicle.cpp 80). Paragon learns abilities from every class
|
||||||
|
// through Character Advancement, so claiming all of them lets
|
||||||
|
// every gated spell script execute its class-specific branch
|
||||||
|
// for our players. The only downside is double-pathed scripts
|
||||||
|
// (e.g. a spell with both warrior and rogue branches) will
|
||||||
|
// pick whichever the script tests first -- acceptable.
|
||||||
|
if (context == CLASS_CONTEXT_ABILITY)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Warrior ability stack: enables warrior-spec ability gates anywhere
|
// ============================================================
|
||||||
// they're checked. None of the currently-traced sites in core/scripts
|
// Reactive melee states.
|
||||||
// gate on (CLASS_WARRIOR, CLASS_CONTEXT_ABILITY), so this is a safe
|
// ============================================================
|
||||||
// forward-compatible claim. Rage generation itself is gated on
|
// Warrior dodge -> AURA_STATE_DEFENSE (Overpower window).
|
||||||
// HasActivePowerType(POWER_RAGE) and is wired below.
|
// Hunter parry -> AURA_STATE_HUNTER_PARRY (Counterattack).
|
||||||
if (unitClass == CLASS_WARRIOR && context == CLASS_CONTEXT_ABILITY)
|
// We intentionally do NOT claim CLASS_ROGUE here:
|
||||||
return true;
|
// Unit::ProcDamageAndSpellFor (Unit.cpp 12824) skips the
|
||||||
|
// generic AURA_STATE_DEFENSE update on dodge for rogues so
|
||||||
// Reactive melee states: Overpower-on-dodge (warrior), Counterattack window (hunter).
|
// Riposte can take over. Claiming rogue would silently kill
|
||||||
// We intentionally do NOT claim CLASS_ROGUE here: that context skips the generic
|
// Overpower for Paragon, and Riposte already works for us via
|
||||||
// AURA_STATE_DEFENSE update on dodge (Riposte path) in Unit::ProcDamageAndSpellFor.
|
// the warrior-style state we already grant.
|
||||||
if (context == CLASS_CONTEXT_ABILITY_REACTIVE)
|
if (context == CLASS_CONTEXT_ABILITY_REACTIVE)
|
||||||
{
|
{
|
||||||
if (unitClass == CLASS_WARRIOR || unitClass == CLASS_HUNTER)
|
if (unitClass == CLASS_WARRIOR || unitClass == CLASS_HUNTER)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ============================================================
|
||||||
|
// Pet ownership contexts.
|
||||||
|
// ============================================================
|
||||||
|
// CLASS_CONTEXT_PET is read by Pet::AddToWorld, Pet::CreateBase
|
||||||
|
// AtCreatureInfo, Pet::InitStatsForLevel (twice -- the
|
||||||
|
// MAX_PET_TYPE bootstrap branch and the per-class attack-time
|
||||||
|
// scaling), Pet::IsPermanentPetFor, Player::SummonPet,
|
||||||
|
// Player::CanResummonPet, Spell::EffectTameCreature,
|
||||||
|
// SpellEffects.cpp (CreateTamedPet debug effects, Eyes of the
|
||||||
|
// Beast), spell_generic.cpp 1760 (charm-as-pet conversion),
|
||||||
|
// and PlayerGossip.cpp's hunter stable check.
|
||||||
|
//
|
||||||
|
// The cleanest disambiguation is by the *active pet's* shape:
|
||||||
|
// HUNTER_PET -> hunter (beast tame)
|
||||||
|
// SUMMON_PET + DEMON type -> warlock (Imp/VW/Succ/...)
|
||||||
|
// SUMMON_PET + UNDEAD type -> DK ghoul / Army of Dead
|
||||||
|
// SUMMON_PET + ELEMENTAL type -> mage water / shaman fire
|
||||||
|
// For HUNTER specifically the no-pet case is also claimed so
|
||||||
|
// Tame Beast's EffectTameCreature gate passes during cast.
|
||||||
|
if (context == CLASS_CONTEXT_PET)
|
||||||
|
{
|
||||||
|
Pet const* activePet = const_cast<Player*>(player)->GetPet();
|
||||||
|
|
||||||
|
// Hunter beast: claim during taming OR when a HUNTER_PET is
|
||||||
|
// already active. This is what makes Tame Beast / Call Pet
|
||||||
|
// / pet stable / Counterattack pet aura feedback work.
|
||||||
|
if (unitClass == CLASS_HUNTER)
|
||||||
|
{
|
||||||
|
if (!activePet || activePet->getPetType() == HUNTER_PET)
|
||||||
|
return true;
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
// All other classes only claim when an active SUMMON_PET is
|
||||||
|
// present. We then disambiguate by the creature's type
|
||||||
|
// because warlock / DK / mage / shaman all use SUMMON_PET.
|
||||||
|
if (!activePet || activePet->getPetType() != SUMMON_PET)
|
||||||
|
return std::nullopt;
|
||||||
|
|
||||||
|
CreatureTemplate const* tmpl = activePet->GetCreatureTemplate();
|
||||||
|
if (!tmpl)
|
||||||
|
return std::nullopt;
|
||||||
|
|
||||||
|
switch (unitClass)
|
||||||
|
{
|
||||||
|
case CLASS_WARLOCK:
|
||||||
|
// Drives Master Demonologist / Demonic Knowledge /
|
||||||
|
// Demonic Pact propagation, last-pet-spell tracking
|
||||||
|
// (Pet.cpp 112), and IsPermanentPetFor (Pet.cpp
|
||||||
|
// 2288) so demon pets persist across logins.
|
||||||
|
if (tmpl->type == CREATURE_TYPE_DEMON)
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
case CLASS_DEATH_KNIGHT:
|
||||||
|
// Risen Ghoul + Army of the Dead. Player.cpp 14354
|
||||||
|
// and Pet.cpp 243 / 1046 / 2290 read this; without
|
||||||
|
// it the ghoul is invisible to the owner mid-load
|
||||||
|
// and ScriptedAI hooks on the ghoul mis-route.
|
||||||
|
if (tmpl->type == CREATURE_TYPE_UNDEAD)
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
case CLASS_MAGE:
|
||||||
|
// Glyph-of-Eternal-Water permanent Water Elemental
|
||||||
|
// (entry 510, 37994). Used by Pet.cpp 1047/2292.
|
||||||
|
if (tmpl->type == CREATURE_TYPE_ELEMENTAL)
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
case CLASS_SHAMAN:
|
||||||
|
// Fire Elemental / Earth Elemental. The base
|
||||||
|
// engine spawns these as creatures rather than
|
||||||
|
// proper Pet instances in most code paths, so the
|
||||||
|
// claim mostly matters for the Pet.cpp 1045 stat
|
||||||
|
// bootstrap when one is loaded as a SUMMON_PET.
|
||||||
|
if (tmpl->type == CREATURE_TYPE_ELEMENTAL)
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warlock pet-charm context (Enslave Demon -- Unit.cpp 14828,
|
||||||
|
// 14894, 15025). Without this claim, charming a demon as a
|
||||||
|
// Paragon doesn't get the warlock-flavor charm semantics
|
||||||
|
// (faction-set-on-charm, action-bar layout, charm-break logic).
|
||||||
|
if (unitClass == CLASS_WARLOCK && context == CLASS_CONTEXT_PET_CHARM)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// ============================================================
|
||||||
|
// Equipment contexts.
|
||||||
|
// ============================================================
|
||||||
|
// CLASS_CONTEXT_EQUIP_RELIC: PlayerStorage.cpp 224-240 +
|
||||||
|
// 2475-2493. Routes Librams/Idols/Totems/Misc/Sigils into
|
||||||
|
// EQUIPMENT_SLOT_RANGED for the matching class. Claim every
|
||||||
|
// relic-bearing class so a Paragon can drop any of them into
|
||||||
|
// the ranged slot.
|
||||||
|
if (context == CLASS_CONTEXT_EQUIP_RELIC)
|
||||||
|
{
|
||||||
|
switch (unitClass)
|
||||||
|
{
|
||||||
|
case CLASS_PALADIN:
|
||||||
|
case CLASS_DRUID:
|
||||||
|
case CLASS_SHAMAN:
|
||||||
|
case CLASS_WARLOCK:
|
||||||
|
case CLASS_DEATH_KNIGHT:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CLASS_CONTEXT_EQUIP_ARMOR_CLASS: PlayerStorage.cpp 2326,
|
||||||
|
// 2330, 2503-2523. At level 40 each class auto-learns its
|
||||||
|
// top armor proficiency. Paragon should pick up plate (via
|
||||||
|
// paladin/DK), shields (paladin/warrior/shaman), mail
|
||||||
|
// (hunter/shaman), and leather (rogue) so the level-40 train
|
||||||
|
// event grants Paragon full proficiency and we don't have to
|
||||||
|
// hand-curate it through the Paragon proficiency SQL.
|
||||||
|
if (context == CLASS_CONTEXT_EQUIP_ARMOR_CLASS)
|
||||||
|
{
|
||||||
|
switch (unitClass)
|
||||||
|
{
|
||||||
|
case CLASS_PALADIN:
|
||||||
|
case CLASS_WARRIOR:
|
||||||
|
case CLASS_DEATH_KNIGHT:
|
||||||
|
case CLASS_HUNTER:
|
||||||
|
case CLASS_SHAMAN:
|
||||||
|
case CLASS_DRUID:
|
||||||
|
case CLASS_ROGUE:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CLASS_CONTEXT_EQUIP_SHIELDS: PlayerStorage.cpp 2467-2469.
|
||||||
|
// Lets a Paragon equip shields without a paladin/warrior/
|
||||||
|
// shaman skill gate.
|
||||||
|
if (context == CLASS_CONTEXT_EQUIP_SHIELDS)
|
||||||
|
{
|
||||||
|
switch (unitClass)
|
||||||
|
{
|
||||||
|
case CLASS_PALADIN:
|
||||||
|
case CLASS_WARRIOR:
|
||||||
|
case CLASS_SHAMAN:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CLASS_CONTEXT_WEAPON_SWAP: PlayerStorage.cpp 1920, 2838 --
|
||||||
|
// rogue uses cooldown spell 6123 instead of 6119 on weapon
|
||||||
|
// swap (Quick Draw / Combat Potency interactions). Claim
|
||||||
|
// rogue so Paragon picks up the same cooldown spell.
|
||||||
|
if (context == CLASS_CONTEXT_WEAPON_SWAP && unitClass == CLASS_ROGUE)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// ============================================================
|
||||||
|
// Contexts we DELIBERATELY DO NOT claim:
|
||||||
|
// ============================================================
|
||||||
|
// CLASS_CONTEXT_STATS -- Paragon has its own STR/AGI->AP and
|
||||||
|
// INT/SPI->SP curves wired in StatSystem.cpp's CLASS_PARAGON
|
||||||
|
// branch (level*2 + STR + AGI - 20 etc.). Claiming any
|
||||||
|
// vanilla class here would override our curves with theirs.
|
||||||
|
//
|
||||||
|
// CLASS_CONTEXT_INIT, _TELEPORT, _QUEST, _TAXI, _SKILL,
|
||||||
|
// _GRAVEYARD, _CLASS_TRAINER, _TALENT_POINT_CALC -- all
|
||||||
|
// used by DK Ebon Hold / druid Moonglade starting-zone
|
||||||
|
// scripts. Paragon doesn't go through those zones and we
|
||||||
|
// don't want our players bound to Acherus or trapped in
|
||||||
|
// the DK starting quest gates.
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +270,7 @@ public:
|
|||||||
if (power == POWER_RUNIC_POWER || power == POWER_RUNE)
|
if (power == POWER_RUNIC_POWER || power == POWER_RUNE)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (sConfigMgr->GetOption<bool>("Paragon.MultiResource.HasActivePowers", false))
|
if (sConfigMgr->GetOption<bool>("Paragon.MultiResource.HasActivePowers", true))
|
||||||
{
|
{
|
||||||
switch (power)
|
switch (power)
|
||||||
{
|
{
|
||||||
@@ -184,6 +384,45 @@ public:
|
|||||||
{
|
{
|
||||||
player->ResyncRunes(MAX_RUNES);
|
player->ResyncRunes(MAX_RUNES);
|
||||||
st.lastReadyMask = readyMask;
|
st.lastReadyMask = readyMask;
|
||||||
|
|
||||||
|
// Authoritative rune CD pump (PARAA "R RUNES cd0 cd1 ... cd5",
|
||||||
|
// ms remaining per slot, 0 = ready). The 3.3.5 client engine
|
||||||
|
// class-gates SMSG_RESYNC_RUNES / SMSG_SPELL_GO RUNE_LIST to DK,
|
||||||
|
// so the Paragon RuneFrame sim drives the visual entirely off
|
||||||
|
// COMBAT_LOG_EVENT_UNFILTERED:SPELL_CAST_SUCCESS. The combat log
|
||||||
|
// arrives ~100–200ms after the server already started the
|
||||||
|
// cooldown, so the client's local timer trails the server. When
|
||||||
|
// the user spams a rune spell, the server's slot refreshes
|
||||||
|
// first, accepts the next cast, but the client UI still shows
|
||||||
|
// CD remaining → "leak-through" past a greyed icon. Pushing the
|
||||||
|
// actual remaining ms on every mask transition keeps the
|
||||||
|
// visual locked to server state.
|
||||||
|
std::string body = "R RUNES";
|
||||||
|
for (uint8 i = 0; i < MAX_RUNES; ++i)
|
||||||
|
body += " " + std::to_string(player->GetRuneCooldown(i));
|
||||||
|
std::string const payload = std::string(kParagonAddonPrefix) + "\t" + body;
|
||||||
|
WorldPacket runePkt;
|
||||||
|
ChatHandler::BuildChatPacket(runePkt, CHAT_MSG_WHISPER, LANG_ADDON, player, player, payload);
|
||||||
|
player->SendDirectMessage(&runePkt);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Combo point pump: the 3.3.5 client engine class-gates SMSG_UPDATE_COMBO_POINTS
|
||||||
|
// to rogue / druid, so the Paragon UI sim never sees CP changes from
|
||||||
|
// Honor Among Thieves / Mutilate / etc. via either the engine state or
|
||||||
|
// the client-side combat-log inference (HAT's 51699 trigger fires with a
|
||||||
|
// null target and doesn't always emit SPELL_CAST_SUCCESS in the log).
|
||||||
|
// Push the count over PARAA whenever it changes; the addon's combo
|
||||||
|
// simulator listens for "R CP <n>" and overwrites paragonCP, so the
|
||||||
|
// ComboFrame on the target frame paints reliably.
|
||||||
|
int8 const cp = player->GetComboPoints();
|
||||||
|
if (cp != st.lastCp)
|
||||||
|
{
|
||||||
|
std::string const payload = std::string(kParagonAddonPrefix) + "\t"
|
||||||
|
+ fmt::format("R CP {}", int32(cp));
|
||||||
|
WorldPacket data;
|
||||||
|
ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_ADDON, player, player, payload);
|
||||||
|
player->SendDirectMessage(&data);
|
||||||
|
st.lastCp = cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sConfigMgr->GetOption<bool>("Paragon.Diag.RuneTrace", false))
|
if (!sConfigMgr->GetOption<bool>("Paragon.Diag.RuneTrace", false))
|
||||||
@@ -214,14 +453,197 @@ private:
|
|||||||
struct ParagonRuneSyncState
|
struct ParagonRuneSyncState
|
||||||
{
|
{
|
||||||
uint8 lastReadyMask{0xFFu}; // sentinel: no prior snapshot
|
uint8 lastReadyMask{0xFFu}; // sentinel: no prior snapshot
|
||||||
|
int8 lastCp{-1}; // sentinel: no prior snapshot
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static constexpr char const* kParagonAddonPrefix = "PARAA";
|
||||||
|
|
||||||
static std::unordered_map<ObjectGuid, ParagonRuneSyncState> runeSyncByGuid;
|
static std::unordered_map<ObjectGuid, ParagonRuneSyncState> runeSyncByGuid;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unordered_map<ObjectGuid, Paragon_PlayerScript::ParagonRuneSyncState> Paragon_PlayerScript::runeSyncByGuid;
|
std::unordered_map<ObjectGuid, Paragon_PlayerScript::ParagonRuneSyncState> Paragon_PlayerScript::runeSyncByGuid;
|
||||||
|
|
||||||
|
// Arcane Torrent (28730) for Paragon: Blood Elf racial skill line 756 has
|
||||||
|
// three Arcane Torrent variants in stock WotLK (28730 mana, 25046 rogue
|
||||||
|
// energy, 50613 DK runic power). For Paragon Blood Elves we keep only 28730
|
||||||
|
// (see migration 2026_05_10_03.sql) and turn it into a "combined" version:
|
||||||
|
// the stock spell already silences nearby enemies and energizes mana via its
|
||||||
|
// own effects; this script adds energy, rage, and runic power energize on
|
||||||
|
// top when the caster is class 12, so a single button refunds whichever
|
||||||
|
// resource pool the player is actually using. Non-Paragon casters are
|
||||||
|
// untouched and keep learning their stock racial variant.
|
||||||
|
class spell_paragon_arcane_torrent : public SpellScript
|
||||||
|
{
|
||||||
|
PrepareSpellScript(spell_paragon_arcane_torrent);
|
||||||
|
|
||||||
|
void HandleAfterCast()
|
||||||
|
{
|
||||||
|
Unit* caster = GetCaster();
|
||||||
|
if (!caster || !caster->IsPlayer())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Player* player = caster->ToPlayer();
|
||||||
|
if (player->getClass() != CLASS_PARAGON)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Stock energize amounts from spell_dbc:
|
||||||
|
// 25046 Arcane Torrent (Energy) -> 15 energy
|
||||||
|
// 50613 Arcane Torrent (Runic Power) -> 15 displayed RP (= 150
|
||||||
|
// internal; AC stores RP scaled 10x, see Player::SetMaxPower
|
||||||
|
// POWER_RUNIC_POWER, 1000).
|
||||||
|
// Rage uses the same 10x internal scaling as runic power (see
|
||||||
|
// Player.cpp:Regenerate where rage decay is `-20` for "2 rage by
|
||||||
|
// tick"), so 15 displayed rage = 150 internal.
|
||||||
|
// ModifyPower no-ops on pools the player has no max for, so this is
|
||||||
|
// safe even before the Paragon picks up energy/rage/RP abilities.
|
||||||
|
constexpr int32 kEnergyGain = 15;
|
||||||
|
constexpr int32 kRageGain = 150;
|
||||||
|
constexpr int32 kRunicPowerGain = 150;
|
||||||
|
|
||||||
|
SpellInfo const* spellInfo = GetSpellInfo();
|
||||||
|
uint32 const spellId = spellInfo ? spellInfo->Id : 28730u;
|
||||||
|
|
||||||
|
caster->EnergizeBySpell(player, spellId, kEnergyGain, POWER_ENERGY);
|
||||||
|
caster->EnergizeBySpell(player, spellId, kRageGain, POWER_RAGE);
|
||||||
|
caster->EnergizeBySpell(player, spellId, kRunicPowerGain, POWER_RUNIC_POWER);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Register() override
|
||||||
|
{
|
||||||
|
AfterCast += SpellCastFn(spell_paragon_arcane_torrent::HandleAfterCast);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Predatory Strikes (16972 / 16974 / 16975) for Paragon: re-implements the
|
||||||
|
// Cataclysm-era proc behavior of the talent so a Paragon's damaging
|
||||||
|
// finishers (Eviscerate / Envenom / Ferocious Bite / Rip / Rupture) can
|
||||||
|
// roll Predator's Swiftness (69369) -- the same buff that real druids
|
||||||
|
// get from the Cata redesign of this talent. Combined with the
|
||||||
|
// Spell::prepare interception in core (Spell.cpp), 69369 makes the
|
||||||
|
// Paragon's NEXT Nature-school spell with a base cast time below 10s
|
||||||
|
// instant cast: Chain Lightning, Lightning Bolt, Healing Touch, Wrath,
|
||||||
|
// Nourish, etc. -- not just the Druid-family Nature subset that the
|
||||||
|
// stock SPELLMOD_CASTING_TIME mask on 69369 covers.
|
||||||
|
//
|
||||||
|
// Filter logic:
|
||||||
|
// - Source spell must consume combo points (NeedsComboPoints() — gates
|
||||||
|
// out non-finisher combo-point builders).
|
||||||
|
// - "Damaging finisher": SPELL_ATTR1_FINISHING_MOVE_DAMAGE (Eviscerate,
|
||||||
|
// Envenom, Ferocious Bite, ...) OR a SPELL_ATTR1_FINISHING_MOVE_DURATION
|
||||||
|
// finisher that applies periodic damage (Rip, Rupture). Duration
|
||||||
|
// finishers that only heal (Recuperate) or only buff / CC / armor shred
|
||||||
|
// (Slice and Dice, Savage Roar, Kidney Shot, Maim, Expose Armor) are
|
||||||
|
// rejected.
|
||||||
|
//
|
||||||
|
// Chance per combo point matches the Cataclysm tuning that the user's
|
||||||
|
// client tooltip text reflects: rank 1 = 3% per CP, rank 2 = 5% per CP,
|
||||||
|
// rank 3 = 7% per CP. At 5 CP that is 15% / 25% / 35%, capped at 100%.
|
||||||
|
//
|
||||||
|
// Combo-point read happens during PROC_SPELL_PHASE_CAST, which fires in
|
||||||
|
// Spell::cast → Spell::ProcReflectProcs / Unit::ProcDamageAndSpellFor
|
||||||
|
// BEFORE Spell::_handle_finish_phase clears the player's combo points
|
||||||
|
// (see Spell.cpp:_handle_finish_phase clearing combo points). So
|
||||||
|
// player->GetComboPoints() inside HandleProc returns the pre-clear value.
|
||||||
|
class spell_paragon_predatory_strikes : public AuraScript
|
||||||
|
{
|
||||||
|
PrepareAuraScript(spell_paragon_predatory_strikes);
|
||||||
|
|
||||||
|
static constexpr uint32 SPELL_PARAGON_PREDATORS_SWIFTNESS = 69369;
|
||||||
|
|
||||||
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||||
|
{
|
||||||
|
return ValidateSpellInfo({ SPELL_PARAGON_PREDATORS_SWIFTNESS });
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CheckProc(ProcEventInfo& eventInfo)
|
||||||
|
{
|
||||||
|
SpellInfo const* spellInfo = eventInfo.GetSpellInfo();
|
||||||
|
if (!spellInfo || !spellInfo->NeedsComboPoints())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (spellInfo->HasAttribute(SPELL_ATTR1_FINISHING_MOVE_DAMAGE))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (spellInfo->HasAttribute(SPELL_ATTR1_FINISHING_MOVE_DURATION))
|
||||||
|
{
|
||||||
|
bool periodicHeal = false;
|
||||||
|
bool periodicDamage = false;
|
||||||
|
for (SpellEffectInfo const& eff : spellInfo->Effects)
|
||||||
|
{
|
||||||
|
if (eff.Effect != SPELL_EFFECT_APPLY_AURA && eff.Effect != SPELL_EFFECT_APPLY_AREA_AURA_PARTY
|
||||||
|
&& eff.Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (eff.ApplyAuraName)
|
||||||
|
{
|
||||||
|
case SPELL_AURA_PERIODIC_HEAL:
|
||||||
|
case SPELL_AURA_PERIODIC_HEALTH_FUNNEL:
|
||||||
|
case SPELL_AURA_OBS_MOD_HEALTH:
|
||||||
|
periodicHeal = true;
|
||||||
|
break;
|
||||||
|
case SPELL_AURA_PERIODIC_DAMAGE:
|
||||||
|
case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
|
||||||
|
case SPELL_AURA_PERIODIC_LEECH:
|
||||||
|
periodicDamage = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (periodicHeal)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return periodicDamage;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HandleProc(ProcEventInfo& eventInfo)
|
||||||
|
{
|
||||||
|
PreventDefaultAction();
|
||||||
|
|
||||||
|
Unit* actor = eventInfo.GetActor();
|
||||||
|
Player* player = actor ? actor->ToPlayer() : nullptr;
|
||||||
|
if (!player || player->getClass() != CLASS_PARAGON)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint8 const cp = player->GetComboPoints();
|
||||||
|
if (cp == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SpellInfo const* talent = GetSpellInfo();
|
||||||
|
if (!talent)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint32 pctPerCP = 0;
|
||||||
|
switch (talent->Id)
|
||||||
|
{
|
||||||
|
case 16972: pctPerCP = 3; break;
|
||||||
|
case 16974: pctPerCP = 5; break;
|
||||||
|
case 16975: pctPerCP = 7; break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 const chance = std::min<uint32>(100u, pctPerCP * uint32(cp));
|
||||||
|
if (!roll_chance_i(int32(chance)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
player->CastSpell(player, SPELL_PARAGON_PREDATORS_SWIFTNESS, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Register() override
|
||||||
|
{
|
||||||
|
DoCheckProc += AuraCheckProcFn(spell_paragon_predatory_strikes::CheckProc);
|
||||||
|
OnProc += AuraProcFn(spell_paragon_predatory_strikes::HandleProc);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void AddSC_paragon()
|
void AddSC_paragon()
|
||||||
{
|
{
|
||||||
new Paragon_PlayerScript();
|
new Paragon_PlayerScript();
|
||||||
|
RegisterSpellScript(spell_paragon_arcane_torrent);
|
||||||
|
RegisterSpellScript(spell_paragon_predatory_strikes);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
tab_width = 4
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
max_line_length = 80
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
### TITLE
|
||||||
|
## Type(Scope/Subscope): Commit ultra short explanation
|
||||||
|
## |---- Write below the examples with a maximum of 50 characters ----|
|
||||||
|
## Example 1: fix(DB/SAI): Missing spell to NPC Hogger
|
||||||
|
## Example 2: fix(CORE/Raid): Phase 2 of Ragnaros
|
||||||
|
## Example 3: feat(CORE/Commands): New GM command to do something
|
||||||
|
|
||||||
|
|
||||||
|
### DESCRIPTION
|
||||||
|
## Explain why this change is being made, what does it fix etc...
|
||||||
|
## |---- Write below the examples with a maximum of 72 characters per lines ----|
|
||||||
|
## Example: Hogger (id: 492) was not charging player when being engaged.
|
||||||
|
|
||||||
|
|
||||||
|
## Provide links to any issue, commit, pull request or other resource
|
||||||
|
## Example 1: Closes issue #23
|
||||||
|
## Example 2: Ported from other project's commit (link)
|
||||||
|
## Example 3: References taken from wowpedia / wowhead / wowwiki / https://wowgaming.altervista.org/aowow/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## =======================================================
|
||||||
|
## EXTRA INFOS
|
||||||
|
## =======================================================
|
||||||
|
## "Type" can be:
|
||||||
|
## feat (new feature)
|
||||||
|
## fix (bug fix)
|
||||||
|
## refactor (refactoring production code)
|
||||||
|
## style (formatting, missing semi colons, etc; no code change)
|
||||||
|
## docs (changes to documentation)
|
||||||
|
## test (adding or refactoring tests; no production code change)
|
||||||
|
## chore (updating bash scripts, git files etc; no production code change)
|
||||||
|
## --------------------
|
||||||
|
## Remember to
|
||||||
|
## Capitalize the subject line
|
||||||
|
## Use the imperative mood in the subject line
|
||||||
|
## Do not end the subject line with a period
|
||||||
|
## Separate subject from body with a blank line
|
||||||
|
## Use the body to explain what and why rather than how
|
||||||
|
## Can use multiple lines with "-" for bullet points in body
|
||||||
|
## --------------------
|
||||||
|
## More info here https://www.conventionalcommits.org/en/v1.0.0-beta.2/
|
||||||
|
## =======================================================
|
||||||
|
## "Scope" can be:
|
||||||
|
## CORE (core related, c++)
|
||||||
|
## DB (database related, sql)
|
||||||
|
## =======================================================
|
||||||
|
## "Subscope" is optional and depends on the nature of the commit.
|
||||||
|
## =======================================================
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
## AUTO-DETECT
|
||||||
|
## Handle line endings automatically for files detected as
|
||||||
|
## text and leave all files detected as binary untouched.
|
||||||
|
## This will handle all files NOT defined below.
|
||||||
|
* text=auto eol=lf
|
||||||
|
|
||||||
|
# Text
|
||||||
|
*.conf text
|
||||||
|
*.conf.dist text
|
||||||
|
*.cmake text
|
||||||
|
|
||||||
|
## Scripts
|
||||||
|
*.sh text
|
||||||
|
*.fish text
|
||||||
|
*.lua text
|
||||||
|
|
||||||
|
## SQL
|
||||||
|
*.sql text
|
||||||
|
|
||||||
|
## C++
|
||||||
|
*.c text
|
||||||
|
*.cc text
|
||||||
|
*.cxx text
|
||||||
|
*.cpp text
|
||||||
|
*.c++ text
|
||||||
|
*.hpp text
|
||||||
|
*.h text
|
||||||
|
*.h++ text
|
||||||
|
*.hh text
|
||||||
|
|
||||||
|
|
||||||
|
## For documentation
|
||||||
|
|
||||||
|
# Documents
|
||||||
|
*.doc diff=astextplain
|
||||||
|
*.DOC diff=astextplain
|
||||||
|
*.docx diff=astextplain
|
||||||
|
*.DOCX diff=astextplain
|
||||||
|
*.dot diff=astextplain
|
||||||
|
*.DOT diff=astextplain
|
||||||
|
*.pdf diff=astextplain
|
||||||
|
*.PDF diff=astextplain
|
||||||
|
*.rtf diff=astextplain
|
||||||
|
*.RTF diff=astextplain
|
||||||
|
|
||||||
|
## DOCUMENTATION
|
||||||
|
*.markdown text
|
||||||
|
*.md text
|
||||||
|
*.mdwn text
|
||||||
|
*.mdown text
|
||||||
|
*.mkd text
|
||||||
|
*.mkdn text
|
||||||
|
*.mdtxt text
|
||||||
|
*.mdtext text
|
||||||
|
*.txt text
|
||||||
|
AUTHORS text
|
||||||
|
CHANGELOG text
|
||||||
|
CHANGES text
|
||||||
|
CONTRIBUTING text
|
||||||
|
COPYING text
|
||||||
|
copyright text
|
||||||
|
*COPYRIGHT* text
|
||||||
|
INSTALL text
|
||||||
|
license text
|
||||||
|
LICENSE text
|
||||||
|
NEWS text
|
||||||
|
readme text
|
||||||
|
*README* text
|
||||||
|
TODO text
|
||||||
|
|
||||||
|
## GRAPHICS
|
||||||
|
*.ai binary
|
||||||
|
*.bmp binary
|
||||||
|
*.eps binary
|
||||||
|
*.gif binary
|
||||||
|
*.ico binary
|
||||||
|
*.jng binary
|
||||||
|
*.jp2 binary
|
||||||
|
*.jpg binary
|
||||||
|
*.jpeg binary
|
||||||
|
*.jpx binary
|
||||||
|
*.jxr binary
|
||||||
|
*.pdf binary
|
||||||
|
*.png binary
|
||||||
|
*.psb binary
|
||||||
|
*.psd binary
|
||||||
|
*.svg text
|
||||||
|
*.svgz binary
|
||||||
|
*.tif binary
|
||||||
|
*.tiff binary
|
||||||
|
*.wbmp binary
|
||||||
|
*.webp binary
|
||||||
|
|
||||||
|
|
||||||
|
## ARCHIVES
|
||||||
|
*.7z binary
|
||||||
|
*.gz binary
|
||||||
|
*.jar binary
|
||||||
|
*.rar binary
|
||||||
|
*.tar binary
|
||||||
|
*.zip binary
|
||||||
|
|
||||||
|
## EXECUTABLES
|
||||||
|
*.exe binary
|
||||||
|
*.pyc binary
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
name: core-build
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'master'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
uses: azerothcore/reusable-workflows/.github/workflows/core_build_modules.yml@main
|
||||||
|
with:
|
||||||
|
module_repo: ${{ github.event.repository.name }}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
!.gitignore
|
||||||
|
|
||||||
|
#
|
||||||
|
#Generic
|
||||||
|
#
|
||||||
|
|
||||||
|
.directory
|
||||||
|
.mailmap
|
||||||
|
*.orig
|
||||||
|
*.rej
|
||||||
|
*.*~
|
||||||
|
.hg/
|
||||||
|
*.kdev*
|
||||||
|
.DS_Store
|
||||||
|
CMakeLists.txt.user
|
||||||
|
*.bak
|
||||||
|
*.patch
|
||||||
|
*.diff
|
||||||
|
*.REMOTE.*
|
||||||
|
*.BACKUP.*
|
||||||
|
*.BASE.*
|
||||||
|
*.LOCAL.*
|
||||||
|
|
||||||
|
#
|
||||||
|
# IDE & other softwares
|
||||||
|
#
|
||||||
|
/.settings/
|
||||||
|
/.externalToolBuilders/*
|
||||||
|
# exclude in all levels
|
||||||
|
nbproject/
|
||||||
|
.sync.ffs_db
|
||||||
|
*.kate-swp
|
||||||
|
|
||||||
|
#
|
||||||
|
# Eclipse
|
||||||
|
#
|
||||||
|
*.pydevproject
|
||||||
|
.metadata
|
||||||
|
.gradle
|
||||||
|
tmp/
|
||||||
|
*.tmp
|
||||||
|
*.swp
|
||||||
|
*~.nib
|
||||||
|
local.properties
|
||||||
|
.settings/
|
||||||
|
.loadpath
|
||||||
|
.project
|
||||||
|
.cproject
|
||||||
@@ -0,0 +1,661 @@
|
|||||||
|
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 19 November 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU Affero General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works, specifically designed to ensure
|
||||||
|
cooperation with the community in the case of network server software.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
our General Public Licenses are intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
Developers that use our General Public Licenses protect your rights
|
||||||
|
with two steps: (1) assert copyright on the software, and (2) offer
|
||||||
|
you this License which gives you legal permission to copy, distribute
|
||||||
|
and/or modify the software.
|
||||||
|
|
||||||
|
A secondary benefit of defending all users' freedom is that
|
||||||
|
improvements made in alternate versions of the program, if they
|
||||||
|
receive widespread use, become available for other developers to
|
||||||
|
incorporate. Many developers of free software are heartened and
|
||||||
|
encouraged by the resulting cooperation. However, in the case of
|
||||||
|
software used on network servers, this result may fail to come about.
|
||||||
|
The GNU General Public License permits making a modified version and
|
||||||
|
letting the public access it on a server without ever releasing its
|
||||||
|
source code to the public.
|
||||||
|
|
||||||
|
The GNU Affero General Public License is designed specifically to
|
||||||
|
ensure that, in such cases, the modified source code becomes available
|
||||||
|
to the community. It requires the operator of a network server to
|
||||||
|
provide the source code of the modified version running there to the
|
||||||
|
users of that server. Therefore, public use of a modified version, on
|
||||||
|
a publicly accessible server, gives the public access to the source
|
||||||
|
code of the modified version.
|
||||||
|
|
||||||
|
An older license, called the Affero General Public License and
|
||||||
|
published by Affero, was designed to accomplish similar goals. This is
|
||||||
|
a different license, not a version of the Affero GPL, but Affero has
|
||||||
|
released a new version of the Affero GPL which permits relicensing under
|
||||||
|
this license.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, if you modify the
|
||||||
|
Program, your modified version must prominently offer all users
|
||||||
|
interacting with it remotely through a computer network (if your version
|
||||||
|
supports such interaction) an opportunity to receive the Corresponding
|
||||||
|
Source of your version by providing access to the Corresponding Source
|
||||||
|
from a network server at no charge, through some standard or customary
|
||||||
|
means of facilitating copying of software. This Corresponding Source
|
||||||
|
shall include the Corresponding Source for any work covered by version 3
|
||||||
|
of the GNU General Public License that is incorporated pursuant to the
|
||||||
|
following paragraph.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the work with which it is combined will remain governed by version
|
||||||
|
3 of the GNU General Public License.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU Affero General Public License from time to time. Such new versions
|
||||||
|
will be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU Affero General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU Affero General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU Affero General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published
|
||||||
|
by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If your software can interact with users remotely through a computer
|
||||||
|
network, you should also make sure that it provides a way for users to
|
||||||
|
get its source. For example, if your program is a web application, its
|
||||||
|
interface could display a "Source" link that leads users to an archive
|
||||||
|
of the code. There are many ways you could offer source, and different
|
||||||
|
solutions will be better for different programs; see section 13 for the
|
||||||
|
specific requirements.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user