Compare commits
74 Commits
6219d00c06
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 65f3535382 | |||
| 7657dd4731 | |||
| 25d255ddad | |||
| 2b6e2f12fb | |||
| 0c87f040f6 | |||
| 08426fa6d4 | |||
| 0a277174bc | |||
| 6956edf6cd | |||
| edb998de02 | |||
| 4d760528cc | |||
| a0464d3388 | |||
| c2f72294d8 | |||
| 20a8775eb3 | |||
| d9273459d0 | |||
| 4f21e52986 | |||
| da7d96f124 | |||
| e0e0ba1250 | |||
| 5f430f0510 | |||
| 01046fd22a | |||
| 65d5978f4a | |||
| 7f0c3a5453 | |||
| fa6d14c4a0 | |||
| afb770d096 | |||
| 19c0cf0345 | |||
| c901bc1765 | |||
| ef14de98ea | |||
| 81400d7195 | |||
| 77fa13a929 | |||
| fb959731ce | |||
| f6ad8117c6 | |||
| a55cc4fd64 | |||
| 5427805396 | |||
| d863aca69a | |||
| 65365ce331 | |||
| 7ade5297a5 | |||
| 95ba4466e1 | |||
| d681f73f54 | |||
| c74de0d601 | |||
| 44fad5a041 | |||
| 05af3e02f2 | |||
| 35c52bd806 | |||
| 24a0700853 | |||
| ba0caeece2 | |||
| bd22c62631 | |||
| 346bd9c200 | |||
| 0032c28f21 | |||
| 5f5317dee3 | |||
| a9f2fde270 | |||
| 82254cf627 | |||
| 191422c038 | |||
| 70fdf20075 | |||
| 5c8b82338e | |||
| 37796803c7 | |||
| 5205a9b5f0 | |||
| 6d98d5cbbd | |||
| b047cb7a02 | |||
| e0b2fcf3e0 | |||
| 0b2a042175 | |||
| 04b6dd20f5 | |||
| ac40810f25 | |||
| 5c4c4b6d7a | |||
| a95670ac0a | |||
| ce69bad85b | |||
| a4d245ecbe | |||
| d7701b5b98 | |||
| e1ccf30afc | |||
| 80a4a589f6 | |||
| 0bc9b016d6 | |||
| 3a4c6c01dd | |||
| b0b876b76b | |||
| fa7a543b94 | |||
| 5408eae697 | |||
| 995122dc78 | |||
| 0ac509e421 |
@@ -0,0 +1,8 @@
|
||||
.git
|
||||
.github
|
||||
build
|
||||
data
|
||||
docker/db-dumps
|
||||
*.zip
|
||||
*.log
|
||||
*.pid
|
||||
@@ -0,0 +1,11 @@
|
||||
DB_ROOT_PASSWORD=change-me
|
||||
DB_USER=sylvania
|
||||
DB_PASSWORD=sylvania
|
||||
EXTERNAL_ADDRESS=127.0.0.1
|
||||
REALM_NAME=Sylvania Solo
|
||||
REALM_ADDRESS=127.0.0.1
|
||||
REALM_PORT=8086
|
||||
DBC_LOCALE=8
|
||||
BUILD_JOBS=2
|
||||
BUILD_TYPE=Release
|
||||
IMAGE_TAG=local
|
||||
@@ -0,0 +1,14 @@
|
||||
# Copy to .env.production and replace both passwords before deployment.
|
||||
DB_ROOT_PASSWORD=GENERATE_A_LONG_RANDOM_ROOT_PASSWORD
|
||||
DB_USER=sylvania
|
||||
DB_PASSWORD=GENERATE_A_DIFFERENT_LONG_RANDOM_DB_PASSWORD
|
||||
|
||||
REALM_NAME=FelWell
|
||||
REALM_ADDRESS=legion.moon-well.online
|
||||
REALM_PORT=8086
|
||||
DBC_LOCALE=8
|
||||
EXTERNAL_ADDRESS=legion.moon-well.online
|
||||
|
||||
BUILD_JOBS=8
|
||||
BUILD_TYPE=Release
|
||||
IMAGE_TAG=production
|
||||
@@ -9,6 +9,13 @@ build*/
|
||||
*.kdev*
|
||||
.DS_Store
|
||||
CMakeLists.txt.user
|
||||
.env
|
||||
.env.production
|
||||
/data/
|
||||
/docker/db-dumps/*.rar
|
||||
/docker/db-dumps/*.sql
|
||||
/docker/db-dumps/*.sql.gz
|
||||
/felwell-data-*.zip
|
||||
*.bak
|
||||
*.patch
|
||||
*.diff
|
||||
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
# syntax=docker/dockerfile:1.7
|
||||
FROM ubuntu:24.04 AS builder
|
||||
|
||||
ARG BUILD_TYPE=Release
|
||||
ARG BUILD_JOBS=2
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
|
||||
apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
ca-certificates \
|
||||
cmake \
|
||||
git \
|
||||
libboost-filesystem-dev \
|
||||
libboost-iostreams-dev \
|
||||
libboost-locale-dev \
|
||||
libboost-program-options-dev \
|
||||
libboost-regex-dev \
|
||||
libboost-system-dev \
|
||||
libboost-thread-dev \
|
||||
libbz2-dev \
|
||||
libcurl4-openssl-dev \
|
||||
libmariadb-dev \
|
||||
libmariadb-dev-compat \
|
||||
libncurses-dev \
|
||||
libreadline-dev \
|
||||
libssl-dev \
|
||||
zlib1g-dev \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /src
|
||||
COPY . .
|
||||
|
||||
RUN cmake -S . -B /build \
|
||||
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
|
||||
-DCMAKE_INSTALL_PREFIX=/opt/sylvania \
|
||||
-DTOOLS=OFF \
|
||||
&& cmake --build /build --parallel "${BUILD_JOBS}" \
|
||||
&& cmake --install /build
|
||||
|
||||
FROM ubuntu:24.04 AS runtime
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
|
||||
apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
libboost-filesystem1.83.0 \
|
||||
libboost-iostreams1.83.0 \
|
||||
libboost-locale1.83.0 \
|
||||
libboost-program-options1.83.0 \
|
||||
libboost-regex1.83.0 \
|
||||
libboost-system1.83.0 \
|
||||
libboost-thread1.83.0 \
|
||||
libbz2-1.0 \
|
||||
libcurl4t64 \
|
||||
libmariadb3 \
|
||||
libncurses6 \
|
||||
libreadline8t64 \
|
||||
libssl3t64 \
|
||||
mariadb-client \
|
||||
zlib1g \
|
||||
&& rm -rf /var/lib/apt/lists/* \
|
||||
&& useradd --system --uid 10001 --home /opt/sylvania --shell /usr/sbin/nologin sylvania
|
||||
|
||||
COPY --from=builder /opt/sylvania /opt/sylvania
|
||||
COPY docker/entrypoint.sh /usr/local/bin/sylvania-entrypoint
|
||||
|
||||
RUN chmod +x /usr/local/bin/sylvania-entrypoint \
|
||||
&& mkdir -p /opt/sylvania/data /opt/sylvania/logs \
|
||||
&& chown -R sylvania:sylvania /opt/sylvania
|
||||
|
||||
USER sylvania
|
||||
WORKDIR /opt/sylvania
|
||||
|
||||
EXPOSE 1119 8081 8085
|
||||
ENTRYPOINT ["sylvania-entrypoint"]
|
||||
CMD ["worldserver"]
|
||||
@@ -0,0 +1,58 @@
|
||||
# syntax=docker/dockerfile:1.7
|
||||
FROM ubuntu:24.04 AS builder
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt/lists,sharing=locked \
|
||||
apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
ca-certificates \
|
||||
cmake \
|
||||
git \
|
||||
libboost-filesystem-dev \
|
||||
libboost-iostreams-dev \
|
||||
libboost-locale-dev \
|
||||
libboost-program-options-dev \
|
||||
libboost-regex-dev \
|
||||
libboost-system-dev \
|
||||
libboost-thread-dev \
|
||||
libbz2-dev \
|
||||
libcurl4-openssl-dev \
|
||||
libmariadb-dev \
|
||||
libmariadb-dev-compat \
|
||||
libncurses-dev \
|
||||
libreadline-dev \
|
||||
libssl-dev \
|
||||
zlib1g-dev \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /src
|
||||
COPY . .
|
||||
|
||||
RUN cmake -S . -B /build \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_INSTALL_PREFIX=/opt/sylvania \
|
||||
-DSERVERS=OFF \
|
||||
-DTOOLS=ON \
|
||||
&& cmake --build /build --parallel 2 \
|
||||
&& cmake --install /build
|
||||
|
||||
FROM ubuntu:24.04
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libboost-filesystem1.83.0 \
|
||||
libboost-iostreams1.83.0 \
|
||||
libboost-program-options1.83.0 \
|
||||
libboost-regex1.83.0 \
|
||||
libboost-system1.83.0 \
|
||||
libbz2-1.0 \
|
||||
libssl3t64 \
|
||||
zlib1g \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY --from=builder /opt/sylvania/bin /opt/sylvania/bin
|
||||
WORKDIR /client
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
**Le core C++ du royaume [La Légion de Sylvania](https://legendesylvania.com)**
|
||||
Émulateur de serveur *World of Warcraft®* — Legion 7.3.5
|
||||
|
||||
[](https://github.com/BlaMacfly/SylvaniaCore/wiki)
|
||||
[](https://discord.gg/qmQBXbuXkx)
|
||||
[](./LICENSE)
|
||||
[](https://github.com/BlaMacfly/SylvaniaCore/stargazers)
|
||||
@@ -49,6 +50,23 @@ Au-delà du core amont, le royaume apporte ses propres systèmes :
|
||||
|
||||
---
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
Ce README suffit pour **installer et lancer** un serveur. Tout le reste vit dans le
|
||||
**[wiki du projet](https://github.com/BlaMacfly/SylvaniaCore/wiki)** :
|
||||
|
||||
| | |
|
||||
| --- | --- |
|
||||
| 🔧 **[Corriger le contenu](https://github.com/BlaMacfly/SylvaniaCore/wiki/Corriger-le-contenu)** | Les classes de bugs récurrentes de ce core — scripts C++ non rattachés, hooks morts, quêtes sans objectif, butin, phases résiduelles — et comment les trouver. **Le meilleur point d'entrée pour une première contribution.** |
|
||||
| ⚙️ **[Configuration](https://github.com/BlaMacfly/SylvaniaCore/wiki/Configuration)** | Référence de toutes les clés de configuration propres au royaume |
|
||||
| 🧩 **[Architecture du core](https://github.com/BlaMacfly/SylvaniaCore/wiki/Architecture-du-core)** | Arborescence, lignée amont, pièges d'architecture |
|
||||
| 🤖 **Modules** | [PlayerBots](https://github.com/BlaMacfly/SylvaniaCore/wiki/Module-PlayerBots) · [Mercenaires](https://github.com/BlaMacfly/SylvaniaCore/wiki/Module-Mercenaires) · [Siège des Capitales](https://github.com/BlaMacfly/SylvaniaCore/wiki/Module-Siege-des-Capitales) · [Autres customs](https://github.com/BlaMacfly/SylvaniaCore/wiki/Autres-customs) |
|
||||
| 💥 **[Diagnostic des crashs](https://github.com/BlaMacfly/SylvaniaCore/wiki/Diagnostic-des-crashs)** | Core dumps, redzone jemalloc, faux crashs d'arrêt |
|
||||
| 🩺 **[FAQ Dépannage](https://github.com/BlaMacfly/SylvaniaCore/wiki/FAQ-Depannage)** | Écran de chargement, PNJ disparus, personnage bloqué, boss infaisable… |
|
||||
| 🚧 **[Chantiers en cours](https://github.com/BlaMacfly/SylvaniaCore/wiki/Chantiers-en-cours)** | Ce qui est ouvert, ce qui est clos, et les **impasses connues** |
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Prérequis
|
||||
|
||||
- **CMake 3.31+**
|
||||
@@ -59,6 +77,9 @@ Au-delà du core amont, le royaume apporte ses propres systèmes :
|
||||
|
||||
Plateformes supportées : **Linux, Windows, macOS**.
|
||||
|
||||
> 📖 Paquets à installer, extraction des données client et compilation sur une machine modeste :
|
||||
> **[Installation](https://github.com/BlaMacfly/SylvaniaCore/wiki/Installation)** sur le wiki.
|
||||
|
||||
---
|
||||
|
||||
## 📦 Compilation
|
||||
@@ -151,8 +172,8 @@ amont est livrée vide : c'est normal, tout l'historique est rejoué. Comptez pl
|
||||
`sql/sylvania/` est la trace versionnée des correctifs data appliqués à la base du royaume
|
||||
(artefacts, campagnes, donjons, modules Mercenaires et Siège des Capitales…). Ils sont indépendants
|
||||
du mécanisme de mise à jour automatique et s'importent à la main, dans l'ordre chronologique, une
|
||||
fois les étapes précédentes terminées. La base `world` de production du royaume n'est pas
|
||||
distribuée.
|
||||
fois les étapes précédentes terminées. **Chaque fichier annonce sa base cible dans son en-tête :
|
||||
le dossier n'en a pas une seule.** Détail et conventions : **[Bases de données](https://github.com/BlaMacfly/SylvaniaCore/wiki/Bases-de-donnees)**.
|
||||
|
||||
### 🩺 Bloqué sur l'écran de chargement ?
|
||||
|
||||
@@ -166,14 +187,12 @@ Received not handled opcode [CMSG_GET_ACCOUNT_CHARACTER_LIST ...]
|
||||
|
||||
`ResourceService` est un service Battle.net resté à l'état d'ébauche en amont, et
|
||||
`CMSG_GET_ACCOUNT_CHARACTER_LIST` (liste des personnages inter-royaumes) est délibérément déclaré
|
||||
`STATUS_UNHANDLED` dans `src/server/game/Server/Protocol/Opcodes.cpp`. Si le client reste bloqué au
|
||||
chargement, cherchez plutôt du côté :
|
||||
`STATUS_UNHANDLED` dans `src/server/game/Server/Protocol/Opcodes.cpp`.
|
||||
|
||||
- d'une base `world` ou `hotfixes` mal importée — voir l'avertissement sur `sql/base/dev/` ;
|
||||
- du cache du client : videz son dossier `Cache` ;
|
||||
- des données extraites — `dbc/`, `maps/`, `vmaps/`, `mmaps/`, `cameras/` et `gt/` doivent provenir
|
||||
d'un client **7.3.5 build 26972**, et `DataDir` doit pointer sur le dossier qui les contient ;
|
||||
- de `DBErrors.log` et des lignes de démarrage du worldserver, qui nomment la table fautive.
|
||||
La cause est presque toujours une base `world` ou `hotfixes` mal importée — relisez l'avertissement
|
||||
sur `sql/base/dev/` ci-dessus. Les autres pistes (cache client, données extraites, lecture de
|
||||
`DBErrors.log`) sont détaillées dans la **[FAQ Dépannage](https://github.com/BlaMacfly/SylvaniaCore/wiki/FAQ-Depannage)**, avec les autres
|
||||
symptômes fréquents.
|
||||
|
||||
---
|
||||
|
||||
@@ -191,7 +210,10 @@ ou nouvelle fonctionnalité :
|
||||
|
||||
1. Forkez le dépôt
|
||||
2. Créez une branche dédiée
|
||||
3. Ouvrez une pull request
|
||||
3. Ouvrez une pull request contre `sylvaniacore`
|
||||
|
||||
> 📖 Conventions du dépôt, style de commit, règles pour le SQL et doctrine de correction :
|
||||
> **[Contribuer](https://github.com/BlaMacfly/SylvaniaCore/wiki/Contribuer)** sur le wiki.
|
||||
|
||||
Un Discord est ouvert **aux contributeurs et aux personnes qui souhaitent participer au
|
||||
développement du core** : c'est l'endroit où discuter d'un correctif avant de se lancer, poser
|
||||
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
# FelWell — Legion 7.3.5
|
||||
|
||||
Production-сборка SylvaniaCore для realm **FelWell**. Сервер рассчитан на
|
||||
клиент World of Warcraft Legion **7.3.5 build 26972** и публикуется по адресу
|
||||
`legion.moon-well.online`.
|
||||
|
||||
## Что входит в сборку
|
||||
|
||||
- SylvaniaCore: `worldserver` и `bnetserver`;
|
||||
- MariaDB 11.4 с базами `auth`, `characters`, `world`, `hotfixes` и `shop`;
|
||||
- Docker Compose для сборки и запуска всего стека;
|
||||
- автоматическая настройка `auth.realmlist` из переменных окружения;
|
||||
- русская локализация дополнительных `broadcast_text`;
|
||||
- постоянные Docker volumes для базы данных и журналов.
|
||||
|
||||
## Требования к VPS
|
||||
|
||||
- Ubuntu 24.04;
|
||||
- Docker Engine с Compose plugin;
|
||||
- DNS-запись `legion.moon-well.online`, направленная на публичный IP VPS;
|
||||
- открытые входящие TCP-порты `1119`, `8081` и `8085`;
|
||||
- игровой порт MariaDB `3306` не должен быть открыт в Интернет.
|
||||
|
||||
В каталоге `data/` должны находиться данные, извлечённые из клиента
|
||||
7.3.5.26972: `dbc`, `maps`, `vmaps`, `mmaps`, `cameras` и `gt`.
|
||||
|
||||
## Первый запуск
|
||||
|
||||
Создайте production-конфигурацию:
|
||||
|
||||
```bash
|
||||
cp .env.production.example .env.production
|
||||
nano .env.production
|
||||
```
|
||||
|
||||
Обязательно замените `DB_ROOT_PASSWORD` и `DB_PASSWORD` на разные длинные
|
||||
случайные пароли. Затем положите полные дампы `world` и `hotfixes` в
|
||||
`docker/db-dumps/` и запустите сервер:
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env.production up --build -d
|
||||
docker compose --env-file .env.production ps
|
||||
docker compose --env-file .env.production logs -f bnetserver worldserver
|
||||
```
|
||||
|
||||
При запуске запись realm автоматически получает следующие значения:
|
||||
|
||||
```text
|
||||
name = FelWell
|
||||
address = legion.moon-well.online
|
||||
port = 8085
|
||||
gamebuild = 26972
|
||||
```
|
||||
|
||||
## Русские переводы
|
||||
|
||||
Дополнительные переводы находятся в `sql/translations/ruRU/`. Их можно
|
||||
импортировать после инициализации базы:
|
||||
|
||||
```bash
|
||||
set -a
|
||||
. ./.env.production
|
||||
set +a
|
||||
|
||||
for file in sql/translations/ruRU/broadcast_text_locale_ruRU_part_*.sql; do
|
||||
docker compose --env-file .env.production exec -T database \
|
||||
mariadb --binary-mode -uroot "-p${DB_ROOT_PASSWORD}" hotfixes < "$file"
|
||||
done
|
||||
|
||||
docker compose --env-file .env.production restart worldserver
|
||||
```
|
||||
|
||||
Импорт идемпотентный: существующие строки не перезаписываются.
|
||||
|
||||
## Свой Git-сервер и обновления GitHub
|
||||
|
||||
Используется стандартная схема с двумя remote:
|
||||
|
||||
- `origin` — ваш собственный Git-сервер, основное место хранения;
|
||||
- `upstream` — публичный GitHub-репозиторий SylvaniaCore, только источник
|
||||
обновлений.
|
||||
|
||||
GitHub уже настроен как `upstream`. Добавьте свой сервер, подставив настоящий
|
||||
SSH URL:
|
||||
|
||||
```bash
|
||||
git remote add origin git@YOUR_GIT_SERVER:YOUR_GROUP/SylvaniaCore.git
|
||||
git push -u origin master
|
||||
git remote -v
|
||||
```
|
||||
|
||||
Рабочие изменения сначала коммитятся и отправляются только в ваш `origin`:
|
||||
|
||||
```bash
|
||||
git add .
|
||||
git commit -m "Configure FelWell production deployment"
|
||||
git push origin master
|
||||
```
|
||||
|
||||
Для получения очередных обновлений GitHub:
|
||||
|
||||
```bash
|
||||
git status
|
||||
git fetch upstream --prune
|
||||
git switch master
|
||||
git branch "backup/before-upstream-$(date +%F-%H%M)"
|
||||
git merge upstream/sylvaniacore
|
||||
```
|
||||
|
||||
Если возникли конфликты, разрешите их, сохраняя FelWell-настройки в
|
||||
`compose.yaml`, `docker/`, `.env.production.example` и SQL-миграциях. После
|
||||
сборки и проверки отправьте результат на собственный сервер:
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env.production build
|
||||
docker compose --env-file .env.production up -d
|
||||
docker compose --env-file .env.production logs --tail=200 worldserver bnetserver
|
||||
git push origin master
|
||||
```
|
||||
|
||||
Не выполняйте обновление при незакоммиченных изменениях. Файлы `.env`,
|
||||
`.env.production`, игровые данные и полные дампы БД исключены из Git.
|
||||
|
||||
## Резервное копирование базы
|
||||
|
||||
Перед обновлением создайте дамп всех игровых баз:
|
||||
|
||||
```bash
|
||||
set -a
|
||||
. ./.env.production
|
||||
set +a
|
||||
|
||||
docker compose --env-file .env.production exec -T database \
|
||||
mariadb-dump -uroot "-p${DB_ROOT_PASSWORD}" \
|
||||
--single-transaction --routines --events \
|
||||
--databases auth characters world hotfixes shop \
|
||||
| gzip > "felwell-$(date +%F-%H%M).sql.gz"
|
||||
```
|
||||
|
||||
Храните резервные копии вне VPS. Docker volume защищает данные при пересоздании
|
||||
контейнеров, но не заменяет внешнюю резервную копию.
|
||||
|
||||
## Полезные команды
|
||||
|
||||
```bash
|
||||
# Состояние контейнеров
|
||||
docker compose --env-file .env.production ps
|
||||
|
||||
# Последние журналы
|
||||
docker compose --env-file .env.production logs --tail=200 worldserver bnetserver
|
||||
|
||||
# Перезапуск серверов без удаления БД
|
||||
docker compose --env-file .env.production restart bnetserver worldserver
|
||||
|
||||
# Остановка стека с сохранением volumes
|
||||
docker compose --env-file .env.production down
|
||||
```
|
||||
|
||||
Не запускайте `docker compose down -v` на production: ключ `-v` удаляет volume
|
||||
MariaDB вместе с игровыми аккаунтами и персонажами.
|
||||
+309
@@ -0,0 +1,309 @@
|
||||
<div align="center">
|
||||
|
||||
<img src=".github/assets/sylvaniacore-logo.png" alt="SylvaniaCore" width="360">
|
||||
|
||||
# SylvaniaCore
|
||||
|
||||
**C++-ядро игрового мира [La Légion de Sylvania](https://legendesylvania.com)**<br>
|
||||
Эмулятор сервера *World of Warcraft®* — Legion 7.3.5
|
||||
|
||||
[](https://discord.gg/qmQBXbuXkx)
|
||||
[](./LICENSE)
|
||||
[](https://github.com/BlaMacfly/SylvaniaCore/stargazers)
|
||||
[](https://github.com/BlaMacfly/SylvaniaCore/network/members)
|
||||
[](https://github.com/slash-design/DestinyCore)
|
||||
|
||||
</div>
|
||||
|
||||
> Практическая инструкция по Docker, production-развёртыванию FelWell и
|
||||
> синхронизации с собственным Git-сервером: [README.ru.md](./README.ru.md).
|
||||
|
||||
---
|
||||
|
||||
## 📖 О проекте
|
||||
|
||||
**SylvaniaCore** — ядро франкоязычного игрового мира **La Légion de Sylvania**
|
||||
для *World of Warcraft® Legion 7.3.5*. Это форк
|
||||
[DestinyCore](https://github.com/slash-design/DestinyCore), который, в свою
|
||||
очередь, происходит из семейства TrinityCore. Проект постоянно развивается и
|
||||
поддерживается для нужд игрового мира.
|
||||
|
||||
Репозиторий одновременно служит **актуальной кодовой базой** и **резервной
|
||||
копией** production-сервера.
|
||||
|
||||
### Философия: «адаптивный blizzlike»
|
||||
|
||||
Это не *fun*-сервер и не сервер с *rates x∞*. Оригинальные значения Blizzard
|
||||
(урон, баланс и экономика) **сохраняются**. Основная работа направлена на
|
||||
**исправление отклонений от blizzlike**, а не на упрощение игры. Каждая
|
||||
обнаруженная ошибка исправляется в источнике — в данных или в ядре, — а не
|
||||
обходится командами игрового мастера.
|
||||
|
||||
---
|
||||
|
||||
## ✨ Дополнения SylvaniaCore
|
||||
|
||||
Помимо возможностей upstream-ядра, проект содержит собственные системы:
|
||||
|
||||
| Модуль | Описание |
|
||||
| --- | --- |
|
||||
| 🤖 **PlayerBots** | Управляемые боты-игроки (`src/server/game/PlayerBot`): групповые команды, роли танка и лекаря, управление экипировкой и автоматическое заполнение полей боя |
|
||||
| ⚔️ **Осада столиц** | Ежедневные нападения отрядов ботов на столицы с назначенным командиром и PvP-флагом игроков (`src/server/game/CapitalSiege`) |
|
||||
| 💰 **Наёмники** | Нанимаемые NPC-компаньоны: одиночный игрок может заключить с ними контракт за игровое золото (`src/server/game/Mercenary`) |
|
||||
| 🇫🇷 **Локализация frFR** | Восстановление официальных французских текстов из клиента 7.3.5 — заданий, диалогов и broadcast-текстов — и перевод отсутствующего сценарного контента |
|
||||
| 🐛 **Исправления контента** | Последовательное восстановление кампаний, подземелий и заданий по отдельным зонам: Мардум, Скитающийся остров, Вершина Смерча и другие |
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Требования
|
||||
|
||||
- **CMake 3.31+**
|
||||
- **Boost 1.84.0**
|
||||
- **MySQL 8.0** или **MariaDB 10.6+** — игровой мир использует MariaDB 11.4
|
||||
- **OpenSSL 3.x**
|
||||
- **GCC / Clang / MSVC** — рекомендуется Visual Studio 2022
|
||||
|
||||
Поддерживаемые платформы: **Linux, Windows и macOS**.
|
||||
|
||||
---
|
||||
|
||||
## 📦 Сборка
|
||||
|
||||
1. Клонируйте репозиторий:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/BlaMacfly/SylvaniaCore.git
|
||||
cd SylvaniaCore
|
||||
```
|
||||
|
||||
2. Настройте и соберите проект:
|
||||
|
||||
```bash
|
||||
cmake -S . -B build -DTOOLS=ON
|
||||
cmake --build build -j$(nproc)
|
||||
```
|
||||
|
||||
3. Установите базы данных согласно разделу
|
||||
[Установка базы данных](#-установка-базы-данных).
|
||||
|
||||
4. Запустите серверы:
|
||||
|
||||
```bash
|
||||
./bin/worldserver
|
||||
./bin/bnetserver
|
||||
```
|
||||
|
||||
> ℹ️ В исходном коде намеренно сохранены внутренние имена upstream-проекта:
|
||||
> `DestinyCore`, названия целей CMake и пути конфигурации. Это обеспечивает
|
||||
> совместимость с upstream-обновлениями и существующими сценариями
|
||||
> развёртывания.
|
||||
|
||||
### Docker Compose
|
||||
|
||||
Ядро, сервер Battle.net и MariaDB 11.4 можно собрать и запустить вместе:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Поместите DB_world_*.sql и DB_hotfixes_*.sql (или .sql.gz) в docker/db-dumps/
|
||||
# Поместите dbc/, maps/, vmaps/, mmaps/, cameras/ и gt/ клиента 7.3.5 в data/
|
||||
docker compose up --build -d
|
||||
docker compose logs -f worldserver
|
||||
```
|
||||
|
||||
Схемы `auth`, `characters` и `shop` импортируются автоматически при первом
|
||||
запуске MariaDB. Полные дампы `world` и `hotfixes` также импортируются из
|
||||
`docker/db-dumps/`. Перед публикацией сервера обязательно замените пароли в
|
||||
`.env`. Объявляемый клиентам адрес задаётся переменной `EXTERNAL_ADDRESS`.
|
||||
|
||||
### Production-развёртывание FelWell
|
||||
|
||||
Production-шаблон настраивает игровой мир `FelWell` по адресу
|
||||
`legion.moon-well.online:8085`:
|
||||
|
||||
```bash
|
||||
cp .env.production.example .env.production
|
||||
# Обязательно замените оба пароля в .env.production
|
||||
docker compose --env-file .env.production up --build -d
|
||||
docker compose --env-file .env.production logs -f bnetserver worldserver
|
||||
```
|
||||
|
||||
При запуске запись `auth.realmlist` автоматически синхронизируется с
|
||||
`REALM_NAME`, `REALM_ADDRESS` и `REALM_PORT`. DNS-запись `A/AAAA` должна
|
||||
указывать на VPS, а брандмауэр должен разрешать TCP-порты `1119`, `8081` и
|
||||
`8085`. MariaDB должна оставаться только во внутренней сети Docker и не должна
|
||||
публиковаться в Интернет.
|
||||
|
||||
Volumes `database-data` и `sylvania-logs` сохраняют базу данных и журналы
|
||||
соответственно. Изменения в `docker/db-dumps/` не импортируются повторно, если
|
||||
база уже была инициализирована.
|
||||
|
||||
---
|
||||
|
||||
## 💾 Установка базы данных
|
||||
|
||||
Репозиторий содержит **только схемы** `auth`, `characters` и `shop`. Базы
|
||||
`world` и `hotfixes` слишком велики для хранения в Git; их необходимо загрузить
|
||||
из **релизов upstream-репозитория DestinyCore**.
|
||||
|
||||
> ⚠️ **Никогда не импортируйте файлы из `sql/base/dev/`.** Это **пустые**
|
||||
> структуры таблиц без игровых данных, предназначенные для разработчиков
|
||||
> upstream-проекта. После такого импорта `worldserver` может запуститься, но
|
||||
> клиент останется на экране загрузки из-за пустой базы `world`.
|
||||
|
||||
### 1. Загрузка upstream-базы
|
||||
|
||||
Загрузите последний релиз базы на странице
|
||||
[slash-design/DestinyCore/releases](https://github.com/slash-design/DestinyCore/releases).
|
||||
На момент написания это `DB735.02.rar` размером около 84 МБ. Архив содержит два
|
||||
дампа:
|
||||
|
||||
| Файл | База | Размер после распаковки |
|
||||
| --- | --- | --- |
|
||||
| `DB_world_735.02.sql` | `world` | около 375 МБ |
|
||||
| `DB_hotfixes_735.02.sql` | `hotfixes` | около 127 МБ |
|
||||
|
||||
Оба дампа самостоятельно выполняют `CREATE DATABASE`, а затем `USE` для баз
|
||||
`world` и `hotfixes`. Если нужны другие имена баз, измените эти две строки в
|
||||
начале соответствующего файла.
|
||||
|
||||
### 2. Создание и импорт баз
|
||||
|
||||
```bash
|
||||
# Базы auth / characters / world / hotfixes
|
||||
mysql -u root -p < sql/create/create_mysql.sql
|
||||
|
||||
# База shop не создаётся upstream-скриптом
|
||||
mysql -u root -p -e "CREATE DATABASE shop DEFAULT CHARACTER SET utf8;"
|
||||
|
||||
# Схемы из репозитория
|
||||
mysql -u trinity -p auth < sql/base/auth_database.sql
|
||||
mysql -u trinity -p characters < sql/base/characters_database.sql
|
||||
mysql -u trinity -p shop < sql/base/shop_database.sql
|
||||
|
||||
# Полные базы из upstream-релиза
|
||||
mysql -u trinity -p < DB_world_735.02.sql
|
||||
mysql -u trinity -p < DB_hotfixes_735.02.sql
|
||||
```
|
||||
|
||||
### 3. Автоматическое применение обновлений ядром
|
||||
|
||||
Не импортируйте файлы из `sql/updates/` вручную. В `worldserver.conf` должно
|
||||
быть указано:
|
||||
|
||||
```ini
|
||||
Updates.EnableDatabases = 31 # auth + characters + world + hotfixes + shop
|
||||
Updates.AutoSetup = 1
|
||||
```
|
||||
|
||||
При первом запуске `worldserver` самостоятельно применит около 330 файлов из
|
||||
`sql/updates/world`, а также обновления для `characters` и `hotfixes`. Таблица
|
||||
`updates` в upstream-дампах изначально пуста — это нормально: история
|
||||
обновлений будет применена целиком. Процесс может занять несколько минут.
|
||||
|
||||
### 4. Исправления контента игрового мира (необязательно)
|
||||
|
||||
В `sql/sylvania/` хранится версионируемая история исправлений игровых данных:
|
||||
артефактов, кампаний, подземелий, модулей «Наёмники» и «Осада столиц». Они не
|
||||
относятся к механизму автоматических обновлений и импортируются вручную в
|
||||
хронологическом порядке после завершения предыдущих этапов. Production-база
|
||||
`world` игрового мира не распространяется.
|
||||
|
||||
### 🩺 Клиент завис на экране загрузки?
|
||||
|
||||
Следующие два сообщения появляются при каждом подключении на **всех** серверах
|
||||
этого семейства и **не являются ошибками**:
|
||||
|
||||
```text
|
||||
Client tried to call not implemented method ResourceService.GetContentHandle
|
||||
Received not handled opcode [CMSG_GET_ACCOUNT_CHARACTER_LIST ...]
|
||||
```
|
||||
|
||||
`ResourceService` — незавершённая upstream-реализация сервиса Battle.net, а
|
||||
`CMSG_GET_ACCOUNT_CHARACTER_LIST`, то есть межсерверный список персонажей,
|
||||
намеренно объявлен как `STATUS_UNHANDLED` в
|
||||
`src/server/game/Server/Protocol/Opcodes.cpp`. Если клиент не проходит экран
|
||||
загрузки, проверьте:
|
||||
|
||||
- правильность импорта `world` и `hotfixes`, учитывая предупреждение о
|
||||
`sql/base/dev/`;
|
||||
- кеш клиента — очистите каталог `Cache`;
|
||||
- извлечённые данные: `dbc/`, `maps/`, `vmaps/`, `mmaps/`, `cameras/` и `gt/`
|
||||
должны происходить из клиента **7.3.5 build 26972**, а `DataDir` должен
|
||||
указывать на содержащий их каталог;
|
||||
- `DBErrors.log` и начальные строки журнала `worldserver`, где будет указана
|
||||
проблемная таблица.
|
||||
|
||||
---
|
||||
|
||||
## 🌍 Подключение к игровому миру
|
||||
|
||||
Игровой сервер открыт, а инструкции по подключению опубликованы на официальном
|
||||
сайте: **[legendesylvania.com](https://legendesylvania.com)**.
|
||||
|
||||
---
|
||||
|
||||
## 🤝 Участие в разработке
|
||||
|
||||
Мы приветствуем исправления ошибок, улучшения документации и новые возможности:
|
||||
|
||||
1. Создайте форк репозитория.
|
||||
2. Создайте отдельную ветку для изменения.
|
||||
3. Откройте pull request.
|
||||
|
||||
Discord открыт **для разработчиков и всех желающих участвовать в развитии
|
||||
ядра**. Там можно обсудить исправление до начала работы, задать вопросы по
|
||||
архитектуре или попросить проверить pull request. Это не Discord игрового мира.
|
||||
|
||||
<a href="https://discord.gg/qmQBXbuXkx"><img src="https://img.shields.io/badge/Discord-Для%20разработчиков-5865F2?style=for-the-badge&logo=discord&logoColor=white" alt="Присоединиться к Discord разработчиков"></a>
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Сообщение об ошибке
|
||||
|
||||
Создайте обращение в [трекере задач](https://github.com/BlaMacfly/SylvaniaCore/issues).
|
||||
Перед этим убедитесь, что аналогичная проблема ещё не зарегистрирована.
|
||||
|
||||
---
|
||||
|
||||
## 🙏 Благодарности
|
||||
|
||||
SylvaniaCore не существовал бы без проектов, на основе которых он создан:
|
||||
|
||||
- [DestinyCore](https://github.com/slash-design/DestinyCore) — upstream-ядро,
|
||||
форком которого является этот репозиторий;
|
||||
- [TrinityCore](https://github.com/TrinityCore/TrinityCore) — исходное семейство
|
||||
проекта;
|
||||
- [**ArgusCore**](https://github.com/Trion-Control-Panel/ArgusCore), проект
|
||||
[FlyingPhoenix](https://github.com/fIyingPhoenix), — один из важнейших
|
||||
ориентиров для SylvaniaCore. В нём проделана огромная работа над движком,
|
||||
сетевым уровнем и механиками классов версии 7.3.5. Мы регулярно используем
|
||||
его как источник решений при восстановлении крупных частей ядра. Спасибо за
|
||||
открыто опубликованные наработки;
|
||||
- [mod-playerbots](https://github.com/liyunfan1223/mod-playerbots) — источник
|
||||
решений для логики ботов-игроков.
|
||||
|
||||
Состояние CI upstream-репозитория:
|
||||
[](https://github.com/slash-design/DestinyCore/actions/workflows/win-x64-build.yml)
|
||||
[](https://github.com/slash-design/DestinyCore/actions/workflows/gcc-build.yml)
|
||||
[](https://github.com/slash-design/DestinyCore/actions/workflows/clang-build.yml)
|
||||
|
||||
---
|
||||
|
||||
## 📜 Лицензия
|
||||
|
||||
Проект распространяется по лицензии **GPL v2.0**. См. файл
|
||||
[LICENSE](./LICENSE).
|
||||
|
||||
*World of Warcraft® и Blizzard Entertainment® являются зарегистрированными
|
||||
товарными знаками Blizzard Entertainment, Inc. Проект не связан с Blizzard
|
||||
Entertainment и не одобрен этой компанией.*
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
<img src=".github/assets/sylvaniacore-logo.png" alt="SylvaniaCore" width="90">
|
||||
|
||||
⭐ Если вам нравится SylvaniaCore, поставьте проекту звезду!
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,97 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Genere creature_template_journal pour les boss WoD/Legion sans butin.
|
||||
Source officielle : JournalInstance -> JournalEncounter -> JournalEncounterCreature."""
|
||||
import sys, subprocess, collections
|
||||
sys.path.insert(0, '/home/ubuntu')
|
||||
from db2read import DB2
|
||||
D = '/home/ubuntu/server/data/dbc/enUS/'
|
||||
|
||||
CIBLES = [1175,1176,1182,1195,1209,1279,1358,1205,1228,
|
||||
1456,1458,1466,1477,1492,1501,1544,1571,1753,1520,1530,1676]
|
||||
|
||||
# adds / decors qui partagent le modele du boss mais ne doivent rien lacher
|
||||
EXCLUS = {
|
||||
76057, # Carrion Worm (add de Bonemaw)
|
||||
76874, 76945, 76884, # Dreadwing / Ironcrusher / Cruelfang (bestioles de Darmac)
|
||||
77337, # Aknor Steelbringer (add de Flamebender)
|
||||
76810, # Furnace Engineer
|
||||
76087, # Defense Construct (Skyreach)
|
||||
99801, 105383, 105322, 105304, # tentacules
|
||||
117123, # Tidescale Legionnaire
|
||||
122571, 125860, 122319, 125340, # adds du Siege du Triumvirat
|
||||
118460, # Engine of Souls (l'encontre se termine sur Soul Queen Dejahna)
|
||||
76018, 82556, # Drakonid Monstrosity (trash UBRS)
|
||||
106482, # Malfurion (PNJ de la rencontre Cenarius)
|
||||
120996, # doublon d'Atrigan
|
||||
77810, # doublon de Soulbinder Nyami
|
||||
84336, # doublon de Yalnu (pre-event)
|
||||
83893, 83892, # Protecteurs anciens : on garde Dulhu comme porteur
|
||||
76973, # Hans'gar : on garde Franzok
|
||||
78237, # Phemos : on garde Pol
|
||||
116689, # Atrigan : on garde Belac
|
||||
118523, 118374, # Soeurs de la Lune : on garde Priestess Lunaspyre
|
||||
102681, 102679, # Dragons du Cauchemar : on garde Lethon
|
||||
80808, 80805, # Contremaitres du Rail-de-fer : on garde Ahri'ok Dugru
|
||||
83613, # Koramar : on garde Skulloc
|
||||
76806, # Haut fourneau : on garde Foreman Feldspar ? non -> voir plus bas
|
||||
77231, 77477, # Vierges de fer : on garde Admiral Gar'an
|
||||
}
|
||||
# Haut fourneau : la rencontre se termine sur le Coeur de la Montagne
|
||||
EXCLUS.discard(76806); EXCLUS.add(76809)
|
||||
|
||||
ji = DB2(D+'JournalInstance.db2', "ssiiiihhbbi", [1]*11, 10, -1)
|
||||
je = DB2(D+'JournalEncounter.db2', "ssfhhhhbbii", [1,1,2,1,1,1,1,1,1,1,1], -1, -1)
|
||||
jec = DB2(D+'JournalEncounterCreature.db2',"ssiiihbi", [1]*8, 7, 5)
|
||||
jei = DB2(D+'JournalEncounterItem.db2', "ihbbbi", [1]*6, 5, 1)
|
||||
|
||||
instMap = {ji.getId(i): ji.getRaw(i,6,0,"h") for i in range(ji.recCount)}
|
||||
encMap = {}
|
||||
for i in range(je.recCount):
|
||||
eid = je.getId(i); mid = instMap.get(je.getRaw(i,6,0,"h"), 0)
|
||||
if mid in CIBLES: encMap[eid] = mid
|
||||
nbItems = {eid: len(jei.parentMap.get(eid, [])) for eid in encMap}
|
||||
disp = collections.defaultdict(set)
|
||||
for eid, idxs in jec.parentMap.items():
|
||||
if eid in encMap:
|
||||
for r in idxs: disp[eid].add(jec.getRaw(r,2,0,"i"))
|
||||
|
||||
q = ("SELECT DISTINCT c.map, ct.entry, ct.name, ct.rank, ct.ScriptName, "
|
||||
"ct.modelid1, ct.modelid2, ct.modelid3, ct.modelid4, "
|
||||
"(SELECT COUNT(*) FROM creature c2 WHERE c2.id=ct.entry AND c2.map=c.map), "
|
||||
"(SELECT COUNT(*) FROM creature_loot_template l WHERE l.entry=ct.lootid) "
|
||||
"FROM creature c JOIN creature_template ct ON ct.entry=c.id "
|
||||
"WHERE c.map IN (%s)" % ','.join(map(str, CIBLES)))
|
||||
out = subprocess.run(['mysql','-N','-B','dc_world','-e',q], capture_output=True, text=True).stdout
|
||||
byMapModel = collections.defaultdict(list)
|
||||
for line in out.splitlines():
|
||||
f = line.split('\t')
|
||||
mp, entry, name, rank, script = int(f[0]), int(f[1]), f[2], int(f[3]), f[4]
|
||||
spawns, butin = int(f[9]), int(f[10])
|
||||
for m in (int(x) for x in f[5:9]):
|
||||
if m: byMapModel[(mp, m)].append((entry, name, rank, script, spawns, butin))
|
||||
|
||||
rows, rejets = [], []
|
||||
for eid, mid in sorted(encMap.items(), key=lambda kv: kv[1]):
|
||||
cands, seen = [], set()
|
||||
for d in disp.get(eid, ()):
|
||||
for c in byMapModel.get((mid, d), []):
|
||||
if c[0] in seen: continue
|
||||
seen.add(c[0]); cands.append(c)
|
||||
# on ne garde que les boss credibles, sans butin, hors liste d'exclusion
|
||||
keep = [c for c in cands
|
||||
if c[0] not in EXCLUS and c[5] == 0
|
||||
and (c[3].startswith('boss_') or c[2] == 3 or (c[2] >= 1 and c[4] <= 3))]
|
||||
if not keep:
|
||||
rejets.append((mid, eid, nbItems.get(eid,0), [(c[0], c[1], c[5]) for c in cands]))
|
||||
continue
|
||||
keep.sort(key=lambda c: (0 if c[3].startswith('boss_') else 1, c[4]))
|
||||
for c in keep:
|
||||
rows.append((mid, eid, c[0], c[1], nbItems.get(eid,0)))
|
||||
|
||||
print("-- creature_template_journal : %d lignes" % len(rows))
|
||||
for mid, eid, entry, name, n in rows:
|
||||
print("(%d, %d), -- carte %d : %s (%d objets au journal)" % (entry, eid, mid, name, n))
|
||||
print()
|
||||
print("-- rencontres sans candidat retenu : %d" % len(rejets))
|
||||
for mid, eid, n, cands in rejets:
|
||||
print("-- carte %d rencontre %d (%d objets) -> %s" % (mid, eid, n, cands if cands else "aucun PNJ apparu"))
|
||||
@@ -0,0 +1,25 @@
|
||||
import sys, subprocess, collections
|
||||
sys.path.insert(0, '/home/ubuntu')
|
||||
from db2read import DB2
|
||||
D = '/home/ubuntu/server/data/dbc/enUS/'
|
||||
ji = DB2(D+'JournalInstance.db2', "ssiiiihhbbi", [1]*11, 10, -1)
|
||||
je = DB2(D+'JournalEncounter.db2', "ssfhhhhbbii", [1,1,2,1,1,1,1,1,1,1,1], -1, -1)
|
||||
jei = DB2(D+'JournalEncounterItem.db2', "ihbbbi", [1]*6, 5, 1)
|
||||
instMap = {ji.getId(i): ji.getRaw(i,6,0,"h") for i in range(ji.recCount)}
|
||||
enc = {}
|
||||
for i in range(je.recCount):
|
||||
enc[je.getId(i)] = (instMap.get(je.getRaw(i,6,0,"h"),0), je.getRaw(i,9,0,"i"))
|
||||
rows = subprocess.run(['mysql','-N','-B','dc_world','-e',
|
||||
"SELECT j.entry, j.JournalEncounterID, ct.name FROM creature_template_journal j "
|
||||
"JOIN creature_template ct ON ct.entry=j.entry WHERE j.entry>70000"],
|
||||
capture_output=True, text=True).stdout
|
||||
print("entry\tenc\tcarte\tordre\tnbObjets\tnom")
|
||||
bad=0
|
||||
for line in rows.splitlines():
|
||||
e, eid, name = line.split('\t'); eid=int(eid)
|
||||
mid, oi = enc.get(eid, (0,0))
|
||||
n = len(jei.parentMap.get(eid, []))
|
||||
flag = "" if (mid and n) else " <<< PROBLEME"
|
||||
if flag: bad+=1
|
||||
print("%s\t%d\t%d\t%d\t%d\t%s%s" % (e, eid, mid, oi, n, name, flag))
|
||||
print("problemes:", bad)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,164 @@
|
||||
# Legion — référence de travail
|
||||
|
||||
Ce document n'est pas une fiche encyclopédique. C'est un **croisement** : ce que
|
||||
le jeu officiel contient d'un côté, ce que notre base contient de l'autre. Un
|
||||
fait non vérifié contre nos données ne sert à rien pour réparer.
|
||||
|
||||
Chaque section suit la même règle : la source officielle est citée, puis la
|
||||
requête qui l'a confrontée à `dc_world`, puis l'écart s'il y en a un.
|
||||
|
||||
---
|
||||
|
||||
## L'ossature de l'extension
|
||||
|
||||
| Correctif | Contenu | Ce qui nous concerne |
|
||||
|---|---|---|
|
||||
| **7.0** Legion | Invasion, les quatre zones, les Sanctums de classe, l'arme prodigieuse | Scénario d'introduction du Rivage brisé |
|
||||
| **7.1** Retour à Karazhan | Suramar, Karazhan | — |
|
||||
| **7.2** Tombe de Sargeras | **Campagne du Front-de-Légion**, le Rivage brisé jouable, montures de classe | Notre chantier actuel |
|
||||
| **7.3** Ombres d'Argus | Argus, l'Insurgé | — |
|
||||
|
||||
---
|
||||
|
||||
## Le piège du Rivage brisé : DEUX scénarios
|
||||
|
||||
C'est l'erreur qui m'a coûté le plus de temps, et elle est facile à refaire.
|
||||
|
||||
| | Introduction | Assaut |
|
||||
|---|---|---|
|
||||
| Correctif | 7.0 | 7.2 |
|
||||
| Carte | **1460** | **1666** |
|
||||
| Scénario | 786 | 1280 |
|
||||
| Récit | La bataille perdue. Varian, Vol'jin, Tirion, Krosus, Gul'dan qui ouvre la Tombe | Le retour offensif depuis Dalaran |
|
||||
| Entrées de créatures | 90xxx | 116xxx–122xxx |
|
||||
| Script | `scenario_broken_shore_intro` | `scenario_7.2_broken_shore_intro` |
|
||||
| Quêtes liées | 42740 (Alliance) / 44543 (Horde) | **45102**, **46734** |
|
||||
|
||||
Les deux portent le même nom en jeu. Quand une quête du Rivage brisé ne se
|
||||
débloque pas, **la première question est : laquelle des deux cartes ?**
|
||||
|
||||
Les objectifs de 45102 parlent de « flèches de la Légion » (*Legion Spires*) et
|
||||
de Lord Kalgorath — tous en 116xxx, donc 7.2, donc carte 1666. Rien de tout
|
||||
cela n'est atteignable sur la 1460.
|
||||
|
||||
---
|
||||
|
||||
## Campagne du Front-de-Légion (7.2)
|
||||
|
||||
Source : [Breaching the Tomb](https://warcraft.wiki.gg/wiki/Breaching_the_Tomb),
|
||||
qui liste les quinze quêtes de l'exploit du même nom. En jeu officiel elles
|
||||
étaient **échelonnées par semaines**, du 28 mars au 6 juin 2017 — d'où le
|
||||
sentiment de campagne décousue.
|
||||
|
||||
### État chez nous, au 01/09/2026
|
||||
|
||||
Les quinze quêtes existent, **toutes avec donneur et receveur**. La campagne
|
||||
n'était donc pas cassée : seuls ses deux points d'entrée l'étaient.
|
||||
|
||||
| ID | Quête | Donneur | Objectifs |
|
||||
|---|---|---|---|
|
||||
| 46730 | Armies of Legionfall | Khadgar **86563** (Dalaran) | 1 |
|
||||
| 46734 | Assault on Broken Shore | Khadgar 86563 + **116302** | 2 |
|
||||
| 45102 | Begin the Assault | Khadgar **116302** | 3 |
|
||||
| 46245 | Begin Construction | Commander Chambers 120183 | 1 |
|
||||
| 46845 | Vengeance Point | Heidirk the Scalekeeper 120118 | 3 |
|
||||
| 47137 | Champions of Legionfall | Maiev Shadowsong 116576 | 1 |
|
||||
| 47139 | Mark of the Sentinax | Illidan Stormrage 117873 | 1 |
|
||||
| 46252 | Intolerable Infestation | Maiev 116576 | 1 |
|
||||
| 46250 | Take Out the Head... | Maiev 116576 | 1 |
|
||||
| 46246 | Strike Them Down | Maiev 116576 | 1 |
|
||||
| 46832 | Aalgen Point | Commander Chambers 120183 | **0** ⚠ |
|
||||
| 46247 | Defending Broken Isles | Maiev 116576 | 1 |
|
||||
| 46251 | Shard Times | Khadgar 116302 | 1 |
|
||||
| 46248 | Self-Fulfilling Prophecy | Prophet Velen 120372 | 1 |
|
||||
| 46769 | Relieved of Their Valuables | Khadgar 116302 | 1 |
|
||||
| 46249 | Championing Our Cause | Khadgar 116302 | 1 |
|
||||
|
||||
**Les deux Khadgar.** Ne pas les confondre, ils portent le même nom :
|
||||
|
||||
- **86563** — Anneau de Krasus, Dalaran, carte 1220 en `(-841, 4258, 746)`.
|
||||
L'altitude 746 est celle de la cité flottante. C'est lui qui ouvre la
|
||||
campagne et qui lance le scénario d'assaut.
|
||||
- **116302** — Pointe de la Délivrance, sur le Rivage brisé, carte 1220 en
|
||||
`(-1628, 3194, 130)`. Il donne le reste.
|
||||
- **120215** — un troisième, posé nulle part chez nous. La référence le place
|
||||
à l'Anneau de Krasus en phases 7312/7313. C'est la cible du crédit
|
||||
« Speak to Khadgar » de la quête 46734.
|
||||
|
||||
### Deux anomalies relevées
|
||||
|
||||
**46832 « Aalgen Point » n'a aucun objectif.** Elle a pourtant donneur et
|
||||
receveur, et aucune ligne dans `quest_template_addon` — donc pas de
|
||||
`SpecialFlags = 2` qui justifierait une validation par script. À examiner.
|
||||
|
||||
**48641 porte aussi le titre « Armies of Legionfall »**, sans aucun donneur,
|
||||
avec `QuestSortID 7543` (la zone du Rivage brisé) là où 46730 porte `-428`.
|
||||
Probablement une variante de suivi. Ne pas la confondre avec la vraie.
|
||||
|
||||
---
|
||||
|
||||
## Entrer dans le scénario d'assaut
|
||||
|
||||
Le déroulement officiel, décrit par les joueurs
|
||||
([Warcraft Wiki](https://warcraft.wiki.gg/wiki/Assault_on_Broken_Shore_(quest)),
|
||||
[Icy Veins](https://www.icy-veins.com/forums/topic/28263-patch-72-assault-on-the-broken-shore-scenario/)) :
|
||||
|
||||
> On prend la quête auprès de l'archimage à l'Anneau de Krasus, on choisit
|
||||
> « I am ready to launch the assault », une cinématique se joue, puis
|
||||
> *you will be flown* jusqu'au scénario.
|
||||
|
||||
Trois conséquences pour nous :
|
||||
|
||||
1. L'entrée est une **option de dialogue**, pas un portail. Elle n'existait ni
|
||||
dans notre base ni dans le dump de référence — donnée de capture jamais
|
||||
importée. Recréée dans `npc_archmage_khadgar_86563`.
|
||||
2. Le sort **240603** porte la destination officielle dans
|
||||
`spell_target_position` : carte 1666, `(-1111.6, 2969.71, 186.02)`.
|
||||
3. « Emporté par la voie des airs », c'est le **corbeau arcanique 118517**,
|
||||
invoqué par le sort **243303** (effet 28 SUMMON, valeur 118517 — vérifié
|
||||
dans `SpellEffect.db2` du build 7.3.5.26972). Son chemin de vol 11322708
|
||||
part de l'altitude de Dalaran (751) et descend au niveau de la mer (4).
|
||||
|
||||
---
|
||||
|
||||
## Les huit étapes du scénario 1280
|
||||
|
||||
Relevées dans `ScenarioStep`, `CriteriaTree` et `Criteria` du build
|
||||
7.3.5.26972 — pas recopiées d'un autre cœur.
|
||||
|
||||
| Ordre | Arbre | Type | Asset | Montant | Étape |
|
||||
|---|---|---|---|---|---|
|
||||
| 0 | 56811 | 92 | 56460 | 1 | Into the Fray |
|
||||
| 1 | 56872 | 92 | 56697 | 3 | Vanguard of the Assault |
|
||||
| 2 | 56874 | 92 | 56500 | 1 | Might of the Legion (Kalgorath) |
|
||||
| 3 | 57180 | 92 | 56779 | barre de 200 | Rifts of Chaos |
|
||||
| 3 | 57185 | **73** | 56778 | 3 | ... les trois portails |
|
||||
| 4 | 57183 | 92 | 56780 | 1 | The Doomguard's Command (Arganoth) |
|
||||
| 5 | 57293 | **68** | 267955 | 1 | Gateway to Ruin |
|
||||
| 6 | 58303 | 92 | 57574 | 7 | Pillar of Fire (7 bombes) |
|
||||
| 7 | 59170 | 92 | 57579 | 1 | Mephistroth |
|
||||
|
||||
Types : **92** `SEND_EVENT_SCENARIO` (alimenté par `DoSendEventScenario`),
|
||||
**73** `SEND_EVENT`, **68** `USE_GAMEOBJECT` (les deux par `UpdateCriteria`).
|
||||
|
||||
Concordance rassurante : la carte porte exactement **7 bombes arcaniques**
|
||||
(120743) pour un critère qui en exige 7, et 7 portails (118558) dont 3 à
|
||||
fermer.
|
||||
|
||||
---
|
||||
|
||||
## Comment étendre ce document
|
||||
|
||||
La méthode, pas le contenu, est ce qui compte :
|
||||
|
||||
1. Partir d'une source officielle — les wikis Warcraft sont fiables sur les
|
||||
chaînes de quêtes ; Wowhead ment quand on le lit par `curl`, ses tables
|
||||
sont en JavaScript.
|
||||
2. Pour tout ce qui est chiffré — critères, sorts, scénarios — passer par
|
||||
`wago.tools`, qui sert les DB2 du build **7.3.5.26972**, le nôtre.
|
||||
Format : `/db2/<Table>/csv?build=7.3.5.26972&filter[Colonne]=valeur`.
|
||||
Sans le filtre, les grosses tables font expirer la requête.
|
||||
3. **Toujours confronter à `dc_world`** avant d'écrire quoi que ce soit ici.
|
||||
Une ligne qui n'a pas été vérifiée contre notre base n'a pas sa place.
|
||||
4. Noter les écarts, pas les conformités. Ce qui marche n'a pas besoin d'être
|
||||
documenté.
|
||||
@@ -0,0 +1,114 @@
|
||||
# La bataille du Rivage brisé — déroulé de référence (carte 1460, scénario 786)
|
||||
|
||||
Ce document croise trois sources, et dit toujours laquelle parle :
|
||||
|
||||
- **la vidéo** fournie par l'exploitant (40 min, écran partagé Alliance/Horde),
|
||||
qui donne l'ordre réel des événements, le minutage et les compteurs affichés ;
|
||||
- **les DB2 du build 7.3.5.26972** (`ScenarioStep`, `CriteriaTree`, `Criteria`),
|
||||
qui donnent les critères chiffrés ;
|
||||
- **[Warcraft Wiki](https://warcraft.wiki.gg/wiki/The_Battle_for_Broken_Shore_(quest))**,
|
||||
qui donne les intitulés et les répliques.
|
||||
|
||||
Ce que **notre base** contient est indiqué en regard, avec l'écart quand il y en a.
|
||||
|
||||
---
|
||||
|
||||
## Les neuf étapes
|
||||
|
||||
| # | Alliance | Horde | Critère officiel |
|
||||
|---|---|---|---|
|
||||
| 1 | The Broken Shore | idem | arbre 42768 — asset 44060 ×1 |
|
||||
| 2 | Storm The Beach | idem | 44095 ×**33**, 52643 ×**3**, 44077 ×**3** |
|
||||
| 3 | Defeat the Commander — **Arganoth** | Defeat the Commander — **Azgalor** | arbre 43554 — asset 45131 ×1 |
|
||||
| 4 | **Find Varian** | **Find The Others** (Sylvanas *et* Baine) | arbre 43589 — asset 45228 ×1 |
|
||||
| 5 | Destroy the Portal — **4 ancres blindées** | idem | arbre 43415 — asset 45288 ×**4** |
|
||||
| 6 | Raze the Black City — barre 0→100 % | idem | arbre 42770 — 44384 ×1, 53062 ×2, 53063 ×5, 53064 ×10 |
|
||||
| 7 | The Highlord — atteindre Tirion | idem | arbre 42772 |
|
||||
| 8 | Krosus | idem | arbre 43765 |
|
||||
| 9 | **Stop Gul'dan** | **Hold the Ridge** | arbre 47225 |
|
||||
|
||||
---
|
||||
|
||||
## Trois erreurs que ce croisement a révélées
|
||||
|
||||
**L'étape 5 comptait la mauvaise créature.** Notre script invoquait deux
|
||||
« ancres dimensionnelles » (90637) de sa fabrication. Le jeu demande la
|
||||
destruction de **quatre ancres blindées** (`101667`), dont la carte porte déjà
|
||||
quinze exemplaires autour de `(1107, 2061)`. Corrigé.
|
||||
|
||||
**L'étape 3 n'a pas le même adversaire selon la faction.** Alliance : *Dread
|
||||
Commander Arganoth*. Horde : *Fel Commander Azgalor*. Notre script ne connaît
|
||||
qu'Arganoth et l'invoque pour les deux camps. **Non corrigé.**
|
||||
|
||||
**L'étape 4 non plus.** Alliance : trouver Varian. Horde : trouver **Sylvanas
|
||||
et Baine**, deux personnages, pas Vol'jin. Notre script cherche Vol'jin côté
|
||||
Horde. **Non corrigé.**
|
||||
|
||||
Et l'étape 9 diverge aussi : l'Alliance arrête Gul'dan, la Horde tient la
|
||||
crête pendant ce temps.
|
||||
|
||||
---
|
||||
|
||||
## Nos dialogues sont inventés
|
||||
|
||||
Toutes les répliques de `creature_text` pour ce scénario ont un
|
||||
`BroadcastTextId` à **zéro** : elles ont été écrites à la main, elles ne
|
||||
viennent pas du jeu. Elles sont plausibles mais fausses, et l'une d'elles a
|
||||
directement produit un bug.
|
||||
|
||||
| Entrée | Notre texte | Le jeu |
|
||||
|---|---|---|
|
||||
| 90714 Jaina | « Détruisez les ancres **dimensionnelles** » | *Those crystals appear to be anchoring the structures to our dimension. Take them out!* |
|
||||
| 90713 Varian | « Soldats de l'Alliance ! La Légion s'abat… » | *Genn, Jaina, it's good to see you safe.* |
|
||||
| 90717 Genn | — | *Just in time. We haven't been able to break their line. Now we may have a chance.* |
|
||||
| 90708 Vol'jin | « Fils et filles de la Horde ! … » | *Dere's only one way offa dis beach, and it be t'rough alla dose demons ahead of us.* |
|
||||
| 90413 Gul'dan | « Vous arrivez trop tard ! … » | *I have seen the end of your pitiful world, Wrynn. … The legion is ENDLESS.* |
|
||||
|
||||
C'est la réplique de Jaina qui a fabriqué l'erreur de l'étape 5 : le script a
|
||||
été écrit d'après elle. **La donnée fausse produit du code faux.**
|
||||
|
||||
---
|
||||
|
||||
## Déroulé relevé sur la vidéo
|
||||
|
||||
Minutage de la vidéo, pas du scénario — les premières minutes sont à Dalaran.
|
||||
|
||||
| Temps | Événement |
|
||||
|---|---|
|
||||
| 06:02 | Jaina : « Attention, des infernaux ! » — début du combat de plage |
|
||||
| 06:04 | Le commandant de l'effroi Arganoth parle |
|
||||
| 06:54 | Genn Grisetête : « Celui-là est à moi ! » |
|
||||
| 07:00 | Jaina : « Est-ce que tout le monde va bien ? » |
|
||||
| 07:26 | Genn : « Les troupes de Varian ont dû arriver de l'autre côté de… » |
|
||||
| 07:48 | Jaina : « Je n'avais jamais vu des démons progresser… » |
|
||||
| 08:18 | Genn : « Quelque chose a changé. La Légion n'est… » |
|
||||
| 08:38 | Jaina : « Oh, non… » |
|
||||
| 08:46 | Varian : « Tenez bon, soldats de l'Alliance ! » |
|
||||
| 09:12 | Varian : « Genn, Jaina, je suis heureux de voir que vous allez bien. » |
|
||||
| 09:18 | Varian : « En formation, protecteurs de l'Alliance ! Repoussons-les ! » |
|
||||
| 17:28 | Varian : « Vous avez une autre occasion de l'abattre, Sylvanas » |
|
||||
| 17:32 | Sylvanas : « C'est comme si c'était fait, Wrynn. » |
|
||||
| 17:54 | Varian : « Tout le monde, de l'autre côté du gouffre ! » |
|
||||
| 18:08 | Sylvanas : « Nous allons prendre la crête et couvrir votre… » |
|
||||
| 18:44 | Gul'dan : « M'échapper ? C'est plutôt vous qui n'échapperez pas à mon… » |
|
||||
| ~08:20 vidéo | phase 5 : compteur **0/4 → 2/4 → 3/4 Ancres blindées détruites** |
|
||||
| ~09:00 vidéo | phase 6 : barre **0 % → 2 % → 13 % → 37 % → 63 %** |
|
||||
|
||||
Le texte ci-dessus vient de la reconnaissance optique sur une vidéo 720p en
|
||||
écran partagé : **les fins de phrase sont tronquées** par la largeur de la
|
||||
fenêtre de discussion, et certains caractères sont incertains. Il donne
|
||||
l'ordre et l'orateur de façon fiable ; il ne fait pas autorité sur la
|
||||
formulation exacte. Pour celle-ci, se référer au wiki.
|
||||
|
||||
---
|
||||
|
||||
## Ce qui reste à faire
|
||||
|
||||
1. **Le commandant Horde** : invoquer Azgalor et non Arganoth.
|
||||
2. **L'étape 4 Horde** : deux cibles, Sylvanas et Baine.
|
||||
3. **L'étape 9 Horde** : tenir la crête, pas arrêter Gul'dan.
|
||||
4. **Les étapes 6 à 9** avancent encore par forçage, sans leurs critères. La
|
||||
barre de 300 points de l'étape 6 est alimentée par quatre événements de
|
||||
poids différents (1, 2, 5, 10) dont le sens reste à établir.
|
||||
5. **Remplacer les dialogues inventés** par les vrais. Ils n'existent qu'en
|
||||
anglais dans nos sources : traduire, ou assumer l'anglais.
|
||||
@@ -1,6 +1,7 @@
|
||||
# Chantier — Assaut du Rivage brisé (carte 1666)
|
||||
|
||||
État au 27/08/2026. **Rien n'est appliqué au serveur à ce stade.**
|
||||
État au 31/08/2026. **Tout est appliqué et déployé.** Rien n'est vérifié
|
||||
en jeu : c'est la seule chose qui manque.
|
||||
|
||||
## Le blocage d'origine
|
||||
|
||||
@@ -70,12 +71,52 @@ C'est un contrôle de cohérence — vérifier que le parseur trouvait bien des
|
||||
lignes sur des cartes connues — qui a révélé le bug. **Toujours valider un
|
||||
extracteur sur un cas positif connu avant de croire un résultat négatif.**
|
||||
|
||||
## Reste à faire
|
||||
## Ce qui a été fait le 31/08
|
||||
|
||||
1. Extraire et transposer les 593 + 59 placements.
|
||||
2. Extraire les chemins des 180 créatures mobiles.
|
||||
3. Transposer la déclaration du scénario.
|
||||
4. Porter les 808 lignes de C++ et les adapter à notre API, qui a divergé
|
||||
(`MoveJump`, `SetFacingTo`, `GetEffect` diffèrent déjà — constaté ailleurs).
|
||||
5. Raccorder le nom de script.
|
||||
6. Refaire autrement le comportement des 12 créatures à `AiID`.
|
||||
1. **593 créatures, 59 objets, 1495 points** appliqués sur la carte 1666.
|
||||
Le fichier était généré depuis le 27/08 et dormait sans être exécuté.
|
||||
2. **808 lignes de C++ portées** dans
|
||||
`src/server/scripts/BrokenIsles/Scenario/scenario_assault_broken_shore.cpp`,
|
||||
enregistré sous `scenario_7.2_broken_shore_intro` — le nom que
|
||||
`instance_template` réclamait déjà, donc aucune modification de base.
|
||||
Ce nom contient un point : la classe est écrite à la main, la macro
|
||||
`RegisterInstanceScript` ne l'accepterait pas.
|
||||
3. **Les 5 scripts rattachés** à leurs 11 entrées, toutes vérifiées
|
||||
exclusives à la carte 1666.
|
||||
4. **87 points des 5 chemins scriptés** extraits et posés.
|
||||
5. **Le donneur de la quête 45102** raccordé : Khadgar 116302.
|
||||
|
||||
## Le piège de l'extraction, deuxième épisode
|
||||
|
||||
Les cinq chemins scriptés (11322705 à 11322709) ne sont **pas** dans
|
||||
`waypoint_data` mais dans **`waypoint_data_script`**, une table que notre
|
||||
schéma n'a pas — notre `sWaypointMgr` ne lit que la première. L'extraction
|
||||
du 27/08 ne regardait que celle-là et les a donc silencieusement manqués.
|
||||
|
||||
Conséquence si on ne l'avait pas vu : le corbeau arcanique n'aurait jamais
|
||||
décollé, et comme c'est l'atteinte du point 20 de son vol qui déclenche
|
||||
l'étape 0, **le scénario n'aurait jamais démarré** — sans la moindre
|
||||
erreur dans le journal.
|
||||
|
||||
C'est la même leçon qu'en août, sous une autre forme : ce n'est pas
|
||||
l'extracteur qui a menti, c'est la table qu'on n'a pas pensé à ouvrir.
|
||||
|
||||
## Ce qui reste
|
||||
|
||||
1. **Tout vérifier en jeu.** Rien n'a été joué. Prendre 45102 auprès de
|
||||
Khadgar 116302 en Îles brisées et dérouler le scénario.
|
||||
2. **Les crédits 116253 et 116279** sont câblés sur la fermeture des deux
|
||||
premiers portails **par déduction** : la quête parle de « First » et
|
||||
« Second Legion Spire destroyed », et les portails sont les seuls
|
||||
objets destructibles de l'étape 3. À confirmer ou corriger.
|
||||
3. **Les 12 créatures à `AiID = 7424`** (119422 ×9, 119425 ×2, 119412 ×1)
|
||||
gardent un comportement de mêlée ordinaire. Vérifié : le dump ne
|
||||
contient **aucune** table définissant les `AiID` — ce comportement
|
||||
n'est pas récupérable depuis cette source. Ne pas rouvrir ce point
|
||||
sans une autre référence.
|
||||
4. **Khadgar 120215** n'est posé nulle part chez nous. La référence le
|
||||
place deux fois sur la carte 1220, en phases 7312 et 7313. Le crédit
|
||||
« Speak to Khadgar » est pour l'instant accordé par le script à la fin
|
||||
du scénario ; c'est un raccourci assumé, à arbitrer.
|
||||
5. **Concordance rassurante** relevée au passage : 7 bombes arcaniques
|
||||
posées sur la carte, pour un critère qui en exige exactement 7.
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Extrait les 5 chemins scriptes du Rivage brise (carte 1666).
|
||||
|
||||
Ils vivent dans `waypoint_data_script`, une table que notre coeur n'a
|
||||
pas : notre sWaypointMgr ne lit que `waypoint_data`. C'est pourquoi
|
||||
l'extraction precedente, qui ne regardait que cette derniere, les avait
|
||||
manques -- et pourquoi les alliés comme le corbeau restaient immobiles.
|
||||
|
||||
Correspondance des colonnes, pilotee par les NOMS :
|
||||
reference nous
|
||||
id, point, position_x/y/z, identiques
|
||||
orientation, delay,
|
||||
action, action_chance
|
||||
move_flag -> move_type (voir ci-dessous)
|
||||
speed, entry -> ABANDONNEES, aucun equivalent
|
||||
wpguid -> 0
|
||||
|
||||
move_flag vaut 1 sur la totalite des 87 points des cinq chemins. Notre
|
||||
enumeration donne 0=marche, 1=course, 2=atterrissage, 3=decollage : la
|
||||
valeur 1 designe la course dans les deux. Le vol du corbeau ne vient pas
|
||||
du chemin mais de SetFlyMode et du vehicule.
|
||||
|
||||
CONTROLE : les effectifs attendus sont ecrits en dur et verifies. Un
|
||||
extracteur qui renvoie zero sans broncher est le piege deja rencontre
|
||||
sur ce chantier.
|
||||
"""
|
||||
import io, re, sys
|
||||
|
||||
DUMP = '/home/ubuntu/tmp/abs/LegionCore_world_2020_04_25.sql'
|
||||
ATTENDU = {11322705: 24, 11322706: 18, 11322707: 23, 11322708: 21, 11322709: 1}
|
||||
|
||||
# colonnes de waypoint_data_script, relevees dans l'entete de l'INSERT
|
||||
COLS = ['id','point','position_x','position_y','position_z','orientation',
|
||||
'delay','move_flag','speed','action','action_chance','entry','wpguid']
|
||||
|
||||
motif = re.compile(r'^\((\d+),(.*)\)[,;]\s*$')
|
||||
trouves = {k: [] for k in ATTENDU}
|
||||
|
||||
with io.open(DUMP, encoding='utf-8', errors='surrogateescape') as f:
|
||||
for ligne in f:
|
||||
m = motif.match(ligne)
|
||||
if not m:
|
||||
continue
|
||||
ident = int(m.group(1))
|
||||
if ident not in ATTENDU:
|
||||
continue
|
||||
champs = [ident] + [c.strip() for c in m.group(2).split(',')]
|
||||
if len(champs) != len(COLS):
|
||||
sys.exit('ERREUR : %d champs pour le chemin %d, %d attendus'
|
||||
% (len(champs), ident, len(COLS)))
|
||||
trouves[ident].append(dict(zip(COLS, champs)))
|
||||
|
||||
for ident, n in sorted(ATTENDU.items()):
|
||||
reel = len(trouves[ident])
|
||||
if reel != n:
|
||||
sys.exit('ERREUR : chemin %d -> %d points extraits, %d attendus.'
|
||||
% (ident, reel, n))
|
||||
|
||||
total = sum(len(v) for v in trouves.values())
|
||||
|
||||
L = []
|
||||
L.append('-- ' + '=' * 69)
|
||||
L.append("-- Assaut du Rivage brisé (carte 1666) — les 5 chemins scriptés")
|
||||
L.append('--')
|
||||
L.append("-- Ces chemins vivent dans `waypoint_data_script` chez la référence,")
|
||||
L.append("-- une table que notre cœur n'a pas : sWaypointMgr ne lit que")
|
||||
L.append("-- `waypoint_data`. L'extraction du 27/08 ne regardait que cette")
|
||||
L.append("-- dernière et les avait donc manqués — d'où des alliés immobiles et,")
|
||||
L.append("-- plus grave, un corbeau arcanique qui ne décollait jamais.")
|
||||
L.append('--')
|
||||
L.append("-- Le 11322708 est le vol d'arrivée : c'est l'atteinte de son point 20")
|
||||
L.append("-- qui déclenche l'étape 0 du scénario. Sans lui, rien ne démarre.")
|
||||
L.append('--')
|
||||
L.append("-- move_flag → move_type : la valeur est 1 sur les %d points." % total)
|
||||
L.append("-- Notre énumération donne 0=marche, 1=course, 2=atterrissage,")
|
||||
L.append("-- 3=décollage ; la course correspond. `speed` et `entry` n'ont")
|
||||
L.append("-- aucun équivalent chez nous et sont abandonnées.")
|
||||
L.append('--')
|
||||
for ident, n in sorted(ATTENDU.items()):
|
||||
L.append('-- %d : %2d points' % (ident, n))
|
||||
L.append('-- ' + '=' * 69)
|
||||
L.append('')
|
||||
L.append('DELETE FROM `waypoint_data` WHERE `id` BETWEEN 11322705 AND 11322709;')
|
||||
L.append('')
|
||||
L.append('INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,'
|
||||
'`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES')
|
||||
|
||||
lignes = []
|
||||
for ident in sorted(ATTENDU):
|
||||
for r in sorted(trouves[ident], key=lambda x: int(x['point'])):
|
||||
lignes.append('(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,0)' % (
|
||||
r['id'], r['point'], r['position_x'], r['position_y'], r['position_z'],
|
||||
r['orientation'], r['delay'], r['move_flag'], r['action'], r['action_chance']))
|
||||
|
||||
L.append(',\n'.join(lignes) + ';')
|
||||
|
||||
io.open('/tmp/rivage_1666_chemins.sql', 'w', encoding='utf-8').write('\n'.join(L) + '\n')
|
||||
print('%d points extraits sur %d chemins, controles conformes' % (total, len(ATTENDU)))
|
||||
@@ -0,0 +1,100 @@
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102702;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=97510;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113054;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113055;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=110617;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102706;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113058;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90506;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=94191;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113056;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=110616;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113057;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102696;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113053;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=94190;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=91967;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=94189;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=91970;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=101667;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102701;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113059;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90525;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105176;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105169;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105168;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105171;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105170;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111079;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=90688;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111154;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111089;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=91902;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105166;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105163;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=111165;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111153;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111152;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111149;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111148;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=92558;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105192;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105188;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105190;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105185;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105187;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105186;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105181;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105180;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105182;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105179;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90677;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105203;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90515;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90516;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111167;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111156;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111088;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111087;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105197;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105189;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111173;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111175;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111174;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105183;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105175;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105174;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105165;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105164;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111157;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111155;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111085;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111171;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105206;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105196;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=105167;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105205;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105200;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105199;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=111074;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=105172;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102698;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=92564;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=100621;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=110615;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=110614;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102704;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102703;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=102705;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109591;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113037;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113036;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109604;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109592;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=113038;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=91588;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109587;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=109586;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=93719;
|
||||
UPDATE `creature_template` SET `faction`=2780 WHERE `entry`=90705;
|
||||
UPDATE `creature_template` SET `faction`=1768 WHERE `entry`=101632;
|
||||
@@ -0,0 +1,53 @@
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105176;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105169;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105168;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105171;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105170;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111079;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=90688;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111154;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111089;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=91902;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105166;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105163;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111165;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111153;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111152;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111149;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111148;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=92558;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105192;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105188;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105190;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105185;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105187;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105186;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105181;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105180;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105182;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105179;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111167;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111156;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111088;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111087;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105197;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105189;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111173;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111175;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111174;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105183;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105175;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105174;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105165;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105164;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111157;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111155;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111085;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=111171;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105196;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105167;
|
||||
UPDATE `creature_template` SET `unit_flags`=33555200 WHERE `entry`=113129;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=90544;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=105172;
|
||||
UPDATE `creature_template` SET `unit_flags`=33536 WHERE `entry`=94276;
|
||||
UPDATE `creature_template` SET `unit_flags`=537166592 WHERE `entry`=101632;
|
||||
@@ -0,0 +1,67 @@
|
||||
UPDATE `creature_template` SET `unit_flags2`=2097152 WHERE `entry`=90686;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=97525;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=112920;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2097152 WHERE `entry`=100959;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=97527;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=112977;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=113054;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=113055;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=102706;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=113058;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=97528;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=94191;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=113056;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=113057;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=113053;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=94190;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=94189;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=91970;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=102701;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=113059;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=105217;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=110941;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=94223;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=97502;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=102698;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=91949;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=92122;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=97503;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2097152 WHERE `entry`=92121;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=94209;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=110615;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=97526;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=113290;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=108990;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=112921;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=97521;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=93704;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=110614;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=102704;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=102703;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=102705;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2097152 WHERE `entry`=109591;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=113036;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2097152 WHERE `entry`=109604;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2097152 WHERE `entry`=109592;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099201 WHERE `entry`=113291;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2131968 WHERE `entry`=113038;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90711;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90712;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90708;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2131968 WHERE `entry`=91588;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2131968 WHERE `entry`=109587;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=91353;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=97486;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=92586;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2113536 WHERE `entry`=92061;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2131968 WHERE `entry`=109586;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=101056;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90714;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=93219;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90710;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=97496;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=101057;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90717;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90705;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90713;
|
||||
UPDATE `creature_template` SET `unit_flags2`=2099200 WHERE `entry`=90709;
|
||||
@@ -20,6 +20,14 @@ target_compile_definitions(trinity-compile-option-interface
|
||||
INTERFACE
|
||||
-DHAVE_SSE2
|
||||
-D__SSE2__)
|
||||
|
||||
# Player-facing module messages are stored in the repository as UTF-8.
|
||||
# Keep their byte representation deterministic even when the build host uses
|
||||
# a different system locale.
|
||||
target_compile_options(trinity-compile-option-interface
|
||||
INTERFACE
|
||||
-finput-charset=UTF-8
|
||||
-fexec-charset=UTF-8)
|
||||
message(STATUS "GCC: SFMT enabled, SSE2 flags forced")
|
||||
|
||||
if( WITH_WARNINGS )
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
name: sylvania-core
|
||||
|
||||
x-core: &core
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
BUILD_JOBS: ${BUILD_JOBS:-2}
|
||||
BUILD_TYPE: ${BUILD_TYPE:-Release}
|
||||
image: sylvania-core:${IMAGE_TAG:-local}
|
||||
working_dir: /opt/sylvania/bin
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
database:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
DB_HOST: database
|
||||
DB_PORT: 3306
|
||||
DB_USER: ${DB_USER:-sylvania}
|
||||
DB_PASSWORD: ${DB_PASSWORD:-sylvania}
|
||||
REALM_NAME: ${REALM_NAME:-Sylvania Solo}
|
||||
REALM_ADDRESS: ${REALM_ADDRESS:-127.0.0.1}
|
||||
REALM_PORT: ${REALM_PORT:-8086}
|
||||
DBC_LOCALE: ${DBC_LOCALE:-8}
|
||||
volumes:
|
||||
- ./data:/opt/sylvania/data:ro
|
||||
- ./sql:/src/sql:ro
|
||||
- sylvania-logs:/opt/sylvania/logs
|
||||
|
||||
services:
|
||||
database:
|
||||
image: mariadb:11.4
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-change-me}
|
||||
DB_USER: ${DB_USER:-sylvania}
|
||||
DB_PASSWORD: ${DB_PASSWORD:-sylvania}
|
||||
volumes:
|
||||
- database-data:/var/lib/mysql
|
||||
- ./docker/database/init.sh:/docker-entrypoint-initdb.d/00-sylvania-init.sh:ro
|
||||
- ./sql/base:/sylvania/base:ro
|
||||
- ./docker/db-dumps:/sylvania/dumps:ro
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "healthcheck.sh --connect --innodb_initialized"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
start_period: 30s
|
||||
|
||||
bnetserver:
|
||||
<<: *core
|
||||
command: ["bnetserver"]
|
||||
environment:
|
||||
DB_HOST: database
|
||||
DB_PORT: 3306
|
||||
DB_USER: ${DB_USER:-sylvania}
|
||||
DB_PASSWORD: ${DB_PASSWORD:-sylvania}
|
||||
REALM_NAME: ${REALM_NAME:-Sylvania Solo}
|
||||
REALM_ADDRESS: ${REALM_ADDRESS:-127.0.0.1}
|
||||
REALM_PORT: ${REALM_PORT:-8086}
|
||||
DBC_LOCALE: ${DBC_LOCALE:-8}
|
||||
EXTERNAL_ADDRESS: ${EXTERNAL_ADDRESS:-127.0.0.1}
|
||||
ports:
|
||||
- "1119:1119"
|
||||
- "8081:8081"
|
||||
|
||||
worldserver:
|
||||
<<: *core
|
||||
command: ["worldserver"]
|
||||
stdin_open: true
|
||||
tty: true
|
||||
ports:
|
||||
- "${REALM_PORT:-8086}:8085"
|
||||
|
||||
volumes:
|
||||
database-data:
|
||||
sylvania-logs:
|
||||
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
db_user="${DB_USER:-sylvania}"
|
||||
db_password="${DB_PASSWORD:-sylvania}"
|
||||
|
||||
# Identifiers are deliberately fixed; only the application login is configurable.
|
||||
mariadb --default-character-set=utf8mb4 --protocol=socket -uroot -p"${MARIADB_ROOT_PASSWORD}" <<SQL
|
||||
CREATE DATABASE IF NOT EXISTS auth CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||
CREATE DATABASE IF NOT EXISTS characters CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||
CREATE DATABASE IF NOT EXISTS world CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||
CREATE DATABASE IF NOT EXISTS hotfixes CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||
CREATE DATABASE IF NOT EXISTS shop CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||
CREATE USER IF NOT EXISTS '${db_user}'@'%' IDENTIFIED BY '${db_password}';
|
||||
GRANT ALL PRIVILEGES ON auth.* TO '${db_user}'@'%';
|
||||
GRANT ALL PRIVILEGES ON characters.* TO '${db_user}'@'%';
|
||||
GRANT ALL PRIVILEGES ON world.* TO '${db_user}'@'%';
|
||||
GRANT ALL PRIVILEGES ON hotfixes.* TO '${db_user}'@'%';
|
||||
GRANT ALL PRIVILEGES ON shop.* TO '${db_user}'@'%';
|
||||
FLUSH PRIVILEGES;
|
||||
SQL
|
||||
|
||||
mariadb --default-character-set=utf8mb4 --protocol=socket -uroot -p"${MARIADB_ROOT_PASSWORD}" auth < /sylvania/base/auth_database.sql
|
||||
mariadb --default-character-set=utf8mb4 --protocol=socket -uroot -p"${MARIADB_ROOT_PASSWORD}" characters < /sylvania/base/characters_database.sql
|
||||
mariadb --default-character-set=utf8mb4 --protocol=socket -uroot -p"${MARIADB_ROOT_PASSWORD}" shop < /sylvania/base/shop_database.sql
|
||||
|
||||
shopt -s nullglob
|
||||
for dump in /sylvania/dumps/*.sql /sylvania/dumps/*.sql.gz; do
|
||||
echo "Importing game database dump: ${dump}"
|
||||
if [[ "${dump}" == *.gz ]]; then
|
||||
gzip -dc "${dump}" | mariadb --default-character-set=utf8mb4 --protocol=socket -uroot -p"${MARIADB_ROOT_PASSWORD}"
|
||||
else
|
||||
mariadb --default-character-set=utf8mb4 --protocol=socket -uroot -p"${MARIADB_ROOT_PASSWORD}" < "${dump}"
|
||||
fi
|
||||
done
|
||||
|
||||
# The published 7.3.5 dump uses a lowercase name, while the core queries this
|
||||
# one legacy table with its historical mixed-case identifier on Linux.
|
||||
mariadb --default-character-set=utf8mb4 --protocol=socket -uroot -p"${MARIADB_ROOT_PASSWORD}" \
|
||||
-e 'RENAME TABLE hotfixes.questv2clitask TO hotfixes.QuestV2CliTask;'
|
||||
@@ -0,0 +1,13 @@
|
||||
# Full game database dumps
|
||||
|
||||
Put the upstream `world` and `hotfixes` dumps here before the first
|
||||
`docker compose up`. Both plain `.sql` and `.sql.gz` files are imported.
|
||||
|
||||
The repository intentionally does not ship those datasets. Do not use
|
||||
`sql/base/dev`: those files contain empty developer schemas and are not a
|
||||
playable game database.
|
||||
|
||||
If the database volume has already been initialized, add the dumps manually or
|
||||
recreate the volume explicitly with `docker compose down -v` (this deletes all
|
||||
database data).
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
server="${1:-worldserver}"
|
||||
case "${server}" in
|
||||
worldserver|bnetserver) ;;
|
||||
*) exec "$@" ;;
|
||||
esac
|
||||
|
||||
db_host="${DB_HOST:-database}"
|
||||
db_port="${DB_PORT:-3306}"
|
||||
db_user="${DB_USER:-sylvania}"
|
||||
db_password="${DB_PASSWORD:-sylvania}"
|
||||
external_address="${EXTERNAL_ADDRESS:-127.0.0.1}"
|
||||
realm_name="${REALM_NAME:-Sylvania Solo}"
|
||||
realm_address="${REALM_ADDRESS:-127.0.0.1}"
|
||||
realm_port="${REALM_PORT:-8086}"
|
||||
dbc_locale="${DBC_LOCALE:-8}"
|
||||
|
||||
if [[ ! "${realm_name}" =~ ^[[:alnum:]А-Яа-яЁё._[:space:]-]{1,32}$ ]]; then
|
||||
echo "REALM_NAME contains unsupported characters or is longer than 32 characters" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! "${realm_address}" =~ ^[A-Za-z0-9.-]+$ ]]; then
|
||||
echo "REALM_ADDRESS must be an IPv4 address or a DNS name" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! "${realm_port}" =~ ^[0-9]+$ ]] || (( realm_port < 1 || realm_port > 65535 )); then
|
||||
echo "REALM_PORT must be an integer between 1 and 65535" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! "${dbc_locale}" =~ ^[0-9]+$ ]] || (( dbc_locale > 11 || dbc_locale == 9 )); then
|
||||
echo "DBC_LOCALE must be a valid locale index (ruRU is 8)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
config_dir=/opt/sylvania/etc
|
||||
template="${config_dir}/${server}.conf.dist"
|
||||
config="${config_dir}/${server}.conf"
|
||||
|
||||
cp "${template}" "${config}"
|
||||
sed -i -E \
|
||||
-e "s#^(LoginDatabaseInfo[[:space:]]*=).*#\\1 \"${db_host};${db_port};${db_user};${db_password};auth\"#" \
|
||||
"${config}"
|
||||
|
||||
# Keep the client-facing realm record in sync after restores and migrations.
|
||||
# Values are validated above before being interpolated into SQL.
|
||||
mariadb --default-character-set=utf8mb4 --protocol=tcp \
|
||||
-h "${db_host}" -P "${db_port}" -u "${db_user}" "-p${db_password}" auth <<SQL
|
||||
INSERT INTO realmlist
|
||||
(id, name, address, localAddress, localSubnetMask, port, icon, flag,
|
||||
timezone, allowedSecurityLevel, population, gamebuild, Region, Battlegroup)
|
||||
VALUES
|
||||
(1, '${realm_name}', '${realm_address}', '${realm_address}',
|
||||
'255.255.255.0', ${realm_port}, 0, 0, 1, 0, 0, 26972, 1, 1)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
name = VALUES(name),
|
||||
address = VALUES(address),
|
||||
localAddress = VALUES(localAddress),
|
||||
port = VALUES(port),
|
||||
gamebuild = VALUES(gamebuild);
|
||||
SQL
|
||||
|
||||
if [[ "${server}" == worldserver ]]; then
|
||||
sed -i -E \
|
||||
-e "s#^(WorldDatabaseInfo[[:space:]]*=).*#\\1 \"${db_host};${db_port};${db_user};${db_password};world\"#" \
|
||||
-e "s#^(CharacterDatabaseInfo[[:space:]]*=).*#\\1 \"${db_host};${db_port};${db_user};${db_password};characters\"#" \
|
||||
-e "s#^(HotfixDatabaseInfo[[:space:]]*=).*#\\1 \"${db_host};${db_port};${db_user};${db_password};hotfixes\"#" \
|
||||
-e "s#^(ShopDatabaseInfo[[:space:]]*=).*#\\1 \"${db_host};${db_port};${db_user};${db_password};shop\"#" \
|
||||
-e 's#^DataDir[[:space:]]*=.*#DataDir = "/opt/sylvania/data"#' \
|
||||
-e "s#^DBC.Locale[[:space:]]*=.*#DBC.Locale = ${dbc_locale}#" \
|
||||
-e 's#^LogsDir[[:space:]]*=.*#LogsDir = "/opt/sylvania/logs"#' \
|
||||
"${config}"
|
||||
else
|
||||
sed -i -E \
|
||||
-e "s#^LoginREST.ExternalAddress=.*#LoginREST.ExternalAddress=${external_address}#" \
|
||||
-e "s#^LoginREST.LocalAddress=.*#LoginREST.LocalAddress=${external_address}#" \
|
||||
-e 's#^LogsDir[[:space:]]*=.*#LogsDir = "/opt/sylvania/logs"#' \
|
||||
"${config}"
|
||||
fi
|
||||
|
||||
exec "/opt/sylvania/bin/${server}" -c "${config}"
|
||||
@@ -0,0 +1,26 @@
|
||||
-- =====================================================================
|
||||
-- Aubergiste du port de Hurlevent — phase manquante
|
||||
--
|
||||
-- Spawn cree en jeu par `.npc add 6727` (Innkeeper Brianna) a
|
||||
-- (-8296.06, 1388.89, 4.95), aire 4411 « Port de Hurlevent ».
|
||||
--
|
||||
-- La commande a enregistre la ligne SANS phase, alors que `phase_area`
|
||||
-- place tout joueur de cette aire en 6666 « Pre-Broken Shore Stormwind
|
||||
-- Harbor » (et 13306 pour la rampe). PhaseShift::CanSee exigeant une
|
||||
-- intersection, la creature etait invisible a tout joueur normal, et
|
||||
-- visible en mode MJ seulement -- SetAlwaysVisible court-circuitant le
|
||||
-- test de phase.
|
||||
--
|
||||
-- La cause est corrigee dans le core (cs_npc.cpp) : les prochains
|
||||
-- `.npc add` conserveront la phase. Cette ligne repare le spawn deja
|
||||
-- pose, pour ne pas avoir a le recreer.
|
||||
--
|
||||
-- 6666 et non 13306 : l'aubergiste est sur le quai, pas sur la rampe,
|
||||
-- et c'est la phase que portent les 371 autres creatures de cette aire.
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `creature`
|
||||
SET `PhaseId` = 6666
|
||||
WHERE `guid` = 290200759
|
||||
AND `id` = 6727
|
||||
AND `PhaseId` = 0;
|
||||
@@ -0,0 +1,123 @@
|
||||
-- =====================================================================
|
||||
-- Mascottes de combat : « On The Mend » / soin chez le maitre d'ecurie
|
||||
-- Signalement Discord : Murog (Orgrimmar) ouvre directement la boutique
|
||||
-- au lieu du dialogue, la quete 31589 est donc impossible a valider.
|
||||
--
|
||||
-- Cause : les maitres d'ecurie n'exposent pas (ou n'implementent pas)
|
||||
-- l'option de gossip « I'd like to heal and revive my battle pets. ».
|
||||
-- * Murog (47764) et Jaelysia (10085) n'ont aucun gossip_menu_id :
|
||||
-- ils retombent sur le menu 0 par defaut, dont la seule option
|
||||
-- compatible pour un non-chasseur est « vendeur » -> le client 7.3.5
|
||||
-- selectionne automatiquement l'unique option et ouvre la boutique.
|
||||
-- * Le menu 9821 (menu standard des maitres d'ecurie) a perdu ses
|
||||
-- options « vendeur » et « ecurie » : seule l'option de soin restait.
|
||||
-- * Seuls 2 maitres d'ecurie sur 12 avaient le SmartAI qui soigne les
|
||||
-- mascottes et donne le credit de quete.
|
||||
-- * Le credit de Jenova Stoneshield (Hurlevent) pointait sur le credit
|
||||
-- d'Elwynn (64320) au lieu de celui de Hurlevent (65214).
|
||||
--
|
||||
-- Applique le 2026-09-10. Rollback : battlepet_stablemaster_heal_ROLLBACK.sql
|
||||
-- =====================================================================
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 1. Menu 9821 : restaurer les options vendeur et ecurie
|
||||
-- (l'option 2 « heal and revive my battle pets » existe deja)
|
||||
-- ---------------------------------------------------------------------
|
||||
DELETE FROM `gossip_menu_option` WHERE `MenuId`=9821 AND `OptionIndex` IN (0,4);
|
||||
INSERT INTO `gossip_menu_option`
|
||||
(`MenuId`,`OptionIndex`,`OptionIcon`,`OptionText`,`OptionBroadcastTextId`,`OptionType`,`OptionNpcFlag`,`VerifiedBuild`) VALUES
|
||||
(9821, 0, 0, 'I\'d like to stable my pet here.', 8912, 14, 4194304, 0),
|
||||
(9821, 4, 1, 'I want to browse your goods.', 3370, 3, 128, 0);
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 2. Menu 12106 (Bezzil, maitre d'ecurie gobelin) : meme jeu d'options
|
||||
-- ---------------------------------------------------------------------
|
||||
UPDATE `gossip_menu_option` SET `OptionType`=14, `OptionNpcFlag`=4194304
|
||||
WHERE `MenuId`=12106 AND `OptionIndex`=0;
|
||||
DELETE FROM `gossip_menu_option` WHERE `MenuId`=12106 AND `OptionIndex` IN (2,3);
|
||||
INSERT INTO `gossip_menu_option`
|
||||
(`MenuId`,`OptionIndex`,`OptionIcon`,`OptionText`,`OptionBroadcastTextId`,`OptionType`,`OptionNpcFlag`,`VerifiedBuild`) VALUES
|
||||
(12106, 2, 0, 'I\'d like to heal and revive my battle pets.', 64115, 1, 1, 0),
|
||||
(12106, 3, 1, 'I want to browse your goods.', 3370, 3, 128, 0);
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 3. PNJ mal configures
|
||||
-- ---------------------------------------------------------------------
|
||||
-- Murog (Orgrimmar) et Jaelysia (Sombrivage) : aucun menu de gossip
|
||||
UPDATE `creature_template` SET `gossip_menu_id`=9821 WHERE `entry` IN (47764,10085);
|
||||
-- Seriadne (Teldrassil) : npcflag ampute de GOSSIP et STABLEMASTER
|
||||
UPDATE `creature_template` SET `npcflag`=`npcflag`|4194305 WHERE `entry`=10051;
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 4. SmartAI : soigner + ressusciter les mascottes et donner le credit
|
||||
-- ---------------------------------------------------------------------
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI'
|
||||
WHERE `entry` IN (6749,9980,9987,10050,10051,10085,16185,17485,45789,47764);
|
||||
|
||||
-- Correction du credit de Jenova Stoneshield : Hurlevent (65214), pas Elwynn
|
||||
UPDATE `smart_scripts` SET `action_param1`=65214, `comment`='Stable Master - Link - Quest Credit 31592'
|
||||
WHERE `source_type`=0 AND `entryorguid`=11069 AND `id`=2;
|
||||
|
||||
DELETE FROM `smart_scripts`
|
||||
WHERE `source_type`=0 AND `entryorguid` IN (6749,9980,9987,10050,10051,10085,16185,17485,45789,47764);
|
||||
INSERT INTO `smart_scripts`
|
||||
(`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,
|
||||
`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`event_param_string`,
|
||||
`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,
|
||||
`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
|
||||
-- Erma (Foret d'Elwynn) - quete 31309
|
||||
( 6749,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Erma - Gossip Select - Cast Heal Battle Pets'),
|
||||
( 6749,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Erma - Link - Cast Revive Battle Pets'),
|
||||
( 6749,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 64320,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Erma - Link - Quest Credit 31309'),
|
||||
( 6749,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Erma - Link - Close Gossip'),
|
||||
-- Shelby Stoneflint (Dun Morogh) - quete 31549
|
||||
( 9980,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Shelby Stoneflint - Gossip Select - Cast Heal Battle Pets'),
|
||||
( 9980,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Shelby Stoneflint - Link - Cast Revive Battle Pets'),
|
||||
( 9980,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65020,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Shelby Stoneflint - Link - Quest Credit 31549'),
|
||||
( 9980,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Shelby Stoneflint - Link - Close Gossip'),
|
||||
-- Shoja'my (Durotar) - quete 31572
|
||||
( 9987,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Shoja\'my - Gossip Select - Cast Heal Battle Pets'),
|
||||
( 9987,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Shoja\'my - Link - Cast Revive Battle Pets'),
|
||||
( 9987,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65180,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Shoja\'my - Link - Quest Credit 31572'),
|
||||
( 9987,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Shoja\'my - Link - Close Gossip'),
|
||||
-- Seikwa (Mulgore) - quete 31574
|
||||
(10050,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Seikwa - Gossip Select - Cast Heal Battle Pets'),
|
||||
(10050,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Seikwa - Link - Cast Revive Battle Pets'),
|
||||
(10050,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65184,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Seikwa - Link - Quest Credit 31574'),
|
||||
(10050,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Seikwa - Link - Close Gossip'),
|
||||
-- Seriadne (Teldrassil) - quetes 31553 / 31554
|
||||
(10051,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Seriadne - Gossip Select - Cast Heal Battle Pets'),
|
||||
(10051,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Seriadne - Link - Cast Revive Battle Pets'),
|
||||
(10051,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65041,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Seriadne - Link - Quest Credit 31553/31554'),
|
||||
(10051,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Seriadne - Link - Close Gossip'),
|
||||
-- Jaelysia (Sombrivage) - quete 31583
|
||||
(10085,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Jaelysia - Gossip Select - Cast Heal Battle Pets'),
|
||||
(10085,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Jaelysia - Link - Cast Revive Battle Pets'),
|
||||
(10085,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65199,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Jaelysia - Link - Quest Credit 31583'),
|
||||
(10085,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Jaelysia - Link - Close Gossip'),
|
||||
-- Anathos (Bois des Chants eternels) - quete 31580
|
||||
(16185,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Anathos - Gossip Select - Cast Heal Battle Pets'),
|
||||
(16185,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Anathos - Link - Cast Revive Battle Pets'),
|
||||
(16185,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65198,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Anathos - Link - Quest Credit 31580'),
|
||||
(16185,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Anathos - Link - Close Gossip'),
|
||||
-- Esbina (Azuremyst) - quete 31568
|
||||
(17485,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Esbina - Gossip Select - Cast Heal Battle Pets'),
|
||||
(17485,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Esbina - Link - Cast Revive Battle Pets'),
|
||||
(17485,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65179,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Esbina - Link - Quest Credit 31568'),
|
||||
(17485,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Esbina - Link - Close Gossip'),
|
||||
-- Bezzil (Orgrimmar, gobelins) - quete 31586 - menu 12106
|
||||
(45789,0,0,1,62,0,100,0,12106,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Bezzil - Gossip Select - Cast Heal Battle Pets'),
|
||||
(45789,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Bezzil - Link - Cast Revive Battle Pets'),
|
||||
(45789,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65200,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Bezzil - Link - Quest Credit 31586'),
|
||||
(45789,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Bezzil - Link - Close Gossip'),
|
||||
-- Murog (Orgrimmar) - quete 31589 - le bug signale
|
||||
(47764,0,0,1,62,0,100,0, 9821,2,0,0,0,'', 85,125801,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Murog - Gossip Select - Cast Heal Battle Pets'),
|
||||
(47764,0,1,2,61,0,100,0, 0,0,0,0,0,'', 85,133994,2,0,0,0,0, 7,0,0,0,0,0,0,0,'Murog - Link - Cast Revive Battle Pets'),
|
||||
(47764,0,2,3,61,0,100,0, 0,0,0,0,0,'', 33, 65212,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Murog - Link - Quest Credit 31589'),
|
||||
(47764,0,3,0,61,0,100,0, 0,0,0,0,0,'', 72, 0,0,0,0,0,0, 7,0,0,0,0,0,0,0,'Murog - Link - Close Gossip');
|
||||
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 5. Menu 12106 : brancher les textes diffuses pour avoir la VF
|
||||
-- ---------------------------------------------------------------------
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextId`= 8912 WHERE `MenuId`=12106 AND `OptionIndex`=0;
|
||||
UPDATE `gossip_menu_option` SET `OptionBroadcastTextId`=56613 WHERE `MenuId`=12106 AND `OptionIndex`=1;
|
||||
@@ -0,0 +1,14 @@
|
||||
-- Rollback de battlepet_stablemaster_heal.sql (2026-09-10)
|
||||
DELETE FROM `gossip_menu_option` WHERE `MenuId`=9821 AND `OptionIndex` IN (0,4);
|
||||
DELETE FROM `gossip_menu_option` WHERE `MenuId`=12106 AND `OptionIndex` IN (2,3);
|
||||
UPDATE `gossip_menu_option` SET `OptionType`=1, `OptionNpcFlag`=1 WHERE `MenuId`=12106 AND `OptionIndex`=0;
|
||||
|
||||
UPDATE `creature_template` SET `gossip_menu_id`=0 WHERE `entry` IN (47764,10085);
|
||||
UPDATE `creature_template` SET `npcflag`=130 WHERE `entry`=10051;
|
||||
UPDATE `creature_template` SET `AIName`=''
|
||||
WHERE `entry` IN (6749,9980,9987,10050,10051,10085,16185,17485,45789,47764);
|
||||
|
||||
DELETE FROM `smart_scripts`
|
||||
WHERE `source_type`=0 AND `entryorguid` IN (6749,9980,9987,10050,10051,10085,16185,17485,45789,47764);
|
||||
UPDATE `smart_scripts` SET `action_param1`=64320, `comment`='Stable Master - Link - Quest Credit 31309'
|
||||
WHERE `source_type`=0 AND `entryorguid`=11069 AND `id`=2;
|
||||
@@ -0,0 +1,40 @@
|
||||
-- =====================================================================
|
||||
-- OPTIONNEL (non applique le 2026-09-10) - a valider avant execution.
|
||||
--
|
||||
-- Complement de battlepet_stablemaster_heal.sql : rend l'option
|
||||
-- « J'aimerais soigner et ressusciter mes mascottes de combat » reellement
|
||||
-- fonctionnelle chez TOUS les maitres d'ecurie du menu 9821, et pas
|
||||
-- seulement chez les 12 PNJ concernes par la quete « On The Mend ».
|
||||
--
|
||||
-- Sans ce complement, ~89 maitres d'ecurie affichent l'option mais ne
|
||||
-- font rien quand on la choisit (bug present avant le correctif).
|
||||
--
|
||||
-- Portee : uniquement les PNJ qui ont deja le drapeau STABLEMASTER, le
|
||||
-- menu 9821, et AUCUNE IA (AIName et ScriptName vides) - donc aucun
|
||||
-- script existant n'est ecrase. Trois maitres d'ecurie deja en SmartAI
|
||||
-- (Wesley 9978, Maluressian 10052, Thomas Partridge 33854) sont exclus :
|
||||
-- il faudrait leur ajouter les lignes avec des `id` libres.
|
||||
-- =====================================================================
|
||||
|
||||
CREATE TEMPORARY TABLE `_sm_heal` AS
|
||||
SELECT `entry` FROM `creature_template`
|
||||
WHERE `gossip_menu_id`=9821 AND `npcflag` & 4194304
|
||||
AND `AIName`='' AND `ScriptName`='';
|
||||
|
||||
UPDATE `creature_template` SET `AIName`='SmartAI'
|
||||
WHERE `entry` IN (SELECT `entry` FROM `_sm_heal`);
|
||||
|
||||
DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (SELECT `entry` FROM `_sm_heal`);
|
||||
|
||||
INSERT INTO `smart_scripts`
|
||||
(`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,
|
||||
`event_param1`,`event_param2`,`event_param3`,`event_param4`,`event_param5`,`event_param_string`,
|
||||
`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,
|
||||
`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`)
|
||||
SELECT `entry`,0,0,1,62,0,100,0,9821,2,0,0,0,'',85,125801,2,0,0,0,0,7,0,0,0,0,0,0,0,'Stable Master - Gossip Select - Cast Heal Battle Pets' FROM `_sm_heal`
|
||||
UNION ALL
|
||||
SELECT `entry`,0,1,2,61,0,100,0, 0,0,0,0,0,'',85,133994,2,0,0,0,0,7,0,0,0,0,0,0,0,'Stable Master - Link - Cast Revive Battle Pets' FROM `_sm_heal`
|
||||
UNION ALL
|
||||
SELECT `entry`,0,2,0,61,0,100,0, 0,0,0,0,0,'',72, 0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Stable Master - Link - Close Gossip' FROM `_sm_heal`;
|
||||
|
||||
DROP TEMPORARY TABLE `_sm_heal`;
|
||||
@@ -0,0 +1,91 @@
|
||||
-- =====================================================================
|
||||
-- Butin des donjons et raids WoD / Legion
|
||||
--
|
||||
-- Signalement Discord : « les instances HL ne loot pas de stuff ».
|
||||
-- Cause : sur ce core, le butin d'equipement des boss modernes ne vient
|
||||
-- PAS de `creature_loot_template` mais du Guide d'aventure de Blizzard :
|
||||
-- `Unit::Kill` lit `creature_template_journal` (entree -> JournalEncounterID)
|
||||
-- puis tire 2 objets au hasard dans JournalEncounterItem.db2, avec le
|
||||
-- masque de difficulte et le contexte d'objet corrects.
|
||||
-- Or `creature_template_journal` ne contenait que 45 lignes, toutes
|
||||
-- Burning Crusade : aucun boss de Draenor ni de Legion n'y figurait,
|
||||
-- et ces boss ont `lootid = 0` -> ils ne lachaient rigoureusement rien.
|
||||
--
|
||||
-- Correspondances etablies a partir des DB2 officiels du client :
|
||||
-- JournalInstance (MapID) -> JournalEncounter -> JournalEncounterCreature
|
||||
-- (CreatureDisplayInfoID) -> creature_template.modelid1..4
|
||||
-- Une seule creature par rencontre (celle qui la conclut), et uniquement
|
||||
-- celles qui n'ont aucune table de butin, pour ne rien doubler.
|
||||
--
|
||||
-- Applique le 2026-09-10.
|
||||
-- =====================================================================
|
||||
|
||||
DELETE FROM `creature_template_journal` WHERE `entry` IN (
|
||||
74366,81297,80816,83612,87420,76865,76814,76906,76806,76974,76877,77692,77182,77557,
|
||||
75964,76141,76143,82682,84550,83846,76413,76021,77120,76585,91005,94960,95674,96759,
|
||||
102682,104154,106643,116407,115767,116691,118462,117269,118518,122316,122313,122056,
|
||||
124729,98965,79852,79912);
|
||||
|
||||
INSERT INTO `creature_template_journal` (`entry`,`JournalEncounterID`) VALUES
|
||||
-- Mines de Sangyre (1175)
|
||||
(74366, 893), -- Forgemaster Gog'duh
|
||||
-- Docks de fer (1195)
|
||||
(81297, 1235), -- Dreadfang (Fleshrender Nok'gar)
|
||||
(80816, 1236), -- Ahri'ok Dugru (Contremaitres du Rail-de-fer)
|
||||
(79852, 1237), -- Oshir
|
||||
(83612, 1238), -- Skulloc
|
||||
-- Auchindoun (1182) : PAS de ligne pour Azzakel. Le vrai boss (75927,
|
||||
-- niveau 97, script boss_azzakel, 49 lignes de butin) n'est PAS apparu ;
|
||||
-- le PNJ pose dans le donjon est un doublon de niveau 1 sans script.
|
||||
-- C'est un defaut d'apparition, pas de butin : a corriger separement.
|
||||
-- Aire de Haut-perchoir (1209)
|
||||
(75964, 965), -- Ranjit
|
||||
(76141, 966), -- Araknath
|
||||
(76143, 967), -- Rukhran
|
||||
-- Floraison eternelle (1279)
|
||||
(82682, 1208), -- Archmage Sol
|
||||
(84550, 1209), -- Xeri'tac
|
||||
(83846, 1210), -- Yalnu
|
||||
-- Pic Rochenoire, sommet (1358)
|
||||
(76413, 1226), -- Orebender Gor'ashan
|
||||
(76021, 1227), -- Kyrak
|
||||
(79912, 1228), -- Commander Tharbek
|
||||
(76585, 1229), -- Ragewing the Untamed
|
||||
(77120, 1234), -- Warlord Zaela
|
||||
-- Fonderie des Rochenoire (1205) - raid entier sans butin
|
||||
(77182, 1202), -- Oregorger
|
||||
(76974, 1155), -- Franzok (Hans'gar et Franzok)
|
||||
(76865, 1122), -- Beastlord Darmac
|
||||
(76877, 1161), -- Gruul
|
||||
(76814, 1123), -- Flamebender Ka'graz
|
||||
(76906, 1147), -- Operator Thogar
|
||||
(76806, 1154), -- Heart of the Mountain (Haut fourneau)
|
||||
(77692, 1162), -- Kromog
|
||||
(77557, 1203), -- Admiral Gar'an (Vierges de fer)
|
||||
(87420, 959), -- Blackhand
|
||||
-- Repaire de Neltharion (1458)
|
||||
(91005, 1673), -- Naraxas
|
||||
-- Salles des Valeureux (1477)
|
||||
(94960, 1485), -- Hymdall
|
||||
(95674, 1487), -- Fenryr
|
||||
-- Gouffre des ames (1492)
|
||||
(96759, 1663), -- Helya
|
||||
-- Donjon de Tenebreterre (1501)
|
||||
(98965, 1672), -- Kur'talos Ravencrest
|
||||
-- Cauchemar d'emeraude (1520)
|
||||
(102682, 1704), -- Lethon (Dragons du Cauchemar)
|
||||
-- Nighthold (1530)
|
||||
(104154, 1737), -- Gul'dan
|
||||
(106643, 1743), -- Grande magistrix Elisande
|
||||
-- Tombeau de Sargeras (1676)
|
||||
(116407, 1856), -- Harjatan
|
||||
(115767, 1861), -- Mistress Sassz'ine
|
||||
(116691, 1867), -- Belac (Inquisition demoniaque)
|
||||
(118518, 1903), -- Priestess Lunaspyre (Soeurs de la Lune)
|
||||
(118462, 1896), -- Soul Queen Dejahna (Hote desole)
|
||||
(117269, 1898), -- Kil'jaeden
|
||||
-- Siege du Triumvirat (1753) - donjon entier sans butin
|
||||
(122313, 1979), -- Zuraal the Ascended
|
||||
(122316, 1980), -- Saprish
|
||||
(122056, 1981), -- Viceroy Nezhar
|
||||
(124729, 1982); -- L'ura
|
||||
@@ -0,0 +1,6 @@
|
||||
-- Rollback de butin_journal_wod_legion.sql (2026-09-10)
|
||||
DELETE FROM `creature_template_journal` WHERE `entry` IN (
|
||||
74366,81297,80816,83612,87420,76865,76814,76906,76806,76974,76877,77692,77182,77557,
|
||||
75964,76141,76143,82682,84550,83846,76413,76021,77120,76585,91005,94960,95674,96759,
|
||||
102682,104154,106643,116407,115767,116691,118462,117269,118518,122316,122313,122056,
|
||||
124729,98965,79852,79912);
|
||||
@@ -0,0 +1,42 @@
|
||||
-- =====================================================================
|
||||
-- Options de dialogue mortes qui doublonnent une option fonctionnelle
|
||||
--
|
||||
-- Une ligne de type 1 (bavardage) est affichee sans aucune verification
|
||||
-- par Player::PrepareGossipMenu (« no checks »), mais sa selection ne
|
||||
-- declenche aucune action. Lorsqu'une telle ligne porte le MEME texte
|
||||
-- qu'une option reellement fonctionnelle du meme menu -- aubergiste (8),
|
||||
-- marchand (3), transmogrification (16) -- le joueur voit la ligne en
|
||||
-- double et celle du haut ne fait rien.
|
||||
--
|
||||
-- PREMIERE VERSION ERRONEE, CORRIGEE ICI
|
||||
-- La version precedente supprimait aussi huit options portant des
|
||||
-- CONDITIONS : evenement 12 (Halloween) actif et absence de l'aura
|
||||
-- 24755 « Tricked or Treated ». C'etait l'option « Des bonbons ou un
|
||||
-- sort ! », que la base habille du meme texte que l'option d'auberge.
|
||||
-- Hors periode d'Halloween elle n'est jamais affichee : la supprimer
|
||||
-- ne corrigeait rien et retirait du contenu saisonnier.
|
||||
--
|
||||
-- D'ou la clause NOT EXISTS : toute option soumise a une condition est
|
||||
-- desormais preservee, sans avoir a juger de la condition elle-meme.
|
||||
--
|
||||
-- CE CORRECTIF NE RESOUT PAS le probleme de liaison de pierre de foyer
|
||||
-- signale en jeu : le menu 342 fait partie des huit cas conditionnes,
|
||||
-- son option morte n'etait donc pas affichee. La cause reste a trouver.
|
||||
-- Il est conserve parce qu'il corrige un vrai defaut d'affichage
|
||||
-- ailleurs, pas parce qu'il repond au symptome signale.
|
||||
--
|
||||
-- Retour arriere : chantiers/gossip_menu_option_retour_20260831.sql
|
||||
-- =====================================================================
|
||||
|
||||
DELETE g1
|
||||
FROM `gossip_menu_option` g1
|
||||
JOIN `gossip_menu_option` g2
|
||||
ON g2.`MenuId` = g1.`MenuId`
|
||||
AND g2.`OptionText` = g1.`OptionText`
|
||||
AND g2.`OptionType` IN (3, 8, 16)
|
||||
WHERE g1.`OptionType` = 1
|
||||
AND NOT EXISTS (SELECT 1
|
||||
FROM `conditions` c
|
||||
WHERE c.`SourceTypeOrReferenceId` = 15
|
||||
AND c.`SourceGroup` = g1.`MenuId`
|
||||
AND c.`SourceEntry` = g1.`OptionIndex`);
|
||||
@@ -0,0 +1,37 @@
|
||||
-- =====================================================================
|
||||
-- Salles des Valeureux (carte 1477) : les 3 boss absents
|
||||
--
|
||||
-- Constat du 2026-09-10 : Hymdall, Fenryr et les quatre Rois valarjar
|
||||
-- sont bien posés, mais Hyrja, le Roi-dieu Skovald et Odyn n'existent
|
||||
-- nulle part dans `creature` — donc le donjon s'arrête après Fenryr.
|
||||
-- Leurs modèles, factions, drapeaux, scripts et tables de butin sont
|
||||
-- pourtant tous en base : il ne manquait que les apparitions.
|
||||
--
|
||||
-- Positions : Odyn est repris tel quel du script (boss_odyn.cpp,
|
||||
-- SetHomePosition 2402.76 / 528.64 / 748.99) ; Skovald est placé dans le
|
||||
-- hall d'Odyn, à l'intérieur de la porte 246145 (2520.3 / 529.0 / 749.0)
|
||||
-- dont il commande la fermeture ; Hyrja et ses deux acolytes sont posés
|
||||
-- au-delà de la porte de sa salle (245702, 3196.2 / 371.3 / 655.4), sur
|
||||
-- l'axe d'entrée. La position de Hyrja est la seule estimée : si elle
|
||||
-- flotte ou s'enfonce, corriger le seul Z avec un UPDATE.
|
||||
--
|
||||
-- Odyn a `lootid = 0` : sa ligne de Guide d'aventure est ajoutée ici
|
||||
-- (rencontre 1489, 17 objets officiels). Hyrja et Skovald ont déjà leurs
|
||||
-- tables de butin, on n'y touche pas.
|
||||
-- =====================================================================
|
||||
|
||||
DELETE FROM `creature` WHERE `guid` BETWEEN 290200801 AND 290200805;
|
||||
INSERT INTO `creature`
|
||||
(`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnDifficulties`,`phaseUseFlags`,`PhaseId`,`PhaseGroup`,
|
||||
`terrainSwapMap`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,
|
||||
`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,
|
||||
`npcflag`,`unit_flags`,`unit_flags2`,`unit_flags3`,`dynamicflags`,`ScriptName`,`movementmode`,`VerifiedBuild`) VALUES
|
||||
(290200801, 95833, 1477, 7672, 7672, '1,2,8,23', 0,0,0, -1, 0,0, 3175.00, 350.00, 655.40, 0.79, 7200,0,0,0,0,0, 0,0,0,0,0, '', 0, 0), -- Hyrja
|
||||
(290200802, 97202, 1477, 7672, 7672, '1,2,8,23', 0,0,0, -1, 0,0, 3166.50, 358.50, 655.40, 0.79, 7200,0,0,0,0,0, 0,0,0,0,0, '', 0, 0), -- Olmyr the Enlightened
|
||||
(290200803, 97219, 1477, 7672, 7672, '1,2,8,23', 0,0,0, -1, 0,0, 3183.50, 341.50, 655.40, 0.79, 7200,0,0,0,0,0, 0,0,0,0,0, '', 0, 0), -- Solsten
|
||||
(290200804, 95675, 1477, 7672, 7672, '1,2,8,23', 0,0,0, -1, 0,0, 2500.00, 529.00, 749.00, 0.00, 7200,0,0,0,0,0, 0,0,0,0,0, '', 0, 0), -- God-King Skovald
|
||||
(290200805, 95676, 1477, 7672, 7672, '1,2,8,23', 0,0,0, -1, 0,0, 2402.76, 528.64, 748.99, 0.00, 7200,0,0,0,0,0, 0,0,0,0,0, '', 0, 0); -- Odyn
|
||||
|
||||
-- Odyn n'a aucune table de butin : on le branche sur le Guide d'aventure
|
||||
DELETE FROM `creature_template_journal` WHERE `entry` = 95676;
|
||||
INSERT INTO `creature_template_journal` (`entry`,`JournalEncounterID`) VALUES (95676, 1489);
|
||||
@@ -0,0 +1,3 @@
|
||||
-- Rollback de hov_boss_manquants.sql (2026-09-10)
|
||||
DELETE FROM `creature` WHERE `guid` BETWEEN 290200801 AND 290200805;
|
||||
DELETE FROM `creature_template_journal` WHERE `entry` = 95676;
|
||||
@@ -0,0 +1,18 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé — Krosus était inattaquable
|
||||
--
|
||||
-- SIGNALÉ EN JEU : « le Krosus du lac de lave en p8 est inattaquable ».
|
||||
--
|
||||
-- Il portait la faction 2878. C'est exactement le défaut résolu en août
|
||||
-- pour les autres démons de cette carte : les factions 2780 et 1768 les
|
||||
-- rendaient inattaquables — le refus vient du client, aucune sonde
|
||||
-- serveur ne peut l'observer — et on les avait toutes basculées en 16,
|
||||
-- la seule dont le fonctionnement soit démontré ici. La 2878 n'était
|
||||
-- pas dans le lot, personne n'étant jamais allé aussi loin dans le
|
||||
-- scénario.
|
||||
--
|
||||
-- PORTÉE VÉRIFIÉE : l'entrée 90544 n'existe QUE sur la carte 1460, un
|
||||
-- seul exemplaire. Aucun autre contenu n'est touché.
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `creature_template` SET `faction` = 16 WHERE `entry` = 90544;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,80 @@
|
||||
-- Generated from ChatGPT WoW localisation source.csv.
|
||||
-- Apply to dc_world. Existing frFR rows are not modified.
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
INSERT INTO `creature_text_locale` (`CreatureID`,`GroupID`,`ID`,`Locale`,`Text`) VALUES
|
||||
(92718,0,0,'ruRU','Мне понадобится твоя помощь, чтобы остановить Гул''дана. Освободи остальных Иллидари, поскорее!'),
|
||||
(92980,1,0,'ruRU','Демоны хотят уничтожить наш мир. Мы должны освободить наших союзников.'),
|
||||
(92986,1,0,'ruRU','Объяснения могут подождать. Нужно убить демонов.'),
|
||||
(93011,0,0,'ruRU','Вы слышали лорда Иллидана. Давайте найдем этот краеугольный камень.'),
|
||||
(93011,1,0,'ruRU','С его помощью мы сможем вторгнуться на любую планету Легиона, даже на Аргус.'),
|
||||
(93105,0,0,'ruRU','Мои глаза… Мои глаза!'),
|
||||
(93105,2,0,'ruRU','Довольно! Мой адский колосс тебя раздавит.'),
|
||||
(93117,0,0,'ruRU','Какая боль!'),
|
||||
(93127,0,0,'ruRU','Их главные цели — Паучья крепость, Двигатель душ и Кузница. Слуги Иллидана должны добиться успеха.'),
|
||||
(93127,1,0,'ruRU','Если эти эсминцы не будут уничтожены, мы долго не продержимся!'),
|
||||
(93127,3,0,'ruRU','Я чувствую, как это течет по моим венам. Это преображает мое тело.'),
|
||||
(93127,4,0,'ruRU','Нет… Маннетрель.'),
|
||||
(93221,1,0,'ruRU','Вы не переживёте Адскую Вершину…'),
|
||||
(93759,1,0,'ruRU','Используйте тигель для завершения ритуала.'),
|
||||
(93802,0,0,'ruRU','Придите, дети мои. Насладитесь нашими врагами.'),
|
||||
(93802,2,0,'ruRU','Лорд Саргерас, нет!!!'),
|
||||
(94400,0,0,'ruRU','Я вас всех уничтожу.'),
|
||||
(94400,1,0,'ruRU','Я убью каждого демона на своём пути.'),
|
||||
(95226,1,0,'ruRU','Здесь вы — добыча.'),
|
||||
(95226,3,0,'ruRU','В моей клетке, и даже быстрее.'),
|
||||
(96277,0,0,'ruRU','Я тебя расчленю.'),
|
||||
(96279,1,0,'ruRU','В моей клетке, и даже быстрее.'),
|
||||
(96279,2,0,'ruRU','Так сильно они жаждут попасть в рабство.'),
|
||||
(96402,1,0,'ruRU','Умри в славе битвы!'),
|
||||
(96420,0,0,'ruRU','Нас в десять раз больше. Сможем ли мы действительно их победить?'),
|
||||
(96436,1,0,'ruRU','Они от нас не скроются. Иллидари, атака!'),
|
||||
(96441,1,0,'ruRU','Да будет проклято твое призрачное видение!'),
|
||||
(96494,4,0,'ruRU','Вы смеете нападать на нас здесь?!'),
|
||||
(96652,1,0,'ruRU','Аа ...'),
|
||||
(97034,0,0,'ruRU','Я живу, чтобы служить.'),
|
||||
(97034,1,0,'ruRU','Мой клинок пронзит тебя.'),
|
||||
(97057,0,0,'ruRU','Тебе нравится мой новый меч? Подойди поближе.'),
|
||||
(97057,1,0,'ruRU','Глупые мелочи…'),
|
||||
(97058,0,0,'ruRU','Мой рой насытится твоей душой!'),
|
||||
(97244,0,0,'ruRU','Забирайте краеугольный камень! Давайте направимся к воротам внизу и вернемся в Черный Храм!'),
|
||||
(97370,1,0,'ruRU','От моего огня не останется ничего, кроме костей.'),
|
||||
(97459,0,0,'ruRU','Мои силы иссякли. Я подвел тебя.'),
|
||||
(97459,1,0,'ruRU','Клянусь отдать свою жизнь, если это потребуется.'),
|
||||
(98229,0,0,'ruRU','Активируйте три портала и соберите остальные силы.'),
|
||||
(98229,1,0,'ruRU','Я пробьюсь сквозь демонов и встречусь с тобой у вулкана.'),
|
||||
(98292,0,0,'ruRU','Убейте их всех!'),
|
||||
(98354,0,0,'ruRU','Я иду с тобой. Пойдём убьём ещё нескольких демонов.'),
|
||||
(98459,0,0,'ruRU','Знаете, это я должен быть главным.'),
|
||||
(98483,0,0,'ruRU','Для меня это вкусное, сочное мясо.'),
|
||||
(98497,1,0,'ruRU','Мне скоро принесут еду.'),
|
||||
(98497,3,0,'ruRU','Мои дети приготовят для вас идеальное блюдо.'),
|
||||
(98497,4,0,'ruRU','Победа Легиона неизбежна, дитя моё.'),
|
||||
(98497,5,0,'ruRU','Я сам доставлю тебя к Тиранне.'),
|
||||
(98497,6,0,'ruRU','Грязный маленький эльф. Я чувствую вкус скверны на тебе.'),
|
||||
(98711,0,0,'ruRU','Мать маленьких дьяволят находится в той пещере, прямо там.'),
|
||||
(98986,0,0,'ruRU','Мои развращающие тайны поглотят тебя!'),
|
||||
(98986,1,0,'ruRU','Они крадут наши секреты, моя королева…'),
|
||||
(99045,1,0,'ruRU','Я мог бы в одиночку уничтожить Легион!'),
|
||||
(99631,0,0,'ruRU','Я что, не сплю? Как это возможно?'),
|
||||
(99632,0,0,'ruRU','Сколько лет я потратил впустую в этой камере?'),
|
||||
(99917,1,0,'ruRU','Севис опускает взгляд на сломленного, умирающего мистика.'),
|
||||
(99917,2,0,'ruRU','Встретимся у последнего пешеходного моста.'),
|
||||
(100545,0,0,'ruRU','За лорда Иллидана!'),
|
||||
(103432,0,0,'ruRU','Я тебя расчленю.')
|
||||
ON DUPLICATE KEY UPDATE `Text`=VALUES(`Text`);
|
||||
|
||||
INSERT INTO `creature_text_locale` (`CreatureID`,`GroupID`,`ID`,`Locale`,`Text`)
|
||||
SELECT ct.`CreatureID`,ct.`GroupID`,ct.`ID`,'ruRU',REPLACE(REPLACE(ct.`Text`, 'begins to cast', 'начинает произносить'), '[Carrion Storm]', '[Буря Падали]')
|
||||
FROM `creature_text` ct WHERE ct.`CreatureID`=97058 AND ct.`GroupID`=1 AND ct.`ID`=0
|
||||
ON DUPLICATE KEY UPDATE `Text`=VALUES(`Text`);
|
||||
|
||||
INSERT INTO `creature_text_locale` (`CreatureID`,`GroupID`,`ID`,`Locale`,`Text`)
|
||||
SELECT ct.`CreatureID`,ct.`GroupID`,ct.`ID`,'ruRU',REPLACE(REPLACE(REPLACE(ct.`Text`, 'Nearby', 'Ближайшие'), '[Spider Eggs]', '[Паучьи яйца]'), 'will hatch soon if not destroyed!.', 'скоро вылупятся, если их не уничтожить!')
|
||||
FROM `creature_text` ct WHERE ct.`CreatureID`=97059 AND ct.`GroupID`=2 AND ct.`ID`=0
|
||||
ON DUPLICATE KEY UPDATE `Text`=VALUES(`Text`);
|
||||
|
||||
INSERT INTO `gossip_menu_option_locale` (`MenuId`,`OptionIndex`,`Locale`,`OptionText`,`BoxText`) VALUES
|
||||
(18776,0,'ruRU','Уайтмун, я возьму одну из твоих пораженных гангреной летучих мышей. Мы найдем то, за чем пришли.','')
|
||||
ON DUPLICATE KEY UPDATE `OptionText`=VALUES(`OptionText`);
|
||||
@@ -0,0 +1,36 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé — la mort de Tirion, mise en scène
|
||||
--
|
||||
-- SIGNALÉ EN JEU : « p7 c'est Krosus qui plonge Tirion dans le fiel
|
||||
-- normalement, et là pas de script de scénario ».
|
||||
--
|
||||
-- Séquence officielle, relevée sur Warcraft Wiki :
|
||||
-- Tirion « Stay back... it's a trap... the Light will protect me... »
|
||||
-- Gul'dan « Ha, you fool! You stand before the temple of a GOD... »
|
||||
-- Krosus surgit de la lave.
|
||||
-- Gul'dan « Destroy him. »
|
||||
-- Krosus souffle sur Tirion.
|
||||
-- Tirion « The Light... will... ahh! Aahhhh!! » puis il sombre.
|
||||
-- Thrall « Fordring! »
|
||||
-- Gul'dan « All you have worked for... » puis « Destroy them! »
|
||||
--
|
||||
-- Les huit répliques portent leur BroadcastTextId et leur Sound
|
||||
-- d'origine : le client jouera la voix française et affichera son
|
||||
-- propre texte. Le texte anglais porté ici n'est qu'un repère.
|
||||
--
|
||||
-- Groupes 20 et au-delà, pour ne rien écraser.
|
||||
-- =====================================================================
|
||||
|
||||
DELETE FROM `creature_text` WHERE `GroupID` BETWEEN 20 AND 29
|
||||
AND `CreatureID` IN (90367, 90413, 90711, 90713);
|
||||
|
||||
INSERT INTO `creature_text`
|
||||
(`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES
|
||||
(90367,20,0,'Stay back... it''s a trap... the Light will protect me...',14,0,100,0,0,53452,99237,0,'mort de Tirion 1'),
|
||||
(90367,21,0,'The Light... will... ahh! Aahhhh!!',14,0,100,0,0,53455,99240,0,'mort de Tirion 5'),
|
||||
(90413,20,0,'Ha, you fool! You stand before the temple of a GOD. Your pitiful Light cannot reach you here.',14,0,100,0,0,53453,99238,0,'mort de Tirion 2'),
|
||||
(90413,21,0,'Destroy him.',14,0,100,0,0,53454,99239,0,'mort de Tirion 4'),
|
||||
(90413,22,0,'All you have worked for, all you have sacrificed, just to see your champions fall to ash one by one.',14,0,100,0,0,53458,99243,0,'mort de Tirion 7'),
|
||||
(90413,23,0,'Destroy them!',14,0,100,0,0,53462,99247,0,'mort de Tirion 8'),
|
||||
(90711,20,0,'Fordring!',14,0,100,0,0,53456,99241,0,'mort de Tirion 6'),
|
||||
(90713,20,0,'We will never give in to hopelessness!',14,0,100,0,0,53459,99244,0,'mort de Tirion, riposte');
|
||||
@@ -0,0 +1,34 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé (carte 1460) — objets affichés comme déjà utilisés
|
||||
--
|
||||
-- SIGNALÉ EN JEU : « le gameobject de la flèche n'est physiquement pas
|
||||
-- visible ni cliquable, à la place il y a un minuscule skin de chien ».
|
||||
--
|
||||
-- Les six Flèches de malheur (240194) étaient enregistrées en
|
||||
-- `state = 2`, soit GO_STATE_ACTIVE_ALTERNATIVE. Le commentaire de notre
|
||||
-- propre énumération le décrit sans ambiguïté :
|
||||
-- « show in world as used in alt way and not reset »
|
||||
-- L'objet est donc affiché dans sa forme CONSOMMÉE dès l'apparition,
|
||||
-- avec le modèle de remplacement correspondant — et il n'est plus
|
||||
-- utilisable, puisqu'il se présente comme déjà employé.
|
||||
--
|
||||
-- Ce n'était ni le modèle ni l'orientation : `displayId` 37460 existe
|
||||
-- bien dans GameObjectDisplayInfo du build 7.3.5.26972, avec une boîte
|
||||
-- englobante de 44 × 44 × 71 unités, et la rotation (0,0,0,1) est
|
||||
-- l'identité, la même que celle des Cages de la Légion qui s'affichent
|
||||
-- correctement.
|
||||
--
|
||||
-- État attendu : GO_STATE_READY (1), celui de 79 des 101 objets de la
|
||||
-- carte, dont toutes les cages, les fleurs et les navires.
|
||||
--
|
||||
-- PORTÉE : les six flèches uniquement. Les Canons de siège (240214) et
|
||||
-- deux Portails de la Légion partagent le même défaut apparent, mais
|
||||
-- rien ne prouve encore que leur état soit fautif — un canon peut
|
||||
-- légitimement s'afficher chargé. À vérifier en jeu avant d'y toucher.
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `gameobject`
|
||||
SET `state` = 1
|
||||
WHERE `id` = 240194
|
||||
AND `map` = 1460
|
||||
AND `state` = 2;
|
||||
@@ -0,0 +1,65 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé (1460) — la parole et la VOIX rendues aux personnages
|
||||
--
|
||||
-- SIGNALÉ EN JEU : « tous les PNJ de la zone sont totalement
|
||||
-- inexpressifs, ça n'a pas d'âme », « tout est muet même s'il y a du
|
||||
-- textuel ».
|
||||
--
|
||||
-- CAUSE : nos répliques portent un BroadcastTextId à ZÉRO. Le serveur
|
||||
-- envoie alors du texte brut, que le client affiche sans rien avoir à
|
||||
-- résoudre — donc sans la version localisée et SANS LA BANDE SON. Le
|
||||
-- client possède pourtant les deux : c'est pour cela que la vidéo
|
||||
-- montre du français alors que notre base n'en contient aucune
|
||||
-- traduction. Il ne lui manquait que l'identifiant.
|
||||
--
|
||||
-- SOURCE : creature_text du dump dufernst/LegionCore-7.3.5, qui a
|
||||
-- conservé les Sound et BroadcastTextID d'origine. Son texte est en
|
||||
-- russe, sans importance : l'identifiant prime, et le client rendra sa
|
||||
-- propre version. Le texte porté ici est l'anglais officiel, tiré de
|
||||
-- notre broadcast_text — il ne sert que de repli et de repère.
|
||||
--
|
||||
-- GROUPES DÉCALÉS DE +10. Nos répliques existantes, aux groupes 0 et 1,
|
||||
-- sont CONSERVÉES : le script les appelle par Talk(0) et Talk(1), et
|
||||
-- les écraser ferait dire à Varian « Pour l'Alliance ! » au moment de
|
||||
-- mourir. Le recâblage du script est un travail distinct.
|
||||
--
|
||||
-- 34 répliques, toutes avec son et identifiant de diffusion.
|
||||
-- =====================================================================
|
||||
|
||||
DELETE FROM `creature_text` WHERE `GroupID` >= 10 AND `CreatureID` IN (90544,90708,90709,90710,90711,90713,90714,90716,90717);
|
||||
|
||||
INSERT INTO `creature_text` (`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES
|
||||
(90544,10,0,'You will know fear.',14,0,100,0,0,53463,99248,0,'voix officielle -- son 53463'),
|
||||
(90708,10,0,'Listen up! Dere''s only one way offa dis beach, and it be t''rough alla dose demons ahead of us. But dey don''t know who dey be dealin'' wit. Let''s show dem what it means ta be Horde!',14,0,100,0,0,53528,99315,0,'voix officielle -- son 53528'),
|
||||
(90708,11,0,'Die.',14,0,100,0,0,53536,99323,0,'voix officielle -- son 53536'),
|
||||
(90708,13,0,'',14,0,100,0,0,53590,143151,0,'voix officielle -- son 53590'),
|
||||
(90708,15,0,'Dis one''s mine.',14,0,100,0,0,53537,99324,0,'voix officielle -- son 53537'),
|
||||
(90709,10,0,'',14,0,100,0,0,53590,99375,0,'voix officielle -- son 53590'),
|
||||
(90709,11,0,'',14,0,100,0,0,53587,99374,0,'voix officielle -- son 53587'),
|
||||
(90709,12,0,'',14,0,100,0,0,53465,99250,0,'voix officielle -- son 53465'),
|
||||
(90709,13,0,'',14,0,100,0,0,53585,99372,0,'voix officielle -- son 53585'),
|
||||
(90709,14,0,'',12,0,100,0,0,53610,99397,0,'voix officielle -- son 53610'),
|
||||
(90709,15,0,'',12,0,100,0,0,53612,99399,0,'voix officielle -- son 53612'),
|
||||
(90710,14,0,'By the Earthmother!',14,0,100,0,0,53591,109421,0,'voix officielle -- son 53591'),
|
||||
(90711,10,0,'The elements will destroy you!',14,0,100,0,0,53534,99321,0,'voix officielle -- son 53534'),
|
||||
(90711,11,0,'Back to the Nether!',14,0,100,0,0,53533,99320,0,'voix officielle -- son 53533'),
|
||||
(90711,12,0,'Spirits of earth, aid me!',12,0,100,0,0,53611,99398,0,'voix officielle -- son 53611'),
|
||||
(90713,10,0,'Brace yourselves, Alliance, it''s coming this way!',14,0,100,0,0,53464,99249,0,'voix officielle -- son 53464'),
|
||||
(90713,11,0,'',14,0,100,0,0,53407,146212,0,'voix officielle -- son 53407'),
|
||||
(90713,14,0,'We''re pushing them back! Don''t let up!',14,0,100,0,0,53405,99189,0,'voix officielle -- son 53405'),
|
||||
(90713,15,0,'There is nowhere to run, Gul''dan. Give up now, and I will grant you a swift death.',14,0,100,0,0,53496,99283,0,'voix officielle -- son 53496'),
|
||||
(90713,16,0,'Hold steady, we''ve broken their lines before, we will again. Charge!',14,0,100,0,0,53498,99285,0,'voix officielle -- son 53498'),
|
||||
(90713,17,0,'No matter how many demons you throw at us, we will cut you down, monster.',14,0,100,0,0,53513,99300,0,'voix officielle -- son 53513'),
|
||||
(90714,10,0,'',14,0,100,0,0,53345,94240,0,'voix officielle -- son 53345'),
|
||||
(90714,11,0,'',14,0,100,0,0,53347,94242,0,'voix officielle -- son 53347'),
|
||||
(90714,12,0,'',14,0,100,0,0,53357,94594,0,'voix officielle -- son 53357'),
|
||||
(90714,13,0,'',12,0,100,0,0,53449,99234,0,'voix officielle -- son 53449'),
|
||||
(90714,14,0,'',14,0,100,0,0,53358,94595,0,'voix officielle -- son 53358'),
|
||||
(90716,10,0,'How are we going to get across?',12,0,100,1,0,53448,99233,0,'voix officielle -- son 53448'),
|
||||
(90716,11,0,'For Gnomeregan!',14,0,100,0,0,53409,99193,0,'voix officielle -- son 53409'),
|
||||
(90716,12,0,'',14,0,100,0,0,53408,127434,0,'voix officielle -- son 53408'),
|
||||
(90717,10,0,'Just in time. We haven''t been able to break their line, now we may have a chance.',14,0,100,0,0,53346,94241,0,'voix officielle -- son 53346'),
|
||||
(90717,11,0,'There''s only one way out of this, Alliance, and it''s through that line of demons! Cannons, lay down covering fire! All forces, CHARGE!',14,0,100,0,0,53348,94585,0,'voix officielle -- son 53348'),
|
||||
(90717,12,0,'Go for the throat!',14,0,100,0,0,53354,94591,0,'voix officielle -- son 53354'),
|
||||
(90717,13,0,'This one''s mine!',14,0,100,0,0,53355,117408,0,'voix officielle -- son 53355'),
|
||||
(90717,14,0,'Side by side, don''t let them break through!',14,0,100,0,0,53353,94590,0,'voix officielle -- son 53353');
|
||||
@@ -0,0 +1,98 @@
|
||||
/*M!999999\- enable the sandbox mode */
|
||||
-- MariaDB dump 10.19-11.4.7-MariaDB, for debian-linux-gnu (x86_64)
|
||||
--
|
||||
-- Host: localhost Database: dc_world
|
||||
-- ------------------------------------------------------
|
||||
-- Server version 11.4.7-MariaDB-0ubuntu0.25.04.1
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8mb4 */;
|
||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||
/*M!100616 SET @OLD_NOTE_VERBOSITY=@@NOTE_VERBOSITY, NOTE_VERBOSITY=0 */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `creature_text`
|
||||
--
|
||||
-- WHERE: CreatureID IN (90367,90413,90544,90705,90708,90709,90710,90711,90713,90714,90716,90717,91951,94276)
|
||||
|
||||
LOCK TABLES `creature_text` WRITE;
|
||||
/*!40000 ALTER TABLE `creature_text` DISABLE KEYS */;
|
||||
INSERT INTO `creature_text` VALUES (90367,0,0,'Ne vous souciez pas de moi ! Le tombeau... Gul\'dan ouvre le tombeau ! Arrêtez-le !',14,0,100,5,0,0,0,0,'Tirion crevasse');
|
||||
INSERT INTO `creature_text` VALUES (90367,20,0,'Stay back... it\'s a trap... the Light will protect me...',14,0,100,0,0,53452,99237,0,'mort de Tirion 1');
|
||||
INSERT INTO `creature_text` VALUES (90367,21,0,'The Light... will... ahh! Aahhhh!!',14,0,100,0,0,53455,99240,0,'mort de Tirion 5');
|
||||
INSERT INTO `creature_text` VALUES (90413,0,0,'Vous arrivez trop tard ! Les ténèbres s\'éveillent sous ce tombeau !',14,0,100,25,0,0,0,0,'Guldan accueil');
|
||||
INSERT INTO `creature_text` VALUES (90413,1,0,'Sargeras... accueille leurs âmes !',14,0,100,25,0,0,0,0,'Guldan invocation');
|
||||
INSERT INTO `creature_text` VALUES (90413,2,0,'Cette victoire ne changera rien. L\'Étoile ardente approche !',14,0,100,25,0,0,0,0,'Guldan retraite');
|
||||
INSERT INTO `creature_text` VALUES (90413,20,0,'Ha, you fool! You stand before the temple of a GOD. Your pitiful Light cannot reach you here.',14,0,100,0,0,53453,99238,0,'mort de Tirion 2');
|
||||
INSERT INTO `creature_text` VALUES (90413,21,0,'Destroy him.',14,0,100,0,0,53454,99239,0,'mort de Tirion 4');
|
||||
INSERT INTO `creature_text` VALUES (90413,22,0,'All you have worked for, all you have sacrificed, just to see your champions fall to ash one by one.',14,0,100,0,0,53458,99243,0,'mort de Tirion 7');
|
||||
INSERT INTO `creature_text` VALUES (90413,23,0,'Destroy them!',14,0,100,0,0,53462,99247,0,'mort de Tirion 8');
|
||||
INSERT INTO `creature_text` VALUES (90544,10,0,'You will know fear.',14,0,100,0,0,53463,99248,0,'voix officielle -- son 53463');
|
||||
INSERT INTO `creature_text` VALUES (90705,0,0,'Vos armées ne sont que poussière. Je suis Arganoth, et cette plage sera votre tombeau !',14,0,100,15,0,0,0,0,'Arganoth spawn');
|
||||
INSERT INTO `creature_text` VALUES (90705,1,0,'La Légion... est... éternelle...',14,0,100,0,0,0,0,0,'Arganoth mort');
|
||||
INSERT INTO `creature_text` VALUES (90708,0,0,'Fils et filles de la Horde ! Montrez à la Légion c\'que vaut not\' sang ! LOK\'TAR OGAR !',14,0,100,5,0,53528,99315,0,'Voljin ralliement');
|
||||
INSERT INTO `creature_text` VALUES (90708,1,0,'Argh... la lame... empoisonnée... Sylvanas... sonne la retraite...',14,0,100,0,0,0,0,0,'Voljin blessé');
|
||||
INSERT INTO `creature_text` VALUES (90708,10,0,'Listen up! Dere\'s only one way offa dis beach, and it be t\'rough alla dose demons ahead of us. But dey don\'t know who dey be dealin\' wit. Let\'s show dem what it means ta be Horde!',14,0,100,0,0,53528,99315,0,'voix officielle -- son 53528');
|
||||
INSERT INTO `creature_text` VALUES (90708,11,0,'Die.',14,0,100,0,0,53536,99323,0,'voix officielle -- son 53536');
|
||||
INSERT INTO `creature_text` VALUES (90708,13,0,'',14,0,100,0,0,53590,143151,0,'voix officielle -- son 53590');
|
||||
INSERT INTO `creature_text` VALUES (90708,15,0,'Dis one\'s mine.',14,0,100,0,0,53537,99324,0,'voix officielle -- son 53537');
|
||||
INSERT INTO `creature_text` VALUES (90709,0,0,'La Horde ne mourra pas sur cette plage. Avancez, et que la Légion tombe !',14,0,100,25,0,53587,99374,0,'Sylvanas');
|
||||
INSERT INTO `creature_text` VALUES (90709,10,0,'',14,0,100,0,0,53590,99375,0,'voix officielle -- son 53590');
|
||||
INSERT INTO `creature_text` VALUES (90709,11,0,'',14,0,100,0,0,53587,99374,0,'voix officielle -- son 53587');
|
||||
INSERT INTO `creature_text` VALUES (90709,12,0,'',14,0,100,0,0,53465,99250,0,'voix officielle -- son 53465');
|
||||
INSERT INTO `creature_text` VALUES (90709,13,0,'',14,0,100,0,0,53585,99372,0,'voix officielle -- son 53585');
|
||||
INSERT INTO `creature_text` VALUES (90709,14,0,'',12,0,100,0,0,53610,99397,0,'voix officielle -- son 53610');
|
||||
INSERT INTO `creature_text` VALUES (90709,15,0,'',12,0,100,0,0,53612,99399,0,'voix officielle -- son 53612');
|
||||
INSERT INTO `creature_text` VALUES (90710,14,0,'By the Earthmother!',14,0,100,0,0,53591,109421,0,'voix officielle -- son 53591');
|
||||
INSERT INTO `creature_text` VALUES (90711,10,0,'The elements will destroy you!',14,0,100,0,0,53534,99321,0,'voix officielle -- son 53534');
|
||||
INSERT INTO `creature_text` VALUES (90711,11,0,'Back to the Nether!',14,0,100,0,0,53533,99320,0,'voix officielle -- son 53533');
|
||||
INSERT INTO `creature_text` VALUES (90711,12,0,'Spirits of earth, aid me!',12,0,100,0,0,53611,99398,0,'voix officielle -- son 53611');
|
||||
INSERT INTO `creature_text` VALUES (90711,20,0,'Fordring!',14,0,100,0,0,53456,99241,0,'mort de Tirion 6');
|
||||
INSERT INTO `creature_text` VALUES (90713,0,0,'Soldats de l\'Alliance ! La Légion s\'abat sur nos terres. Repoussez-la jusqu\'aux portes du tombeau de Sargeras !',14,0,100,5,0,53498,99285,0,'Varian ralliement');
|
||||
INSERT INTO `creature_text` VALUES (90713,1,0,'Partez, sauvez ce qui peut l\'être ! Dites à mon fils... que je suis mort en roi. Pour l\'Alliance !',14,0,100,5,0,53407,146212,0,'Varian sacrifice');
|
||||
INSERT INTO `creature_text` VALUES (90713,10,0,'Brace yourselves, Alliance, it\'s coming this way!',14,0,100,0,0,53464,99249,0,'voix officielle -- son 53464');
|
||||
INSERT INTO `creature_text` VALUES (90713,11,0,'',14,0,100,0,0,53407,146212,0,'voix officielle -- son 53407');
|
||||
INSERT INTO `creature_text` VALUES (90713,14,0,'We\'re pushing them back! Don\'t let up!',14,0,100,0,0,53405,99189,0,'voix officielle -- son 53405');
|
||||
INSERT INTO `creature_text` VALUES (90713,15,0,'There is nowhere to run, Gul\'dan. Give up now, and I will grant you a swift death.',14,0,100,0,0,53496,99283,0,'voix officielle -- son 53496');
|
||||
INSERT INTO `creature_text` VALUES (90713,16,0,'Hold steady, we\'ve broken their lines before, we will again. Charge!',14,0,100,0,0,53498,99285,0,'voix officielle -- son 53498');
|
||||
INSERT INTO `creature_text` VALUES (90713,17,0,'No matter how many demons you throw at us, we will cut you down, monster.',14,0,100,0,0,53513,99300,0,'voix officielle -- son 53513');
|
||||
INSERT INTO `creature_text` VALUES (90713,20,0,'We will never give in to hopelessness!',14,0,100,0,0,53459,99244,0,'mort de Tirion, riposte');
|
||||
INSERT INTO `creature_text` VALUES (90714,0,0,'Leurs portails déversent des renforts sans fin ! Détruisez les ancres dimensionnelles !',14,0,100,5,0,53345,94240,0,'Jaina portails');
|
||||
INSERT INTO `creature_text` VALUES (90714,10,0,'',14,0,100,0,0,53345,94240,0,'voix officielle -- son 53345');
|
||||
INSERT INTO `creature_text` VALUES (90714,11,0,'',14,0,100,0,0,53347,94242,0,'voix officielle -- son 53347');
|
||||
INSERT INTO `creature_text` VALUES (90714,12,0,'',14,0,100,0,0,53357,94594,0,'voix officielle -- son 53357');
|
||||
INSERT INTO `creature_text` VALUES (90714,13,0,'',12,0,100,0,0,53449,99234,0,'voix officielle -- son 53449');
|
||||
INSERT INTO `creature_text` VALUES (90714,14,0,'',14,0,100,0,0,53358,94595,0,'voix officielle -- son 53358');
|
||||
INSERT INTO `creature_text` VALUES (90716,10,0,'How are we going to get across?',12,0,100,1,0,53448,99233,0,'voix officielle -- son 53448');
|
||||
INSERT INTO `creature_text` VALUES (90716,11,0,'For Gnomeregan!',14,0,100,0,0,53409,99193,0,'voix officielle -- son 53409');
|
||||
INSERT INTO `creature_text` VALUES (90716,12,0,'',14,0,100,0,0,53408,127434,0,'voix officielle -- son 53408');
|
||||
INSERT INTO `creature_text` VALUES (90717,10,0,'Just in time. We haven\'t been able to break their line, now we may have a chance.',14,0,100,0,0,53346,94241,0,'voix officielle -- son 53346');
|
||||
INSERT INTO `creature_text` VALUES (90717,11,0,'There\'s only one way out of this, Alliance, and it\'s through that line of demons! Cannons, lay down covering fire! All forces, CHARGE!',14,0,100,0,0,53348,94585,0,'voix officielle -- son 53348');
|
||||
INSERT INTO `creature_text` VALUES (90717,12,0,'Go for the throat!',14,0,100,0,0,53354,94591,0,'voix officielle -- son 53354');
|
||||
INSERT INTO `creature_text` VALUES (90717,13,0,'This one\'s mine!',14,0,100,0,0,53355,117408,0,'voix officielle -- son 53355');
|
||||
INSERT INTO `creature_text` VALUES (90717,14,0,'Side by side, don\'t let them break through!',14,0,100,0,0,53353,94590,0,'voix officielle -- son 53353');
|
||||
INSERT INTO `creature_text` VALUES (91951,20,0,'Stay back... it\'s a trap... the Light will protect me...',14,0,100,0,0,53452,99237,0,'mort de Tirion 1');
|
||||
INSERT INTO `creature_text` VALUES (91951,21,0,'The Light... will... ahh! Aahhhh!!',14,0,100,0,0,53455,99240,0,'mort de Tirion 5');
|
||||
INSERT INTO `creature_text` VALUES (94276,0,0,'I have seen the end of your pitiful world, Wrynn. You will perish in felfire.',14,0,100,0,0,53506,99293,0,'finale Guldan 1');
|
||||
INSERT INTO `creature_text` VALUES (94276,2,0,'Destroy them!',14,0,100,0,0,53462,99247,0,'finale Guldan 2');
|
||||
INSERT INTO `creature_text` VALUES (94276,20,0,'Ha, you fool! You stand before the temple of a GOD. Your pitiful Light cannot reach you here.',14,0,100,0,0,53453,99238,0,'mort de Tirion 2');
|
||||
INSERT INTO `creature_text` VALUES (94276,21,0,'Destroy him.',14,0,100,0,0,53454,99239,0,'mort de Tirion 4');
|
||||
INSERT INTO `creature_text` VALUES (94276,22,0,'All you have worked for, all you have sacrificed, just to see your champions fall to ash one by one.',14,0,100,0,0,53458,99243,0,'mort de Tirion 7');
|
||||
INSERT INTO `creature_text` VALUES (94276,23,0,'Destroy them!',14,0,100,0,0,53462,99247,0,'mort de Tirion 8');
|
||||
/*!40000 ALTER TABLE `creature_text` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*M!100616 SET NOTE_VERBOSITY=@OLD_NOTE_VERBOSITY */;
|
||||
|
||||
-- Dump completed on 2026-09-05 0:06:36
|
||||
@@ -0,0 +1,114 @@
|
||||
-- =====================================================================
|
||||
-- Assaut du Rivage brisé (carte 1666) — les 5 chemins scriptés
|
||||
--
|
||||
-- Ces chemins vivent dans `waypoint_data_script` chez la référence,
|
||||
-- une table que notre cœur n'a pas : sWaypointMgr ne lit que
|
||||
-- `waypoint_data`. L'extraction du 27/08 ne regardait que cette
|
||||
-- dernière et les avait donc manqués — d'où des alliés immobiles et,
|
||||
-- plus grave, un corbeau arcanique qui ne décollait jamais.
|
||||
--
|
||||
-- Le 11322708 est le vol d'arrivée : c'est l'atteinte de son point 20
|
||||
-- qui déclenche l'étape 0 du scénario. Sans lui, rien ne démarre.
|
||||
--
|
||||
-- move_flag → move_type : la valeur est 1 sur les 87 points.
|
||||
-- Notre énumération donne 0=marche, 1=course, 2=atterrissage,
|
||||
-- 3=décollage ; la course correspond. `speed` et `entry` n'ont
|
||||
-- aucun équivalent chez nous et sont abandonnées.
|
||||
--
|
||||
-- 11322705 : 24 points
|
||||
-- 11322706 : 18 points
|
||||
-- 11322707 : 23 points
|
||||
-- 11322708 : 21 points
|
||||
-- 11322709 : 1 points
|
||||
-- =====================================================================
|
||||
|
||||
DELETE FROM `waypoint_data` WHERE `id` BETWEEN 11322705 AND 11322709;
|
||||
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(11322705,1,-1895.48,3181.44,3.94356,0,0,1,0,100,0),
|
||||
(11322705,2,-1895.48,3181.44,3.94356,0,0,1,0,100,0),
|
||||
(11322705,3,-1896.09,3194.66,3.0589,0,0,1,0,100,0),
|
||||
(11322705,4,-1879.45,3226.71,5.81127,0,0,1,0,100,0),
|
||||
(11322705,5,-1855.82,3233.47,14.6567,0,0,1,0,100,0),
|
||||
(11322705,6,-1857.58,3265.25,25.8483,0,0,1,0,100,0),
|
||||
(11322705,7,-1867.03,3288.59,32.05,0,0,1,0,100,0),
|
||||
(11322705,8,-1852.08,3304.66,37.4348,0,0,1,0,100,0),
|
||||
(11322705,9,-1839.8,3322.75,40.8837,0,0,1,0,100,0),
|
||||
(11322705,10,-1839.04,3343.29,42.466,0,0,1,0,100,0),
|
||||
(11322705,11,-1836.7,3363.89,45.3895,0,0,1,0,100,0),
|
||||
(11322705,12,-1850.58,3384.72,46.7613,0,0,1,0,100,0),
|
||||
(11322705,13,-1825.16,3371.11,48.1092,0,0,1,0,100,0),
|
||||
(11322705,14,-1800.48,3368.29,52.986,0,0,1,0,100,0),
|
||||
(11322705,15,-1781.35,3380.74,58.1253,0,0,1,0,100,0),
|
||||
(11322705,16,-1767.17,3386.07,61.2137,0,0,1,0,100,0),
|
||||
(11322705,17,-1749.35,3385.12,65.4982,0,0,1,0,100,0),
|
||||
(11322705,18,-1743.22,3376.4,66.7185,0,0,1,0,100,0),
|
||||
(11322705,19,-1733.85,3361.1,69.025,0,0,1,0,100,0),
|
||||
(11322705,20,-1727.28,3348.62,73.3198,0,0,1,0,100,0),
|
||||
(11322705,21,-1719.09,3337.02,76.6384,0,0,1,0,100,0),
|
||||
(11322705,22,-1710.71,3331.34,79.6968,0,0,1,0,100,0),
|
||||
(11322705,23,-1693.39,3326.75,83.6209,0,0,1,0,100,0),
|
||||
(11322705,24,-1665.47,3322.98,84.213,0,0,1,0,100,0),
|
||||
(11322706,1,-1661.46,3342.18,84.7206,0,0,1,0,100,0),
|
||||
(11322706,2,-1661.46,3342.18,84.7206,0,0,1,0,100,0),
|
||||
(11322706,3,-1643.34,3358.99,91.1839,0,0,1,0,100,0),
|
||||
(11322706,4,-1614.3,3365.34,99.9272,0,0,1,0,100,0),
|
||||
(11322706,5,-1590.46,3353.51,107.609,0,0,1,0,100,0),
|
||||
(11322706,6,-1568.88,3331.64,108.463,0,0,1,0,100,0),
|
||||
(11322706,7,-1544.19,3323.67,108.452,0,0,1,0,100,0),
|
||||
(11322706,8,-1527.78,3312.48,108.452,0,0,1,0,100,0),
|
||||
(11322706,9,-1516.94,3278.18,108.456,0,0,1,0,100,0),
|
||||
(11322706,10,-1502.84,3232.22,108.308,0,0,1,0,100,0),
|
||||
(11322706,11,-1499.05,3199.12,94.6383,0,0,1,0,100,0),
|
||||
(11322706,12,-1506.8,3164.73,85.6659,0,0,1,0,100,0),
|
||||
(11322706,13,-1512.61,3132.76,85.6753,0,0,1,0,100,0),
|
||||
(11322706,14,-1504.42,3115.11,83.3742,0,0,1,0,100,0),
|
||||
(11322706,15,-1491.75,3090.42,72.0224,0,0,1,0,100,0),
|
||||
(11322706,16,-1472.63,3055.67,53.7606,0,0,1,0,100,0),
|
||||
(11322706,17,-1463.55,3041.25,48.0012,0,0,1,0,100,0),
|
||||
(11322706,18,-1443.16,3018.53,36.9585,0,0,1,0,100,0),
|
||||
(11322707,1,-1426.19,2996.66,37.1142,0,0,1,0,100,0),
|
||||
(11322707,2,-1426.19,2996.66,37.1142,0,0,1,0,100,0),
|
||||
(11322707,3,-1420.86,2984.12,35.987,0,0,1,0,100,0),
|
||||
(11322707,4,-1414.93,2950.44,36.6867,0,0,1,0,100,0),
|
||||
(11322707,5,-1402.61,2927.92,31.2816,0,0,1,0,100,0),
|
||||
(11322707,6,-1382.3,2939.2,25.4175,0,0,1,0,100,0),
|
||||
(11322707,7,-1359.37,2925.01,23.9701,0,0,1,0,100,0),
|
||||
(11322707,8,-1348.45,2910.15,24.3147,0,0,1,0,100,0),
|
||||
(11322707,9,-1351.97,2894.62,24.8695,0,0,1,0,100,0),
|
||||
(11322707,10,-1350.41,2876.29,24.9108,0,0,1,0,100,0),
|
||||
(11322707,11,-1344.7,2850.11,25.1457,0,0,1,0,100,0),
|
||||
(11322707,12,-1325.29,2832.26,24.2901,0,0,1,0,100,0),
|
||||
(11322707,13,-1290.08,2823.92,26.1421,0,0,1,0,100,0),
|
||||
(11322707,14,-1318.28,2814.4,23.9136,0,0,1,0,100,0),
|
||||
(11322707,15,-1321.91,2792.99,23.499,0,0,1,0,100,0),
|
||||
(11322707,16,-1316.96,2769.79,23.9586,0,0,1,0,100,0),
|
||||
(11322707,17,-1316.57,2747.45,24.3456,0,0,1,0,100,0),
|
||||
(11322707,18,-1333.14,2704.89,30.3677,0,0,1,0,100,0),
|
||||
(11322707,19,-1256.09,2718.4,27.7485,0,0,1,0,100,0),
|
||||
(11322707,20,-1276.42,2664.57,28.3643,0,0,1,0,100,0),
|
||||
(11322707,21,-1291.27,2637.64,32.6723,0,0,1,0,100,0),
|
||||
(11322707,22,-1227.07,2659.19,27.5531,0,0,1,0,100,0),
|
||||
(11322707,23,-1199.42,2661.52,29.5922,0,0,1,0,100,0),
|
||||
(11322708,1,-850.003,4176.37,751.63,0,0,1,0,100,0),
|
||||
(11322708,2,-898.993,4094.4,725.061,0,0,1,0,100,0),
|
||||
(11322708,3,-970.247,3975.18,686.417,0,0,1,0,100,0),
|
||||
(11322708,4,-1044.75,3879.26,652.558,0,0,1,0,100,0),
|
||||
(11322708,5,-1151.45,3694.79,592.72,0,0,1,0,100,0),
|
||||
(11322708,6,-1195.84,3493.36,546.951,0,0,1,0,100,0),
|
||||
(11322708,7,-1225.72,3286.17,564.777,0,0,1,0,100,0),
|
||||
(11322708,8,-1194.84,3183.06,550.694,0,0,1,0,100,0),
|
||||
(11322708,9,-1057.13,3080.14,501.312,0,0,1,0,100,0),
|
||||
(11322708,10,-1007.26,2974.9,455.169,0,0,1,0,100,0),
|
||||
(11322708,11,-1019.28,2874.84,399.954,0,0,1,0,100,0),
|
||||
(11322708,12,-1100.81,2821.6,336.706,0,0,1,0,100,0),
|
||||
(11322708,13,-1194.32,2756.01,271.367,0,0,1,0,100,0),
|
||||
(11322708,14,-1242.8,2712.92,285.178,0,0,1,0,100,0),
|
||||
(11322708,15,-1365.37,2573.14,261.881,0,0,1,0,100,0),
|
||||
(11322708,16,-1418.23,2507.59,254.915,0,0,1,0,100,0),
|
||||
(11322708,17,-1495.32,2527.83,191.514,0,0,1,0,100,0),
|
||||
(11322708,18,-1589.36,2571.82,132.87,0,0,1,0,100,0),
|
||||
(11322708,19,-1660.26,2642.93,75.1266,0,0,1,0,100,0),
|
||||
(11322708,20,-1719.28,2723.04,41.4641,0,0,1,0,100,0),
|
||||
(11322708,21,-1716.3,2809.05,4,0,0,1,0,100,0),
|
||||
(11322709,1,-1338.13,2800.24,23.0393,0,0,1,0,100,0);
|
||||
@@ -0,0 +1,30 @@
|
||||
-- =====================================================================
|
||||
-- Assaut du Rivage brisé — le donneur manquant de « Begin the Assault »
|
||||
--
|
||||
-- La quête 45102 n'avait NI donneur NI receveur en base : introuvable en
|
||||
-- jeu, quoi qu'on fasse. C'était l'une des trois quêtes sans donneur
|
||||
-- relevées à l'audit du 23/08.
|
||||
--
|
||||
-- Le dump de référence (dufernst/LegionCore-7.3.5) donne pour elle
|
||||
-- l'archimage Khadgar 116302, à la fois donneur et receveur. Ce PNJ est
|
||||
-- DÉJÀ posé chez nous, sur la carte 1220 à (-1628, 3194) — exactement
|
||||
-- les coordonnées de la référence — et porte déjà le drapeau de donneur
|
||||
-- de quêtes (npcflag 3). Rien à faire apparaître : seule la déclaration
|
||||
-- manquait.
|
||||
--
|
||||
-- 46734 reçoit aussi 116302, comme dans la référence, en plus du 86563
|
||||
-- déjà déclaré chez nous. Deux points d'accès, aucun conflit.
|
||||
--
|
||||
-- Rappel de la chaîne, pour mémoire :
|
||||
-- 46730 « Armies of Legionfall » 86563 (déjà câblée)
|
||||
-- 45102 « Begin the Assault » 116302 (posée ici)
|
||||
-- 46734 « Assault on Broken Shore » 86563 + 116302
|
||||
-- =====================================================================
|
||||
|
||||
DELETE FROM `creature_queststarter` WHERE `quest` = 45102 AND `id` = 116302;
|
||||
DELETE FROM `creature_questender` WHERE `quest` = 45102 AND `id` = 116302;
|
||||
DELETE FROM `creature_queststarter` WHERE `quest` = 46734 AND `id` = 116302;
|
||||
DELETE FROM `creature_questender` WHERE `quest` = 46734 AND `id` = 116302;
|
||||
|
||||
INSERT INTO `creature_queststarter` (`id`,`quest`) VALUES (116302, 45102), (116302, 46734);
|
||||
INSERT INTO `creature_questender` (`id`,`quest`) VALUES (116302, 45102), (116302, 46734);
|
||||
@@ -0,0 +1,39 @@
|
||||
-- =====================================================================
|
||||
-- Assaut du Rivage brisé (carte 1666) — rattachement des scripts
|
||||
--
|
||||
-- Le C++ porté (scenario_assault_broken_shore.cpp) ne sert à rien tant
|
||||
-- que ses scripts ne sont liés à aucune entrée : c'est la classe de bug
|
||||
-- la plus fréquente de ce cœur, des IA complètes jamais appelées.
|
||||
--
|
||||
-- PORTÉE VÉRIFIÉE : les onze entrées ci-dessous n'existent QUE sur la
|
||||
-- carte 1666 — contrôlé par un GROUP BY sur (id, map). Un ScriptName
|
||||
-- s'appliquant à toutes les cartes, ce contrôle n'est pas facultatif.
|
||||
--
|
||||
-- NE SONT PAS RATTACHÉES, volontairement : Arganoth (118551),
|
||||
-- Mephistroth (120746), Illidan (119130) et Lord Kalgorath (116291).
|
||||
-- L'instance les pilote depuis OnCreatureCreate et OnCreatureKilled ;
|
||||
-- leur donner un ScriptName ferait double emploi.
|
||||
--
|
||||
-- CONCORDANCE RELEVÉE, pas supposée :
|
||||
-- 120743 Arcane Bomb → 7 exemplaires posés, critère 57574 × 7
|
||||
-- 118558 Legion Portal → 7 exemplaires, dont 3 à fermer (critère 56778)
|
||||
-- =====================================================================
|
||||
|
||||
-- Les huit alliés qui accompagnent l'assaut : rotations de sorts et
|
||||
-- recherche d'adversaire à portée.
|
||||
UPDATE `creature_template` SET `ScriptName` = 'npc_assaut_allie'
|
||||
WHERE `entry` IN (119133, 118412, 121232, 118966, 121146, 118969, 118945, 118444);
|
||||
|
||||
-- Le corbeau arcanique : véhicule d'arrivée, sa fin de trajet vaut
|
||||
-- l'étape 0 du scénario. Aucun spawn en base, il est invoqué par sort.
|
||||
UPDATE `creature_template` SET `ScriptName` = 'npc_assaut_corbeau_arcanique'
|
||||
WHERE `entry` = 118517;
|
||||
|
||||
-- Portails de la Légion et bombes arcaniques : activés au clic de sort.
|
||||
UPDATE `creature_template` SET `ScriptName` = 'npc_assaut_interactif'
|
||||
WHERE `entry` IN (118558, 120743);
|
||||
|
||||
-- La passerelle démoniaque, objet de type 10 (goober) : notre cœur ne
|
||||
-- lui offre que le point d'entrée OnGossipHello.
|
||||
UPDATE `gameobject_template` SET `ScriptName` = 'go_assaut_passerelle_demoniaque'
|
||||
WHERE `entry` = 267955;
|
||||
@@ -0,0 +1,53 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé — armer les alliés
|
||||
--
|
||||
-- SIGNALÉ EN JEU : « les PNJ ne portent encore aucune arme ».
|
||||
--
|
||||
-- L'état de fourreau ne suffisait pas : il n'y avait rien à
|
||||
-- dégainer. Sur les 51 entrées alliées de la carte, seules QUATRE
|
||||
-- avaient un équipement défini — les 47 autres n'ont jamais eu
|
||||
-- d'arme, ni en base ni sur leur modèle.
|
||||
--
|
||||
-- Source : creature_equip_template du dump de référence
|
||||
-- dufernst/LegionCore-7.3.5, qui les renseigne. 30 équipements
|
||||
-- pour autant d'entrées.
|
||||
--
|
||||
-- Les spawns de la carte qui n'en portaient aucun se voient
|
||||
-- attribuer le jeu numéro 1 de leur entrée, quand il existe.
|
||||
-- =====================================================================
|
||||
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90708,1,140776,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90709,1,2179,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90710,1,58367,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90711,1,140777,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90712,1,140546,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90713,1,45899,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90714,1,139131,0,12869) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90716,1,53096,0,11587) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (90717,1,139132,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (91353,1,45726,0,45727) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (91949,1,0,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (91951,1,13262,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (92074,1,73008,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (92122,1,0,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (92586,1,0,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (93704,1,13631,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (94209,1,1899,0,117413) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (94223,1,40595,0,40596) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (97496,1,45726,0,45727) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (97502,1,40595,0,40596) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (97503,1,1899,0,117413) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (97521,1,140546,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (97525,1,12754,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (97526,1,5286,0,5286) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (97527,1,2176,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (97528,1,2176,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (110941,1,40595,0,40596) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (112879,1,73008,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (112920,1,0,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
INSERT INTO `creature_equip_template` (`CreatureID`,`ID`,`ItemID1`,`ItemID2`,`ItemID3`) VALUES (112921,1,0,0,0) ON DUPLICATE KEY UPDATE `ItemID1`=VALUES(`ItemID1`), `ItemID2`=VALUES(`ItemID2`), `ItemID3`=VALUES(`ItemID3`);
|
||||
|
||||
UPDATE `creature` c
|
||||
JOIN `creature_equip_template` e ON e.`CreatureID` = c.`id` AND e.`ID` = 1
|
||||
SET c.`equipment_id` = 1
|
||||
WHERE c.`map` = 1460 AND c.`equipment_id` = 0;
|
||||
@@ -0,0 +1,33 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé — créatures posées deux fois au même endroit
|
||||
--
|
||||
-- SIGNALÉ EN JEU : « il est spawn 2 fois au même endroit » (entrée
|
||||
-- 92564, guid 290200360).
|
||||
--
|
||||
-- Neuf créatures de la carte 1460 occupent une position strictement
|
||||
-- identique à une autre — même entrée, mêmes coordonnées au centimètre.
|
||||
-- En jeu, deux modèles se superposent exactement.
|
||||
--
|
||||
-- L'IMPORT N'EST PAS EN CAUSE. La référence les porte déjà en double :
|
||||
-- (294825,92564,1460,…,1254.48,2438.92,47.0961,…)
|
||||
-- (294827,92564,1460,…,1254.48,2438.92,47.0961,…)
|
||||
-- La transposition était fidèle ; c'est la donnée d'origine qui l'est
|
||||
-- moins. Écart assumé avec la référence, au bénéfice du rendu.
|
||||
--
|
||||
-- On conserve le plus petit guid de chaque paire.
|
||||
-- =====================================================================
|
||||
|
||||
DELETE c FROM `creature` c
|
||||
JOIN (
|
||||
SELECT `id`, ROUND(`position_x`,1) AS px, ROUND(`position_y`,1) AS py,
|
||||
MIN(`guid`) AS garder
|
||||
FROM `creature`
|
||||
WHERE `map` IN (1460, 1666)
|
||||
GROUP BY `id`, px, py
|
||||
HAVING COUNT(*) > 1
|
||||
) AS d
|
||||
ON c.`id` = d.`id`
|
||||
AND ROUND(c.`position_x`,1) = d.px
|
||||
AND ROUND(c.`position_y`,1) = d.py
|
||||
AND c.`guid` <> d.garder
|
||||
WHERE c.`map` IN (1460, 1666);
|
||||
@@ -0,0 +1,48 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé (carte 1460) — factions démoniaques ramenées à 16
|
||||
--
|
||||
-- ÉTABLI PAR TEST A/B, pas par raisonnement.
|
||||
-- Une seule entrée a été basculée en faction 16 — le Molosse de l'effroi
|
||||
-- gangrené (90686) — toutes choses égales par ailleurs. Résultat en jeu :
|
||||
-- « les molosses sont maintenant attaquables », les autres non.
|
||||
--
|
||||
-- La sonde SPAWNDBG confirme que seule la faction distingue les deux :
|
||||
-- Felstalker Dreadhound faction=16 drapeaux=32768 drapeaux2=0 → OK
|
||||
-- Felguard Legionnaire faction=2780 drapeaux=32768 drapeaux2=0 → bloqué
|
||||
-- Mêmes drapeaux, même niveau, même vie, mêmes phases.
|
||||
--
|
||||
-- POURQUOI 2780 ÉCHOUE, ALORS QUE LA THÉORIE DIT L'INVERSE
|
||||
-- `FactionTemplate.db2` donne pour 2780 : Faction=1786, EnemyGroup=15,
|
||||
-- soit ennemi de tous les groupes, joueurs compris. Et 1786 (« Burning
|
||||
-- Legion Invaders ») a ReputationIndex=-1, donc aucune réputation
|
||||
-- n'intervient. Sur le papier, 2780 devrait être hostile.
|
||||
--
|
||||
-- Elle ne l'est pas dans les faits, et je n'ai pas élucidé pourquoi. Le
|
||||
-- refus vient du client, qui n'interroge jamais le serveur — aucune sonde
|
||||
-- côté serveur ne peut l'observer.
|
||||
--
|
||||
-- CHOIX ASSUMÉ : on retient la faction 16, qui fonctionne de façon
|
||||
-- démontrée dans ce scénario même — c'est celle qu'emploient les démons
|
||||
-- invoqués par le script. C'est un écart avec la donnée de référence,
|
||||
-- consenti parce qu'il rend le contenu jouable.
|
||||
--
|
||||
-- Effet secondaire bienvenu : les démons cessent de s'entretuer. La
|
||||
-- faction 16 les rend amis entre eux (Friend_0=14), ce qui met fin au
|
||||
-- « démons inattaquables qui se battent avec les attaquables ».
|
||||
--
|
||||
-- PORTÉE : uniquement les entrées exclusives à la carte 1460, comme pour
|
||||
-- les correctifs précédents. Les entrées partagées avec d'autres cartes
|
||||
-- sont écartées.
|
||||
--
|
||||
-- Retour arrière : chantiers/rivage_brise/retour_faction16_1460.sql
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `creature_template` ct
|
||||
JOIN (SELECT DISTINCT c.id
|
||||
FROM creature c
|
||||
JOIN creature_template t ON t.entry = c.id
|
||||
WHERE c.map = 1460
|
||||
AND t.faction IN (2780, 1768)
|
||||
AND c.id NOT IN (SELECT DISTINCT id FROM creature WHERE map <> 1460)) AS cible
|
||||
ON cible.id = ct.entry
|
||||
SET ct.faction = 16;
|
||||
@@ -0,0 +1,39 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé — les démons passent en faction 2898
|
||||
--
|
||||
-- ÉTABLI PAR TEST EN JEU, et il résout le paradoxe d'août.
|
||||
--
|
||||
-- En août on avait basculé tous les démons de cette carte en faction 16
|
||||
-- parce que la 2780 les rendait inattaquables — sans comprendre
|
||||
-- pourquoi, la théorie disant l'inverse. La 16 fonctionnait, on l'a
|
||||
-- prise.
|
||||
--
|
||||
-- Ce qu'on ignorait, c'est le prix : la faction 16 porte
|
||||
-- `EnemyGroup = 1`, elle n'est hostile QU'AUX JOUEURS. Nos alliés, eux,
|
||||
-- ont `EnemyGroup = 0` et une liste d'ennemis qui désigne la faction
|
||||
-- 1786. Alliés et démons ne se reconnaissaient donc pas — d'où les
|
||||
-- soldats qui entrent en combat puis n'ont personne à frapper, relevé
|
||||
-- par la sonde : « liste de menace vide », onze fois pour la garde
|
||||
-- royale gilnéenne, dix fois pour Jaina, dix fois pour Varian.
|
||||
--
|
||||
-- On avait réparé le joueur en supprimant la bataille.
|
||||
--
|
||||
-- La 2898 porte la faction 1786 comme la 2780, mais avec
|
||||
-- `EnemyGroup = 15` — hostile à tous les groupes, joueurs compris.
|
||||
-- Vérifié en jeu sur le Molosse de l'effroi gangrené : attaquable.
|
||||
--
|
||||
-- PORTÉE : uniquement les entrées exclusives à la carte 1460, comme en
|
||||
-- août. Celles partagées avec d'autres cartes sont écartées.
|
||||
--
|
||||
-- Retour arrière : rebasculer les mêmes entrées en 16.
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `creature_template` ct
|
||||
JOIN (SELECT DISTINCT c.`id`
|
||||
FROM `creature` c
|
||||
JOIN `creature_template` t ON t.`entry` = c.`id`
|
||||
WHERE c.`map` = 1460
|
||||
AND t.`faction` = 16
|
||||
AND c.`id` NOT IN (SELECT DISTINCT `id` FROM `creature` WHERE `map` <> 1460)) AS cible
|
||||
ON cible.`id` = ct.`entry`
|
||||
SET ct.`faction` = 2898;
|
||||
@@ -0,0 +1,46 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé (carte 1460) — retrait de l'immunité aux joueurs
|
||||
--
|
||||
-- Signalé en jeu : « les démons invoqués c'est ok mais pas les autres
|
||||
-- au fond ». Les créatures invoquées par le script étaient frappables,
|
||||
-- les placements statiques non.
|
||||
--
|
||||
-- LA CAUSE, et elle est de mon fait
|
||||
-- La transposition des modèles de créatures depuis le dump de référence
|
||||
-- a importé `unit_flags` sur 136 entrées. Parmi les valeurs reprises,
|
||||
-- 33536 et 537166592 contiennent le bit 256 — UNIT_FLAG_IMMUNE_TO_PC,
|
||||
-- qui empêche tout joueur d'attaquer la créature.
|
||||
--
|
||||
-- Dans le cœur de référence, un script retire vraisemblablement ce
|
||||
-- drapeau à l'instant voulu. Le nôtre ne gère aucun drapeau : les
|
||||
-- démons restaient donc immunisés en permanence.
|
||||
--
|
||||
-- Cela explique aussi pourquoi la sonde ATTDBG ne produisait plus rien :
|
||||
-- le client refusait de lui-même, sans jamais interroger le serveur.
|
||||
--
|
||||
-- PORTÉE : uniquement les factions HOSTILES —
|
||||
-- 2780 (30 entrées), 1768 (20 : Anetheron, Balnazzar, Brutallus…),
|
||||
-- 2878 (Krosus), 14 (Gul'dan), 2877 (Lave gangrenée).
|
||||
--
|
||||
-- Volontairement ÉPARGNÉS, car l'immunité y est légitime :
|
||||
-- 35, 2876, 2879, 1819 — alliés, prêtres, montures, vaisseaux.
|
||||
--
|
||||
-- UNE SIMPLIFICATION ASSUMÉE
|
||||
-- Krosus et Gul'dan perdent aussi leur immunité, alors qu'une
|
||||
-- implémentation fidèle la retirerait au début de leur étape. Notre
|
||||
-- script ne gère aucun drapeau : la conserver rendrait les étapes 7 et 8
|
||||
-- infranchissables. La progression reste pilotée par la machine à états
|
||||
-- du script.
|
||||
--
|
||||
-- Retour arrière : chantiers/rivage_brise/retour_immunite_1460.sql
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `creature_template` ct
|
||||
JOIN (SELECT DISTINCT c.id
|
||||
FROM creature c
|
||||
JOIN creature_template t ON t.entry = c.id
|
||||
WHERE c.map = 1460
|
||||
AND (t.unit_flags & 256)
|
||||
AND t.faction IN (2780, 1768, 2877, 2878, 14)) AS cible
|
||||
ON cible.id = ct.entry
|
||||
SET ct.unit_flags = ct.unit_flags & ~256;
|
||||
@@ -0,0 +1,279 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé — posture et armement des alliés
|
||||
--
|
||||
-- SIGNALÉ EN JEU : « les PNJ ont bien leurs armes mais pas de posture
|
||||
-- de combat actif ».
|
||||
--
|
||||
-- 131 alliés armés passent en EMOTE_STATE_READY1H (333), arme au
|
||||
-- clair. Les 132 sans équipement gardent une posture neutre : leur
|
||||
-- donner une attitude armée les ferait mimer une arme absente.
|
||||
--
|
||||
-- La table creature_addon ne contenait AUCUNE ligne pour cette carte
|
||||
-- avant aujourd hui, d où l absence totale de posture.
|
||||
-- =====================================================================
|
||||
|
||||
DELETE a FROM `creature_addon` a JOIN `creature` c ON c.`guid` = a.`guid` WHERE c.`map` = 1460;
|
||||
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200017,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200022,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200023,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200026,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200027,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200032,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200035,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200037,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200038,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200041,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200042,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200043,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200044,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200045,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200046,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200047,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200048,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200049,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200050,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200051,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200052,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200053,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200054,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200055,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200058,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200059,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200060,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200061,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200062,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200063,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200064,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200065,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200067,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200069,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200071,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200072,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200073,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200075,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200077,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200078,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200083,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200085,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200086,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200087,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200088,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200090,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200091,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200094,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200095,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200109,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200115,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200117,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200119,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200120,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200121,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200122,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200123,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200124,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200125,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200126,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200127,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200128,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200129,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200130,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200131,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200132,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200133,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200134,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200135,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200136,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200137,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200138,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200139,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200145,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200156,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200164,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200167,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200168,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200169,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200186,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200223,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200224,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200225,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200226,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200227,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200228,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200229,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200230,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200231,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200232,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200233,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200234,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200235,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200236,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200237,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200238,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200239,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200240,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200241,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200242,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200243,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200244,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200245,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200246,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200247,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200248,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200249,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200295,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200322,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200323,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200324,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200325,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200326,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200327,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200328,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200330,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200331,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200332,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200333,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200334,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200335,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200336,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200337,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200338,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200339,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200340,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200341,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200342,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200343,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200344,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200345,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200346,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200347,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200348,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200349,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200350,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200351,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200352,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200353,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200354,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200355,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200356,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200357,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200359,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200363,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200364,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200365,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200366,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200367,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200368,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200369,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200370,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200371,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200372,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200373,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200374,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200375,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200376,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200377,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200378,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200379,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200380,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200381,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200382,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200383,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200402,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200403,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200404,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200405,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200406,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200407,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200408,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200409,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200410,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200411,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200412,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200413,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200414,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200415,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200416,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200417,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200418,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200420,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200421,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200422,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200423,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200424,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200425,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200426,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200427,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200428,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200429,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200430,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200433,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200434,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200435,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200436,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200443,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200444,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200526,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200527,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200528,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200573,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200599,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200632,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200642,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200644,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200645,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200646,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200647,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200648,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200649,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200650,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200651,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200652,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200653,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200654,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200655,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200656,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200657,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200658,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200664,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200665,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200666,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200667,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200668,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200669,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200670,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200671,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200672,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200673,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200674,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200675,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200677,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200678,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200679,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200680,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200681,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200682,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200683,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200685,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200690,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200714,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200716,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200717,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200718,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200720,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200722,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200725,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200731,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200733,0,0,0,1,0,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200734,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200742,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200743,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200744,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200745,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200746,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200747,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200748,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200749,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200750,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200751,0,0,0,1,333,0,0,0,0,"");
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`aiAnimKit`,`movementAnimKit`,`meleeAnimKit`,`visibilityDistanceType`,`auras`) VALUES (290200752,0,0,0,1,333,0,0,0,0,"");
|
||||
@@ -0,0 +1,42 @@
|
||||
-- =====================================================================
|
||||
-- Rivage brisé (carte 1460) — retrait du drapeau UNIT_FLAG2_UNK5
|
||||
--
|
||||
-- Signalé en jeu : « les démons invoqués c'est ok mais pas les autres au
|
||||
-- fond », puis « les fameux démons inattaquables se battent avec les
|
||||
-- démons attaquables ». Nommément : Gangreseigneur Rakkan, Légionnaire
|
||||
-- gangregarde, Molosse de l'effroi gangrené.
|
||||
--
|
||||
-- LA CAUSE, et elle est de mon fait
|
||||
-- La transposition des modèles depuis le dump de référence a importé
|
||||
-- `unit_flags2` sur 147 entrées. Ces trois-là valaient 0 avant ; elles
|
||||
-- ont reçu 2097152, soit 0x200000 — UNIT_FLAG2_UNK5 dans notre cœur.
|
||||
--
|
||||
-- CE QUI REND CE DRAPEAU PARTICULIER : notre serveur l'IGNORE
|
||||
-- totalement. Aucune de ses vérifications ne le consulte. Mais le client,
|
||||
-- lui, l'interprète et refuse de désigner la créature comme cible.
|
||||
--
|
||||
-- C'est ce qui explique le symptôme le plus déroutant de la série : une
|
||||
-- sonde posée dans `Unit::_IsValidAttackTarget` n'a JAMAIS produit la
|
||||
-- moindre ligne pour ces créatures. Le client refusait de lui-même, sans
|
||||
-- jamais interroger le serveur. L'absence de trace était l'information.
|
||||
--
|
||||
-- LA CORRÉLATION QUI TRANCHE
|
||||
-- démons INVOQUÉS par le script (attaquables) : unit_flags2 = 0
|
||||
-- démons STATIQUES (bloqués) : bit 0x200000 présent
|
||||
-- 67 entrées, 420 spawns concernés
|
||||
--
|
||||
-- On retire UNIQUEMENT ce bit, en préservant le reste de la colonne.
|
||||
-- Le serveur ne s'en sert pas : ce retrait ne peut rien casser côté
|
||||
-- logique, il lève seulement le refus du client.
|
||||
--
|
||||
-- Retour arrière : chantiers/rivage_brise/retour_unk5_1460.sql
|
||||
-- =====================================================================
|
||||
|
||||
UPDATE `creature_template` ct
|
||||
JOIN (SELECT DISTINCT c.id
|
||||
FROM creature c
|
||||
JOIN creature_template t ON t.entry = c.id
|
||||
WHERE c.map = 1460
|
||||
AND (t.unit_flags2 & 2097152)) AS cible
|
||||
ON cible.id = ct.entry
|
||||
SET ct.unit_flags2 = ct.unit_flags2 & ~2097152;
|
||||
@@ -0,0 +1,34 @@
|
||||
# Русская локализация Legion 7.3.5
|
||||
|
||||
Пакет добавляет 37 773 отсутствующие строки `ruRU` в таблицу
|
||||
`broadcast_text_locale`. Переводы взяты из ветки `legion` проекта
|
||||
AshamaneCore и адаптированы к текущей схеме SylvaniaCore:
|
||||
|
||||
- `MaleText_lang` → `Text_lang`
|
||||
- `FemaleText_lang` → `Text1_lang`
|
||||
|
||||
Файлы используют `INSERT IGNORE`: уже существующие строки не изменяются.
|
||||
Импортировать их нужно по порядку в базу `hotfixes`:
|
||||
|
||||
```bash
|
||||
set -a
|
||||
. ./.env
|
||||
set +a
|
||||
|
||||
for file in sql/translations/ruRU/broadcast_text_locale_ruRU_part_*.sql; do
|
||||
docker compose exec -T database \
|
||||
mariadb --binary-mode -uroot "-p${DB_ROOT_PASSWORD}" hotfixes < "$file"
|
||||
done
|
||||
```
|
||||
|
||||
После импорта перезапустите игровой сервер:
|
||||
|
||||
```bash
|
||||
docker compose restart worldserver
|
||||
```
|
||||
|
||||
Перед установкой на рабочий сервер рекомендуется сделать резервную копию БД.
|
||||
|
||||
Таблицы `creature_template_locale`, `quest_template_locale` и
|
||||
`quest_objectives_locale` уже содержат все русские строки из указанного
|
||||
источника, поэтому для них SQL-дельта не требуется.
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,9 @@
|
||||
-- Production realm defaults. Docker startup keeps these values synchronized
|
||||
-- from REALM_NAME, REALM_ADDRESS and REALM_PORT after this migration runs.
|
||||
UPDATE `realmlist`
|
||||
SET `name` = 'FelWell',
|
||||
`address` = 'legion.moon-well.online',
|
||||
`localAddress` = 'legion.moon-well.online',
|
||||
`port` = 8086,
|
||||
`gamebuild` = 26972
|
||||
WHERE `id` = 1;
|
||||
@@ -0,0 +1,27 @@
|
||||
-- Objet 133995 "Recette du breuvage des tempetes" : enregistrement DB2 custom.
|
||||
--
|
||||
-- La quete 41039 "Un savoir vole" (Suramar) exige cet objet, lache par Morjirn (102852).
|
||||
-- L'objet existe dans Item.db2 mais PAS dans ItemSparse.db2 : le core ne construit un
|
||||
-- ItemTemplate que si les deux sont presents (ObjectMgr::LoadItemTemplates), donc le
|
||||
-- serveur l'ignorait et rejetait toute ligne de butin le referencant :
|
||||
-- Table 'creature_loot_template' Entry 102852 Item 133995: item entry not listed
|
||||
-- in `item_template` - skipped
|
||||
-- Verifie : 104 011 ItemTemplate charges pour 103 967 enregistrements ItemSparse, donc
|
||||
-- le fichier est bien lu en entier et l'objet en est reellement absent.
|
||||
--
|
||||
-- Methode : ligne dans la table miroir + ligne hotfix_data (sans quoi l'enregistrement
|
||||
-- n'existerait que cote serveur) + bump de HotfixCacheVersion pour invalider le cache
|
||||
-- ADB des clients. TableHash d'ItemSparse.db2 = 0x919BE54E, lu a l'offset 20 de l'en-tete WDC1.
|
||||
--
|
||||
-- Nom en francais dans la colonne de base : le serveur ne sert que la locale enUS
|
||||
-- (DBC.Locale = 0), donc item_sparse_locale ne serait jamais consulte. Le libelle reprend
|
||||
-- celui de l'objectif de quete traduit : "Recette du breuvage des tempetes".
|
||||
|
||||
DELETE FROM `item_sparse` WHERE `ID` = 133995;
|
||||
INSERT INTO `item_sparse`
|
||||
(`ID`,`AllowableRace`,`AllowableClass`,`Display`,`OverallQualityID`,`ItemLevel`,`Stackable`,`MaxCount`,`Bonding`,`ExpansionID`,`VerifiedBuild`)
|
||||
VALUES
|
||||
(133995, -1, -1, 'Recette du breuvage des tempêtes', 1, 1, 1, 1, 4, 6, 0);
|
||||
|
||||
DELETE FROM `hotfix_data` WHERE `TableHash` = 2442913102 AND `RecordId` = 133995;
|
||||
INSERT INTO `hotfix_data` (`Id`,`TableHash`,`RecordId`,`Deleted`) VALUES (391, 2442913102, 133995, 0);
|
||||
@@ -0,0 +1,25 @@
|
||||
-- Quete 36382 "Coup d'oeil dans le portail" (Horde) : tout le cote Horde manquait.
|
||||
--
|
||||
-- Signalement joueur : impossible d'utiliser le telescope, et l'eclaireuse a cote attaque.
|
||||
-- Cause : Scout Pazaztick (85249) et le telescope Horde (234619) n'ont AUCUN spawn en base.
|
||||
-- Seule la paire Alliance existe (Scout Pazerp 85212 + telescope 234576, map 1190 area 6963).
|
||||
-- Un joueur Horde qui prend la quete chez Rokhan arrive donc sur la paire Alliance :
|
||||
-- - le telescope 234576 ne valide que l'objectif de la quete 36379 (Alliance) ;
|
||||
-- - Scout Pazerp est en faction 84 (Hurlevent), donc hostile a la Horde et elle agresse.
|
||||
-- Sur les royaumes officiels les deux paires cohabitent au meme endroit, separees par phasing.
|
||||
-- La zone (map 1190) n'a aucun phasing chez nous : on partage donc le telescope existant.
|
||||
|
||||
-- 1) Les deux eclaireuses deviennent neutres. Ce sont des PNJ decoratifs (npcflag 0,
|
||||
-- aucun gossip, aucun role de combat) : leur faction ne sert qu'a les faire agresser.
|
||||
UPDATE `creature_template` SET `faction` = 35 WHERE `entry` IN (85212, 85249);
|
||||
|
||||
-- 2) Le telescope deja spawne sert aux deux factions.
|
||||
-- Data1 = quete requise pour valider le goober : a 36379 il bloquait tout joueur Horde.
|
||||
UPDATE `gameobject_template` SET `Data1` = 0 WHERE `entry` = 234576;
|
||||
UPDATE `quest_objectives` SET `ObjectID` = 234576 WHERE `ID` = 274669 AND `QuestID` = 36382;
|
||||
|
||||
-- 3) Scout Pazaztick est spawnee a cote de Scout Pazerp (le journal de quete demande de la
|
||||
-- trouver ; elle ne porte aucun objectif, c'est le telescope qui valide).
|
||||
DELETE FROM `creature` WHERE `guid` = 290200757;
|
||||
INSERT INTO `creature` (`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnDifficulties`,`phaseUseFlags`,`PhaseId`,`PhaseGroup`,`terrainSwapMap`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`unit_flags2`,`unit_flags3`,`dynamicflags`,`ScriptName`,`movementmode`,`VerifiedBuild`) VALUES
|
||||
(290200757, 85249, 1190, 4, 6963, '0', 0, 0, 0, -1, 0, 0, -11474.94, -3450.80, 32.7659, 2.03782, 120, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, '', 0, 0);
|
||||
@@ -0,0 +1,13 @@
|
||||
-- Retour dans un fief deja fonde.
|
||||
--
|
||||
-- Les deux points d'entree du fief WoD ne se declenchent que si le joueur n'a
|
||||
-- PAS encore de fief : l'objet Master Surveyor (233664, Horde) et Baros
|
||||
-- Alexston (79243, Alliance). Une fois le fief fonde, plus rien ne permettait
|
||||
-- d'y entrer. Les trois joueurs du royaume qui possedent un fief ne sont
|
||||
-- jamais alles dessus (aucun personnage n'a jamais ete sur les cartes 1152,
|
||||
-- 1153, 1158, 1159, 1330 ni 1331).
|
||||
--
|
||||
-- Gazlowe (78466) recoit donc un script qui propose "Emmenez-moi a mon fief"
|
||||
-- aux proprietaires. Il est aussi spawne DANS les fiefs (cartes 1152, 1153,
|
||||
-- 1330) : le script n'y propose rien, il teste Map::IsGarrison().
|
||||
UPDATE `creature_template` SET `ScriptName` = 'npc_gazlowe_garrison' WHERE `entry` = 78466;
|
||||
@@ -0,0 +1,76 @@
|
||||
-- Butin manquant : mobs des quetes d'acces a Draenor (Terres foudroyees 6.0 + Tanaan).
|
||||
--
|
||||
-- Signalement joueur du 05/09/2026 : "les mobs lachent rien comme loot".
|
||||
-- 26 especes hostiles de ces deux zones avaient lootid = 0, soit aucun butin du tout,
|
||||
-- alors que leurs voisines immediates (Fourrageur, Legionnaire, Pillard...) ont la leur.
|
||||
--
|
||||
-- Taux releves un par un sur Wowhead (page rendue puis donnees Listview, methode validee
|
||||
-- en recoupant deux PNJ dont les chiffres avaient d'abord ete lus a l'ecran).
|
||||
-- Les objets post-Legion listes par Wowhead (Besaces et Potions mysterieuses, ids 235xxx
|
||||
-- et 236xxx) sont volontairement ecartes : ils n'existent pas dans notre version.
|
||||
--
|
||||
-- 9 des 26 especes n'ont legitimement aucun butin sur Wowhead non plus et ne sont pas
|
||||
-- touchees : Ame tourmentee (82647), Loup du Vide (82373), Demolisseur de fer (82298),
|
||||
-- Gronnling de fer (82484), Lieutenant Asalra (76448), Keli'dan le Briseur (79702),
|
||||
-- Ankova la Dechue (79593), Bagarreur de la Main brisee (82057), et le Sauvage Ombresanglante
|
||||
-- (78820), dont le seul objet liste (110444) n'est rattache a aucune quete chez nous.
|
||||
|
||||
DELETE FROM `creature_loot_template` WHERE `Entry` IN (76556,76886,78345,78489,78674,78348,78670,77653,82774,77767,76651,78488,77790,77771,77845,78696,82451);
|
||||
INSERT INTO `creature_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(76556,112463,0,76.6200,0,1,0,1,1,'Ironmarch Grunt'),
|
||||
(76556,112684,0,31.1900,0,1,0,1,1,'Ironmarch Grunt'),
|
||||
(76556,118675,0,0.4100,0,1,0,1,1,'Ironmarch Grunt'),
|
||||
(76886,112463,0,76.8200,0,1,0,1,1,'Ironmarch Scout'),
|
||||
(76886,112684,0,30.5500,0,1,0,1,1,'Ironmarch Scout'),
|
||||
(76886,118675,0,0.3100,0,1,0,1,1,'Ironmarch Scout'),
|
||||
(78345,112463,0,77.6600,0,1,0,1,1,'Dreadmaul Crusher'),
|
||||
(78345,112684,0,29.1100,0,1,0,1,1,'Dreadmaul Crusher'),
|
||||
(78345,81194,0,0.7700,0,1,0,1,1,'Dreadmaul Crusher'),
|
||||
(78345,118675,0,0.2300,0,1,0,1,1,'Dreadmaul Crusher'),
|
||||
(78345,81212,0,0.0200,0,1,0,1,1,'Dreadmaul Crusher'),
|
||||
(78489,81194,0,94.0100,0,1,0,1,1,'Snickerfang Pup'),
|
||||
(78489,81212,0,6.0000,0,1,0,1,1,'Snickerfang Pup'),
|
||||
(78489,112463,0,0.2000,0,1,0,1,1,'Snickerfang Pup'),
|
||||
(78674,112463,0,99.7200,0,1,0,1,1,'Ironmarch Scorcher'),
|
||||
(78674,112684,0,37.2400,0,1,0,1,1,'Ironmarch Scorcher'),
|
||||
(78674,44754,0,0.0300,0,1,0,1,1,'Ironmarch Scorcher'),
|
||||
(78674,118675,0,0.0200,0,1,0,1,1,'Ironmarch Scorcher'),
|
||||
(78348,112463,0,76.2600,0,1,0,1,1,'Dreadmaul Flamebelcher'),
|
||||
(78348,112684,0,32.1200,0,1,0,1,1,'Dreadmaul Flamebelcher'),
|
||||
(78348,118675,0,0.1700,0,1,0,1,1,'Dreadmaul Flamebelcher'),
|
||||
(78348,81212,0,0.0600,0,1,0,1,1,'Dreadmaul Flamebelcher'),
|
||||
(78670,112463,0,99.7500,0,1,0,1,1,'Ironmarch Warcaster'),
|
||||
(78670,112684,0,38.0700,0,1,0,1,1,'Ironmarch Warcaster'),
|
||||
(78670,118675,0,0.2300,0,1,0,1,1,'Ironmarch Warcaster'),
|
||||
(77653,112463,0,75.1500,0,1,0,1,1,'Ironmarch Warsmith'),
|
||||
(77653,112684,0,31.4200,0,1,0,1,1,'Ironmarch Warsmith'),
|
||||
(77653,118675,0,0.2600,0,1,0,1,1,'Ironmarch Warsmith'),
|
||||
(82774,112463,0,76.6000,0,1,0,1,1,'Ironmarch Executioner'),
|
||||
(82774,112684,0,31.0100,0,1,0,1,1,'Ironmarch Executioner'),
|
||||
(82774,118675,0,0.2400,0,1,0,1,1,'Ironmarch Executioner'),
|
||||
(82774,2295,0,0.0400,0,1,0,1,1,'Ironmarch Executioner'),
|
||||
(82774,10593,0,0.0100,0,1,0,1,1,'Ironmarch Executioner'),
|
||||
(77767,112463,0,77.9300,0,1,0,1,1,'Ironmarch Shaman'),
|
||||
(77767,112684,0,29.9700,0,1,0,1,1,'Ironmarch Shaman'),
|
||||
(77767,118675,0,0.2200,0,1,0,1,1,'Ironmarch Shaman'),
|
||||
(76651,112463,0,78.8100,0,1,0,1,1,'Ironmarch Leadspitter'),
|
||||
(76651,112684,0,28.9600,0,1,0,1,1,'Ironmarch Leadspitter'),
|
||||
(78488,112463,0,74.4000,0,1,0,1,1,'Dreadmaul Packmaster'),
|
||||
(78488,112684,0,30.9600,0,1,0,1,1,'Dreadmaul Packmaster'),
|
||||
(78488,81194,0,3.9900,0,1,0,1,1,'Dreadmaul Packmaster'),
|
||||
(78488,81212,0,1.8800,0,1,0,1,1,'Dreadmaul Packmaster'),
|
||||
(78488,118675,0,0.2200,0,1,0,1,1,'Dreadmaul Packmaster'),
|
||||
(77790,112463,0,77.4700,0,1,0,1,1,'Ironmarch Raider'),
|
||||
(77790,112684,0,31.6200,0,1,0,1,1,'Ironmarch Raider'),
|
||||
(77771,112463,0,77.4700,0,1,0,1,1,'Dreadmaul Destroyer'),
|
||||
(77771,112684,0,28.6900,0,1,0,1,1,'Dreadmaul Destroyer'),
|
||||
(77845,106870,0,88.0300,0,1,0,1,1,'Ironmarch War Wolf'),
|
||||
(77845,106889,0,9.7600,0,1,0,1,1,'Ironmarch War Wolf'),
|
||||
(77845,106873,0,2.0200,0,1,0,1,1,'Ironmarch War Wolf'),
|
||||
(78696,112463,0,99.4700,0,1,0,1,1,'Ironmarch Champion'),
|
||||
(78696,112684,0,41.2500,0,1,0,1,1,'Ironmarch Champion'),
|
||||
(82451,112463,0,99.6100,0,1,0,1,1,'Toothsmash the Annihilator'),
|
||||
(82451,112684,0,38.3200,0,1,0,1,1,'Toothsmash the Annihilator');
|
||||
|
||||
UPDATE `creature_template` SET `lootid` = `entry` WHERE `entry` IN (76556,76886,78345,78489,78674,78348,78670,77653,82774,77767,76651,78488,77790,77771,77845,78696,82451);
|
||||
@@ -0,0 +1,83 @@
|
||||
-- Butin manquant : suite du Draenor (carte 1116), apres les zones d'acces.
|
||||
--
|
||||
-- 245 especes hostiles avaient lootid = 0. Relevees une par une sur Wowhead avec
|
||||
-- controle du statut HTTP 200 et du marqueur g_npcs de la fiche : sans ce controle,
|
||||
-- une page de refus 403 se lit exactement comme un PNJ sans butin (8 refus rencontres).
|
||||
--
|
||||
-- Resultat : 222 des 245 n'ont effectivement aucun butin sur les royaumes officiels
|
||||
-- non plus (decors, critters, PNJ scenarises, envahisseurs de fief). 8 autres n'ont
|
||||
-- que des objets post-Legion, absents de notre Item.db2. Restent 15 especes.
|
||||
--
|
||||
-- Les materiaux type Fourrure somptueuse (111557) sont bien du butin de cadavre ici :
|
||||
-- ils apparaissent 196 fois dans creature_loot_template et jamais dans skinning_loot_template.
|
||||
|
||||
DELETE FROM `creature_loot_template` WHERE `Entry` IN (73227,73805,74414,76663,76686,77091,77522,78458,78662,78665,78700,80192,82515,82728,86443);
|
||||
INSERT INTO `creature_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(73227,106870,0,3.1100,0,1,0,1,1,'Wastes Rockworm'),
|
||||
(73227,106875,0,0.1400,0,1,0,1,1,'Wastes Rockworm'),
|
||||
(73227,106877,0,0.0900,0,1,0,1,1,'Wastes Rockworm'),
|
||||
(73227,109131,0,0.7000,0,1,0,1,1,'Wastes Rockworm'),
|
||||
(73227,111557,0,1.1200,0,1,0,1,1,'Wastes Rockworm'),
|
||||
(73805,107528,0,1.6200,0,1,0,1,1,'Corrupted Toad'),
|
||||
(73805,108906,0,0.8400,0,1,0,1,1,'Corrupted Toad'),
|
||||
(73805,111557,0,0.1700,0,1,0,1,1,'Corrupted Toad'),
|
||||
(73805,116703,0,0.8400,0,1,0,1,1,'Corrupted Toad'),
|
||||
(74414,106297,0,0.5200,0,1,0,1,1,'Juvenile Bonestripper'),
|
||||
(74414,106317,0,1.2200,0,1,0,1,1,'Juvenile Bonestripper'),
|
||||
(74414,107603,0,3.6700,0,1,0,1,1,'Juvenile Bonestripper'),
|
||||
(76663,113000,0,4.6200,0,1,0,1,1,'Shadow Infiltrator'),
|
||||
(76663,113006,0,33.8500,0,1,0,1,1,'Shadow Infiltrator'),
|
||||
(76663,113007,0,9.2300,0,1,0,1,1,'Shadow Infiltrator'),
|
||||
(76686,112995,0,6.5200,0,1,0,1,1,'Shadow Pillager'),
|
||||
(76686,113004,0,13.0400,0,1,0,1,1,'Shadow Pillager'),
|
||||
(76686,113007,0,6.5200,0,1,0,1,1,'Shadow Pillager'),
|
||||
(77091,106825,0,15.3800,0,1,0,1,1,'Wild Rylak'),
|
||||
(77091,107528,0,76.9200,0,1,0,1,1,'Wild Rylak'),
|
||||
(77091,109133,0,46.1500,0,1,0,1,1,'Wild Rylak'),
|
||||
(77091,111557,0,38.4600,0,1,0,1,1,'Wild Rylak'),
|
||||
(77522,106291,0,1.9500,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106298,0,0.3500,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106301,0,0.8900,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106302,0,0.1800,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106312,0,1.9500,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106322,0,0.8900,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106323,0,0.1800,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106324,0,1.0600,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106489,0,0.8900,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106540,0,0.1800,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106556,0,0.1800,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106574,0,0.4100,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106581,0,0.1800,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106583,0,0.3500,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,106870,0,1.6500,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,111364,0,1.1200,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,111387,0,0.4100,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,111557,0,0.3500,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,113295,0,0.3500,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,113478,0,1.1200,0,1,0,1,1,'Gul''var Peon'),
|
||||
(77522,116709,0,0.3500,0,1,0,1,1,'Gul''var Peon'),
|
||||
(78458,106867,0,8.4500,0,1,0,1,1,'Abyssal Invader'),
|
||||
(78458,116122,0,16.4300,0,1,0,1,1,'Abyssal Invader'),
|
||||
(78662,106459,0,22.7300,0,1,0,1,1,'Thunderlord Cutter'),
|
||||
(78662,107603,0,4.5500,0,1,0,1,1,'Thunderlord Cutter'),
|
||||
(78665,106304,0,1.9600,0,1,0,1,1,'Thunderlord Shaman'),
|
||||
(78665,106472,0,1.9600,0,1,0,1,1,'Thunderlord Shaman'),
|
||||
(78665,106876,0,5.8800,0,1,0,1,1,'Thunderlord Shaman'),
|
||||
(78665,113381,0,4.5800,0,1,0,1,1,'Thunderlord Shaman'),
|
||||
(78700,106295,0,2.1300,0,1,0,1,1,'Thunderlord Provisioner'),
|
||||
(78700,106464,0,23.4000,0,1,0,1,1,'Thunderlord Provisioner'),
|
||||
(80192,111953,0,4.5000,0,1,0,1,1,'Icecave Bat'),
|
||||
(82515,106824,0,27.7400,0,1,0,1,1,'Darktalon Hatchling'),
|
||||
(82515,106825,0,18.0600,0,1,0,1,1,'Darktalon Hatchling'),
|
||||
(82728,106870,0,33.2800,0,1,0,1,1,'Agitated Piglet'),
|
||||
(82728,107517,0,13.5500,0,1,0,1,1,'Agitated Piglet'),
|
||||
(82728,108977,0,18.1800,0,1,0,1,1,'Agitated Piglet'),
|
||||
(82728,109136,0,19.7300,0,1,0,1,1,'Agitated Piglet'),
|
||||
(82728,111557,0,13.8900,0,1,0,1,1,'Agitated Piglet'),
|
||||
(82728,118200,0,3.6000,0,1,0,1,1,'Agitated Piglet'),
|
||||
(82728,118281,0,1.0300,0,1,0,1,1,'Agitated Piglet'),
|
||||
(86443,106315,0,2.1300,0,1,0,1,1,'Ogron Pitfighter'),
|
||||
(86443,106735,0,6.3800,0,1,0,1,1,'Ogron Pitfighter');
|
||||
|
||||
UPDATE `creature_template` SET `lootid` = `entry` WHERE `entry` IN (73227,73805,74414,76663,76686,77091,77522,78458,78662,78665,78700,80192,82515,82728,86443);
|
||||
@@ -0,0 +1,260 @@
|
||||
-- Butin manquant : Iles Brisees (carte 1220).
|
||||
--
|
||||
-- 102 especes hostiles avaient lootid = 0 (filtre affine : HealthModifier >= 1, qui
|
||||
-- ecarte les decors et critters ; sans lui le comptage brut donnait 124 especes).
|
||||
-- Relevees sur Wowhead avec controle du statut HTTP 200 et du marqueur g_npcs.
|
||||
--
|
||||
-- Wowhead agrege le jeu MODERNE : ces PNJ existent toujours et lachent des objets
|
||||
-- d extensions posterieures. Sur 3727 lignes brutes relevees, seules 235 survivent
|
||||
-- a trois filtres : objet present dans notre Item.db2, taux >= 1 pour cent, et objet
|
||||
-- deja utilise comme butin de cadavre ailleurs dans nos tables.
|
||||
--
|
||||
-- Ce dernier filtre ecarte deux categories a risque : les materiaux a dominante
|
||||
-- depecage (124113 Cuir de rochepeau, 124115, 129888, 129903, 134808) qui relevent
|
||||
-- de skinning_loot_template, et les objets de quete jamais utilises chez nous
|
||||
-- (147356 Balise de Sentinax brisee, 146684, 133995, 144362, 147396, 142079...) qui
|
||||
-- exigeraient QuestRequired = 1 et une quete correspondante.
|
||||
--
|
||||
-- Objet dominant cote humanoides : 124437 Soie shal'dorei, a environ 50 pour cent.
|
||||
-- C'est l'equivalent Legion des Fragments d'armure abimes du Draenor.
|
||||
|
||||
DELETE FROM `creature_loot_template` WHERE `Entry` IN (98805,102106,106798,109702,110346,111454,111463,111632,111638,111674,111821,111823,113388,115054,115431,115434,115601,115646,115648,116427,116466,116468,116469,116470,116472,118264,118294,118657,118660,118679,118680,118683,118943,119139,120342);
|
||||
INSERT INTO `creature_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(98805,124437,0,48.1200,0,1,0,1,1,'Vilewing Hexer'),
|
||||
(98805,121075,0,2.5100,0,1,0,1,1,'Vilewing Hexer'),
|
||||
(98805,121336,0,1.6700,0,1,0,1,1,'Vilewing Hexer'),
|
||||
(98805,121344,0,1.6700,0,1,0,1,1,'Vilewing Hexer'),
|
||||
(98805,121340,0,1.2600,0,1,0,1,1,'Vilewing Hexer'),
|
||||
(98805,138781,0,1.2600,0,1,0,1,1,'Vilewing Hexer'),
|
||||
(102106,132184,0,72.1500,0,1,0,1,1,'Starving Basilisk'),
|
||||
(102106,132183,0,21.8700,0,1,0,1,1,'Starving Basilisk'),
|
||||
(102106,124439,0,5.5700,0,1,0,1,1,'Starving Basilisk'),
|
||||
(102106,132190,0,3.8300,0,1,0,1,1,'Starving Basilisk'),
|
||||
(102106,124438,0,2.1300,0,1,0,1,1,'Starving Basilisk'),
|
||||
(106798,140220,0,10.4200,0,1,0,1,1,'Nora Blackfire'),
|
||||
(106798,138781,0,5.2100,0,1,0,1,1,'Nora Blackfire'),
|
||||
(106798,141031,0,2.0800,0,1,0,1,1,'Nora Blackfire'),
|
||||
(106798,147430,0,1.0400,0,1,0,1,1,'Nora Blackfire'),
|
||||
(109702,132183,0,60.7700,0,1,0,1,1,'Deepclaw'),
|
||||
(109702,132190,0,23.8900,0,1,0,1,1,'Deepclaw'),
|
||||
(109702,138839,0,17.5800,0,1,0,1,1,'Deepclaw'),
|
||||
(109702,132184,0,14.3600,0,1,0,1,1,'Deepclaw'),
|
||||
(109702,121054,0,3.1100,0,1,0,1,1,'Deepclaw'),
|
||||
(110346,138839,0,17.6200,0,1,0,1,1,'Aodh Witherpetal'),
|
||||
(110346,121215,0,4.3400,0,1,0,1,1,'Aodh Witherpetal'),
|
||||
(110346,121355,0,3.3300,0,1,0,1,1,'Aodh Witherpetal'),
|
||||
(110346,121347,0,1.3900,0,1,0,1,1,'Aodh Witherpetal'),
|
||||
(110346,121168,0,1.0900,0,1,0,1,1,'Aodh Witherpetal'),
|
||||
(110346,121335,0,1.0800,0,1,0,1,1,'Aodh Witherpetal'),
|
||||
(110346,121173,0,1.0600,0,1,0,1,1,'Aodh Witherpetal'),
|
||||
(111454,132183,0,63.7400,0,1,0,1,1,'Bestrix'),
|
||||
(111454,138839,0,20.4200,0,1,0,1,1,'Bestrix'),
|
||||
(111454,132190,0,18.8900,0,1,0,1,1,'Bestrix'),
|
||||
(111454,132184,0,12.4300,0,1,0,1,1,'Bestrix'),
|
||||
(111463,68055,0,100.0000,0,1,0,1,1,'Bulvinkel'),
|
||||
(111632,121006,0,19.9100,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,124437,0,13.4200,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121040,0,6.0400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121339,0,3.8000,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,141284,0,3.5800,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121003,0,3.3600,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121360,0,2.6800,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121365,0,2.6800,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121333,0,2.2400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121372,0,2.2400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121373,0,2.2400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121028,0,2.0100,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121354,0,2.0100,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121362,0,1.7900,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121371,0,1.7900,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121020,0,1.5700,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121045,0,1.5700,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121336,0,1.5700,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121340,0,1.5700,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121353,0,1.5700,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121404,0,1.5700,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,139520,0,1.5700,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121052,0,1.3400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121331,0,1.3400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121338,0,1.3400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121351,0,1.3400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121368,0,1.3400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,141285,0,1.3400,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121008,0,1.1200,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121019,0,1.1200,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121055,0,1.1200,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121347,0,1.1200,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111632,121366,0,1.1200,0,1,0,1,1,'Hatecoil Crusher'),
|
||||
(111638,124437,0,52.2500,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,141284,0,9.7500,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,121001,0,4.4700,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,121347,0,4.4600,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,141285,0,2.4300,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,121016,0,2.3900,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,121022,0,2.2200,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,132183,0,2.2000,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,138781,0,1.7300,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,121335,0,1.4200,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,121360,0,1.3600,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111638,121334,0,1.0200,0,1,0,1,1,'Hatecoil Stormweaver'),
|
||||
(111674,132231,0,36.3100,0,1,0,1,1,'Cinderwing'),
|
||||
(111674,132199,0,31.7900,0,1,0,1,1,'Cinderwing'),
|
||||
(111674,132197,0,31.4100,0,1,0,1,1,'Cinderwing'),
|
||||
(111674,138839,0,22.1700,0,1,0,1,1,'Cinderwing'),
|
||||
(111674,121331,0,2.8700,0,1,0,1,1,'Cinderwing'),
|
||||
(111821,124437,0,37.3900,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,140227,0,5.9100,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121351,0,5.7000,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121344,0,2.9200,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121347,0,2.7100,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121371,0,2.7100,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121336,0,1.7400,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121350,0,1.6700,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121340,0,1.6000,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121337,0,1.5300,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121352,0,1.4600,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,132199,0,1.4600,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121005,0,1.3900,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121338,0,1.3900,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121050,0,1.1800,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111821,121364,0,1.0400,0,1,0,1,1,'Felsworn Adept'),
|
||||
(111823,124437,0,66.1700,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121027,0,4.3300,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121352,0,3.0100,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,138781,0,2.3800,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121332,0,2.2700,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121346,0,1.8300,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121040,0,1.8000,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121022,0,1.3600,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121369,0,1.3600,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121349,0,1.3200,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121004,0,1.2800,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121047,0,1.2800,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121368,0,1.2800,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,121358,0,1.2500,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(111823,140222,0,1.2500,0,1,0,1,1,'Felsworn Betrayer'),
|
||||
(113388,124437,0,42.7900,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,138781,0,29.1800,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121349,0,4.7400,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121345,0,2.0700,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121358,0,1.5600,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121028,0,1.5400,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121373,0,1.5400,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,140221,0,1.5100,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121343,0,1.4400,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121021,0,1.3900,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121008,0,1.3700,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121040,0,1.3700,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121347,0,1.3700,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(113388,121342,0,1.2600,0,1,0,1,1,'Squigglefin Crablord'),
|
||||
(115054,132204,0,74.1600,0,1,0,1,1,'Wyrmtongue Scavenger'),
|
||||
(115054,132199,0,21.5200,0,1,0,1,1,'Wyrmtongue Scavenger'),
|
||||
(115054,124437,0,10.7300,0,1,0,1,1,'Wyrmtongue Scavenger'),
|
||||
(115054,132200,0,3.6800,0,1,0,1,1,'Wyrmtongue Scavenger'),
|
||||
(115431,132184,0,79.3300,0,1,0,1,1,'Savage Great White'),
|
||||
(115431,132183,0,18.1800,0,1,0,1,1,'Savage Great White'),
|
||||
(115431,124439,0,6.8400,0,1,0,1,1,'Savage Great White'),
|
||||
(115431,132182,0,2.4900,0,1,0,1,1,'Savage Great White'),
|
||||
(115434,132184,0,74.6600,0,1,0,1,1,'Isle Hammerhead'),
|
||||
(115434,132183,0,13.4900,0,1,0,1,1,'Isle Hammerhead'),
|
||||
(115434,132182,0,11.7600,0,1,0,1,1,'Isle Hammerhead'),
|
||||
(115434,124439,0,6.0300,0,1,0,1,1,'Isle Hammerhead'),
|
||||
(115601,132231,0,78.3300,0,1,0,1,1,'Infernal Hound'),
|
||||
(115601,132199,0,16.5500,0,1,0,1,1,'Infernal Hound'),
|
||||
(115601,132197,0,5.0300,0,1,0,1,1,'Infernal Hound'),
|
||||
(115646,132204,0,73.2000,0,1,0,1,1,'Felfire Tormentor'),
|
||||
(115646,132199,0,21.0900,0,1,0,1,1,'Felfire Tormentor'),
|
||||
(115646,124437,0,8.7900,0,1,0,1,1,'Felfire Tormentor'),
|
||||
(115646,132200,0,5.6200,0,1,0,1,1,'Felfire Tormentor'),
|
||||
(115646,138781,0,1.1300,0,1,0,1,1,'Felfire Tormentor'),
|
||||
(115648,132204,0,75.9500,0,1,0,1,1,'Azrok the Torturer'),
|
||||
(115648,132199,0,21.6800,0,1,0,1,1,'Azrok the Torturer'),
|
||||
(115648,124437,0,9.9300,0,1,0,1,1,'Azrok the Torturer'),
|
||||
(115648,132200,0,2.3400,0,1,0,1,1,'Azrok the Torturer'),
|
||||
(116427,124437,0,50.6500,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116427,121358,0,2.9200,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116466,124437,0,49.3400,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116466,121343,0,2.7400,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116466,121367,0,2.3400,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116466,121335,0,2.0000,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116466,121354,0,1.9100,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116466,121370,0,1.3200,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116466,121356,0,1.1000,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116466,138781,0,1.0500,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116468,124437,0,59.8700,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116468,140227,0,1.8200,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116468,121358,0,1.7800,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116468,138781,0,1.4800,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116468,121344,0,1.3600,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116468,121339,0,1.3200,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,124437,0,54.5000,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,121341,0,6.1700,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,121367,0,3.0400,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,121335,0,2.7900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,121360,0,2.0700,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,144345,0,1.5500,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,121355,0,1.4000,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,140227,0,1.2500,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116469,138781,0,1.2300,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116470,124437,0,51.8200,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116470,121341,0,2.5900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116470,121369,0,2.4200,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116470,121370,0,2.3800,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116470,121346,0,1.7800,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116470,121411,0,1.3700,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116470,138781,0,1.2900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,124437,0,55.5900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,140227,0,2.1500,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,121365,0,1.8200,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,121331,0,1.2900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,138781,0,1.2500,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,121342,0,1.1900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,121360,0,1.1300,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,140222,0,1.1100,0,1,0,1,1,'Felbound Spirit'),
|
||||
(116472,121344,0,1.0000,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118264,124437,0,46.5100,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118264,121352,0,3.3800,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118264,121333,0,2.4900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118264,140225,0,1.9900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118264,121340,0,1.8300,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118264,121356,0,1.6400,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118264,121337,0,1.0700,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118264,121345,0,1.0000,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118294,124437,0,53.4200,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118294,147729,0,4.4700,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118294,121350,0,2.4100,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118294,121357,0,2.0900,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118294,121333,0,1.5000,0,1,0,1,1,'Felbound Spirit'),
|
||||
(118657,132233,0,74.1100,0,1,0,1,1,'Tormented Wailer'),
|
||||
(118657,132234,0,21.7300,0,1,0,1,1,'Tormented Wailer'),
|
||||
(118657,132232,0,4.0600,0,1,0,1,1,'Tormented Wailer'),
|
||||
(118660,132233,0,74.1900,0,1,0,1,1,'Broken Soul'),
|
||||
(118660,132234,0,20.0700,0,1,0,1,1,'Broken Soul'),
|
||||
(118660,124437,0,10.2100,0,1,0,1,1,'Broken Soul'),
|
||||
(118660,132232,0,5.4100,0,1,0,1,1,'Broken Soul'),
|
||||
(118679,124437,0,50.8200,0,1,0,1,1,'Deepsurge Tidesinger'),
|
||||
(118679,138781,0,1.4000,0,1,0,1,1,'Deepsurge Tidesinger'),
|
||||
(118679,121370,0,1.3800,0,1,0,1,1,'Deepsurge Tidesinger'),
|
||||
(118679,121344,0,1.2900,0,1,0,1,1,'Deepsurge Tidesinger'),
|
||||
(118679,121361,0,1.1800,0,1,0,1,1,'Deepsurge Tidesinger'),
|
||||
(118680,124437,0,48.0000,0,1,0,1,1,'Deepsurge Punisher'),
|
||||
(118680,121335,0,5.1500,0,1,0,1,1,'Deepsurge Punisher'),
|
||||
(118680,121362,0,1.8200,0,1,0,1,1,'Deepsurge Punisher'),
|
||||
(118680,138781,0,1.5600,0,1,0,1,1,'Deepsurge Punisher'),
|
||||
(118680,121366,0,1.5000,0,1,0,1,1,'Deepsurge Punisher'),
|
||||
(118683,124437,0,49.6300,0,1,0,1,1,'Deepsurge Defender'),
|
||||
(118683,138781,0,1.2800,0,1,0,1,1,'Deepsurge Defender'),
|
||||
(118683,121361,0,1.2400,0,1,0,1,1,'Deepsurge Defender'),
|
||||
(118683,140227,0,1.1600,0,1,0,1,1,'Deepsurge Defender'),
|
||||
(118943,124437,0,20.1000,0,1,0,1,1,'Felborne Abjurer'),
|
||||
(119139,132184,0,72.2300,0,1,0,1,1,'Stoneblood Basilisk'),
|
||||
(119139,132183,0,23.4300,0,1,0,1,1,'Stoneblood Basilisk'),
|
||||
(119139,124439,0,7.5800,0,1,0,1,1,'Stoneblood Basilisk'),
|
||||
(119139,132190,0,3.1100,0,1,0,1,1,'Stoneblood Basilisk'),
|
||||
(120342,132204,0,69.9000,0,1,0,1,1,'Dread Felbat'),
|
||||
(120342,132199,0,26.0400,0,1,0,1,1,'Dread Felbat'),
|
||||
(120342,124437,0,11.1500,0,1,0,1,1,'Dread Felbat'),
|
||||
(120342,132200,0,3.4500,0,1,0,1,1,'Dread Felbat');
|
||||
|
||||
UPDATE `creature_template` SET `lootid` = `entry` WHERE `entry` IN (98805,102106,106798,109702,110346,111454,111463,111632,111638,111674,111821,111823,113388,115054,115431,115434,115601,115646,115648,116427,116466,116468,116469,116470,116472,118264,118294,118657,118660,118679,118680,118683,118943,119139,120342);
|
||||
@@ -0,0 +1,36 @@
|
||||
-- Objets de quete manquants : Iles Brisees.
|
||||
--
|
||||
-- Trois objets sont des objectifs de quete reels chez nous (quest_objectives Type 1)
|
||||
-- et n'existaient dans AUCUNE table de butin du serveur.
|
||||
--
|
||||
-- QuestRequired = 1 : le core ne fait tomber l'objet que pour un joueur ayant la quete.
|
||||
--
|
||||
-- Taux repris de la fiche PNJ de Wowhead, PAS de la fiche objet : les deux divergent
|
||||
-- (Gemme pulsatile donnee a 19,66 % cote objet contre 82 % cote PNJ). C'est la fiche
|
||||
-- PNJ qui est juste, verifiee a l'ecran : 879 421 sur 1 074 500 kills.
|
||||
--
|
||||
-- 44748, 46198 et 46236 sont des quetes MONDIALES (QuestType 3, QuestInfoID 109,
|
||||
-- zone 7543 Rivage brise). Elles n'ont ni donneur ni rendeur par construction : leur
|
||||
-- butin est desormais correct, mais leur disponibilite depend du systeme de quetes
|
||||
-- mondiales, qui n'est pas verifie ici.
|
||||
--
|
||||
-- 41039 "Un savoir vole" NON TRAITEE. C'est pourtant la seule quete classique du lot,
|
||||
-- avec donneur et rendeur presents, donc la seule reellement jouable et bloquee. Mais
|
||||
-- son objet 133995 "Recette de biere de tempete" n'existe pas dans nos donnees : le
|
||||
-- serveur rejette la ligne au chargement, avec
|
||||
-- Table 'creature_loot_template' Entry 102852 Item 133995: item entry not listed
|
||||
-- in `item_template` - skipped
|
||||
-- L'objet figure dans Item.db2 mais pas dans ItemSparse.db2, et c'est ItemSparse qui
|
||||
-- compte pour le serveur. Debloquer cette quete demande un enregistrement DB2 custom
|
||||
-- par hotfix, pas une ligne de butin.
|
||||
--
|
||||
-- Non traite egalement : 147430, objectif de la quete 46765. Wowhead le donne sur
|
||||
-- environ 200 PNJ de tout le jeu, de 0,01 a 100 pour cent : c'est un butin mondial,
|
||||
-- qui releve d'une table de reference et non d'une ligne par creature.
|
||||
|
||||
DELETE FROM `creature_loot_template` WHERE (`Entry`,`Item`) IN ((115054,142079),(118943,144362),(119139,147396));
|
||||
INSERT INTO `creature_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(115054,142079,0,24.8100,1,1,0,1,1,'Wyrmtongue Scavenger - Ravitaillement naufrage (quete mondiale 44748)'),
|
||||
(118943,144362,0,81.8600,1,1,0,1,1,'Felborne Abjurer - Gemme pulsatile (quete mondiale 46198)'),
|
||||
(119139,147396,0,61.9000,1,1,0,1,1,'Stoneblood Basilisk - Oeil de basilic (quete mondiale 46236)');
|
||||
@@ -0,0 +1,9 @@
|
||||
-- Butin de Morjirn (102852) : Recette du breuvage des tempetes, objectif de la quete
|
||||
-- 41039 "Un savoir vole". Ne peut fonctionner qu'apres le hotfix DB2 creant l'objet
|
||||
-- 133995 (voir sql/updates/hotfixes/2026_09_07_00) : sans lui le core rejette la ligne.
|
||||
-- Taux 99,95 % releve sur la fiche PNJ de Wowhead, QuestRequired = 1.
|
||||
DELETE FROM `creature_loot_template` WHERE `Entry` = 102852 AND `Item` = 133995;
|
||||
INSERT INTO `creature_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(102852,133995,0,99.9500,1,1,0,1,1,'Morjirn - Recette du breuvage des tempetes (quete 41039)');
|
||||
UPDATE `creature_template` SET `lootid` = `entry` WHERE `entry` = 102852;
|
||||
@@ -0,0 +1,75 @@
|
||||
-- Quete 46765 "Le rivage Brise : enquete sur la Legion" : objet 147430 introuvable.
|
||||
--
|
||||
-- Quete classique (QuestType 2, donneur present), donc reellement jouable, mais son
|
||||
-- objectif n'existait dans aucune table de butin. Wowhead liste 199 lacheurs sur tout
|
||||
-- le jeu : 199 existent dans notre creature_template, mais seulement 58 sont spawnes
|
||||
-- chez nous. Sur ces 58, 49 lachent effectivement l'objet.
|
||||
--
|
||||
-- Taux releves une par une sur les fiches PNJ (pas la fiche objet), avec controle du
|
||||
-- statut HTTP 200 et du marqueur g_npcs. Ils vont de 0,03 a 100 pour cent : les taux
|
||||
-- tres bas sont conformes au releve, et l'abondance de sources compense.
|
||||
-- QuestRequired = 1 : l'objet ne tombe que pour un joueur ayant la quete.
|
||||
|
||||
DELETE FROM `creature_loot_template` WHERE `Item` = 147430;
|
||||
INSERT INTO `creature_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(91535,147430,0,7.6900,1,1,0,1,1,'Quartermaster Ricard'),
|
||||
(91590,147430,0,100.0000,1,1,0,1,1,'Apothecary Withers'),
|
||||
(91693,147430,0,12.5000,1,1,0,1,1,'Black Rose Apothecary'),
|
||||
(92333,147430,0,25.0000,1,1,0,1,1,'Grue cendrecime'),
|
||||
(92792,147430,0,33.3300,1,1,0,1,1,'Nightmare Rider'),
|
||||
(95958,147430,0,20.0000,1,1,0,1,1,'Floating Treasure'),
|
||||
(98112,147430,0,16.6700,1,1,0,1,1,'Steward Dayton'),
|
||||
(100054,147430,0,10.0000,1,1,0,1,1,'Feltotem Warmonger'),
|
||||
(100055,147430,0,9.0900,1,1,0,1,1,'Feltotem Bloodsinger'),
|
||||
(101390,147430,0,1.2700,1,1,0,1,1,'Arch-Desecrator Malithar'),
|
||||
(102660,147430,0,11.1100,1,1,0,1,1,'Jandvik Metalsmith'),
|
||||
(102741,147430,0,1.2200,1,1,0,1,1,'Highcliff Gull'),
|
||||
(104845,147430,0,1.1900,1,1,0,1,1,'Caged Macaw'),
|
||||
(105645,147430,0,2.5600,1,1,0,1,1,'Penned Turtle'),
|
||||
(105646,147430,0,8.3300,1,1,0,1,1,'Captive Basilisk'),
|
||||
(105650,147430,0,2.5600,1,1,0,1,1,'Confined Raptor'),
|
||||
(105687,147430,0,100.0000,1,1,0,1,1,'Valkyra Shieldmaiden'),
|
||||
(106798,147430,0,1.0400,1,1,0,1,1,'Nora Blackfire'),
|
||||
(108027,147430,0,1.1100,1,1,0,1,1,'Webmistress Shinaris'),
|
||||
(108033,147430,0,2.3800,1,1,0,1,1,'Fal''dorei Web Walker'),
|
||||
(108034,147430,0,2.3800,1,1,0,1,1,'Fal''dorei Reaver'),
|
||||
(110354,147430,0,0.8400,1,1,0,1,1,'Coryn'),
|
||||
(110839,147430,0,1.1600,1,1,0,1,1,'Stormwing Drake'),
|
||||
(111643,147430,0,6.2500,1,1,0,1,1,'Cove Seagull'),
|
||||
(112090,147430,0,16.6700,1,1,0,1,1,'Shoalfin Warrior'),
|
||||
(115054,147430,0,0.1900,1,1,0,1,1,'Wyrmtongue Scavenger'),
|
||||
(115056,147430,0,0.1300,1,1,0,1,1,'Felwing Devourer'),
|
||||
(117088,147430,0,0.0500,1,1,0,1,1,'Arachniarch Bybee'),
|
||||
(117093,147430,0,0.9000,1,1,0,1,1,'Felbringer Xar''thok'),
|
||||
(117094,147430,0,1.0800,1,1,0,1,1,'Malorus the Soulkeeper'),
|
||||
(117096,147430,0,1.2300,1,1,0,1,1,'Potionmaster Gloop'),
|
||||
(117136,147430,0,1.4200,1,1,0,1,1,'Doombringer Zar''thoz'),
|
||||
(117289,147430,0,0.0300,1,1,0,1,1,'Felblade Sentry'),
|
||||
(117559,147430,0,0.5400,1,1,0,1,1,'Wrathguard Dreadblade'),
|
||||
(118322,147430,0,0.2800,1,1,0,1,1,'Felborne Punisher'),
|
||||
(118390,147430,0,0.3200,1,1,0,1,1,'Toiling Collector'),
|
||||
(118971,147430,0,0.8300,1,1,0,1,1,'Felfin Terrorscale'),
|
||||
(119139,147430,0,0.2100,1,1,0,1,1,'Stoneblood Basilisk'),
|
||||
(119634,147430,0,0.0600,1,1,0,1,1,'Restless Remains'),
|
||||
(119788,147430,0,0.1500,1,1,0,1,1,'Ravenous Carrionstalker'),
|
||||
(120323,147430,0,0.1600,1,1,0,1,1,'Weary Lion Seal'),
|
||||
(120342,147430,0,0.5900,1,1,0,1,1,'Dread Felbat'),
|
||||
(120386,147430,0,5.8200,1,1,0,1,1,'Scavenging Crow'),
|
||||
(120820,147430,0,0.1100,1,1,0,1,1,'Fixated Corruptor'),
|
||||
(120896,147430,0,0.0500,1,1,0,1,1,'Dark Tormentor'),
|
||||
(121034,147430,0,0.1100,1,1,0,1,1,'Ravenous Felstalker'),
|
||||
(121035,147430,0,0.0600,1,1,0,1,1,'Felblade Sentry'),
|
||||
(121058,147430,0,0.0700,1,1,0,1,1,'Wrathguard Soulflayer'),
|
||||
(121346,147430,0,0.3000,1,1,0,1,1,'Dreadwing Terror');
|
||||
|
||||
-- Les lacheurs qui n'avaient encore aucune table doivent pointer sur elle.
|
||||
UPDATE `creature_template` SET `lootid` = `entry` WHERE `entry` IN (91535,91590,91693,92333,92792,95958,98112,100054,100055,101390,102660,102741,104845,105645,105646,105650,105687,106798,108027,108033,108034,110354,110839,111643,112090,115054,115056,117088,117093,117094,117096,117136,117289,117559,118322,118390,118971,119139,119634,119788,120323,120342,120386,120820,120896,121034,121035,121058,121346) AND `lootid` = 0;
|
||||
|
||||
-- 100231 : seul objet valide de son releve, Meteorite gangrenee (147869), objet de
|
||||
-- pacotille. Il etait ecarte par mon filtre "deja utilise ailleurs", trop prudent ici.
|
||||
DELETE FROM `creature_loot_template` WHERE `Entry` = 100231 AND `Item` = 147869;
|
||||
INSERT INTO `creature_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(100231,147869,0,5.8800,0,1,0,1,1,'Meteorite gangrenee');
|
||||
UPDATE `creature_template` SET `lootid` = `entry` WHERE `entry` = 100231 AND `lootid` = 0;
|
||||
@@ -0,0 +1,16 @@
|
||||
-- 113198 "Trapped Thicket Hunter" : bete des Iles Brisees sans table de depecage.
|
||||
--
|
||||
-- Son releve Wowhead ne donnait que des materiaux de depecage (124113 Cuir de rochepeau
|
||||
-- a 100 %, plus trois objets a 12,5 %). Ces objets relevent de skinning_loot_template,
|
||||
-- pas de creature_loot_template : chez nous 124113 apparait 284 fois en depecage contre
|
||||
-- 19 fois en butin de cadavre.
|
||||
--
|
||||
-- Les 12,5 % correspondent a 1 observation sur 8 : statistiquement sans valeur, ecartes.
|
||||
-- Le taux retenu pour le Cuir de rochepeau est celui d'une bete Legion comparable deja
|
||||
-- configuree chez nous (90134 Llothien Grizzly, 99,6779 %, 1 a 2 unites) plutot qu'un
|
||||
-- 100 % tire d'un echantillon de huit.
|
||||
DELETE FROM `skinning_loot_template` WHERE `Entry` = 113198;
|
||||
INSERT INTO `skinning_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(113198,124113,0,99.6779,0,1,0,1,2,'Trapped Thicket Hunter - Cuir de rochepeau');
|
||||
UPDATE `creature_template` SET `skinloot` = `entry` WHERE `entry` = 113198;
|
||||
@@ -0,0 +1,24 @@
|
||||
-- 142 lignes de butin rejetees a chaque chargement : REPARATION, pas suppression.
|
||||
--
|
||||
-- Les supprimer aurait ete destructeur : ce ne sont pas des lignes vides mais du butin
|
||||
-- reel rendu inoperant par deux defauts d'import distincts.
|
||||
--
|
||||
-- 1) 62 lignes a chance NEGATIVE, sur 35 creatures. Signe inverse a l'import : les memes
|
||||
-- objets existent ailleurs dans la table avec la meme valeur en positif (69815 entre
|
||||
-- 50 et 100 %, 71141 entre 75 et 100 %). On remet la valeur absolue.
|
||||
--
|
||||
-- 2) 80 lignes a chance nulle sans GroupId, sur 6 boss de points d'invasion majeurs
|
||||
-- d'Argus (Sotanathor, Inquisitor Meto, Mistress Alluradel, Pit Lord Vilemus,
|
||||
-- Matron Folnuna, Occularus), 12 a 14 objets chacun. C'est l'encodage classique d'un
|
||||
-- groupe equiprobable dont le GroupId a ete perdu : sans lui le core rejette tout et
|
||||
-- ces boss ne lachent rien. Verifie sur Wowhead : Mistress Alluradel liste exactement
|
||||
-- les 14 memes objets que nous. GroupId = 1 les fait tirer un objet parmi le lot.
|
||||
--
|
||||
-- Effet : 41 creatures retrouvent leur butin, dont 6 boss d'Argus qui n'en avaient aucun.
|
||||
|
||||
UPDATE `creature_loot_template` SET `Chance` = ABS(`Chance`)
|
||||
WHERE `Reference` = 0 AND `Chance` <> 0 AND `Chance` < 0.000001;
|
||||
|
||||
UPDATE `creature_loot_template` SET `GroupId` = 1
|
||||
WHERE `Reference` = 0 AND `Chance` = 0 AND `GroupId` = 0
|
||||
AND `Entry` IN (124492,124514,124555,124592,124625,124719);
|
||||
@@ -0,0 +1,90 @@
|
||||
-- Depecage manquant : betes des Iles Brisees (carte 1220).
|
||||
--
|
||||
-- 81 betes spawnees avaient skinloot = 0. Relevees sur Wowhead (onglet 'skinning',
|
||||
-- distinct de l'onglet des butins), avec controle du statut HTTP 200 et du marqueur
|
||||
-- g_npcs. Aucun refus rencontre.
|
||||
--
|
||||
-- 67 n'ont AUCUN onglet depecage sur Wowhead : oiseaux, insectes, gasteropodes,
|
||||
-- araignees, tortues en cage. Verifie a la main sur cinq d'entre elles (Suramar
|
||||
-- Skyhunter, Gritslime Snail, Ruins Recluse, Cove Seagull, Penned Turtle) : l'onglet
|
||||
-- est reellement absent, ce n'est pas un defaut d'extraction. Elles ne sont pas touchees.
|
||||
--
|
||||
-- Methode validee avant collecte sur un temoin dont la table existe deja chez nous
|
||||
-- (90134 Llothien Grizzly) : les 8 memes objets, memes intervalles de pile, ecarts de
|
||||
-- taux sous le bruit statistique. Nos donnees existantes viennent de la meme source.
|
||||
--
|
||||
-- Attention, l'onglet 'skinning' de Wowhead n'est PAS du JSON strict comme celui des
|
||||
-- butins : les cles y sont non quotees (count:148807,stack:[1,2]) et il y a une espace
|
||||
-- avant outof. JSON.parse echoue, et un motif trop strict renvoie zero partout.
|
||||
|
||||
DELETE FROM `skinning_loot_template` WHERE `Entry` IN (89013,89014,89016,89385,89386,89391,89652,89653,89696,89891,97928,98356,111380,113408);
|
||||
INSERT INTO `skinning_loot_template`
|
||||
(`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
|
||||
(89013,124113,0,99.5800,0,1,0,1,2,'Azsuna Lion Seal'),
|
||||
(89013,124124,0,1.6500,0,1,0,1,1,'Azsuna Lion Seal'),
|
||||
(89013,124439,0,13.0700,0,1,0,2,8,'Azsuna Lion Seal'),
|
||||
(89013,129746,0,1.7000,0,1,0,1,1,'Azsuna Lion Seal'),
|
||||
(89013,129888,0,1.7800,0,1,0,1,1,'Azsuna Lion Seal'),
|
||||
(89013,129906,0,17.8800,0,1,0,1,1,'Azsuna Lion Seal'),
|
||||
(89013,134807,0,15.8800,0,1,0,1,1,'Azsuna Lion Seal'),
|
||||
(89014,124113,0,99.9400,0,1,0,1,2,'Grassland Heron'),
|
||||
(89014,124438,0,17.3400,0,1,0,3,8,'Grassland Heron'),
|
||||
(89014,129888,0,35.5800,0,1,0,1,1,'Grassland Heron'),
|
||||
(89014,139894,0,2.1800,0,1,0,1,1,'Grassland Heron'),
|
||||
(89016,124113,0,99.4900,0,1,0,1,2,'Ravyn-Drath'),
|
||||
(89016,124439,0,16.4600,0,1,0,2,8,'Ravyn-Drath'),
|
||||
(89016,129860,0,2.7000,0,1,0,1,1,'Ravyn-Drath'),
|
||||
(89016,129888,0,2.8300,0,1,0,1,1,'Ravyn-Drath'),
|
||||
(89016,129906,0,15.9400,0,1,0,1,1,'Ravyn-Drath'),
|
||||
(89385,124113,0,100.0000,0,1,0,1,2,'Azsuna Fox'),
|
||||
(89385,124124,0,0.8100,0,1,0,1,1,'Azsuna Fox'),
|
||||
(89385,124438,0,13.4100,0,1,0,3,8,'Azsuna Fox'),
|
||||
(89385,124439,0,12.2400,0,1,0,3,8,'Azsuna Fox'),
|
||||
(89385,129746,0,1.1800,0,1,0,1,1,'Azsuna Fox'),
|
||||
(89385,129888,0,8.0600,0,1,0,1,1,'Azsuna Fox'),
|
||||
(89386,124115,0,99.2400,0,1,0,1,3,'Cliffwing Hippogryph'),
|
||||
(89386,124124,0,1.3500,0,1,0,1,1,'Cliffwing Hippogryph'),
|
||||
(89386,124438,0,16.6800,0,1,0,3,8,'Cliffwing Hippogryph'),
|
||||
(89386,129746,0,1.5200,0,1,0,1,1,'Cliffwing Hippogryph'),
|
||||
(89386,129894,0,4.0300,0,1,0,1,1,'Cliffwing Hippogryph'),
|
||||
(89386,129908,0,55.0500,0,1,0,1,1,'Cliffwing Hippogryph'),
|
||||
(89386,134806,0,19.0100,0,1,0,1,1,'Cliffwing Hippogryph'),
|
||||
(89391,124113,0,100.0000,0,1,0,1,1,'Cursefeather Owl'),
|
||||
(89391,124438,0,4.5900,0,1,0,3,8,'Cursefeather Owl'),
|
||||
(89391,129888,0,8.1800,0,1,0,1,1,'Cursefeather Owl'),
|
||||
(89652,124113,0,100.0000,0,1,0,1,2,'Shallows Heron'),
|
||||
(89652,124438,0,6.5600,0,1,0,3,8,'Shallows Heron'),
|
||||
(89652,129860,0,1.5900,0,1,0,1,1,'Shallows Heron'),
|
||||
(89652,129888,0,18.0300,0,1,0,1,1,'Shallows Heron'),
|
||||
(89652,139894,0,0.7300,0,1,0,1,1,'Shallows Heron'),
|
||||
(89653,124115,0,99.9900,0,1,0,1,3,'Gangamesh'),
|
||||
(89653,124438,0,10.3400,0,1,0,2,8,'Gangamesh'),
|
||||
(89653,124439,0,7.0700,0,1,0,1,8,'Gangamesh'),
|
||||
(89653,129862,0,8.3100,0,1,0,1,1,'Gangamesh'),
|
||||
(89653,129894,0,12.6400,0,1,0,1,1,'Gangamesh'),
|
||||
(89696,124115,0,99.9700,0,1,0,1,3,'Horned Leatherback'),
|
||||
(89696,124438,0,13.1400,0,1,0,1,8,'Horned Leatherback'),
|
||||
(89696,129862,0,1.0100,0,1,0,1,1,'Horned Leatherback'),
|
||||
(89696,129894,0,25.9800,0,1,0,1,1,'Horned Leatherback'),
|
||||
(89891,124115,0,99.9800,0,1,0,1,3,'Dragon Turtle'),
|
||||
(89891,124438,0,9.8200,0,1,0,3,8,'Dragon Turtle'),
|
||||
(89891,129746,0,1.3500,0,1,0,1,1,'Dragon Turtle'),
|
||||
(89891,129862,0,2.3200,0,1,0,1,1,'Dragon Turtle'),
|
||||
(89891,129865,0,5.2200,0,1,0,1,1,'Dragon Turtle'),
|
||||
(89891,129894,0,4.5600,0,1,0,1,1,'Dragon Turtle'),
|
||||
(89891,139894,0,0.7700,0,1,0,1,1,'Dragon Turtle'),
|
||||
(97928,124115,0,99.9500,0,1,0,1,1,'Tamed Coralback'),
|
||||
(97928,124438,0,13.2100,0,1,0,3,8,'Tamed Coralback'),
|
||||
(97928,129862,0,3.5900,0,1,0,1,1,'Tamed Coralback'),
|
||||
(97928,129894,0,15.6200,0,1,0,1,1,'Tamed Coralback'),
|
||||
(98356,124113,0,100.0000,0,1,0,1,1,'Corrupted Great Eagle'),
|
||||
(98356,124438,0,4.5500,0,1,0,5,7,'Corrupted Great Eagle'),
|
||||
(98356,129746,0,2.2700,0,1,0,1,1,'Corrupted Great Eagle'),
|
||||
(98356,129888,0,2.2700,0,1,0,1,1,'Corrupted Great Eagle'),
|
||||
(111380,124115,0,100.0000,0,1,0,1,1,'Killer Orca'),
|
||||
(111380,124439,0,72.5500,0,1,0,3,6,'Killer Orca'),
|
||||
(111380,129862,0,45.1000,0,1,0,1,1,'Killer Orca'),
|
||||
(111380,129894,0,1.9600,0,1,0,1,1,'Killer Orca'),
|
||||
(113408,124113,0,100.0000,0,1,0,1,1,'Salty');
|
||||
|
||||
UPDATE `creature_template` SET `skinloot` = `entry` WHERE `entry` IN (89013,89014,89016,89385,89386,89391,89652,89653,89696,89891,97928,98356,111380,113408);
|
||||
@@ -0,0 +1,15 @@
|
||||
-- Archmage Khadgar (78288) : faction hostile a l'Alliance, a tort.
|
||||
--
|
||||
-- Signalement : un personnage Alliance debarque a Crete-de-Gel et se fait attaquer par
|
||||
-- trois PNJ. Deux sont conformes : Thrall (70859) et Farseer Drek'Thar (76411) sont des
|
||||
-- chefs de la Horde, hostiles a l'Alliance sur les royaumes officiels comme chez nous.
|
||||
--
|
||||
-- Le troisieme non. Khadgar est neutre dans tout Draenor : il sert les deux factions.
|
||||
-- Wowhead le confirme pour cette entree precise (react Alliance = amical, Horde = amical),
|
||||
-- et notre propre base aussi : sur les 150 entrees "Archmage Khadgar", 100 sont en
|
||||
-- faction 35, et 78288 est la SEULE en faction 83 (Orgrimmar).
|
||||
--
|
||||
-- Il est spawne deux fois, toutes deux en zone 6720 : au point de debarquement (7257)
|
||||
-- et pres du fief (7004). Un joueur Alliance qui passe par la se fait donc agresser par
|
||||
-- un PNJ cense etre neutre.
|
||||
UPDATE `creature_template` SET `faction` = 35 WHERE `entry` = 78288;
|
||||
@@ -0,0 +1,9 @@
|
||||
-- Ken-Ken (60979) : faction 14, donc hostile a TOUT LE MONDE, alors qu'il porte le
|
||||
-- drapeau de dialogue (npcflag 1). Personne ne pouvait lui parler.
|
||||
--
|
||||
-- Meme classe d'erreur que Khadgar 78288, trouvee par le meme signal : sur les 8 entrees
|
||||
-- "Ken-Ken" de la base, six sont en faction 35 et celle-ci est la seule en 14.
|
||||
-- Wowhead le donne amical envers l'Alliance ET la Horde.
|
||||
--
|
||||
-- Deux spawns concernes, foret de Jade (carte 870, zone 5841).
|
||||
UPDATE `creature_template` SET `faction` = 35 WHERE `entry` = 60979;
|
||||
@@ -502,9 +502,30 @@ Position BotUtility::GetPositionFromGroup(Player* pCenterPlayer, ObjectGuid self
|
||||
float distZ = centerPos.GetPositionZ();
|
||||
if (!pCenterPlayer->IsFlying())
|
||||
distZ = pCenterPlayer->GetMap()->GetHeight(pCenterPlayer->GetPhaseShift(), distX, distY, distZ);
|
||||
// =================================================================
|
||||
// SylvaniaCore : la position calculee etait JETEE.
|
||||
//
|
||||
// SIGNALE EN JEU : « les bots restent les uns sur les autres ».
|
||||
//
|
||||
// Tout le calcul ci-dessus est juste -- un angle propre a chaque
|
||||
// membre, reparti sur le cercle, a quatre metres du meneur. Mais le
|
||||
// resultat n'etait jamais renvoye :
|
||||
//
|
||||
// Position resultPos(distX, distY, distZ, ...); // calculee
|
||||
// Position pos; // vide
|
||||
// pCenterPlayer->GetFirstCollisionPosition(...); // jete
|
||||
// return pos; // (0,0,0)
|
||||
//
|
||||
// GetFirstCollisionPosition REND une Position ; son resultat etait
|
||||
// ignore, et l'on renvoyait une variable jamais renseignee. La
|
||||
// fonction rendait donc l'origine du monde a tous les appelants, et
|
||||
// la formation n'a jamais fonctionne -- nulle part, pas seulement
|
||||
// dans ce scenario.
|
||||
// =================================================================
|
||||
Position resultPos(distX, distY, distZ, pCenterPlayer->GetOrientation());
|
||||
Position pos;
|
||||
pCenterPlayer->GetFirstCollisionPosition(pCenterPlayer->GetDistance(resultPos), pCenterPlayer->GetRelativeAngle(&resultPos));
|
||||
Position pos = pCenterPlayer->GetFirstCollisionPosition(
|
||||
pCenterPlayer->GetDistance(resultPos), pCenterPlayer->GetRelativeAngle(&resultPos));
|
||||
pos.SetOrientation(pCenterPlayer->GetOrientation());
|
||||
return pos;
|
||||
}
|
||||
|
||||
@@ -1031,16 +1052,21 @@ void BotAITeleport::Update(uint32 diff, BotBGAIMovement* pMovement)
|
||||
}
|
||||
else if (m_TeleportStep == 3)
|
||||
{
|
||||
WorldSession* pSession = me->GetSession();
|
||||
MovementInfo movementInfo;
|
||||
movementInfo.pos = m_TeleportPositon;
|
||||
movementInfo.time = getMSTime();
|
||||
movementInfo.guid = me->GetGUID();
|
||||
movementInfo.flags = 0;
|
||||
movementInfo.flags2 = 0;
|
||||
WorldPacket data(CMSG_MOVE_FALL_LAND);// MSG_MOVE_STOP);
|
||||
data << movementInfo;
|
||||
me->SendMessageToSet(&data, me);
|
||||
// =====================================================
|
||||
// SylvaniaCore : envoi mort retire.
|
||||
//
|
||||
// Le bloc supprime ici diffusait un paquet portant
|
||||
// l'opcode CLIENT CMSG_MOVE_FALL_LAND. WorldSession le
|
||||
// REFUSE systematiquement -- « Prevented sending of
|
||||
// opcode 14841 with non existing handler » -- et ecrit
|
||||
// une ligne d'ERREUR a chaque tentative. Signale par un
|
||||
// utilisateur de SylvaniaCore : des milliers de lignes
|
||||
// par match de champ de bataille.
|
||||
//
|
||||
// Il n'accomplissait donc rien. La reconstruction de
|
||||
// l'objet ci-dessous, ajoutee precedemment pour pallier
|
||||
// son inefficacite, reste seule en charge du travail.
|
||||
// =====================================================
|
||||
me->CombatStop(true);
|
||||
me->SetSelection(ObjectGuid::Empty);
|
||||
// SylvaniaCore : le paquet diffuse ci-dessus porte un opcode CLIENT
|
||||
|
||||
@@ -674,19 +674,28 @@ void BotBGAIMovement::SyncPosition(Position& pos, bool immed)
|
||||
if (m_Player->IsFlying())
|
||||
return;
|
||||
|
||||
Position targetPos(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), m_Player->GetOrientation());
|
||||
targetPos.m_positionZ = 0.01f + m_Player->GetMap()->GetHeight(m_Player->GetPhaseShift(), targetPos.GetPositionX(), targetPos.GetPositionY(), targetPos.m_positionZ);
|
||||
WorldSession* pSession = m_Player->GetSession();
|
||||
MovementInfo movementInfo;
|
||||
movementInfo.pos = targetPos;
|
||||
movementInfo.time = getMSTime();
|
||||
movementInfo.guid = m_Player->GetGUID();
|
||||
movementInfo.flags = 0;
|
||||
movementInfo.flags2 = 0;
|
||||
|
||||
WorldPacket data(CMSG_MOVE_FALL_LAND);// MSG_MOVE_STOP);
|
||||
data << movementInfo;
|
||||
m_Player->SendMessageToSet(&data, m_Player);
|
||||
// =================================================================
|
||||
// SylvaniaCore : cette fonction etait entierement inerte.
|
||||
//
|
||||
// Elle calculait une position au sol puis diffusait un paquet
|
||||
// portant l'opcode CLIENT CMSG_MOVE_FALL_LAND. WorldSession le
|
||||
// REFUSE toujours -- « Prevented sending of opcode 14841 with non
|
||||
// existing handler » -- et journalise une ERREUR a chaque fois.
|
||||
// Signale par un utilisateur de SylvaniaCore : des milliers de
|
||||
// lignes par match, avec des bots en champ de bataille.
|
||||
//
|
||||
// Elle ne deplacait meme pas le bot cote serveur : aucun appel a
|
||||
// UpdatePosition. Son seul effet observable etait donc le journal.
|
||||
//
|
||||
// L'envoi est retire. La fonction ne fait desormais plus que sa
|
||||
// temporisation, ce qui est exactement ce qu'elle accomplissait
|
||||
// avant -- en silence cette fois.
|
||||
//
|
||||
// A REPRENDRE : si une desynchronisation des bots est constatee en
|
||||
// jeu, c'est ICI qu'il faut la corriger, par un UpdatePosition en
|
||||
// bonne et due forme. Rien n'a ete ajoute a l'aveugle : le defaut
|
||||
// signale ne pouvait pas etre reproduit sur notre serveur.
|
||||
// =================================================================
|
||||
}
|
||||
|
||||
bool BotBGAIMovement::IsNearToPosition(float x, float y, float z, float range)
|
||||
|
||||
@@ -118,6 +118,7 @@ m_SeduceTarget(ObjectGuid::Empty),
|
||||
m_MasterPlayer(NULL),
|
||||
m_FullDispel(0),
|
||||
m_MeleeFleeTick(0),
|
||||
m_AttackDbgTick(0),
|
||||
bothp(0),
|
||||
m_ForceFlee(false),
|
||||
m_StopFollow(false),
|
||||
@@ -264,9 +265,22 @@ void BotGroupAI::ProcessAttackCommand()
|
||||
{
|
||||
Unit* pMasterTarget = m_MasterPlayer->GetSelectedUnit();
|
||||
if (!pMasterTarget || !pMasterTarget->IsAlive())
|
||||
{
|
||||
TC_LOG_ERROR("botai", "ATTACKDBG %s: ordre recu mais le maitre n a pas de cible vivante.",
|
||||
me->GetName().c_str());
|
||||
return;
|
||||
}
|
||||
if (!me->IsValidAttackTarget(pMasterTarget))
|
||||
{
|
||||
TC_LOG_ERROR("botai", "ATTACKDBG %s: cible " UI64FMTD " (entree %u) refusee par IsValidAttackTarget.",
|
||||
me->GetName().c_str(), pMasterTarget->GetGUID().GetCounter(),
|
||||
pMasterTarget->ToCreature() ? pMasterTarget->ToCreature()->GetEntry() : 0);
|
||||
return;
|
||||
}
|
||||
TC_LOG_ERROR("botai", "ATTACKDBG %s: cible " UI64FMTD " (entree %u) retenue, distance %.1f.",
|
||||
me->GetName().c_str(), pMasterTarget->GetGUID().GetCounter(),
|
||||
pMasterTarget->ToCreature() ? pMasterTarget->ToCreature()->GetEntry() : 0,
|
||||
me->GetDistance(pMasterTarget));
|
||||
me->SetSelection(pMasterTarget->GetGUID());
|
||||
m_ForceFlee = false;
|
||||
m_StopFollow = false;
|
||||
@@ -1448,7 +1462,26 @@ bool BotGroupAI::TryTeleportToMaster()
|
||||
m_Flee.Clear();
|
||||
return true;
|
||||
}
|
||||
else if (me->GetDistance(m_MasterPlayer->GetPosition()) > BOTAI_SEARCH_RANGE * 5)
|
||||
// DISTANCE_DE_RAPPEL
|
||||
//
|
||||
// MESURE (audit du 09/09) : au moment d un « !attack », deux des quatre
|
||||
// mercenaires se trouvaient a 100 et 106 metres de leur employeur, les
|
||||
// deux autres a 21 et 28. Les lointains n etaient pas perdus au sens du
|
||||
// code -- simplement sous le seuil de rappel, qui valait
|
||||
// BOTAI_SEARCH_RANGE * 5, soit 160 metres.
|
||||
//
|
||||
// Ils recevaient donc l ordre, l acceptaient, et partaient A PIED. Cent
|
||||
// metres de marche, c est une quinzaine de secondes : le combat est
|
||||
// termine avant leur arrivee, et de l exterieur le mercenaire a
|
||||
// simplement « refuse d attaquer ».
|
||||
//
|
||||
// Ce seuil de 160 convient a un bot de terrain qui vagabonde ; pas a un
|
||||
// membre de groupe, qui n a aucune raison de s eloigner autant de son
|
||||
// employeur. On le ramene a deux fois la portee de recherche, soit 64
|
||||
// metres -- largement au-dela des 32 metres ou l IA engage le combat et
|
||||
// des 28 de portee des sorts, donc sans risque de teleporter un lanceur
|
||||
// de sorts en pleine rotation.
|
||||
else if (me->GetDistance(m_MasterPlayer->GetPosition()) > BOTAI_SEARCH_RANGE * 2)
|
||||
{
|
||||
m_Teleporting.SetTeleport(m_MasterPlayer, 0);
|
||||
me->SetSelection(ObjectGuid::Empty);
|
||||
@@ -1528,18 +1561,44 @@ void BotGroupAI::ProcessFollowToMaster()
|
||||
}
|
||||
Position targetPos = BotUtility::GetPositionFromGroup(m_MasterPlayer, me->GetGUID(), me->GetGroup());
|
||||
m_Movement->MovementTo(targetPos.GetPositionX(), targetPos.GetPositionY(), targetPos.GetPositionZ(), 0);
|
||||
// =================================================================
|
||||
// ANGLE PROPRE A CHAQUE MEMBRE.
|
||||
//
|
||||
// Les deux MoveFollow ci-dessous employaient la MEME distance et le
|
||||
// MEME angle pour tout le monde -- un metre devant le meneur, a son
|
||||
// orientation. Tous les bots convergeaient donc vers un point unique
|
||||
// et se superposaient, quand bien meme GetPositionFromGroup leur
|
||||
// avait calcule une place distincte deux lignes plus haut.
|
||||
//
|
||||
// On reprend l'angle de cette formation : chacun garde son secteur.
|
||||
float suiviAngle = 0.0f;
|
||||
float suiviDistance = 3.0f;
|
||||
{
|
||||
uint32 index = 0;
|
||||
uint32 count = 0;
|
||||
ObjectGuid monGuid = me->GetGUID();
|
||||
if (me->GetGroup() && me->GetGroup()->GiveAtGroupPos(monGuid, index, count))
|
||||
{
|
||||
if (count > 1)
|
||||
--count;
|
||||
if (count)
|
||||
suiviAngle = (float(M_PI) * 2.0f / float(count)) * float(index);
|
||||
suiviDistance = (count > 3) ? 4.0f : 3.0f;
|
||||
}
|
||||
}
|
||||
|
||||
float distance = me->GetDistance(m_MasterPlayer->GetPosition());
|
||||
if (distance <= NEEDFLEE_CHECKRANGE && distance > 0.1f)
|
||||
{
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveFollow(m_MasterPlayer, 1.0f, m_MasterPlayer->GetOrientation());
|
||||
me->GetMotionMaster()->MoveFollow(m_MasterPlayer, suiviDistance, suiviAngle);
|
||||
return;
|
||||
}
|
||||
|
||||
if (me->IsWithinLOSInMap(m_MasterPlayer))
|
||||
{
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MoveFollow(m_MasterPlayer, 1.0f, m_MasterPlayer->GetOrientation());
|
||||
me->GetMotionMaster()->MoveFollow(m_MasterPlayer, suiviDistance, suiviAngle);
|
||||
}
|
||||
else
|
||||
m_Movement->MovementTo(m_MasterPlayer->GetPositionX(), m_MasterPlayer->GetPositionY(), m_MasterPlayer->GetPositionZ(), 1);
|
||||
@@ -2980,6 +3039,20 @@ Unit* BotGroupAI::GetBotAIValidSelectedUnit()
|
||||
isValid = false;
|
||||
if (!isValid)
|
||||
{
|
||||
// SONDE ATTACKDBG : nommer le filtre qui rejette, une fois par
|
||||
// seconde au plus pour ne pas noyer le journal.
|
||||
if (pTarget && m_AttackDbgTick + 1000 < getMSTime())
|
||||
{
|
||||
m_AttackDbgTick = getMSTime();
|
||||
char const* motif = "inconnu";
|
||||
if (!pTarget->IsVisible()) motif = "IsVisible";
|
||||
else if (!me->InSamePhase(pTarget->GetPhaseShift())) motif = "phase";
|
||||
else if (IsNotSelect(pTarget)) motif = "IsNotSelect";
|
||||
else if (TargetIsControl(pTarget)) motif = "controle/evade";
|
||||
else if (m_FliterCreatures.IsFliterCreature(pTarget->ToCreature())) motif = "filtre";
|
||||
TC_LOG_ERROR("botai", "ATTACKDBG %s: cible " UI64FMTD " rejetee -- %s.",
|
||||
me->GetName().c_str(), pTarget->GetGUID().GetCounter(), motif);
|
||||
}
|
||||
me->AttackStop();
|
||||
me->SetSelection(ObjectGuid::Empty);
|
||||
return NULL;
|
||||
|
||||
@@ -224,6 +224,7 @@ protected:
|
||||
Player* m_MasterPlayer;
|
||||
uint32 m_FullDispel;
|
||||
uint32 m_MeleeFleeTick;
|
||||
uint32 m_AttackDbgTick;
|
||||
uint32 bothp;
|
||||
bool m_ForceFlee;
|
||||
bool m_StopFollow;
|
||||
|
||||
@@ -498,6 +498,9 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0
|
||||
case CRITERIA_TYPE_ON_LOGIN:
|
||||
case CRITERIA_TYPE_PLACE_GARRISON_BUILDING:
|
||||
case CRITERIA_TYPE_COLLECT_BATTLEPET:
|
||||
case CRITERIA_TYPE_CAPTURE_PET_IN_BATTLE:
|
||||
case CRITERIA_TYPE_BATTLEPET_WIN:
|
||||
case CRITERIA_TYPE_BATTLEPET_LEVEL_UP:
|
||||
case CRITERIA_TYPE_HONOR_LEVEL_REACHED:
|
||||
case CRITERIA_TYPE_BUY_GUILD_TABARD:
|
||||
case CRITERIA_TYPE_PRESTIGE_REACHED:
|
||||
@@ -759,9 +762,6 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0
|
||||
case CRITERIA_TYPE_BE_KICKED_FROM_LFR:
|
||||
case CRITERIA_TYPE_COUNT_OF_LFR_QUEUE_BOOSTS_BY_TANK:
|
||||
case CRITERIA_TYPE_COMPLETE_SCENARIO_COUNT:
|
||||
case CRITERIA_TYPE_CAPTURE_PET_IN_BATTLE:
|
||||
case CRITERIA_TYPE_BATTLEPET_WIN:
|
||||
case CRITERIA_TYPE_BATTLEPET_LEVEL_UP:
|
||||
case CRITERIA_TYPE_CAPTURE_BATTLE_PET_CREDIT:
|
||||
case CRITERIA_TYPE_ENTER_AREA:
|
||||
case CRITERIA_TYPE_LEAVE_AREA:
|
||||
@@ -1207,6 +1207,9 @@ bool CriteriaHandler::IsCompletedCriteria(Criteria const* criteria, uint64 requi
|
||||
case CRITERIA_TYPE_SEND_EVENT_SCENARIO:
|
||||
case CRITERIA_TYPE_COMPLETE_SCENARIO:
|
||||
case CRITERIA_TYPE_COLLECT_BATTLEPET:
|
||||
case CRITERIA_TYPE_CAPTURE_PET_IN_BATTLE:
|
||||
case CRITERIA_TYPE_BATTLEPET_WIN:
|
||||
case CRITERIA_TYPE_BATTLEPET_LEVEL_UP:
|
||||
return progress->Counter >= requiredAmount;
|
||||
case CRITERIA_TYPE_CAPTURE_SPECIFIC_BATTLEPET:
|
||||
case CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||
@@ -1622,6 +1625,12 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis
|
||||
if (!miscValue2 /*login case*/ || miscValue1 != uint32(criteria->Entry->Asset.EquipmentSlot))
|
||||
return false;
|
||||
break;
|
||||
case CRITERIA_TYPE_BATTLEPET_LEVEL_UP:
|
||||
// miscValue1 = espece de la mascotte, miscValue2 = niveau atteint,
|
||||
// Asset.ID = niveau exige par le critere
|
||||
if (!miscValue1 || !miscValue2 || miscValue2 != uint64(criteria->Entry->Asset.ID))
|
||||
return false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1288,7 +1288,7 @@ void PetBattle::Finish(uint32 winnerTeamID, bool aborted, bool ignoreAbandonPena
|
||||
|
||||
if (auto speciesInfo = sBattlePetSpeciesStore.LookupEntry(currentPet->Species))
|
||||
{
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BATTLEPET_LEVEL_UP, currentPet->Level, speciesInfo->PetTypeEnum, currentPet->Species);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BATTLEPET_LEVEL_UP, currentPet->Species, currentPet->Level, speciesInfo->PetTypeEnum);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_LEVEL_BATTLE_PET_CREDIT, speciesInfo->ID, currentPet->Level, currentPet->Species);
|
||||
}
|
||||
|
||||
@@ -1317,7 +1317,7 @@ void PetBattle::Finish(uint32 winnerTeamID, bool aborted, bool ignoreAbandonPena
|
||||
if (winnerTeamID == currentTeamID)
|
||||
{
|
||||
auto speciesInfo = sDB2Manager.GetSpeciesByCreatureID(InitialWildPetGUID.GetEntry());
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BATTLEPET_WIN, BattleType != PETBATTLE_TYPE_PVE, 0, speciesInfo ? speciesInfo->ID : 0);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BATTLEPET_WIN, speciesInfo ? speciesInfo->ID : 0, BattleType != PETBATTLE_TYPE_PVE, 0);
|
||||
if (speciesInfo)
|
||||
player->QuestObjectiveSatisfy(speciesInfo->ID, 1, QUEST_OBJECTIVE_DEFEATBATTLEPET, InitialWildPetGUID);
|
||||
}
|
||||
|
||||
@@ -1560,6 +1560,15 @@ void Battleground::RelocateDeadPlayers(ObjectGuid guideGuid)
|
||||
|
||||
bool Battleground::AddObject(uint32 type, uint32 entry, float x, float y, float z, float o, float rotation0, float rotation1, float rotation2, float rotation3, uint32 /*respawnTime*/, GOState goState)
|
||||
{
|
||||
// Garde-fou : voir GetBGObject. Ici l'indice sert a une ECRITURE,
|
||||
// BgObjects[type] = go->GetGUID() -- plus grave encore qu'une lecture.
|
||||
if (type >= BgObjects.size())
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground::AddObject: type %u hors limites (%u objets) pour le BG (carte %u, instance %u), entree %u ignoree.",
|
||||
type, uint32(BgObjects.size()), m_MapId, m_InstanceID, entry);
|
||||
return false;
|
||||
}
|
||||
|
||||
// If the assert is called, means that BgObjects must be resized!
|
||||
ASSERT(type < BgObjects.size());
|
||||
|
||||
@@ -1629,6 +1638,14 @@ bool Battleground::AddObject(uint32 type, uint32 entry, Position const& pos, flo
|
||||
// It would be nice to correctly implement GO_ACTIVATED state and open/close doors in gameobject code
|
||||
void Battleground::DoorClose(uint32 type)
|
||||
{
|
||||
// Garde-fou : voir GetBGObject.
|
||||
if (type >= BgObjects.size())
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground::DoorClose: type %u hors limites (%u objets) pour le BG (carte %u, instance %u).",
|
||||
type, uint32(BgObjects.size()), m_MapId, m_InstanceID);
|
||||
return;
|
||||
}
|
||||
|
||||
if (GameObject* obj = GetBgMap()->GetGameObject(BgObjects[type]))
|
||||
{
|
||||
// If doors are open, close it
|
||||
@@ -1645,6 +1662,14 @@ void Battleground::DoorClose(uint32 type)
|
||||
|
||||
void Battleground::DoorOpen(uint32 type)
|
||||
{
|
||||
// Garde-fou : voir GetBGObject.
|
||||
if (type >= BgObjects.size())
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground::DoorOpen: type %u hors limites (%u objets) pour le BG (carte %u, instance %u).",
|
||||
type, uint32(BgObjects.size()), m_MapId, m_InstanceID);
|
||||
return;
|
||||
}
|
||||
|
||||
if (GameObject* obj = GetBgMap()->GetGameObject(BgObjects[type]))
|
||||
{
|
||||
obj->SetLootState(GO_ACTIVATED);
|
||||
@@ -1657,6 +1682,33 @@ void Battleground::DoorOpen(uint32 type)
|
||||
|
||||
GameObject* Battleground::GetBGObject(uint32 type, bool logError)
|
||||
{
|
||||
// =================================================================
|
||||
// SylvaniaCore : refuser les indices hors limites.
|
||||
//
|
||||
// SIGNALE PAR UN UTILISATEUR DE SYLVANIACORE : ses matchs de Bassin
|
||||
// d'Arathi faisaient tomber le serveur, avec dans le journal
|
||||
// GetBGObject: gameobject (type: 24, ... Entry: 7735234) not found
|
||||
// GetBGObject: gameobject (type: 32, ... Entry: 0) not found
|
||||
// Des GUID manifestement arbitraires : BgObjects ne compte que 22
|
||||
// cases pour ce champ de bataille.
|
||||
//
|
||||
// La cause etait une indexation node*8 heritee de l'ancien Bassin
|
||||
// d'Arathi (corrigee dans BattlegroundAB.cpp), mais le defaut de
|
||||
// fond est ici : ces accesseurs indexent un std::vector avec une
|
||||
// valeur fournie par l'appelant, SANS jamais verifier la borne. Une
|
||||
// simple faute de calcul devient alors une corruption memoire, et
|
||||
// le plantage survient loin de son origine.
|
||||
//
|
||||
// On journalise et on renvoie l'echec plutot que de lire n'importe
|
||||
// ou. Meme garde-fou sur les autres accesseurs indexes du fichier.
|
||||
// =================================================================
|
||||
if (type >= BgObjects.size())
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground::GetBGObject: type %u hors limites (%u objets) pour le BG (carte %u, instance %u).",
|
||||
type, uint32(BgObjects.size()), m_MapId, m_InstanceID);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
GameObject* obj = GetBgMap()->GetGameObject(BgObjects[type]);
|
||||
if (!obj)
|
||||
{
|
||||
@@ -1672,6 +1724,14 @@ GameObject* Battleground::GetBGObject(uint32 type, bool logError)
|
||||
|
||||
Creature* Battleground::GetBGCreature(uint32 type, bool logError)
|
||||
{
|
||||
// Garde-fou : voir GetBGObject.
|
||||
if (type >= BgCreatures.size())
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground::GetBGCreature: type %u hors limites (%u creatures) pour le BG (carte %u, instance %u).",
|
||||
type, uint32(BgCreatures.size()), m_MapId, m_InstanceID);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Creature* creature = GetBgMap()->GetCreature(BgCreatures[type]);
|
||||
if (!creature)
|
||||
{
|
||||
@@ -1687,6 +1747,14 @@ Creature* Battleground::GetBGCreature(uint32 type, bool logError)
|
||||
|
||||
void Battleground::SpawnBGObject(uint32 type, uint32 respawntime)
|
||||
{
|
||||
// Garde-fou : voir GetBGObject.
|
||||
if (type >= BgObjects.size())
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground::SpawnBGObject: type %u hors limites (%u objets) pour le BG (carte %u, instance %u).",
|
||||
type, uint32(BgObjects.size()), m_MapId, m_InstanceID);
|
||||
return;
|
||||
}
|
||||
|
||||
if (Map* map = FindBgMap())
|
||||
if (GameObject* obj = map->GetGameObject(BgObjects[type]))
|
||||
{
|
||||
@@ -1761,6 +1829,14 @@ Creature* Battleground::AddCreature(uint32 entry, uint32 type, Position const& p
|
||||
|
||||
bool Battleground::DelCreature(uint32 type)
|
||||
{
|
||||
// Garde-fou : voir GetBGObject.
|
||||
if (type >= BgCreatures.size())
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground::DelCreature: type %u hors limites (%u creatures) pour le BG (carte %u, instance %u).",
|
||||
type, uint32(BgCreatures.size()), m_MapId, m_InstanceID);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!BgCreatures[type])
|
||||
return true;
|
||||
|
||||
@@ -1779,6 +1855,14 @@ bool Battleground::DelCreature(uint32 type)
|
||||
|
||||
bool Battleground::DelObject(uint32 type)
|
||||
{
|
||||
// Garde-fou : voir GetBGObject.
|
||||
if (type >= BgObjects.size())
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground::DelObject: type %u hors limites (%u objets) pour le BG (carte %u, instance %u).",
|
||||
type, uint32(BgObjects.size()), m_MapId, m_InstanceID);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!BgObjects[type])
|
||||
return true;
|
||||
|
||||
|
||||
@@ -155,12 +155,25 @@ void BattlegroundMgr::Update(uint32 diff)
|
||||
{
|
||||
// forced update for rated arenas (scan all, but skipped non rated)
|
||||
TC_LOG_TRACE("bg.arena", "BattlegroundMgr: UPDATING ARENA QUEUES");
|
||||
for (int qtype = BATTLEGROUND_QUEUE_2v2; qtype <= BATTLEGROUND_QUEUE_5v5; ++qtype)
|
||||
// SylvaniaCore : l amont avait commente la boucle sur les brackets et fige
|
||||
// le bracket a 14, qui n existe pas dans PVPDifficulty pour la carte du
|
||||
// template BATTLEGROUND_AA. Resultat : aucune file cotee n etait reellement
|
||||
// mise a jour, et BattlegroundQueueUpdate journalisait une erreur toutes les
|
||||
// 5 secondes. On parcourt les brackets reellement declares pour cette carte.
|
||||
if (Battleground* arenaTemplate = GetBattlegroundTemplate(BATTLEGROUND_AA))
|
||||
{
|
||||
//for (int bracket = BG_BRACKET_ID_FIRST; bracket < MAX_BATTLEGROUND_BRACKETS; ++bracket)
|
||||
m_BattlegroundQueues[qtype].BattlegroundQueueUpdate(diff,
|
||||
BATTLEGROUND_AA, BattlegroundBracketId(14),//bracket
|
||||
BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId(qtype)), true, 0);
|
||||
for (int qtype = BATTLEGROUND_QUEUE_2v2; qtype <= BATTLEGROUND_QUEUE_5v5; ++qtype)
|
||||
{
|
||||
for (uint8 bracket = BG_BRACKET_ID_FIRST; bracket < MAX_BATTLEGROUND_BRACKETS; ++bracket)
|
||||
{
|
||||
if (!DB2Manager::GetBattlegroundBracketById(arenaTemplate->GetMapId(), BattlegroundBracketId(bracket)))
|
||||
continue;
|
||||
|
||||
m_BattlegroundQueues[qtype].BattlegroundQueueUpdate(diff,
|
||||
BATTLEGROUND_AA, BattlegroundBracketId(bracket),
|
||||
BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId(qtype)), true, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_NextRatedArenaUpdate = sWorld->getIntConfig(CONFIG_ARENA_RATED_UPDATE_TIMER);
|
||||
|
||||
@@ -938,6 +938,15 @@ should be called from Battleground::RemovePlayer function in some cases
|
||||
*/
|
||||
void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id, uint8 arenaType, bool isRated, uint32 arenaRating)
|
||||
{
|
||||
// SylvaniaCore : garde-fou. m_QueuedGroups n a que MAX_BATTLEGROUND_BRACKETS
|
||||
// entrees ; un appelant qui fabrique un bracket hors plage lisait au-dela du
|
||||
// tableau (comportement indefini) des la premiere ligne de la fonction.
|
||||
if (bracket_id >= MAX_BATTLEGROUND_BRACKETS)
|
||||
{
|
||||
TC_LOG_ERROR("bg.battleground", "Battleground: Update: bracket id %u hors plage pour le bg %u", uint32(bracket_id), uint32(bgTypeId));
|
||||
return;
|
||||
}
|
||||
|
||||
//if no players in queue - do nothing
|
||||
if (m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].empty() &&
|
||||
m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].empty() &&
|
||||
|
||||
@@ -181,7 +181,39 @@ void CommandAB::ProcessABNodeRequirement(uint32 abNode, AIWaypoint* waypoint, Pl
|
||||
{
|
||||
if (!waypoint)
|
||||
return;
|
||||
GameObject* pBGNode = m_pBattleground->GetBGObject(abNode * 8);
|
||||
// =================================================================
|
||||
// SylvaniaCore : les bannieres d'Arathi sont aux indices 0 a 4.
|
||||
//
|
||||
// SIGNALE PAR UN UTILISATEUR DE SYLVANIACORE, journal a l'appui :
|
||||
// GetBGObject: type 24 hors limites (22 objets) carte 529
|
||||
// GetBGObject: type 32 hors limites (22 objets) carte 529
|
||||
//
|
||||
// abNode * 8 vient de l'ancien Bassin d'Arathi de TrinityCore, ou
|
||||
// chaque noeud possedait huit objets. Le notre n'en a qu'UN par
|
||||
// noeud : BG_AB_OBJECT_BANNER + node, soit 0 a 4. _ChangeBanner
|
||||
// modifie le visuel de cette banniere unique selon l'etat.
|
||||
//
|
||||
// Le calcul etait donc faux pour TOUS les noeuds, pas seulement
|
||||
// pour ceux qui debordaient :
|
||||
// noeud 0 -> 0 banniere juste, par hasard
|
||||
// noeud 1 -> 8 REGENBUFF_STABLES
|
||||
// noeud 2 -> 16 SPEEDBUFF_LUMBER_MILL
|
||||
// noeud 3 -> 24 hors limites
|
||||
// noeud 4 -> 32 hors limites
|
||||
//
|
||||
// Les bots visaient des objets de bonus au lieu des bannieres, et
|
||||
// ne voyaient tout simplement pas la scierie ni la mine d'or. Les
|
||||
// deux appels etant proteges contre le pointeur nul, cela echouait
|
||||
// en silence -- seul le garde-fou pose dans GetBGObject a fini par
|
||||
// le rendre visible.
|
||||
//
|
||||
// Le controle de borne sur abNode manquait ici alors qu'il existe
|
||||
// dans GetABFlagRangePlayerByTeam : ajoute.
|
||||
// =================================================================
|
||||
if (abNode >= BG_AB_BattlegroundNodes::BG_AB_DYNAMIC_NODES_COUNT)
|
||||
return;
|
||||
|
||||
GameObject* pBGNode = m_pBattleground->GetBGObject(BG_AB_ObjectType::BG_AB_OBJECT_BANNER + abNode);
|
||||
if (!pBGNode)
|
||||
return;
|
||||
PlayerGUIDs nodeNearPlayers = GetABFlagRangePlayerByTeam(abNode, m_TeamID);
|
||||
@@ -264,7 +296,9 @@ PlayerGUIDs CommandAB::GetABFlagRangePlayerByTeam(uint32 abNode, TeamId team)
|
||||
PlayerGUIDs existPlayers;
|
||||
if (!m_pBattleground || abNode >= BG_AB_BattlegroundNodes::BG_AB_DYNAMIC_NODES_COUNT)
|
||||
return existPlayers;
|
||||
GameObject* pBGNode = m_pBattleground->GetBGObject(abNode * 8);
|
||||
// Meme correction que dans ProcessABNodeRequirement : une banniere
|
||||
// par noeud, aux indices 0 a 4.
|
||||
GameObject* pBGNode = m_pBattleground->GetBGObject(BG_AB_ObjectType::BG_AB_OBJECT_BANNER + abNode);
|
||||
if (!pBGNode)
|
||||
return existPlayers;
|
||||
NearPlayerList playersNearby;
|
||||
|
||||
@@ -731,9 +731,16 @@ GameObject const* BattlegroundAB::GetNearGameObjectFlag(const Player* player)
|
||||
// cliquable si neutre, ou tenu/conteste par l equipe adverse
|
||||
if (!(status == 0 || teamIndex == status % 2))
|
||||
continue;
|
||||
// BgObjects[node*8 + status] = banniere affichee pour cet etat (0=neutre,
|
||||
// 1/2=contestee A/H, 3/4=occupee A/H)
|
||||
GameObject* flag = GetBgMap()->GetGameObject(BgObjects[node * 8 + status]);
|
||||
// Ce coeur n'a QU'UNE banniere par noeud, aux indices 0 a 4
|
||||
// (BG_AB_OBJECT_BANNER + node) : _ChangeBanner modifie son visuel
|
||||
// selon l'etat au lieu d'echanger huit objets distincts.
|
||||
//
|
||||
// L'indexation node*8+status ecrite ici venait de l'ancien Bassin
|
||||
// d'Arathi de TrinityCore, ou chaque noeud possedait bien huit
|
||||
// objets. Elle donnait 24 pour le noeud 3 et 32 pour le noeud 4,
|
||||
// dans un tableau qui n'en compte que 22 : lecture hors limites,
|
||||
// GUID arbitraires, et plantage selon ce qui suit le tampon.
|
||||
GameObject* flag = GetBGObject(BG_AB_OBJECT_BANNER + node, false);
|
||||
if (!flag || !flag->isSpawned())
|
||||
continue;
|
||||
float dist = player->GetDistance(flag);
|
||||
|
||||
@@ -83,9 +83,9 @@ char const* CapitalSiegeMgr::GetTeamName(TeamId team)
|
||||
{
|
||||
switch (team)
|
||||
{
|
||||
case TEAM_ALLIANCE: return "Alliance";
|
||||
case TEAM_HORDE: return "Horde";
|
||||
default: return "aucune";
|
||||
case TEAM_ALLIANCE: return "Альянса";
|
||||
case TEAM_HORDE: return "Орды";
|
||||
default: return "неизвестной стороны";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,7 +208,7 @@ void CapitalSiegeMgr::LoadConfig()
|
||||
m_targets[TEAM_HORDE].bossLevel = sConfigMgr->GetIntDefault("siege_alliance_boss_level", 0);
|
||||
m_targets[TEAM_HORDE].bossHealth = uint64(sConfigMgr->GetIntDefault("siege_alliance_boss_health", 0));
|
||||
m_targets[TEAM_HORDE].bossFaction = sConfigMgr->GetIntDefault("siege_alliance_boss_faction", 0);
|
||||
m_targets[TEAM_HORDE].cityName = "Hurlevent";
|
||||
m_targets[TEAM_HORDE].cityName = "Штормград";
|
||||
|
||||
TC_LOG_INFO("server.loading", "Siege des Capitales: %s (plage %02uh-%02uh, %u bots niveau %u, duree max %u min).",
|
||||
m_enabled ? "actif" : "inactif", m_hourMin, m_hourMax, m_botCount, m_botLevel, m_duration / MINUTE);
|
||||
@@ -392,7 +392,7 @@ bool CapitalSiegeMgr::StartSiege(TeamId attacker, std::string const& trigger)
|
||||
GetTeamName(attacker), m_target->cityName, trigger.c_str());
|
||||
|
||||
if (m_announce)
|
||||
Announce("|cffff2020[Siege des Capitales]|r Une armee de la %s marche sur %s !", GetTeamName(attacker), m_target->cityName);
|
||||
Announce("|cffff2020[Осада столиц]|r Армия %s выступила на %s!", GetTeamName(attacker), m_target->cityName);
|
||||
|
||||
// E7 : demarrage du spawn etale de la horde d invasion.
|
||||
// E8 : eveil du dirigeant de la capitale.
|
||||
@@ -431,10 +431,10 @@ void CapitalSiegeMgr::StopSiege(CapitalSiegeOutcome outcome)
|
||||
if (m_announce)
|
||||
{
|
||||
if (outcome == SIEGE_OUTCOME_VICTORY)
|
||||
Announce("|cffff2020[Siege des Capitales]|r %s est tombee : le dirigeant a ete abattu par la %s !",
|
||||
m_target ? m_target->cityName : "La capitale", GetTeamName(m_attackerTeam));
|
||||
Announce("|cffff2020[Осада столиц]|r %s пал: правитель убит армией %s!",
|
||||
m_target ? m_target->cityName : "Столица", GetTeamName(m_attackerTeam));
|
||||
else if (outcome == SIEGE_OUTCOME_TIMEOUT)
|
||||
Announce("|cff20ff20[Siege des Capitales]|r L assaut sur %s a ete repousse.", m_target ? m_target->cityName : "la capitale");
|
||||
Announce("|cff20ff20[Осада столиц]|r Штурм города %s отражён.", m_target ? m_target->cityName : "столица");
|
||||
}
|
||||
|
||||
m_status = SIEGE_STATUS_IDLE;
|
||||
|
||||
@@ -1574,6 +1574,29 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad
|
||||
|
||||
GetMap()->AddBattlePet(this);
|
||||
|
||||
// SONDE TEMPORAIRE - carte 1460. Etat REEL en memoire une fois la
|
||||
// creature entierement chargee depuis la base, pour le comparer a ce
|
||||
// que dit la table. Une sur dix : il y en a 757.
|
||||
//
|
||||
// La version precedente etait posee dans un bloc de rechargement que
|
||||
// ce chemin n'emprunte jamais -- elle n'a produit aucune ligne.
|
||||
if (GetMapId() == 1460)
|
||||
{
|
||||
static uint32 sondeSpawn = 0;
|
||||
if ((++sondeSpawn % 10) == 1)
|
||||
{
|
||||
TC_LOG_ERROR("misc",
|
||||
"SPAWNDBG %s (entree %u) | faction=%u niveau=%u | pv=" UI64FMTD "/" UI64FMTD
|
||||
" | vivante=%u | drapeaux=%u drapeaux2=%u dynamiques=%u | phases=%u",
|
||||
GetName().c_str(), GetEntry(), getFaction(), getLevel(),
|
||||
GetHealth(), GetMaxHealth(),
|
||||
uint32(IsAlive() ? 1 : 0),
|
||||
GetUInt32Value(UNIT_FIELD_FLAGS), GetUInt32Value(UNIT_FIELD_FLAGS_2),
|
||||
GetUInt32Value(OBJECT_DYNAMIC_FLAGS),
|
||||
uint32(GetPhaseShift().GetPhases().size()));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3336,6 +3359,7 @@ void Creature::ReLoad(bool skipDB)
|
||||
if (IsAIEnabled)
|
||||
AI()->EnterEvadeMode();
|
||||
|
||||
|
||||
TC_LOG_DEBUG("sql.sql", "Creature SpawnID (" SI64FMTD ") reloaded.", GetSpawnId());
|
||||
}
|
||||
|
||||
|
||||
@@ -2777,7 +2777,11 @@ GameObject* WorldObject::SummonGameObject(uint32 entry, Position const& pos, Qua
|
||||
go->SetVisibleBySummonerOnly(visibleBySummonerOnly);
|
||||
|
||||
go->SetRespawnTime(respawnTime);
|
||||
if (GetTypeId() == TYPEID_PLAYER || GetTypeId() == TYPEID_UNIT) //not sure how to handle this
|
||||
// Un coffre de butin ne doit pas etre rattache a son invocateur : les objets
|
||||
// rattaches sont detruits avec lui (RemoveAllGameObjects), donc le coffre d'un
|
||||
// boss disparaissait cote serveur des que son cadavre s'effacait -- le raid
|
||||
// voyait encore le coffre mais ne pouvait plus l'ouvrir (Ragnaros, entre autres).
|
||||
if ((GetTypeId() == TYPEID_PLAYER || GetTypeId() == TYPEID_UNIT) && goinfo->type != GAMEOBJECT_TYPE_CHEST)
|
||||
ToUnit()->AddGameObject(go);
|
||||
else
|
||||
go->SetSpawnedByDefault(false);
|
||||
|
||||
@@ -243,7 +243,30 @@ void KillRewarder::_RewardGroup()
|
||||
if (member->IsAtGroupRewardDistance(_victim))
|
||||
{
|
||||
_RewardPlayer(member, isDungeon);
|
||||
member->UpdateCriteria(CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, 0, _victim);
|
||||
|
||||
// =============================================
|
||||
// SylvaniaCore : ce credit est JcJ.
|
||||
//
|
||||
// SIGNALE EN JEU : « j ai attaque un petit groupe
|
||||
// de demons et j ai recu le haut fait Courroux
|
||||
// de l Alliance, totalement hors sujet ». Ce
|
||||
// haut fait demande de tuer cinq joueurs de la
|
||||
// Horde dans chaque grande ville.
|
||||
//
|
||||
// La ligne suivante creditait un meurtre JcJ a
|
||||
// chaque membre du groupe pour N IMPORTE QUELLE
|
||||
// mort, creatures comprises. Elle ne se voyait
|
||||
// pas tant qu on jouait seul : ce bloc n est
|
||||
// parcouru qu en groupe. L escorte de
|
||||
// mercenaires l a mise au jour.
|
||||
//
|
||||
// TrinityCore ne fait pas cette mise a jour du
|
||||
// tout, ni en 3.3.5 ni en master : c est un
|
||||
// ajout local, pose sans le garde-fou _isPvP
|
||||
// que ce fichier emploie partout ailleurs.
|
||||
// =============================================
|
||||
if (_isPvP)
|
||||
member->UpdateCriteria(CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, 0, _victim);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2092,8 +2092,7 @@ void Player::ProcessDelayedOperations()
|
||||
{
|
||||
uint8 teamID = battle->Teams[PETBATTLE_TEAM_1]->OwnerGuid == GetGUID() ? PETBATTLE_TEAM_1 : PETBATTLE_TEAM_2;
|
||||
|
||||
PetBattleRequest request;
|
||||
memcpy(&request, &battle->PvPMatchMakingRequest, sizeof(PetBattleRequest)); //@TODO check that
|
||||
PetBattleRequest request = battle->PvPMatchMakingRequest;
|
||||
|
||||
auto& matchMakingRequest = battle->PvPMatchMakingRequest;
|
||||
|
||||
@@ -20227,14 +20226,15 @@ bool Player::QuestObjectiveActiveInPlayerByObject(uint32 objectId)
|
||||
continue;
|
||||
|
||||
for (QuestObjective const& obj : quest->GetObjectives())
|
||||
{
|
||||
if ((uint32)obj.ObjectID == objectId)
|
||||
{
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SylvaniaCore : sans ce return, sortir de la boucle etait un comportement
|
||||
// indefini -- GCC en deduisait que la boucle ne pouvait pas se terminer et
|
||||
// supprimait le test q < MAX_QUEST_LOG_SIZE. Le slot grimpait au-dela de 25
|
||||
// jusqu a sortir du tableau de valeurs du joueur (ASSERT dans GetUInt32Value).
|
||||
return false;
|
||||
}
|
||||
|
||||
PlayerPetData* Player::GetPlayerPetDataById(uint32 petId)
|
||||
|
||||
@@ -8314,6 +8314,42 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo
|
||||
{
|
||||
ASSERT(target);
|
||||
|
||||
// SONDE TEMPORAIRE - carte 1460 uniquement, et seulement quand un
|
||||
// JOUEUR vise une CREATURE. Volume borne : quelques lignes par seconde
|
||||
// au plus, et uniquement dans ce scenario.
|
||||
if (GetTypeId() == TYPEID_PLAYER && target->GetTypeId() == TYPEID_UNIT && GetMapId() == 1460)
|
||||
{
|
||||
// On ne veut QUE les demons statiques : factions 2780 et 1768.
|
||||
// Les invoques (faction 16) fonctionnent deja et polluaient le
|
||||
// releve.
|
||||
uint32 const factionCible = target->getFaction();
|
||||
static uint32 sondeAtt = 0;
|
||||
if ((factionCible == 2780 || factionCible == 1768) && (++sondeAtt % 5) == 1)
|
||||
{
|
||||
TC_LOG_ERROR("misc",
|
||||
"ATTDBG cible %s (entree %u) | vivante=%u etatInattaquable=%u | drapeaux=%u "
|
||||
"(NON_ATTACKABLE=%u NOT_ATTACKABLE_1=%u UNK_16=%u IMMUNE_PC=%u NOT_SELECTABLE=%u) "
|
||||
"| reaction=%d | jeLaVois=%u | mesPhases=%u sesPhases=%u "
|
||||
"| factionCible=%u maFaction=%u | elleMEstHostile=%u jeLuiSuisHostile=%u",
|
||||
target->GetName().c_str(), target->GetEntry(),
|
||||
uint32(target->IsAlive() ? 1 : 0),
|
||||
uint32(target->HasUnitState(UNIT_STATE_UNATTACKABLE) ? 1 : 0),
|
||||
target->GetUInt32Value(UNIT_FIELD_FLAGS),
|
||||
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) ? 1 : 0),
|
||||
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_1) ? 1 : 0),
|
||||
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_16) ? 1 : 0),
|
||||
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) ? 1 : 0),
|
||||
uint32(target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE) ? 1 : 0),
|
||||
int32(GetReactionTo(target)),
|
||||
uint32(CanSeeOrDetect(target, true) ? 1 : 0),
|
||||
uint32(GetPhaseShift().GetPhases().size()),
|
||||
uint32(target->GetPhaseShift().GetPhases().size()),
|
||||
factionCible, getFaction(),
|
||||
uint32(target->IsHostileTo(this) ? 1 : 0),
|
||||
uint32(IsHostileTo(target) ? 1 : 0));
|
||||
}
|
||||
}
|
||||
|
||||
// can't attack self
|
||||
if (this == target)
|
||||
return false;
|
||||
|
||||
@@ -642,11 +642,11 @@ void Garrison::AddMission(uint32 garrMissionId)
|
||||
reward.FollowerXP = 0;
|
||||
reward.BonusAbilityID = 0;
|
||||
reward.Unknown = 1118739;
|
||||
std::vector<GarrssionMissionReward>* fRewards = sObjectMgr->GetGarrssionMissionReward(garrMissionId);
|
||||
if (fRewards)
|
||||
std::vector<GarrssionMissionReward> fRewards = sObjectMgr->GetGarrssionMissionReward(garrMissionId);
|
||||
if (!fRewards.empty())
|
||||
{
|
||||
Trinity::Containers::RandomShuffle(*fRewards);
|
||||
for (auto _reward : *fRewards)
|
||||
Trinity::Containers::RandomShuffle(fRewards);
|
||||
for (auto _reward : fRewards)
|
||||
{
|
||||
// if (_reward.RewardType == GarrisonMission::MissionRewardType::Item)
|
||||
{
|
||||
@@ -1086,13 +1086,16 @@ void Garrison::CalculateMissonBonusRoll(uint32 garrMissionId)
|
||||
|
||||
void Garrison::RewardMission(Mission* mission, bool withOvermaxReward)
|
||||
{
|
||||
auto rewardLists = { mission->Rewards };
|
||||
// SylvaniaCore : reaffecter une initializer_list ne prolonge pas la duree de
|
||||
// vie du tableau sous-jacent -- la boucle parcourait un temporaire detruit.
|
||||
std::vector<decltype(&mission->Rewards)> rewardLists;
|
||||
rewardLists.push_back(&mission->Rewards);
|
||||
if (withOvermaxReward)
|
||||
rewardLists = { mission->Rewards, mission->BonusRewards };
|
||||
rewardLists.push_back(&mission->BonusRewards);
|
||||
|
||||
for (auto rewards : rewardLists)
|
||||
for (auto const* rewards : rewardLists)
|
||||
{
|
||||
for (WorldPackets::Garrison::GarrisonMissionReward reward : rewards)
|
||||
for (WorldPackets::Garrison::GarrisonMissionReward reward : *rewards)
|
||||
{
|
||||
if (reward.ItemID)
|
||||
GetOwner()->AddItem(reward.ItemID, reward.ItemQuantity);
|
||||
|
||||
@@ -169,12 +169,12 @@ bool WodGarrison::Upgrade()
|
||||
_owner->SendGarrisonRemoteInfo();
|
||||
PhasingHandler::OnConditionChange(_owner);
|
||||
|
||||
TeleportOwnerAndPlayMovie();
|
||||
TeleportOwnerToGarrison();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WodGarrison::TeleportOwnerAndPlayMovie() const
|
||||
void WodGarrison::TeleportOwnerToGarrison() const
|
||||
{
|
||||
Position WodGarrisonEntrancePositions[2][3] =
|
||||
{
|
||||
@@ -192,12 +192,13 @@ void WodGarrison::TeleportOwnerAndPlayMovie() const
|
||||
}
|
||||
};
|
||||
|
||||
_owner->AddMovieDelayedAction(_siteLevel->UpgradeMovieID, [this, WodGarrisonEntrancePositions]
|
||||
{
|
||||
_owner->TeleportTo(_siteLevel->MapID, WodGarrisonEntrancePositions[GetFaction()][_siteLevel->GarrLevel - 1]);
|
||||
});
|
||||
|
||||
_owner->SendMovieStart(_siteLevel->UpgradeMovieID);
|
||||
/// Le film d'etablissement du fief (189 Horde / 192 Alliance, et 190/191/193/194
|
||||
/// aux niveaux suivants) fige le client : le joueur doit se reconnecter. Comme il
|
||||
/// n'envoie alors jamais CMSG_COMPLETE_MOVIE, l'action differee ne partait pas et
|
||||
/// il n'etait jamais teleporte dans son fief. On teleporte donc directement.
|
||||
/// Remettre AddMovieDelayedAction + SendMovieStart(_siteLevel->UpgradeMovieID) le
|
||||
/// jour ou la cause du gel cote client sera connue.
|
||||
_owner->TeleportTo(_siteLevel->MapID, WodGarrisonEntrancePositions[GetFaction()][_siteLevel->GarrLevel - 1]);
|
||||
}
|
||||
|
||||
void WodGarrison::Delete()
|
||||
|
||||
@@ -84,7 +84,7 @@ public:
|
||||
bool Create(uint32 garrSiteId) override;
|
||||
bool CanUpgrade(bool checkCost = true);
|
||||
bool Upgrade();
|
||||
void TeleportOwnerAndPlayMovie() const;
|
||||
void TeleportOwnerToGarrison() const;
|
||||
void Delete() override;
|
||||
|
||||
void Enter() override;
|
||||
|
||||
@@ -319,7 +319,11 @@ Battlepay::Product const& BattlePayDataStoreMgr::GetProduct(uint32 productID) co
|
||||
{
|
||||
if (ProductExist(productID))
|
||||
return _products.at(productID);
|
||||
return{};
|
||||
|
||||
// SylvaniaCore : "return{}" rendait une reference sur un temporaire detruit
|
||||
// des le retour ; les huit appelants lisaient de la memoire morte.
|
||||
static Battlepay::Product const emptyProduct{};
|
||||
return emptyProduct;
|
||||
}
|
||||
|
||||
Battlepay::DisplayInfo const* BattlePayDataStoreMgr::GetDisplayInfo(uint32 id) const
|
||||
|
||||
@@ -3307,7 +3307,10 @@ void ObjectMgr::LoadGarrssionMissionReward()
|
||||
TC_LOG_INFO("server.loading", ">> Loaded garrssion_mission_reward in %u ms", GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
std::vector<GarrssionMissionReward>* ObjectMgr::GetGarrssionMissionReward(uint32 id)
|
||||
// SylvaniaCore : cette fonction rendait l adresse d un vecteur local. L appelant
|
||||
// (Garrison::...) melangeait puis parcourait un objet deja detruit -- ecriture et
|
||||
// lecture dans une pile liberee. On rend desormais le vecteur par valeur.
|
||||
std::vector<GarrssionMissionReward> ObjectMgr::GetGarrssionMissionReward(uint32 id)
|
||||
{
|
||||
std::vector<GarrssionMissionReward> _reward;
|
||||
for (auto& __reward : GarrssionMissionRewardMap)
|
||||
@@ -3315,10 +3318,7 @@ std::vector<GarrssionMissionReward>* ObjectMgr::GetGarrssionMissionReward(uint32
|
||||
if (__reward.MissionId == id)
|
||||
_reward.push_back(__reward);
|
||||
}
|
||||
if (_reward.size() > 0)
|
||||
return &_reward;
|
||||
else
|
||||
return nullptr;
|
||||
return _reward;
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadVehicleTemplateAccessories()
|
||||
|
||||
@@ -999,7 +999,7 @@ class TC_GAME_API ObjectMgr
|
||||
ItemTemplateContainer const* GetItemTemplateStore() const { return &_itemTemplateStore; }
|
||||
|
||||
void LoadGarrssionMissionReward();
|
||||
std::vector<GarrssionMissionReward>* GetGarrssionMissionReward(uint32 id);
|
||||
std::vector<GarrssionMissionReward> GetGarrssionMissionReward(uint32 id);
|
||||
std::vector<GarrssionMissionReward> GarrssionMissionRewardMap;
|
||||
|
||||
ScriptParams const& GetScriptParam(ObjectGuid::LowType lowGuid) { return _scriptParamContainer[lowGuid]; }
|
||||
|
||||
@@ -1172,7 +1172,20 @@ void Group::GroupLoot(Loot* loot, WorldObject* lootedObject)
|
||||
if (i->freeforall)
|
||||
continue;
|
||||
|
||||
item = ASSERT_NOTNULL(sObjectMgr->GetItemTemplate(i->itemid));
|
||||
// Les devises (Item negatif dans les tables de butin) occupent le meme tableau
|
||||
// que les objets mais n'ont pas de modele d'objet. Les laisser arriver jusqu'a
|
||||
// l'ASSERT tuait le worldserver des qu'un groupe ouvrait le butin d'un boss qui
|
||||
// en lache -- ceux de la Prison violette, entre autres.
|
||||
if (i->type != LOOT_ITEM_TYPE_ITEM)
|
||||
continue;
|
||||
|
||||
item = sObjectMgr->GetItemTemplate(i->itemid);
|
||||
if (!item)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Group::GroupLoot: objet %u introuvable dans les donnees, ignore dans le butin de %s",
|
||||
i->itemid, lootedObject->GetGUID().ToString().c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
//roll for over-threshold item if it's one-player loot
|
||||
if (item->GetQuality() >= uint32(m_lootThreshold))
|
||||
@@ -1247,7 +1260,13 @@ void Group::GroupLoot(Loot* loot, WorldObject* lootedObject)
|
||||
if (!i->follow_loot_rules)
|
||||
continue;
|
||||
|
||||
if (i->type != LOOT_ITEM_TYPE_ITEM)
|
||||
continue;
|
||||
|
||||
item = sObjectMgr->GetItemTemplate(i->itemid);
|
||||
if (!item)
|
||||
continue;
|
||||
|
||||
Roll* r = new Roll(*i);
|
||||
|
||||
for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next())
|
||||
|
||||
@@ -199,7 +199,36 @@ void WorldSession::HandleChatMessage(ChatMsg type, uint32 lang, std::string msg,
|
||||
if (msg.empty())
|
||||
return;
|
||||
|
||||
if (ChatHandler(this).ParseCommands(msg.c_str()))
|
||||
// =================================================================
|
||||
// ORDRE_AUX_COMPAGNONS
|
||||
//
|
||||
// SIGNALE EN JEU : « !summon repond "You can't teleport yourself to
|
||||
// yourself", et !follow repond "There is no such command" ».
|
||||
//
|
||||
// ChatHandler::ParseCommands traite le point d'exclamation comme un
|
||||
// prefixe de commande au meme titre que le point :
|
||||
// if (text[0] != '!' && text[0] != '.') return false;
|
||||
// Il intercepte donc tout ordre avant qu'il n'atteigne le canal de
|
||||
// groupe, ou Group::ProcessGroupBotCommand l'attend. Le systeme
|
||||
// d'ordres aux playerbots etait inaccessible depuis toujours --
|
||||
// « !summon » partait vers la commande de maitre de jeu du meme nom.
|
||||
//
|
||||
// On laisse passer les messages en « ! » lorsque le joueur commande
|
||||
// effectivement des bots. Un maitre de jeu sans compagnon garde ses
|
||||
// commandes en « ! » ; celui qui en a passe par le point, qui reste
|
||||
// le prefixe principal.
|
||||
bool ordreAuxCompagnons = false;
|
||||
if (!msg.empty() && msg[0] == '!')
|
||||
if (Group* groupe = GetPlayer()->GetGroup())
|
||||
for (GroupReference* itr = groupe->GetFirstMember(); itr != nullptr; itr = itr->next())
|
||||
if (Player* membre = itr->GetSource())
|
||||
if (membre->IsPlayerBot())
|
||||
{
|
||||
ordreAuxCompagnons = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!ordreAuxCompagnons && ChatHandler(this).ParseCommands(msg.c_str()))
|
||||
return;
|
||||
|
||||
// Strip invisible characters for non-addon messages
|
||||
|
||||
@@ -993,6 +993,68 @@ void WorldSession::HandleSetRaidDifficultyOpcode(WorldPackets::Misc::SetRaidDiff
|
||||
}
|
||||
}
|
||||
|
||||
// Les raids d'avant Warlords ne passent pas par CMSG_SET_RAID_DIFFICULTY pour le mode
|
||||
// heroique : le client envoie CMSG_TOGGLE_DIFFICULTY, sans rien preciser, et attend que
|
||||
// le serveur bascule entre normal et heroique en conservant la taille du raid. Cet
|
||||
// opcode n'etait pas traite du tout, si bien que le client repondait « vous ne remplissez
|
||||
// pas les conditions requises » -- impossible de monter les Terres de feu en heroique.
|
||||
void WorldSession::HandleToggleDifficultyOpcode(WorldPackets::Misc::ToggleDifficulty& /*toggleDifficulty*/)
|
||||
{
|
||||
Difficulty difficultyID;
|
||||
switch (_player->GetLegacyRaidDifficultyID())
|
||||
{
|
||||
case DIFFICULTY_10_N: difficultyID = DIFFICULTY_10_HC; break;
|
||||
case DIFFICULTY_25_N: difficultyID = DIFFICULTY_25_HC; break;
|
||||
case DIFFICULTY_10_HC: difficultyID = DIFFICULTY_10_N; break;
|
||||
case DIFFICULTY_25_HC: difficultyID = DIFFICULTY_25_N; break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
// Memes garde-fous que le changement de difficulte ordinaire : on ne bascule pas
|
||||
// depuis l'interieur d'une instance, et seul le chef decide pour le groupe.
|
||||
Map* map = _player->FindMap();
|
||||
if (map && map->IsDungeon())
|
||||
{
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleToggleDifficultyOpcode: player (Name: %s, %s) tried to toggle the difficulty while inside an instance!",
|
||||
_player->GetName().c_str(), _player->GetGUID().ToString().c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
Group* group = _player->GetGroup();
|
||||
if (group)
|
||||
{
|
||||
if (!group->IsLeader(_player->GetGUID()))
|
||||
return;
|
||||
|
||||
for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
|
||||
{
|
||||
Player* groupGuy = itr->GetSource();
|
||||
if (!groupGuy)
|
||||
continue;
|
||||
|
||||
if (!groupGuy->IsInMap(groupGuy))
|
||||
return;
|
||||
|
||||
if (groupGuy->GetMap()->IsRaid())
|
||||
{
|
||||
TC_LOG_DEBUG("network", "WorldSession::HandleToggleDifficultyOpcode: %s tried to toggle the difficulty while group member (Name: %s, %s) is inside!",
|
||||
_player->GetGUID().ToString().c_str(), groupGuy->GetName().c_str(), groupGuy->GetGUID().ToString().c_str());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
group->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, true, true, _player);
|
||||
group->SetLegacyRaidDifficultyID(difficultyID);
|
||||
}
|
||||
else
|
||||
{
|
||||
_player->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, true, true);
|
||||
_player->SetLegacyRaidDifficultyID(difficultyID);
|
||||
_player->SendRaidDifficulty(true);
|
||||
}
|
||||
}
|
||||
|
||||
void WorldSession::HandleSetTaxiBenchmark(WorldPackets::Misc::SetTaxiBenchmarkMode& packet)
|
||||
{
|
||||
_player->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_TAXI_BENCHMARK, packet.Enable);
|
||||
|
||||
@@ -96,6 +96,10 @@ void WorldSession::HandleQuestgiverHelloOpcode(WorldPackets::Quest::QuestGiverHe
|
||||
if (sScriptMgr->OnGossipHello(_player, creature))
|
||||
return;
|
||||
|
||||
// Un PNJ purement donneur de quete (sans drapeau papotage) recoit CMSG_QUESTGIVER_HELLO
|
||||
// au lieu de CMSG_GOSSIP_HELLO : sans cet appel, les objectifs \"Parler a\" ne sont jamais valides.
|
||||
_player->TalkedToCreature(creature->GetEntry(), creature->GetGUID());
|
||||
|
||||
_player->PrepareGossipMenu(creature, creature->GetCreatureTemplate()->GossipMenuId, true);
|
||||
_player->SendPreparedGossip(creature);
|
||||
|
||||
|
||||
@@ -714,7 +714,40 @@ void InstanceScript::DoUpdateCriteria(CriteriaTypes type, uint32 miscValue1 /*=
|
||||
|
||||
void InstanceScript::DoSendEventScenario(uint32 eventId /*= 0*/)
|
||||
{
|
||||
DoUpdateCriteria(CRITERIA_TYPE_SEND_EVENT_SCENARIO, eventId, 0, nullptr);
|
||||
// =================================================================
|
||||
// SylvaniaCore : un evenement de scenario ne compte QU UNE FOIS.
|
||||
//
|
||||
// SIGNALE EN JEU : « un petit groupe de demons m a valide les 33/33
|
||||
// et les 3/3 gangreseigneurs d un coup ».
|
||||
//
|
||||
// DoUpdateCriteria diffuse a CHAQUE joueur de l instance, et
|
||||
// Player::UpdateCriteria transmet ensuite au scenario :
|
||||
// if (Scenario* scenario = GetScenario())
|
||||
// scenario->UpdateCriteria(...);
|
||||
// Or ce compteur est PARTAGE par toute l instance. Chaque mort etait
|
||||
// donc comptee autant de fois qu il y avait de joueurs presents --
|
||||
// cinq, avec une escorte de mercenaires. Sept demons suffisaient a
|
||||
// remplir un objectif qui en demande trente-trois.
|
||||
//
|
||||
// Le defaut restait invisible tant qu on jouait seul : un joueur,
|
||||
// un credit. L escorte l a mis au jour.
|
||||
//
|
||||
// On credite desormais le scenario une seule fois, en lui passant
|
||||
// un joueur de reference pour les conditions qui en dependent.
|
||||
// =================================================================
|
||||
Scenario* scenario = instance->GetInstanceScenario();
|
||||
if (!scenario)
|
||||
return;
|
||||
|
||||
Map::PlayerList const& liste = instance->GetPlayers();
|
||||
for (Map::PlayerList::const_iterator i = liste.begin(); i != liste.end(); ++i)
|
||||
{
|
||||
if (Player* reference = i->GetSource())
|
||||
{
|
||||
scenario->UpdateCriteria(CRITERIA_TYPE_SEND_EVENT_SCENARIO, eventId, 0, 0, nullptr, reference);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Start timed achievement for all players in instance
|
||||
|
||||
@@ -570,7 +570,7 @@ class TC_GAME_API InstanceScript : public ZoneScript
|
||||
uint64 m_InstanceGuid;
|
||||
uint32 m_BeginningTime;
|
||||
uint32 m_ScenarioID;
|
||||
uint8 m_ScenarioStep;
|
||||
uint32 m_ScenarioStep; // SylvaniaCore : ID de ScenarioStep, un uint8 tronquait la valeur
|
||||
uint32 m_LastResetTime;
|
||||
uint8 m_ChallengeLevel;
|
||||
uint8 m_DeathCount;
|
||||
|
||||
@@ -331,7 +331,7 @@ bool MercenaryChatMgr::HandleApiCommand(Player* owner, std::string const& argume
|
||||
|
||||
if (!m_enabled)
|
||||
{
|
||||
handler.PSendSysMessage("|cffff0000[Mercenaire]|r Le dialogue par intelligence artificielle est desactive sur ce royaume.");
|
||||
handler.PSendSysMessage("|cffff0000[Наёмник]|r Диалоги с искусственным интеллектом отключены на этом сервере.");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -341,28 +341,28 @@ bool MercenaryChatMgr::HandleApiCommand(Player* owner, std::string const& argume
|
||||
|
||||
if (first.empty() || first == "aide" || first == "help")
|
||||
{
|
||||
handler.PSendSysMessage("|cff00ff00[Mercenaire]|r Pour delier la langue de votre mercenaire, fournissez votre propre cle :");
|
||||
handler.PSendSysMessage(" |cffffd100!api <fournisseur> <modele> <cle>|r");
|
||||
handler.PSendSysMessage(" fournisseurs : |cffffd100mistral|r, |cffffd100anthropic|r, |cffffd100openai|r, |cffffd100gemini|r");
|
||||
handler.PSendSysMessage(" exemple : |cffffd100!api mistral mistral-small-latest VOTRE_CLE|r");
|
||||
handler.PSendSysMessage(" |cffff8800Gemini ne repond pas depuis ce royaume|r (Google refuse les serveurs).");
|
||||
handler.PSendSysMessage(" service compatible OpenAI (Groq, OpenRouter...) : ajoutez l'adresse en fin de ligne.");
|
||||
handler.PSendSysMessage(" |cffffd100!api off|r retire votre cle immediatement.");
|
||||
handler.PSendSysMessage("Votre cle n'est jamais enregistree : elle vit en memoire et disparait a la rupture du contrat ou a votre deconnexion.");
|
||||
handler.PSendSysMessage("|cff00ff00[Наёмник]|r Чтобы наёмник заговорил, укажите собственный ключ API:");
|
||||
handler.PSendSysMessage(" |cffffd100!api <провайдер> <модель> <ключ>|r");
|
||||
handler.PSendSysMessage(" провайдеры: |cffffd100mistral|r, |cffffd100anthropic|r, |cffffd100openai|r, |cffffd100gemini|r");
|
||||
handler.PSendSysMessage(" пример: |cffffd100!api mistral mistral-small-latest ВАШ_КЛЮЧ|r");
|
||||
handler.PSendSysMessage(" |cffff8800Gemini не отвечает с этого сервера|r (Google отклоняет запросы сервера).");
|
||||
handler.PSendSysMessage(" OpenAI-совместимый сервис (Groq, OpenRouter...): добавьте адрес в конец команды.");
|
||||
handler.PSendSysMessage(" |cffffd100!api off|r немедленно удаляет ваш ключ.");
|
||||
handler.PSendSysMessage("Ключ нигде не сохраняется: он хранится только в памяти и исчезает при разрыве договора или выходе из игры.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (first == "off" || first == "stop" || first == "clear")
|
||||
{
|
||||
ClearCredential(owner->GetGUID());
|
||||
handler.PSendSysMessage("|cff00ff00[Mercenaire]|r Votre cle a ete effacee. Vos mercenaires redeviennent muets.");
|
||||
handler.PSendSysMessage("|cff00ff00[Наёмник]|r Ключ удалён. Ваши наёмники снова замолчали.");
|
||||
return true;
|
||||
}
|
||||
|
||||
uint8 const provider = ParseProvider(first);
|
||||
if (provider == MERC_LLM_UNKNOWN)
|
||||
{
|
||||
handler.PSendSysMessage("|cffff0000[Mercenaire]|r Fournisseur inconnu. Attendus : openai, anthropic, gemini.");
|
||||
handler.PSendSysMessage("|cffff0000[Наёмник]|r Неизвестный провайдер. Доступны: openai, anthropic, gemini.");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -371,7 +371,7 @@ bool MercenaryChatMgr::HandleApiCommand(Player* owner, std::string const& argume
|
||||
|
||||
if (model.empty() || key.empty())
|
||||
{
|
||||
handler.PSendSysMessage("|cffff0000[Mercenaire]|r Il manque le modele ou la cle. Tapez |cffffd100!api|r pour l'aide.");
|
||||
handler.PSendSysMessage("|cffff0000[Наёмник]|r Не указана модель или ключ. Введите |cffffd100!api|r для справки.");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -391,9 +391,9 @@ bool MercenaryChatMgr::HandleApiCommand(Player* owner, std::string const& argume
|
||||
|
||||
// La longueur seule est renvoyee : de quoi verifier une faute de frappe sans
|
||||
// jamais reafficher le secret.
|
||||
handler.PSendSysMessage("|cff00ff00[Mercenaire]|r Cle acceptee (%s, modele %s, %u caracteres). Vos mercenaires peuvent desormais vous repondre.",
|
||||
handler.PSendSysMessage("|cff00ff00[Наёмник]|r Ключ принят (%s, модель %s, %u символов). Теперь наёмники могут отвечать вам.",
|
||||
GetProviderName(provider), model.c_str(), uint32(key.size()));
|
||||
handler.PSendSysMessage("Parlez-leur normalement : chuchotement, canal de groupe ou a voix haute. Les ordres, eux, commencent par |cffffd100!|r.");
|
||||
handler.PSendSysMessage("Общайтесь обычным сообщением: шёпотом, в группе или рядом. Приказы начинаются с |cffffd100!|r.");
|
||||
|
||||
TC_LOG_INFO("server.worldserver", "Mercenaires (dialogue): %s a fourni une cle %s (modele %s).",
|
||||
owner->GetName().c_str(), GetProviderName(provider), model.c_str());
|
||||
@@ -493,7 +493,7 @@ std::string MercenaryChatMgr::BuildSystemPrompt(Player* owner, Player* bot) cons
|
||||
<< "Un portail magique t'a arrache a tes affaires contre cent pieces d'or : tu sers cet employeur "
|
||||
<< "tant que dure le contrat, ni plus, ni moins.\n"
|
||||
|
||||
<< "PARLER : francais, une a trois phrases, jamais davantage. Registre medieval-fantastique, "
|
||||
<< "PARLER : russe uniquement, une a trois phrases, jamais davantage. Registre medieval-fantastique, "
|
||||
<< "rude et image, celui d'un soudard qui a vu trop de champs de bataille. "
|
||||
<< "Tu tutoies ton employeur ; tu l'appelles parfois « patron », « chef » ou par son nom. "
|
||||
<< ClassOaths(bot->getClass()) << " "
|
||||
@@ -526,7 +526,7 @@ std::string MercenaryChatMgr::BuildSystemPrompt(Player* owner, Player* bot) cons
|
||||
<< "te disent rien, et tu le dis franchement si on t en parle.";
|
||||
|
||||
prompt << "\nSITUATION : ";
|
||||
LocaleConstant const locale = owner->GetSession() ? owner->GetSession()->GetSessionDbcLocale() : LOCALE_frFR;
|
||||
LocaleConstant const locale = owner->GetSession() ? owner->GetSession()->GetSessionDbcLocale() : LOCALE_ruRU;
|
||||
if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(bot->GetAreaId()))
|
||||
{
|
||||
prompt << "vous vous tenez a " << area->AreaName->Str[locale];
|
||||
@@ -808,7 +808,7 @@ bool MercenaryChatMgr::PerformOnce(MercenaryChatRequest const& request, std::str
|
||||
|
||||
if (result != CURLE_OK)
|
||||
{
|
||||
error = std::string("Le lien s'est rompu (") + curl_easy_strerror(result) + ").";
|
||||
error = std::string("Связь разорвана (") + curl_easy_strerror(result) + ").";
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -824,15 +824,15 @@ bool MercenaryChatMgr::PerformOnce(MercenaryChatRequest const& request, std::str
|
||||
|
||||
std::ostringstream text;
|
||||
if (httpCode == 401 || httpCode == 403)
|
||||
text << "Votre cle a ete refusee";
|
||||
text << "Ваш ключ отклонён";
|
||||
else if (httpCode == 404)
|
||||
text << "Modele introuvable pour votre cle";
|
||||
text << "Модель недоступна для вашего ключа";
|
||||
else if (httpCode == 429)
|
||||
text << "Votre fournisseur refuse le rythme";
|
||||
text << "Провайдер ограничил частоту запросов";
|
||||
else if (httpCode == 503 || httpCode == 502 || httpCode == 504)
|
||||
text << "Votre fournisseur est surcharge, reessayez dans un instant";
|
||||
text << "Провайдер перегружен, повторите попытку позже";
|
||||
else
|
||||
text << "Le fournisseur a repondu par une erreur";
|
||||
text << "Провайдер вернул ошибку";
|
||||
|
||||
text << " (" << httpCode << ")";
|
||||
if (!detail.empty())
|
||||
@@ -848,7 +848,7 @@ bool MercenaryChatMgr::PerformOnce(MercenaryChatRequest const& request, std::str
|
||||
answer = ExtractAnswer(request.provider, body, parseError);
|
||||
if (answer.empty())
|
||||
{
|
||||
error = parseError.empty() ? "Reponse vide du fournisseur." : parseError;
|
||||
error = parseError.empty() ? "Провайдер вернул пустой ответ." : parseError;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@@ -868,7 +868,7 @@ std::string MercenaryChatMgr::ExtractAnswer(uint8 provider, std::string const& b
|
||||
std::string detail;
|
||||
if (FindJsonString(body, "message", errorSection, detail) && !detail.empty())
|
||||
{
|
||||
error = "Le fournisseur refuse : " + detail;
|
||||
error = "Провайдер отклонил запрос: " + detail;
|
||||
return "";
|
||||
}
|
||||
}
|
||||
@@ -890,14 +890,14 @@ std::string MercenaryChatMgr::ExtractAnswer(uint8 provider, std::string const& b
|
||||
size_t const start = body.find(section);
|
||||
if (start == std::string::npos)
|
||||
{
|
||||
error = "Reponse illisible du fournisseur.";
|
||||
error = "Не удалось прочитать ответ провайдера.";
|
||||
return "";
|
||||
}
|
||||
|
||||
std::string answer;
|
||||
if (!FindJsonString(body, key, start, answer))
|
||||
{
|
||||
error = "Reponse illisible du fournisseur.";
|
||||
error = "Не удалось прочитать ответ провайдера.";
|
||||
return "";
|
||||
}
|
||||
return answer;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user