Author SHA1 Message Date
Jman a63829a130 Exiles Reach: bind boar ride scene 2338 to its SceneScript (works without core change)
Move the Giant Boar ride scene triggers ('Trampling Time', 'Big Kill Credit', 'Knockback') from exiles_reach_general_playerscript::OnSceneTriggerEvent into a new scene_exiles_reach_boar_ride SceneScript, bound via scene_template.ScriptName (SQL included). Core dispatches these events to the bound SceneScript on every branch, so the boar trample spell works without the ScriptMgr.cpp PlayerScript fan-out change. 'Teleport' triggers stay in the PlayerScript hook.
2026-09-17 08:06:54 +10:00
devbox a17899e921 Exiles Reach: remove duplicate Garrick script-summon (DB spawn 730202 now provides him) 2026-08-26 13:43:21 +10:00
devbox 55da003626 DB/Exiles Reach: fix Garrick camp spawn z-height (91.001 to match ground) 2026-08-26 11:56:57 +10:00
devbox 9fe909427c DB/Exiles Reach: make quest flow SQL idempotent (delete-before-insert) 2026-08-26 11:32:53 +10:00
devbox 651845916f DB/Exiles Reach: add DB spawn for post-Torgak Captain Garrick (245394) at the camp so he's reliably visible as quest-giver 2026-08-26 11:17:02 +10:00
devbox cebef91f24 DB/Exiles Reach: remove reverted Hrun display change (keep original 92803) 2026-08-26 09:48:15 +10:00
devbox 1de4ff7967 DB/Exiles Reach: use correct post-Torgak reunion scene package (4778 Alliance / 4779 Horde) 2026-08-26 09:38:36 +10:00
devbox ca9d636424 DB/Exiles Reach: add gossip flag to ritual Meredy/Herbert so the Bloodbeak event can start 2026-08-26 09:00:47 +10:00
devbox 944bc6e8b2 Exiles Reach: give KilledMonsterCredit for Bloodbeak to complete the save-Meredy objective 2026-08-26 08:57:42 +10:00
devbox 76d463d664 DB/Exiles Reach: add questgiver flag to post-Torgak custom NPCs (245397/245667/245686) 2026-08-26 08:45:35 +10:00
devbox fb1f200652 DB/Exiles Reach: align all Dark Ritual storyline quest starters/enders with retail (68 quests, both factions) 2026-08-26 08:30:06 +10:00
devbox 975591fa5b DB/Exiles Reach: 58915 ends at Private Cole, not Hjalmar (revert incorrect ender) 2026-08-25 19:34:51 +10:00
devbox 1633cd2093 DB/Exiles Reach: correct post-Torgak quest flow (Garrick turns in 55639/85678, Hjalmar turns in 58915, remove Wrathion 55196 starter) 2026-08-25 19:30:46 +10:00
devbox 014c9cc2d0 Exiles Reach: remove GARRICK_15017 debug log 2026-08-25 19:22:02 +10:00
devbox 8ac8a3527b DB/Exiles Reach: add Hrun actor to Hrun's Barrow conversations 12120/14540 (fix missing actor) 2026-08-25 16:14:16 +10:00
devbox 36108f76f7 Exiles Reach: remove [ExilesReach] phase check debug log from ogre ruins 2026-08-25 15:50:40 +10:00
devbox b9b49adf03 DB/Exiles Reach: fix Hrun the Exiled invisible - use working Darkmaul Ogre display 2026-08-25 15:36:12 +10:00
devbox 3ce7f17005 DB: make reunion conversation SQL idempotent (clear rows before insert) 2026-08-24 22:20:36 +10:00
devbox 89aae3dfa9 Exiles Reach: play the post-ride reunion conversation (Wrathion + Jaina) and fix conversation line chaining 2026-08-24 22:01:12 +10:00
devbox 01824cf222 Exiles Reach: Captain Garrick gives Stocking Up after the ride; move her off the campfire 2026-08-24 20:35:38 +10:00
devbox 8b8aaffd70 Exiles Reach: Jaina + Garrick are separate camp NPCs after the ride
Jaina (156807) stays by Austin Huxworth at the rock edging (quest-giver);
add Captain Garrick (245394) as a separate NPC by the campfire. Both are
summoned on the ride reward.
2026-08-24 18:02:07 +10:00
devbox a0203a632e Exiles Reach: post-Torgak quest-giver is Jaina at the camp; Richter gets repair
- Revert the quest-giver from Captain Garrick (245394) back to Jaina
  (156807); she belongs at the camp next to the campfire by Quartermaster
  Richter, not in front of Wrathion. The scripted summon now places Jaina
  there on the ride reward.
- Quartermaster Richter (156800) was missing UNIT_NPC_FLAG_REPAIR (0x1000),
  so Repair Yourself (85678) couldn't be completed. Add the flag.
2026-08-24 17:57:56 +10:00
devbox 988874e403 Exiles Reach: script Captain Garrick's summon after the ride + questgiver flag
The phase-15017 regular spawn wasn't reliably showing Garrick (245394) for
the player. Summon him on the ride quest reward in front of Wrathion with
the QUESTGIVER npcflag set, so Stocking Up (55194) / Repair Yourself (85678)
are offered. Also set npcflag=2 on 245394 in the DB (it had 0, so it never
presented as a quest giver).
2026-08-24 17:25:40 +10:00
devbox a4b6ec1100 Scene debug: log scene plays on Exiles Reach (map 2175)
Logs which scene (id + package) plays for the ride/cinematic, so the
post-ride scene can be matched against the expected one.
2026-08-24 17:09:02 +10:00
devbox ad87475cd5 Exiles Reach: diagnostic logs for post-ride phase check / Garrick 15017
Log the player's area and quest state each phase-check tick, and the
GARRICK_15017 phase evaluation, to see why Captain Garrick (245394) doesn't
appear after the boar ride is rewarded.
2026-08-24 17:03:35 +10:00
devbox 60546b974f Exiles Reach: show Captain Garrick (245394) after Torgak to grant the next quests
- The post-Torgak quest-giver was 156807, which wrongly reused Jaina's model
  (88316), so it read as a duplicate Jaina. Point the phase-15017 spawn and
  the Stocking Up (55194) / Repair Yourself (85678) quest starters+enders at
  245394 (Captain Garrick, model 109008).
- GARRICK_BEFORE_DARKMAUL_CITADEL phase was only shown after MESSAGE_TO_BASE +
  WESTWARD_BOUND were rewarded, so Garrick never appeared right after the ride.
  Show it once the boar ride is rewarded, until the player heads to the citadel.
2026-08-24 16:37:24 +10:00
devbox cfe74126f5 Exiles Reach: diagnostic logs for abandon respawn
Log when the ride abandon is detected, how many undead are tracked, and the
spawnIds being forced to respawn — to pinpoint why the mobs don't come back.
2026-08-24 15:10:25 +10:00
devbox 2317f0fe7d Exiles Reach: fix ride-giver Jaina on Darkmaul Plains + respawn on abandon
- The ride-giver the player actually talks to is on the Darkmaul Plains
  (phase 13779), and its phase was removed when the ride was accepted
  (!QuestAccepted) — so Jaina vanished on accept. Show it until the ride is
  rewarded (matches the ogre-ruins GARRICK_CAMP fix).
- OnQuestStatusChange does NOT fire on quest abandon (RemoveActiveQuest
  erases the entry without the hook), so the respawn-on-abandon never ran.
  Detect the active->gone transition in OnPlayerWorldObjectUpdate and force
  the mowed-down undead to respawn (Map::Respawn), while keeping them dead
  on completion.
2026-08-24 14:27:33 +10:00
devbox c354643e47 DB/World: bind Giant Boar Trample script (305557)
Adds the spell_script_names row for spell_giant_boar_trample_305557 so a
fresh DB also has the trample's despawn behavior for the boar ride.
2026-08-24 14:01:58 +10:00
devbox 71e005e10f Exiles Reach: keep Horde ride-giver Shuja visible while the quest is active
Same fix as the Alliance GARRICK_CAMP phase: Shuja's phase was only shown
after QUEST_H_THE_REDEATHER completed, so she vanished when the ride began.
Show it while accepted or completed.
2026-08-24 13:50:29 +10:00
devbox f72d0be912 Exiles Reach: no follower on the boar ride; keep quest-giver Jaina visible
- Remove the 156807 follower summon on ride accept (it reuses Jaina's
  model 88316, so it read as a duplicate Jaina following you). Ride alone.
- GARRICK_CAMP phase was only shown after the ride was rewarded, so Jaina
  phased out the moment she gave the quest. Show it while the ride is
  accepted too.
2026-08-24 13:48:10 +10:00
devbox 0e9b9f7db8 Exiles Reach: despawn the undead by faction, not phase
The mobs' phase desync made IsValidAttackTarget fail, so the despawn loop
skipped them (they stayed alive and killed the rider when the ride ended).
Use IsHostileTo (faction-based, no phase check) in both the trample and the
Big Kill Credit despawning.
2026-08-24 13:30:24 +10:00
devbox 7670e0eb91 Exiles Reach: respawn the mowed-down undead if the ride quest is abandoned
Track the undead spawnIds despawned by the boar (1h respawn delay). On
quest abandon, force their respawn (Map::Respawn sets the pending respawn
time to now) so the ride can be retried; clear tracking on completion.
2026-08-24 13:18:22 +10:00
devbox 48f5b7e124 Exiles Reach: undead stay dead after the trample/credit (1h respawn delay)
The ogre-ruins undead are regular spawns, so DespawnOrUnsummon removed them
briefly then the spawn timer respawned them. Force a 1h respawn delay on
both the trample and the Big Kill Credit despawning so the mowed-down mobs
don't pop back during the ride.
2026-08-24 13:11:00 +10:00
devbox c797c0c576 Exiles Reach: despawn the trampled undead on Big Kill Credit + fix rider immunity
The trample's own grid search didn't reliably despawn the undead (they stayed
alive and attacked the rider). Tie the despawn to the 'Big Kill Credit' scene
event (which reliably fires as the ride progresses): despawn all hostile mobs
within 50y (excluding Torgok). Also apply the rider's UNIT_FLAG_IMMUNE_TO_NPC
on EFFECT_0 (CONTROL_VEHICLE) as well as EFFECT_1 so the mobs can't damage the
player.
2026-08-24 12:16:43 +10:00
devbox 3cfb6d2c99 Exiles Reach: trample despawns the undead outright
Kill+DespawnOrUnsummon left the corpses visible (regular spawns). Just
DespawnOrUnsummon the targets — the scene's 'Big Kill Credit' grants the
quest credit, so the mobs simply vanish when trampled.
2026-08-24 11:52:28 +10:00
devbox 1b15337809 Exiles Reach: trample mows the undead down (kill + despawn)
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s
The trample only dealt 120 damage, leaving healthier zombies/ogres alive
and visible. Kill and despawn each hostile target so the trampled army
actually disappears.
2026-08-23 22:27:40 +10:00
devbox 07e78803e2 Exiles Reach: rider immune to NPC damage while on the giant boar
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s
Some undead still hit the player during the boar ride (mobs that aggro on
sight, not via the trample). Set UNIT_FLAG_IMMUNE_TO_NPC on the player for
the ride's duration so mob attacks can't reach the rider (IsValidAttackTarget
checks target->IsImmuneToNPC); the boar takes the hits and the trample kills
the cadavers.
2026-08-23 22:18:44 +10:00
devbox 23dc67639f Exiles Reach: trample damage from the boar, not the rider
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s
The trample script dealt damage from the player (GetCaster), so the undead
aggro'd the rider and chewed through the player's health during the boar
ride. Attribute the trample damage to the boar vehicle (GetVehicleBase) so
the mobs attack the boar instead.
2026-08-23 22:09:06 +10:00
devbox 371e06dab9 Core: dispatch scene events to PlayerScripts too
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s
ScriptMgr::OnSceneTrigger/Cancel/Complete only called the bound SceneScript
(via scene_template.ScriptName). The Thordekk Exiles Reach ride (and other
scene-driven content) registers its handlers as PlayerScript hooks
(OnSceneTriggerEvent/OnSceneComplete/OnSceneCancel), so 'Trampling Time' and
'Big Kill Credit' never fired -> the Giant Boar trample never cast and the
cadaver kill credit never granted. Add the FOREACH_SCRIPT(PlayerScript)
dispatch to all three.
2026-08-23 18:53:22 +10:00
devbox c7a4bf966e Exiles Reach: revert ship sparring leash + fix trample script compile
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s
- Revert the Cole/Throg sparring distance-leash (exiles_reach_north_sea.cpp):
  it fought the clone's position/LOS desync on the ship (map 2261), making
  the clone run away and clip; back to the original combat chase while we
  investigate the position/LOS root cause.
- Fix spell_giant_boar_trample_305557 compile: CalcRadius returns SpellRange
  (use .Max) and DealDamage is static (Unit::DealDamage, uint32 damage).
2026-08-23 18:41:45 +10:00
devbox ffaac9ece6 Exiles Reach: implement Giant Boar Trample (305557)
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s
The trample's Effect 1 is a SPELL_EFFECT_DUMMY (radius 13, targets the
caster) that was never scripted, so it did nothing to the Monstrous
Cadavers (157091) during Ride of the Scientifically Enhanced Boar. Add a
spell script that damages all hostile creatures within the effect radius
(caster->DealDamage, effect value). Registered + spell_script_names row.
2026-08-23 18:36:53 +10:00
devbox b47740c125 Exiles Reach (ship): replace boundary-evade with a distance leash for the sparring clone
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s
The SetBoundary approach made the sparring partner evade back to home with a
straight spline, clipping through the boat hull. Use a distance leash in
UpdateAI instead: stop chasing past 15y and walk back on the ship geometry.
2026-08-23 17:40:55 +10:00
devbox 5072ad8f6f Exiles Reach: keep Monstrous Cadavers in-phase during the boar ride
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s
The Alliance ride (Ride of the Scientifically Enhanced Boar, 55879) hides
phase 13783 (PHASE_GENERAL_DARKMAUL_PLAINS_ZOMBIES_AND_CADAVERS) while the
player rides (HasAura(SPELL_RIDING_GIANT_BOAR) or quest accepted), so the
Monstrous Cadavers (157091, phase 13783) are server-side out of phase:
visible to the client but not valid attack targets -> the boar trample
deals 0 damage and the ride can't progress to Torgok. Keep the phase
active while the ride is incomplete (hidden only after it's rewarded).
Applied to the identical condition in ogre_ruins, darkmaul_plains and
hruns_barrow.
2026-08-23 17:36:56 +10:00
1118 changed files with 157931 additions and 479893 deletions
+170
View File
@@ -0,0 +1,170 @@
# =============================================================================
# TrinityCore Playerbot - Environment Variables Template
# =============================================================================
# Copy this file to .env and fill in your actual values
# NEVER commit the .env file to git!
# =============================================================================
# -----------------------------------------------------------------------------
# GitHub Integration
# -----------------------------------------------------------------------------
# Create a Personal Access Token at: https://github.com/settings/tokens
# Required scopes: repo, workflow, write:packages
GITHUB_TOKEN=ghp_your_github_personal_access_token_here
# Repository information
GITHUB_REPO_OWNER=TrinityCore
GITHUB_REPO_NAME=TrinityCore
GITHUB_BRANCH=playerbot-dev
# -----------------------------------------------------------------------------
# Database Access (Trinity MySQL Databases)
# -----------------------------------------------------------------------------
# MySQL connection for trinity-database MCP
TRINITY_DB_HOST=localhost
TRINITY_DB_PORT=3306
TRINITY_DB_USER=trinity
TRINITY_DB_PASSWORD=your_mysql_password_here
# Database names
TRINITY_DB_AUTH=trinity_auth
TRINITY_DB_CHARACTERS=trinity_characters
TRINITY_DB_WORLD=trinity_world
# -----------------------------------------------------------------------------
# MCP Authentication
# -----------------------------------------------------------------------------
# Serena MCP authentication token (OPTIONAL - only needed for token estimation features)
# Serena works without this - it's just a "nice to have" for advanced features
# Leave empty or remove line if not using token estimation
SERENA_AUTH_TOKEN=
# Context7 API key (OPTIONAL - only if you have a paid plan)
# Context7 has a generous free tier that works without API key
CONTEXT7_API_KEY=
# -----------------------------------------------------------------------------
# TrinityCore Paths
# -----------------------------------------------------------------------------
TRINITY_ROOT=C:\TrinityBots\TrinityCore
TRINITY_BUILD_DIR=C:\TrinityBots\TrinityCore\build
TRINITY_SERVER_DIR=C:\TrinityBots\Server
WORLDSERVER_PATH=C:\TrinityBots\Server\bin\worldserver.exe
BNETSERVER_PATH=C:\TrinityBots\Server\bin\bnetserver.exe
# -----------------------------------------------------------------------------
# Build Configuration
# -----------------------------------------------------------------------------
CMAKE_BUILD_TYPE=RelWithDebInfo
BOOST_ROOT=C:\boost_1_84_0
OPENSSL_ROOT_DIR=C:\libs\openssl
MYSQL_ROOT_DIR=C:\Program Files\MySQL\MySQL Server 8.0
# Compiler settings
MSVC_VERSION=2022
CMAKE_GENERATOR=Ninja
# Build parallelism
BUILD_PARALLEL_JOBS=8
# -----------------------------------------------------------------------------
# Notification Services (Optional)
# -----------------------------------------------------------------------------
# Email notifications via SMTP
SMTP_ENABLED=false
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_USE_TLS=true
SMTP_USERNAME=[email protected]
SMTP_PASSWORD=your_app_specific_password
SMTP_FROM=[email protected]
SMTP_TO=[email protected]
# Slack notifications
SLACK_ENABLED=false
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/WEBHOOK/URL
SLACK_CHANNEL=#playerbot-dev
SLACK_USERNAME=PlayerBot CI
# Discord notifications
DISCORD_ENABLED=false
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR/WEBHOOK/URL
DISCORD_USERNAME=PlayerBot CI
# -----------------------------------------------------------------------------
# Automation Configuration
# -----------------------------------------------------------------------------
# Auto-fix behavior
AUTO_FIX_ENABLED=true
AUTO_FIX_CRITICAL=true
AUTO_FIX_HIGH=false
AUTO_FIX_MEDIUM=false
# Review frequency
DAILY_REVIEW_TIME=18:00
NIGHTLY_REVIEW_TIME=02:00
# Performance thresholds
MAX_BUILD_TIME_MINUTES=60
MAX_REVIEW_TIME_MINUTES=120
MAX_MEMORY_PER_BOT_MB=10
MAX_CPU_PER_BOT_PERCENT=0.5
# -----------------------------------------------------------------------------
# Security Configuration
# -----------------------------------------------------------------------------
# Dependency scanning
DEPENDENCY_SCAN_ENABLED=true
CVE_CHECK_ENABLED=true
CVE_MIN_SEVERITY=high
# Code scanning
SAST_ENABLED=true
SECRET_SCANNING_ENABLED=true
# -----------------------------------------------------------------------------
# Monitoring & Metrics
# -----------------------------------------------------------------------------
# Metrics collection
METRICS_ENABLED=true
METRICS_RETENTION_DAYS=90
# Performance profiling
PROFILING_ENABLED=true
PROFILING_TOOL=valgrind
# -----------------------------------------------------------------------------
# Development Settings
# -----------------------------------------------------------------------------
# Debug mode
DEBUG_MODE=false
VERBOSE_LOGGING=false
# Cache settings
CACHE_ENABLED=true
CACHE_TTL_HOURS=4
# Parallel execution
MAX_PARALLEL_AGENTS=6
AGENT_TIMEOUT_SECONDS=300
# -----------------------------------------------------------------------------
# Custom MCP Settings
# -----------------------------------------------------------------------------
# TrinityCore MCP Server
TRINITY_MCP_PORT=3000
TRINITY_MCP_HOST=localhost
# DBC/DB2 file paths
DBC_PATH=M:\Wplayerbot\data\dbc\enUS
DB2_PATH=M:\Wplayerbot\data\dbc\enUS
# GameTable (GT) file path
GT_PATH=M:\Wplayerbot\data\gt
# =============================================================================
# Notes:
# - Replace all placeholder values with your actual credentials
# - Keep this file secure and never commit to version control
# - Add .env to .gitignore if not already present
# =============================================================================
+180
View File
@@ -0,0 +1,180 @@
name: Build (Windows x64)
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
jobs:
build:
runs-on: windows-2022
env:
CMAKE_BUILD_TYPE: RelWithDebInfo
MYSQL_ROOT_DIR: C:/Program Files/MySQL/MySQL Server 8.0
OPENSSL_ROOT_DIR: C:/libs/openssl
steps:
- uses: actions/checkout@v7
- name: Get current OpenSSL version
id: openssl-info
run: |
$VersionsUrl = "https://api.github.com/repos/slproweb/opensslhashes/contents/win32_openssl_hashes.json"
$Headers = @{
Accept="application/vnd.github.raw+json"
Authorization="Bearer ${{ secrets.GITHUB_TOKEN }}"
}
$openSSL = (Invoke-RestMethod $VersionsUrl -Headers $Headers).files.PSObject.Properties |
Select-Object -ExpandProperty Value |
Where-Object { $_.arch -eq 'INTEL' } |
Where-Object { $_.bits -eq '64' } |
Where-Object { $_.light -eq $false } |
Where-Object { $_.installer -eq 'exe' } |
Sort-Object -Descending @{ Expression = { [version]$_.basever } } |
Select-Object -First 1
[System.String]::Format("cache-key=openssl-{0}-win-{1}-{2}", $openSSL.basever, $openSSL.arch, $openSSL.bits) >> $env:GITHUB_OUTPUT
[System.String]::Format("url={0}", $openSSL.url) >> $env:GITHUB_OUTPUT
- name: Cache OpenSSL
id: cache-openssl
uses: actions/cache@v6
with:
path: ${{ env.OPENSSL_ROOT_DIR }}
key: ${{ steps.openssl-info.outputs.cache-key }}
- name: Download and install OpenSSL 3.x
if: ${{ steps.cache-openssl.outputs.cache-hit != 'true' }}
run: |
(New-Object System.Net.WebClient).DownloadFile("${{ steps.openssl-info.outputs.url }}", "${{ env.TEMP }}\openssl.exe")
Start-Process -Wait -FilePath "${{ env.TEMP }}\openssl.exe" "/SILENT","/SP-","/SUPPRESSMSGBOXES",/DIR=${{ env.OPENSSL_ROOT_DIR }}
# Quick OpenSSL install test
& ${{ env.OPENSSL_ROOT_DIR }}/bin/openssl.exe version
- name: Download and install Boost
uses: MarkusJx/install-boost@v2
id: install-boost
with:
boost_version: 1.89.0
link: static
platform_version: 2022
toolset: msvc
- name: Configure CMake
env:
BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }}
OPENSSL_ROOT_DIR: C:/libs/openssl
run: >
cmake -S ${{ github.workspace }} -B build -G"Visual Studio 17 2022" -A x64
-DSCRIPTS=static
-DWITH_WARNINGS_AS_ERRORS=OFF
-DTOOLS=ON
- name: Build
run: >
cmake --build build --config RelWithDebInfo
- name: Copy Dependencies
shell: pwsh
run: |
cd build/bin/${{ env.CMAKE_BUILD_TYPE }}
Copy-Item "${{ env.MYSQL_ROOT_DIR }}/lib/libmysql.dll" .
# mysql may depend on a different version of openssl so copy its dlls first (override later with openssl's own if same version)
Copy-Item "${{ env.MYSQL_ROOT_DIR }}/bin/libcrypto-3-x64.dll" . -ErrorAction SilentlyContinue
Copy-Item "${{ env.MYSQL_ROOT_DIR }}/bin/libssl-3-x64.dll" . -ErrorAction SilentlyContinue
Copy-Item "${{ env.OPENSSL_ROOT_DIR }}/bin/libcrypto-3-x64.dll" . -ErrorAction SilentlyContinue
Copy-Item "${{ env.OPENSSL_ROOT_DIR }}/bin/libssl-3-x64.dll" . -ErrorAction SilentlyContinue
Copy-Item "${{ env.OPENSSL_ROOT_DIR }}/bin/legacy.dll" . -ErrorAction SilentlyContinue
Copy-Item "${{ env.MYSQL_ROOT_DIR }}/bin/zlib1.dll" . -ErrorAction SilentlyContinue
- name: Check binaries
shell: pwsh
run: |
cd build/bin/${{ env.CMAKE_BUILD_TYPE }}
foreach ($exe in @("bnetserver.exe", "worldserver.exe"))
{
if (-not (Test-Path $exe)) { Write-Error "Missing binary: $exe"; exit 1 }
if ((Get-Item $exe).Length -lt 1MB) { Write-Error "Suspiciously small binary: $exe"; exit 1 }
}
Write-Output "Required binaries present. Version smoke test (may fail to start in the ephemeral runner DLL env):"
cmd.exe /c "bnetserver.exe --version" 2>&1 | ForEach-Object { Write-Output " bnetserver: $_" }
cmd.exe /c "worldserver.exe --version" 2>&1 | ForEach-Object { Write-Output " worldserver: $_" }
Get-ChildItem *.dll | ForEach-Object { Write-Output " $($_.Name) ($($_.Length) bytes)" }
Write-Output "Binary + package validation passed."
exit 0
- name: Create zip
shell: pwsh
run: |
cd build/bin
7z a TrinityCoreWin64VS2022.zip .\RelWithDebInfo\* | Out-Null
Remove-Item RelWithDebInfo\*.pdb
7z a TrinityCoreWin64VS2022NoSymbols.zip .\RelWithDebInfo\* | Out-Null
- name: Upload Artifacts
uses: actions/upload-artifact@v7
with:
name: TrinityCoreWin64VS2022
path: build/bin/TrinityCoreWin64VS2022.zip
if-no-files-found: error
- name: Upload Artifacts (NoSymbols)
uses: actions/upload-artifact@v7
with:
name: TrinityCoreWin64VS2022NoSymbols
path: build/bin/TrinityCoreWin64VS2022NoSymbols.zip
if-no-files-found: error
linux-build:
runs-on: ubuntu-24.04
env:
CMAKE_BUILD_TYPE: RelWithDebInfo
steps:
- uses: actions/checkout@v7
- name: Dependencies
run: |
sudo apt-get update
sudo apt-get install -yq \
ninja-build \
pkg-config \
libboost-all-dev \
libssl-dev \
libreadline-dev \
zlib1g-dev \
libbz2-dev \
default-libmysqlclient-dev \
default-mysql-client
- name: Configure CMake
run: >
cmake -GNinja -S ${{ github.workspace }} -B build-linux
-DCMAKE_BUILD_TYPE=${{ env.CMAKE_BUILD_TYPE }}
-DSCRIPTS=static
-DWITH_WARNINGS_AS_ERRORS=OFF
-DTOOLS=ON
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install
- name: Build
run: >
cmake --build build-linux
- name: Check binaries
run: |
cmake --install build-linux
cd ${{ github.workspace }}/install/bin
./bnetserver --version
./worldserver --version
- name: Create tar.gz
run: |
cd ${{ github.workspace }}
tar -czf TrinityCoreLinux64.tar.gz -C install .
- name: Upload Artifacts
uses: actions/upload-artifact@v7
with:
name: TrinityCoreLinux64
path: TrinityCoreLinux64.tar.gz
if-no-files-found: error
+30
View File
@@ -23,3 +23,33 @@ nbproject/*
cmake-build-*/*
.vs
*.user
.aider*
# Build artifacts and logs
*.exe
*.log
build_*.txt
build_*.bat
worldserver_*.exe
*_build.log
*_output.txt
final_*.txt
test_*.bat
# Python temporary files
*.tmp.*
*.pyc
__pycache__/
# SQL dumps and temporary data
*.sql.backup
# Claude Code Enhancement - Environment variables (contains secrets)
.env
.env.local
# Playerbot vendored dependencies (tracked via git submodules)
# Git automatically manages submodule contents via .gitmodules
# build*/ pattern above catches TBB build artifacts
phase7a-compile-log.txt
+6
View File
@@ -0,0 +1,6 @@
[submodule "src/modules/Playerbot/deps/phmap"]
path = src/modules/Playerbot/deps/phmap
url = https://github.com/greg7mdp/parallel-hashmap.git
[submodule "src/modules/Playerbot/deps/tbb"]
path = src/modules/Playerbot/deps/tbb
url = https://github.com/oneapi-src/oneTBB.git
+1 -1
View File
@@ -86,7 +86,7 @@ add_subdirectory(src)
include(CTest)
if(BUILD_TESTING)
list(APPEND CMAKE_MODULE_PATH
"${Catch2_SOURCE_DIR}/contrib")
"${Catch2_SOURCE_DIR}/extras")
include(Catch)
add_subdirectory(tests)
-23
View File
@@ -1,23 +0,0 @@
# This file is part of the TrinityCore 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.
# This file is run right before CMake starts configuring the sourcetree
# Example: Force CMAKE_INSTALL_PREFIX to be preloaded with something before
# doing the actual first "configure"-part - allows for hardforcing
# destinations elsewhere in the CMake buildsystem (commented out on purpose)
# Override CMAKE_INSTALL_PREFIX on Windows platforms
#if(WIN32)
# if(NOT CYGWIN)
# set(CMAKE_INSTALL_PREFIX
# "" CACHE PATH "Default install path")
# endif()
#endif()
+18 -2
View File
@@ -1,6 +1,22 @@
# Introduction:
WowCommunity Project is a World of Warcraft blizzlike design based on TrinityCore, which is based on the Midnight Expansion version 12.1.0.69933.
WowCommunity Project is a World of Warcraft blizzlike design based on TrinityCore, which is based on the Midnight Expansion version 12.1.0.69404.
# CI Status:
[![Build status](https://github.com/Thordekk/WowCommunityProject/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/Thordekk/WowCommunityProject/actions/workflows/build.yml)
# Downloads:
- [Windows x64 (con símbolos)](https://github.com/Thordekk/WowCommunityProject/actions/workflows/build.yml)
- [Windows x64 (sin símbolos)](https://github.com/Thordekk/WowCommunityProject/actions/workflows/build.yml)
- [Linux x64](https://github.com/Thordekk/WowCommunityProject/actions/workflows/build.yml)
Los artefactos se encuentran al final de cada ejecución en la pestaña Actions → build → Artifacts.
# Developers:
@@ -22,7 +38,7 @@ WowCommunity Project is a World of Warcraft blizzlike design based on TrinityCor
01c.- [Windows Desktop Runtime v.9.0.13 x64](https://dotnet.microsoft.com/es-es/download/dotnet/thank-you/runtime-desktop-9.0.13-windows-x64-installer)
02.- [Visual Studio Community 2022 v.17.14.41](https://www.junian.net/dev/visual-studio-community-download-links/)
02.- [Visual Studio Community 2022 v.17.14.38](https://www.junian.net/dev/visual-studio-community-download-links/)
03a.- [Python v.3.15.0a6 x64](https://www.python.org/downloads/)
+1 -1
View File
@@ -11,7 +11,7 @@ build_script:
- cmd: >-
git config user.email "[email protected]" && git config user.name "AppVeyor"
cmake -S . -B .\build -G"Visual Studio 17 2022" -A x64 -DSCRIPTS=dynamic -DWITH_WARNINGS_AS_ERRORS=ON -DTOOLS=ON
cmake -S . -B .\build -G"Visual Studio 17 2022" -A x64 -DSCRIPTS=dynamic -DWITH_WARNINGS_AS_ERRORS=OFF -DTOOLS=ON
cd build
+1 -3
View File
@@ -64,9 +64,7 @@ target_sources(g3dlib
include/G3D/AABox.h
include/G3D/BoundsTrait.h
include/G3D/Box.h
include/G3D/CollisionDetection.h
include/G3D/CoordinateFrame.h
include/G3D/Cylinder.h
include/G3D/g3dmath.h
include/G3D/Matrix3.h
include/G3D/Matrix4.h
@@ -103,4 +101,4 @@ if(USE_COREPCH)
[["G3D/Vector3.h"]])
add_cxx_pch(g3dlib "${g3dlib_PCH_HEADERS}")
endif()
endif()
-3
View File
@@ -31,6 +31,3 @@ G3D-v9.0 hotfix18.diff - 2024-02-17 - ARM64 support on MSVC
G3D-v9.0 hotfix19.diff - 2024-06-09 - clang build fix on windows
G3D-v9.0 hotfix20.diff - 2026-05-07 - gcc build fix on windows
G3D-v9.0 hotfix21.diff - 2026-05-07 - gcc 16 warning fix
G3D-v9.0 hotfix22.diff - 2026-09-06 - Remove unused data members from G3D::Ray
G3D-v9.0 hotfix23.diff - 2026-09-06 - Make G3D::Plane destructor not virtual
G3D-v9.0 hotfix24.diff - 2026-09-06 - Add direct yaw/pitch/roll conversions to G3D::Quat
+2
View File
@@ -77,6 +77,8 @@ public:
void serialize(class BinaryOutput& b) const;
void deserialize(class BinaryInput& b);
virtual ~Plane() {}
/**
Returns true if point is on the side the normal points to or
-4
View File
@@ -214,10 +214,6 @@ public:
void toRotationMatrix(
Matrix3& rot) const;
static Quat fromYPRAngles(float fYAngle, float fPAngle, float fRAngle);
void toYPRAngles(float& fYAngle, float& fPAngle, float& fRAngle) const;
private:
/** \param maxAngle Maximum angle of rotation allowed. If a larger rotation is required, the angle of rotation applied is clamped to maxAngle */
Quat slerp
-2
View File
@@ -34,7 +34,6 @@ private:
Vector3 m_invDirection;
#if 0
/** The following are for the "ray slope" optimization from
"Fast Ray / Axis-Aligned Bounding Box Overlap Tests using Ray Slopes"
by Martin Eisemann, Thorsten Grosch, Stefan Müller and Marcus Magnor
@@ -49,7 +48,6 @@ private:
/** Precomputed components */
float c_xy, c_xz, c_yx, c_yz, c_zx, c_zy;
#endif
public:
/** \param direction Assumed to have unit length */
-20
View File
@@ -160,26 +160,6 @@ void Quat::toRotationMatrix(
rot = Matrix3(*this);
}
Quat Quat::fromYPRAngles(float fYAngle, float fPAngle, float fRAngle)
{
float angles[3] = { fRAngle * 0.5f, fPAngle * 0.5f, fYAngle * 0.5f };
float s[3] = { sinf(angles[0]), sinf(angles[1]), sinf(angles[2]) };
float c[3] = { cosf(angles[0]), cosf(angles[1]), cosf(angles[2]) };
return Quat(
s[0] * c[1] * c[2] - c[0] * s[1] * s[2],
c[0] * s[1] * c[2] + s[0] * c[1] * s[2],
c[0] * c[1] * s[2] - s[0] * s[1] * c[2],
c[0] * c[1] * c[2] + s[0] * s[1] * s[2]
);
}
void Quat::toYPRAngles(float& fYAngle, float& fPAngle, float& fRAngle) const
{
fYAngle = atan2f(2.0f * (w * z + x * y), 1.0f - 2.0f * (y * y + z * z));
fPAngle = asinf(clamp(2.0f * (w * y - z * x), -1.0f, 1.0f));
fRAngle = atan2f(2.0f * (w * x + y * z), 1.0f - 2.0f * (x * x + y * y));
}
Quat Quat::slerp
(const Quat& _quat1,
-2
View File
@@ -22,7 +22,6 @@ void Ray::set(const Vector3& origin, const Vector3& direction) {
m_invDirection = Vector3::one() / direction;
#if 0
// ray slope
ibyj = m_direction.x * m_invDirection.y;
jbyi = m_direction.y * m_invDirection.x;
@@ -121,7 +120,6 @@ void Ray::set(const Vector3& origin, const Vector3& direction) {
}
}
}
#endif
}
Binary file not shown.
+2 -2
View File
@@ -40,8 +40,8 @@
// Database updater base information
#define DATABASE_MYSQL_EXECUTABLE R"(@MYSQL_EXECUTABLE@)"
#define DATABASE_FULL_DATABASE "TDB_full_world_1125.25101_2025_10_29.sql"
#define DATABASE_HOTFIXES_DATABASE "TDB_full_hotfixes_1125.25101_2025_10_29.sql"
#define DATABASE_FULL_DATABASE "TDB_full_world_1127.26011_2026_01_14.sql"
#define DATABASE_HOTFIXES_DATABASE "TDB_full_hotfixes_1127.26011_2026_01_14.sql"
// Windows resource defines
#define TRINITY_COMPANYNAME_STR "TrinityCore Developers"
@@ -0,0 +1,23 @@
DELETE FROM `build_info` WHERE `build` IN (68974);
INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES
(68974,12,0,7,NULL);
DELETE FROM `build_auth_key` WHERE `build`=68974 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=68974 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=68974 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=68974 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=68974 AND `platform`='Win' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=68974 AND `platform`='Win' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=68974 AND `platform`='Win' AND `arch`='x64' AND `type`='WoWC';
INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES
(68974,'Mac','A64','WoW',0x85DD40DEE35AB993417DB525B6B77A29),
(68974,'Mac','A64','WoWC',0xFC4DCA5DF2E85C3ECC29B7A378320BBB),
(68974,'Mac','x64','WoW',0x731561ADB563C0DF0FADC297F58EB6B1),
(68974,'Mac','x64','WoWC',0xC45758865E9D79B0AC35B489C0C69891),
(68974,'Win','A64','WoW',0x940DD79F8BF0EEA09A5EAE8200411D50),
(68974,'Win','x64','WoW',0xF76807CCEA2336A3973D3D33EDEF7B76),
(68974,'Win','x64','WoWC',0xE6091ECC24198181EFB2385B83EFD729);
UPDATE `realmlist` SET `gamebuild`=68974 WHERE `gamebuild`=68887;
ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '68974';
@@ -0,0 +1,10 @@
DELETE FROM `rbac_permissions` WHERE `id` IN (886,887);
INSERT INTO `rbac_permissions` (`id`,`name`) VALUES
(1001,'Command: reload shop_catalog'),
(1002,'Command: shop');
DELETE FROM `rbac_linked_permissions` WHERE `linkedId` IN (886,887);
INSERT INTO `rbac_linked_permissions` (`id`,`linkedId`) VALUES
(196,1001),
(197,1002);
@@ -0,0 +1,19 @@
--
-- In-game Shop / BattlePay purchase ledger (account level). Shared home for BOTH the WoW Token branch
-- and the in-game Shop branch: it answers CMSG_BATTLE_PAY_GET_PURCHASE_LIST from real history and gives
-- purchases a PurchaseID that survives restarts. The PurchaseID (`id`) is allocated with the realm id in
-- its high 32 bits so two realms sharing this auth DB never collide.
DROP TABLE IF EXISTS `account_battlepay_purchase`;
CREATE TABLE `account_battlepay_purchase` (
`id` bigint unsigned NOT NULL COMMENT 'Persistent monotonic PurchaseID sent on the wire; high 32 bits = realm id',
`account` int unsigned NOT NULL DEFAULT '0' COMMENT 'Owning game account',
`productId` int unsigned NOT NULL DEFAULT '0' COMMENT '0 is a VALID value (e.g. web-checkout purchases)',
`status` int NOT NULL DEFAULT '0' COMMENT 'BattlepayPurchaseStatus: 6 = done, 4 = failed',
`resultCode` int NOT NULL DEFAULT '0' COMMENT 'PurchaseResult: 0 = ok',
`basePrice` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Copper',
`userPrice` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Copper',
`timeCreated` bigint NOT NULL DEFAULT '0' COMMENT 'Unix seconds',
`walletName` varchar(32) NOT NULL DEFAULT '' COMMENT 'Wallet label; empty on this core, sent record-final',
PRIMARY KEY (`id`),
KEY `idx_account` (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='In-game Shop / BattlePay purchase ledger';
@@ -0,0 +1,43 @@
--
-- In-game Shop / BattlePay entitlement ("distribution") store, account level.
--
-- An entitlement is a purchased-but-not-yet-applied product: the retail "own it now, apply it later"
-- model that backs buying at character select and every service product (boost, rename, faction/race
-- change, transfer) whose grant targets a character chosen AFTER the purchase.
--
-- It lives in the AUTH database for the same reason `account_battlepay_purchase` does: the Shop opens
-- at character select, where no character database context exists yet, and an entitlement is owned by
-- the ACCOUNT, not by a character or a realm. `id` doubles as the wire DistributionID and is allocated
-- with the realm id in its high 32 bits so two realms sharing this auth DB never collide, exactly like
-- the purchase ledger's PurchaseID.
--
-- Lifecycle (see BattlePayEntitlements in BattlePayMgr.h):
-- 1 AVAILABLE - owned, unassigned. The only status ever sent to the client (the sole value observed
-- on the wire, 68275 capture).
-- 2 CLAIMED - transient: an assign is in flight and has won the compare-and-swap on `claimToken`.
-- 3 BOUND - assigned to `targetCharacter` on `realmId`; the payload is delivered the next time
-- that character logs in.
-- 4 FINISHED - delivered; terminal.
-- 5 REVOKED - withdrawn by an admin / refunded; terminal.
--
-- `claimToken` is what makes assignment safe against a replay or a second realm: the claiming session
-- writes a random token together with status 2 under a `status = 1` guard, then reads the row back and
-- proceeds only if ITS token survived. Two racing assigns can therefore never both succeed, without
-- needing an affected-rows count.
DROP TABLE IF EXISTS `account_battlepay_entitlement`;
CREATE TABLE `account_battlepay_entitlement` (
`id` bigint unsigned NOT NULL COMMENT 'DistributionID sent on the wire; high 32 bits = realm id',
`account` int unsigned NOT NULL DEFAULT '0' COMMENT 'Owning game account',
`productId` int unsigned NOT NULL DEFAULT '0' COMMENT 'shop_product.productId this entitlement grants',
`serviceType` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '0 = deferred delivery of the product payload; else the VAS service type from shop_product_deliverable.id where type = 5',
`status` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '1 available, 2 claimed, 3 bound to a character, 4 finished, 5 revoked',
`purchaseId` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'account_battlepay_purchase.id that created this entitlement',
`claimToken` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Compare-and-swap token held by the session currently assigning this entitlement',
`realmId` int unsigned NOT NULL DEFAULT '0' COMMENT 'Realm the target character lives on; 0 while unassigned',
`targetCharacter` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Character guid counter it was assigned to; 0 while unassigned',
`createTime` bigint NOT NULL DEFAULT '0' COMMENT 'Unix seconds',
`updateTime` bigint NOT NULL DEFAULT '0' COMMENT 'Unix seconds of the last status change',
PRIMARY KEY (`id`),
KEY `idx_account_status` (`account`, `status`),
KEY `idx_pending_delivery` (`realmId`, `targetCharacter`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='In-game Shop / BattlePay entitlements (distributions)';
@@ -0,0 +1,13 @@
--
-- WoW Token holdings and token market listings (account level, queried at character select).
DROP TABLE IF EXISTS `account_wow_token`;
CREATE TABLE `account_wow_token` (
`id` bigint unsigned NOT NULL COMMENT 'Token id sent to the client',
`account` int unsigned NOT NULL DEFAULT '0' COMMENT 'Owning account, 0 while listed on the market',
`state` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '0 Auctionable, 1 Consumable, 2 Listed on the market',
`price` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Copper, only meaningful while state = 2',
`createTime` bigint NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_account` (`account`),
KEY `idx_state` (`state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='WoW Token holdings and market listings';
@@ -0,0 +1,7 @@
--
-- WoW Token market: record the character that listed a token so its sale proceeds can be mailed to them
-- when the listing is bought (feature/wow-token B3: sell / buy / redeem legs).
ALTER TABLE `account_wow_token`
ADD COLUMN `seller_guid` bigint unsigned NOT NULL DEFAULT '0'
COMMENT 'Character lowguid that listed the token; receives the sale proceeds by mail'
AFTER `createTime`;
@@ -0,0 +1,23 @@
DELETE FROM `build_info` WHERE `build` IN (69404);
INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES
(69404,12,1,0,NULL);
DELETE FROM `build_auth_key` WHERE `build`=69404 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69404 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69404 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69404 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69404 AND `platform`='Win' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69404 AND `platform`='Win' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69404 AND `platform`='Win' AND `arch`='x64' AND `type`='WoWC';
INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES
(69404,'Mac','A64','WoW',0xBDA04532B8ADFC14EB0303A039BF7048),
(69404,'Mac','A64','WoWC',0x77C294D2234949A948354CD87CF8EC48),
(69404,'Mac','x64','WoW',0x90AC968F93FD22006D841AECA9238FAF),
(69404,'Mac','x64','WoWC',0xA44B02A5B1B1C180856DAB378492ED45),
(69404,'Win','A64','WoW',0xDB4BB15219663DA52CBF361EFD2E6553),
(69404,'Win','x64','WoW',0xB86BE5F3F07C24ACB8EA41D76E0702FC),
(69404,'Win','x64','WoWC',0x4FE59E2D64FABB732B5864EF37300FFE);
UPDATE `realmlist` SET `gamebuild`=69404 WHERE `gamebuild`=68974;
ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '69404';
@@ -1,23 +0,0 @@
DELETE FROM `build_info` WHERE `build` IN (69587);
INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES
(69587,12,1,0,NULL);
DELETE FROM `build_auth_key` WHERE `build`=69587 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69587 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69587 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69587 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69587 AND `platform`='Win' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69587 AND `platform`='Win' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69587 AND `platform`='Win' AND `arch`='x64' AND `type`='WoWC';
INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES
(69587,'Mac','A64','WoW',0x7FA9BFC62ACCD945E65A523ACC1F5EDE),
(69587,'Mac','A64','WoWC',0x352327CB18DFF32F75337C368E6F07EA),
(69587,'Mac','x64','WoW',0x1360FA09EC48BBACF779FD8BFCD5979F),
(69587,'Mac','x64','WoWC',0xE22AD5AF37CB1E02A0C8A8A3CC80D950),
(69587,'Win','A64','WoW',0x1D301623C394178B5BBC90BF0CC2468D),
(69587,'Win','x64','WoW',0xEE9E0616CA2E563E9903A519573599CF),
(69587,'Win','x64','WoWC',0x8CD796511F75479A66E6BCE3F1D7BF31);
UPDATE `realmlist` SET `gamebuild`=69587 WHERE `gamebuild`=69497;
ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '69587';
@@ -1,23 +0,0 @@
DELETE FROM `build_info` WHERE `build` IN (69814);
INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES
(69814,12,1,0,NULL);
DELETE FROM `build_auth_key` WHERE `build`=69814 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69814 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69814 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69814 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69814 AND `platform`='Win' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69814 AND `platform`='Win' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69814 AND `platform`='Win' AND `arch`='x64' AND `type`='WoWC';
INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES
(69814,'Mac','A64','WoW',0xD497A69BF6FB25BE54AE23E41A1AFA6E),
(69814,'Mac','A64','WoWC',0x9694CB1E8B652A07C776A30220393858),
(69814,'Mac','x64','WoW',0xFCD40D024C0EE8F8207F60593D41DD91),
(69814,'Mac','x64','WoWC',0xC278DA09AFA8C593143A2E2583F904A9),
(69814,'Win','A64','WoW',0x7EEA3C940FC8A5314EAD50E5C627A530),
(69814,'Win','x64','WoW',0x534805439760F1DD48DD1B68DFE03AC7),
(69814,'Win','x64','WoWC',0x21F435C122C5FD68B5DB3BC2D903AA1B);
UPDATE `realmlist` SET `gamebuild`=69814 WHERE `gamebuild`=69587;
ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '69814';
@@ -1 +0,0 @@
ALTER TABLE `account` MODIFY COLUMN `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' AFTER `id`;
@@ -1,23 +0,0 @@
DELETE FROM `build_info` WHERE `build` IN (69875);
INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES
(69875,12,1,0,NULL);
DELETE FROM `build_auth_key` WHERE `build`=69875 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69875 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69875 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69875 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69875 AND `platform`='Win' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69875 AND `platform`='Win' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69875 AND `platform`='Win' AND `arch`='x64' AND `type`='WoWC';
INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES
(69875,'Mac','A64','WoW',0xD88093682EC77460858BB7B29E69F968),
(69875,'Mac','A64','WoWC',0x3171A821092246CE74F7F06144C3CBB3),
(69875,'Mac','x64','WoW',0x3DBF6AF950B2D6A367BC2D7940F7433F),
(69875,'Mac','x64','WoWC',0x3B2E6D42A6E5CADE919093EF78960D35),
(69875,'Win','A64','WoW',0x4CFEB2811C1940D0346014B367BD0325),
(69875,'Win','x64','WoW',0xE0AA3015AD5C595869F13B6B8BECC231),
(69875,'Win','x64','WoWC',0xE8C0198E6721AAF2B1C748AC4284A574);
UPDATE `realmlist` SET `gamebuild`=69875 WHERE `gamebuild`=69814;
ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '69875';
@@ -1,23 +0,0 @@
DELETE FROM `build_info` WHERE `build` IN (69933);
INSERT INTO `build_info` (`build`,`majorVersion`,`minorVersion`,`bugfixVersion`,`hotfixVersion`) VALUES
(69933,12,1,0,NULL);
DELETE FROM `build_auth_key` WHERE `build`=69933 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69933 AND `platform`='Mac' AND `arch`='A64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69933 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69933 AND `platform`='Mac' AND `arch`='x64' AND `type`='WoWC';
DELETE FROM `build_auth_key` WHERE `build`=69933 AND `platform`='Win' AND `arch`='A64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69933 AND `platform`='Win' AND `arch`='x64' AND `type`='WoW';
DELETE FROM `build_auth_key` WHERE `build`=69933 AND `platform`='Win' AND `arch`='x64' AND `type`='WoWC';
INSERT INTO `build_auth_key` (`build`,`platform`,`arch`,`type`,`key`) VALUES
(69933,'Mac','A64','WoW',0x855F995BA81FABAEC8282A64623EF654),
(69933,'Mac','A64','WoWC',0x87753E122E07CFF1C89D513425D51F16),
(69933,'Mac','x64','WoW',0x4F461CA5A8E12A654EE7ECFF66577256),
(69933,'Mac','x64','WoWC',0x55CEFA786E7BAD5C88814CB42A440A4C),
(69933,'Win','A64','WoW',0x8D8FD4D1186C83F2641AF2ADBBB1E674),
(69933,'Win','x64','WoW',0xDE452B2BD2640E83AD944B07B4C76649),
(69933,'Win','x64','WoWC',0x7CD51CFAFB5CE86AFE85D6EDDEC7CF61);
UPDATE `realmlist` SET `gamebuild`=69933 WHERE `gamebuild`=69875;
ALTER TABLE `realmlist` CHANGE `gamebuild` `gamebuild` int unsigned NOT NULL DEFAULT '69933';
@@ -0,0 +1,26 @@
-- G4: allow a character to persist MULTIPLE garrisons (WoD garrison + Legion order hall + BfA war campaign + covenant).
-- Adds garrType scoping to every garrison sub-table + widens the character_garrison PK. Backfill is safe because
-- today every character has exactly one garrison (PK guid), so all its sub-rows belong to that garrison's type.
-- 1. Allow >1 garrison row per character.
ALTER TABLE `character_garrison` DROP PRIMARY KEY, ADD PRIMARY KEY (`guid`, `type`);
-- 2. Add garrType to each sub-table (archived_missions already has it).
ALTER TABLE `character_garrison_blueprints` ADD COLUMN `garrType` tinyint unsigned NOT NULL DEFAULT 0;
ALTER TABLE `character_garrison_buildings` ADD COLUMN `garrType` tinyint unsigned NOT NULL DEFAULT 0;
ALTER TABLE `character_garrison_specializations` ADD COLUMN `garrType` tinyint unsigned NOT NULL DEFAULT 0;
ALTER TABLE `character_garrison_followers` ADD COLUMN `garrType` tinyint unsigned NOT NULL DEFAULT 0;
ALTER TABLE `character_garrison_missions` ADD COLUMN `garrType` tinyint unsigned NOT NULL DEFAULT 0;
ALTER TABLE `character_garrison_shipments` ADD COLUMN `garrType` tinyint unsigned NOT NULL DEFAULT 0;
ALTER TABLE `character_garrison_talents` ADD COLUMN `garrType` tinyint unsigned NOT NULL DEFAULT 0;
ALTER TABLE `character_garrison_trophies` ADD COLUMN `garrType` tinyint unsigned NOT NULL DEFAULT 0;
-- 3. Backfill: every existing sub-row belongs to that character's single garrison.
UPDATE `character_garrison_blueprints` s JOIN `character_garrison` g ON g.`guid`=s.`guid` SET s.`garrType`=g.`type`;
UPDATE `character_garrison_buildings` s JOIN `character_garrison` g ON g.`guid`=s.`guid` SET s.`garrType`=g.`type`;
UPDATE `character_garrison_specializations` s JOIN `character_garrison` g ON g.`guid`=s.`guid` SET s.`garrType`=g.`type`;
UPDATE `character_garrison_followers` s JOIN `character_garrison` g ON g.`guid`=s.`guid` SET s.`garrType`=g.`type`;
UPDATE `character_garrison_missions` s JOIN `character_garrison` g ON g.`guid`=s.`guid` SET s.`garrType`=g.`type`;
UPDATE `character_garrison_shipments` s JOIN `character_garrison` g ON g.`guid`=s.`guid` SET s.`garrType`=g.`type`;
UPDATE `character_garrison_talents` s JOIN `character_garrison` g ON g.`guid`=s.`guid` SET s.`garrType`=g.`type`;
UPDATE `character_garrison_trophies` s JOIN `character_garrison` g ON g.`guid`=s.`guid` SET s.`garrType`=g.`type`;
@@ -0,0 +1,10 @@
-- Per-character weekly cap tracking for order-hall work orders (e.g. the Hunter "Unseen Path" Seal of Broken Fate
-- order, capped at 3 per week). `weekReset` = the server's weekly quest reset; once passed, the counter starts fresh.
CREATE TABLE `character_garrison_weekly_shipments` (
`guid` BIGINT UNSIGNED NOT NULL,
`npcEntry` INT UNSIGNED NOT NULL,
`placed` INT UNSIGNED NOT NULL DEFAULT 0,
`weekReset` BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (`guid`,`npcEntry`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Order-hall weekly-capped work orders (Garrison::CreateTroopShipment gate)';
@@ -0,0 +1,6 @@
--
-- Mythic+ keystone lifecycle: track timed-ness of weekly runs (drives the weekly keystone level adjustment)
-- and the reset boundary the keystone was last adjusted for.
--
ALTER TABLE `character_mythic_plus_weekly` ADD `timed` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Run beat the par time' AFTER `level`;
ALTER TABLE `character_mythic_plus_vault` ADD `keystoneResetTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'Weekly reset boundary the keystone was last adjusted for' AFTER `claimedResetTime`;
@@ -0,0 +1,88 @@
--
-- Table structure for table `character_mythic_plus`
--
DROP TABLE IF EXISTS `character_mythic_plus`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `character_mythic_plus` (
`guid` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
`challengeModeId` int unsigned NOT NULL DEFAULT '0' COMMENT 'MapChallengeMode.db2 ID',
`level` int unsigned NOT NULL DEFAULT '0' COMMENT 'Keystone level of the best run',
`durationMs` int unsigned NOT NULL DEFAULT '0' COMMENT 'Effective run time in milliseconds (incl. death penalty)',
`deaths` int unsigned NOT NULL DEFAULT '0',
`completionDate` bigint NOT NULL DEFAULT '0' COMMENT 'Unix time of the run',
`score` float NOT NULL DEFAULT '0',
`affix1` int unsigned NOT NULL DEFAULT '0',
`affix2` int unsigned NOT NULL DEFAULT '0',
`affix3` int unsigned NOT NULL DEFAULT '0',
`affix4` int unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`guid`,`challengeModeId`),
CONSTRAINT `fk_character_mythic_plus_character` FOREIGN KEY (`guid`) REFERENCES `characters` (`guid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Mythic Keystone best runs';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `character_mythic_plus`
--
LOCK TABLES `character_mythic_plus` WRITE;
/*!40000 ALTER TABLE `character_mythic_plus` DISABLE KEYS */;
/*!40000 ALTER TABLE `character_mythic_plus` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `character_mythic_plus_vault`
--
DROP TABLE IF EXISTS `character_mythic_plus_vault`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `character_mythic_plus_vault` (
`guid` bigint unsigned NOT NULL COMMENT 'Global Unique Identifier',
`claimedResetTime` bigint NOT NULL DEFAULT '0' COMMENT 'Weekly reset boundary the vault reward was claimed for',
`keystoneResetTime` bigint NOT NULL DEFAULT '0' COMMENT 'Weekly reset boundary the keystone was last adjusted for',
PRIMARY KEY (`guid`),
CONSTRAINT `fk_character_mythic_plus_vault_guid` FOREIGN KEY (`guid`) REFERENCES `characters` (`guid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Per-character Great Vault weekly claim state';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `character_mythic_plus_vault`
--
LOCK TABLES `character_mythic_plus_vault` WRITE;
/*!40000 ALTER TABLE `character_mythic_plus_vault` DISABLE KEYS */;
/*!40000 ALTER TABLE `character_mythic_plus_vault` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `character_mythic_plus_weekly`
--
DROP TABLE IF EXISTS `character_mythic_plus_weekly`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `character_mythic_plus_weekly` (
`guid` bigint unsigned NOT NULL COMMENT 'Global Unique Identifier',
`id` int unsigned NOT NULL AUTO_INCREMENT,
`challengeModeId` int unsigned NOT NULL DEFAULT '0',
`level` int unsigned NOT NULL DEFAULT '0',
`timed` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Run beat the par time',
`completionDate` bigint NOT NULL DEFAULT '0',
`resetTime` bigint NOT NULL DEFAULT '0' COMMENT 'Weekly reset boundary these runs belong to',
PRIMARY KEY (`id`),
KEY `idx_guid` (`guid`),
CONSTRAINT `fk_character_mythic_plus_weekly_guid` FOREIGN KEY (`guid`) REFERENCES `characters` (`guid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Per-character Mythic+ runs completed this Great Vault week';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `character_mythic_plus_weekly`
--
LOCK TABLES `character_mythic_plus_weekly` WRITE;
/*!40000 ALTER TABLE `character_mythic_plus_weekly` DISABLE KEYS */;
/*!40000 ALTER TABLE `character_mythic_plus_weekly` ENABLE KEYS */;
UNLOCK TABLES;
@@ -0,0 +1,11 @@
--
-- Item upgrade per-slot high-watermark (highest item level a slot class has paid crests to; drives the
-- crest waiver and the client's ItemUpgradeHighWatermark discount display).
--
CREATE TABLE IF NOT EXISTS `character_item_upgrade_watermark` (
`guid` BIGINT UNSIGNED NOT NULL COMMENT 'Global Unique Identifier',
`slotClass` TINYINT UNSIGNED NOT NULL COMMENT 'Watermark slot class index (0-16)',
`itemLevel` INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`guid`,`slotClass`),
CONSTRAINT `fk_char_item_upgrade_watermark_guid` FOREIGN KEY (`guid`) REFERENCES `characters` (`guid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Per-character item upgrade watermarks';
@@ -0,0 +1,10 @@
--
-- Archaeology (from the ground up) Phase 1 sub-slice 2b: per-character active dig sites.
-- Persists the ActivePlayer ResearchSites / ResearchSiteProgress update fields across relog/restart.
--
CREATE TABLE IF NOT EXISTS `character_research_site` (
`guid` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
`researchSiteId` smallint unsigned NOT NULL DEFAULT '0',
`progress` int unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`guid`,`researchSiteId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Archaeology active dig sites per character';
@@ -0,0 +1,50 @@
--
-- Mythic+ weekly keystone rollover: persist the previous week's run summary.
--
-- The weekly run rows (character_mythic_plus_weekly) are dropped the moment the finished week is pruned, but the
-- retail keystone rule needs that week's highest completed / highest timed level to pick the new key. Keeping the
-- summary only in memory loses it whenever a character save or a server restart lands between the weekly reset and
-- the keystone adjustment, silently degrading the key to the "no history" rule (one level lower). These columns
-- make it durable.
--
-- Idempotent: each column is added only when information_schema says it is missing, so the file is safe to re-run
-- and safe against a base dump that already carries the columns.
--
DELIMITER $$
DROP PROCEDURE IF EXISTS `_tc_add_mythic_plus_vault_prev_week` $$
CREATE PROCEDURE `_tc_add_mythic_plus_vault_prev_week`()
BEGIN
IF NOT EXISTS (SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'character_mythic_plus_vault'
AND `COLUMN_NAME` = 'prevWeekResetTime') THEN
ALTER TABLE `character_mythic_plus_vault`
ADD COLUMN `prevWeekResetTime` BIGINT NOT NULL DEFAULT 0
COMMENT 'Weekly reset boundary the summarised previous week ended at' AFTER `keystoneResetTime`;
END IF;
IF NOT EXISTS (SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'character_mythic_plus_vault'
AND `COLUMN_NAME` = 'prevWeekBestLevel') THEN
ALTER TABLE `character_mythic_plus_vault`
ADD COLUMN `prevWeekBestLevel` INT UNSIGNED NOT NULL DEFAULT 0
COMMENT 'Highest keystone level completed in that week (timed or not)' AFTER `prevWeekResetTime`;
END IF;
IF NOT EXISTS (SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'character_mythic_plus_vault'
AND `COLUMN_NAME` = 'prevWeekBestTimedLevel') THEN
ALTER TABLE `character_mythic_plus_vault`
ADD COLUMN `prevWeekBestTimedLevel` INT UNSIGNED NOT NULL DEFAULT 0
COMMENT 'Highest keystone level completed IN TIME in that week' AFTER `prevWeekBestLevel`;
END IF;
END $$
DELIMITER ;
CALL `_tc_add_mythic_plus_vault_prev_week`();
DROP PROCEDURE IF EXISTS `_tc_add_mythic_plus_vault_prev_week`;
@@ -0,0 +1,29 @@
--
-- Great Vault / Weekly Rewards: per-character weekly activity tracking and claim state.
--
DROP TABLE IF EXISTS `character_weekly_reward_activity`;
CREATE TABLE `character_weekly_reward_activity` (
`ownerGuid` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Character Global Unique Identifier',
`activityType` tinyint unsigned NOT NULL DEFAULT '0' COMMENT 'Great Vault row: 0 Dungeon, 1 Raid, 2 World',
`period` int unsigned NOT NULL DEFAULT '0' COMMENT 'Weekly period index this activity belongs to',
`count` int unsigned NOT NULL DEFAULT '0' COMMENT 'Qualifying completions this period',
`bestLevel` int unsigned NOT NULL DEFAULT '0' COMMENT 'Best difficulty/keystone level this period',
PRIMARY KEY (`ownerGuid`,`activityType`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Player System';
DROP TABLE IF EXISTS `character_weekly_reward_state`;
CREATE TABLE `character_weekly_reward_state` (
`ownerGuid` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Character Global Unique Identifier',
`claimedPeriod` int unsigned NOT NULL DEFAULT '0' COMMENT 'Last weekly period a reward was claimed',
PRIMARY KEY (`ownerGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Player System';
DROP TABLE IF EXISTS `character_content_tracking`;
CREATE TABLE `character_content_tracking` (
`ownerGuid` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Character Global Unique Identifier',
`targetType` int NOT NULL DEFAULT '0' COMMENT 'ContentTrackingTargetType of the tracked entry',
`targetId` int NOT NULL DEFAULT '0' COMMENT 'Id of the tracked target within its type',
`collectableSourceInfoId` int NOT NULL DEFAULT '0' COMMENT 'Client-resolved CollectableSourceInfo id',
PRIMARY KEY (`ownerGuid`,`targetType`,`targetId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Player System';
@@ -0,0 +1,19 @@
DROP TABLE `character_weekly_reward_activity`;
CREATE TABLE `character_weekly_reward_activity` (
`ownerGuid` BIGINT UNSIGNED NOT NULL,
`period` INT UNSIGNED NOT NULL DEFAULT 0,
`activityType` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`count` INT UNSIGNED NOT NULL DEFAULT 0,
`bestLevel` INT UNSIGNED NOT NULL DEFAULT 0,
`levels` TEXT NULL,
PRIMARY KEY (`ownerGuid`, `period`, `activityType`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE `character_content_tracking`;
CREATE TABLE `character_content_tracking` (
`ownerGuid` BIGINT UNSIGNED NOT NULL,
`targetType` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`targetId` INT UNSIGNED NOT NULL DEFAULT 0,
`collectableSourceInfoId` INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`ownerGuid`, `targetType`, `targetId`, `collectableSourceInfoId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,18 @@
--
-- Prey system + Voidforge (Midnight Season 1) — per-character hunt state.
-- SHIPPED ON BRANCH, NOT APPLIED to the shared realm. Additive; PreyMgr
-- tolerates its absence (OnPlayerLogin is a no-op until this is populated).
--
-- Tracks in-flight / weekly hunt bookkeeping. The weekly cap is 1 hunt per
-- difficulty per zone (up to 12 across the four Midnight zones) — [RESEARCH],
-- enforced server-side once the completion wire is captured.
--
CREATE TABLE IF NOT EXISTS `character_prey_hunt` (
`guid` BIGINT UNSIGNED NOT NULL COMMENT 'character guid',
`HuntId` INT UNSIGNED NOT NULL COMMENT 'FK prey_hunt_template.Id',
`Difficulty` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`Status` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 available / 1 active / 2 completed',
`WeekStart` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'unix time of the weekly-reset bucket',
PRIMARY KEY (`guid`,`HuntId`,`WeekStart`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@@ -0,0 +1,16 @@
-- Omnium Folio (Midnight 12.0.7 Season 1) -- per-character season bookkeeping
-- ---------------------------------------------------------------------------
-- The folio's actual power/selection state persists through the EXISTING trait
-- tables (character_trait_config / character_trait_entry) because it is a
-- generic TraitConfig (TraitSystem 48 / TraitTree 1186). This table only tracks
-- which season a character has already been reset/minted for, so the seasonal
-- rollover seam (OmniumFolioMgr::ResetForNewSeason) can re-mint exactly once.
--
-- Realm-safety: purely additive; nothing reads it until the seasonal seam is
-- enabled. Ship-only; DO NOT apply to the shared integration realm.
CREATE TABLE IF NOT EXISTS `character_omnium_folio` (
`guid` bigint unsigned NOT NULL COMMENT 'Character GUID',
`LastSeasonMinted` int unsigned NOT NULL DEFAULT '0' COMMENT 'Season the generic folio config was last minted/reset for',
`UnlockedAt` int unsigned NOT NULL DEFAULT '0' COMMENT 'Unix time the folio unlock spell was applied',
PRIMARY KEY (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Omnium Folio per-character season bookkeeping';
@@ -0,0 +1,10 @@
-- BfA Warfronts (P0): coarse per-zone cycle state owned by WarfrontMgr. The contribution *bar counter* persists
-- separately through ManagedWorldStateMgr -> world_state; this table only holds the cycle spine (which phase, who
-- controls the zone, and the current phase-end timestamp) so the cycle survives a restart. See WARFRONTS_DESIGN.md §1.3.
CREATE TABLE IF NOT EXISTS `warfront_state` (
`WarfrontId` TINYINT UNSIGNED NOT NULL, -- our WarfrontId enum (1=Stromgarde, 2=Darkshore)
`State` TINYINT UNSIGNED NOT NULL DEFAULT 0, -- WarfrontState enum (0=CONTRIBUTION,1=SIEGE,2=FLIP)
`Controlling` TINYINT UNSIGNED NOT NULL DEFAULT 0, -- TeamId of the controlling faction (0=Alliance,1=Horde)
`PhaseEndTime` INT UNSIGNED NOT NULL DEFAULT 0, -- unix time the current phase ends (0 = no active timer)
PRIMARY KEY (`WarfrontId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='BfA Warfront cycle state (WarfrontMgr)';
@@ -0,0 +1,21 @@
--
-- Covenant Callings board (P4.4).
--
-- One row per calling slot. A covenant board holds exactly three slots
-- (CovenantCallingsConstants.Callings.MaxCallings = 3 in the 12.0.7.68275 client); a slot either offers a
-- Bounty.db2 row until expireTime, or is empty and refills at refillTime. Both timestamps are daily-reset
-- boundaries, which is what lets the board roll over exactly at reset and be reconstructed after a restart
-- without any scheduler state.
--
-- Keyed by covenantId as well as guid: the per-covenant currency families (renown 1829-1832, reservoir anima
-- 1859-1862, redeemed souls 1863-1866) are direct evidence that Blizzard keeps all four covenant tracks for a
-- character simultaneously, so a covenant switch must not discard the other covenant's board.
CREATE TABLE IF NOT EXISTS `character_covenant_callings` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`covenantId` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Covenant.db2 ID this board belongs to',
`slot` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0-based slot on the board',
`bountyId` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Bounty.db2 ID currently offered, 0 when the slot is empty',
`expireTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'Unix time the offer lapses (occupied slots only)',
`refillTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'Unix time a new calling is issued (empty slots only)',
PRIMARY KEY (`guid`,`covenantId`,`slot`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Covenant Callings - per-character daily bounty board';
@@ -0,0 +1,28 @@
-- Covenant switching / reset (spell 338503 "Reset Covenant").
--
-- A switch must never cost a character anything belonging to a covenant it may return to. Renown (1829-1832),
-- reservoir anima (1859-1862), researched sanctum talents (character_garrison_talents - every covenant-scoped
-- GarrTalentTree names its owner in FeatureSubtypeIndex, so the four covenants already own disjoint rows),
-- companions (character_garrison_followers), conduits, conduit sockets, the granted-renown high-water mark and
-- the per-covenant calling boards are all already stored per covenant and are left untouched by a switch.
--
-- The one piece of covenant-scoped state that had nowhere to live is WHICH SOULBIND a covenant was using:
-- character_covenant is single-valued by design (it holds the ACTIVE covenant/soulbind), so leaving a covenant
-- would have thrown its soulbind choice away. This table remembers it per covenant, and because a row is written
-- for every covenant the character pledges to - even before it picks a soulbind - it doubles as the "covenants
-- ever joined" set that tells a switch apart from a first pledge.
--
-- Idempotent: safe to re-run.
CREATE TABLE IF NOT EXISTS `character_covenant_soulbind` (
`guid` bigint unsigned NOT NULL DEFAULT '0',
`covenantId` int unsigned NOT NULL DEFAULT '0',
`soulbindId` int unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`guid`,`covenantId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Soulbind last active per covenant (also the set of covenants ever joined)';
-- Seed the characters that already belong to a covenant, so their current pledge is recognised as "joined" and
-- their current soulbind survives their first switch. INSERT IGNORE keeps a re-run from overwriting anything the
-- server has since recorded.
INSERT IGNORE INTO `character_covenant_soulbind` (`guid`, `covenantId`, `soulbindId`)
SELECT `guid`, `covenantId`, `soulbindId` FROM `character_covenant` WHERE `covenantId` <> 0;
@@ -0,0 +1,22 @@
--
-- Queen's Conservatory (Night Fae unique covenant sanctum feature, GarrTalentTree 319).
-- One row per OCCUPIED wildseed plot; empty plots are not stored. plotId is 0-based and is bounded by the
-- number of researched tiers of tree 319 (max 5 - GarrTalentTree 319 MaxTiers). state: 0 empty, 1 growing,
-- 2 ready to harvest. catalyst1..4 hold GameObject entries (353652 Catalyst of Power / 353653 Catalyst of
-- Renewal / 353654 Catalyst of Might); talent 1090 "Final Forms" is what caps the links at four.
-- Idempotent.
--
CREATE TABLE IF NOT EXISTS `character_garrison_conservatory` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`plotId` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0-based wildseed plot index',
`wildseedEntry` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_conservatory_wildseed.wildseedEntry',
`plantedTime` BIGINT NOT NULL DEFAULT 0,
`maturesAt` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time the wildseed becomes harvestable',
`catalyst1` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'gameobject_template.entry of the attached catalyst',
`catalyst2` INT UNSIGNED NOT NULL DEFAULT 0,
`catalyst3` INT UNSIGNED NOT NULL DEFAULT 0,
`catalyst4` INT UNSIGNED NOT NULL DEFAULT 0,
`state` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 empty, 1 growing, 2 ready',
PRIMARY KEY (`guid`, `plotId`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Queen''s Conservatory wildseed plots';
@@ -0,0 +1,45 @@
--
-- Queen's Conservatory - the catalyst columns hold ITEM ids, not GameObject entries.
--
-- 2026_08_07_03 created `character_garrison_conservatory` with catalyst1..4 documented as
-- "gameobject_template.entry of the attached catalyst", naming GameObjects 353652 / 353653 / 353654
-- ("Catalyst of Power / Renewal / Might"). Those are Revendreth vampire-bottle props in AreaTable 10413 on
-- map 2222, not Conservatory objects - see the header of the world migration
-- 2026_08_07_63_covenant_conservatory_catalysts.sql for the full derivation.
--
-- The real catalysts are the items 176921 Temporal Leaves / 176922 Wild Nightbloom / 176832 Wildseed Root
-- Grain, so these columns now carry `garrison_conservatory_catalyst`.catalystItemId. This file only
-- re-documents the columns and clears any value written under the old (no-op) meaning; the engine also drops
-- unknown catalyst ids at load time with a log line, so applying this is belt-and-braces.
--
-- Idempotent.
--
-- Safety net if this file is applied without 2026_08_07_03 (identical definition, corrected comments).
CREATE TABLE IF NOT EXISTS `character_garrison_conservatory` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`plotId` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0-based wildseed plot index',
`wildseedEntry` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_conservatory_wildseed.wildseedEntry',
`plantedTime` BIGINT NOT NULL DEFAULT 0,
`maturesAt` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time the wildseed becomes harvestable',
`catalyst1` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_conservatory_catalyst.catalystItemId of the attached catalyst',
`catalyst2` INT UNSIGNED NOT NULL DEFAULT 0,
`catalyst3` INT UNSIGNED NOT NULL DEFAULT 0,
`catalyst4` INT UNSIGNED NOT NULL DEFAULT 0,
`state` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 empty, 1 growing, 2 ready',
PRIMARY KEY (`guid`, `plotId`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Queens Conservatory wildseed plots';
ALTER TABLE `character_garrison_conservatory`
MODIFY `catalyst1` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_conservatory_catalyst.catalystItemId of the attached catalyst',
MODIFY `catalyst2` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_conservatory_catalyst.catalystItemId of the attached catalyst',
MODIFY `catalyst3` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_conservatory_catalyst.catalystItemId of the attached catalyst',
MODIFY `catalyst4` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_conservatory_catalyst.catalystItemId of the attached catalyst';
-- The only values the old code could ever have written are those three GameObject entries (it validated
-- against gameobject_template), and they mean nothing under the new meaning. Nothing else is touched.
UPDATE `character_garrison_conservatory` SET `catalyst1` = 0 WHERE `catalyst1` IN (353652,353653,353654);
UPDATE `character_garrison_conservatory` SET `catalyst2` = 0 WHERE `catalyst2` IN (353652,353653,353654);
UPDATE `character_garrison_conservatory` SET `catalyst3` = 0 WHERE `catalyst3` IN (353652,353653,353654);
UPDATE `character_garrison_conservatory` SET `catalyst4` = 0 WHERE `catalyst4` IN (353652,353653,353654);
@@ -0,0 +1,25 @@
--
-- Abomination Factory (Necrolord unique covenant sanctum feature, GarrTalentTree 321).
--
-- One row per construct body the character has stitched. `recipeSpellId` is the "Construct Body: X" recipe
-- (a SkillLineAbility.Spell of SkillLine 2787 "Abominable Stitching") that produced it - the 15 of them are
-- identified by the server from client data as the stitching recipes whose spell carries
-- SPELL_EFFECT_KILL_CREDIT (creature credit 167076 / 167581), so nothing here hardcodes an id list.
--
-- The client's own roster of the same 15 is CriteriaTree 88195 "Abominable Stitching - Build Abom":
-- Chordy 325284, Roseboil 325451, Marz 325452, Flytrap 325453, Atticus 325454, Miru 325458, Neena 326379,
-- Gas Bag 326380, Professor 326406, Toothpick 326407, Mama Tomalin 326408, Iron Phillip 338037,
-- Guillotine 338039, Sabrina 338040, Naxx 338043.
--
-- Only the covenant sanctum (GarrType 111) has one, so the table is keyed by guid alone and is written and
-- purged from Garrison::SaveToDB / Garrison::DeleteFromDB behind a GARRISON_TYPE_COVENANT check.
--
-- Idempotent.
--
CREATE TABLE IF NOT EXISTS `character_garrison_abomination_factory` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`recipeSpellId` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'SkillLineAbility.Spell of the construct-body recipe',
`builtTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time the construct was stitched',
PRIMARY KEY (`guid`, `recipeSpellId`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Abomination Factory construct stable';
@@ -0,0 +1,37 @@
--
-- Path of Ascension (Kyrian unique covenant sanctum feature, GarrTalentTree 320).
--
-- One row per Shadowlands memory the character has captured, plus how far that memory has been taken.
--
-- `memoryId` references `garrison_ascension_memory`.`memoryId` in the world DB (authored content - see
-- sql/updates/world/master/2026_08_07_80_covenant_ascension_memories.sql for why that roster is not derived).
-- A stored row whose memoryId no longer has a world row is dropped with an error at load
-- (PathOfAscension::LoadFromDB) rather than carried as an id no gate can evaluate.
--
-- `highestTrialWon` is the high-water mark over the four trials, which are Difficulty.db2 rows in the 68275
-- client, not an invented scale:
-- 0 none, 1 Trial of Courage (Difficulty 168), 2 Trial of Loyalty (169),
-- 3 Trial of Wisdom (170), 4 Trial of Humility (171).
-- All four are InstanceType 5 (MAP_SCENARIO) with MinPlayers = MaxPlayers = 1, bound to map 2375
-- "9.0 Bastion Arena - Path of Ascension" by MapDifficulty 4795-4798 - which is why this is stored per
-- character and not per group.
--
-- Only the covenant sanctum (GarrType 111) has one, so the table is keyed by guid alone and is written and
-- purged from Garrison::SaveToDB / Garrison::DeleteFromDB behind a GARRISON_TYPE_COVENANT check - the same
-- shape as `character_garrison_conservatory` and `character_garrison_abomination_factory`.
--
-- Captures are deliberately NOT deleted when the covenant changes or a talent is reset: the character keeps
-- what it captured and simply loses access until the tiers are re-researched (Garrison::Update clamps the
-- trial high-water mark to the ceiling the remaining research supports).
--
-- Idempotent.
--
CREATE TABLE IF NOT EXISTS `character_garrison_path_of_ascension` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`memoryId` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_ascension_memory.memoryId',
`capturedTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time the memory was captured',
`highestTrialWon` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 none, 1 Courage, 2 Loyalty, 3 Wisdom, 4 Humility',
`lastCompletedTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time of the most recent trial win',
PRIMARY KEY (`guid`, `memoryId`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Path of Ascension captured memories and trial progress';
@@ -0,0 +1,59 @@
--
-- The Ember Court (Venthyr unique covenant sanctum feature, GarrTalentTree 324).
--
-- One row per guest this character has any standing with - hosted at least once, or currently on the guest
-- list for the next court.
--
-- `guestIndex` is 0-15 and is the client's OWN guest ordering: the sixteen children of CriteriaTree 87983,
-- which is Achievement 14723 "Be Our Guest" ("Host the following guests at your Ember Court"), in their
-- OrderIndex order. That roster is derived twice over - the identical sixteen names also appear as the
-- sixteen "RSVP: <Guest>" quests already present in the world DB, each started and ended by that guest's own
-- creature - so it lives in C++ (EmberCourt.cpp) rather than in a world table:
-- 0 Baroness Vashj 4 Alexandros Mograine 8 Choofa 12 Kleia and Pelagos
-- 1 Lady Moonberry 5 Hunt-Captain Korayn 9 Cryptkeeper Kassir 13 Plague Deviser Marileth
-- 2 Mikanikos 6 Polemarch Adrestes 10 Droman Aliothe 14 Sika
-- 3 The Countess 7 Rendle and Cudgelface 11 Grandmaster Vole 15 Stonehead
-- A stored row whose guestIndex is outside 0-15 is dropped with an error at load (EmberCourt::LoadFromDB).
--
-- `invited` is the pending guest list for the NEXT court. It is capped at the slots the researched talents of
-- GarrTalentTree 324 grant - 2 at the bottom of the ladder, 3 with talent 1114 "Court Influencer" ("allowing
-- you to invite a THIRD guest"), 4 with talent 1112 "Discerning Taste" ("a FOURTH guest") - and the 60s
-- Garrison::Update tick trims it back down if a talent reset or a covenant switch shrinks the allowance, or
-- if a guest's "RSVP: <Guest>" quest no longer stands.
--
-- `highestMood` is a high-water mark on the mood scale the 12.0.7.68275 client does NOT publish. Achievement
-- 14724 "People Pleaser" names exactly one rung of that scale, "Elated", and nothing anywhere gives the rungs
-- below it or the thresholds between them ("Elated" is not even a GlobalStrings row). The value is therefore
-- only ever WRITTEN by a real court completion reporting it; the server never computes one. The rung that
-- counts as Elated for each guest is authored per guest in the world table `garrison_ember_court_guest`.
--
-- `courtsHeld` and `lastCourtTime` are court-level counters denormalised onto every guest row so the feature
-- keeps to a single table. They are identical across a character's rows. A court can only be completed with
-- at least one guest on the list, so a character with courtsHeld > 0 always has at least one row to carry
-- them. NOTE: no minimum interval between courts is enforced anywhere - the build publishes none (spell
-- 336617 is named "Ember Court Timer" but no interval this server could apply is published), and one is not
-- invented. lastCourtTime is recorded and exposed so whoever authors the venue can gate on it.
--
-- Only the covenant sanctum (GarrType 111) has one, so the table is keyed by guid alone and is written and
-- purged from Garrison::SaveToDB / Garrison::DeleteFromDB behind a GARRISON_TYPE_COVENANT check - the same
-- shape as `character_garrison_conservatory`, `character_garrison_abomination_factory` and
-- `character_garrison_path_of_ascension`.
--
-- Hosting history is deliberately NOT deleted when the covenant changes or a talent is reset: the character
-- keeps what it earned and simply loses access until it is Venthyr with the tree researched again. Only the
-- pending `invited` flags are trimmed.
--
-- Idempotent.
--
CREATE TABLE IF NOT EXISTS `character_garrison_ember_court` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`guestIndex` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0-15, CriteriaTree 87983 child OrderIndex',
`timesHosted` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'courts this guest has attended',
`highestMood` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'high-water mark on the unpublished mood scale; 0 = never hosted',
`lastHostedTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time this guest last attended',
`invited` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'on the guest list for the next court',
`courtsHeld` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'court-level counter, identical across this guid''s rows',
`lastCourtTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'court-level counter, identical across this guid''s rows',
PRIMARY KEY (`guid`, `guestIndex`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Ember Court guest standing and pending guest list';
@@ -0,0 +1,75 @@
--
-- Table structure for table `character_garrison_conservatory`
--
DROP TABLE IF EXISTS `character_garrison_conservatory`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `character_garrison_conservatory` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`plotId` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0-based wildseed plot index',
`wildseedEntry` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_conservatory_wildseed.wildseedEntry',
`plantedTime` BIGINT NOT NULL DEFAULT 0,
`maturesAt` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time the wildseed becomes harvestable',
`catalyst1` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'gameobject_template.entry of the attached catalyst',
`catalyst2` INT UNSIGNED NOT NULL DEFAULT 0,
`catalyst3` INT UNSIGNED NOT NULL DEFAULT 0,
`catalyst4` INT UNSIGNED NOT NULL DEFAULT 0,
`state` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 empty, 1 growing, 2 ready',
PRIMARY KEY (`guid`, `plotId`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Queen''s Conservatory wildseed plots';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `character_garrison_abomination_factory`
--
DROP TABLE IF EXISTS `character_garrison_abomination_factory`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `character_garrison_abomination_factory` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`recipeSpellId` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'SkillLineAbility.Spell of the construct-body recipe',
`builtTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time the construct was stitched',
PRIMARY KEY (`guid`, `recipeSpellId`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Abomination Factory construct stable';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `character_garrison_path_of_ascension`
--
DROP TABLE IF EXISTS `character_garrison_path_of_ascension`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `character_garrison_path_of_ascension` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`memoryId` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'garrison_ascension_memory.memoryId',
`capturedTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time the memory was captured',
`highestTrialWon` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 none, 1 Courage, 2 Loyalty, 3 Wisdom, 4 Humility',
`lastCompletedTime` BIGINT NOT NULL DEFAULT 0 COMMENT 'unix time of the most recent trial win',
PRIMARY KEY (`guid`, `memoryId`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Path of Ascension captured memories and trial progress';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `character_garrison_ember_court`
--
DROP TABLE IF EXISTS `character_garrison_ember_court`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `character_garrison_ember_court` (
`guid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Character GUID',
`guestIndex` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0-15, CriteriaTree 87983 child OrderIndex',
`timesHosted` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'courts this guest has attended',
`highestMood` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'high-water mark on the unpublished mood scale',
`lastHostedTime` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '',
`invited` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '',
`courtsHeld` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '',
`lastCourtTime` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '');
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -0,0 +1,39 @@
--
-- Garrison monument trophies: re-key the saved selection by TrophyInstanceID.
--
-- `character_garrison_trophies` was (guid, trophyId, garrType) with PRIMARY KEY (guid, trophyId) - a SET of
-- trophy ids per character. That cannot express what the feature actually stores.
--
-- A garrison has three monuments, not one. Each Monument Base gameobject carries a TrophyInstanceID in its
-- Data1 (the six spawned ones use 1, 2 and 6 on each side), and the client resolves what a given monument is
-- displaying by scanning SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS for the entry whose first field
-- equals that monument's own TrophyInstanceID - the monument tooltip builder at client RVA 0x1CAED30 does
-- exactly this lookup and then reads Trophy.db2 for the name. The saved state is therefore a MAP from
-- monument instance to trophy, one row per physical monument, and a plain set of trophy ids would make all
-- three plinths show the same statue with no way to say which is which.
--
-- Recreating rather than ALTERing: the old PRIMARY KEY (guid, trophyId) is wrong for the new shape (the same
-- trophy may legitimately sit on two different monuments, while one monument may hold only one trophy), and
-- the table holds no rows to preserve - nothing in the core ever wrote to it. Garrison::AddTrophy had no
-- caller outside the packet handlers, and those only ran on opcodes that the client never sent, because
-- nothing opened the monument interaction in the first place. Verified empty on this realm before writing
-- this file (SELECT COUNT(*) FROM character_garrison_trophies -> 0).
--
-- Columns:
-- guid character
-- trophyInstanceId which physical monument (gameobject Data1 of a GAMEOBJECT_TYPE_GARRISON_MONUMENT)
-- trophyId Trophy.db2 row displayed on it
-- garrType owning garrison type (2 = the WoD garrison, the only type that has monuments)
--
-- Idempotent.
--
DROP TABLE IF EXISTS `character_garrison_trophies`;
CREATE TABLE `character_garrison_trophies` (
`guid` BIGINT UNSIGNED NOT NULL,
`trophyInstanceId` INT UNSIGNED NOT NULL DEFAULT 0,
`trophyId` INT UNSIGNED NOT NULL DEFAULT 0,
`garrType` TINYINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`guid`,`garrType`,`trophyInstanceId`),
KEY `idx_guid` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,50 @@
--
-- Adventures companions: persist current health and the board slot they were deployed in.
--
-- `character_garrison_followers` stored neither. Two consequences, both visible in game:
--
-- 1. `GarrisonFollower.Health` was assigned once at recruit time (Garrison::AddFollower) and then thrown
-- away, so every login reloaded the whole roster at health 0. That is the `health = 0` the tester saw on
-- a level-1 companion whose statline maximum is 250.
--
-- 2. A companion's slot on the Adventures board (client enum `GarrAutoBoardIndex`, ally slots 0..4) existed
-- only for the lifetime of one CMSG_GARRISON_START_MISSION - and in fact was not even read from it. A
-- mission that was in progress across a logout came back with every companion unplaced, and the
-- mission-complete screen throws when it cannot resolve a board frame for a follower
-- (Blizzard_AdventuresCompleteScreen.lua:140).
--
-- Defaults are chosen so existing rows load correctly without a data migration:
-- health 0 -> Garrison::LoadFromDB restores any follower at <= 0 to its statline maximum, so legacy
-- rows come back at full rather than looking wiped.
-- boardIndex -1 -> GarrAutoBoardIndex::None. LoadFromDB re-runs AssignMissionBoardIndexes for any
-- in-progress mission whose companions are unplaced, filling them in retail's own
-- auto-assignment order, so missions already running when this is applied are repaired
-- on the next login rather than staying broken.
--
-- Idempotent: both columns are added only when absent.
--
DROP PROCEDURE IF EXISTS `tc_add_garrison_follower_board_columns`;
DELIMITER $$
CREATE PROCEDURE `tc_add_garrison_follower_board_columns`()
BEGIN
IF NOT EXISTS (SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'character_garrison_followers'
AND `COLUMN_NAME` = 'health') THEN
ALTER TABLE `character_garrison_followers`
ADD COLUMN `health` int NOT NULL DEFAULT 0 AFTER `garrType`;
END IF;
IF NOT EXISTS (SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'character_garrison_followers'
AND `COLUMN_NAME` = 'boardIndex') THEN
ALTER TABLE `character_garrison_followers`
ADD COLUMN `boardIndex` tinyint NOT NULL DEFAULT -1 AFTER `health`;
END IF;
END$$
DELIMITER ;
CALL `tc_add_garrison_follower_board_columns`();
DROP PROCEDURE `tc_add_garrison_follower_board_columns`;
@@ -0,0 +1,33 @@
--
-- In-game Shop character boost: which characters this realm has boosted.
--
-- The boost itself is applied to an OFFLINE character from the glue screen, so `characters` already
-- carries everything the boost changed (level, xp, primarySpecialization, inventory, the
-- character-select equipment cache). What that leaves nowhere to live is the FACT of the boost, and
-- the character-enumeration packet needs it: a boosted character must carry
-- CHARACTER_FLAG_4_USED_MAX_LEVEL_BOOST so the client stops offering the boost again, and a character
-- created through "Try New Class" must carry CHARACTER_RESTRICTION_FLAG_TRIAL_BOOST until it is
-- boosted so the client draws the class-trial plate.
--
-- This is a CHARACTERS-database table, unlike the entitlement ledger it is fed from
-- (account_battlepay_entitlement, auth DB). The entitlement belongs to the account and outlives any
-- realm; this row is a property of one character on one realm and dies with it, which is why
-- CHAR_DEL_SHOP_BOOST is issued from the character-delete path.
--
-- trial = 1 character was created through Try New Class and has NOT been boosted yet
-- trial = 0 character has been boosted; the entitlement that paid for it is consumed
--
-- `distributionId` is the entitlement (wire DistributionID) that paid for the boost, kept so a
-- support query can walk a boosted character back to the purchase that produced it. It is 0 for a
-- trial row, because a trial does not consume an entitlement.
--
CREATE TABLE IF NOT EXISTS `character_shop_boost` (
`guid` BIGINT UNSIGNED NOT NULL,
`productId` INT UNSIGNED NOT NULL DEFAULT 0,
`distributionId` BIGINT UNSIGNED NOT NULL DEFAULT 0,
`specializationId` INT UNSIGNED NOT NULL DEFAULT 0,
`trial` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`boostedAt` BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='In-game Shop: boosted and class-trial characters';
@@ -1,18 +0,0 @@
--
-- CMSG_CRAFTING_ORDER_REPORT_PLAYER: persist player reports filed against a crafting-order participant.
--
DROP TABLE IF EXISTS `crafting_order_reports`;
CREATE TABLE `crafting_order_reports` (
`ReportID` bigint unsigned NOT NULL AUTO_INCREMENT,
`OrderID` bigint unsigned NOT NULL DEFAULT '0',
`ReporterGuid` bigint unsigned NOT NULL DEFAULT '0',
`ReportedGuid` bigint unsigned NOT NULL DEFAULT '0',
`ReportType` int NOT NULL DEFAULT '0',
`MajorCategory` int NOT NULL DEFAULT '0',
`MinorCategoryFlags` int NOT NULL DEFAULT '0',
`Comment` text,
`ReportTime` bigint NOT NULL DEFAULT '0',
PRIMARY KEY (`ReportID`),
KEY `idx_order` (`OrderID`),
KEY `idx_reported` (`ReportedGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,44 +0,0 @@
-- Midnight 12.1 Housing WIP persistence required by HousingHandler.cpp.
CREATE TABLE IF NOT EXISTS `character_housing` (
`OwnerGuid` bigint unsigned NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`CosmeticOwnerGuid` varchar(64) NOT NULL,
`NeighborhoodGuid` varchar(64) NOT NULL,
`PlotID` tinyint unsigned NOT NULL DEFAULT 0,
`HouseSettingFlags` int unsigned NOT NULL DEFAULT 0,
`ReservationTime` timestamp NULL DEFAULT NULL,
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`OwnerGuid`),
UNIQUE KEY `uk_character_housing_house` (`HouseGuid`),
KEY `idx_character_housing_neighborhood` (`NeighborhoodGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_neighborhood` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`OwnerGuid` bigint unsigned NOT NULL,
`Name` varchar(64) NOT NULL,
`Type` tinyint unsigned NOT NULL DEFAULT 0,
`Flags` int unsigned NOT NULL DEFAULT 0,
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`NeighborhoodGuid`),
KEY `idx_housing_neighborhood_owner` (`OwnerGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `account_housing_decor` (
`BattlenetAccountId` int unsigned NOT NULL,
`DecorId` int unsigned NOT NULL,
`Quantity` int unsigned NOT NULL DEFAULT 0,
`AcquiredAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`BattlenetAccountId`, `DecorId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `character_housing_permission` (
`HouseGuid` varchar(64) NOT NULL,
`PlayerGuid` bigint unsigned NOT NULL,
`PermissionFlags` int unsigned NOT NULL DEFAULT 0,
`GrantedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`HouseGuid`, `PlayerGuid`),
KEY `idx_character_housing_permission_player` (`PlayerGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,67 +0,0 @@
-- Midnight 12.1 Housing Part 2: placed decor and idempotent deferred-decor redemption.
CREATE TABLE IF NOT EXISTS `housing_placed_decor` (
`DecorGuid` varchar(64) NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`OwnerGuid` bigint unsigned NOT NULL,
`PositionX` float NOT NULL,
`PositionY` float NOT NULL,
`PositionZ` float NOT NULL,
`RotationX` float NOT NULL,
`RotationY` float NOT NULL,
`RotationZ` float NOT NULL,
`Scale` float NOT NULL DEFAULT 1,
`AttachParentGuid` varchar(64) NOT NULL,
`RoomGuid` varchar(64) NOT NULL,
`ParentHouseFixtureGuid` varchar(64) NOT NULL,
`PlacedComponentID` int NOT NULL DEFAULT 0,
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`DecorGuid`),
KEY `idx_housing_placed_decor_house` (`HouseGuid`),
KEY `idx_housing_placed_decor_owner` (`OwnerGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_deferred_decor_redemption` (
`BattlenetAccountId` int unsigned NOT NULL,
`TransactionID` int unsigned NOT NULL,
`DecorID` int unsigned NOT NULL,
`DecorGuid` varchar(64) NOT NULL,
`RedeemedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`BattlenetAccountId`, `TransactionID`),
UNIQUE KEY `uq_housing_deferred_decor_guid` (`DecorGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Capture-backed static plot metadata. Account/character GUIDs are intentionally
-- excluded: the server binds a reserved plot to its owner at runtime.
CREATE TABLE IF NOT EXISTS `housing_plot_template` (
`PlotID` smallint unsigned NOT NULL,
`ExteriorMapID` smallint unsigned NOT NULL,
`InteriorMapID` smallint unsigned NOT NULL,
`DestinationX` float NOT NULL,
`DestinationY` float NOT NULL,
`DestinationZ` float NOT NULL,
`DestinationO` float NOT NULL,
`CornerstoneEntry` int unsigned NOT NULL,
`VerifiedBuild` int NOT NULL DEFAULT 0,
PRIMARY KEY (`PlotID`, `ExteriorMapID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Plot 15 is the complete plot/Cornerstone/teleport tuple observed in the
-- 12.1.0.69587 Housing capture.
DELETE FROM `housing_plot_template` WHERE `PlotID` = 15 AND `ExteriorMapID` = 2735;
INSERT INTO `housing_plot_template`
(`PlotID`, `ExteriorMapID`, `InteriorMapID`, `DestinationX`, `DestinationY`,
`DestinationZ`, `DestinationO`, `CornerstoneEntry`, `VerifiedBuild`)
VALUES
(15, 2735, 2783, 2765.7249, 119.3435, 66.871, 1.11701298, 457142, 69587);
-- Midnight 12.1.0.69587 Housing: align Plot 15 teleport with its captured Cornerstone.
UPDATE `housing_plot_template`
SET `DestinationX` = 2765.7249,
`DestinationY` = 119.3435,
`DestinationZ` = 66.8710,
`DestinationO` = 1.11701298,
`CornerstoneEntry` = 457142,
`VerifiedBuild` = 69587
WHERE `PlotID` = 15 AND `ExteriorMapID` = 2735;
@@ -1,172 +0,0 @@
-- Midnight 12.1.0.69587 Housing dynamic entity persistence.
-- Rows are house-scoped because captured object GUIDs and attachment graphs are instance data.
CREATE TABLE IF NOT EXISTS `housing_room_entity` (
`RoomGuid` varchar(64) NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`HouseRoomID` int NOT NULL,
`Flags` int NOT NULL DEFAULT 0,
`PositionX` float NOT NULL DEFAULT 0,
`PositionY` float NOT NULL DEFAULT 0,
`PositionZ` float NOT NULL DEFAULT 0,
`RotationX` float NOT NULL DEFAULT 0,
`RotationY` float NOT NULL DEFAULT 0,
`RotationZ` float NOT NULL DEFAULT 0,
`RotationW` float NOT NULL DEFAULT 1,
`Scale` float NOT NULL DEFAULT 1,
`AttachmentFlags` tinyint unsigned NOT NULL DEFAULT 3,
PRIMARY KEY (`RoomGuid`),
KEY `idx_housing_room_house` (`HouseGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_room_component_entity` (
`EntityGuid` varchar(64) NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`RoomGuid` varchar(64) NOT NULL,
`FileDataID` int unsigned NOT NULL,
`IsWMO` tinyint unsigned NOT NULL DEFAULT 1,
`IsRoom` tinyint unsigned NOT NULL DEFAULT 1,
`AttachParentGuid` varchar(64) NOT NULL,
`PositionX` float NOT NULL DEFAULT 0,
`PositionY` float NOT NULL DEFAULT 0,
`PositionZ` float NOT NULL DEFAULT 0,
`RotationX` float NOT NULL DEFAULT 0,
`RotationY` float NOT NULL DEFAULT 0,
`RotationZ` float NOT NULL DEFAULT 0,
`RotationW` float NOT NULL DEFAULT 1,
`Scale` float NOT NULL DEFAULT 1,
`AttachmentFlags` tinyint unsigned NOT NULL DEFAULT 3,
`RoomComponentOptionID` int NOT NULL DEFAULT 0,
`RoomComponentID` int NOT NULL DEFAULT 0,
`RoomComponentType` tinyint unsigned NOT NULL DEFAULT 0,
`HouseThemeID` int NOT NULL DEFAULT 0,
`RoomComponentTextureID` int NOT NULL DEFAULT 0,
`RoomComponentTypeParam` int NOT NULL DEFAULT 0,
PRIMARY KEY (`EntityGuid`),
KEY `idx_housing_room_component_house` (`HouseGuid`),
KEY `idx_housing_room_component_room` (`RoomGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_fixture_entity` (
`EntityGuid` varchar(64) NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`FileDataID` int unsigned NOT NULL,
`IsWMO` tinyint unsigned NOT NULL DEFAULT 1,
`IsRoom` tinyint unsigned NOT NULL DEFAULT 0,
`AttachParentGuid` varchar(64) NOT NULL,
`PositionX` float NOT NULL DEFAULT 0,
`PositionY` float NOT NULL DEFAULT 0,
`PositionZ` float NOT NULL DEFAULT 0,
`RotationX` float NOT NULL DEFAULT 0,
`RotationY` float NOT NULL DEFAULT 0,
`RotationZ` float NOT NULL DEFAULT 0,
`RotationW` float NOT NULL DEFAULT 1,
`Scale` float NOT NULL DEFAULT 1,
`AttachmentFlags` tinyint unsigned NOT NULL DEFAULT 3,
`ExteriorComponentID` int NOT NULL DEFAULT 0,
`HouseExteriorWmoDataID` int NOT NULL DEFAULT 0,
`ExteriorComponentHookID` int NOT NULL DEFAULT -1,
`ExteriorComponentType` tinyint unsigned NOT NULL DEFAULT 0,
`Size` tinyint unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`EntityGuid`),
KEY `idx_housing_fixture_house` (`HouseGuid`),
KEY `idx_housing_fixture_parent` (`AttachParentGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SET @housing_sql = IF(
EXISTS (
SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `COLUMN_NAME` = 'EntityGuid'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD COLUMN `EntityGuid` varchar(64) NULL AFTER `DecorGuid`'
);
PREPARE housing_stmt FROM @housing_sql;
EXECUTE housing_stmt;
DEALLOCATE PREPARE housing_stmt;
SET @housing_sql = IF(
EXISTS (
SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `COLUMN_NAME` = 'FileDataID'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD COLUMN `FileDataID` int unsigned NOT NULL DEFAULT 0 AFTER `OwnerGuid`'
);
PREPARE housing_stmt FROM @housing_sql;
EXECUTE housing_stmt;
DEALLOCATE PREPARE housing_stmt;
SET @housing_sql = IF(
EXISTS (
SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `COLUMN_NAME` = 'RotationW'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD COLUMN `RotationW` float NOT NULL DEFAULT 1 AFTER `RotationZ`'
);
PREPARE housing_stmt FROM @housing_sql;
EXECUTE housing_stmt;
DEALLOCATE PREPARE housing_stmt;
SET @housing_sql = IF(
EXISTS (
SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `COLUMN_NAME` = 'Flags'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD COLUMN `Flags` tinyint unsigned NOT NULL DEFAULT 0 AFTER `PlacedComponentID`'
);
PREPARE housing_stmt FROM @housing_sql;
EXECUTE housing_stmt;
DEALLOCATE PREPARE housing_stmt;
SET @housing_sql = IF(
EXISTS (
SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `COLUMN_NAME` = 'IsWMO'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD COLUMN `IsWMO` tinyint unsigned NOT NULL DEFAULT 0 AFTER `Flags`'
);
PREPARE housing_stmt FROM @housing_sql;
EXECUTE housing_stmt;
DEALLOCATE PREPARE housing_stmt;
SET @housing_sql = IF(
EXISTS (
SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `COLUMN_NAME` = 'IsRoom'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD COLUMN `IsRoom` tinyint unsigned NOT NULL DEFAULT 0 AFTER `IsWMO`'
);
PREPARE housing_stmt FROM @housing_sql;
EXECUTE housing_stmt;
DEALLOCATE PREPARE housing_stmt;
SET @housing_sql = IF(
EXISTS (
SELECT 1 FROM `information_schema`.`COLUMNS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `COLUMN_NAME` = 'AttachmentFlags'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD COLUMN `AttachmentFlags` tinyint unsigned NOT NULL DEFAULT 3 AFTER `IsRoom`'
);
PREPARE housing_stmt FROM @housing_sql;
EXECUTE housing_stmt;
DEALLOCATE PREPARE housing_stmt;
@@ -1,120 +0,0 @@
-- Midnight 12.1.0.69587 Housing: data-driven Alliance and Horde plot catalogue.
-- Source: NeighborhoodMap.db2 and NeighborhoodPlot.db2 from build 69587.
-- NeighborhoodMap 1 = Alliance map 2735; NeighborhoodMap 2 = Horde map 2736.
DELETE FROM `housing_plot_template` WHERE `ExteriorMapID` IN (2735, 2736);
INSERT INTO `housing_plot_template`
(`PlotID`, `ExteriorMapID`, `InteriorMapID`, `DestinationX`, `DestinationY`,
`DestinationZ`, `DestinationO`, `CornerstoneEntry`, `VerifiedBuild`)
VALUES
(0, 2736, 2783, 1256.38977, 1088.05249, 55.6567001, 1.64061153, 475055, 69587),
(1, 2736, 2783, 774.483398, -474.99411, 11.7054996, 4.14515686, 475085, 69587),
(2, 2736, 2783, 1926.21155, 946.071411, 101.642197, 1.91113889, 475054, 69587),
(3, 2736, 2783, 794.223816, -207.5298, 15.6171999, 3.48193121, 475094, 69587),
(4, 2736, 2783, 1610.8241, -242.196106, 76.2837982, 3.38593888, 475067, 69587),
(5, 2736, 2783, 736.202026, -436.041199, 3.1479001, 2.46964121, 475106, 69587),
(6, 2736, 2783, 652.970093, 39.7509003, 4.17980003, 3.08050632, 475076, 69587),
(7, 2736, 2783, 576.01239, -318.849792, 6.82270002, 2.18166208, 569611, 69587),
(8, 2736, 2783, 1341.99158, -633.449585, 21.2838993, 5.3494339, 475072, 69587),
(9, 2736, 2783, 1666.97473, 1050.54932, 48.5917015, 1.07337832, 475057, 69587),
(10, 2736, 2783, 1267.80164, -168.746399, 73.0510025, 4.11025, 475095, 69587),
(11, 2736, 2783, 1104.66479, 883.886475, 6.83330011, 3.25503969, 475061, 69587),
(12, 2736, 2783, 547.151672, 638.714294, 154.810196, 2.60054159, 582082, 69587),
(13, 2736, 2783, 902.671082, -542.786316, 1.96220005, 4.59021568, 475091, 69587),
(14, 2736, 2783, 1179.80969, -640.692871, 5.58500004, 4.82583666, 475079, 69587),
(15, 2736, 2783, 2153.27197, -741.383484, 142.751694, 2.69653416, 475071, 69587),
(16, 2736, 2783, 1481.15002, -7.52926016, 78.217598, 5.6548667, 576758, 69587),
(17, 2736, 2783, 959.952881, 841.212402, 4.7887001, 2.23402309, 567160, 69587),
(18, 2736, 2783, 1528.53479, 998.123779, 35.6212997, 6.24828339, 475059, 69587),
(19, 2736, 2783, 383.664795, -107.684196, 6.49800014, 3.13286591, 569610, 69587),
(20, 2736, 2783, 1866.99902, -517.239807, 130.538696, 2.53072786, 475092, 69587),
(21, 2736, 2783, 1658.8584, -166.788193, 81.0233002, 4.56403685, 475096, 69587),
(22, 2736, 2783, 485.596985, 305.609894, 99.2686996, 5.6286869, 475086, 69587),
(23, 2736, 2783, 1922.68811, -706.482483, 133.981598, 6.03883934, 475080, 69587),
(24, 2736, 2783, 227.097504, 652.787415, 11.7489004, 3.28121901, 566793, 69587),
(25, 2736, 2783, 1841.39746, 663.865295, 88.3912964, 0.305432796, 475051, 69587),
(26, 2736, 2783, 1080.48035, 1021.32343, 3.69679999, 2.44346094, 475063, 69587),
(27, 2736, 2783, 1166.09485, 461.580292, 153.914307, 3.14159274, 475064, 69587),
(28, 2736, 2783, 1662.88965, 912.213074, 37.5280991, 1.43990111, 475062, 69587),
(29, 2736, 2783, 1167.75415, 159.078201, 34.9571991, 3.97062373, 475104, 69587),
(30, 2736, 2783, 955.514221, 474.296387, 108.533096, 2.53072786, 475060, 69587),
(31, 2736, 2783, 2076.98438, -272.490295, 138.3172, 6.16101313, 475098, 69587),
(32, 2736, 2783, 670.749878, 434.961212, 9.01790047, 4.26732969, 475081, 69587),
(33, 2736, 2783, 1127.10754, 768.396118, 17.6096992, 0.637045383, 475053, 69587),
(34, 2736, 2783, 1310.15015, -108.338898, 73.1512985, 1.71042502, 475073, 69587),
(35, 2736, 2783, 1789.92896, -948.381226, 92.4789963, 4.24987698, 475102, 69587),
(36, 2736, 2783, 1803.66797, 641.84259, 84.8967972, 4.20624399, 475066, 69587),
(37, 2736, 2783, 307.560699, 79.0978012, 23.3638992, 2.88852072, 569609, 69587),
(38, 2736, 2783, 1844.10413, -877.720581, 120.786003, 5.63741398, 475077, 69587),
(39, 2736, 2783, 2234.229, -868.239929, 160.227798, 5.06145668, 582083, 69587),
(40, 2736, 2783, 1026.59143, 165.963898, 31.0340996, 3.54301858, 475090, 69587),
(41, 2736, 2783, 1340.33936, 619.31427, 42.0043983, 4.56403589, 475058, 69587),
(42, 2736, 2783, 1760.35242, -864.990601, 116.558601, 3.28994608, 475100, 69587),
(43, 2736, 2783, 642.297485, 706.875488, 113.917702, 2.60054159, 582085, 69587),
(44, 2736, 2783, 1900.57751, -448.425995, 136.894302, 0.0436336994, 475068, 69587),
(45, 2736, 2783, 1883.48804, -340.904388, 129.694305, 1.57952571, 475097, 69587),
(46, 2736, 2783, 2266.896, -588.512085, 160.835297, 0.654502392, 475083, 69587),
(47, 2736, 2783, 1363.78406, 83.729599, 50.0439987, 0.506145716, 475093, 69587),
(48, 2736, 2783, 1213.9884, -12.2238998, 104.167999, 0.986114979, 475088, 69587),
(49, 2736, 2783, 403.947205, 195.331406, 109.733704, 4.5465827, 475087, 69587),
(50, 2736, 2783, 1033.56128, 698.043579, 9.05720043, 4.45058966, 475052, 69587),
(51, 2736, 2783, 640.64093, -114.141296, 2.6085, 3.26376581, 475105, 69587),
(52, 2736, 2783, 1668.2832, -676.47168, 99.8794022, 3.52556562, 475099, 69587),
(53, 2736, 2783, 1643.02209, -567.601013, 100.008598, 3.12413931, 475103, 69587),
(54, 2736, 2783, 748.523315, 840.075317, 7.98140001, 3.05432749, 582084, 69587),
(0, 2735, 2783, 2939.34375, -212.255402, 113.320999, 5.83812618, 527268, 69587),
(1, 2735, 2783, 2675.42505, 649.38031, 49.5349998, 5.27089405, 527310, 69587),
(2, 2735, 2783, 2516.89282, 161.045303, 60.2431984, 0.314159393, 527266, 69587),
(3, 2735, 2783, 3157.21509, -526.436829, 190.954803, 0.401426077, 527292, 69587),
(4, 2735, 2783, 3495.69702, 1403.7948, 4.9604001, 4.64257669, 571209, 69587),
(5, 2735, 2783, 2613.41748, 963.440186, 36.8871002, 0.523599386, 527286, 69587),
(6, 2735, 2783, 2663.64502, -444.185089, 121.045403, 0.130899906, 527260, 69587),
(7, 2735, 2783, 3569.28174, 268.887787, 102.098198, 4.93928146, 527282, 69587),
(8, 2735, 2783, 2358.58569, -3.76069999, 100.083702, 2.18166304, 527274, 69587),
(9, 2735, 2783, 3550.79004, 319.627991, 95.6286011, 2.32128859, 527294, 69587),
(10, 2735, 2783, 2456.32568, 284.006012, 49.6328011, 2.35619521, 527301, 69587),
(11, 2735, 2783, 2940.15527, 123.1642, 62.9803009, 3.14159274, 527302, 69587),
(12, 2735, 2783, 3341.06567, 1518.95337, 7.14669991, 1.85877991, 571211, 69587),
(13, 2735, 2783, 2818.31909, 886.295898, 30.5053997, 0.0785398483, 527311, 69587),
(14, 2735, 2783, 2726.41943, 1072.91638, 27.5897999, 5.46288013, 527265, 69587),
(15, 2735, 2783, 2765.72485, 119.343498, 66.8710022, 1.11701322, 527278, 69587),
(16, 2735, 2783, 2966.34058, 99.1072998, 64.9800034, 5.41924858, 527272, 69587),
(17, 2735, 2783, 2925.4436, -347.223694, 120.3004, 5.5065136, 527262, 69587),
(18, 2735, 2783, 2284.64014, -217.274994, 116.247002, 3.57792521, 527277, 69587),
(19, 2735, 2783, 3327.42847, 1099.90051, 13.0636997, 2.24275255, 527295, 69587),
(20, 2735, 2783, 2470.12524, -313.879486, 101.591797, 2.89724684, 527306, 69587),
(21, 2735, 2783, 2592.14624, -610.73053, 137.939896, 4.76474857, 527281, 69587),
(22, 2735, 2783, 3068.99902, -582.770874, 214.505096, 2.48709488, 527314, 69587),
(23, 2735, 2783, 3306.93481, -593.259888, 207.962799, 5.16617489, 527290, 69587),
(24, 2735, 2783, 3802.90234, 1153.36218, 8.78120041, 0.043633461, 527303, 69587),
(25, 2735, 2783, 3439.79419, 1462.99548, 8.06919956, 1.21300626, 571207, 69587),
(26, 2735, 2783, 2612.52954, 640.883423, 47.2089005, 4.97418833, 527264, 69587),
(27, 2735, 2783, 3639.57544, 260.099396, 104.364304, 5.31452799, 527261, 69587),
(28, 2735, 2783, 3637.177, 1360.49243, 33.8053017, 1.48353446, 571210, 69587),
(29, 2735, 2783, 3490.44482, 1174.66431, 2.34850001, 0.157079697, 527309, 69587),
(30, 2735, 2783, 2697.58203, 819.94751, 44.1293983, 3.14159274, 527275, 69587),
(31, 2735, 2783, 3366.71436, -401.5177, 186.404907, 2.68780756, 527279, 69587),
(32, 2735, 2783, 3131.57935, -650.777283, 226.326599, 5.68104696, 527283, 69587),
(33, 2735, 2783, 2479.93823, -87.535202, 95.2116013, 0.375246763, 527285, 69587),
(34, 2735, 2783, 3470.93481, 735.581787, 81.4804001, 2.35619521, 527313, 69587),
(35, 2735, 2783, 2440.76001, 929.116028, 35.1739998, 0.514872551, 527291, 69587),
(36, 2735, 2783, 2734.84351, 1141.5863, 24.9641991, 0.383973122, 527271, 69587),
(37, 2735, 2783, 2505.19775, 554.90918, 40.7759018, 3.99680424, 527269, 69587),
(38, 2735, 2783, 2581.07568, -334.281586, 106.215599, 2.26020288, 527308, 69587),
(39, 2735, 2783, 3601.63696, 640.029419, 83.4679031, 1.70169795, 527300, 69587),
(40, 2735, 2783, 3519.93555, 1456.10291, 9.42710018, 5.96029949, 571208, 69587),
(41, 2735, 2783, 2190.61084, -336.132385, 98.4821014, 3.13286591, 527297, 69587),
(42, 2735, 2783, 3589.02148, 510.005615, 89.3632965, 4.8432889, 527270, 69587),
(43, 2735, 2783, 3643.11548, 1204.49951, 37.2111015, 5.72467995, 527299, 69587),
(44, 2735, 2783, 3646.68457, 346.107086, 102.6371, 0.462513924, 527293, 69587),
(45, 2735, 2783, 3457.3501, 668.078979, 86.7388, 3.49065924, 527263, 69587),
(46, 2735, 2783, 3164.2666, 348.949188, 73.8582993, 0.0261843204, 527276, 69587),
(47, 2735, 2783, 3317.81323, 429.88031, 71.9238968, 4.38077641, 527288, 69587),
(48, 2735, 2783, 3048.70288, 824.377808, 74.6530991, 1.63188303, 527289, 69587),
(49, 2735, 2783, 3130.8457, 405.746613, 74.009201, 3.01069355, 527267, 69587),
(50, 2735, 2783, 3290.37061, 1000.69153, 22.6543007, 2.46964121, 527280, 69587),
(51, 2735, 2783, 3360.62622, 483.581207, 71.9281006, 1.77151132, 527298, 69587),
(52, 2735, 2783, 3362.92432, 1005.84589, 32.0760994, 5.68977356, 527304, 69587),
(53, 2735, 2783, 3009.36255, 794.764587, 74.5634003, 3.86590457, 527284, 69587),
(54, 2735, 2783, 3151.45947, 300.622101, 73.3356018, 4.75602245, 527305, 69587);
@@ -1,130 +0,0 @@
-- Complete NeighborhoodPlot transforms for dynamic Alliance and Horde housing entities.
ALTER TABLE `housing_plot_template`
ADD COLUMN `NeighborhoodMapID` int unsigned NOT NULL DEFAULT 0 AFTER `PlotID`,
ADD COLUMN `HousePositionX` float NOT NULL DEFAULT 0 AFTER `CornerstoneEntry`,
ADD COLUMN `HousePositionY` float NOT NULL DEFAULT 0 AFTER `HousePositionX`,
ADD COLUMN `HousePositionZ` float NOT NULL DEFAULT 0 AFTER `HousePositionY`,
ADD COLUMN `HouseRotationX` float NOT NULL DEFAULT 0 AFTER `HousePositionZ`,
ADD COLUMN `HouseRotationY` float NOT NULL DEFAULT 0 AFTER `HouseRotationX`,
ADD COLUMN `HouseRotationZ` float NOT NULL DEFAULT 0 AFTER `HouseRotationY`,
ADD COLUMN `CornerstonePositionX` float NOT NULL DEFAULT 0 AFTER `HouseRotationZ`,
ADD COLUMN `CornerstonePositionY` float NOT NULL DEFAULT 0 AFTER `CornerstonePositionX`,
ADD COLUMN `CornerstonePositionZ` float NOT NULL DEFAULT 0 AFTER `CornerstonePositionY`,
ADD COLUMN `CornerstoneRotationX` float NOT NULL DEFAULT 0 AFTER `CornerstonePositionZ`,
ADD COLUMN `CornerstoneRotationY` float NOT NULL DEFAULT 0 AFTER `CornerstoneRotationX`,
ADD COLUMN `CornerstoneRotationZ` float NOT NULL DEFAULT 0 AFTER `CornerstoneRotationY`,
ADD COLUMN `WorldStateID` int NOT NULL DEFAULT 0 AFTER `CornerstoneRotationZ`,
ADD COLUMN `PlotGameObjectID` int NOT NULL DEFAULT 0 AFTER `WorldStateID`,
ADD KEY `idx_housing_plot_neighborhood` (`NeighborhoodMapID`, `PlotID`);
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1289.82996, `HousePositionY`=1126.31995, `HousePositionZ`=57.0598984, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=4.04904175, `CornerstonePositionX`=1256.18054, `CornerstonePositionY`=1091.04517, `CornerstonePositionZ`=55.7604179, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.64061153, `WorldStateID`=29778, `PlotGameObjectID`=0 WHERE `PlotID`=0 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1239.09375, `HousePositionY`=-199.75, `HousePositionZ`=74.0639954, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=772.871521, `CornerstonePositionY`=-477.524323, `CornerstonePositionZ`=11.7048616, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.14515686, `WorldStateID`=29725, `PlotGameObjectID`=0 WHERE `PlotID`=1 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1236.40625, `HousePositionY`=-56.703125, `HousePositionZ`=76.3940125, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1925.21008, `CornerstonePositionY`=948.899292, `CornerstonePositionZ`=101.645851, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.91113889, `WorldStateID`=29736, `PlotGameObjectID`=0 WHERE `PlotID`=2 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1320.15283, `HousePositionY`=-73.6458359, `HousePositionZ`=74.2064514, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=791.395813, `CornerstonePositionY`=-208.53125, `CornerstonePositionZ`=15.6006947, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.48193121, `WorldStateID`=29745, `PlotGameObjectID`=0 WHERE `PlotID`=3 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1499.40454, `HousePositionY`=59.0815964, `HousePositionZ`=77.1372986, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1607.91321, `CornerstonePositionY`=-242.921875, `CornerstonePositionZ`=76.2829895, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.38593888, `WorldStateID`=29755, `PlotGameObjectID`=0 WHERE `PlotID`=4 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1675.29163, `HousePositionY`=-190.513885, `HousePositionZ`=78.3776474, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=733.854187, `CornerstonePositionY`=-434.173615, `CornerstonePositionZ`=2.39409733, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.46964121, `WorldStateID`=29763, `PlotGameObjectID`=0 WHERE `PlotID`=5 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1543.58679, `HousePositionY`=-33.640625, `HousePositionZ`=78.4231339, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=649.975708, `CornerstonePositionY`=39.9340286, `CornerstonePositionZ`=3.91840291, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.08050632, `WorldStateID`=29765, `PlotGameObjectID`=0 WHERE `PlotID`=6 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1149.98608, `HousePositionY`=-109.125, `HousePositionZ`=73.9778976, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=574.291687, `CornerstonePositionY`=-316.392365, `CornerstonePositionZ`=7.14350891, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.18166208, `WorldStateID`=29766, `PlotGameObjectID`=0 WHERE `PlotID`=7 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1621.55005, `HousePositionY`=-266.993011, `HousePositionZ`=74.520401, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1343.776, `CornerstonePositionY`=-635.861145, `CornerstonePositionZ`=21.166666, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.3494339, `WorldStateID`=29767, `PlotGameObjectID`=0 WHERE `PlotID`=8 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=798.484375, `HousePositionY`=-264.90451, `HousePositionZ`=33.8332672, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1668.40625, `CornerstonePositionY`=1053.18579, `CornerstonePositionZ`=48.4670143, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.07337832, `WorldStateID`=29768, `PlotGameObjectID`=0 WHERE `PlotID`=9 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=988.774292, `HousePositionY`=154.793411, `HousePositionZ`=31.3477249, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1266.10242, `CornerstonePositionY`=-171.21875, `CornerstonePositionZ`=72.9337311, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.11025, `WorldStateID`=29726, `PlotGameObjectID`=0 WHERE `PlotID`=10 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=2104.53296, `HousePositionY`=-298.588531, `HousePositionZ`=136.801758, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1101.68408, `CornerstonePositionY`=883.546875, `CornerstonePositionZ`=6.83333349, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.25503969, `WorldStateID`=29727, `PlotGameObjectID`=0 WHERE `PlotID`=11 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=503.543396, `HousePositionY`=-81.2135391, `HousePositionZ`=1.46946418, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=519.734375, `CornerstonePositionY`=693.203125, `CornerstonePositionZ`=155.520828, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.60054159, `WorldStateID`=29728, `PlotGameObjectID`=0 WHERE `PlotID`=12 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=673.842041, `HousePositionY`=11.3559027, `HousePositionZ`=22.7558384, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=902.305542, `CornerstonePositionY`=-545.763916, `CornerstonePositionZ`=1.43055558, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.59021568, `WorldStateID`=29729, `PlotGameObjectID`=0 WHERE `PlotID`=13 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1883.17883, `HousePositionY`=-282.579865, `HousePositionZ`=130.343445, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1180.14929, `CornerstonePositionY`=-643.673645, `CornerstonePositionZ`=5.70659733, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.82583666, `WorldStateID`=29730, `PlotGameObjectID`=0 WHERE `PlotID`=14 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=632.673645, `HousePositionY`=-132.336807, `HousePositionZ`=3.62052846, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2150.56421, `CornerstonePositionY`=-740.092041, `CornerstonePositionZ`=141.666672, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.69653416, `WorldStateID`=29731, `PlotGameObjectID`=0 WHERE `PlotID`=15 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=416.888885, `HousePositionY`=-121.208344, `HousePositionZ`=4.27795506, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1493.41321, `CornerstonePositionY`=7.58159733, `CornerstonePositionZ`=78.328125, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.6548667, `WorldStateID`=29732, `PlotGameObjectID`=0 WHERE `PlotID`=16 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1368.724, `HousePositionY`=230.901047, `HousePositionZ`=44.7523727, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=958.105896, `CornerstonePositionY`=843.576416, `CornerstonePositionZ`=4.78819466, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.23402309, `WorldStateID`=29733, `PlotGameObjectID`=0 WHERE `PlotID`=17 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1728.65454, `HousePositionY`=-874.815979, `HousePositionZ`=116.490936, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1531.53296, `CornerstonePositionY`=998.019104, `CornerstonePositionZ`=36.2552071, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=6.24828339, `WorldStateID`=29734, `PlotGameObjectID`=0 WHERE `PlotID`=18 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1934.45483, `HousePositionY`=-541.807312, `HousePositionZ`=135.931961, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=380.664948, `CornerstonePositionY`=-107.65799, `CornerstonePositionZ`=6, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.13286591, `WorldStateID`=29735, `PlotGameObjectID`=0 WHERE `PlotID`=19 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1629.94971, `HousePositionY`=-688.880188, `HousePositionZ`=97.8434296, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1864.54163, `CornerstonePositionY`=-515.519104, `CornerstonePositionZ`=130.229172, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.53072786, `WorldStateID`=29737, `PlotGameObjectID`=0 WHERE `PlotID`=20 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=795.06427, `HousePositionY`=-388.598969, `HousePositionZ`=40.5091438, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1658.41492, `CornerstonePositionY`=-169.755203, `CornerstonePositionZ`=81.0329895, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.56403685, `WorldStateID`=29738, `PlotGameObjectID`=0 WHERE `PlotID`=21 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=964.855896, `HousePositionY`=-497.982635, `HousePositionZ`=37.9858513, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=488.315979, `CornerstonePositionY`=304.34201, `CornerstonePositionZ`=99.2083359, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.6286869, `WorldStateID`=29739, `PlotGameObjectID`=0 WHERE `PlotID`=22 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1960.09033, `HousePositionY`=-706.048645, `HousePositionZ`=133.20108, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1925.599, `CornerstonePositionY`=-707.208313, `CornerstonePositionZ`=134.03299, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=6.03883934, `WorldStateID`=29740, `PlotGameObjectID`=0 WHERE `PlotID`=23 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1102.02429, `HousePositionY`=148.515625, `HousePositionZ`=33.9286919, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=224.12674, `CornerstonePositionY`=652.369812, `CornerstonePositionZ`=12.1857643, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.28121901, `WorldStateID`=29741, `PlotGameObjectID`=0 WHERE `PlotID`=24 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1833.07642, `HousePositionY`=-491.034729, `HousePositionZ`=133.244431, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1844.25867, `CornerstonePositionY`=664.767395, `CornerstonePositionZ`=88.5257568, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.305432796, `WorldStateID`=29742, `PlotGameObjectID`=0 WHERE `PlotID`=25 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1274.19446, `HousePositionY`=-626.503479, `HousePositionZ`=37.310154, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1078.18225, `CornerstonePositionY`=1023.25177, `CornerstonePositionZ`=3.14756942, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.44346094, `WorldStateID`=29743, `PlotGameObjectID`=0 WHERE `PlotID`=26 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1955.74658, `HousePositionY`=-447.786469, `HousePositionZ`=137.591614, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1213.32983, `CornerstonePositionY`=462.809021, `CornerstonePositionZ`=154.020828, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.14159274, `WorldStateID`=29724, `PlotGameObjectID`=0 WHERE `PlotID`=27 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1384.30725, `HousePositionY`=119.887154, `HousePositionZ`=49.9795418, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1663.28125, `CornerstonePositionY`=915.1875, `CornerstonePositionZ`=37.6111145, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.43990111, `WorldStateID`=29744, `PlotGameObjectID`=0 WHERE `PlotID`=28 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1175.23792, `HousePositionY`=-600.18927, `HousePositionZ`=37.2994118, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1165.72742, `CornerstonePositionY`=156.866318, `CornerstonePositionZ`=34.9565964, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.97062373, `WorldStateID`=29718, `PlotGameObjectID`=0 WHERE `PlotID`=29 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1595.39929, `HousePositionY`=-601.147583, `HousePositionZ`=97.8911819, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=952.590271, `CornerstonePositionY`=483.579865, `CornerstonePositionZ`=108.670143, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.53072786, `WorldStateID`=29747, `PlotGameObjectID`=0 WHERE `PlotID`=30 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1729.51221, `HousePositionY`=-541.550354, `HousePositionZ`=104.135048, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2079.96191, `CornerstonePositionY`=-272.855896, `CornerstonePositionZ`=138.317703, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=6.16101313, `WorldStateID`=29746, `PlotGameObjectID`=0 WHERE `PlotID`=31 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1771.22742, `HousePositionY`=-953.083313, `HousePositionZ`=116.490997, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=669.458313, `CornerstonePositionY`=432.253479, `CornerstonePositionZ`=9.00173664, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.26732969, `WorldStateID`=29748, `PlotGameObjectID`=0 WHERE `PlotID`=32 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1858.23438, `HousePositionY`=-873.920166, `HousePositionZ`=121.266853, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1129.51917, `CornerstonePositionY`=770.180542, `CornerstonePositionZ`=17.6215286, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.637045383, `WorldStateID`=29749, `PlotGameObjectID`=0 WHERE `PlotID`=33 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=2101.427, `HousePositionY`=-201.295135, `HousePositionZ`=136.801712, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1309.73267, `CornerstonePositionY`=-105.368057, `CornerstonePositionZ`=73.2638702, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.71042502, `WorldStateID`=29750, `PlotGameObjectID`=0 WHERE `PlotID`=34 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=599.267395, `HousePositionY`=-273.642365, `HousePositionZ`=4.28020573, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1788.59033, `CornerstonePositionY`=-951.065979, `CornerstonePositionZ`=92.3142395, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.24987698, `WorldStateID`=29751, `PlotGameObjectID`=0 WHERE `PlotID`=35 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=875.524292, `HousePositionY`=-467.357635, `HousePositionZ`=40.5583839, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1802.2135, `CornerstonePositionY`=639.21875, `CornerstonePositionZ`=85.6006927, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.20624399, `WorldStateID`=29752, `PlotGameObjectID`=0 WHERE `PlotID`=36 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1188.10071, `HousePositionY`=479.788208, `HousePositionZ`=122.239571, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=304.65625, `CornerstonePositionY`=79.8489609, `CornerstonePositionZ`=24.3628483, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.88852072, `WorldStateID`=29753, `PlotGameObjectID`=0 WHERE `PlotID`=37 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1006.46008, `HousePositionY`=920.821167, `HousePositionZ`=7.8577795, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1846.5, `CornerstonePositionY`=-879.526062, `CornerstonePositionZ`=120.711807, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.63741398, `WorldStateID`=29754, `PlotGameObjectID`=0 WHERE `PlotID`=38 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=563.423645, `HousePositionY`=549.201416, `HousePositionZ`=83.2299805, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2235.25513, `CornerstonePositionY`=-871.059021, `CornerstonePositionZ`=160.227432, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.06145668, `WorldStateID`=29720, `PlotGameObjectID`=0 WHERE `PlotID`=39 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1032.36804, `HousePositionY`=660.536438, `HousePositionZ`=9.11426735, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1023.8299, `CornerstonePositionY`=164.791672, `CornerstonePositionZ`=31.1076393, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.54301858, `WorldStateID`=29757, `PlotGameObjectID`=0 WHERE `PlotID`=40 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1877.49658, `HousePositionY`=682.232666, `HousePositionZ`=94.3096695, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1339.89587, `CornerstonePositionY`=616.347229, `CornerstonePositionZ`=42.0034752, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.56403589, `WorldStateID`=29756, `PlotGameObjectID`=0 WHERE `PlotID`=41 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1345.19788, `HousePositionY`=577.53125, `HousePositionZ`=42.0378609, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1757.38538, `CornerstonePositionY`=-865.434021, `CornerstonePositionZ`=116.753471, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.28994608, `WorldStateID`=29722, `PlotGameObjectID`=0 WHERE `PlotID`=42 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1560.4375, `HousePositionY`=1002.44269, `HousePositionZ`=37.3808861, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=639.866333, `CornerstonePositionY`=692.515625, `CornerstonePositionZ`=113.904518, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.60054159, `WorldStateID`=29664, `PlotGameObjectID`=0 WHERE `PlotID`=43 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1100.03125, `HousePositionY`=965.151062, `HousePositionZ`=8.17554188, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1903.57471, `CornerstonePositionY`=-448.295135, `CornerstonePositionZ`=137.003479, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.0436336994, `WorldStateID`=29723, `PlotGameObjectID`=0 WHERE `PlotID`=44 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1676.151, `HousePositionY`=950.605896, `HousePositionZ`=37.4253616, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1883.46179, `CornerstonePositionY`=-337.90451, `CornerstonePositionZ`=129.980911, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.57952571, `WorldStateID`=29758, `PlotGameObjectID`=0 WHERE `PlotID`=45 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1667.92883, `HousePositionY`=1084.51733, `HousePositionZ`=45.9019852, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2269.27612, `CornerstonePositionY`=-586.685791, `CornerstonePositionZ`=161.475693, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.654502392, `WorldStateID`=29759, `PlotGameObjectID`=0 WHERE `PlotID`=46 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=861.373291, `HousePositionY`=478.059021, `HousePositionZ`=69.0119629, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1366.40796, `CornerstonePositionY`=85.1840286, `CornerstonePositionZ`=49.7309036, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.506145716, `WorldStateID`=29760, `PlotGameObjectID`=0 WHERE `PlotID`=47 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=689.965271, `HousePositionY`=445.487854, `HousePositionZ`=7.07972193, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1215.64417, `CornerstonePositionY`=-9.72222233, `CornerstonePositionZ`=104.463539, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.986114979, `WorldStateID`=29761, `PlotGameObjectID`=0 WHERE `PlotID`=48 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1159.89929, `HousePositionY`=787.769104, `HousePositionZ`=17.5986328, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=412.015625, `CornerstonePositionY`=194.885422, `CornerstonePositionZ`=109.75869, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.5465827, `WorldStateID`=29762, `PlotGameObjectID`=0 WHERE `PlotID`=49 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=997.088562, `HousePositionY`=738.880188, `HousePositionZ`=9.48407078, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1032.78479, `CornerstonePositionY`=695.145813, `CornerstonePositionZ`=9.00868034, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.45058966, `WorldStateID`=29719, `PlotGameObjectID`=0 WHERE `PlotID`=50 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=945.284729, `HousePositionY`=511.006958, `HousePositionZ`=69.5376663, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=637.663208, `CornerstonePositionY`=-114.506943, `CornerstonePositionZ`=2.94618058, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.26376581, `WorldStateID`=29769, `PlotGameObjectID`=0 WHERE `PlotID`=51 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=617.628479, `HousePositionY`=631.946167, `HousePositionZ`=81.6513214, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1665.50171, `CornerstonePositionY`=-677.59552, `CornerstonePositionZ`=99.7430573, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.52556562, `WorldStateID`=29770, `PlotGameObjectID`=0 WHERE `PlotID`=52 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=927.53302, `HousePositionY`=819.734375, `HousePositionZ`=7.1142664, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=1640.02258, `CornerstonePositionY`=-567.548645, `CornerstonePositionZ`=99.9861145, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.12413931, `WorldStateID`=29771, `PlotGameObjectID`=0 WHERE `PlotID`=53 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=2, `HousePositionX`=1926.60242, `HousePositionY`=969.859375, `HousePositionZ`=93.4767151, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=745.534729, `CornerstonePositionY`=840.336792, `CornerstonePositionZ`=8.75347233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.05432749, `WorldStateID`=29772, `PlotGameObjectID`=0 WHERE `PlotID`=54 AND `ExteriorMapID`=2736;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2973.0791, `HousePositionY`=-245.322922, `HousePositionZ`=113.170952, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2942.7439, `CornerstonePositionY`=-214.265625, `CornerstonePositionZ`=113.112846, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.83812618, `WorldStateID`=29778, `PlotGameObjectID`=0 WHERE `PlotID`=0 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2706.0791, `HousePositionY`=646.427063, `HousePositionZ`=47.6890335, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2674.31763, `CornerstonePositionY`=651.84552, `CornerstonePositionZ`=49.2256966, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.27089405, `WorldStateID`=29725, `PlotGameObjectID`=0 WHERE `PlotID`=1 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3453.35254, `HousePositionY`=1058.71533, `HousePositionZ`=25.2093105, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2523.34546, `CornerstonePositionY`=171.178818, `CornerstonePositionZ`=60.4097214, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.314159393, `WorldStateID`=29736, `PlotGameObjectID`=0 WHERE `PlotID`=2 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3196.81958, `HousePositionY`=-501.583344, `HousePositionZ`=190.80069, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3166.54688, `CornerstonePositionY`=-525.715271, `CornerstonePositionZ`=190.651047, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.401426077, `WorldStateID`=29745, `PlotGameObjectID`=0 WHERE `PlotID`=3 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3491.65967, `HousePositionY`=1300.32288, `HousePositionZ`=17.0956974, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3495.48779, `CornerstonePositionY`=1400.80212, `CornerstonePositionZ`=4.28472233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.64257669, `WorldStateID`=29755, `PlotGameObjectID`=0 WHERE `PlotID`=4 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2636.1875, `HousePositionY`=996.355896, `HousePositionZ`=37.5333099, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2615.62939, `CornerstonePositionY`=965.467041, `CornerstonePositionZ`=36.890625, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.523599386, `WorldStateID`=29763, `PlotGameObjectID`=0 WHERE `PlotID`=5 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2710.43677, `HousePositionY`=-428.743073, `HousePositionZ`=122.509308, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2662.95312, `CornerstonePositionY`=-427.987854, `CornerstonePositionZ`=121.833344, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.130899906, `WorldStateID`=29765, `PlotGameObjectID`=0 WHERE `PlotID`=6 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3576.45044, `HousePositionY`=234.59549, `HousePositionZ`=102.395523, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3581.92798, `CornerstonePositionY`=265.006958, `CornerstonePositionZ`=102.315979, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.93928146, `WorldStateID`=29766, `PlotGameObjectID`=0 WHERE `PlotID`=7 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2329.74316, `HousePositionY`=34.2204857, `HousePositionZ`=100.206207, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2351.66138, `CornerstonePositionY`=-11.604167, `CornerstonePositionZ`=100.142349, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.18166304, `WorldStateID`=29767, `PlotGameObjectID`=0 WHERE `PlotID`=8 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3524.30469, `HousePositionY`=342.861115, `HousePositionZ`=95.553772, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3547.51489, `CornerstonePositionY`=322.270844, `CornerstonePositionZ`=95.7100677, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.32128859, `WorldStateID`=29768, `PlotGameObjectID`=0 WHERE `PlotID`=9 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2427.0105, `HousePositionY`=5.30902767, `HousePositionZ`=100.029457, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2450.05396, `CornerstonePositionY`=267.446198, `CornerstonePositionZ`=50.2309036, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.35619521, `WorldStateID`=29726, `PlotGameObjectID`=0 WHERE `PlotID`=10 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2915.75781, `HousePositionY`=84.8854141, `HousePositionZ`=63.0604248, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2937.3186, `CornerstonePositionY`=122.1875, `CornerstonePositionZ`=62.7777786, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.14159274, `WorldStateID`=29727, `PlotGameObjectID`=0 WHERE `PlotID`=11 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3326.53394, `HousePositionY`=1484.48096, `HousePositionZ`=12.5476723, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3340.21362, `CornerstonePositionY`=1521.82983, `CornerstonePositionZ`=7.50347233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.85877991, `WorldStateID`=29728, `PlotGameObjectID`=0 WHERE `PlotID`=12 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2844.91675, `HousePositionY`=910.201416, `HousePositionZ`=28.9181652, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2821.30981, `CornerstonePositionY`=886.53125, `CornerstonePositionZ`=30.583334, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.0785398483, `WorldStateID`=29729, `PlotGameObjectID`=0 WHERE `PlotID`=13 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2762.57202, `HousePositionY`=1066.36975, `HousePositionZ`=24.7555389, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2728.46533, `CornerstonePositionY`=1070.72229, `CornerstonePositionZ`=27.2881947, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.46288013, `WorldStateID`=29730, `PlotGameObjectID`=0 WHERE `PlotID`=14 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2771.04614, `HousePositionY`=163.815979, `HousePositionZ`=67.3829193, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2767.04004, `CornerstonePositionY`=122.039932, `CornerstonePositionZ`=66.8993073, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.11701322, `WorldStateID`=29731, `PlotGameObjectID`=0 WHERE `PlotID`=15 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3010.66235, `HousePositionY`=66.3003464, `HousePositionZ`=65.9751968, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2969.21704, `CornerstonePositionY`=98.2552109, `CornerstonePositionZ`=65.4270859, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.41924858, `WorldStateID`=29732, `PlotGameObjectID`=0 WHERE `PlotID`=16 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2948.99316, `HousePositionY`=-331.461823, `HousePositionZ`=118.099068, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2938.39502, `CornerstonePositionY`=-343.118073, `CornerstonePositionZ`=121.434029, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.5065136, `WorldStateID`=29733, `PlotGameObjectID`=0 WHERE `PlotID`=17 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2253.06763, `HousePositionY`=-232.050354, `HousePositionZ`=117.511841, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2287.10083, `CornerstonePositionY`=-228.611115, `CornerstonePositionZ`=116.527786, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.57792521, `WorldStateID`=29734, `PlotGameObjectID`=0 WHERE `PlotID`=18 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3334.87329, `HousePositionY`=1133.49133, `HousePositionZ`=19.1222744, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3325.56079, `CornerstonePositionY`=1102.24829, `CornerstonePositionZ`=13.0920143, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.24275255, `WorldStateID`=29735, `PlotGameObjectID`=0 WHERE `PlotID`=19 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2507.8855, `HousePositionY`=-369.854156, `HousePositionZ`=105.629181, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2471.47583, `CornerstonePositionY`=-331.336823, `CornerstonePositionZ`=101.637154, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.89724684, `WorldStateID`=29737, `PlotGameObjectID`=0 WHERE `PlotID`=20 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2609.5, `HousePositionY`=-486.513885, `HousePositionZ`=122.46122, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2592.77002, `CornerstonePositionY`=-613.664917, `CornerstonePositionZ`=138.177094, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.76474857, `WorldStateID`=29738, `PlotGameObjectID`=0 WHERE `PlotID`=21 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3038.52783, `HousePositionY`=-566.713562, `HousePositionZ`=214.280579, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3065.125, `CornerstonePositionY`=-579.90802, `CornerstonePositionZ`=214.347229, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.48709488, `WorldStateID`=29739, `PlotGameObjectID`=0 WHERE `PlotID`=22 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3339.00879, `HousePositionY`=-607.729187, `HousePositionZ`=204.286819, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3309.42188, `CornerstonePositionY`=-594.9375, `CornerstonePositionZ`=208.557297, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.16617489, `WorldStateID`=29740, `PlotGameObjectID`=0 WHERE `PlotID`=23 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2856.7605, `HousePositionY`=-263.196198, `HousePositionZ`=114.781403, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3803.50171, `CornerstonePositionY`=1159.10596, `CornerstonePositionZ`=8.74826431, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.043633461, `WorldStateID`=29741, `PlotGameObjectID`=0 WHERE `PlotID`=24 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3432.10254, `HousePositionY`=1436.66492, `HousePositionZ`=8.47468376, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3440.84473, `CornerstonePositionY`=1465.80554, `CornerstonePositionZ`=8.31597233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.21300626, `WorldStateID`=29742, `PlotGameObjectID`=0 WHERE `PlotID`=25 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2599.97583, `HousePositionY`=608.112854, `HousePositionZ`=45.1348953, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2615.26392, `CornerstonePositionY`=633.758667, `CornerstonePositionZ`=47.7326393, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.97418833, `WorldStateID`=29743, `PlotGameObjectID`=0 WHERE `PlotID`=26 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3672.76831, `HousePositionY`=244.071182, `HousePositionZ`=104.399696, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3639.85596, `CornerstonePositionY`=259.371521, `CornerstonePositionZ`=104.381943, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.31452799, `WorldStateID`=29724, `PlotGameObjectID`=0 WHERE `PlotID`=27 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3628.06763, `HousePositionY`=1325.21533, `HousePositionZ`=29.6373196, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3637.43848, `CornerstonePositionY`=1363.48096, `CornerstonePositionZ`=33.6493073, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.48353446, `WorldStateID`=29744, `PlotGameObjectID`=0 WHERE `PlotID`=28 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3516.48169, `HousePositionY`=1185.64587, `HousePositionZ`=16.9397984, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3493.40796, `CornerstonePositionY`=1175.13367, `CornerstonePositionZ`=2.31597233, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.157079697, `WorldStateID`=29718, `PlotGameObjectID`=0 WHERE `PlotID`=29 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2662.35669, `HousePositionY`=831.465271, `HousePositionZ`=44.1460228, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2686.68066, `CornerstonePositionY`=813.067688, `CornerstonePositionZ`=43.7934036, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.14159274, `WorldStateID`=29747, `PlotGameObjectID`=0 WHERE `PlotID`=30 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3352.42285, `HousePositionY`=-331.163208, `HousePositionZ`=182.655029, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3368.13721, `CornerstonePositionY`=-403.112854, `CornerstonePositionZ`=186.428818, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.68780756, `WorldStateID`=29746, `PlotGameObjectID`=0 WHERE `PlotID`=31 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3284.97925, `HousePositionY`=-376.534729, `HousePositionZ`=182.794388, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3136.13892, `CornerstonePositionY`=-650.277771, `CornerstonePositionZ`=226.342026, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.68104696, `WorldStateID`=29748, `PlotGameObjectID`=0 WHERE `PlotID`=32 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2510.07642, `HousePositionY`=-53.8263893, `HousePositionZ`=95.4554596, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2478.60938, `CornerstonePositionY`=-80.5520859, `CornerstonePositionZ`=95.2361145, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.375246763, `WorldStateID`=29749, `PlotGameObjectID`=0 WHERE `PlotID`=33 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3457.79004, `HousePositionY`=761.239563, `HousePositionZ`=81.5263519, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3461.76294, `CornerstonePositionY`=728.498291, `CornerstonePositionZ`=81.5017395, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.35619521, `WorldStateID`=29750, `PlotGameObjectID`=0 WHERE `PlotID`=34 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2605.91235, `HousePositionY`=905.784729, `HousePositionZ`=39.1738815, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2440.56592, `CornerstonePositionY`=927.930542, `CornerstonePositionZ`=36.171875, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.514872551, `WorldStateID`=29751, `PlotGameObjectID`=0 WHERE `PlotID`=35 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2763.09204, `HousePositionY`=1170.68579, `HousePositionZ`=25.820612, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2737.625, `CornerstonePositionY`=1142.71008, `CornerstonePositionZ`=24.9652786, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.383973122, `WorldStateID`=29752, `PlotGameObjectID`=0 WHERE `PlotID`=36 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2477.74316, `HousePositionY`=514.446167, `HousePositionZ`=41.3817673, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2510.36035, `CornerstonePositionY`=542.6875, `CornerstonePositionZ`=41.1493073, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.99680424, `WorldStateID`=29753, `PlotGameObjectID`=0 WHERE `PlotID`=37 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2571.625, `HousePositionY`=-299.335083, `HousePositionZ`=105.492233, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2570.73096, `CornerstonePositionY`=-331.211823, `CornerstonePositionZ`=105.463539, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.26020288, `WorldStateID`=29754, `PlotGameObjectID`=0 WHERE `PlotID`=38 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3538.40894, `HousePositionY`=646.15802, `HousePositionZ`=82.6427765, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3602.28638, `CornerstonePositionY`=642.958313, `CornerstonePositionZ`=83.3819427, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.70169795, `WorldStateID`=29720, `PlotGameObjectID`=0 WHERE `PlotID`=39 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3558.43579, `HousePositionY`=1398.24829, `HousePositionZ`=13.0544977, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3522.78052, `CornerstonePositionY`=1455.151, `CornerstonePositionZ`=9.38541698, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.96029949, `WorldStateID`=29757, `PlotGameObjectID`=0 WHERE `PlotID`=40 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2157.54517, `HousePositionY`=-327.392365, `HousePositionZ`=98.6816559, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=2190.29688, `CornerstonePositionY`=-337.149323, `CornerstonePositionZ`=98.519104, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.13286591, `WorldStateID`=29756, `PlotGameObjectID`=0 WHERE `PlotID`=41 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3579.25781, `HousePositionY`=470.298615, `HousePositionZ`=89.6702805, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3597.54175, `CornerstonePositionY`=501.835083, `CornerstonePositionZ`=89.5711823, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.8432889, `WorldStateID`=29722, `PlotGameObjectID`=0 WHERE `PlotID`=42 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3669.58765, `HousePositionY`=1187.625, `HousePositionZ`=37.6142006, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3645.65967, `CornerstonePositionY`=1202.90979, `CornerstonePositionZ`=37.5295143, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.72467995, `WorldStateID`=29664, `PlotGameObjectID`=0 WHERE `PlotID`=43 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3618.14575, `HousePositionY`=361.4375, `HousePositionZ`=96.5879211, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3647.06177, `CornerstonePositionY`=353.182281, `CornerstonePositionZ`=102.725693, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.462513924, `WorldStateID`=29723, `PlotGameObjectID`=0 WHERE `PlotID`=44 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3429.68311, `HousePositionY`=654.460083, `HousePositionZ`=79.9497604, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3453.25439, `CornerstonePositionY`=669.918396, `CornerstonePositionZ`=86.5920181, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.49065924, `WorldStateID`=29758, `PlotGameObjectID`=0 WHERE `PlotID`=45 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3198.88989, `HousePositionY`=365.130219, `HousePositionZ`=65.7899551, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3167.93579, `CornerstonePositionY`=364.013885, `CornerstonePositionZ`=73.8836823, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=0.0261843204, `WorldStateID`=29759, `PlotGameObjectID`=0 WHERE `PlotID`=46 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3333.03906, `HousePositionY`=401.885406, `HousePositionZ`=69.8325729, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3315.51489, `CornerstonePositionY`=427.78125, `CornerstonePositionZ`=71.921875, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.38077641, `WorldStateID`=29760, `PlotGameObjectID`=0 WHERE `PlotID`=47 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3038.48608, `HousePositionY`=861.565979, `HousePositionZ`=74.8148575, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3047.40112, `CornerstonePositionY`=833.147583, `CornerstonePositionZ`=74.6770859, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.63188303, `WorldStateID`=29761, `PlotGameObjectID`=0 WHERE `PlotID`=48 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3092.35425, `HousePositionY`=407.09549, `HousePositionZ`=66.334671, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3119.01904, `CornerstonePositionY`=394.869781, `CornerstonePositionZ`=74.2621536, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.01069355, `WorldStateID`=29762, `PlotGameObjectID`=0 WHERE `PlotID`=49 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3268.73779, `HousePositionY`=1029.94788, `HousePositionZ`=20.3230076, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3288.02271, `CornerstonePositionY`=1002.55902, `CornerstonePositionZ`=22.7534733, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=2.46964121, `WorldStateID`=29719, `PlotGameObjectID`=0 WHERE `PlotID`=50 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3357.65356, `HousePositionY`=523.8125, `HousePositionZ`=71.9353561, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3348.19092, `CornerstonePositionY`=487.526031, `CornerstonePositionZ`=72.3767395, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=1.77151132, `WorldStateID`=29769, `PlotGameObjectID`=0 WHERE `PlotID`=51 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3386.48877, `HousePositionY`=979.743042, `HousePositionZ`=29.0968018, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3365.41138, `CornerstonePositionY`=1004.1684, `CornerstonePositionZ`=32.8020821, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=5.68977356, `WorldStateID`=29770, `PlotGameObjectID`=0 WHERE `PlotID`=52 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=2970.98608, `HousePositionY`=796.392395, `HousePositionZ`=74.7324066, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3003.05908, `CornerstonePositionY`=772.649292, `CornerstonePositionZ`=74.5642395, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=3.86590457, `WorldStateID`=29771, `PlotGameObjectID`=0 WHERE `PlotID`=53 AND `ExteriorMapID`=2735;
UPDATE `housing_plot_template` SET `NeighborhoodMapID`=1, `HousePositionX`=3157.63208, `HousePositionY`=252.003479, `HousePositionZ`=69.2628174, `HouseRotationX`=0, `HouseRotationY`=0, `HouseRotationZ`=0, `CornerstonePositionX`=3151.59033, `CornerstonePositionY`=297.625, `CornerstonePositionZ`=73.4253464, `CornerstoneRotationX`=0, `CornerstoneRotationY`=0, `CornerstoneRotationZ`=4.75602245, `WorldStateID`=29772, `PlotGameObjectID`=0 WHERE `PlotID`=54 AND `ExteriorMapID`=2735;
@@ -1,7 +0,0 @@
-- Captured purchase cost used by the Cornerstone UI for both faction maps.
ALTER TABLE `housing_plot_template`
ADD COLUMN `Cost` bigint unsigned NOT NULL DEFAULT 10000000 AFTER `PlotGameObjectID`;
UPDATE `housing_plot_template`
SET `Cost` = 10000000
WHERE `ExteriorMapID` IN (2735, 2736) AND `VerifiedBuild` = 69587;
@@ -1,17 +0,0 @@
-- Housing plot purchase and relocation audit for both faction neighborhoods.
CREATE TABLE `housing_plot_transaction` (
`TransactionID` bigint unsigned NOT NULL AUTO_INCREMENT,
`OwnerGuid` bigint unsigned NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`NeighborhoodGuid` varchar(64) NOT NULL,
`OldPlotID` tinyint unsigned NOT NULL,
`NewPlotID` tinyint unsigned NOT NULL,
`ExteriorMapID` int unsigned NOT NULL,
`Cost` bigint unsigned NOT NULL DEFAULT 0,
`TransactionType` tinyint unsigned NOT NULL COMMENT '0=purchase, 1=move',
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`TransactionID`),
KEY `idx_housing_plot_transaction_owner` (`OwnerGuid`, `CreatedAt`),
KEY `idx_housing_plot_transaction_house` (`HouseGuid`),
KEY `idx_housing_plot_transaction_plot` (`NeighborhoodGuid`, `NewPlotID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,65 +0,0 @@
-- Runtime lookup indexes for the Housing room, mesh, fixture and decor loaders.
-- These tables contain per-house entities reconstructed from UPDATE_OBJECT captures.
--
-- Keep every index creation idempotent. Character DB updates are applied statement by
-- statement, so a previous failed run may already have created some of these indexes.
SET @sql := IF(
EXISTS(
SELECT 1
FROM `information_schema`.`STATISTICS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_room_entity'
AND `INDEX_NAME` = 'idx_housing_room_house_order'
),
'SELECT 1',
'ALTER TABLE `housing_room_entity` ADD KEY `idx_housing_room_house_order` (`HouseGuid`, `HouseRoomID`)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql := IF(
EXISTS(
SELECT 1
FROM `information_schema`.`STATISTICS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_room_component_entity'
AND `INDEX_NAME` = 'idx_housing_component_house_room'
),
'SELECT 1',
'ALTER TABLE `housing_room_component_entity` ADD KEY `idx_housing_component_house_room` (`HouseGuid`, `RoomGuid`)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql := IF(
EXISTS(
SELECT 1
FROM `information_schema`.`STATISTICS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_fixture_entity'
AND `INDEX_NAME` = 'idx_housing_fixture_house'
),
'SELECT 1',
'ALTER TABLE `housing_fixture_entity` ADD KEY `idx_housing_fixture_house` (`HouseGuid`)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql := IF(
EXISTS(
SELECT 1
FROM `information_schema`.`STATISTICS`
WHERE `TABLE_SCHEMA` = DATABASE()
AND `TABLE_NAME` = 'housing_placed_decor'
AND `INDEX_NAME` = 'idx_housing_decor_house_entity'
),
'SELECT 1',
'ALTER TABLE `housing_placed_decor` ADD KEY `idx_housing_decor_house_entity` (`HouseGuid`, `EntityGuid`)'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
@@ -1,16 +0,0 @@
-- Persists the exact exterior plot return point while a player is inside Map 2783.
-- This keeps Alliance and Horde exits data-driven and prevents cross-faction returns.
CREATE TABLE IF NOT EXISTS `character_housing_return_location` (
`OwnerGuid` bigint unsigned NOT NULL,
`HouseGuid` varchar(64) NOT NULL,
`ExteriorMapID` int unsigned NOT NULL,
`PlotID` tinyint unsigned NOT NULL,
`PositionX` float NOT NULL,
`PositionY` float NOT NULL,
`PositionZ` float NOT NULL,
`Orientation` float NOT NULL,
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`OwnerGuid`),
KEY `idx_housing_return_house` (`HouseGuid`),
KEY `idx_housing_return_plot` (`ExteriorMapID`, `PlotID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,21 +0,0 @@
-- Data-driven exterior door configuration for every Midnight housing plot.
ALTER TABLE `character_housing`
ADD COLUMN `ExteriorMapID` int unsigned NOT NULL DEFAULT 0 AFTER `PlotID`,
ADD KEY `idx_character_housing_map_plot` (`ExteriorMapID`, `PlotID`);
ALTER TABLE `housing_plot_template`
ADD COLUMN `DoorEntry` int unsigned NOT NULL DEFAULT 0 AFTER `CornerstoneEntry`,
ADD KEY `idx_housing_plot_door` (`ExteriorMapID`, `PlotID`, `DoorEntry`);
-- Founder's Point (Alliance) front door.
UPDATE `housing_plot_template`
SET `DoorEntry` = 586576
WHERE `ExteriorMapID` = 2735;
-- Razorwind Shores (Horde) front door.
UPDATE `housing_plot_template`
SET `DoorEntry` = 602702
WHERE `ExteriorMapID` = 2736;
ALTER TABLE `character_housing`
ADD KEY `idx_character_housing_plot` (`PlotID`);
@@ -1,17 +0,0 @@
-- Midnight 12.1.0.69587 Housing persistent decor instances.
-- One row represents one licensed decor object exposed through FHousingStorage_C.
CREATE TABLE IF NOT EXISTS `housing_decor_instance` (
`BattlenetAccountId` int unsigned NOT NULL,
`DecorGuid` varchar(64) NOT NULL,
`DecorID` int unsigned NOT NULL,
`HouseGuid` varchar(64) NOT NULL DEFAULT '',
`PlacementStatus` tinyint unsigned NOT NULL DEFAULT 0,
`SourceType` tinyint unsigned NOT NULL DEFAULT 0,
`SourceValue` varchar(255) NOT NULL DEFAULT '',
`CreatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`BattlenetAccountId`, `DecorGuid`),
UNIQUE KEY `uq_housing_decor_instance_guid` (`DecorGuid`),
KEY `idx_housing_decor_instance_type` (`BattlenetAccountId`, `DecorID`),
KEY `idx_housing_decor_instance_house` (`HouseGuid`, `PlacementStatus`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,12 +0,0 @@
-- Housing dynamic entity payload quarantine.
-- Invalid captured rows remain available for analysis but are never serialized to the client.
CREATE TABLE IF NOT EXISTS `housing_entity_quarantine` (
`EntityType` varchar(32) NOT NULL,
`EntityGuid` varchar(64) NOT NULL,
`Reason` varchar(64) NOT NULL,
`HitCount` int unsigned NOT NULL DEFAULT 1,
`FirstSeenAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastSeenAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`EntityType`, `EntityGuid`),
KEY `idx_housing_quarantine_last_seen` (`LastSeenAt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,34 +0,0 @@
-- Housing blueprint persistence for Midnight 12.1.
-- Blueprint records are owned by a Battle.net account; item rows describe the
-- decor, dyes, rooms and fixtures required to reconstruct the saved layout.
CREATE TABLE IF NOT EXISTS `housing_blueprint` (
`ID` bigint unsigned NOT NULL AUTO_INCREMENT,
`BnetAccountID` int unsigned NOT NULL,
`UUID` varchar(64) NOT NULL,
`Name` varchar(127) NOT NULL DEFAULT '',
`Type` tinyint unsigned NOT NULL DEFAULT 0,
`DateCreated` bigint NOT NULL DEFAULT 0,
`DateDeleted` bigint NOT NULL DEFAULT 0,
`Flags` tinyint unsigned NOT NULL DEFAULT 0,
`DeleteReason` tinyint unsigned NOT NULL DEFAULT 0,
`RequiredFaction` tinyint NOT NULL DEFAULT -1,
`RequiredHouseType` int unsigned NOT NULL DEFAULT 0,
`RequiredHouseSize` tinyint unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`ID`),
UNIQUE KEY `uq_housing_blueprint_account_uuid` (`BnetAccountID`, `UUID`),
KEY `idx_housing_blueprint_account_deleted` (`BnetAccountID`, `DateDeleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Account-owned Housing blueprint metadata';
CREATE TABLE IF NOT EXISTS `housing_blueprint_item` (
`BlueprintID` bigint unsigned NOT NULL,
`ItemType` tinyint unsigned NOT NULL COMMENT '0 decor, 1 dye item, 2 room, 3 fixture',
`ItemID` int unsigned NOT NULL,
`Quantity` int unsigned NOT NULL DEFAULT 1,
PRIMARY KEY (`BlueprintID`, `ItemType`, `ItemID`),
CONSTRAINT `fk_housing_blueprint_item_blueprint`
FOREIGN KEY (`BlueprintID`) REFERENCES `housing_blueprint` (`ID`)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Items stored by a Housing blueprint';
@@ -1,19 +0,0 @@
-- Midnight 12.1 Housing decor lock persistence.
-- Idempotent for partially updated Character databases.
SET @housing_locked_exists := (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'housing_placed_decor'
AND COLUMN_NAME = 'Locked'
);
SET @housing_locked_sql := IF(
@housing_locked_exists = 0,
'ALTER TABLE `housing_placed_decor` ADD COLUMN `Locked` tinyint unsigned NOT NULL DEFAULT 0 AFTER `Flags`',
'SELECT 1'
);
PREPARE housing_locked_stmt FROM @housing_locked_sql;
EXECUTE housing_locked_stmt;
DEALLOCATE PREPARE housing_locked_stmt;
@@ -1,35 +0,0 @@
-- Midnight 12.1 Housing decor dye persistence.
-- Add each column independently so a partially applied update can be retried safely.
SET @housing_dye0_exists := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'housing_placed_decor' AND COLUMN_NAME = 'DyeSlot0'
);
SET @housing_dye0_sql := IF(@housing_dye0_exists = 0,
'ALTER TABLE `housing_placed_decor` ADD COLUMN `DyeSlot0` int unsigned NOT NULL DEFAULT 0 AFTER `Locked`',
'SELECT 1');
PREPARE housing_dye0_stmt FROM @housing_dye0_sql;
EXECUTE housing_dye0_stmt;
DEALLOCATE PREPARE housing_dye0_stmt;
SET @housing_dye1_exists := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'housing_placed_decor' AND COLUMN_NAME = 'DyeSlot1'
);
SET @housing_dye1_sql := IF(@housing_dye1_exists = 0,
'ALTER TABLE `housing_placed_decor` ADD COLUMN `DyeSlot1` int unsigned NOT NULL DEFAULT 0 AFTER `DyeSlot0`',
'SELECT 1');
PREPARE housing_dye1_stmt FROM @housing_dye1_sql;
EXECUTE housing_dye1_stmt;
DEALLOCATE PREPARE housing_dye1_stmt;
SET @housing_dye2_exists := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'housing_placed_decor' AND COLUMN_NAME = 'DyeSlot2'
);
SET @housing_dye2_sql := IF(@housing_dye2_exists = 0,
'ALTER TABLE `housing_placed_decor` ADD COLUMN `DyeSlot2` int unsigned NOT NULL DEFAULT 0 AFTER `DyeSlot1`',
'SELECT 1');
PREPARE housing_dye2_stmt FROM @housing_dye2_sql;
EXECUTE housing_dye2_stmt;
DEALLOCATE PREPARE housing_dye2_stmt;
@@ -1,21 +0,0 @@
-- Midnight 12.1 Housing Stage 2: separate transient plot reservations from owned plots.
-- A reservation must never rewrite character_housing.PlotID before purchase/move commits.
CREATE TABLE IF NOT EXISTS `housing_plot_reservation` (
`ExteriorMapID` int unsigned NOT NULL,
`PlotID` tinyint unsigned NOT NULL,
`OwnerGuid` bigint unsigned NOT NULL,
`NeighborhoodGuid` varchar(64) NOT NULL,
`ReservedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`ExpiresAt` timestamp NOT NULL,
PRIMARY KEY (`ExteriorMapID`, `PlotID`, `NeighborhoodGuid`),
UNIQUE KEY `uk_housing_plot_reservation_owner` (`OwnerGuid`),
KEY `idx_housing_plot_reservation_expiry` (`ExpiresAt`),
KEY `idx_housing_plot_reservation_neighborhood` (`NeighborhoodGuid`, `PlotID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Transaction type 2 is used when a house is relinquished. This only updates
-- metadata/documentation for an already-existing column; no data is dropped.
ALTER TABLE `housing_plot_transaction`
MODIFY COLUMN `TransactionType` tinyint unsigned NOT NULL
COMMENT '0=purchase, 1=move, 2=relinquish';
@@ -1,44 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_neighborhood_initiative` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`InitiativeID` int unsigned NOT NULL DEFAULT '0',
`State` tinyint unsigned NOT NULL DEFAULT '0',
`Progress` bigint unsigned NOT NULL DEFAULT '0',
`RewardTier` smallint unsigned NOT NULL DEFAULT '0',
`StartedAt` bigint unsigned DEFAULT NULL,
`EndsAt` bigint unsigned DEFAULT NULL,
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`NeighborhoodGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_activity_progress` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`ActivityID` int unsigned NOT NULL,
`Progress` bigint unsigned NOT NULL DEFAULT '0',
`Target` bigint unsigned NOT NULL DEFAULT '0',
`Completed` tinyint unsigned NOT NULL DEFAULT '0',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`NeighborhoodGuid`,`ActivityID`),
KEY `idx_housing_initiative_activity` (`ActivityID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_member_progress` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`CharacterGuid` bigint unsigned NOT NULL,
`ActivityID` int unsigned NOT NULL,
`Progress` bigint unsigned NOT NULL DEFAULT '0',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`NeighborhoodGuid`,`CharacterGuid`,`ActivityID`),
KEY `idx_housing_initiative_member_activity` (`ActivityID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_activity_log` (
`ID` bigint unsigned NOT NULL AUTO_INCREMENT,
`NeighborhoodGuid` varchar(64) NOT NULL,
`CharacterGuid` bigint unsigned NOT NULL DEFAULT '0',
`ActivityID` int unsigned NOT NULL DEFAULT '0',
`ProgressDelta` bigint NOT NULL DEFAULT '0',
`CreatedAt` bigint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `idx_housing_initiative_log_neighborhood` (`NeighborhoodGuid`,`ID`),
KEY `idx_housing_initiative_log_character` (`CharacterGuid`,`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,22 +0,0 @@
-- Midnight 12.1.0.69587 Housing room-to-room connection persistence.
-- Store one row per side so FHousingRoom_C::Doors can be rebuilt without
-- inferring adjacency from mutable world transforms.
CREATE TABLE IF NOT EXISTS `housing_room_connection` (
`HouseGuid` varchar(64) NOT NULL,
`RoomGuid` varchar(64) NOT NULL,
`RoomComponentID` int unsigned NOT NULL,
`AttachedRoomGuid` varchar(64) NOT NULL,
`AttachedRoomComponentID` int unsigned NOT NULL,
`OffsetX` float NOT NULL DEFAULT 0,
`OffsetY` float NOT NULL DEFAULT 0,
`OffsetZ` float NOT NULL DEFAULT 0,
`RoomComponentType` tinyint unsigned NOT NULL DEFAULT 1,
PRIMARY KEY (`RoomGuid`, `RoomComponentID`),
UNIQUE KEY `uq_housing_room_connection_target` (`AttachedRoomGuid`, `AttachedRoomComponentID`),
KEY `idx_housing_room_connection_house` (`HouseGuid`),
CONSTRAINT `fk_hrc_room`
FOREIGN KEY (`RoomGuid`) REFERENCES `housing_room_entity` (`RoomGuid`) ON DELETE CASCADE,
CONSTRAINT `fk_hrc_attached`
FOREIGN KEY (`AttachedRoomGuid`) REFERENCES `housing_room_entity` (`RoomGuid`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,7 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_initiative_player_state` (
`CharacterGuid` bigint unsigned NOT NULL,
`ActiveNeighborhoodGuid` varchar(64) NOT NULL DEFAULT '',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`CharacterGuid`),
KEY `idx_housing_initiative_active_neighborhood` (`ActiveNeighborhoodGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,37 +0,0 @@
-- Stage 20: reference-backed logical Room slot persistence.
-- Existing rooms keep NULL because no safe historical TargetSlotIndex can be inferred
-- from PositionX/Y/Z. New free-slot MOVE requests assign the logical slot explicitly.
-- Use information_schema guards instead of ADD COLUMN IF NOT EXISTS for compatibility
-- with the MySQL/MariaDB versions used by TrinityCore deployments.
SET @housing_layout_slot_column_exists := (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'housing_room_entity'
AND COLUMN_NAME = 'LayoutSlotIndex'
);
SET @housing_layout_slot_sql := IF(
@housing_layout_slot_column_exists = 0,
'ALTER TABLE `housing_room_entity` ADD COLUMN `LayoutSlotIndex` int unsigned NULL DEFAULT NULL AFTER `AttachmentFlags`',
'SELECT 1'
);
PREPARE housing_layout_slot_stmt FROM @housing_layout_slot_sql;
EXECUTE housing_layout_slot_stmt;
DEALLOCATE PREPARE housing_layout_slot_stmt;
SET @housing_layout_slot_index_exists := (
SELECT COUNT(*)
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'housing_room_entity'
AND INDEX_NAME = 'idx_housing_room_house_slot'
);
SET @housing_layout_slot_index_sql := IF(
@housing_layout_slot_index_exists = 0,
'ALTER TABLE `housing_room_entity` ADD KEY `idx_housing_room_house_slot` (`HouseGuid`, `LayoutSlotIndex`)',
'SELECT 1'
);
PREPARE housing_layout_slot_index_stmt FROM @housing_layout_slot_index_sql;
EXECUTE housing_layout_slot_index_stmt;
DEALLOCATE PREPARE housing_layout_slot_index_stmt;
@@ -1,27 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_initiative_activity_definition` (
`InitiativeID` int unsigned NOT NULL,
`ActivityID` int unsigned NOT NULL,
`CriteriaID` bigint unsigned NOT NULL DEFAULT '0',
`Target` bigint unsigned NOT NULL DEFAULT '0',
`Enabled` tinyint unsigned NOT NULL DEFAULT '1',
PRIMARY KEY (`InitiativeID`,`ActivityID`),
KEY `idx_housing_initiative_activity_criteria` (`CriteriaID`),
KEY `idx_housing_initiative_activity_enabled` (`InitiativeID`,`Enabled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_progress_generation` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`InitiativeID` int unsigned NOT NULL DEFAULT '0',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`NeighborhoodGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_completion` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`InitiativeID` int unsigned NOT NULL,
`CompletedAt` bigint unsigned NOT NULL DEFAULT '0',
`RewardAvailable` tinyint unsigned NOT NULL DEFAULT '0',
`RewardClaimed` tinyint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`NeighborhoodGuid`,`InitiativeID`),
KEY `idx_housing_initiative_completion_reward` (`RewardAvailable`,`RewardClaimed`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,21 +0,0 @@
-- Stage 21: persistent Room floor metadata for the manager-backed Housing graph.
-- The active Stage 11 ADD path has always rejected FloorIndex != 0, so every
-- pre-Stage-21 manager-backed room is safely floor 0. Geometry remains stored in
-- PositionZ; FloorIndex is metadata until stairwell/cross-floor placement is enabled.
-- Use information_schema guards for MySQL/MariaDB compatibility.
SET @housing_room_floor_column_exists := (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'housing_room_entity'
AND COLUMN_NAME = 'FloorIndex'
);
SET @housing_room_floor_sql := IF(
@housing_room_floor_column_exists = 0,
'ALTER TABLE `housing_room_entity` ADD COLUMN `FloorIndex` int NOT NULL DEFAULT 0 AFTER `LayoutSlotIndex`',
'SELECT 1'
);
PREPARE housing_room_floor_stmt FROM @housing_room_floor_sql;
EXECUTE housing_room_floor_stmt;
DEALLOCATE PREPARE housing_room_floor_stmt;
@@ -1,13 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_initiative_criteria_checkpoint` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`InitiativeID` int unsigned NOT NULL,
`CharacterGuid` bigint unsigned NOT NULL,
`CriteriaID` int unsigned NOT NULL,
`ActivityID` int unsigned NOT NULL,
`LastCounter` bigint unsigned NOT NULL DEFAULT '0',
`LastMemberProgress` bigint unsigned NOT NULL DEFAULT '0',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`NeighborhoodGuid`,`InitiativeID`,`CharacterGuid`,`CriteriaID`),
KEY `idx_housing_initiative_criteria_character` (`CharacterGuid`,`CriteriaID`),
KEY `idx_housing_initiative_criteria_activity` (`InitiativeID`,`ActivityID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,8 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_initiative_expiration` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`InitiativeID` int unsigned NOT NULL,
`ExpiredAt` bigint unsigned NOT NULL DEFAULT '0',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`NeighborhoodGuid`,`InitiativeID`),
KEY `idx_housing_initiative_expiration_time` (`ExpiredAt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,77 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_initiative_schedule` (
`ScheduleID` bigint unsigned NOT NULL AUTO_INCREMENT,
`InitiativeID` int unsigned NOT NULL,
`RewardTier` smallint unsigned NOT NULL DEFAULT '0',
`StartsAt` bigint unsigned NOT NULL,
`EndsAt` bigint unsigned NOT NULL DEFAULT '0',
`Enabled` tinyint unsigned NOT NULL DEFAULT '1',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ScheduleID`),
KEY `idx_housing_initiative_schedule_window` (`Enabled`,`StartsAt`,`EndsAt`),
KEY `idx_housing_initiative_schedule_initiative` (`InitiativeID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_rotation_state` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`GenerationID` bigint unsigned NOT NULL DEFAULT '0',
`ActiveScheduleID` bigint unsigned NOT NULL DEFAULT '0',
`InitiativeID` int unsigned NOT NULL DEFAULT '0',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`NeighborhoodGuid`),
KEY `idx_housing_initiative_rotation_schedule` (`ActiveScheduleID`),
KEY `idx_housing_initiative_rotation_initiative` (`InitiativeID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_history` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`GenerationID` bigint unsigned NOT NULL,
`ScheduleID` bigint unsigned NOT NULL DEFAULT '0',
`InitiativeID` int unsigned NOT NULL,
`State` tinyint unsigned NOT NULL DEFAULT '0',
`Progress` bigint unsigned NOT NULL DEFAULT '0',
`RewardTier` smallint unsigned NOT NULL DEFAULT '0',
`StartedAt` bigint unsigned NOT NULL DEFAULT '0',
`EndsAt` bigint unsigned NOT NULL DEFAULT '0',
`CompletedAt` bigint unsigned NOT NULL DEFAULT '0',
`ExpiredAt` bigint unsigned NOT NULL DEFAULT '0',
`RewardAvailable` tinyint unsigned NOT NULL DEFAULT '0',
`RewardClaimed` tinyint unsigned NOT NULL DEFAULT '0',
`ArchivedAt` bigint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`NeighborhoodGuid`,`GenerationID`),
KEY `idx_housing_initiative_history_initiative` (`InitiativeID`,`ArchivedAt`),
KEY `idx_housing_initiative_history_reward` (`RewardAvailable`,`RewardClaimed`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_activity_history` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`GenerationID` bigint unsigned NOT NULL,
`ActivityID` int unsigned NOT NULL,
`Progress` bigint unsigned NOT NULL DEFAULT '0',
`Target` bigint unsigned NOT NULL DEFAULT '0',
`Completed` tinyint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`NeighborhoodGuid`,`GenerationID`,`ActivityID`),
KEY `idx_housing_initiative_activity_history_activity` (`ActivityID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_member_history` (
`NeighborhoodGuid` varchar(64) NOT NULL,
`GenerationID` bigint unsigned NOT NULL,
`CharacterGuid` bigint unsigned NOT NULL,
`ActivityID` int unsigned NOT NULL,
`Progress` bigint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`NeighborhoodGuid`,`GenerationID`,`CharacterGuid`,`ActivityID`),
KEY `idx_housing_initiative_member_history_character` (`CharacterGuid`,`GenerationID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_activity_log_history` (
`ArchiveID` bigint unsigned NOT NULL AUTO_INCREMENT,
`NeighborhoodGuid` varchar(64) NOT NULL,
`GenerationID` bigint unsigned NOT NULL,
`CharacterGuid` bigint unsigned NOT NULL DEFAULT '0',
`ActivityID` int unsigned NOT NULL DEFAULT '0',
`ProgressDelta` bigint NOT NULL DEFAULT '0',
`CreatedAt` bigint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`ArchiveID`),
KEY `idx_housing_initiative_log_history_generation` (`NeighborhoodGuid`,`GenerationID`,`ArchiveID`),
KEY `idx_housing_initiative_log_history_character` (`CharacterGuid`,`GenerationID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,15 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_initiative_reward_claim` (
`ClaimID` bigint unsigned NOT NULL AUTO_INCREMENT,
`NeighborhoodGuid` varchar(64) NOT NULL,
`GenerationID` bigint unsigned NOT NULL,
`InitiativeID` int unsigned NOT NULL,
`CharacterGuid` bigint unsigned NOT NULL,
`State` tinyint unsigned NOT NULL DEFAULT '0',
`CreatedAt` bigint unsigned NOT NULL DEFAULT '0',
`UpdatedAt` bigint unsigned NOT NULL DEFAULT '0',
`CompletedAt` bigint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`ClaimID`),
UNIQUE KEY `uq_housing_initiative_reward_generation` (`NeighborhoodGuid`,`GenerationID`),
KEY `idx_housing_initiative_reward_claimant` (`CharacterGuid`,`State`,`ClaimID`),
KEY `idx_housing_initiative_reward_initiative` (`InitiativeID`,`State`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,27 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_initiative_reward_catalog` (
`RewardTier` smallint unsigned NOT NULL,
`EntryID` int unsigned NOT NULL,
`GrantType` tinyint unsigned NOT NULL,
`AssetID` int unsigned NOT NULL,
`Quantity` int unsigned NOT NULL,
`Enabled` tinyint unsigned NOT NULL DEFAULT '1',
`UpdatedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`RewardTier`,`EntryID`),
KEY `idx_housing_initiative_reward_catalog_enabled` (`RewardTier`,`Enabled`,`EntryID`),
KEY `idx_housing_initiative_reward_catalog_asset` (`GrantType`,`AssetID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `housing_initiative_reward_delivery` (
`ClaimID` bigint unsigned NOT NULL,
`EntryID` int unsigned NOT NULL,
`GrantType` tinyint unsigned NOT NULL,
`AssetID` int unsigned NOT NULL,
`Quantity` int unsigned NOT NULL,
`State` tinyint unsigned NOT NULL DEFAULT '0',
`CreatedAt` bigint unsigned NOT NULL DEFAULT '0',
`UpdatedAt` bigint unsigned NOT NULL DEFAULT '0',
`DeliveredAt` bigint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`ClaimID`,`EntryID`),
KEY `idx_housing_initiative_reward_delivery_state` (`State`,`ClaimID`),
KEY `idx_housing_initiative_reward_delivery_asset` (`GrantType`,`AssetID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,16 +0,0 @@
CREATE TABLE IF NOT EXISTS `housing_initiative_reward_execution` (
`ClaimID` bigint unsigned NOT NULL,
`EntryID` int unsigned NOT NULL,
`GrantType` tinyint unsigned NOT NULL,
`AssetID` int unsigned NOT NULL,
`Quantity` int unsigned NOT NULL,
`State` tinyint unsigned NOT NULL DEFAULT '0',
`ObservedBefore` bigint unsigned NOT NULL DEFAULT '0',
`ExpectedAfter` bigint unsigned NOT NULL DEFAULT '0',
`ObservedAfter` bigint unsigned NOT NULL DEFAULT '0',
`StartedAt` bigint unsigned NOT NULL DEFAULT '0',
`UpdatedAt` bigint unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`ClaimID`,`EntryID`),
KEY `idx_housing_initiative_reward_execution_state` (`State`,`ClaimID`),
KEY `idx_housing_initiative_reward_execution_asset` (`GrantType`,`AssetID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,31 +0,0 @@
--
-- Archaeology: per-character active dig sites.
-- Persists the ActivePlayer ResearchSites / ResearchSiteProgress update fields across relog/restart,
-- plus the site's current hidden find position so a relog cannot relocate an in-progress find.
-- Ported from evry/master-track/archaeology 94eadb810a (findX/findY added by cb60da9643).
--
DROP TABLE IF EXISTS `character_research_site`;
CREATE TABLE `character_research_site` (
`guid` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier',
`researchSiteId` smallint unsigned NOT NULL DEFAULT '0',
`progress` int unsigned NOT NULL DEFAULT '0',
`findX` float NOT NULL DEFAULT '0' COMMENT 'Current hidden find world X',
`findY` float NOT NULL DEFAULT '0' COMMENT 'Current hidden find world Y',
PRIMARY KEY (`guid`,`researchSiteId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Archaeology active dig sites per character';
DROP TABLE IF EXISTS `character_research_project`;
CREATE TABLE `character_research_project` (
`guid` bigint unsigned NOT NULL COMMENT 'Character GUID',
`projectId` int unsigned NOT NULL COMMENT 'ResearchProject.db2 ID (current project for its branch)',
PRIMARY KEY (`guid`,`projectId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Archaeology active research projects per character';
DROP TABLE IF EXISTS `character_research_history`;
CREATE TABLE `character_research_history` (
`guid` bigint unsigned NOT NULL COMMENT 'Character GUID',
`projectId` int unsigned NOT NULL COMMENT 'ResearchProject.db2 ID',
`firstCompleted` bigint NOT NULL DEFAULT '0' COMMENT 'Unix time of the first completion',
`completionCount` int unsigned NOT NULL DEFAULT '1' COMMENT 'Times this project has been solved',
PRIMARY KEY (`guid`,`projectId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Archaeology completed research projects per character';
@@ -1,4 +0,0 @@
--
-- Prey: the per-character table of the placeholder implementation is unused; the hunt state lives in the quest log
--
DROP TABLE IF EXISTS `character_prey_hunt`;
@@ -1,21 +0,0 @@
-- Server-side instance identity only; no client templates or custom content.
-- Housing maps use their own persistent IDs, separate from dungeon lock IDs.
CREATE TABLE IF NOT EXISTS `housing_map_instance` (
`InstanceID` int unsigned NOT NULL AUTO_INCREMENT,
`MapID` int unsigned NOT NULL,
`ContextGuid` varchar(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
PRIMARY KEY (`InstanceID`),
UNIQUE KEY `uk_housing_map_context` (`MapID`, `ContextGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Last successfully entered context, used by the normal map creation path on login.
CREATE TABLE IF NOT EXISTS `character_housing_map_context` (
`OwnerGuid` bigint unsigned NOT NULL,
`MapID` int unsigned NOT NULL,
`ContextGuid` varchar(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
PRIMARY KEY (`OwnerGuid`, `MapID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Preserve the departure neighborhood, even if house ownership changes later.
ALTER TABLE `character_housing_return_location`
ADD COLUMN `NeighborhoodGuid` varchar(64) NOT NULL DEFAULT '' AFTER `HouseGuid`;
@@ -1,6 +0,0 @@
-- Persist the retail house exterior size selected through
-- CMSG_HOUSING_FIXTURE_SET_HOUSE_SIZE. Fixture rows mirror this value for the
-- FHousingFixture_C entity graph rebuilt after relog.
ALTER TABLE `character_housing`
ADD COLUMN `HouseSize` TINYINT UNSIGNED NOT NULL DEFAULT 2 AFTER `HouseSettingFlags`;
@@ -1,5 +0,0 @@
-- Persist the retail HouseExteriorWmoData selection used by
-- CMSG_HOUSING_FIXTURE_SET_HOUSE_TYPE.
ALTER TABLE `character_housing`
ADD COLUMN `HouseExteriorWmoDataID` INT UNSIGNED NOT NULL DEFAULT 0 AFTER `HouseSize`;
@@ -1,8 +0,0 @@
-- Persist the native per-character House Finder ignore list.
CREATE TABLE IF NOT EXISTS `character_housing_finder_ignore` (
`CharacterGuid` BIGINT UNSIGNED NOT NULL,
`NeighborhoodGuid` VARCHAR(64) NOT NULL,
`CreatedAt` BIGINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`CharacterGuid`, `NeighborhoodGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,10 +0,0 @@
-- Persist native neighborhood invitations by target character.
CREATE TABLE IF NOT EXISTS `character_housing_neighborhood_invite` (
`NeighborhoodGuid` VARCHAR(64) NOT NULL,
`InviteeGuid` BIGINT UNSIGNED NOT NULL,
`InviterGuid` BIGINT UNSIGNED NOT NULL,
`CreatedAt` BIGINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`NeighborhoodGuid`, `InviteeGuid`),
KEY `idx_invitee` (`InviteeGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,11 +0,0 @@
-- Persist native neighborhood secondary-owner roles independently from house ownership.
CREATE TABLE IF NOT EXISTS `character_housing_neighborhood_role` (
`NeighborhoodGuid` VARCHAR(64) NOT NULL,
`CharacterGuid` BIGINT UNSIGNED NOT NULL,
`Role` TINYINT UNSIGNED NOT NULL DEFAULT 1,
`GrantedBy` BIGINT UNSIGNED NOT NULL,
`GrantedAt` BIGINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`NeighborhoodGuid`, `CharacterGuid`),
KEY `idx_character` (`CharacterGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -1,7 +0,0 @@
-- Persist the native public/private state used by House Finder.
ALTER TABLE `housing_neighborhood`
ADD COLUMN `IsPublic` TINYINT UNSIGNED NOT NULL DEFAULT 0 AFTER `Name`;
-- Preserve the pre-migration behavior for neighborhoods already exposed by House Finder.
UPDATE `housing_neighborhood` SET `IsPublic` = 1;
@@ -1,5 +0,0 @@
-- Persist the native guild ownership used by Housing Services and House Finder.
ALTER TABLE `housing_neighborhood`
ADD COLUMN `GuildId` INT UNSIGNED NULL DEFAULT NULL AFTER `IsPublic`,
ADD UNIQUE KEY `uk_housing_neighborhood_guild` (`GuildId`);
@@ -1 +0,0 @@
ALTER TABLE `mail` MODIFY COLUMN `checked` int UNSIGNED NOT NULL DEFAULT 0 AFTER `cod`;
@@ -1,8 +0,0 @@
-- Dumping structure for table characters.account_achievement
CREATE TABLE IF NOT EXISTS `account_achievement` (
`account` int(10) unsigned NOT NULL DEFAULT '0',
`achievement` int(10) unsigned NOT NULL,
`first_guid` bigint(20) unsigned NOT NULL DEFAULT '0',
`date` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`account`,`achievement`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;
@@ -0,0 +1,35 @@
REPLACE INTO `bot_templates` (`entry`, `bot_class`, `bot_race`, `companion_spell`, `chatter_type`, `gender`, `pet_source`) VALUES
(62913,6,1,0,2,0,0),
(4146,7,3,0,10,1,1999),
(50714,3,3,0,11,1,0),
(50715,3,3,0,1,0,0),
(50690,3,3,0,2,0,0),
(48615, 4, 10, 0, 0, 7, 0), -- undead / rogue / male
(48618, 7, 10, 0, 1, 14, 1553), -- undead / hunter / female / pet 1553
(48616, 1, 10, 0, 1, 3, 0), -- undead / warrior / female
(48613, 3, 10, 0, 1, 18, 0), -- undead / mage / female
(48614, 2, 10, 0, 1, 11, 0), -- undead / priest / female
(48612, 8, 10, 0, 1, 5, 0), -- undead / warlock / female
(38911, 7, 10, 0, 0, 20, 39014), -- undead / hunter / male / pet 39014
(2123, 2, 10, 0, 0, 9, 0), -- undead / priest / male
(2121, 3, 10, 0, 1, 16, 0), -- undead / mage / female
(2126, 8, 10, 0, 0, 4, 0), -- undead / warlock / male
(63272, 10, 7, 0, 1, 12, 0), -- pandaren / monk / female
(2122, 4, 10, 0, 0, 8, 0), -- undead / rogue / male
(2119, 1, 10, 0, 0, 15, 0), -- undead / warrior / male
(49958, 7, 10, 0, 0, 2, 49960), -- undead / hunter / male / pet 49960
(49715, 2, 10, 0, 0, 19, 0), -- undead / priest / male
(49720, 1, 10, 0, 0, 6, 0), -- undead / warrior / male
(49870, 4, 10, 0, 1, 13, 0), -- undead / rogue / female
(49718, 8, 10, 0, 1, 1, 0), -- undead / warlock / female
(49716, 3, 10, 0, 0, 17, 0), -- undead / mage / male
(49791, 3, 4, 0, 0, 10, 0), -- gnome / mage / male
(49808, 9, 2, 0, 1, 3, 0), -- dwarf / shaman / female
(49781, 1, 2, 0, 0, 8, 0), -- dwarf / warrior / male
(49806, 7, 2, 0, 1, 15, 1553), -- dwarf / hunter / female
(49793, 6, 2, 0, 0, 5, 0), -- dwarf / paladin / male
(49786, 3, 4, 0, 0, 12, 0), -- gnome / mage / male
(49782, 4, 2, 0, 1, 20, 0), -- dwarf / rogue / female
(49785, 2, 2, 0, 1, 7, 0); -- dwarf / priest / female
@@ -1,34 +0,0 @@
-- bot_templates: repair rows where gender and chatter_type were swapped at insert time.
-- Field 5 held the intended gender (0=male, 1=female), field 6 the intended personality.
-- Males ended up with chatter_type=0 (no personality -> missing DB chatter keys) and
-- females with chatter_type=1 (Neutral) plus an invalid gender.
-- males (gender = 0)
UPDATE `bot_templates` SET `chatter_type` = 15, `gender` = 0 WHERE `entry` = 2119; -- undead / warrior / Morbid
UPDATE `bot_templates` SET `chatter_type` = 8, `gender` = 0 WHERE `entry` = 2122; -- undead / rogue / Serious
UPDATE `bot_templates` SET `chatter_type` = 9, `gender` = 0 WHERE `entry` = 2123; -- undead / priest / Dry
UPDATE `bot_templates` SET `chatter_type` = 4, `gender` = 0 WHERE `entry` = 2126; -- undead / warlock / Cynical
UPDATE `bot_templates` SET `chatter_type` = 20, `gender` = 0 WHERE `entry` = 38911; -- undead / hunter / Autistic
UPDATE `bot_templates` SET `chatter_type` = 7, `gender` = 0 WHERE `entry` = 48615; -- undead / rogue / Guarded
UPDATE `bot_templates` SET `chatter_type` = 19, `gender` = 0 WHERE `entry` = 49715; -- undead / priest / Autotelic
UPDATE `bot_templates` SET `chatter_type` = 17, `gender` = 0 WHERE `entry` = 49716; -- undead / mage / Sadist
UPDATE `bot_templates` SET `chatter_type` = 6, `gender` = 0 WHERE `entry` = 49720; -- undead / warrior / Cold
UPDATE `bot_templates` SET `chatter_type` = 8, `gender` = 0 WHERE `entry` = 49781; -- dwarf / warrior / Serious
UPDATE `bot_templates` SET `chatter_type` = 12, `gender` = 0 WHERE `entry` = 49786; -- gnome / mage / Enthusiastic
UPDATE `bot_templates` SET `chatter_type` = 10, `gender` = 0 WHERE `entry` = 49791; -- gnome / mage / Curious
UPDATE `bot_templates` SET `chatter_type` = 5, `gender` = 0 WHERE `entry` = 49793; -- dwarf / paladin / Bitter
UPDATE `bot_templates` SET `chatter_type` = 2, `gender` = 0 WHERE `entry` = 49958; -- undead / hunter / Positive
-- females (gender = 1)
UPDATE `bot_templates` SET `chatter_type` = 16, `gender` = 1 WHERE `entry` = 2121; -- undead / mage / Narcissist
UPDATE `bot_templates` SET `chatter_type` = 5, `gender` = 1 WHERE `entry` = 48612; -- undead / warlock / Bitter
UPDATE `bot_templates` SET `chatter_type` = 18, `gender` = 1 WHERE `entry` = 48613; -- undead / mage / Hyperthymic
UPDATE `bot_templates` SET `chatter_type` = 11, `gender` = 1 WHERE `entry` = 48614; -- undead / priest / Warm
UPDATE `bot_templates` SET `chatter_type` = 3, `gender` = 1 WHERE `entry` = 48616; -- undead / warrior / Negative
UPDATE `bot_templates` SET `chatter_type` = 14, `gender` = 1 WHERE `entry` = 48618; -- undead / hunter / Devoted
UPDATE `bot_templates` SET `chatter_type` = 13, `gender` = 1 WHERE `entry` = 49870; -- undead / rogue / Cheerful
UPDATE `bot_templates` SET `chatter_type` = 15, `gender` = 1 WHERE `entry` = 49806; -- dwarf / hunter / Morbid
UPDATE `bot_templates` SET `chatter_type` = 3, `gender` = 1 WHERE `entry` = 49808; -- dwarf / shaman / Negative
UPDATE `bot_templates` SET `chatter_type` = 20, `gender` = 1 WHERE `entry` = 49782; -- dwarf / rogue / Autistic
UPDATE `bot_templates` SET `chatter_type` = 7, `gender` = 1 WHERE `entry` = 49785; -- dwarf / priest / Guarded
UPDATE `bot_templates` SET `chatter_type` = 12, `gender` = 1 WHERE `entry` = 63272; -- pandaren / monk / Enthusiastic
@@ -0,0 +1,3 @@
REPLACE INTO `item_sparse` (`ID`, `Description`, `Display3`, `Display2`, `Display1`, `Display`, `ExpansionID`, `DmgVariance`, `LimitCategory`, `DurationInInventory`, `QualityModifier`, `BagFamily`, `StartQuestID`, `LanguageID`, `ItemRange`, `StatPercentageOfSocket1`, `StatPercentageOfSocket2`, `StatPercentageOfSocket3`, `StatPercentageOfSocket4`, `StatPercentageOfSocket5`, `StatPercentageOfSocket6`, `StatPercentageOfSocket7`, `StatPercentageOfSocket8`, `StatPercentageOfSocket9`, `StatPercentageOfSocket10`, `StatPercentEditor1`, `StatPercentEditor2`, `StatPercentEditor3`, `StatPercentEditor4`, `StatPercentEditor5`, `StatPercentEditor6`, `StatPercentEditor7`, `StatPercentEditor8`, `StatPercentEditor9`, `StatPercentEditor10`, `StatModifierBonusStat1`, `StatModifierBonusStat2`, `StatModifierBonusStat3`, `StatModifierBonusStat4`, `StatModifierBonusStat5`, `StatModifierBonusStat6`, `StatModifierBonusStat7`, `StatModifierBonusStat8`, `StatModifierBonusStat9`, `StatModifierBonusStat10`, `Stackable`, `MaxCount`, `MinReputation`, `RequiredAbility`, `AllowableRace1`, `AllowableRace2`, `SellPrice`, `BuyPrice`, `VendorStackCount`, `PriceVariance`, `PriceRandomValue`, `Flags1`, `Flags2`, `Flags3`, `Flags4`, `Flags5`, `FactionRelated`, `ModifiedCraftingReagentItemID`, `ContentTuningID`, `PlayerLevelToItemLevelCurveID`, `ItemLevelOffsetCurveID`, `ItemLevelOffsetItemLevel`, `ItemSquishEraID`, `ItemNameDescriptionID`, `RequiredTransmogHoliday`, `RequiredHoliday`, `GemProperties`, `SocketMatchEnchantmentId`, `TotemCategoryID`, `InstanceBound`, `ZoneBound1`, `ZoneBound2`, `ItemSet`, `LockID`, `PageID`, `ItemDelay`, `MinFactionID`, `RequiredSkillRank`, `RequiredSkill`, `ItemLevel`, `AllowableClass`, `ArtifactID`, `SpellWeight`, `SpellWeightCategory`, `SocketType1`, `SocketType2`, `SocketType3`, `SheatheType`, `Material`, `PageMaterialID`, `Bonding`, `DamageDamageType`, `ContainerSlots`, `RequiredPVPMedal`, `RequiredPVPRank`, `RequiredLevel`, `InventoryType`, `OverallQualityID`, `VerifiedBuild`) VALUES
(191909, 'R.A.D. stands for "Rannans Awesome Device" that can do anything. Almost!', '', '', '', 'R.A.D.', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5259, 7889, 3711, 3161, 0, 0, 0, 0, 0, 0, 73, 7, 36, 49, -1, -1, -1, -1, -1, -1, 1, 0, 0, 0, -1, -1, 289406, 1447033, 1, 1, 0.9919, 0, 8192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, -1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 40, 3, 4, 68974);
@@ -1,10 +1,11 @@
--
-- Archaeology research DB2 hotfix tables. feature/archaeology added the DB2 loaders +
-- prepared statements (HotfixDatabase.cpp) but shipped no table SQL.
-- Archaeology (from the ground up) Phase 1 — hotfix tables for the four Research DB2 stores.
-- Wires ResearchBranch/Field/Project/Site so worldserver can prepare their hotfix statements
-- and apply DB overrides on top of the client .db2 files. Columns/order match
-- DB2Structure.h + DB2LoadInfo.h + HotfixDatabase.cpp (evry Archaeology track).
--
DROP TABLE IF EXISTS `research_branch`;
CREATE TABLE `research_branch` (
CREATE TABLE IF NOT EXISTS `research_branch` (
`ID` int unsigned NOT NULL DEFAULT '0',
`Name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`ResearchFieldID` tinyint unsigned NOT NULL DEFAULT '0',
@@ -12,12 +13,35 @@ CREATE TABLE `research_branch` (
`TextureFileID` int NOT NULL DEFAULT '0',
`BigTextureFileID` int NOT NULL DEFAULT '0',
`ItemID` int NOT NULL DEFAULT '0',
`VerifiedBuild` int NOT NULL DEFAULT '0'
, PRIMARY KEY (`ID`,`VerifiedBuild`)
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `research_project`;
CREATE TABLE `research_project` (
CREATE TABLE IF NOT EXISTS `research_branch_locale` (
`ID` int unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`Name_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `research_field` (
`ID` int unsigned NOT NULL DEFAULT '0',
`Name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`Slot` tinyint unsigned NOT NULL DEFAULT '0',
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `research_field_locale` (
`ID` int unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`Name_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `research_project` (
`ID` int unsigned NOT NULL DEFAULT '0',
`Name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`Description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
@@ -27,46 +51,33 @@ CREATE TABLE `research_project` (
`NumSockets` tinyint unsigned NOT NULL DEFAULT '0',
`TextureFileID` int NOT NULL DEFAULT '0',
`RequiredWeight` int unsigned NOT NULL DEFAULT '0',
`VerifiedBuild` int NOT NULL DEFAULT '0'
, PRIMARY KEY (`ID`,`VerifiedBuild`)
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `research_site`;
CREATE TABLE `research_site` (
CREATE TABLE IF NOT EXISTS `research_project_locale` (
`ID` int unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`Name_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`Description_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE IF NOT EXISTS `research_site` (
`ID` int unsigned NOT NULL DEFAULT '0',
`Name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`MapID` smallint NOT NULL DEFAULT '0',
`QuestPOIBlobID` int NOT NULL DEFAULT '0',
`AreaPOIIconEnum` int unsigned NOT NULL DEFAULT '0',
`VerifiedBuild` int NOT NULL DEFAULT '0'
, PRIMARY KEY (`ID`,`VerifiedBuild`)
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `research_branch_locale`;
CREATE TABLE `research_branch_locale` (
CREATE TABLE IF NOT EXISTS `research_site_locale` (
`ID` int unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`Name_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`VerifiedBuild` int NOT NULL DEFAULT '0'
, PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
`VerifiedBuild` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `research_project_locale`;
CREATE TABLE `research_project_locale` (
`ID` int unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`Name_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`Description_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`VerifiedBuild` int NOT NULL DEFAULT '0'
, PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `research_site_locale`;
CREATE TABLE `research_site_locale` (
`ID` int unsigned NOT NULL DEFAULT '0',
`locale` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`Name_lang` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
`VerifiedBuild` int NOT NULL DEFAULT '0'
, PRIMARY KEY (`ID`,`locale`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,23 @@
--
-- ItemConversion.db2 / ItemConversionEntry.db2 (Matrix Catalyst item conversion): hotfix mirrors.
--
DROP TABLE IF EXISTS `item_conversion`;
CREATE TABLE `item_conversion` (
`ID` INT UNSIGNED NOT NULL DEFAULT '0',
`Unknown920` INT NOT NULL DEFAULT '0',
`ItemBonusTreeID` INT NOT NULL DEFAULT '0',
`ItemLogicalCostGroupID` INT NOT NULL DEFAULT '0',
`AlternateItemLogicalCostGroupID` INT NOT NULL DEFAULT '0',
`PlayerConditionID` INT NOT NULL DEFAULT '0',
`VerifiedBuild` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `item_conversion_entry`;
CREATE TABLE `item_conversion_entry` (
`ID` INT UNSIGNED NOT NULL DEFAULT '0',
`ItemID` INT NOT NULL DEFAULT '0',
`ItemConversionID` INT UNSIGNED NOT NULL DEFAULT '0',
`VerifiedBuild` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,46 @@
--
-- Mythic+ season DB2 hotfix mirrors: MythicPlusSeasonKeyFloor (Resilient Keystone floor),
-- MythicPlusSeasonRewardLevels (Great Vault reward item levels + ActivityTierID),
-- MythicPlusSeasonTrackedAffix / MythicPlusSeasonTrackedMap (season affix set / dungeon pool).
--
DROP TABLE IF EXISTS `mythic_plus_season_key_floor`;
CREATE TABLE `mythic_plus_season_key_floor` (
`ID` INT UNSIGNED NOT NULL DEFAULT '0',
`KeyFloor` INT NOT NULL DEFAULT '0',
`PlayerConditionID` INT NOT NULL DEFAULT '0',
`DisplaySeasonID` INT UNSIGNED NOT NULL DEFAULT '0',
`VerifiedBuild` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `mythic_plus_season_reward_levels`;
CREATE TABLE `mythic_plus_season_reward_levels` (
`ID` INT UNSIGNED NOT NULL DEFAULT '0',
`MythicPlusSeasonID` INT UNSIGNED NOT NULL DEFAULT '0',
`ActivityTierID` INT NOT NULL DEFAULT '0',
`DifficultyLevel` INT NOT NULL DEFAULT '0',
`WeeklyRewardLevel` INT NOT NULL DEFAULT '0',
`EndOfRunRewardLevel` INT NOT NULL DEFAULT '0',
`VerifiedBuild` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `mythic_plus_season_tracked_affix`;
CREATE TABLE `mythic_plus_season_tracked_affix` (
`ID` INT UNSIGNED NOT NULL DEFAULT '0',
`KeystoneAffixID` INT NOT NULL DEFAULT '0',
`BonusRating` INT NOT NULL DEFAULT '0',
`Field_9_1_0_38511_004` INT NOT NULL DEFAULT '0',
`DisplaySeasonID` INT UNSIGNED NOT NULL DEFAULT '0',
`VerifiedBuild` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `mythic_plus_season_tracked_map`;
CREATE TABLE `mythic_plus_season_tracked_map` (
`ID` INT UNSIGNED NOT NULL DEFAULT '0',
`MapChallengeModeID` INT NOT NULL DEFAULT '0',
`DisplaySeasonID` INT UNSIGNED NOT NULL DEFAULT '0',
`VerifiedBuild` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -0,0 +1,13 @@
--
-- ItemLogicalCost.db2 hotfix mirror (item upgrade step costs: slot mask -> ItemExtendedCost).
--
DROP TABLE IF EXISTS `item_logical_cost`;
CREATE TABLE `item_logical_cost` (
`ID` INT UNSIGNED NOT NULL DEFAULT '0',
`InventoryTypeSlotMask` INT NOT NULL DEFAULT '0',
`Flags` INT NOT NULL DEFAULT '0',
`ItemExtendedCostID` INT NOT NULL DEFAULT '0',
`ItemLogicalCostGroupID` INT UNSIGNED NOT NULL DEFAULT '0',
`VerifiedBuild` INT NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`VerifiedBuild`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

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