Merge branch 'master' into Playerbot

This commit is contained in:
Yunfan Li
2023-08-24 22:07:53 +08:00
96 changed files with 3271 additions and 2541 deletions
-9
View File
@@ -6,15 +6,6 @@
/env/dist/* /env/dist/*
!/env/dist/.gitkeep !/env/dist/.gitkeep
/env/user/* /env/user/*
/env/docker/*
!/env/docker/bin/.gitkeep
!/env/docker/data/.gitkeep
!/env/docker/etc/
/env/docker/etc/*
!/env/docker/etc/authserver.conf.dockerdist
!/env/docker/etc/worldserver.conf.dockerdist
!/env/docker/etc/dbimport.conf.dockerdist
!/env/docker/logs/.gitkeep
/.env* /.env*
.idea .idea
!.gitkeep !.gitkeep
+33 -123
View File
@@ -1,166 +1,76 @@
# ![logo](https://raw.githubusercontent.com/azerothcore/azerothcore.github.io/master/images/logo-github.png) AzerothCore # ![logo](https://raw.githubusercontent.com/azerothcore/azerothcore.github.io/master/images/logo-github.png) AzerothCore
[![CodeFactor](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk/badge)](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk) [![CodeFactor](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk/badge)](https://www.codefactor.io/repository/github/azerothcore/azerothcore-wotlk)
[![core-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/core-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Acore-build+branch%3Amaster+event%3Apush) [![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=40032087)](https://www.bountysource.com/teams/azerothcore/bounties "Put money on issues or get paid for fixing them")
[![StackOverflow](http://img.shields.io/badge/stackoverflow-azerothcore-blue.svg?logo=stackoverflow)](https://stackoverflow.com/questions/tagged/azerothcore?sort=newest "Ask / browse questions here")
[![Discord](https://img.shields.io/discord/217589275766685707?logo=discord&logoColor=white)](https://discord.gg/gkt4y2x "Our community hub on Discord")
## Build Status
[![core](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/core_matrix_build.yml/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions/workflows/core_matrix_build.yml)
[![core-modules-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/core-modules-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Acore-modules-build+branch%3Amaster+event%3Apush) [![core-modules-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/core-modules-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Acore-modules-build+branch%3Amaster+event%3Apush)
[![windows-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/windows-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Awindows-build+branch%3Amaster+event%3Apush) [![windows-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/windows-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Awindows-build+branch%3Amaster+event%3Apush)
[![macos-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/macos-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Amacos-build+branch%3Amaster+event%3Apush) [![macos-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/macos-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Amacos-build+branch%3Amaster+event%3Apush)
[![docker-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/docker-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Adocker-build+branch%3Amaster+event%3Apush) [![docker-build](https://github.com/azerothcore/azerothcore-wotlk/workflows/docker-build/badge.svg?branch=master&event=push)](https://github.com/azerothcore/azerothcore-wotlk/actions?query=workflow%3Adocker-build+branch%3Amaster+event%3Apush)
[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=40032087)](https://www.bountysource.com/teams/azerothcore/bounties "Put money on issues or get paid for fixing them")
[![StackOverflow](http://img.shields.io/badge/stackoverflow-azerothcore-blue.svg)](https://stackoverflow.com/questions/tagged/azerothcore?sort=newest "Ask / browse questions here")
[![Discord](https://img.shields.io/discord/217589275766685707.svg)](https://discord.gg/gkt4y2x "Our community hub on Discord")
## Introduction ## Introduction
AzerothCore (AC) is an open-source game-server application for World of Warcraft, currently supporting the 3.3.5a game version. AzerothCore is an open-source game server application and framework designed for hosting massively multiplayer online role-playing games (MMORPGs). It is based on the popular MMORPG World of Warcraft (WoW) and seeks to recreate the gameplay experience of the original game from patch 3.3.5a.
It is written in C++ and is based on MaNGOS, TrinityCore and SunwellCore.
## Why AzerothCore?
1. Stability
1. The authenticity of the content
1. [Modularity](https://en.wikipedia.org/wiki/Modular_programming)
1. A lot of modules to choose from
1. Better configuration files system
1. Compatibility with other emulators
1. Friendly and helpful community
### Stability
As players and administrators ourselves, we take great care into the stability of our core. Other projects focus on the development side of things and tend to forget that users want stability above everything else.
Hence why nobody is allowed to push commits directly to the core. All changes are reviewed and tested before they get to the `master` branch which means we need as many testers as possible to avoid stalling issues.
### Authenticity
Fixing and implementing missing blizzlike content is one of our priorities, and we can boast to offer the most content-complete open-source emulator.
<!-- Not sure for this below -->
<!-- We were the first open-source emulator to have almost every dungeon and raid working. -->
### Modules
Modules are essential to AzerothCore's success. Modules allow users to plug them in and out easily, and do not require to modify the core files. It also means users can keep pulling the git changes from the main repository and only develop their modules.
We have a lot of modules already made, some of them are very important and will ease your work:
* [Transmogrification](https://github.com/azerothcore/mod-transmog)
* [Eluna (lua engine) support](https://github.com/azerothcore/mod-eluna/ "Creator of Eluna is part of our core team")
* Full list available in the AzerothCore catalogue (link at the end)
### Configuration files
Our configuration file system allows the user to use a tiny configuration file for better readability and maintenance.
### Compatibility with other emulators
Not very far from its ancestor TrinityCore, most scripts can be adapted quite easily. For MaNGOS compatibility, it might require more knowledge but it shares a common base.
The original code is based on MaNGOS, TrinityCore, and SunwellCore and has since then had extensive development to improve stability, in-game mechanics, and modularity to the game. AC has also grown into a community-driven project with a significant number of contributors and developers. It is written in C++ and provides a solid foundation for creating private servers that mimic the mechanics and behavior of the official WoW servers.
## Philosophy ## Philosophy
Our main goal is to create a playable game server, offering a fully working game experience. Our main goal is to create a playable game server, offering a fully working in-game experience.
Here are the main points we focus on: Here are the main points we focus on:
* Stability * Stability
* Ease of use / Practicability * We make sure all changes pass the CIs before being merged into the master branch.
* Playability (in-game content)
* Blizzlike content
* We strive to make all in-game content to be blizzlike. Therefore we have a high standard for fixes being made.
* Customization * Customization
* Community-driven software (check our discord) * It is easy to customize your experience using [modules](#modules).
We also welcome new users (even non-English speaking users!) and help them learn/improve their skills (C++, SQL, Git, software collaboration, tutoring/wiki, etc...). * Community driven
* AzerothCore has an active community of developers, contributors, and users who collaborate, share knowledge, and provide support through forums, Discord channels, and other communication platforms.
Unlike other projects which focus more on the developer's side of things, we want users to be able to run their server with as few troubles as possible. All of our contributors run their private servers (local or public). ### Modules
That's why AzerothCore is easier to use, to maintain, to understand, to develop on, and to customize to suit your needs, than other emulators. AzerothCore is designed to be highly modular, allowing developers to extend and customize the game to suit their preferences or create unique gameplay experiences. This flexibility enables the addition of custom features, content, and modifications.
In short, we focus on the **user experience (UX)**, whether it be the **player's experience**, the **developer's experience**, or the **administrator's experience**.
## How to Thank us
Being an open-source project, we rely on volunteers to pursue development. Here are ways to help us if you use AzerothCore:
### Github Star
Click on the "star this repository" button to help us gain more visibility on Github!
### By contributing
Check the **CONTRIBUTING** section below.
### Financially :moneybag:
You can support the AzerothCore by [donating](https://www.paypal.com/donate/?hosted_button_id=L69ANPSR8BJDU).
The money will be used to pay freelance developers for more open-source fixes.
### Advertising
By talking about us on different platforms or to people who would like to get involved.
## Contributing
AzerothCore is a learning project, and there are lots of different ways to contribute to the project:
* By [testing our fixes](http://www.azerothcore.org/wiki/How-to-test-a-PR) (we can teach you how to correctly use Git to help us but that will also help you out tremendously)
* By developing directly to the core or the modules
* By reporting bugs within the project
* By [creating new modules](http://www.azerothcore.org/wiki/Create-a-Module)
* By improving our wiki
* By providing direct support to our community (on Discord, StackOverflow or specialized forums)
* By making extra content (video tutorial for example)
* By putting bounties on issues
If you want to contribute to the project, you will find a lot of resources that will guide you in our wiki.
Feel free to join us on [our Discord chat server](https://discord.gg/gkt4y2x) where we teach a lot of new people how to get started and who are now important contributors!
<!-- TO UNCOMMENT LATER -->
<!-- As we put a big emphasis on community, there are also special rewards for contributors such as reputation ranks (displayed in our Discord and our website), reputation badges (to display on your project/portfolio), premium software licenses, private modules access, private tools access and a lot of small private repositories access. -->
We have a lot of modules already made by the community, many of which can be found in the [Module Catalogue](https://www.azerothcore.org/catalogue.html#/).
## Installation ## Installation
Installation instructions are available [here](http://www.azerothcore.org/wiki/Installation). Detailed installation instructions are available [here](http://www.azerothcore.org/wiki/installation).
We also have an auto-installation bash script [here](/apps/installer/main.sh) (*Warning: try it/analyze it before running it*). ## Contributing
Dockerization of AzerothCore is fully supported, and we have various community-made tutorials (eg: AWS / Digital Ocean installation). AzerothCore can also serve as a learning resource for aspiring developers who want to understand how WoW servers work, how MMORPGs are structured, how game server emulators are created, or to improve their C++ and SQL knowledge.
If you want to contribute to the project, you will find a lot of resources that will guide you in our [wiki](https://www.azerothcore.org/wiki/contribute).
## Support We also recommend you read our [Contributor Covenant Code of Conduct](https://github.com/azerothcore/azerothcore-wotlk/blob/master/.github/CODE_OF_CONDUCT.md).
Our self-made wiki probably has a lot of answers for you. Feel free to join our [Discord server](https://discord.gg/gkt4y2x).
For help requests, it is recommended to ask your question on [StackOverflow](https://stackoverflow.com/questions/tagged/azerothcore) and link it in [our chat](https://discordapp.com/channels/217589275766685707/284406375495368704).
Click on the "⭐ Star" button to help us gain more visibility on Github!
## Authors & Contributors ## Authors & Contributors
This project exists thanks to: This project exists thanks to the [authors](https://github.com/azerothcore/azerothcore-wotlk/blob/master/AUTHORS).
- **The [AzerothCore developers and contributors](https://github.com/AzerothCore/azerothcore-wotlk/graphs/contributors)**
- The [SunwellCore developers xinef and pussywizard](http://www.azerothcore.org/pages/sunwell.pl/)
- All the [TrinityCore developers and contributors](https://github.com/TrinityCore/TrinityCore/blob/3.3.5/AUTHORS)
- All the [MaNGOS, ScriptDev2 and UDB developers and contributors](https://github.com/cmangos/mangos-wotlk/blob/master/AUTHORS.md)
## Important Links ## Important Links
- [Doxygen Documentation](https://www.azerothcore.org/pages/doxygen/index.html) - [Doxygen documentation](https://www.azerothcore.org/pages/doxygen/index.html)
- [Code of Conduct](https://github.com/azerothcore/azerothcore-wotlk/blob/master/.github/CODE_OF_CONDUCT.md)
- [Website](http://www.azerothcore.org/) - [Website](http://www.azerothcore.org/)
- [AzerothCore catalogue](http://www.azerothcore.org/catalogue.html "Modules, tools, and other stuff for AzerothCore") (modules, tools, etc...) - [AzerothCore catalogue](http://www.azerothcore.org/catalogue.html "Modules, tools, and other stuff for AzerothCore") (modules, tools, etc...)
- [Module template / Module skeleton](https://github.com/azerothcore/skeleton-module/) - [Our Discord server](https://discord.gg/gkt4y2x)
- [Our community hub (Discord)](https://discord.gg/gkt4y2x)
- [Our wiki](http://www.azerothcore.org/wiki "Easy to use and developed by AzerothCore founder") - [Our wiki](http://www.azerothcore.org/wiki "Easy to use and developed by AzerothCore founder")
- [Our Forum](https://github.com/azerothcore/azerothcore-wotlk/discussions/) - [Our forum](https://github.com/azerothcore/azerothcore-wotlk/discussions/)
- [Our Facebook page](https://www.facebook.com/AzerothCore/) - [Our Facebook page](https://www.facebook.com/AzerothCore/)
- [Our LinkedIn page](https://www.linkedin.com/company/azerothcore/) - [Our LinkedIn page](https://www.linkedin.com/company/azerothcore/)
@@ -169,10 +79,10 @@ This project exists thanks to:
- The new AzerothCore source components are released under the [GNU AGPL v3](https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-AGPL3) - The new AzerothCore source components are released under the [GNU AGPL v3](https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-AGPL3)
- The old sources based on MaNGOS/TrinityCore are released under the [GNU GPL v2](https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2) - The old sources based on MaNGOS/TrinityCore are released under the [GNU GPL v2](https://github.com/azerothcore/azerothcore-wotlk/blob/master/LICENSE-GPL2)
It's important to note that AzerothCore is not an official Blizzard Entertainment product, and it is not affiliated with or endorsed by World of Warcraft or Blizzard Entertainment. AzerothCore does not in any case sponsor nor support illegal public servers. If you use this project to run an illegal public server and not for testing and learning it is your own personal choice.
## Special thanks ## Special thanks
[JetBrains](https://www.jetbrains.com/?from=AzerothCore) is providing free [open-source licenses](https://www.jetbrains.com/community/opensource/) to the AzerothCore developers. [JetBrains](https://www.jetbrains.com/?from=AzerothCore) is providing free [open-source licenses](https://www.jetbrains.com/community/opensource/) to the AzerothCore developers.
[![JetBrains](https://user-images.githubusercontent.com/75517/51205146-7f225c80-1905-11e9-82e0-835627be170d.png)](https://www.jetbrains.com/?from=AzerothCore) [![JetBrains](https://user-images.githubusercontent.com/75517/51205146-7f225c80-1905-11e9-82e0-835627be170d.png)](https://www.jetbrains.com/?from=AzerothCore)
-7
View File
@@ -17,13 +17,6 @@
/env/dist/* /env/dist/*
!/env/dist/.gitkeep !/env/dist/.gitkeep
/env/user/* /env/user/*
/env/docker/*
!/env/docker/bin/.gitkeep
!/env/docker/data/.gitkeep
!/env/docker/etc/
/env/docker/etc/*
!/env/docker/etc/*.conf.dockerdist
!/env/docker/logs/.gitkeep
/.env* /.env*
/apps/joiner /apps/joiner
/deps/deno /deps/deno
-6
View File
@@ -1,6 +0,0 @@
[submodule "deps/git-subrepo"]
path = deps/git-subrepo
url = https://github.com/ingydotnet/git-subrepo.git
[submodule "modules/mod-playerbots"]
path = modules/mod-playerbots
url = https://github.com/liyunfan1223/mod-playerbots.git
+10 -9
View File
@@ -1,17 +1,18 @@
#!/usr/bin/env bash #!/usr/bin/env bash
DB_ERRORS_FILE="./env/dist/bin/DBErrors.log"; ERRORS_FILE="./env/dist/bin/Errors.log";
if [[ ! -f ${DB_ERRORS_FILE} ]]; then echo "Checking Startup Errors"
echo "File ${DB_ERRORS_FILE} not found!"; echo
exit 1
fi
if [[ -s ${DB_ERRORS_FILE} ]]; then if [[ -s ${ERRORS_FILE} ]]; then
printf "The DBErrors.log file contains startup errors:\n\n"; printf "The Errors.log file contains startup errors:\n\n";
cat ${DB_ERRORS_FILE}; cat ${ERRORS_FILE};
printf "\nPlease solve the startup errors listed above!\n"; printf "\nPlease solve the startup errors listed above!\n";
exit 1; exit 1;
else else
echo "No startup errors found in DBErrors.log, good job!"; echo "> No startup errors found in Errors.log";
fi fi
echo
echo "Done"
-59
View File
@@ -143,32 +143,6 @@ function comp_compile() {
find "$AC_BINPATH_FULL" -mindepth 1 -maxdepth 1 -type f -exec sudo chown root:root -- {} + find "$AC_BINPATH_FULL" -mindepth 1 -maxdepth 1 -type f -exec sudo chown root:root -- {} +
find "$AC_BINPATH_FULL" -mindepth 1 -maxdepth 1 -type f -exec sudo chmod u+s -- {} + find "$AC_BINPATH_FULL" -mindepth 1 -maxdepth 1 -type f -exec sudo chmod u+s -- {} +
DOCKER_ETC_FOLDER=${DOCKER_ETC_FOLDER:-"env/dist/etc"}
if [[ $DOCKER = 1 && $DISABLE_DOCKER_CONF != 1 ]]; then
echo "Generating confs..."
# Search for all configs under DOCKER_ETC_FOLDER
for dockerdist in "$DOCKER_ETC_FOLDER"/*.dockerdist; do
# Grab "base" conf. turns foo.conf.dockerdist into foo.conf
baseConf="$(echo "$dockerdist" | rev | cut -f1 -d. --complement | rev)"
# env/dist/etc/foo.conf becomes foo.conf
filename="$(basename "$baseConf")"
# the dist files should be always found inside $confDir
# which may not be the same as DOCKER_ETC_FOLDER
distPath="$confDir/$filename.dist"
# if dist file doesn't exist, skip this iteration
[ ! -f "$distPath" ] && continue
# replace params in foo.conf.dist with params in foo.conf.dockerdist
conf_layer "$dockerdist" "$distPath" " # Copied from dockerdist"
# Copy modified dist file to $confDir/$filename
# Don't overwrite foo.conf if it already exists.
cp --no-clobber --verbose "$distPath" "$confDir/$filename"
done
fi
echo "Done" echo "Done"
;; ;;
esac esac
@@ -185,36 +159,3 @@ function comp_all() {
comp_clean comp_clean
comp_build comp_build
} }
# conf_layer FILENAME FILENAME
# Layer the configuration parameters from the first argument onto the second argument
function conf_layer() {
LAYER="$1"
BASE="$2"
COMMENT="$3"
# Loop over all defined params in conf file
grep -E "^[a-zA-Z\.0-9]+\s*=.*$" "$LAYER" \
| while read -r param
do
# remove spaces from param
# foo = bar becomes foo=bar
NOSPACE="$(tr -d '[:space:]' <<< "$param")"
# split into key and value
KEY="$(cut -f1 -d= <<< "$NOSPACE")"
VAL="$(cut -f2 -d= <<< "$NOSPACE")"
# if key in base and val not in line
if grep -qE "^$KEY" "$BASE" && ! grep -qE "^$KEY.*=.*$VAL" "$BASE"; then
# Replace line
# Prevent issues with shell quoting
sed -i \
's,^'"$KEY"'.*,'"$KEY = $VAL$COMMENT"',g' \
"$BASE"
else
# insert line
echo "$KEY = $VAL$COMMENT" >> "$BASE"
fi
done
echo "Layered $LAYER onto $BASE"
}
-3
View File
@@ -1,3 +0,0 @@
/output/
/backup/
config.sh
-24
View File
@@ -1,24 +0,0 @@
## Description
**ATTENTION:** this tool is not supported anymore. It has been replaced by the **dbimport** tools integrated in AC server sources
This script allows you to assemble all sql files into one so you can easily import it to your databases (or use the main script to import directly). By default, it creates the merged files in `/env/dist`.
## How to use:
First of all, if you need some custom configuration, you have to copy `/conf/dist/config.sh` to `/conf/config.sh` and configure it. The file is here: https://github.com/azerothcore/azerothcore-wotlk/tree/master/conf
_Read it because there are several options to configure._
`db_assembler.sh` script contains an interactive menu to assemble and import sql files.
Just run it to display the options.
Note: You can even use actions directly by command lines specifying the option.
Ex:
./db_assembler.sh 1
It will merge all sql files without an interactive menu.
-121
View File
@@ -1,121 +0,0 @@
##############################################
#
# DB ASSEMBLER / EXPORTER CONFIGURATIONS
#
##############################################
#
# Comma separated list of databases
#
# You can add another element here if you need
# to support multiple databases
#
DBLIST=${DBLIST:-"AUTH,CHARACTERS,WORLD"}
# convert from comma separated list to an array.
# This is needed to support environment variables
readarray -td, DATABASES <<<"$DBLIST";
OUTPUT_FOLDER=${OUTPUT_FOLDER:-"$AC_PATH_ROOT/env/dist/sql/"}
DBASM_WAIT_TIMEOUT=${DBASM_WAIT_TIMEOUT:-5}
DBASM_WAIT_RETRIES=${DBASM_WAIT_RETRIES:-3}
####### BACKUP
# Set to true if you want to backup your azerothcore databases before importing the SQL with the db_assembler
# Do not forget to stop your database software (mysql) before doing so
BACKUP_ENABLE=false
BACKUP_FOLDER="$AC_PATH_ROOT/env/dist/sql/backup/"
#######
# FULL DB
DB_AUTH_PATHS=(
"$SRCPATH/data/sql/base/db_auth/"
)
DB_CHARACTERS_PATHS=(
"$SRCPATH/data/sql/base/db_characters"
)
DB_WORLD_PATHS=(
"$SRCPATH/data/sql/base/db_world/"
)
# UPDATES
DB_AUTH_UPDATES_PATHS=(
"$SRCPATH/data/sql/updates/db_auth/"
"$SRCPATH/data/sql/updates/pending_db_auth/"
)
DB_CHARACTERS_UPDATES_PATHS=(
"$SRCPATH/data/sql/updates/db_characters/"
"$SRCPATH/data/sql/updates/pending_db_characters/"
)
DB_WORLD_UPDATES_PATHS=(
"$SRCPATH/data/sql/updates/db_world/"
"$SRCPATH/data/sql/updates/pending_db_world/"
)
# CUSTOM
DB_AUTH_CUSTOM_PATHS=(
"$SRCPATH/data/sql/custom/db_auth/"
)
DB_CHARACTERS_CUSTOM_PATHS=(
"$SRCPATH/data/sql/custom/db_characters/"
)
DB_WORLD_CUSTOM_PATHS=(
"$SRCPATH/data/sql/custom/db_world/"
)
##############################################
#
# DB EXPORTER/IMPORTER CONFIGURATIONS
#
##############################################
#
# Skip import of base sql files to avoid
# table dropping
#
DB_SKIP_BASE_IMPORT_IF_EXISTS=true
#
# Example:
# "C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe"
# "/usr/bin/mysql"
# "mysql"
#
DB_MYSQL_EXEC="mysql"
DB_MYSQL_DUMP_EXEC="mysqldump"
DB_AUTH_CONF=${DB_AUTH_CONF:-"MYSQL_USER='acore'; \
MYSQL_PASS='acore'; \
MYSQL_HOST='localhost';\
MYSQL_PORT='3306';\
"}
DB_CHARACTERS_CONF=${DB_CHARACTERS_CONF:-"MYSQL_USER='acore'; \
MYSQL_PASS='acore'; \
MYSQL_HOST='localhost';\
MYSQL_PORT='3306';\
"}
DB_WORLD_CONF=${DB_WORLD_CONF:-"MYSQL_USER='acore'; \
MYSQL_PASS='acore'; \
MYSQL_HOST='localhost';\
MYSQL_PORT='3306';\
"}
DB_AUTH_NAME="acore_auth"
DB_CHARACTERS_NAME="acore_characters"
DB_WORLD_NAME="acore_world"
-81
View File
@@ -1,81 +0,0 @@
#!/usr/bin/env bash
echo ----------------------------------------------------------------------------------------------- >&2
echo ATTENTION: This tool is DEPRECATED. To assemble or update your DB, use the worldserver instead. >&2
echo ----------------------------------------------------------------------------------------------- >&2
set -e
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "$CURRENT_PATH/includes/includes.sh"
cmdopt=$1
PS3='[Please enter your choice]: '
options=(
"all: Assemble all" # 1
"bases: Assemble only bases" # 2
"updates: Assemble only updates" # 3
"customs: Assemble only customs" # 4
"import-all: Assemble & Import all" # 5
"import-bases: Assemble & Import only bases" # 6
"import-updates: Assemble & Import only updates" # 7
"import-customs: Assemble & Import only customs" # 8
"quit: Exit from this menu" # 9
)
function _switch() {
_reply="$1"
_opt="$2"
case $_reply in
""|"all"|"1")
dbasm_run true true true
;;
""|"bases"|"2")
dbasm_run true false false
;;
""|"updates"|"3")
dbasm_run false true false
;;
""|"customs"|"4")
dbasm_run false false true
;;
""|"import-all"|"5")
dbasm_import true true true
;;
""|"import-bases"|"6")
dbasm_import true false false
;;
""|"import-updates"|"7")
dbasm_import false true false
;;
""|"import-customs"|"8")
dbasm_import false false true
;;
""|"quit"|"9")
echo "Goodbye!"
exit
;;
""|"--help")
echo "Available commands:"
printf '%s\n' "${options[@]}"
;;
*) echo "invalid option, use --help option for the commands list";;
esac
}
while true
do
# run option directly if specified in argument
[ ! -z $1 ] && _switch $@
[ ! -z $1 ] && exit 0
select opt in "${options[@]}"
do
echo "===== DB ASSEMBLER MENU ====="
_switch $REPLY
break
done
done
-411
View File
@@ -1,411 +0,0 @@
# globals
PROMPT_USER=""
PROMPT_PASS=""
function dbasm_waitMysqlConn() {
DBHOST="$1"
DBPORT="$2"
COUNT=0
while ! mysqladmin ping -h"$DBHOST" --port="$DBPORT" --silent; do
((COUNT++))
if [ $COUNT -gt $DBASM_WAIT_RETRIES ]; then
echo "DBASM Timeout: Cannot ping mysql!" 1>&2
exit 64
fi
echo "Cannot ping mysql on $DBHOST:$DBPORT, retry in $DBASM_WAIT_TIMEOUT seconds (remaining: $COUNT/$DBASM_WAIT_RETRIES)..."
sleep $DBASM_WAIT_TIMEOUT
done
}
# use in a subshell
function dbasm_resetExitCode() {
exit 0
}
function dbasm_mysqlExec() {
confs=$1
command=$2
options=$3
# MYSQL_PORT needs to be reseted as the next eval might not overwite the current value causing the commands to use wrong port
MYSQL_PORT=3306
eval $confs
if [[ ! -z "${PROMPT_USER// }" ]]; then
MYSQL_USER=$PROMPT_USER
MYSQL_PASS=$PROMPT_PASS
fi
dbasm_waitMysqlConn $MYSQL_HOST $MYSQL_PORT
export MYSQL_PWD=$MYSQL_PASS
retval=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" -P "$MYSQL_PORT" $options -e "$command")
if [[ $? -ne 0 ]]; then
err=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" -P "$MYSQL_PORT" $options -e "$command" 2>&1 )
if [[ "$err" == *"Access denied"* ]]; then
read -p "Insert mysql user:" PROMPT_USER
read -p "Insert mysql pass:" -s PROMPT_PASS
export MYSQL_PWD=$PROMPT_PASS
retval=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" -P "$MYSQL_PORT" $options -e "$command")
if [[ $? -ne 0 ]]; then
err=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" -P "$MYSQL_PORT" $options -e "$command" 2>&1 )
# it happens on new mysql 5.7 installations
# since mysql_native_password is explicit now
if [[ "$err" == *"Access denied"* ]]; then
echo "Setting mysql_native_password and for $PROMPT_USER ..."
sudo -h "$MYSQL_HOST" "$DB_MYSQL_EXEC" -P "$MYSQL_PORT" -e "UPDATE mysql.user SET authentication_string=PASSWORD('${PROMPT_PASS}'), plugin='mysql_native_password' WHERE User='${PROMPT_USER}'; FLUSH PRIVILEGES;"
fi
fi
# create configured account if not exists
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" $options -P "$MYSQL_PORT" -e "CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'${MYSQL_HOST}' IDENTIFIED BY '${MYSQL_PASS}' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;"
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" $options -P "$MYSQL_PORT" -e "GRANT CREATE ON *.* TO '${MYSQL_USER}'@'${MYSQL_HOST}' WITH GRANT OPTION;"
for db in ${DATABASES[@]}
do
local _uc=${db^^}
local _name="DB_"$_uc"_CONF"
local _confs=${!_name}
local _name="DB_"$_uc"_NAME"
local _dbname=${!_name}
eval $_confs
echo "Grant permissions for ${MYSQL_USER}'@'${MYSQL_HOST} to ${_dbname}"
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" $options -P "$MYSQL_PORT" -e "GRANT ALL PRIVILEGES ON ${_dbname}.* TO '${MYSQL_USER}'@'${MYSQL_HOST}' WITH GRANT OPTION; FLUSH PRIVILEGES;"
done
else
exit
fi
fi
}
function dbasm_isNotEmpty() {
dbname=$1
conf=$2
dbasm_mysqlExec "$conf" "SELECT COUNT(DISTINCT table_name) FROM information_schema.columns WHERE table_schema = '${dbname}'" "--skip-column-names"
if (( $retval > 0 )); then
true
else
false
fi
}
function dbasm_dbExists() {
dbname=$1
conf=$2
dbasm_mysqlExec "$conf" "SHOW DATABASES LIKE '${dbname}'" "--skip-column-names"
if [ "$retval" == "${dbname}" ]; then
true
else
false
fi
}
function dbasm_createDB() {
database=${1,,}
uc=${database^^}
name="DB_"$uc"_CONF"
confs=${!name}
name="DB_"$uc"_NAME"
dbname=${!name}
eval $confs
CONF_USER=$MYSQL_USER
CONF_PASS=$MYSQL_PASS
if dbasm_dbExists $dbname "$confs"; then
echo "$dbname database exists"
else
echo "Creating DB ${dbname} ..."
dbasm_mysqlExec "$confs" "CREATE DATABASE \`${dbname}\`;" ""
echo "Creating User ${CONF_USER}@${MYSQL_HOST} identified by ${CONF_PASS}..."
dbasm_mysqlExec "$confs" "CREATE USER IF NOT EXISTS '${CONF_USER}'@'${MYSQL_HOST}' IDENTIFIED BY '${CONF_PASS}';"
echo "Granting user privileges on: ${dbname} ..."
dbasm_mysqlExec "$confs" "GRANT ALL PRIVILEGES ON \`${dbname}\`.* TO '${CONF_USER}'@'${MYSQL_HOST}'"
echo "Flush privileges"
dbasm_mysqlExec "$confs" "FLUSH PRIVILEGES;"
fi
}
function dbasm_assemble() {
# to lowercase
database=${1,,}
start_sql=$2
with_base=$3
with_updates=$4
with_custom=$5
uc=${database^^}
name="DB_"$uc"_PATHS"
v="$name[@]"
base=("${!v}")
name="DB_"$uc"_UPDATES_PATHS"
v="$name[@]"
updates=("${!v}")
name='DB_'$uc'_CUSTOM_PATHS'
v="$name[@]"
custom=("${!v}")
suffix_base="_base"
suffix_upd="_updates"
suffix_custom="_custom"
curTime=`date +%Y_%m_%d_%H_%M_%S`
# ALLOW FOR RECURSION WITH "**"
shopt -s globstar
if [ $with_base = true ]; then
echo "" > "$OUTPUT_FOLDER$database$suffix_base.sql"
if [ ! ${#base[@]} -eq 0 ]; then
echo "Generating $OUTPUT_FOLDER$database$suffix_base ..."
for d in "${base[@]}"
do
echo "Searching on $d ..."
if [ ! -z "$d" ]; then
for entry in "$d"/**/*.sql
do
if [[ -e $entry ]]; then
cat "$entry" >> "$OUTPUT_FOLDER$database$suffix_base.sql"
fi
done
fi
done
fi
fi
if [ $with_updates = true ]; then
updFile="$OUTPUT_FOLDER$database$suffix_upd.sql"
echo "" > "$updFile"
if [ ! ${#updates[@]} -eq 0 ]; then
echo "Generating $OUTPUT_FOLDER$database$suffix_upd ..."
for d in "${updates[@]}"
do
echo "Searching on $d ..."
if [ ! -z "$d" ]; then
for entry in "$d"/**/*.sql
do
if [[ ! -e $entry ]]; then
continue
fi
echo "-- $file" >> "$updFile"
cat "$entry" >> "$updFile"
done
fi
done
fi
fi
if [ $with_custom = true ]; then
custFile="$OUTPUT_FOLDER$database$suffix_custom.sql"
echo "" > "$custFile"
if [ ! ${#custom[@]} -eq 0 ]; then
echo "Generating $OUTPUT_FOLDER$database$suffix_custom ..."
for d in "${custom[@]}"
do
echo "Searching on $d ..."
if [ ! -z "$d" ]; then
for entry in "$d"/**/*.sql
do
if [[ ! -e $entry ]]; then
continue
fi
echo "-- $file" >> "$custFile"
cat "$entry" >> "$custFile"
done
fi
done
fi
fi
}
function dbasm_run() {
echo "===== STARTING ASSEMBLY PROCESS ====="
mkdir -p "$OUTPUT_FOLDER"
for db in ${DATABASES[@]}
do
dbasm_assemble "$db" $version".sql" $1 $2 $3
done
echo "===== DONE ====="
}
function dbasm_db_backup() {
echo "backing up $1"
database=${1,,}
uc=${database^^}
name="DB_"$uc"_CONF"
confs=${!name}
name="DB_"$uc"_NAME"
dbname=${!name}
# MYSQL_PORT needs to be reseted as the next eval might not overwite the current value causing the commands to use wrong port
MYSQL_PORT=3306
eval $confs;
if [[ ! -z "${PROMPT_USER// }" ]]; then
MYSQL_USER=$PROMPT_USER
MYSQL_PASS=$PROMPT_PASS
fi
export MYSQL_PWD=$MYSQL_PASS
now=`date +%s`
"$DB_MYSQL_DUMP_EXEC" --opt --user="$MYSQL_USER" --host="$MYSQL_HOST" --port="$MYSQL_PORT" "$dbname" > "${BACKUP_FOLDER}${database}_backup_${now}.sql" && echo "done"
if [[ $? -ne 0 ]]; then
err=$("$DB_MYSQL_DUMP_EXEC" --opt --user="$MYSQL_USER" --host="$MYSQL_HOST" --port="$MYSQL_PORT" "$dbname" 2>&1 )
if [[ "$err" == *"Access denied"* ]]; then
read -p "Insert mysql user:" PROMPT_USER
read -p "Insert mysql pass:" -s PROMPT_PASS
export MYSQL_PWD=$PROMPT_PASS
"$DB_MYSQL_DUMP_EXEC" --opt --user="$PROMPT_USER" --host="$MYSQL_HOST" --port="$MYSQL_PORT" "$dbname" > "${BACKUP_FOLDER}${database}_backup_${now}.sql" && echo "done"
else
exit
fi
fi
}
function dbasm_db_import() {
database=${1,,}
type=$2
uc=${database^^}
name="DB_"$uc"_CONF"
confs=${!name}
name="DB_"$uc"_NAME"
dbname=${!name}
if [[ $type = "base" && $DB_SKIP_BASE_IMPORT_IF_EXISTS = true ]]; then
if dbasm_isNotEmpty $dbname "$confs"; then
echo "$dbname is not empty, base importing skipped"
return
else
echo "$dbname seems empty"
fi
fi
echo "importing $1 - $2 ..."
# MYSQL_PORT needs to be reseted as the next eval might not overwite the current value causing the commands to use wrong port
MYSQL_PORT=3306
eval $confs;
if [[ ! -z "${PROMPT_USER// }" ]]; then
MYSQL_USER=$PROMPT_USER
MYSQL_PASS=$PROMPT_PASS
fi
dbasm_waitMysqlConn $MYSQL_HOST $MYSQL_PORT
export MYSQL_PWD=$MYSQL_PASS
# TODO: remove this line after we squash our DB updates
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" --port="$MYSQL_PORT" -e "SET GLOBAL max_allowed_packet=128*1024*1024;"
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" --port="$MYSQL_PORT" --default-character-set=utf8 "$dbname" < "${OUTPUT_FOLDER}${database}_${type}.sql"
if [[ $? -ne 0 ]]; then
err=$("$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$MYSQL_USER" -P "$MYSQL_PORT" "$dbname" 2>&1 )
if [[ "$err" == *"Access denied"* ]]; then
read -p "Insert mysql user:" PROMPT_USER
read -p "Insert mysql pass:" -s PROMPT_PASS
export MYSQL_PWD=$PROMPT_PASS
"$DB_MYSQL_EXEC" -h "$MYSQL_HOST" -u "$PROMPT_USER" -P "$MYSQL_PORT" "$dbname" < "${OUTPUT_FOLDER}${database}_${type}.sql"
else
exit
fi
fi
}
function dbasm_import() {
dbasm_run $1 $2 $3
with_base=$1
with_updates=$2
with_custom=$3
echo "===== CHECKING DBs ====="
for db in ${DATABASES[@]}
do
dbasm_createDB "$db"
done
echo "===== DONE ====="
#
# BACKUP
#
if [ $BACKUP_ENABLE = true ]; then
echo "===== STARTING BACKUP PROCESS ====="
mkdir -p "$BACKUP_FOLDER"
for db in ${DATABASES[@]}
do
dbasm_db_backup "$db"
done
echo "===== DONE ====="
fi
echo "===== STARTING IMPORTING PROCESS ====="
#
# IMPORT
#
if [ $with_base = true ]; then
for db in ${DATABASES[@]}
do
dbasm_db_import "$db" "base"
done
fi
if [ $with_updates = true ]; then
for db in ${DATABASES[@]}
do
dbasm_db_import "$db" "updates"
done
fi
if [ $with_custom = true ]; then
for db in ${DATABASES[@]}
do
dbasm_db_import "$db" "custom"
done
fi
echo "===== DONE ====="
}
-11
View File
@@ -1,11 +0,0 @@
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "$CURRENT_PATH/../../bash_shared/includes.sh"
AC_PATH_DBASSEMBLER="$AC_PATH_APPS/db_assembler"
if [ -f "$AC_PATH_DBASSEMBLER/config.sh" ]; then
source "$AC_PATH_DBASSEMBLER/config.sh" # should overwrite previous
fi
source "$AC_PATH_DBASSEMBLER/includes/functions.sh"
+22 -24
View File
@@ -18,6 +18,9 @@ LABEL description="AC base image for dev containers"
ENV DOCKER=1 ENV DOCKER=1
# Ensure ac-dev-server can properly pull versions
ENV GIT_DISCOVERY_ACROSS_FILESYSTEM=1
# set timezone environment variable # set timezone environment variable
ENV TZ=Etc/UTC ENV TZ=Etc/UTC
@@ -34,14 +37,17 @@ RUN apt-get update && apt-get install -y gdb gdbserver git dos2unix lsb-core sud
libncurses5-dev ccache \ libncurses5-dev ccache \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Ensure git will work with the AzerothCore source directory
RUN git config --global --add safe.directory /azerothcore
# change timezone in container # change timezone in container
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata
# Create a non-root user # Create a non-root user
RUN addgroup --gid $GROUP_ID acore && \ RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \
adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID acore && \ adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \
passwd -d acore && \ passwd -d "$DOCKER_USER" && \
echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
# must be created to set the correct permissions on them # must be created to set the correct permissions on them
RUN mkdir -p /azerothcore/env/dist/bin RUN mkdir -p /azerothcore/env/dist/bin
@@ -94,11 +100,6 @@ USER $DOCKER_USER
# NOTE: this folder is different by the /azerothcore (which is binded instead) # NOTE: this folder is different by the /azerothcore (which is binded instead)
COPY --chown=$DOCKER_USER:$DOCKER_USER . /azerothcore COPY --chown=$DOCKER_USER:$DOCKER_USER . /azerothcore
# Needed if we use the dev image without linking any external folder (e.g. acore-docker)
COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/authserver.conf.dockerdist /azerothcore/env/dist/etc/authserver.conf.dockerdist
COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/worldserver.conf.dockerdist /azerothcore/env/dist/etc/worldserver.conf.dockerdist
COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/dbimport.conf.dockerdist /azerothcore/env/dist/etc/dbimport.conf.dockerdist
#================================================================ #================================================================
# #
# SERVICE BASE: prepare the OS for the production-ready services # SERVICE BASE: prepare the OS for the production-ready services
@@ -122,10 +123,10 @@ ENV TZ=Etc/UTC
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
# Create a non-root user # Create a non-root user
RUN addgroup --gid $GROUP_ID acore && \ RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \
adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID acore && \ adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \
passwd -d acore && \ passwd -d "$DOCKER_USER" && \
echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
# install the required dependencies to run the server # install the required dependencies to run the server
RUN apt-get update && apt-get install -y dos2unix gdb gdbserver google-perftools libgoogle-perftools-dev net-tools \ RUN apt-get update && apt-get install -y dos2unix gdb gdbserver google-perftools libgoogle-perftools-dev net-tools \
@@ -205,9 +206,6 @@ COPY --chown=$DOCKER_USER:$DOCKER_USER ./modules /azerothcore/modules
# check if we have ccache files available outside # check if we have ccache files available outside
RUN rm -rf /azerothcore/var/ccache/* RUN rm -rf /azerothcore/var/ccache/*
COPY --chown=$DOCKER_USER:$DOCKER_USER var/docker/ccache /azerothcore/var/ccache COPY --chown=$DOCKER_USER:$DOCKER_USER var/docker/ccache /azerothcore/var/ccache
COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/authserver.conf.dockerdist /azerothcore/env/dist/etc/authserver.conf.dockerdist
COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/worldserver.conf.dockerdist /azerothcore/env/dist/etc/worldserver.conf.dockerdist
COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/dbimport.conf.dockerdist /azerothcore/env/dist/etc/dbimport.conf.dockerdist
# install eluna # install eluna
RUN git clone --depth=1 --branch=master https://github.com/azerothcore/mod-eluna.git /azerothcore/modules/mod-eluna RUN git clone --depth=1 --branch=master https://github.com/azerothcore/mod-eluna.git /azerothcore/modules/mod-eluna
@@ -279,10 +277,10 @@ ENV TZ=Etc/UTC
# set noninteractive mode so tzdata doesn't ask to set timezone on install # set noninteractive mode so tzdata doesn't ask to set timezone on install
ENV DEBIAN_FRONTEND=noninteractive ENV DEBIAN_FRONTEND=noninteractive
RUN addgroup --gid $GROUP_ID acore && \ RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \
adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID acore && \ adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \
passwd -d acore && \ passwd -d "$DOCKER_USER" && \
echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
# ENV DATAPATH=/azerothcore/env/dist/data-temp # ENV DATAPATH=/azerothcore/env/dist/data-temp
ENV DATAPATH=/azerothcore/env/dist/data ENV DATAPATH=/azerothcore/env/dist/data
@@ -321,10 +319,10 @@ RUN apt-get update && apt-get install -y libmysqlclient-dev libssl-dev libbz2-de
sudo && rm -rf /var/lib/apt/lists/* ; sudo && rm -rf /var/lib/apt/lists/* ;
# Create a non-root user # Create a non-root user
RUN addgroup --gid $GROUP_ID acore && \ RUN addgroup --gid "$GROUP_ID" "$DOCKER_USER" && \
adduser --disabled-password --gecos '' --uid $USER_ID --gid $GROUP_ID acore && \ adduser --disabled-password --gecos '' --uid "$USER_ID" --gid "$GROUP_ID" "$DOCKER_USER" && \
passwd -d acore && \ passwd -d "$DOCKER_USER" && \
echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers echo "$DOCKER_USER ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
RUN mkdir -p /azerothcore/env/client/ RUN mkdir -p /azerothcore/env/client/
RUN chown -R $DOCKER_USER:$DOCKER_USER /azerothcore RUN chown -R $DOCKER_USER:$DOCKER_USER /azerothcore
+1 -5
View File
@@ -9,11 +9,7 @@ DOCKER_VOL_ROOT=
DOCKER_VOL_CONF= DOCKER_VOL_CONF=
DOCKER_VOL_ETC= DOCKER_VOL_ETC=
DOCKER_VOL_LOGS= DOCKER_VOL_LOGS=
DOCKER_VOL_DATA_CAMERAS= DOCKER_VOL_DATA=
DOCKER_VOL_DATA_DBC=
DOCKER_VOL_DATA_MAPS=
DOCKER_VOL_DATA_VMAPS=
DOCKER_VOL_DATA_MMAPS=
DOCKER_WORLD_EXTERNAL_PORT= DOCKER_WORLD_EXTERNAL_PORT=
DOCKER_SOAP_EXTERNAL_PORT= DOCKER_SOAP_EXTERNAL_PORT=
@@ -0,0 +1,3 @@
-- DB update 2023_08_09_02 -> 2023_08_10_00
--
DELETE FROM `creature_template_resistance` WHERE `CreatureID` IN (4632, 4633, 4634, 4635, 4636, 4637);
@@ -0,0 +1,55 @@
-- DB update 2023_08_10_00 -> 2023_08_10_01
DELETE FROM `quest_request_items_locale` WHERE `ID` IN (1201, 1222, 1249, 1258, 1262, 1273, 1324, 1358, 1361, 1367, 1368, 1380, 1381, 1382, 1384, 1385, 1386, 1387, 1434, 1439, 1456, 1457, 1458, 1459, 1466, 1467, 1485, 1487, 1488, 1489, 1498, 1525, 1560, 1578, 1579, 1598, 1618, 1640, 1654, 1655, 1657, 1679, 1692, 1704, 1714, 1719, 1795, 1799, 1819, 1940, 1955, 1957) AND `locale` = 'deDE';
INSERT INTO `quest_request_items_locale` (`ID`, `locale`, `CompletionText`, `VerifiedBuild`) VALUES
(1201, 'deDE', 'Habt Ihr die Spitzel gefunden, $N?', 0),
(1222, 'deDE', 'Habt Ihr Ignatz gesehen? Ich habe ihn vor einer Weile in die Marschen geschickt und er ist noch nicht zurückgekehrt!', 0),
(1249, 'deDE', 'Ist er entronnen? Sah ein wenig zwielichtig aus, wie er uns beobachtet hat.', 0),
(1258, 'deDE', 'Meine Experimente mit den Schlammpanzerzungen machen gute Fortschritte. Ich hoffe, Eure Krebssuche kommt voran?', 0),
(1262, 'deDE', 'Ihr seid von Brackenwall in den Düstermarschen hierher gereist? Wie geht es Nazeer und wie weit sind seine Bemühungen im Sumpf gediehen?', 0),
(1273, 'deDE', 'Habt Ihr Reethe gefunden?', 0),
(1324, 'deDE', 'Hallo $N. Ich hoffe Ihr habt nichts gegen mein Eingreifen, aber wir konnten nicht zulassen, dass Hendel entkommt oder schlimmer, dass er stirbt.', 0),
(1358, 'deDE', 'Habt Ihr ein Päckchen für mich?', 0),
(1361, 'deDE', 'Wie ich sehe, ist Eure Aufgabe unvollendet, $N. Soll ich Sharlindra über Eure Unfähigkeit in Kenntnis setzen?', 0),
(1367, 'deDE', 'Verschwindet! Die Magram sprechen nicht mit den Schwachen. Wir töten sie!$B$BWenn Ihr mit mir sprechen wollt, dann zeigt mir, dass Ihr stark seid. Kehrt zurück, wenn Ihr viele Gelkis getötet habt.', 0),
(1368, 'deDE', 'Ihr steht mit beiden Füßen auf Erde der Gelkis. Ihr seid hier nicht willkommen!$B$BBeweist, dass Ihr die Freundschaft der Gelkis sucht. Tötet Zentauren der Magram. Kommt wieder, wenn der Boden vom Blut der Magram getränkt ist.', 0),
(1380, 'deDE', 'Ist Khan Hratha tot? Habt Ihr das Schlüsselfragment?', 0),
(1381, 'deDE', 'Tut, was ich verlange. Beweist mir, dass Ihr ein Verbündeter der Magram seid!', 0),
(1382, 'deDE', 'Verschwindet! Die Gelkis wollen Euch hier nicht. Geht jetzt!!$B$BKehrt zurück, nachdem Ihr viele Magram getötet habt, und dann werde ich mit Euch sprechen.', 0),
(1384, 'deDE', 'Habt Ihr die Glücksbringer? Habt Ihr den Kolkar gezeigt, dass sie schwach sind?', 0),
(1385, 'deDE', 'Ihr werdet jetzt gehen oder die Magram werden Euch zerquetschen! Um unser Freund zu sein, müsst Ihr Gelkis töten.', 0),
(1386, 'deDE', 'Habt Ihr Angst vor den Kolkar? Warum tötet Ihr sie nicht? Vielleicht habt Ihr vergessen, wie man tötet. Beeilt Euch und tötet Kolkar bevor sie eines natürlichen Todes sterben!', 0),
(1387, 'deDE', 'Habt Ihr einen Bericht, $N?', 0),
(1434, 'deDE', 'Ich wurde von einem taurischen Gefährten gewarnt, dass die Satyrn nicht das sind, was sie zu sein scheinen. Er glaubt, dass etwas mehr an ihnen dran ist, dass ihr Böses eine Verdrehung ihrer wahren Natur ist. Aber ich habe solche Dinge nicht gesehen.$B$BIch sehe nur das rücksichtslose Abschlachten der Schwachen und die Verderbnis derer, die nach dunkler Macht streben.$B$BIch werde meiner Pflicht, sie zu vernichten, so lange nachkommen, bis der Kriegshäuptling mir etwas anderes befiehlt. Bis dahin habe ich kein Erbarmen mit ihnen.', 0),
(1439, 'deDE', 'Ich fürchte, Tyranis wird versuchen, die Geheimnisse der Brennenden Klinge zu erlernen und sich ihnen anschließen, wenn sie ihn lassen - er hat stets die Macht bewundert, die Magie allen bringt, die sich von ihr verführen lassen.$B$BIch bin nicht sicher, ob ich zu meiner Familie zurückkehren und ihnen sagen kann, dass Tyranis\' Geist mit solchen Gefahren spielt. Bei meinesgleichen ist es ein schreckliches Verbrechen, so etwas zu suchen, aber das zu werden, wovor wir uns schützen möchten, das ist verständlich.', 0),
(1456, 'deDE', 'Nicht, dass ich Nijel zu nahe treten wollte, wer immer das sein mag, aber dieses Lager ist nicht das bequemste, in dem ich je eine Nacht verbrachte, $N.', 0),
(1457, 'deDE', 'Das Geschäft blüht, $N, und ich habe nicht viel Zeit für Fragen. Wenn Ihr etwas von den Wiederholern wollt, rückt heraus damit. Wenn nicht, muss ich Euch bitten, mit einem meiner Handlanger zu sprechen. Sie sind durchaus imstande, sich um alles hier zu kümmern.', 0),
(1458, 'deDE', 'Abscheuliche Kreaturen, die Satyrn. Man sagt, sie seien irgendwie mit den Nachtelfen verwandt, doch das glaube ich nicht.$B$BIch glaube, das liegt nur an dem einen Elfen, der sie vor Jahren überredete, in den Krieg zu ziehen. Das hat die Welt für immer verändert. Heute ist sie viel gefährlicher und Furcht erregender.', 0),
(1459, 'deDE', 'Entschuldigt, dass ich Euch nicht sagen konnte, wo man Kodos oder Skorpashi findet. Ich kenne mich in der Gegend nicht gut aus und hatte keine Zeit, sie zu erkunden.', 0),
(1466, 'deDE', 'Ich wusste nicht einmal, dass es diese Dämonenwesen in Desolace gibt. Zuletzt hörte ich, dass das Land weitgehend den Zentauren gehört, nachdem die Nachtelfen vor Jahren zusammengepackt haben und abgezogen sind.$B$BIch frage mich, warum und wie sie hierher kamen.', 0),
(1467, 'deDE', 'Grüße, $N. Das Geschäft blüht, die Laute von Hämmern auf Ambossen hallen durch ganz Eisenschmiede, die Blasebälge entfachen das Feuer und meine Frau backt mir einen Kuchen als Dessert nach dem Abendessen. Könnte das Leben schöner sein?', 0),
(1485, 'deDE', 'Es ist wichtig, dass Ihr die Wesen kontrollieren könnt, die Ihr durch Eure Magie beschwört. Nur wenige interessieren sich für die Lehren der Hexenmeister, daher möchte ich Euer Leben nicht gefährden, indem ich Euch etwas lehre, ehe Ihr dazu bereit seid.', 0),
(1487, 'deDE', '$N, wir, die Jünger von Naralex, brauchen Eure Hilfe. Unsere Zahl schwindet, während unser Meister in seinem verzerrten Albtraum gefangen ist. Wir haben nicht die nötigen Kräfte, um mit den verdorbenen Kreaturen fertig zu werden, die jetzt diese Höhlen heimsuchen.$b$bIch bitte Euch, betretet die Höhlen und führt Krieg gegen diese abartigen Kreaturen!', 0),
(1488, 'deDE', 'Ruhm für die Horde und Tod für unsere Feinde, $N!$B$BDie Dämonen in Desolace stellen eine größere Bedrohung dar als je zuvor. Meine Hoffnung, zum Kriegshäuptling zurückzukehren, schwindet, je mehr dieser widerlichen Kreaturen auftauchen.$B$BManchmal wünschte ich, wir hätten es nur mit den Zentauren zu tun.', 0),
(1489, 'deDE', 'Eure Meister sind Narren, Euch hierher zu schicken, denn ich werde nie wieder ein Sklave der Geißel sein!', 0),
(1498, 'deDE', 'Habt Ihr die Schuppen, $N? Wenn Ihr den Angriffen der Donnerechsen nicht trotzen könnt, könnt Ihr von meiner Unterweisung nicht profitieren.', 0),
(1525, 'deDE', 'Ich habe genügend Zutaten für ein Feuersapta, wenn Ihr den Reagenzienbeutel und etwas Feuerteer finden könnt. Die Fanatiker der Brennenden Klinge tragen die richtigen Komponenten für die meisten ihrer Zauber in diesen Beuteln und haben meist ausreichend von den Gegenständen, die ich benötige, damit Ihr nicht weiter nach etwas anderem suchen müsst.$B$BDie Saptas werden stets aus Zutaten hergestellt, die in enger Verbindung zu ihrem jeweiligen Element stehen. Es macht unsere Arbeit leichter, da die Hexenmeister mit dem Feuer verbunden sind.', 0),
(1560, 'deDE', 'Wo ist Tooga?', 0),
(1578, 'deDE', 'Ich habe keine Zeit zu plaudern. Haben wir etwas miteinander zu tun?', 0),
(1579, 'deDE', 'Habt Ihr meine Klemmmuffen gefunden, $N? Ohne meine Klemmmuffen kann ich meine Stintelpleuel nicht nachziehen!', 0),
(1598, 'deDE', 'Es wäre zu auffällig für mich gewesen, das Buch selbst zu stehlen. Zum Glück hat mir einer ihrer eigenen Trottel die Drecksarbeit abgenommen.', 0),
(1618, 'deDE', 'Ich hoffe, Ihr bringt gute Nachrichten aus Eisenschmiede. Denn ich bin mit meiner Weisheit am Ende!', 0),
(1640, 'deDE', 'Wenn Ihr diesen Krug wollt, müsst Ihr ihn mir aus den kalten, toten Händen brechen...', 0),
(1654, 'deDE', 'Es dürfte schwer sein, die Gegenstände zu bekommen, die Ihr sucht, aber ich versichere Euch, die Waffe, die ich für Euch anfertige, rechtfertigt den Aufwand.$B$BSie wird meine bis dato beste Arbeit werden, und doch nur ein geringer Lohn für den Dienst, den Ihr mir erwiesen habt.', 0),
(1655, 'deDE', 'Aha, schon Glück gehabt? Ha-ha, diese Oger konnten Euch nichts anhaben, was?', 0),
(1657, 'deDE', 'Habt Ihr unser "Geschenk" an die Leute von Süderstade ausgeliefert?$B$B<Ruferin der Dunkelheit Yanka lacht schelmisch>.', 0),
(1679, 'deDE', NULL, 0),
(1692, 'deDE', 'Seid gegrüßt, $Gjunger:junge; $C. Wie kann ich Euch mit meinen Fertigkeiten dienlich sein?', 0),
(1704, 'deDE', 'Guten Tag, Morgen oder Abend. Ich kann es von hier unten nicht erkennen. Bringt Ihr mir Arbeit?', 0),
(1714, 'deDE', 'Der Kessel blubbert. Seine Dämpfe locken...', 0),
(1719, 'deDE', 'Habt Ihr die Herausforderung absolviert?', 0),
(1795, 'deDE', 'Jedem Hexenmeister sollte ein Teufelsjäger zur Verfügung stehen. Obwohl er schwer zu bändigen ist, macht die Macht, die er seinem Herrn gibt, die Kosten bei weitem wett.', 0),
(1799, 'deDE', 'Da Ihr offensichtlich kein Magier seid, frage ich mich, ob ich Euch überhaupt trauen kann. Ich kann die Macht des Arkanen an Euch riechen, aber Ihr scheint Euch dem Gestank der Verderbnis entzogen zu haben, der Eurer Art so bereitwillig anhängt.$B$BJa, $Gein:eine; $C ... $Gein:eine; $C ist gekommen, um mich um Hilfe zu bitten.$B$BNun, was kann ich für Euch tun, $N?', 0),
(1819, 'deDE', 'Eure Aufgabe ist noch nicht erfüllt, $N. Es ist nicht klug für $Geinen:eine; $C, Furcht zu zeigen...', 0),
(1940, 'deDE', 'Ah, ja. Die Magier im Magiersanktum sagten, dass Ihr mit mir sprechen wollt. Habt Ihr die benötigte Seide?', 0),
(1955, 'deDE', 'Ihr müsst den Dämon töten, um die Kugel von seinem Einfluss zu befreien, $N.', 0),
(1957, 'deDE', 'Ihr habt nicht die erforderliche Anzahl an Manawogen getötet, $N.', 0);
@@ -0,0 +1,39 @@
-- DB update 2023_08_10_01 -> 2023_08_10_02
DELETE FROM `quest_request_items_locale` WHERE `ID` IN (2118, 2138, 2139, 2201, 2202, 2205, 2206, 2240, 2338, 2358, 2359, 2460, 2500, 2518, 2623, 2742, 2747, 2748, 2749, 2750, 2767, 2768, 2843, 2863, 2871, 2877, 2880, 2881, 2904, 2930, 2933, 2936, 2975, 2980, 2982, 2995) AND `locale` = 'deDE';
INSERT INTO `quest_request_items_locale` (`ID`, `locale`, `CompletionText`, `VerifiedBuild`) VALUES
(2118, 'deDE', 'Habt Ihr mir das kranke Tier gebracht, $N?$B$BMacht Euch keine Sorgen, sollte das Zuschnappen der Falle nicht gelingen - Tharnariuns Hoffnung währt ewig. Wenn Ihr eine neue Falle braucht, lasst von Eurer Arbeit ab und meldet Euch bei mir.', 0),
(2138, 'deDE', 'Ist Eure Aufgabe abgeschlossen?', 0),
(2139, 'deDE', 'Durch das Töten der infizierten Höhlenmutter wird die Population der tollwütigen Distelbären, die in unser Land eindringen, abnehmen. Vergeudet keine Zeit, $N.', 0),
(2201, 'deDE', 'Talvashs Bild nimmt in dem Wasser der Wahrsageschale Kontur an.$B$B"Hey, Ihr lebt noch! Habt Ihr die Edelsteine gefunden? Könnt Ihr wirklich meinen guten Ruf retten, so wie ich das erhofft habe? Bitte sagt mir, dass Ihr keine Ladung der Phiole verbraucht habt, um mal schnell hallo zu sagen. Diese Dinge sind nicht billig und ich pfeife finanziell gesehen jetzt schon aus dem letzten Loch."', 0),
(2202, 'deDE', 'Habt Ihr die Magentafunguskappen bekommen, die ich für meine alchimistische Arbeit benötige? Keine Kappen - keine Belohnung!', 0),
(2205, 'deDE', 'Kann ich Euch helfen, $C?', 0),
(2206, 'deDE', 'Eure Sterblichkeit schwindet mit jedem Moment, den Ihr in der Kaserne verweilt, $C.', 0),
(2240, 'deDE', 'Habt Ihr etwas zu berichten?', 0),
(2338, 'deDE', 'Ihr habt es Euch überlegt, ja? Ihr seid $Gein schlauer:eine schlaue; $C, wenn Ihr dieses Angebot annehmt - Ihr und ich werden beide bekommen, was wir wollen, und \'Droffers und Sohn Bergungen\' werden denken, dass sie bekommen, was sie wollen.', 0),
(2358, 'deDE', 'Habt Ihr die Hörner des Dämonenprinzen?', 0),
(2359, 'deDE', 'Gibt es etwas Neues von Agentin Kearnen?', 0),
(2460, 'deDE', 'Übung macht den Meister!', 0),
(2500, 'deDE', 'Habt Ihr die Sachen schon, die ich brauche? Ihr werdet nur bezahlt, wenn Ihr mir diese Reagenzien bringt.', 0),
(2518, 'deDE', 'Ich bedauere, dass ich Euch die Aufgabe stellen musste, die ich Euch gestellt habe, aber für Lady Sathrah gibt es keine Hoffnung mehr.$B$BMit den Spinndrüsen wollen wir Elune ein Opfer bringen. Wir hoffen, dass Elune aufgrund dieses Opfers Sathrah segnen wird, damit sie wiedergeboren werden und endlich Frieden finden kann.', 0),
(2623, 'deDE', 'Warten auf Befehle.', 0),
(2742, 'deDE', 'Rin\'ji hat Angst!', 0),
(2747, 'deDE', 'Ich habe bisher nur sehr wenige Eier gesehen, die in außergewöhnlich gutem Zustand aus Feralas geholt wurden. Diese Eier sind extrem selten...', 0),
(2748, 'deDE', 'Ein gutes Ei ist ein Ei, aus dem idealerweise ein Jungtier schlüpft, das frei von den bösen Auswirkungen der Beschwörungen der Oger der Gordunni ist.', 0),
(2749, 'deDE', 'Normalerweise schlüpft etwa aus jedem zweiten Hippogryphen-Ei auch ein Jungtier. Wir hegen und pflegen die Eier nach besten Kräften, und wenn wir Glück haben, dann schlüpft am Ende etwas da raus.', 0),
(2750, 'deDE', 'Diese Eier können nicht gerettet werden - aus ihnen wird niemals etwas schlüpfen.', 0),
(2767, 'deDE', 'Ja, ich bin Glotz Widrikus, Meistererfinder zu Euren Diensten! Gibt es etwas, bei dem ich Euch helfen kann?', 0),
(2768, 'deDE', 'Habt Ihr Unteroffizier Bly gefunden? Habt Ihr meine Wünschel-mato-Rute bekommen?', 0),
(2843, 'deDE', 'Fertig!', 0),
(2863, 'deDE', 'Die Zeit drängt, $N! Solltet Ihr nicht hier sein, um zu berichten, dass Ihr die Alphas ausgeschaltet habt, dann vergeudet Ihr Zeit!', 0),
(2871, 'deDE', 'Ja, kann ich Euch helfen?$B$BMoment, Ihr seid doch $Gder:die; $C, $Gder:die; General Mondfeder und Latro mit der Bedrohung durch die Naga geholfen hat, nicht? Ich bin Vestia, Latros - ähm, natürlich Latronicus’ Frau. Es ist mir eine Freude, Eure Bekanntschaft zu machen!$B$BDoch entschuldigt, Ihr seid sicher geschäftlich hier. Habt Ihr etwas für mich - von ihm vielleicht?', 0),
(2877, 'deDE', 'Versucht nicht, über den vorliegenden Auftrag zu verhandeln, $R! Wenn die Götter diese Schlämme hätten tot sehen wollen, hätten sie das bereits durch ein Wunder erledigt, oder nicht?!', 0),
(2880, 'deDE', 'Ich will 5 von den Stammeshalsketten, die die Trolle tragen. Wenn Ihr es noch deutlicher erklärt haben wollt: Einen zu töten gibt Euch eine gute Chance, eine davon zu erhalten.$B$BBeweist den Wildhämmern Euren Wert!', 0),
(2881, 'deDE', 'Ihr habt das zwar bereits erledigt, aber wir nehmen weiterhin alle Trollstammeshalsketten an, die Ihr findet und eintauschen wollt. Indem Ihr sie bei mir eintauscht, verbessert Ihr weiter Eure Stellung unter den Wildhämmern. Wenn Ihr für uns kämpft, dann kämpfen wir auch für Euch!$B$BIch benötige 5 Trollstammeshalsketten, damit ich es gelten lassen kann, $N.', 0),
(2904, 'deDE', 'Eh? Kernobee lebt??', 0),
(2930, 'deDE', 'Habt Ihr die Prismalochkarte?', 0),
(2933, 'deDE', 'Hallo, $Gedler:edle; $C. Der Tag war lang und nicht ein einziges Experiment ist geglückt... Ich hoffe, Ihr bringt mir gute Neuigkeiten.', 0),
(2936, 'deDE', 'Kennt Ihr den Namen des Spinnengottes?', 0),
(2975, 'deDE', 'Beeilt Euch, $N. Oder ist die von mir verlangte Aufgabe zu schwierig?', 0),
(2980, 'deDE', 'Habt Ihr die Ruinen gefunden, $N?', 0),
(2982, 'deDE', 'Seid wachsam in der Nähe der Gordunni, $N. Ihre Magie scheint das Land, auf dem sie stehen, zu verderben.', 0),
(2995, 'deDE', 'Der Schlüssel ist, die Hochtalelfen zu isolieren. Habt Ihr die Hütte gefunden?', 0);
@@ -0,0 +1,9 @@
-- DB update 2023_08_10_02 -> 2023_08_11_00
--
DELETE FROM `acore_string` WHERE `entry` IN (600,601);
INSERT INTO `acore_string` (`entry`, `content_default`) VALUES
(600,'Event %u (%s) is started'),
(601,'Event %u (%s) is stopped');
UPDATE `acore_string` SET `content_default` = 'Event %u (%s) is already active!', `locale_deDE` = 'Event %u (%s) bereits aktiv!', `locale_zhCN` = '事件 %u (%s) 已经激活了。' WHERE `entry` = 587;
UPDATE `acore_string` SET `content_default` = 'Event %u (%s) is not active!', `locale_deDE` = 'Event %u (%s) nicht aktiv!', `locale_zhCN` = '事件 %u (%s) 没有被激活。' WHERE `entry` = 588;
@@ -0,0 +1,3 @@
-- DB update 2023_08_11_00 -> 2023_08_11_01
--
UPDATE `creature_onkill_reputation` SET `RewOnKillRepValue1` = 20 WHERE `creature_id` = 9816;
@@ -0,0 +1,9 @@
-- DB update 2023_08_11_01 -> 2023_08_11_02
-- Infected Wildkin smart ai
SET @ENTRY := 17322;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
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`, `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
(@ENTRY, 0, 0, 0, 0, 0, 100, 0, 10000, 15000, 0, 0, 11, 31282, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Infected Wildkin - In Combat - Cast \'Infected Wound\'');
@@ -0,0 +1,10 @@
-- DB update 2023_08_11_02 -> 2023_08_11_03
--
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_inoculate_nestlewood_owlkin';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(29528, 'spell_inoculate_nestlewood_owlkin');
UPDATE `creature_template` SET `AIName` = '' WHERE `entry` = 16518;
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 16518);
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 1651800) AND (`source_type` = 9) AND (`id` IN (0, 1, 2, 3, 4, 5, 6, 7, 8));
@@ -0,0 +1,10 @@
-- DB update 2023_08_11_03 -> 2023_08_12_00
-- Wrathscale Sorceress smart ai
SET @ENTRY := 17336;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
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`, `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
(@ENTRY, 0, 0, 0, 0, 0, 100, 0, 3500, 12000, 3500, 12000, 11, 9672, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Wrathscale Sorceress - In Combat - Cast \'Frostbolt\'');
@@ -0,0 +1,10 @@
-- DB update 2023_08_12_00 -> 2023_08_12_01
--
ALTER TABLE `gossip_menu`
CHANGE COLUMN `MenuID` `MenuID` INT UNSIGNED NOT NULL DEFAULT 0 FIRST;
ALTER TABLE `gossip_menu_option`
CHANGE COLUMN `MenuID` `MenuID` INT UNSIGNED NOT NULL DEFAULT 0 FIRST;
ALTER TABLE `gossip_menu_option_locale`
CHANGE COLUMN `MenuID` `MenuID` INT UNSIGNED NOT NULL DEFAULT 0 FIRST;
@@ -0,0 +1,10 @@
-- DB update 2023_08_12_01 -> 2023_08_12_02
--
ALTER TABLE `smart_scripts`
ADD COLUMN `event_param6` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `event_param5`;
UPDATE `smart_scripts` SET `event_param6` = `event_param5` WHERE `event_type` = 106 AND `source_type` = 0;
UPDATE `smart_scripts` SET `event_param5` = 0 WHERE `event_type` = 106 AND `source_type` = 0;
UPDATE `smart_scripts` SET `event_param6` = `event_param5` WHERE `event_type` = 105 AND `source_type` = 0;
UPDATE `smart_scripts` SET `event_param5` = 0 WHERE `event_type` = 105 AND `source_type` = 0;
@@ -0,0 +1,42 @@
-- DB update 2023_08_12_02 -> 2023_08_13_00
--
DELETE FROM `event_scripts` WHERE `id` = 14376;
UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` = 185220;
DELETE FROM `smart_scripts` WHERE (`source_type` = 1 AND `entryorguid` = 185220);
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(185220, 1, 0, 0, 70, 0, 100, 0, 2, 0, 0, 0, 0, 107, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Massive Treasure Chest - On Gameobject State Changed - Summon Creature Group');
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 22) AND (`SourceGroup` = 1) AND (`SourceEntry` = 185220);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 1, 185220, 1, 0, 29, 1, 22369, 100, 0, 1, 0, 0, '', 'Only Spawn Dread Relic Thrall (22369) if none are nearby already');
DELETE FROM `creature_summon_groups` WHERE `summonerId` = 185220;
INSERT INTO `creature_summon_groups` (`summonerId`, `summonerType`, `groupId`, `entry`, `summonType`, `summonTime`, `Comment`, `position_x`, `position_y`, `position_z`, `orientation`) VALUES
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3750.57, 4737.88, -19.35, 4.01853),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3744.9, 4736.18, -18.717, 2.8797),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3773.46, 4720.45, -21.5752, 1.44792),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3773.85, 4715.78, -21.6975, 1.45735),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3774.08, 4710.46, -21.7888, 0.492878),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3774.95, 4704.25, -21.977, 0),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3772.26, 4699.55, -21.3722, 0.111175),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3769.89, 4694.89, -20.7665, 0.406484),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3767.46, 4691.24, -20.1502, 6.20901),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3763.69, 4688.06, -19.2893, 0.613044),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3760.22, 4685.72, -18.5906, 0.334227),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3756.1, 4683.74, -17.9125, 0.734772),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3751.6, 4682.35, -17.3406, 1.57044),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3746.76, 4682.73, -16.8866, 1.93172),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3742.75, 4684.69, -16.6026, 1.98513),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3739.15, 4687.17, -16.4299, 1.88145),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3736.77, 4689.91, -16.3146, 2.49721),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3733.74, 4693.02, -16.24, 2.487),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3764.99, 4733.9, -20.6666, 5.65487),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3770.51, 4728.37, -21.0502, 0),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3767.97, 4731.29, -20.9252, 4.03171),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3772.36, 4724.78, -21.3002, 5.81195),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3731.43, 4697.39, -16.1774, 2.74225),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3729.91, 4701.97, -16.1335, 3.04384),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3729.4, 4706.81, -16.1222, 3.61561),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3760.43, 4736.39, -20.2451, 4.01068),
(185220, 1, 1, 22369, 4, 300000, 'Massive Chest - Quest: The Dread Relic', -3755.66, 4737.93, -19.8168, 4.3861);
@@ -0,0 +1,3 @@
-- DB update 2023_08_13_00 -> 2023_08_13_01
--
UPDATE `conditions` SET `ConditionValue2` = 1, `Comment` = 'Require incendiary bombs placed' WHERE `SourceTypeOrReferenceId` = 15 AND `SourceGroup` = 7499 AND `SourceEntry` = 0 AND `SourceId` = 0 AND `ElseGroup` = 0 AND `ConditionTypeOrReference` = 13 AND `ConditionTarget` = 0 AND `ConditionValue1` = 0 AND `ConditionValue2` = 2 AND `ConditionValue3` = 0;
@@ -0,0 +1,4 @@
-- DB update 2023_08_13_01 -> 2023_08_13_02
--
DELETE FROM `creature` WHERE `id1` IN (16179, 16180, 16181);
DELETE FROM `linked_respawn` WHERE `guid` = 135369;
+250
View File
@@ -0,0 +1,250 @@
-- DB update 2023_08_13_02 -> 2023_08_13_03
--
UPDATE `creature_template` SET `mechanic_immune_mask`=`mechanic_immune_mask`|1|2|4|16|64|256|512|1024|2048|4096|8192|131072|8388608|33554432 WHERE `entry` = 16504;
UPDATE `creature_template_addon` SET `auras` = '18950 19818' WHERE (`entry` = 16504);
DELETE FROM `creature` WHERE (`id1` = 16504);
INSERT INTO `creature` (`guid`, `id1`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES
(135684, 16504, 532, 3457, 3457, 1, 1, 0, -11260.5087890625, -1879.0595703125, 135.9311676025390625, 1.909694314002990722, 604800, 0, 0, 24394, 0, 1, 0, 0, 0, 49890),
(135685, 16504, 532, 3457, 3457, 1, 1, 0, -11232.4775390625, -1829.6251220703125, 136.011383056640625, 0.858925580978393554, 604800, 0, 0, 24394, 0, 1, 0, 0, 0, 49890),
(135686, 16504, 532, 3457, 3457, 1, 1, 0, -11207.046875, -1795.9210205078125, 136.011383056640625, 3.821264982223510742, 604800, 0, 0, 24394, 0, 1, 0, 0, 0, 49890),
(135687, 16504, 532, 3457, 3457, 1, 1, 0, -11255.5576171875, -1808.8509521484375, 135.700286865234375, 1.39106762409210205, 604800, 0, 0, 24394, 0, 1, 0, 0, 0, 49890),
(135688, 16504, 532, 3457, 3457, 1, 1, 0, -11224.5009765625, -1775.4560546875, 135.8892059326171875, 5.352929115295410156, 604800, 0, 0, 24394, 0, 1, 0, 0, 0, 49890),
(135689, 16504, 532, 3457, 3457, 1, 1, 0, -11280.7724609375, -1806.5499267578125, 148.2413482666015625, 1.098113179206848144, 604800, 0, 0, 24394, 0, 1, 0, 0, 0, 49890),
(135690, 16504, 532, 3457, 3457, 1, 1, 0, -11246.9052734375, -1766.41943359375, 135.744354248046875, 5.099393844604492187, 604800, 0, 0, 24394, 0, 1, 0, 0, 0, 49890),
(135691, 16504, 532, 3457, 3457, 1, 1, 0, -11356.568359375, -1859.6551513671875, 172.0524139404296875, 0.652408897876739501, 604800, 0, 0, 24394, 0, 1, 0, 0, 0, 49890);
DELETE FROM `creature_addon` WHERE (`guid` IN (135684, 135685, 135686, 135687, 135688, 135689, 135690, 135691));
INSERT INTO `creature_addon` (`guid`, `path_id`, `mount`, `bytes1`, `bytes2`, `emote`, `visibilityDistanceType`, `auras`) VALUES
(135684, 1356840, 0, 0, 1, 0, 0, '18950 19818'),
(135685, 1356850, 0, 0, 1, 0, 0, '18950 19818'),
(135686, 1356860, 0, 0, 1, 0, 0, '18950 19818'),
(135687, 1356870, 0, 0, 1, 0, 0, '18950 19818'),
(135688, 1356880, 0, 0, 1, 0, 0, '18950 19818'),
(135689, 1356890, 0, 0, 1, 0, 0, '18950 19818'),
(135690, 1356890, 0, 0, 1, 0, 0, '18950 19818'),
(135691, 1356891, 0, 0, 1, 0, 0, '18950 19818');
-- Pathing for Entry: 16504
SET @NPC := 135684;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-11282.719,`position_y`=-1747.2125,`position_z`=135.91495 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-11282.719,-1747.2125,135.91495,NULL,0,0,0,100,0),
(@PATH,2,-11278.085,-1756.3627,135.8214,NULL,0,0,0,100,0),
(@PATH,3,-11275.22,-1766.3102,135.6382,NULL,0,0,0,100,0),
(@PATH,4,-11274.691,-1776.3484,137.43626,NULL,0,0,0,100,0),
(@PATH,5,-11275.114,-1787.6228,141.67157,NULL,0,0,0,100,0),
(@PATH,6,-11278.173,-1801.4655,146.54819,NULL,0,0,0,100,0),
(@PATH,7,-11283.93,-1812.7236,149.86386,NULL,0,0,0,100,0),
(@PATH,8,-11295.427,-1825.6823,154.9022,NULL,0,0,0,100,0),
(@PATH,9,-11307.174,-1836.3917,159.4869,NULL,0,0,0,100,0),
(@PATH,10,-11315.685,-1843.8234,162.48993,NULL,0,0,0,100,0),
(@PATH,11,-11324.192,-1851.0717,165.1561,NULL,0,0,0,100,0),
(@PATH,12,-11334.766,-1860.4056,167.11708,NULL,0,0,0,100,0),
(@PATH,13,-11344.708,-1869.108,169.00255,NULL,0,0,0,100,0),
(@PATH,14,-11334.766,-1860.4056,167.11708,NULL,0,0,0,100,0),
(@PATH,15,-11324.192,-1851.0717,165.1561,NULL,0,0,0,100,0),
(@PATH,16,-11315.685,-1843.8234,162.48993,NULL,0,0,0,100,0),
(@PATH,17,-11307.174,-1836.3917,159.4869,NULL,0,0,0,100,0),
(@PATH,18,-11295.427,-1825.6823,154.9022,NULL,0,0,0,100,0),
(@PATH,19,-11283.93,-1812.7236,149.86386,NULL,0,0,0,100,0),
(@PATH,20,-11278.173,-1801.4655,146.54819,NULL,0,0,0,100,0),
(@PATH,21,-11275.114,-1787.6228,141.67157,NULL,0,0,0,100,0),
(@PATH,22,-11274.691,-1776.3484,137.43626,NULL,0,0,0,100,0),
(@PATH,23,-11275.22,-1766.3102,135.6382,NULL,0,0,0,100,0),
(@PATH,24,-11278.085,-1756.3627,135.8214,NULL,0,0,0,100,0);
-- Pathing for Entry: 16504
SET @NPC := 135685;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-11244.635,`position_y`=-1861.6107,`position_z`=136.00499 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-11244.635,-1861.6107,136.00499,NULL,0,0,0,100,0),
(@PATH,2,-11243.633,-1849.3298,136.01608,NULL,0,0,0,100,0),
(@PATH,3,-11240.205,-1838.5823,136.01138,NULL,0,0,0,100,0),
(@PATH,4,-11232.055,-1829.1354,136.01138,NULL,0,0,0,100,0),
(@PATH,5,-11222.885,-1823.4156,136.01138,NULL,0,0,0,100,0),
(@PATH,6,-11214.087,-1820.8082,136.01137,NULL,0,0,0,100,0),
(@PATH,7,-11200.884,-1822.6813,136.01137,NULL,0,0,0,100,0),
(@PATH,8,-11190.939,-1827.63,136.01114,NULL,0,0,0,100,0),
(@PATH,9,-11181.966,-1835.762,136.01112,NULL,0,0,0,100,0),
(@PATH,10,-11173.904,-1843.7567,136.01112,NULL,0,0,0,100,0),
(@PATH,11,-11181.966,-1835.762,136.01112,NULL,0,0,0,100,0),
(@PATH,12,-11190.939,-1827.63,136.01114,NULL,0,0,0,100,0),
(@PATH,13,-11200.884,-1822.6813,136.01137,NULL,0,0,0,100,0),
(@PATH,14,-11214.087,-1820.8082,136.01137,NULL,0,0,0,100,0),
(@PATH,15,-11222.885,-1823.4156,136.01138,NULL,0,0,0,100,0),
(@PATH,16,-11232.055,-1829.1354,136.01138,NULL,0,0,0,100,0),
(@PATH,17,-11240.205,-1838.5823,136.01138,NULL,0,0,0,100,0),
(@PATH,18,-11243.633,-1849.3298,136.01608,NULL,0,0,0,100,0);
-- Pathing for Entry: 16504
SET @NPC := 135686;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-11179.357,`position_y`=-1819.6996,`position_z`=136.01114 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-11179.357,-1819.6996,136.01114,NULL,0,0,0,100,0),
(@PATH,2,-11184.585,-1812.9401,136.01114,NULL,0,0,0,100,0),
(@PATH,3,-11191.397,-1804.2574,136.01115,NULL,0,0,0,100,0),
(@PATH,4,-11196.627,-1797.484,136.01112,NULL,0,0,0,100,0),
(@PATH,5,-11201.327,-1791.2985,136.01138,NULL,0,0,0,100,0),
(@PATH,6,-11207.811,-1796.5381,136.0114,NULL,0,0,0,100,0),
(@PATH,7,-11213.821,-1801.6233,136.01138,NULL,0,0,0,100,0),
(@PATH,8,-11220.307,-1807.0294,136.01138,NULL,0,0,0,100,0),
(@PATH,9,-11227.366,-1813.0164,136.01138,NULL,0,0,0,100,0),
(@PATH,10,-11235.879,-1820.589,136.01138,NULL,0,0,0,100,0),
(@PATH,11,-11243.814,-1827.6565,136.01138,NULL,0,0,0,100,0),
(@PATH,12,-11250.698,-1833.699,135.97995,NULL,0,0,0,100,0),
(@PATH,13,-11243.877,-1827.712,136.0166,NULL,0,0,0,100,0),
(@PATH,14,-11235.879,-1820.589,136.01138,NULL,0,0,0,100,0),
(@PATH,15,-11227.366,-1813.0164,136.01138,NULL,0,0,0,100,0),
(@PATH,16,-11220.307,-1807.0294,136.01138,NULL,0,0,0,100,0),
(@PATH,17,-11213.821,-1801.6233,136.01138,NULL,0,0,0,100,0),
(@PATH,18,-11207.811,-1796.5381,136.0114,NULL,0,0,0,100,0),
(@PATH,19,-11201.327,-1791.2985,136.01138,NULL,0,0,0,100,0),
(@PATH,20,-11196.627,-1797.484,136.01112,NULL,0,0,0,100,0),
(@PATH,21,-11191.397,-1804.2574,136.01115,NULL,0,0,0,100,0),
(@PATH,22,-11184.585,-1812.9401,136.01114,NULL,0,0,0,100,0);
-- Pathing for Entry: 16504
SET @NPC := 135687;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-11254.315,`position_y`=-1802.0162,`position_z`=135.67534 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-11254.315,-1802.0162,135.67534,NULL,0,0,0,100,0),
(@PATH,2,-11255.973,-1811.1375,135.70863,NULL,0,0,0,100,0),
(@PATH,3,-11259.613,-1821.1395,135.7157,NULL,0,0,0,100,0),
(@PATH,4,-11266.448,-1833.0944,135.74219,NULL,0,0,0,100,0),
(@PATH,5,-11273.001,-1840.8385,135.65984,NULL,0,0,0,100,0),
(@PATH,6,-11269.364,-1844.9835,135.70094,NULL,0,0,0,100,0),
(@PATH,7,-11265.347,-1850.7305,135.75291,NULL,0,0,0,100,0),
(@PATH,8,-11260.148,-1858.1432,135.82002,NULL,0,0,0,100,0),
(@PATH,9,-11261.842,-1866.3837,135.85799,NULL,0,0,0,100,0),
(@PATH,10,-11269.297,-1871.5432,135.94835,NULL,0,0,0,100,0),
(@PATH,11,-11261.842,-1866.3837,135.85799,NULL,0,0,0,100,0),
(@PATH,12,-11260.148,-1858.1432,135.82002,NULL,0,0,0,100,0),
(@PATH,13,-11265.347,-1850.7305,135.75291,NULL,0,0,0,100,0),
(@PATH,14,-11269.364,-1844.9835,135.70094,NULL,0,0,0,100,0),
(@PATH,15,-11273.001,-1840.8385,135.65984,NULL,0,0,0,100,0),
(@PATH,16,-11266.448,-1833.0944,135.74219,NULL,0,0,0,100,0),
(@PATH,17,-11259.613,-1821.1395,135.7157,NULL,0,0,0,100,0),
(@PATH,18,-11255.973,-1811.1375,135.70863,NULL,0,0,0,100,0);
-- Pathing for Entry: 16504
SET @NPC := 135688;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-11213.536,`position_y`=-1889.4314,`position_z`=152.04805 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-11213.536,-1889.4314,152.04805,NULL,0,0,0,100,0),
(@PATH,2,-11226.246,-1898.772,147.91463,NULL,0,0,0,100,0),
(@PATH,3,-11234.652,-1902.2678,144.80687,NULL,0,0,0,100,0),
(@PATH,4,-11242.376,-1901.0875,142.21738,NULL,0,0,0,100,0),
(@PATH,5,-11250.143,-1895.2155,139.11664,NULL,0,0,0,100,0),
(@PATH,6,-11257.955,-1886.3018,135.98216,NULL,0,0,0,100,0),
(@PATH,7,-11260.844,-1878.108,135.92447,NULL,0,0,0,100,0),
(@PATH,8,-11255.884,-1871.2458,135.91449,NULL,0,0,0,100,0),
(@PATH,9,-11248.533,-1868.3633,135.99532,NULL,0,0,0,100,0),
(@PATH,10,-11242.855,-1871.226,135.99905,NULL,0,0,0,100,0),
(@PATH,11,-11255.884,-1871.2458,135.91449,NULL,0,0,0,100,0),
(@PATH,12,-11260.844,-1878.108,135.92447,NULL,0,0,0,100,0),
(@PATH,13,-11258.019,-1886.2291,135.98065,NULL,0,0,0,100,0),
(@PATH,14,-11250.143,-1895.2155,139.11664,NULL,0,0,0,100,0),
(@PATH,15,-11242.376,-1901.0875,142.21738,NULL,0,0,0,100,0),
(@PATH,16,-11234.652,-1902.2678,144.80687,NULL,0,0,0,100,0),
(@PATH,17,-11226.246,-1898.772,147.91463,NULL,0,0,0,100,0),
(@PATH,18,-11218.449,-1893.0543,151.34467,NULL,0,0,0,100,0);
-- Pathing for Entry: 16504
SET @NPC := 135689;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-11244.246,`position_y`=-1781.3795,`position_z`=135.7957 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-11244.246,-1781.3795,135.7957,NULL,0,0,0,100,0),
(@PATH,2,-11244.443,-1772.4609,135.75342,NULL,0,0,0,100,0),
(@PATH,3,-11248.54,-1762.4084,135.76776,NULL,0,0,0,100,0),
(@PATH,4,-11254.743,-1754.2867,135.89478,NULL,0,0,0,100,0),
(@PATH,5,-11262.073,-1745.61,135.93542,NULL,0,0,0,100,0),
(@PATH,6,-11269.613,-1736.4952,136.00697,NULL,0,0,0,100,0),
(@PATH,7,-11277.36,-1727.5326,136.01083,NULL,0,0,0,100,0),
(@PATH,8,-11284.054,-1733.3395,136.01456,NULL,0,0,0,100,0),
(@PATH,9,-11290.676,-1739.1726,136.01823,NULL,0,0,0,100,0),
(@PATH,10,-11284.054,-1733.3395,136.01456,NULL,0,0,0,100,0),
(@PATH,11,-11277.36,-1727.5326,136.01083,NULL,0,0,0,100,0),
(@PATH,12,-11269.613,-1736.4952,136.00697,NULL,0,0,0,100,0),
(@PATH,13,-11262.073,-1745.61,135.93542,NULL,0,0,0,100,0),
(@PATH,14,-11254.743,-1754.2867,135.89478,NULL,0,0,0,100,0),
(@PATH,15,-11248.54,-1762.4084,135.76776,NULL,0,0,0,100,0),
(@PATH,16,-11244.443,-1772.4609,135.75342,NULL,0,0,0,100,0);
-- Pathing for Entry: 16504
SET @NPC := 135690;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-11346.433,`position_y`=-1851.5946,`position_z`=170.19037 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-11346.433,-1851.5946,170.19037,NULL,0,0,0,100,0),
(@PATH,2,-11353.817,-1857.5533,171.80334,NULL,0,0,0,100,0),
(@PATH,3,-11360.403,-1862.5851,172.39963,NULL,0,0,0,100,0),
(@PATH,4,-11366.273,-1855.2086,173.61658,NULL,0,0,0,100,0),
(@PATH,5,-11372.065,-1847.9648,175.13911,NULL,0,0,0,100,0),
(@PATH,6,-11378.154,-1839.9221,177.20697,NULL,0,0,0,100,0),
(@PATH,7,-11384.107,-1832.3479,179.37885,NULL,0,0,0,100,0),
(@PATH,8,-11389.809,-1824.9479,179.73013,NULL,0,0,0,100,0),
(@PATH,9,-11395.728,-1817.1012,179.73013,NULL,0,0,0,100,0),
(@PATH,10,-11389.809,-1824.9479,179.73013,NULL,0,0,0,100,0),
(@PATH,11,-11384.107,-1832.3479,179.37885,NULL,0,0,0,100,0),
(@PATH,12,-11378.154,-1839.9221,177.20697,NULL,0,0,0,100,0),
(@PATH,13,-11372.065,-1847.9648,175.13911,NULL,0,0,0,100,0),
(@PATH,14,-11366.273,-1855.2086,173.61658,NULL,0,0,0,100,0),
(@PATH,15,-11360.403,-1862.5851,172.39963,NULL,0,0,0,100,0),
(@PATH,16,-11353.817,-1857.5533,171.80334,NULL,0,0,0,100,0);
-- Pathing for Entry: 16504
SET @NPC := 135691;
SET @PATH := @NPC * 10;
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2,`position_x`=-11244.46,`position_y`=-1804.8809,`position_z`=135.81401 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-11244.46,-1804.8809,135.81401,NULL,0,0,0,100,0),
(@PATH,2,-11236.382,-1798.8492,135.89545,NULL,0,0,0,100,0),
(@PATH,3,-11227.848,-1792.5315,135.9404,NULL,0,0,0,100,0),
(@PATH,4,-11217.406,-1784.903,135.9538,NULL,0,0,0,100,0),
(@PATH,5,-11221.928,-1778.9088,135.90015,NULL,0,0,0,100,0),
(@PATH,6,-11228.954,-1769.4824,135.9033,NULL,0,0,0,100,0),
(@PATH,7,-11235.162,-1761.6926,135.9174,NULL,0,0,0,100,0),
(@PATH,8,-11228.104,-1756.5549,135.97401,NULL,0,0,0,100,0),
(@PATH,9,-11217.438,-1749.0182,135.99788,NULL,0,0,0,100,0),
(@PATH,10,-11207.726,-1741.2073,136.01138,NULL,0,0,0,100,0),
(@PATH,11,-11217.438,-1749.0182,135.99788,NULL,0,0,0,100,0),
(@PATH,12,-11228.104,-1756.5549,135.97401,NULL,0,0,0,100,0),
(@PATH,13,-11235.162,-1761.6926,135.9174,NULL,0,0,0,100,0),
(@PATH,14,-11228.954,-1769.4824,135.9033,NULL,0,0,0,100,0),
(@PATH,15,-11221.928,-1778.9088,135.90015,NULL,0,0,0,100,0),
(@PATH,16,-11217.406,-1784.903,135.9538,NULL,0,0,0,100,0),
(@PATH,17,-11227.848,-1792.5315,135.9404,NULL,0,0,0,100,0),
(@PATH,18,-11236.382,-1798.8492,135.89545,NULL,0,0,0,100,0);
@@ -0,0 +1,2 @@
-- DB update 2023_08_13_03 -> 2023_08_14_00
UPDATE `creature_template` SET `flags_extra` = 67108864 WHERE (`entry` = 10438);
@@ -0,0 +1,4 @@
-- DB update 2023_08_14_00 -> 2023_08_14_01
--
UPDATE `smart_scripts` SET `action_param1` = 16098 WHERE `entryorguid` = 10503 AND `source_type` = 0 AND `id` = 0 AND `link` = 0;
UPDATE `smart_scripts` SET `action_param1` = 8994 WHERE `entryorguid` = 10503 AND `source_type` = 0 AND `id` = 1 AND `link` = 0;
@@ -0,0 +1,3 @@
-- DB update 2023_08_14_01 -> 2023_08_14_02
--
UPDATE `creature_template` SET `mechanic_immune_mask`=`mechanic_immune_mask`|256|8388608 WHERE `entry` = 18829;
@@ -0,0 +1,41 @@
-- DB update 2023_08_14_02 -> 2023_08_14_03
--
DELETE FROM `creature_formations` WHERE `leaderguid` IN (135229, 135217, 135233, 135206);
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
(135229, 135229, 0, 0, 3, 0, 0),
(135229, 135222, 0, 0, 3, 0, 0),
(135229, 135226, 0, 0, 3, 0, 0),
(135229, 135225, 0, 0, 3, 0, 0),
(135229, 135224, 0, 0, 3, 0, 0),
(135229, 135228, 0, 0, 3, 0, 0),
(135229, 135221, 0, 0, 3, 0, 0),
(135229, 135223, 0, 0, 3, 0, 0),
(135217, 135217, 0, 0, 3, 0, 0),
(135217, 135215, 0, 0, 3, 0, 0),
(135217, 135218, 0, 0, 3, 0, 0),
(135217, 135219, 0, 0, 3, 0, 0),
(135217, 135216, 0, 0, 3, 0, 0),
(135217, 135212, 0, 0, 3, 0, 0),
(135217, 135213, 0, 0, 3, 0, 0),
(135217, 135214, 0, 0, 3, 0, 0),
(135217, 135220, 0, 0, 3, 0, 0),
(135233, 135233, 0, 0, 3, 0, 0),
(135233, 135232, 0, 0, 3, 0, 0),
(135233, 135231, 0, 0, 3, 0, 0),
(135233, 135234, 0, 0, 3, 0, 0),
(135233, 135238, 0, 0, 3, 0, 0),
(135233, 135237, 0, 0, 3, 0, 0),
(135233, 135236, 0, 0, 3, 0, 0),
(135233, 135235, 0, 0, 3, 0, 0),
(135206, 135206, 0, 0, 3, 0, 0),
(135206, 135211, 0, 0, 3, 0, 0),
(135206, 135205, 0, 0, 3, 0, 0),
(135206, 135209, 0, 0, 3, 0, 0),
(135206, 135210, 0, 0, 3, 0, 0),
(135206, 135204, 0, 0, 3, 0, 0),
(135206, 135207, 0, 0, 3, 0, 0),
(135206, 135203, 0, 0, 3, 0, 0),
(135206, 135208, 0, 0, 3, 0, 0);
@@ -0,0 +1,2 @@
-- DB update 2023_08_14_03 -> 2023_08_14_04
UPDATE `creature_template` SET `flags_extra` = `flags_extra`|2 WHERE `entry` IN (26582, 26583);
@@ -0,0 +1,10 @@
-- DB update 2023_08_14_04 -> 2023_08_19_00
-- Vile Like Fire! (13071)
-- fix Njorndar Proto-Drake vehicle unable to fly
DELETE FROM `creature_template_spell` WHERE `CreatureID` = 30564;
INSERT INTO `creature_template_spell` (`CreatureID`, `Index`, `Spell`, `VerifiedBuild`) VALUES
(30564, 0, 57493, 12340),
(30564, 2, 7769, 12340),
(30564, 6, 57403, 12340);
-- fix Njorndar Proto-Drake display status on the ground
UPDATE `creature_template_movement` SET `Flight`=2 WHERE `CreatureId`=30272;
@@ -0,0 +1,9 @@
-- DB update 2023_08_19_00 -> 2023_08_19_01
--
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_q10651_q10692_book_of_fel_names';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(36298, 'spell_q10651_q10692_book_of_fel_names');
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 17) AND (`SourceGroup` = 0) AND (`SourceEntry` = 37906) AND (`SourceId` = 0) AND (`ElseGroup` = 0) AND (`ConditionTypeOrReference` = 31) AND (`ConditionTarget` = 1) AND (`ConditionValue1` = 3) AND (`ConditionValue2` = 21178) AND (`ConditionValue3` = 0);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(17, 0, 37906, 0, 0, 31, 1, 3, 21178, 0, 0, 0, 0, '', 'Book of Fel Names can only target Varedis');
+106
View File
@@ -0,0 +1,106 @@
-- DB update 2023_08_19_01 -> 2023_08_19_02
--
SET @GEVENT := 46;
SET @CGUID := 152340;
DELETE FROM `game_event` WHERE `eventEntry` = @GEVENT;
INSERT INTO `game_event` (`eventEntry`, `start_time`, `end_time`, `occurence`, `length`, `holiday`, `holidayStage`, `description`, `world_event`, `announce`) VALUES
(@GEVENT, '2008-09-08 12:00:00', '2008-09-24 12:00:00', 1051897, 23040 , 0, 0, 'Spirit of Competition', 0, 2);
UPDATE `creature_template` SET `gossip_menu_id` = 9517, `npcflag` = 1 WHERE `entry` = 27399;
DELETE FROM `gossip_menu_option` WHERE `MenuID` = 9517 AND `OptionID` = 0;
INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`) VALUES
(9517, 0, 0, 'I would like to enter the secret code to receive my Competitor''s Souvenir.', 26513, 1, 1);
DELETE FROM `creature` WHERE `id1` IN (27346, 27398, 27399);
INSERT INTO `creature` (`guid`, `id1`, `id2`, `id3`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES
(@CGUID, 27398, 0, 0, 0, 1537, 1537, 0, 1, 0, -5040.92, -1250.81, 507.76, 0.70, 300, 0, 0, 0, 0, 0, 0, 0, 0, '', 0), -- Grandhammer
(@CGUID+1, 27346, 0, 0, 0, 1537, 1537, 0, 1, 0, -5041.91, -1250.2, 507.76, 1.37, 300, 0, 0, 0, 0, 0, 0, 0, 0, '', 0), -- IF Dragon
(@CGUID+2, 27399, 0, 0, 1, 1637, 1637, 0, 1, 0, 1964.39, -4798.77, 56.99, 0.08, 300, 0, 0, 0, 0, 0, 0, 0, 0, '', 0), -- Muja
(@CGUID+3, 27346, 0, 0, 1, 1637, 1637, 0, 1, 0, 1963.26, -4797.62, 56.99, 0.72, 300, 0, 0, 0, 0, 0, 0, 0, 0, '', 0); -- Org Dragon
-- Positions based on screenshots.
DELETE FROM `game_event_creature` WHERE `eventEntry` = @GEVENT;
INSERT INTO `game_event_creature` (`eventEntry`, `guid`) VALUES
(@GEVENT, @CGUID),
(@GEVENT, @CGUID+1),
(@GEVENT, @CGUID+2),
(@GEVENT, @CGUID+3),
-- Goblin Commoneers
(@GEVENT, 724),
(@GEVENT, 725),
(@GEVENT, 726),
(@GEVENT, 727),
(@GEVENT, 91115),
(@GEVENT, 91116),
(@GEVENT, 91117),
(@GEVENT, 91118),
(@GEVENT, 91579),
(@GEVENT, 91580),
(@GEVENT, 91752),
(@GEVENT, 91753),
(@GEVENT, 91754),
(@GEVENT, 91756),
(@GEVENT, 91757),
(@GEVENT, 91758),
(@GEVENT, 91759),
(@GEVENT, 91760),
(@GEVENT, 91761),
(@GEVENT, 91762),
(@GEVENT, 91766),
(@GEVENT, 91767),
(@GEVENT, 91768),
(@GEVENT, 91769),
(@GEVENT, 91770),
(@GEVENT, 91771),
(@GEVENT, 91801),
(@GEVENT, 240327),
(@GEVENT, 240328),
(@GEVENT, 240329),
(@GEVENT, 240330),
(@GEVENT, 240331),
(@GEVENT, 240332),
(@GEVENT, 240333),
(@GEVENT, 240334),
(@GEVENT, 240335),
(@GEVENT, 240336),
(@GEVENT, 240337),
(@GEVENT, 240338);
DELETE FROM `creature_text` WHERE `CreatureID` = 20102 AND `GroupID` = 1;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `BroadcastTextId`) VALUES
(20102, 1, 1, 'The Spirits of Competition have grown strong again.', 12, 0, 100, 26564);
DELETE FROM `smart_scripts` WHERE `entryorguid`=20102 AND `source_type`=0 AND `id`=1 AND `link`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(20102, 0, 1, 0, 1, 0, 100, 0, 3000, 15000, 45000, 90000, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Goblin Commoner - OOC - Say');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceGroup`=2 AND `SourceEntry`=20102 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=12 AND `ConditionTarget`=1 AND `ConditionValue1`=46 AND `ConditionValue2`=0 AND `ConditionValue3`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 2, 20102, 0, 0, 12, 1, 46, 0, 0, 0, 0, 0, '', 'Commoner - Spirit of Competition must be active');
DELETE FROM `gossip_menu` WHERE `MenuID` = 10248 AND `TextID` IN (12819);
DELETE FROM `gossip_menu` WHERE `MenuID` = 90000 AND `TextID` IN (12820);
DELETE FROM `gossip_menu` WHERE `MenuID` = 90001 AND `TextID` IN (12821);
INSERT INTO `gossip_menu` (`MenuID`, `TextID`) VALUES
(10248, 12819),
(90000, 12820),
(90001, 12821);
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=10248 AND `SourceEntry`=12819 AND `ConditionTypeOrReference`=12 AND `ConditionTarget`=0 AND `ConditionValue1`=46;
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=10248 AND `SourceEntry` IN (0,1) AND `ConditionTypeOrReference`=12 AND `ConditionValue1`=46;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(14, 10248, 12819, 0, 0, 12, 0, 46, 0, 0, 0, 0, 0, '', 'Show gossip text if event 46 is active'),
(15, 10248, 0, 0, 0, 12, 0, 46, 0, 0, 0, 0, 0, '', 'Show gossip option if event 46 is active'),
(15, 10248, 1, 0, 0, 12, 0, 46, 0, 0, 0, 0, 0, '', 'Show gossip option if event 46 is active');
DELETE FROM `gossip_menu_option` WHERE `MenuID` = 10248 AND `OptionID` IN (0,1);
INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`) VALUES
(10248, 0, 0, 'How do I earn a Competitor''s Tabard?', 26508, 1, 1, 90000),
(10248, 1, 0, 'How can I gain the favor of a Spirit of Competition?', 26509, 1, 1, 90001);
DELETE FROM `spell_script_names` WHERE `spell_id` IN (48163,48164);
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(48163,'spell_gen_spirit_of_competition_participant'),
(48164,'spell_gen_spirit_of_competition_winner');
@@ -0,0 +1,3 @@
-- DB update 2023_08_19_02 -> 2023_08_20_00
--
UPDATE `conditions` SET `ConditionValue1` = 1, `ConditionValue1` = 3, `ConditionValue3` = 2, `Comment` = 'Require Lt. Drake encounter complete' WHERE `ConditionValue2` = 2 AND `SourceTypeOrReferenceId` = 14 AND `SourceGroup` = 7499 AND `SourceEntry` = 9090;
+489
View File
@@ -0,0 +1,489 @@
-- DB update 2023_08_20_00 -> 2023_08_21_00
DELETE FROM `pet_levelstats` WHERE `creature_entry` IN (416,1860,1863,417,17252,89);
INSERT INTO `pet_levelstats` (`creature_entry`,`level`,`hp`,`mana`,`armor`,`str`,`agi`,`sta`,`inte`,`spi`,`min_dmg`,`max_dmg`) VALUES
-- Imp
(416,1,34,10,22,20,20,20,25,23,0,1),
(416,2,43,48,21,21,20,20,26,24,1,2),
(416,3,56,57,32,22,20,21,27,25,2,4),
(416,4,68,66,57,23,21,21,29,26,3,6),
(416,5,80,76,87,23,21,22,30,27,4,8),
(416,6,92,85,122,24,21,22,31,28,6,10),
(416,7,105,95,166,25,21,23,32,29,7,12),
(416,8,119,105,216,26,21,23,33,30,8,13),
(416,9,134,115,275,27,21,23,35,32,9,14),
(416,10,149,126,342,27,22,24,36,33,9,15),
(416,11,167,151,362,28,22,24,39,35,10,16),
(416,12,184,177,384,29,22,26,44,38,11,17),
(416,13,202,198,405,30,22,26,47,40,11,18),
(416,14,220,234,429,31,22,28,56,45,12,19),
(416,15,239,260,451,32,23,29,61,48,12,20),
(416,16,257,282,475,34,23,30,64,50,13,21),
(416,17,277,309,498,36,23,31,68,53,14,23),
(416,18,297,336,519,37,23,32,72,55,15,24),
(416,19,318,368,543,38,23,33,76,58,17,26),
(416,20,340,396,565,40,24,35,81,61,17,27),
(416,21,362,419,588,42,24,35,84,64,18,28),
(416,22,389,447,612,44,24,37,89,67,19,30),
(416,23,415,476,633,45,24,37,92,69,20,31),
(416,24,444,509,657,46,25,39,97,73,20,31),
(416,25,471,538,679,47,25,40,101,75,21,33),
(416,26,502,563,701,49,25,41,105,78,21,34),
(416,27,532,597,725,50,25,43,110,81,23,35),
(416,28,562,652,747,52,25,43,121,86,23,36),
(416,29,591,682,770,54,26,45,126,89,23,37),
(416,30,618,717,792,54,26,46,131,92,25,39),
(416,31,646,743,814,56,26,47,134,95,26,40),
(416,32,674,779,838,57,26,49,139,98,27,41),
(416,33,701,810,860,59,27,49,143,101,27,42),
(416,34,728,842,883,60,27,51,147,104,27,43),
(416,35,757,884,904,62,27,52,152,107,28,44),
(416,36,785,911,972,63,28,53,156,110,29,45),
(416,37,814,943,1045,64,28,55,161,114,30,47),
(416,38,843,982,1118,66,28,55,165,116,31,48),
(416,39,873,1015,1196,68,28,57,170,120,32,49),
(416,40,904,1053,1277,70,29,59,174,123,33,51),
(416,41,932,1087,1363,72,29,59,178,126,35,54),
(416,42,970,1145,1454,77,29,61,190,131,37,57),
(416,43,1008,1180,1546,81,29,62,194,134,39,60),
(416,44,1047,1214,1646,88,30,63,199,138,42,65),
(416,45,1087,1254,1747,91,30,65,204,141,45,75),
(416,46,1127,1294,1782,93,30,66,208,144,46,70),
(416,47,1170,1330,1818,95,31,68,213,148,47,72),
(416,48,1212,1366,1851,97,31,68,218,151,48,73),
(416,49,1257,1412,1887,99,31,70,223,155,49,75),
(416,50,1302,1449,1920,101,32,72,228,158,51,77),
(416,51,1347,1487,1956,103,32,73,232,161,51,78),
(416,52,1394,1534,1991,105,32,74,237,165,52,80),
(416,53,1441,1572,2025,107,33,75,241,168,54,82),
(416,54,1489,1615,2060,109,33,77,247,172,54,83),
(416,55,1537,1654,2093,111,33,79,252,176,56,85),
(416,56,1587,1717,2131,114,34,80,265,181,57,87),
(416,57,1637,1762,2165,116,34,81,271,185,58,88),
(416,58,1688,1802,2198,117,34,82,275,188,69,105),
(416,59,1741,1847,2234,120,35,84,281,193,75,114),
(416,60,1793,1897,2427,122,35,86,286,196,109,165),
(416,61,1848,1938,2617,125,35,87,286,206,116,175),
(416,62,1903,1984,2807,126,35,89,286,212,124,187),
(416,63,1958,2031,2998,129,36,90,286,220,132,199),
(416,64,2014,2078,3188,131,36,92,287,226,139,211),
(416,65,2071,2125,3378,134,36,94,288,233,148,223),
(416,66,2131,2173,3569,135,37,94,297,239,156,236),
(416,67,2192,2226,3759,138,37,96,306,246,164,248),
(416,68,2255,2270,3949,140,37,97,312,251,192,290),
(416,69,2317,2319,4141,143,38,99,319,257,211,317),
(416,70,2381,2374,4330,145,38,101,327,263,228,343),
(416,71,2526,2419,4524,147,41,102,331,269,235,354),
(416,72,2666,2475,4717,150,44,104,335,275,242,364),
(416,73,2809,2526,4910,153,47,105,339,281,249,374),
(416,74,2955,2577,5104,168,51,107,343,333,256,385),
(416,75,3102,2634,5299,185,55,109,347,339,264,397),
(416,76,3250,2686,5492,203,59,110,351,344,271,408),
(416,77,3401,2743,5688,224,64,113,355,349,279,420),
(416,78,3553,2791,5881,246,68,114,360,355,287,432),
(416,79,3709,2850,6078,270,74,116,364,360,295,444),
(416,80,3867,2908,6273,297,79,118,369,367,305,458),
-- Voidwalker
(1860,1,1,1,1,1,1,1,1,1,1,1),
(1860,2,1,1,1,1,1,1,1,1,1,1),
(1860,3,1,1,1,1,1,1,1,1,1,1),
(1860,4,1,1,1,1,1,1,1,1,1,1),
(1860,5,1,1,1,1,1,1,1,1,1,1),
(1860,6,1,1,1,1,1,1,1,1,1,1),
(1860,7,1,1,1,1,1,1,1,1,1,1),
(1860,8,1,1,1,1,1,1,1,1,1,1),
(1860,9,1,1,1,1,1,1,1,1,1,1),
(1860,10,205,147,831,29,10,29,25,27,7,13),
(1860,11,229,158,875,30,10,32,26,28,8,14),
(1860,12,253,192,931,31,10,36,27,29,9,15),
(1860,13,278,203,987,32,11,40,28,30,9,15),
(1860,14,304,228,1044,33,11,44,29,31,9,16),
(1860,15,331,252,1102,34,12,48,31,32,11,18),
(1860,16,358,275,1160,36,12,52,31,33,11,19),
(1860,17,385,300,1217,38,12,55,32,34,13,21),
(1860,18,415,314,1273,39,13,59,34,36,12,21),
(1860,19,444,352,1330,40,13,63,34,37,13,22),
(1860,20,476,378,1386,42,14,67,36,38,14,23),
(1860,21,510,393,1446,44,14,71,37,39,15,25),
(1860,22,548,420,1503,46,14,75,38,41,15,25),
(1860,23,586,448,1559,47,15,79,39,42,16,26),
(1860,24,628,477,1617,49,16,83,40,43,16,27),
(1860,25,671,505,1672,50,16,87,42,44,18,29),
(1860,26,716,534,1729,52,16,91,43,46,19,30),
(1860,27,759,564,1788,53,17,95,43,47,19,31),
(1860,28,805,582,1842,55,17,99,45,48,20,32),
(1860,29,850,625,1900,57,18,103,46,49,20,32),
(1860,30,892,657,1955,57,18,107,48,51,21,34),
(1860,31,935,677,2012,59,19,111,49,52,22,35),
(1860,32,977,720,2071,60,19,115,50,53,22,36),
(1860,33,1021,742,2125,62,20,119,51,54,23,37),
(1860,34,1064,776,2184,63,20,123,52,56,23,37),
(1860,35,1110,822,2238,65,21,127,54,57,24,39),
(1860,36,1155,845,2415,66,21,131,55,59,25,40),
(1860,37,1202,880,2602,68,21,135,56,60,26,41),
(1860,38,1249,917,2795,70,22,139,58,62,26,42),
(1860,39,1298,953,3002,72,22,143,59,63,27,43),
(1860,40,1349,988,3219,74,23,148,61,65,28,44),
(1860,41,1395,1026,3444,76,23,152,62,66,30,47),
(1860,42,1453,1064,3685,81,23,156,63,67,31,49),
(1860,43,1510,1104,3936,86,24,160,65,69,34,53),
(1860,44,1569,1143,4203,93,25,164,65,70,36,58),
(1860,45,1626,1182,4480,96,25,169,67,72,38,60),
(1860,46,1689,1223,4573,98,26,173,68,73,38,61),
(1860,47,1751,1264,4641,100,26,177,70,75,40,63),
(1860,48,1815,1306,4749,102,27,181,72,76,40,64),
(1860,49,1881,1348,4841,104,27,186,73,78,42,66),
(1860,50,1949,1393,4931,107,28,190,75,80,43,68),
(1860,51,2017,1436,5018,109,29,194,76,81,43,68),
(1860,52,2087,1482,5110,111,29,199,77,82,45,71),
(1860,53,2158,1528,5200,113,30,203,79,84,45,72),
(1860,54,2229,1573,5287,115,30,207,80,85,47,74),
(1860,55,2300,1631,5376,117,31,212,82,88,48,75),
(1860,56,2375,1667,5468,120,31,216,83,89,48,76),
(1860,57,2450,1727,5556,122,32,221,84,90,50,78),
(1860,58,2527,1764,5645,124,33,225,87,92,63,99),
(1860,59,2606,1825,5734,127,33,230,88,94,68,107),
(1860,60,2686,1876,6236,129,34,234,90,96,87,134),
(1860,61,2767,1915,6730,132,35,239,105,99,100,154),
(1860,62,2849,1979,7223,133,36,243,108,102,110,169),
(1860,63,2932,2019,7717,136,37,248,112,105,117,180),
(1860,64,3014,2084,8210,138,38,252,115,108,125,191),
(1860,65,3101,2150,8704,141,39,257,119,110,132,202),
(1860,66,3189,2193,9197,143,39,261,122,113,140,214),
(1860,67,3280,2260,9693,146,41,266,124,115,148,226),
(1860,68,3374,2304,10186,148,41,271,127,118,173,264),
(1860,69,3468,2373,10679,151,42,275,130,120,189,289),
(1860,70,3564,2431,11173,153,43,280,133,122,207,314),
(1860,71,3742,2489,11670,155,47,285,134,125,212,323),
(1860,72,3915,2550,12165,158,50,289,136,127,218,332),
(1860,73,4094,2610,12662,161,54,294,138,130,225,342),
(1860,74,4276,2671,13159,177,58,299,139,190,231,352),
(1860,75,4461,2744,13658,195,63,304,141,194,238,362),
(1860,76,4647,2807,14155,214,67,309,143,196,244,371),
(1860,77,4837,2870,14652,236,72,314,144,200,250,381),
(1860,78,5029,2935,15151,260,78,318,146,202,257,392),
(1860,79,5226,3000,15650,285,84,323,148,206,264,403),
(1860,80,5428,3077,16148,314,90,328,150,209,271,414),
-- Succubus
(1863,1,1,1,1,1,1,1,1,1,1,1),
(1863,2,1,1,1,1,1,1,1,1,1,1),
(1863,3,1,1,1,1,1,1,1,1,1,1),
(1863,4,1,1,1,1,1,1,1,1,1,1),
(1863,5,1,1,1,1,1,1,1,1,1,1),
(1863,6,1,1,1,1,1,1,1,1,1,1),
(1863,7,1,1,1,1,1,1,1,1,1,1),
(1863,8,1,1,1,1,1,1,1,1,1,1),
(1863,9,1,1,1,1,1,1,1,1,1,1),
(1863,10,1,1,1,1,1,1,1,1,1,1),
(1863,11,1,1,1,1,1,1,1,1,1,1),
(1863,12,1,1,1,1,1,1,1,1,1,1),
(1863,13,1,1,1,1,1,1,1,1,1,1),
(1863,14,1,1,1,1,1,1,1,1,1,1),
(1863,15,1,1,1,1,1,1,1,1,1,1),
(1863,16,1,1,1,1,1,1,1,1,1,1),
(1863,17,1,1,1,1,1,1,1,1,1,1),
(1863,18,1,1,1,1,1,1,1,1,1,1),
(1863,19,1,1,1,1,1,1,1,1,1,1),
(1863,20,387,378,836,42,14,67,36,38,19,31),
(1863,21,415,393,872,44,14,71,37,39,21,32),
(1863,22,445,420,906,46,14,75,38,41,21,33),
(1863,23,477,448,940,47,15,79,39,42,22,35),
(1863,24,511,477,975,49,16,83,40,43,23,36),
(1863,25,546,505,1008,50,16,87,42,44,24,38),
(1863,26,583,534,1042,52,16,91,43,46,25,39),
(1863,27,618,564,1078,53,17,95,43,47,26,40),
(1863,28,656,582,1110,55,17,99,45,48,27,42),
(1863,29,693,625,1145,57,18,103,46,49,28,43),
(1863,30,727,657,1178,57,18,107,48,51,29,44),
(1863,31,762,677,1213,59,19,111,49,52,30,46),
(1863,32,796,720,1248,60,19,115,50,53,30,47),
(1863,33,832,742,1281,62,20,119,51,54,32,48),
(1863,34,867,776,1316,63,20,123,52,56,32,49),
(1863,35,904,822,1349,65,21,127,54,57,33,51),
(1863,36,941,845,1455,66,21,131,55,59,35,53),
(1863,37,980,880,1567,68,21,135,56,60,35,54),
(1863,38,1017,917,1683,70,22,139,58,62,36,55),
(1863,39,1058,953,1807,72,22,143,59,63,37,57),
(1863,40,1099,961,1937,74,23,148,61,65,38,58),
(1863,41,1137,1026,2072,76,23,152,62,66,41,62),
(1863,42,1185,1064,2216,81,23,156,63,67,43,65),
(1863,43,1232,1104,2367,86,24,160,65,69,46,70),
(1863,44,1279,1143,2527,93,25,164,65,70,50,76),
(1863,45,1326,1182,2693,96,25,169,67,72,52,79),
(1863,46,1377,1223,2749,98,26,173,68,73,53,80),
(1863,47,1393,1264,2802,100,26,177,70,75,55,83),
(1863,48,1481,1306,2855,102,27,181,72,76,55,84),
(1863,49,1535,1348,2910,104,27,186,73,78,57,87),
(1863,50,1590,1393,2964,107,28,190,75,80,59,89),
(1863,51,1646,1436,3017,109,29,194,76,81,59,90),
(1863,52,1702,1482,3072,111,29,199,77,82,61,93),
(1863,53,1761,1528,3126,113,30,203,79,84,62,94),
(1863,54,1818,1573,3178,115,30,207,80,85,64,97),
(1863,55,1877,1631,3232,117,31,212,82,88,65,98),
(1863,56,1938,1667,3287,120,31,216,83,89,66,100),
(1863,57,1999,1727,3340,122,32,221,84,90,68,103),
(1863,58,2062,1764,3394,124,33,225,87,92,85,128),
(1863,59,2127,1825,3447,127,33,230,88,94,91,137),
(1863,60,2193,1876,3748,129,34,234,90,96,113,171),
(1863,61,2258,1915,4044,132,35,239,105,99,130,195),
(1863,62,2326,1979,4340,133,36,243,108,102,142,214),
(1863,63,2392,2019,4636,136,37,248,112,105,151,227),
(1863,64,2460,2084,4932,138,38,252,115,108,160,241),
(1863,65,2531,2150,5228,141,39,257,119,110,170,255),
(1863,66,2603,2193,5523,143,39,261,122,113,180,270),
(1863,67,2678,2260,5821,146,41,266,124,115,190,285),
(1863,68,2754,2304,6116,148,41,271,127,118,220,331),
(1863,69,2832,2373,6412,151,42,275,130,120,241,361),
(1863,70,2910,2431,6708,153,43,280,133,122,261,392),
(1863,71,3070,2489,7007,155,47,285,134,125,269,403),
(1863,72,3225,2550,7305,158,50,289,136,127,276,415),
(1863,73,3384,2610,7604,161,54,294,138,130,284,427),
(1863,74,3546,2671,7903,177,58,299,139,190,293,440),
(1863,75,3710,2744,8204,195,63,304,141,194,302,453),
(1863,76,3874,2807,8503,214,67,309,143,196,310,466),
(1863,77,4044,2870,8803,236,72,314,144,200,320,480),
(1863,78,4214,2935,9104,260,78,318,146,202,330,494),
(1863,79,4387,3000,9405,285,84,323,148,206,340,509),
(1863,80,4567,3077,9706,314,90,328,150,209,350,524),
-- Felhunter
(417,1,1,1,1,1,1,1,1,1,1,1),
(417,2,1,1,1,1,1,1,1,1,1,1),
(417,3,1,1,1,1,1,1,1,1,1,1),
(417,4,1,1,1,1,1,1,1,1,1,1),
(417,5,1,1,1,1,1,1,1,1,1,1),
(417,6,1,1,1,1,1,1,1,1,1,1),
(417,7,1,1,1,1,1,1,1,1,1,1),
(417,8,1,1,1,1,1,1,1,1,1,1),
(417,9,1,1,1,1,1,1,1,1,1,1),
(417,10,1,1,1,1,1,1,1,1,1,1),
(417,11,1,1,1,1,1,1,1,1,1,1),
(417,12,1,1,1,1,1,1,1,1,1,1),
(417,13,1,1,1,1,1,1,1,1,1,1),
(417,14,1,1,1,1,1,1,1,1,1,1),
(417,15,1,1,1,1,1,1,1,1,1,1),
(417,16,1,1,1,1,1,1,1,1,1,1),
(417,17,1,1,1,1,1,1,1,1,1,1),
(417,18,1,1,1,1,1,1,1,1,1,1),
(417,19,1,1,1,1,1,1,1,1,1,1),
(417,20,1,1,1,1,1,1,1,1,1,1),
(417,21,1,1,1,1,1,1,1,1,1,1),
(417,22,1,1,1,1,1,1,1,1,1,1),
(417,23,1,1,1,1,1,1,1,1,1,1),
(417,24,1,1,1,1,1,1,1,1,1,1),
(417,25,1,1,1,1,1,1,1,1,1,1),
(417,26,1,1,1,1,1,1,1,1,1,1),
(417,27,1,1,1,1,1,1,1,1,1,1),
(417,28,1,1,1,1,1,1,1,1,1,1),
(417,29,1,1,1,1,1,1,1,1,1,1),
(417,30,770,657,946,57,18,107,48,51,19,31),
(417,31,807,677,974,59,19,111,49,52,19,32),
(417,32,844,720,1002,60,19,115,50,53,19,32),
(417,33,882,742,1028,62,20,119,51,54,20,33),
(417,34,919,776,1057,63,20,123,52,56,20,34),
(417,35,958,822,1083,65,21,127,54,57,21,35),
(417,36,997,845,1168,66,21,131,55,59,22,36),
(417,37,1038,880,1257,68,21,135,56,60,23,37),
(417,38,1078,917,1350,70,22,139,58,62,23,37),
(417,39,1120,953,1450,72,22,143,59,63,24,39),
(417,40,1165,988,1554,74,23,148,61,65,24,40),
(417,41,1204,1026,1662,76,23,152,62,66,26,43),
(417,42,1255,1064,1777,81,23,156,63,67,27,45),
(417,43,1304,1104,1898,86,24,160,65,69,30,48),
(417,44,1354,1143,2026,93,25,164,65,70,32,52),
(417,45,1404,1182,2159,96,25,169,67,72,34,54),
(417,46,1458,1223,2204,98,26,173,68,73,34,55),
(417,47,1512,1264,2246,100,26,177,70,75,35,57),
(417,48,1567,1306,2289,102,27,181,72,76,36,58),
(417,49,1624,1348,2333,104,27,186,73,78,37,60),
(417,50,1683,1393,2376,107,28,190,75,80,38,61),
(417,51,1742,1436,2419,109,29,194,76,81,38,62),
(417,52,1802,1482,2463,111,29,199,77,82,40,64),
(417,53,1863,1528,2506,113,30,203,79,84,40,65),
(417,54,1925,1573,2548,115,30,207,80,85,42,67),
(417,55,1986,1631,2591,117,31,212,82,88,42,68),
(417,56,2051,1667,2635,120,31,216,83,89,43,69),
(417,57,2116,1727,2678,122,32,221,84,90,44,71),
(417,58,2182,1764,2721,124,33,225,87,92,57,89),
(417,59,2251,1825,2764,127,33,230,88,94,61,97),
(417,60,2320,1876,3005,129,34,234,90,96,78,122),
(417,61,2389,1915,3242,132,35,239,105,99,90,140),
(417,62,2460,1979,3479,133,36,243,108,102,100,154),
(417,63,2531,2019,3716,136,37,248,112,105,107,165),
(417,64,2602,2084,3953,138,38,252,115,108,113,175),
(417,65,2678,2150,4190,141,39,257,119,110,120,185),
(417,66,2754,2193,4426,143,39,261,122,113,128,197),
(417,67,2833,2260,4665,146,41,266,124,115,135,208),
(417,68,2913,2304,4901,148,41,271,127,118,158,243),
(417,69,2995,2373,5138,151,42,275,130,120,173,266),
(417,70,3077,2431,5375,153,43,280,133,122,189,289),
(417,71,3242,2489,5615,155,47,285,134,125,194,297),
(417,72,3401,2550,5854,158,50,289,136,127,200,306),
(417,73,3566,2610,6094,161,54,294,138,130,206,315),
(417,74,3733,2671,6334,177,58,299,139,190,212,324),
(417,75,3903,2744,6575,195,63,304,141,194,217,333),
(417,76,4072,2807,6815,214,67,309,143,196,222,341),
(417,77,4247,2870,7056,236,72,314,144,200,228,350),
(417,78,4422,2935,7298,260,78,318,146,202,234,359),
(417,79,4602,3000,7540,285,84,323,148,206,240,369),
(417,80,4787,3077,7782,314,90,328,150,209,246,379),
-- Felguard
(17252,1,1,1,1,1,1,1,1,1,1,1),
(17252,2,1,1,1,1,1,1,1,1,1,1),
(17252,3,1,1,1,1,1,1,1,1,1,1),
(17252,4,1,1,1,1,1,1,1,1,1,1),
(17252,5,1,1,1,1,1,1,1,1,1,1),
(17252,6,1,1,1,1,1,1,1,1,1,1),
(17252,7,1,1,1,1,1,1,1,1,1,1),
(17252,8,1,1,1,1,1,1,1,1,1,1),
(17252,9,1,1,1,1,1,1,1,1,1,1),
(17252,10,1,1,1,1,1,1,1,1,1,1),
(17252,11,1,1,1,1,1,1,1,1,1,1),
(17252,12,1,1,1,1,1,1,1,1,1,1),
(17252,13,1,1,1,1,1,1,1,1,1,1),
(17252,14,1,1,1,1,1,1,1,1,1,1),
(17252,15,1,1,1,1,1,1,1,1,1,1),
(17252,16,1,1,1,1,1,1,1,1,1,1),
(17252,17,1,1,1,1,1,1,1,1,1,1),
(17252,18,1,1,1,1,1,1,1,1,1,1),
(17252,19,1,1,1,1,1,1,1,1,1,1),
(17252,20,1,1,1,1,1,1,1,1,1,1),
(17252,21,1,1,1,1,1,1,1,1,1,1),
(17252,22,1,1,1,1,1,1,1,1,1,1),
(17252,23,1,1,1,1,1,1,1,1,1,1),
(17252,24,1,1,1,1,1,1,1,1,1,1),
(17252,25,1,1,1,1,1,1,1,1,1,1),
(17252,26,1,1,1,1,1,1,1,1,1,1),
(17252,27,1,1,1,1,1,1,1,1,1,1),
(17252,28,1,1,1,1,1,1,1,1,1,1),
(17252,29,1,1,1,1,1,1,1,1,1,1),
(17252,30,1,1,1,1,1,1,1,1,1,1),
(17252,31,1,1,1,1,1,1,1,1,1,1),
(17252,32,1,1,1,1,1,1,1,1,1,1),
(17252,33,1,1,1,1,1,1,1,1,1,1),
(17252,34,1,1,1,1,1,1,1,1,1,1),
(17252,35,1,1,1,1,1,1,1,1,1,1),
(17252,36,1,1,1,1,1,1,1,1,1,1),
(17252,37,1,1,1,1,1,1,1,1,1,1),
(17252,38,1,1,1,1,1,1,1,1,1,1),
(17252,39,1,1,1,1,1,1,1,1,1,1),
(17252,40,1,1,1,1,1,1,1,1,1,1),
(17252,41,1,1,1,1,1,1,1,1,1,1),
(17252,42,1,1,1,1,1,1,1,1,1,1),
(17252,43,1,1,1,1,1,1,1,1,1,1),
(17252,44,1,1,1,1,1,1,1,1,1,1),
(17252,45,1,1,1,1,1,1,1,1,1,1),
(17252,46,1,1,1,1,1,1,1,1,1,1),
(17252,47,1,1,1,1,1,1,1,1,1,1),
(17252,48,1,1,1,1,1,1,1,1,1,1),
(17252,49,1,1,1,1,1,1,1,1,1,1),
(17252,50,1949,1393,4285,107,28,190,75,80,54,83),
(17252,51,2017,1436,4361,109,29,194,76,81,55,84),
(17252,52,2087,1482,4441,111,29,199,77,82,57,87),
(17252,53,2158,1528,4519,113,30,203,79,84,58,88),
(17252,54,2229,1573,4594,115,30,207,80,85,60,91),
(17252,55,2300,1631,4672,117,31,212,82,88,61,92),
(17252,56,2375,1667,4752,120,31,216,83,89,61,94),
(17252,57,2450,1727,4828,122,32,221,84,90,63,96),
(17252,58,2527,1764,4906,124,33,225,87,92,79,120),
(17252,59,2606,1825,4983,127,33,230,88,94,85,129),
(17252,60,2686,1876,5419,129,34,234,90,96,106,161),
(17252,61,2767,1915,5848,132,35,239,105,99,122,184),
(17252,62,2849,1979,6276,133,36,243,108,102,134,202),
(17252,63,2932,2019,6705,136,37,248,112,105,142,215),
(17252,64,3014,2084,7134,138,38,252,115,108,151,228),
(17252,65,3101,2150,7563,141,39,257,119,110,160,241),
(17252,66,3189,2193,7990,143,39,261,122,113,169,255),
(17252,67,3280,2260,8422,146,41,266,124,115,179,269),
(17252,68,3374,2304,8849,148,41,271,127,118,208,314),
(17252,69,3468,2373,9278,151,42,275,130,120,227,342),
(17252,70,3564,2431,9707,153,43,280,133,122,247,372),
(17252,71,3742,2489,10139,155,47,285,134,125,254,382),
(17252,72,3915,2550,10569,158,50,289,136,127,261,393),
(17252,73,4094,2610,11001,161,54,294,138,130,268,404),
(17252,74,4276,2671,11433,177,58,299,139,190,277,417),
(17252,75,4461,2744,11867,195,63,304,141,194,285,429),
(17252,76,4647,2807,12299,214,67,309,143,196,266,441),
(17252,77,4837,2870,12731,236,72,314,144,200,302,454),
(17252,78,5029,2935,13165,260,78,318,146,202,310,467),
(17252,79,5226,3000,13599,285,84,323,148,206,320,481),
(17252,80,5428,3077,14033,314,90,328,150,209,329,495),
-- Infernal
(89,1,1,1,1,1,1,1,1,1,1,1),
(89,2,1,1,1,1,1,1,1,1,1,1),
(89,3,1,1,1,1,1,1,1,1,1,1),
(89,4,1,1,1,1,1,1,1,1,1,1),
(89,5,1,1,1,1,1,1,1,1,1,1),
(89,6,1,1,1,1,1,1,1,1,1,1),
(89,7,1,1,1,1,1,1,1,1,1,1),
(89,8,1,1,1,1,1,1,1,1,1,1),
(89,9,1,1,1,1,1,1,1,1,1,1),
(89,10,1,1,1,1,1,1,1,1,1,1),
(89,11,1,1,1,1,1,1,1,1,1,1),
(89,12,1,1,1,1,1,1,1,1,1,1),
(89,13,1,1,1,1,1,1,1,1,1,1),
(89,14,1,1,1,1,1,1,1,1,1,1),
(89,15,1,1,1,1,1,1,1,1,1,1),
(89,16,1,1,1,1,1,1,1,1,1,1),
(89,17,1,1,1,1,1,1,1,1,1,1),
(89,18,1,1,1,1,1,1,1,1,1,1),
(89,19,1,1,1,1,1,1,1,1,1,1),
(89,20,1,1,1,1,1,1,1,1,1,1),
(89,21,1,1,1,1,1,1,1,1,1,1),
(89,22,1,1,1,1,1,1,1,1,1,1),
(89,23,1,1,1,1,1,1,1,1,1,1),
(89,24,1,1,1,1,1,1,1,1,1,1),
(89,25,1,1,1,1,1,1,1,1,1,1),
(89,26,1,1,1,1,1,1,1,1,1,1),
(89,27,1,1,1,1,1,1,1,1,1,1),
(89,28,1,1,1,1,1,1,1,1,1,1),
(89,29,1,1,1,1,1,1,1,1,1,1),
(89,30,1,1,1,1,1,1,1,1,1,1),
(89,31,1,1,1,1,1,1,1,1,1,1),
(89,32,1,1,1,1,1,1,1,1,1,1),
(89,33,1,1,1,1,1,1,1,1,1,1),
(89,34,1,1,1,1,1,1,1,1,1,1),
(89,35,1,1,1,1,1,1,1,1,1,1),
(89,36,1,1,1,1,1,1,1,1,1,1),
(89,37,1,1,1,1,1,1,1,1,1,1),
(89,38,1,1,1,1,1,1,1,1,1,1),
(89,39,1,1,1,1,1,1,1,1,1,1),
(89,40,1,1,1,1,1,1,1,1,1,1),
(89,41,1,1,1,1,1,1,1,1,1,1),
(89,42,1,1,1,1,1,1,1,1,1,1),
(89,43,1,1,1,1,1,1,1,1,1,1),
(89,44,1,1,1,1,1,1,1,1,1,1),
(89,45,1,1,1,1,1,1,1,1,1,1),
(89,46,1,1,1,1,1,1,1,1,1,1),
(89,47,1,1,1,1,1,1,1,1,1,1),
(89,48,1,1,1,1,1,1,1,1,1,1),
(89,49,1,1,1,1,1,1,1,1,1,1),
(89,50,4577,1692,4931,107,28,190,75,80,243,327),
(89,51,4733,1747,5018,109,29,194,76,81,250,330),
(89,52,4883,1793,5110,111,29,199,77,82,251,338),
(89,53,5048,1850,5200,113,30,203,79,84,258,346),
(89,54,5209,1895,5287,115,30,207,80,85,263,354),
(89,55,5372,1965,5376,117,31,212,82,88,270,361),
(89,56,5533,2012,5468,120,31,216,83,89,276,362),
(89,57,5704,2072,5556,122,32,221,84,90,279,377),
(89,58,8002,2121,5645,124,33,225,87,92,329,450),
(89,59,8302,2182,5734,127,33,230,88,94,352,478),
(89,60,9892,2244,6236,129,34,234,90,96,430,587),
(89,61,10241,2295,6730,132,35,239,105,99,472,659),
(89,62,10598,2359,7223,133,36,243,108,102,517,707),
(89,63,10960,2410,7717,136,37,248,112,105,541,762),
(89,64,11317,2487,8210,138,38,252,115,108,583,772),
(89,65,11714,2553,8704,141,39,257,119,110,600,852),
(89,66,12106,2607,9197,143,39,261,122,113,632,871),
(89,67,12505,2686,9693,146,41,266,124,115,675,929),
(89,68,13768,2730,10186,148,41,271,127,118,763,1028),
(89,69,15674,2810,10679,151,42,275,130,120,826,1176),
(89,70,17579,2880,11173,153,43,280,133,122,907,1282),
(89,71,18254,2938,11670,155,47,285,134,125,928,1311),
(89,72,18941,3010,12165,158,50,289,136,127,940,1337),
(89,73,19649,3082,12662,161,54,294,138,130,1006,1384),
(89,74,20371,3154,13159,177,58,299,139,190,1010,1442),
(89,75,21131,3227,13658,195,63,304,141,194,1052,1462),
(89,76,21908,3302,14155,214,67,309,143,196,1091,1537),
(89,77,22698,3376,14652,236,72,314,144,200,1136,1581),
(89,78,23531,3453,15151,260,78,318,146,202,1165,1657),
(89,79,24381,3529,15650,285,84,323,148,206,1224,1687),
(89,80,25261,3618,16148,314,90,328,150,209,1263,1768);
@@ -0,0 +1,5 @@
-- DB update 2023_08_21_00 -> 2023_08_21_01
--
DELETE FROM `spell_script_names` WHERE `spell_id` IN (37906, 36298);
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(37906, 'spell_q10651_q10692_book_of_fel_names');
@@ -0,0 +1,13 @@
-- DB update 2023_08_21_01 -> 2023_08_23_00
-- Giselda the Crone
DELETE FROM `creature_text` WHERE `CreatureID` = 18391;
INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES
(18391, 0, 0, 'Your blood will coat the walls of Kil\'sorrow!', 12, 0, 100, 0, 0, 0, 16062, 0, 'Giselda the Crone - Say on Transformation');
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 18391);
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_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(18391, 0, 0, 0, 0, 0, 100, 0, 4500, 8500, 3600, 14500, 0, 0, 11, 32000, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Giselda the Crone - In Combat - Cast \'Mind Sear\''),
(18391, 0, 1, 2, 2, 0, 100, 1, 0, 65, 0, 0, 0, 0, 11, 33316, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Giselda the Crone - Between 0-65% Health - Cast \'Giselda Transform DND\' (No Repeat)'),
(18391, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Giselda the Crone - Between 0-65% Health - Say Line 0 (No Repeat)');
UPDATE `creature_template_addon` SET `auras` = '16592' WHERE (`entry` = 18391);
@@ -0,0 +1,3 @@
-- DB update 2023_08_23_00 -> 2023_08_23_01
--
UPDATE `item_template` SET `spellppmRate_1` = 0.25 WHERE (`entry` = 28441);
@@ -0,0 +1,4 @@
-- DB update 2023_08_23_01 -> 2023_08_24_00
--
UPDATE `smart_scripts` SET `action_param6` = 2 WHERE `entryorguid` = 3662 AND `source_type` = 0 AND `id` = 3;
UPDATE `smart_scripts` SET `action_param6` = 2 WHERE `entryorguid` = 366200 AND `source_type` = 9 AND `id` = 1;
-1
Submodule deps/git-subrepo deleted from 2f6859642a
+59 -34
View File
@@ -33,9 +33,9 @@ x-ac-service-conf: &ac-service-conf
<<: *ac-shared-conf <<: *ac-shared-conf
# List can't be merged. See: https://forums.docker.com/t/how-to-merge-a-list-of-volumes-from-an-extension-field-into-the-service-definition/77454 # List can't be merged. See: https://forums.docker.com/t/how-to-merge-a-list-of-volumes-from-an-extension-field-into-the-service-definition/77454
# volumes: # volumes:
# - ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc # - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc
# # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 # # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
# - ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated # - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated
services: services:
@@ -94,7 +94,7 @@ services:
# expose some dist folder outside allowing the host to use them # expose some dist folder outside allowing the host to use them
- ${DOCKER_VOL_CONF:-./conf}:/azerothcore/conf - ${DOCKER_VOL_CONF:-./conf}:/azerothcore/conf
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc
- ac-build-dev:/azerothcore/var/build - ac-build-dev:/azerothcore/var/build
- ac-ccache-dev:/azerothcore/var/ccache - ac-ccache-dev:/azerothcore/var/ccache
profiles: [dev-build] profiles: [dev-build]
@@ -118,32 +118,22 @@ services:
- seccomp:unconfined - seccomp:unconfined
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
environment:
AC_DATA_DIR: "/azerothcore/env/dist/data"
AC_LOGS_DIR: "/azerothcore/env/dist/logs"
AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world"
AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters"
AC_CLOSE_IDLE_CONNECTIONS: "0"
ports: ports:
- ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724
- ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085
- ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878
volumes: volumes:
- ${DOCKER_VOL_ROOT:-.}:/azerothcore:cached - ${DOCKER_VOL_ROOT:-.}:/azerothcore:cached
# expose some dist folder outside allowing the host to use them
- ${DOCKER_VOL_CONF:-./conf}:/azerothcore/conf
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
- ac-build-dev:/azerothcore/var/build - ac-build-dev:/azerothcore/var/build
- ac-ccache-dev:/azerothcore/var/ccache - ac-ccache-dev:/azerothcore/var/ccache
# client data
- ${DOCKER_VOL_DATA_CAMERAS:-./env/docker/data/Cameras}:/azerothcore/env/dist/data/Cameras
- ${DOCKER_VOL_DATA_DBC:-./env/docker/data/dbc}:/azerothcore/env/dist/data/dbc
- ${DOCKER_VOL_DATA_MAPS:-./env/docker/data/maps}:/azerothcore/env/dist/data/maps
- ${DOCKER_VOL_DATA_VMAPS:-./env/docker/data/vmaps}:/azerothcore/env/dist/data/vmaps
- ${DOCKER_VOL_DATA_MMAPS:-./env/docker/data/mmaps}:/azerothcore/env/dist/data/mmaps
# remount again for the extractors
- ${DOCKER_VOL_DATA_CAMERAS:-./env/docker/data/Cameras}:/azerothcore/env/dist/bin/Cameras
- ${DOCKER_VOL_DATA_DBC:-./env/docker/data/dbc}:/azerothcore/env/dist/bin/dbc
- ${DOCKER_VOL_DATA_MAPS:-./env/docker/data/maps}:/azerothcore/env/dist/bin/maps
- ${DOCKER_VOL_DATA_VMAPS:-./env/docker/data/vmaps}:/azerothcore/env/dist/bin/vmaps
- ${DOCKER_VOL_DATA_MMAPS:-./env/docker/data/mmaps}:/azerothcore/env/dist/bin/mmaps
# this is not the directory of the extracted data! It's the client folder used by the extractors # this is not the directory of the extracted data! It's the client folder used by the extractors
- ${DOCKER_AC_CLIENT_FOLDER:-./var/client}:/azerothcore/env/dist/bin/Data - ${DOCKER_AC_CLIENT_FOLDER:-./var/client}:/azerothcore/env/dist/bin/Data
profiles: [dev] profiles: [dev]
@@ -155,12 +145,19 @@ services:
<<: *ac-shared-conf <<: *ac-shared-conf
image: acore/ac-wotlk-worldserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-worldserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
command: ./env/dist/bin/dbimport command: ./env/dist/bin/dbimport
environment:
AC_DATA_DIR: "/azerothcore/env/dist/data"
AC_LOGS_DIR: "/azerothcore/env/dist/logs"
AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world"
AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters"
AC_CLOSE_IDLE_CONNECTIONS: "0"
volumes: volumes:
# read-only binaries compiled by ac-dev-server # read-only binaries compiled by ac-dev-server
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc:ro
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated
profiles: [local, app, db-import-local] profiles: [local, app, db-import-local]
depends_on: depends_on:
ac-database: ac-database:
@@ -183,6 +180,13 @@ services:
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
environment:
AC_DATA_DIR: "/azerothcore/env/dist/data"
AC_LOGS_DIR: "/azerothcore/env/dist/logs"
AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world"
AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters"
AC_CLOSE_IDLE_CONNECTIONS: "0"
user: ${DOCKER_USER:-root} user: ${DOCKER_USER:-root}
privileged: true privileged: true
build: build:
@@ -194,15 +198,11 @@ services:
volumes: volumes:
# read-only binaries compiled by ac-dev-server # read-only binaries compiled by ac-dev-server
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc:ro
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated
# client data # client data
- ${DOCKER_VOL_DATA_CAMERAS:-./env/docker/data/Cameras}:/azerothcore/env/dist/data/Cameras - ${DOCKER_VOL_DATA:-./env/dist/data/}:/azerothcore/env/dist/data/
- ${DOCKER_VOL_DATA_DBC:-./env/docker/data/dbc}:/azerothcore/env/dist/data/dbc
- ${DOCKER_VOL_DATA_MAPS:-./env/docker/data/maps}:/azerothcore/env/dist/data/maps
- ${DOCKER_VOL_DATA_VMAPS:-./env/docker/data/vmaps}:/azerothcore/env/dist/data/vmaps
- ${DOCKER_VOL_DATA_MMAPS:-./env/docker/data/mmaps}:/azerothcore/env/dist/data/mmaps
profiles: [local, app, worldserver] profiles: [local, app, worldserver]
depends_on: depends_on:
ac-database: ac-database:
@@ -218,6 +218,12 @@ services:
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
environment:
AC_LOGS_DIR: "/azerothcore/env/dist/logs"
AC_TEMP_DIR: "/azerothcore/env/dist/temp"
AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_SQLDRIVER_LOG_FILE: "SQLDriver.log"
AC_SQLDRIVER_QUERY_LOGGING: "1"
user: ${DOCKER_USER:-root} user: ${DOCKER_USER:-root}
build: build:
target: authserver-local target: authserver-local
@@ -225,9 +231,9 @@ services:
volumes: volumes:
# read-only binaries compiled by ac-dev-server # read-only binaries compiled by ac-dev-server
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc - ${DOCKER_VOL_ETC:-./env/dist/etc}:/azerothcore/env/dist/etc
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544 # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated
ports: ports:
- ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724
profiles: [local, app, authserver] profiles: [local, app, authserver]
@@ -281,6 +287,13 @@ services:
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
environment:
AC_DATA_DIR: "/azerothcore/env/dist/data"
AC_LOGS_DIR: "/azerothcore/env/dist/logs"
AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world"
AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters"
AC_CLOSE_IDLE_CONNECTIONS: "0"
user: ${DOCKER_USER:-root} user: ${DOCKER_USER:-root}
privileged: true privileged: true
build: build:
@@ -290,7 +303,7 @@ services:
- ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085
- ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878
volumes: volumes:
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated
- ${DOCKER_VOL_CLIENT_DATA_PROD:-ac-client-data-prod}:/azerothcore/env/dist/data:ro - ${DOCKER_VOL_CLIENT_DATA_PROD:-ac-client-data-prod}:/azerothcore/env/dist/data:ro
profiles: [prod, prod-app, prod-worldserver] profiles: [prod, prod-app, prod-worldserver]
depends_on: depends_on:
@@ -309,12 +322,18 @@ services:
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
environment:
AC_LOGS_DIR: "/azerothcore/env/dist/logs"
AC_TEMP_DIR: "/azerothcore/env/dist/temp"
AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_SQLDRIVER_LOG_FILE: "SQLDriver.log"
AC_SQLDRIVER_QUERY_LOGGING: "1"
user: ${DOCKER_USER:-root} user: ${DOCKER_USER:-root}
build: build:
target: authserver target: authserver
<<: *build-params <<: *build-params
volumes: volumes:
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated - ${DOCKER_VOL_LOGS:-./env/dist/logs}:/azerothcore/env/dist/logs:delegated
ports: ports:
- ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724
profiles: [prod, prod-app, prod-authserver] profiles: [prod, prod-app, prod-authserver]
@@ -324,7 +343,6 @@ services:
ac-db-import-prod: ac-db-import-prod:
condition: service_completed_successfully condition: service_completed_successfully
ac-client-data-init: ac-client-data-init:
image: acore/ac-wotlk-client-data:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-client-data:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
user: ${DOCKER_USER:-root} user: ${DOCKER_USER:-root}
@@ -356,6 +374,13 @@ services:
<<: *ac-shared-conf <<: *ac-shared-conf
image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
command: ./env/dist/bin/dbimport command: ./env/dist/bin/dbimport
environment:
AC_DATA_DIR: "/azerothcore/env/dist/data"
AC_LOGS_DIR: "/azerothcore/env/dist/logs"
AC_LOGIN_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_auth"
AC_WORLD_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_world"
AC_CHARACTER_DATABASE_INFO: "ac-database;3306;root;${DOCKER_DB_ROOT_PASSWORD:-password};acore_characters"
AC_CLOSE_IDLE_CONNECTIONS: "0"
profiles: [prod, prod-app, db-import-prod] profiles: [prod, prod-app, db-import-prod]
# #
View File
View File
View File
View File
View File
View File
View File
View File
-22
View File
@@ -1,22 +0,0 @@
###############################################
# AzerothCore Auth Server configuration file #
###############################################
[authserver]
# Do not change this
# Files in LogsDir will reflect on your host directory: docker/authserver/logs
LogsDir = "/azerothcore/env/dist/logs"
# Files in TempDir will reflect on your host directory: docker/authserver/temp
TempDir = "/azerothcore/env/dist/temp"
# Change this configuration accordingly with your docker setup
# The format is "hostname;port;username;password;database":
# - docker containers must be on the same docker network to be able to communicate
# - the DB hostname will be the name of the database docker container
LoginDatabaseInfo = "ac-database;3306;root;password;acore_auth"
# Add more configuration overwrites by copying settings from from authserver.conf.dist
SQLDriverLogFile = "SQLDriver.log"
SQLDriverQueryLogging = 1
-18
View File
@@ -1,18 +0,0 @@
# Do NOT change those Dir configs
# Files in LogsDir will reflect on your host directory: docker/worldserver/logs
LogsDir = "/azerothcore/env/dist/logs"
# Files in TempDir will reflect on your host directory: docker/authserver/temp
DataDir = "/azerothcore/env/dist/data"
# Change this configuration accordingly with your docker setup
# The format is "hostname;port;username;password;database":
# - docker containers must be on the same docker network to be able to communicate
# - the DB hostname will be the name of the database docker container
LoginDatabaseInfo = "ac-database;3306;root;password;acore_auth"
WorldDatabaseInfo = "ac-database;3306;root;password;acore_world"
CharacterDatabaseInfo = "ac-database;3306;root;password;acore_characters"
# Add more configuration overwrites by copying settings from worldserver.conf.dist
# Disable idle connections automatic kick since it doesn't work well on macOS + Docker
CloseIdleConnections = 0
-23
View File
@@ -1,23 +0,0 @@
################################################
# AzerothCore World Server configuration file #
################################################
[worldserver]
# Do NOT change those Dir configs
# Files in LogsDir will reflect on your host directory: docker/worldserver/logs
LogsDir = "/azerothcore/env/dist/logs"
# Files in TempDir will reflect on your host directory: docker/authserver/temp
DataDir = "/azerothcore/env/dist/data"
# Change this configuration accordingly with your docker setup
# The format is "hostname;port;username;password;database":
# - docker containers must be on the same docker network to be able to communicate
# - the DB hostname will be the name of the database docker container
LoginDatabaseInfo = "ac-database;3306;root;password;acore_auth"
WorldDatabaseInfo = "ac-database;3306;root;password;acore_world"
CharacterDatabaseInfo = "ac-database;3306;root;password;acore_characters"
# Add more configuration overwrites by copying settings from worldserver.conf.dist
# Disable idle connections automatic kick since it doesn't work well on macOS + Docker
CloseIdleConnections = 0
View File
+18 -4
View File
@@ -1,8 +1,12 @@
<!-- First of all, THANK YOU for your contribution. --> <!-- First of all, THANK YOU for your contribution. -->
## Changes Proposed: ## Changes Proposed:
- This PR proposes changes to:
- - [ ] Core (units, players, creatures, game systems).
- [ ] Scripts (bosses, spell scripts, creature scripts).
- [ ] Database (SAI, creatures, etc).
If your pull request promotes complex changes that require a detailed explanation, please describe them in detail specifying what your solution is and what is it meant to address.
## Issues Addressed: ## Issues Addressed:
<!-- If your fix has a relating issue, link it below --> <!-- If your fix has a relating issue, link it below -->
@@ -10,16 +14,26 @@
## SOURCE: ## SOURCE:
<!-- If you can, include a source that can strengthen your claim --> <!-- If you can, include a source that can strengthen your claim -->
The changes have been validated through:
- [ ] Live research (checked on live servers, e.g Classic WotLK, Retail, etc.)
- [ ] Sniffs (remember to share them with the open source community!)
- [ ] Video evidence, knowledge databases or other public sources (e.g forums, Wowhead, etc.)
- [ ] The changes promoted by this pull request come partially or entirely from another project (cherry-pick). **Cherry-picks must be committed using the proper --author tag in order to be accepted, thus crediting the original authors, unless otherwise unable to be found**
## Tests Performed: ## Tests Performed:
<!-- Does it build without errors? Did you test in-game? What did you test? On which OS did you test? Describe any other tests performed --> <!-- Does it build without errors? Did you test in-game? What did you test? On which OS did you test? Describe any other tests performed -->
- This PR has been:
- - [ ] Tested in-game by the author.
- [ ] Tested in-game by other community members/someone else other than the author/has been live on production servers.
- [ ] This pull request requires further testing and may have edge cases to be tested.
## How to Test the Changes: ## How to Test the Changes:
<!-- Describe in a detailed step-by-step order how to test the changes --> <!-- Describe in a detailed step-by-step order how to test the changes -->
- [ ] This pull request can be tested by following the reproduction steps provided in the linked issue
- [ ] This pull request requires further testing. Provide steps to test your changes. If it requires any specific setup e.g multiple players please specify it as well.
1. 1.
2. 2.
3. 3.
+37 -74
View File
@@ -24,19 +24,6 @@
set( MYSQL_FOUND 0 ) set( MYSQL_FOUND 0 )
if(WIN32)
# read environment variables and change \ to /
SET(PROGRAM_FILES_32 $ENV{ProgramFiles})
if (${PROGRAM_FILES_32})
STRING(REPLACE "\\\\" "/" PROGRAM_FILES_32 ${PROGRAM_FILES_32})
endif(${PROGRAM_FILES_32})
SET(PROGRAM_FILES_64 $ENV{ProgramW6432})
if (${PROGRAM_FILES_64})
STRING(REPLACE "\\\\" "/" PROGRAM_FILES_64 ${PROGRAM_FILES_64})
endif(${PROGRAM_FILES_64})
endif(WIN32)
# Find MariaDB for Windows # Find MariaDB for Windows
if (WIN32) if (WIN32)
# Set know versions MariaDB # Set know versions MariaDB
@@ -55,8 +42,8 @@ if (WIN32)
mysql.h mysql.h
PATHS PATHS
${MYSQL_ADD_INCLUDE_PATH} ${MYSQL_ADD_INCLUDE_PATH}
"${PROGRAM_FILES_64}/${MariaDBVersion}/include/mysql" "$ENV{ProgramW6432}/${MariaDBVersion}/include/mysql"
"${PROGRAM_FILES_32}/${MariaDBVersion}/include/mysql" "$ENV{ProgramFiles}/${MariaDBVersion}/include/mysql"
"${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/mysql" "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include/mysql"
DOC DOC
"Specify the directory containing mysql.h." "Specify the directory containing mysql.h."
@@ -71,10 +58,9 @@ if (WIN32)
libmariadb libmariadb
PATHS PATHS
${MYSQL_ADD_LIBRARIES_PATH} ${MYSQL_ADD_LIBRARIES_PATH}
"${PROGRAM_FILES_64}/${MariaDBVersion}/lib" "$ENV{ProgramW6432}/${MariaDBVersion}/lib"
"${PROGRAM_FILES_64}/${MariaDBVersion}/lib/opt" "$ENV{ProgramW6432}/${MariaDBVersion}/lib/opt"
"${PROGRAM_FILES_32}/${MariaDBVersion}/lib" "$ENV{ProgramFiles}/${MariaDBVersion}/lib"
"${PROGRAM_FILES_32}/${MariaDBVersion}/lib/opt"
"$ENV{ProgramFiles}/${MariaDBVersion}/lib/opt" "$ENV{ProgramFiles}/${MariaDBVersion}/lib/opt"
"$ENV{SystemDrive}/${MariaDBVersion}/lib/opt" "$ENV{SystemDrive}/${MariaDBVersion}/lib/opt"
"${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib" "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib"
@@ -88,10 +74,9 @@ if (WIN32)
find_program(MYSQL_EXECUTABLE mysql find_program(MYSQL_EXECUTABLE mysql
PATHS PATHS
"${PROGRAM_FILES_64}/${MariaDBVersion}/bin" "$ENV{ProgramW6432}/${MariaDBVersion}/bin"
"${PROGRAM_FILES_64}/${MariaDBVersion}/bin/opt" "$ENV{ProgramW6432}/${MariaDBVersion}/bin/opt"
"${PROGRAM_FILES_32}/${MariaDBVersion}/bin" "$ENV{ProgramFiles}/${MariaDBVersion}/bin"
"${PROGRAM_FILES_32}/${MariaDBVersion}/bin/opt"
"$ENV{ProgramFiles}/${MariaDBVersion}/bin/opt" "$ENV{ProgramFiles}/${MariaDBVersion}/bin/opt"
"$ENV{SystemDrive}/${MariaDBVersion}/bin/opt" "$ENV{SystemDrive}/${MariaDBVersion}/bin/opt"
DOC DOC
@@ -171,18 +156,17 @@ find_path(MYSQL_INCLUDE_DIR
/usr/local/include/mysql /usr/local/include/mysql
/usr/local/mysql/include /usr/local/mysql/include
"C:/tools/mysql/current/include" # chocolatey package "C:/tools/mysql/current/include" # chocolatey package
"C:/Program Files/MySQL/MySQL Server 8.0/include" "$ENV{ProgramW6432}/MySQL/MySQL Server 8.1/include"
"C:/Program Files/MySQL/MySQL Server 5.7/include" "$ENV{ProgramW6432}/MySQL/MySQL Server 8.0/include"
"C:/Program Files/MySQL/include" "$ENV{ProgramW6432}/MySQL/MySQL Server 5.7/include"
"C:/MySQL/include" "$ENV{ProgramFiles}/MySQL/MySQL Server 8.1/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.0;Location]/include" "$ENV{ProgramFiles}/MySQL/MySQL Server 8.0/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/include" "$ENV{ProgramFiles}/MySQL/MySQL Server 5.7/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.0;Location]/include" "$ENV{SystemDrive}/MySQL/MySQL Server 8.1/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]/include" "$ENV{SystemDrive}/MySQL/MySQL Server 8.0/include"
"$ENV{ProgramFiles}/MySQL/*/include" "$ENV{SystemDrive}/MySQL/MySQL Server 5.7/include"
"$ENV{SystemDrive}/MySQL/*/include"
"c:/msys/local/include"
"$ENV{MYSQL_INCLUDE_DIR}" "$ENV{MYSQL_INCLUDE_DIR}"
"$ENV{MYSQL_DIR}/include"
DOC DOC
"Specify the directory containing mysql.h." "Specify the directory containing mysql.h."
) )
@@ -211,23 +195,17 @@ if( WIN32 )
PATHS PATHS
${MYSQL_ADD_LIBRARIES_PATH} ${MYSQL_ADD_LIBRARIES_PATH}
"C:/tools/mysql/current/lib" # chocolatey package "C:/tools/mysql/current/lib" # chocolatey package
"C:/Program Files/MySQL/MySQL Server 8.0/lib" "$ENV{ProgramW6432}/MySQL/MySQL Server 8.1/lib"
"C:/Program Files/MySQL/MySQL Server 8.0/lib/opt" "$ENV{ProgramW6432}/MySQL/MySQL Server 8.0/lib"
"C:/Program Files/MySQL/MySQL Server 5.7/lib/opt" "$ENV{ProgramW6432}/MySQL/MySQL Server 5.7/lib"
"C:/Program Files/MySQL/lib" "$ENV{ProgramFiles}/MySQL/MySQL Server 8.1/lib"
"C:/MySQL/lib/debug" "$ENV{ProgramFiles}/MySQL/MySQL Server 8.0/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.0;Location]/lib" "$ENV{ProgramFiles}/MySQL/MySQL Server 5.7/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.0;Location]/lib/opt" "$ENV{SystemDrive}/MySQL/MySQL Server 8.1/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/lib" "$ENV{SystemDrive}/MySQL/MySQL Server 8.0/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/lib/opt" "$ENV{SystemDrive}/MySQL/MySQL Server 5.7/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.0;Location]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.0;Location]/lib/opt"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]/lib/opt"
"$ENV{ProgramFiles}/MySQL/*/lib/opt"
"$ENV{SystemDrive}/MySQL/*/lib/opt"
"c:/msys/local/include"
"$ENV{MYSQL_LIBRARY}" "$ENV{MYSQL_LIBRARY}"
"$ENV{MYSQL_DIR}/lib"
DOC "Specify the location of the mysql library here." DOC "Specify the location of the mysql library here."
) )
endif( WIN32 ) endif( WIN32 )
@@ -264,30 +242,15 @@ if( WIN32 )
find_program(MYSQL_EXECUTABLE mysql find_program(MYSQL_EXECUTABLE mysql
PATHS PATHS
"C:/tools/mysql/current/bin" # chocolatey package "C:/tools/mysql/current/bin" # chocolatey package
"${PROGRAM_FILES_64}/MySQL/MySQL Server 8.0/bin" "$ENV{ProgramW6432}/MySQL/MySQL Server 8.1/bin"
"${PROGRAM_FILES_64}/MySQL/MySQL Server 5.7/bin" "$ENV{ProgramW6432}/MySQL/MySQL Server 8.0/bin"
"${PROGRAM_FILES_64}/MySQL/MySQL Server 8.0/bin/opt" "$ENV{ProgramW6432}/MySQL/MySQL Server 5.7/bin"
"${PROGRAM_FILES_64}/MySQL/MySQL Server 5.7/bin/opt" "$ENV{ProgramFiles}/MySQL/MySQL Server 8.1/bin"
"${PROGRAM_FILES_64}/MySQL/bin" "$ENV{ProgramFiles}/MySQL/MySQL Server 8.0/bin"
"${PROGRAM_FILES_32}/MySQL/MySQL Server 8.0/bin" "$ENV{ProgramFiles}/MySQL/MySQL Server 5.7/bin"
"${PROGRAM_FILES_32}/MySQL/MySQL Server 5.7/bin" "$ENV{SystemDrive}/MySQL/MySQL Server 8.1/bin"
"${PROGRAM_FILES_32}/MySQL/MySQL Server 8.0/bin/opt" "$ENV{SystemDrive}/MySQL/MySQL Server 8.0/bin"
"${PROGRAM_FILES_32}/MySQL/MySQL Server 5.7/bin/opt" "$ENV{SystemDrive}/MySQL/MySQL Server 5.7/bin"
"${PROGRAM_FILES_32}/MySQL/bin"
"C:/MySQL/bin/debug"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.0;Location]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 8.0;Location]/bin/opt"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.7;Location]/bin/opt"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.0;Location]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]/bin"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 8.0;Location]/bin/opt"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.7;Location]/bin/opt"
"$ENV{ProgramFiles}/MySQL/MySQL Server 8.0/bin/opt"
"$ENV{ProgramFiles}/MySQL/MySQL Server 5.7/bin/opt"
"$ENV{SystemDrive}/MySQL/MySQL Server 8.0/bin/opt"
"$ENV{SystemDrive}/MySQL/MySQL Server 5.7/bin/opt"
"c:/msys/local/include"
"$ENV{MYSQL_ROOT}/bin" "$ENV{MYSQL_ROOT}/bin"
DOC DOC
"path to your mysql binary.") "path to your mysql binary.")
+137 -2
View File
@@ -21,6 +21,7 @@
#include "StringFormat.h" #include "StringFormat.h"
#include "Tokenize.h" #include "Tokenize.h"
#include "Util.h" #include "Util.h"
#include <cstdlib>
#include <fstream> #include <fstream>
#include <mutex> #include <mutex>
#include <unordered_map> #include <unordered_map>
@@ -215,6 +216,81 @@ namespace
return false; return false;
} }
// Converts ini keys to the environment variable key (upper snake case).
// Example of conversions:
// SomeConfig => SOME_CONFIG
// myNestedConfig.opt1 => MY_NESTED_CONFIG_OPT_1
// LogDB.Opt.ClearTime => LOG_DB_OPT_CLEAR_TIME
std::string IniKeyToEnvVarKey(std::string const& key)
{
std::string result;
const char* str = key.c_str();
size_t n = key.length();
char curr;
bool isEnd;
bool nextIsUpper;
bool currIsNumeric;
bool nextIsNumeric;
for (size_t i = 0; i < n; ++i)
{
curr = str[i];
if (curr == ' ' || curr == '.' || curr == '-')
{
result += '_';
continue;
}
isEnd = i == n - 1;
if (!isEnd)
{
nextIsUpper = isupper(str[i + 1]);
// handle "aB" to "A_B"
if (!isupper(curr) && nextIsUpper)
{
result += static_cast<char>(std::toupper(curr));
result += '_';
continue;
}
currIsNumeric = isNumeric(curr);
nextIsNumeric = isNumeric(str[i + 1]);
// handle "a1" to "a_1"
if (!currIsNumeric && nextIsNumeric)
{
result += static_cast<char>(std::toupper(curr));
result += '_';
continue;
}
// handle "1a" to "1_a"
if (currIsNumeric && !nextIsNumeric)
{
result += static_cast<char>(std::toupper(curr));
result += '_';
continue;
}
}
result += static_cast<char>(std::toupper(curr));
}
return result;
}
Optional<std::string> EnvVarForIniKey(std::string const& key)
{
std::string envKey = "AC_" + IniKeyToEnvVarKey(key);
char* val = std::getenv(envKey.c_str());
if (!val)
return std::nullopt;
return std::string(val);
}
} }
bool ConfigMgr::LoadInitial(std::string const& file, bool isReload /*= false*/) bool ConfigMgr::LoadInitial(std::string const& file, bool isReload /*= false*/)
@@ -243,14 +319,48 @@ bool ConfigMgr::Reload()
return false; return false;
} }
return LoadModulesConfigs(true, false); if (!LoadModulesConfigs(true, false))
{
return false;
}
OverrideWithEnvVariablesIfAny();
return true;
}
std::vector<std::string> ConfigMgr::OverrideWithEnvVariablesIfAny()
{
std::lock_guard<std::mutex> lock(_configLock);
std::vector<std::string> overriddenKeys;
for (auto& itr : _configOptions)
{
if (itr.first.empty())
continue;
Optional<std::string> envVar = EnvVarForIniKey(itr.first);
if (!envVar)
continue;
itr.second = *envVar;
overriddenKeys.push_back(itr.first);
}
return overriddenKeys;
} }
template<class T> template<class T>
T ConfigMgr::GetValueDefault(std::string const& name, T const& def, bool showLogs /*= true*/) const T ConfigMgr::GetValueDefault(std::string const& name, T const& def, bool showLogs /*= true*/) const
{ {
std::string strValue;
auto const& itr = _configOptions.find(name); auto const& itr = _configOptions.find(name);
if (itr == _configOptions.end()) if (itr == _configOptions.end())
{
Optional<std::string> envVar = EnvVarForIniKey(name);
if (!envVar)
{ {
if (showLogs) if (showLogs)
{ {
@@ -261,7 +371,20 @@ T ConfigMgr::GetValueDefault(std::string const& name, T const& def, bool showLog
return def; return def;
} }
auto value = Acore::StringTo<T>(itr->second); if (showLogs)
{
LOG_WARN("server.loading", "Missing property {} in config file {}, recovered with environment '{}' value.",
name.c_str(), _filename.c_str(), envVar->c_str());
}
strValue = *envVar;
}
else
{
strValue = itr->second;
}
auto value = Acore::StringTo<T>(strValue);
if (!value) if (!value)
{ {
if (showLogs) if (showLogs)
@@ -282,6 +405,18 @@ std::string ConfigMgr::GetValueDefault<std::string>(std::string const& name, std
auto const& itr = _configOptions.find(name); auto const& itr = _configOptions.find(name);
if (itr == _configOptions.end()) if (itr == _configOptions.end())
{ {
Optional<std::string> envVar = EnvVarForIniKey(name);
if (envVar)
{
if (showLogs)
{
LOG_WARN("server.loading", "Missing property {} in config file {}, recovered with environment '{}' value.",
name.c_str(), _filename.c_str(), envVar->c_str());
}
return *envVar;
}
if (showLogs) if (showLogs)
{ {
LOG_ERROR("server.loading", "> Config: Missing property {} in config file {}, add \"{} = {}\" to this file.", LOG_ERROR("server.loading", "> Config: Missing property {} in config file {}, add \"{} = {}\" to this file.",
+3
View File
@@ -39,6 +39,9 @@ public:
bool Reload(); bool Reload();
/// Overrides configuration with environment variables and returns overridden keys
std::vector<std::string> OverrideWithEnvVariablesIfAny();
std::string const GetFilename(); std::string const GetFilename();
std::string const GetConfigPath(); std::string const GetConfigPath();
[[nodiscard]] std::vector<std::string> const& GetArguments() const; [[nodiscard]] std::vector<std::string> const& GetArguments() const;
+5
View File
@@ -85,6 +85,8 @@ int main(int argc, char** argv)
if (!sConfigMgr->LoadAppConfigs()) if (!sConfigMgr->LoadAppConfigs())
return 1; return 1;
std::vector<std::string> overriddenKeys = sConfigMgr->OverrideWithEnvVariablesIfAny();
// Init logging // Init logging
sLog->RegisterAppender<AppenderDB>(); sLog->RegisterAppender<AppenderDB>();
sLog->Initialize(nullptr); sLog->Initialize(nullptr);
@@ -101,6 +103,9 @@ int main(int argc, char** argv)
LOG_INFO("server.authserver", "> Using Boost version: {}.{}.{}", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100); LOG_INFO("server.authserver", "> Using Boost version: {}.{}.{}", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100);
}); });
for (std::string const& key : overriddenKeys)
LOG_INFO("server.authserver", "Configuration field {} was overridden with environment variable.", key);
OpenSSLCrypto::threadsSetup(); OpenSSLCrypto::threadsSetup();
std::shared_ptr<void> opensslHandle(nullptr, [](void*) { OpenSSLCrypto::threadsCleanup(); }); std::shared_ptr<void> opensslHandle(nullptr, [](void*) { OpenSSLCrypto::threadsCleanup(); });
+5
View File
@@ -184,6 +184,8 @@ int main(int argc, char** argv)
if (!sConfigMgr->LoadAppConfigs()) if (!sConfigMgr->LoadAppConfigs())
return 1; return 1;
std::vector<std::string> overriddenKeys = sConfigMgr->OverrideWithEnvVariablesIfAny();
std::shared_ptr<Acore::Asio::IoContext> ioContext = std::make_shared<Acore::Asio::IoContext>(); std::shared_ptr<Acore::Asio::IoContext> ioContext = std::make_shared<Acore::Asio::IoContext>();
// Init all logs // Init all logs
@@ -203,6 +205,9 @@ int main(int argc, char** argv)
LOG_INFO("server.worldserver", "> Using Boost version: {}.{}.{}", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100); LOG_INFO("server.worldserver", "> Using Boost version: {}.{}.{}", BOOST_VERSION / 100000, BOOST_VERSION / 100 % 1000, BOOST_VERSION % 100);
}); });
for (std::string const& key : overriddenKeys)
LOG_INFO("server.worldserver", "Configuration field {} was overridden with environment variable.", key);
OpenSSLCrypto::threadsSetup(); OpenSSLCrypto::threadsSetup();
std::shared_ptr<void> opensslHandle(nullptr, [](void*) { OpenSSLCrypto::threadsCleanup(); }); std::shared_ptr<void> opensslHandle(nullptr, [](void*) { OpenSSLCrypto::threadsCleanup(); });
@@ -3949,8 +3949,8 @@ AuctionHouse.SearchTimeout = 1000
Appender.Console=1,4,0,"1 9 3 6 5 8" Appender.Console=1,4,0,"1 9 3 6 5 8"
Appender.Server=2,5,0,Server.log,w Appender.Server=2,5,0,Server.log,w
Appender.GM=2,5,15,gm_%s.log # Appender.GM=2,5,15,gm_%s.log
Appender.DBErrors=2,5,0,DBErrors.log Appender.Errors=2,5,0,Errors.log
# Appender.DB=3,5,0 # Appender.DB=3,5,0
# Logger config values: Given a logger "name" # Logger config values: Given a logger "name"
@@ -3977,10 +3977,11 @@ Logger.diff=3,Console Server
Logger.mmaps=4,Server Logger.mmaps=4,Server
Logger.scripts.hotswap=4,Console Server Logger.scripts.hotswap=4,Console Server
Logger.server=4,Console Server Logger.server=4,Console Server
Logger.sql.sql=2,Console DBErrors Logger.sql.sql=2,Console Errors
Logger.sql=4,Console Server Logger.sql=4,Console Server
Logger.time.update=4,Console Server Logger.time.update=4,Console Server
Logger.module=4,Console Server Logger.module=4,Console Server
Logger.spells.scripts=2,Console Errors
#Logger.achievement=4,Console Server #Logger.achievement=4,Console Server
#Logger.addon=4,Console Server #Logger.addon=4,Console Server
@@ -27,7 +27,7 @@ void WorldDatabaseConnection::DoPrepareStatements()
PrepareStatement(WORLD_DEL_CRELINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_DEL_CRELINKED_RESPAWN, "DELETE FROM linked_respawn WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(WORLD_REP_CREATURE_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(WORLD_REP_CREATURE_LINKED_RESPAWN, "REPLACE INTO linked_respawn (guid, linkedGuid) VALUES (?, ?)", CONNECTION_ASYNC);
PrepareStatement(WORLD_SEL_CREATURE_TEXT, "SELECT CreatureID, GroupID, ID, Text, Type, Language, Probability, Emote, Duration, Sound, BroadcastTextId, TextRange FROM creature_text", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_TEXT, "SELECT CreatureID, GroupID, ID, Text, Type, Language, Probability, Emote, Duration, Sound, BroadcastTextId, TextRange FROM creature_text", CONNECTION_SYNCH);
PrepareStatement(WORLD_SEL_SMART_SCRIPTS, "SELECT entryorguid, source_type, id, link, event_type, event_phase_mask, event_chance, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_param4, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_SMART_SCRIPTS, "SELECT 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_param6, action_type, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, target_type, target_param1, target_param2, target_param3, target_param4, target_x, target_y, target_z, target_o FROM smart_scripts ORDER BY entryorguid, source_type, id, link", CONNECTION_SYNCH);
PrepareStatement(WORLD_SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z, orientation, delay FROM waypoints ORDER BY entry, pointid", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_SMARTAI_WP, "SELECT entry, pointid, position_x, position_y, position_z, orientation, delay FROM waypoints ORDER BY entry, pointid", CONNECTION_SYNCH);
PrepareStatement(WORLD_DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_DEL_GAMEOBJECT, "DELETE FROM gameobject WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(WORLD_DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_DEL_EVENT_GAMEOBJECT, "DELETE FROM game_event_gameobject WHERE guid = ?", CONNECTION_ASYNC);
+123 -28
View File
@@ -1958,7 +1958,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
break; break;
ObjectVector casters; ObjectVector casters;
GetTargets(casters, CreateSmartEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, 0, 0, 0, SMART_ACTION_NONE, 0, 0, 0, 0, 0, 0, (SMARTAI_TARGETS)e.action.crossCast.targetType, e.action.crossCast.targetParam1, e.action.crossCast.targetParam2, e.action.crossCast.targetParam3, 0, 0), unit); GetTargets(casters, CreateSmartEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, 0, 0, 0, 0, SMART_ACTION_NONE, 0, 0, 0, 0, 0, 0, (SMARTAI_TARGETS)e.action.crossCast.targetType, e.action.crossCast.targetParam1, e.action.crossCast.targetParam2, e.action.crossCast.targetParam3, 0, 0), unit);
for (WorldObject* caster : casters) for (WorldObject* caster : casters)
{ {
@@ -2891,6 +2891,101 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
} }
break; break;
} }
case SMART_ACTION_FOLLOW_GROUP:
{
if (!e.action.followGroup.followState)
{
for (WorldObject* target : targets)
if (IsUnit(target))
target->ToCreature()->GetMotionMaster()->MoveIdle();
break;
}
uint8 membCount = targets.size();
uint8 itr = 1;
float dist = float(e.action.followGroup.dist / 100);
switch (e.action.followGroup.followType)
{
case FOLLOW_TYPE_CIRCLE:
{
float angle = (membCount > 4 ? (M_PI * 2)/membCount : (M_PI / 2)); // 90 degrees is the maximum angle
for (WorldObject* target : targets)
{
if (IsCreature(target))
{
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist, angle * itr);
itr++;
}
}
break;
}
case FOLLOW_TYPE_SEMI_CIRCLE_BEHIND:
{
for (WorldObject* target : targets)
{
if (IsCreature(target))
{
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist, (M_PI / 2.0f) + (M_PI / membCount) * (itr - 1));
itr++;
}
}
break;
}
case FOLLOW_TYPE_SEMI_CIRCLE_FRONT:
{
for (WorldObject* target : targets)
{
if (IsCreature(target))
{
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist, (M_PI + (M_PI / 2.0f) + (M_PI / membCount) * (itr - 1)));
itr++;
}
}
break;
}
case FOLLOW_TYPE_LINE:
{
for (WorldObject* target : targets)
{
if (IsCreature(target))
{
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist * (((itr - 1) / 2) + 1), itr % 2 ? 0.f : M_PI);
itr++;
}
}
break;
}
case FOLLOW_TYPE_COLUMN:
{
for (WorldObject* target : targets)
{
if (IsCreature(target))
{
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist * (((itr - 1) / 2) + 1), itr % 2 ? (M_PI / 2) : (M_PI * 1.5f));
itr++;
}
}
break;
}
case FOLLOW_TYPE_ANGULAR:
{
for (WorldObject* target : targets)
{
if (IsCreature(target))
{
target->ToCreature()->GetMotionMaster()->MoveFollow(me, dist * (((itr - 1) / 2) + 1), itr % 2 ? M_PI - (M_PI / 4) : M_PI + (M_PI / 4));
itr++;
}
}
break;
}
default:
break;
}
break;
}
default: default:
LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry {} SourceType {}, Event {}, Unhandled Action type {}", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry {} SourceType {}, Event {}, Unhandled Action type {}", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
break; break;
@@ -2935,18 +3030,18 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e)
{ {
case SMARTAI_TEMPLATE_CASTER: case SMARTAI_TEMPLATE_CASTER:
{ {
AddEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, e.action.installTtemplate.param2, e.action.installTtemplate.param3, 0, SMART_ACTION_CAST, e.action.installTtemplate.param1, e.target.raw.param1, 0, 0, 0, 0, SMART_TARGET_VICTIM, 0, 0, 0, 0, 1); AddEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, e.action.installTtemplate.param2, e.action.installTtemplate.param3, 0, 0, SMART_ACTION_CAST, e.action.installTtemplate.param1, e.target.raw.param1, 0, 0, 0, 0, SMART_TARGET_VICTIM, 0, 0, 0, 0, 1);
AddEvent(SMART_EVENT_RANGE, 0, e.action.installTtemplate.param4, 300, 0, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1); AddEvent(SMART_EVENT_RANGE, 0, e.action.installTtemplate.param4, 300, 0, 0, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1);
AddEvent(SMART_EVENT_RANGE, 0, 0, e.action.installTtemplate.param4 > 10 ? e.action.installTtemplate.param4 - 10 : 0, 0, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1); AddEvent(SMART_EVENT_RANGE, 0, 0, e.action.installTtemplate.param4 > 10 ? e.action.installTtemplate.param4 - 10 : 0, 0, 0, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1);
AddEvent(SMART_EVENT_MANA_PCT, 0, e.action.installTtemplate.param5 - 15 > 100 ? 100 : e.action.installTtemplate.param5 + 15, 100, 1000, 1000, 0, SMART_ACTION_SET_EVENT_PHASE, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0); AddEvent(SMART_EVENT_MANA_PCT, 0, e.action.installTtemplate.param5 - 15 > 100 ? 100 : e.action.installTtemplate.param5 + 15, 100, 1000, 1000, 0, 0, SMART_ACTION_SET_EVENT_PHASE, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0);
AddEvent(SMART_EVENT_MANA_PCT, 0, 0, e.action.installTtemplate.param5, 1000, 1000, 0, SMART_ACTION_SET_EVENT_PHASE, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0); AddEvent(SMART_EVENT_MANA_PCT, 0, 0, e.action.installTtemplate.param5, 1000, 1000, 0, 0, SMART_ACTION_SET_EVENT_PHASE, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0);
AddEvent(SMART_EVENT_MANA_PCT, 0, 0, e.action.installTtemplate.param5, 1000, 1000, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0); AddEvent(SMART_EVENT_MANA_PCT, 0, 0, e.action.installTtemplate.param5, 1000, 1000, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0);
break; break;
} }
case SMARTAI_TEMPLATE_TURRET: case SMARTAI_TEMPLATE_TURRET:
{ {
AddEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, e.action.installTtemplate.param2, e.action.installTtemplate.param3, 0, SMART_ACTION_CAST, e.action.installTtemplate.param1, e.target.raw.param1, 0, 0, 0, 0, SMART_TARGET_VICTIM, 0, 0, 0, 0, 0); AddEvent(SMART_EVENT_UPDATE_IC, 0, 0, 0, e.action.installTtemplate.param2, e.action.installTtemplate.param3, 0, 0, SMART_ACTION_CAST, e.action.installTtemplate.param1, e.target.raw.param1, 0, 0, 0, 0, SMART_TARGET_VICTIM, 0, 0, 0, 0, 0);
AddEvent(SMART_EVENT_JUST_CREATED, 0, 0, 0, 0, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0); AddEvent(SMART_EVENT_JUST_CREATED, 0, 0, 0, 0, 0, 0, 0, SMART_ACTION_ALLOW_COMBAT_MOVEMENT, 0, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0);
break; break;
} }
case SMARTAI_TEMPLATE_CAGED_NPC_PART: case SMARTAI_TEMPLATE_CAGED_NPC_PART:
@@ -2954,22 +3049,22 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e)
if (!me) if (!me)
return; return;
//store cage as id1 //store cage as id1
AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_GAMEOBJECT, e.action.installTtemplate.param1, 10, 0, 0, 0); AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_GAMEOBJECT, e.action.installTtemplate.param1, 10, 0, 0, 0);
//reset(close) cage on hostage(me) respawn //reset(close) cage on hostage(me) respawn
AddEvent(SMART_EVENT_UPDATE, SMART_EVENT_FLAG_NOT_REPEATABLE, 0, 0, 0, 0, 0, SMART_ACTION_RESET_GOBJECT, 0, 0, 0, 0, 0, 0, SMART_TARGET_GAMEOBJECT_DISTANCE, e.action.installTtemplate.param1, 5, 0, 0, 0); AddEvent(SMART_EVENT_UPDATE, SMART_EVENT_FLAG_NOT_REPEATABLE, 0, 0, 0, 0, 0, 0, SMART_ACTION_RESET_GOBJECT, 0, 0, 0, 0, 0, 0, SMART_TARGET_GAMEOBJECT_DISTANCE, e.action.installTtemplate.param1, 5, 0, 0, 0);
AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, SMART_ACTION_SET_RUN, e.action.installTtemplate.param3, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0); AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, 0, SMART_ACTION_SET_RUN, e.action.installTtemplate.param3, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0);
AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, SMART_ACTION_SET_EVENT_PHASE, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0); AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, 0, SMART_ACTION_SET_EVENT_PHASE, 1, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0);
AddEvent(SMART_EVENT_UPDATE, SMART_EVENT_FLAG_NOT_REPEATABLE, 1000, 1000, 0, 0, 0, SMART_ACTION_MOVE_FORWARD, e.action.installTtemplate.param4, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1); AddEvent(SMART_EVENT_UPDATE, SMART_EVENT_FLAG_NOT_REPEATABLE, 1000, 1000, 0, 0, 0, 0, SMART_ACTION_MOVE_FORWARD, e.action.installTtemplate.param4, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1);
//phase 1: give quest credit on movepoint reached //phase 1: give quest credit on movepoint reached
AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0, 1); AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0, 1);
//phase 1: despawn after time on movepoint reached //phase 1: despawn after time on movepoint reached
AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, 0, SMART_ACTION_FORCE_DESPAWN, e.action.installTtemplate.param2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1); AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, 0, 0, SMART_ACTION_FORCE_DESPAWN, e.action.installTtemplate.param2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1);
if (sCreatureTextMgr->TextExist(me->GetEntry(), (uint8)e.action.installTtemplate.param5)) if (sCreatureTextMgr->TextExist(me->GetEntry(), (uint8)e.action.installTtemplate.param5))
AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, 0, SMART_ACTION_TALK, e.action.installTtemplate.param5, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1); AddEvent(SMART_EVENT_MOVEMENTINFORM, 0, POINT_MOTION_TYPE, SMART_RANDOM_POINT, 0, 0, 0, 0, SMART_ACTION_TALK, e.action.installTtemplate.param5, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 1);
break; break;
} }
case SMARTAI_TEMPLATE_CAGED_GO_PART: case SMARTAI_TEMPLATE_CAGED_GO_PART:
@@ -2977,16 +3072,16 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e)
if (!go) if (!go)
return; return;
//store hostage as id1 //store hostage as id1
AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0, 0); AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 1, 0, 0, 0, 0, 0, SMART_TARGET_CLOSEST_CREATURE, e.action.installTtemplate.param1, 10, 0, 0, 0);
//store invoker as id2 //store invoker as id2
AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0); AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, 0, SMART_ACTION_STORE_TARGET_LIST, 2, 0, 0, 0, 0, 0, SMART_TARGET_NONE, 0, 0, 0, 0, 0);
//signal hostage //signal hostage
AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0, 0); AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, 0, SMART_ACTION_SET_DATA, 0, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 1, 0, 0, 0, 0);
//when hostage raeched end point, give credit to invoker //when hostage raeched end point, give credit to invoker
if (e.action.installTtemplate.param2) if (e.action.installTtemplate.param2)
AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0, 0); AddEvent(SMART_EVENT_DATA_SET, 0, 0, 0, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0, 0);
else else
AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0, 0); AddEvent(SMART_EVENT_GO_STATE_CHANGED, 0, 2, 0, 0, 0, 0, 0, SMART_ACTION_CALL_KILLEDMONSTER, e.action.installTtemplate.param1, 0, 0, 0, 0, 0, SMART_TARGET_STORED, 2, 0, 0, 0, 0);
break; break;
} }
case SMARTAI_TEMPLATE_BASIC: case SMARTAI_TEMPLATE_BASIC:
@@ -2995,12 +3090,12 @@ void SmartScript::InstallTemplate(SmartScriptHolder const& e)
} }
} }
void SmartScript::AddEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask) void SmartScript::AddEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, uint32 event_param6, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask)
{ {
mInstallEvents.push_back(CreateSmartEvent(e, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, action, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, t, target_param1, target_param2, target_param3, target_param4, phaseMask)); mInstallEvents.push_back(CreateSmartEvent(e, event_flags, event_param1, event_param2, event_param3, event_param4, event_param5, event_param6, action, action_param1, action_param2, action_param3, action_param4, action_param5, action_param6, t, target_param1, target_param2, target_param3, target_param4, phaseMask));
} }
SmartScriptHolder SmartScript::CreateSmartEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask) SmartScriptHolder SmartScript::CreateSmartEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, uint32 event_param6, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask)
{ {
SmartScriptHolder script; SmartScriptHolder script;
script.event.type = e; script.event.type = e;
@@ -3009,6 +3104,7 @@ SmartScriptHolder SmartScript::CreateSmartEvent(SMART_EVENT e, uint32 event_flag
script.event.raw.param3 = event_param3; script.event.raw.param3 = event_param3;
script.event.raw.param4 = event_param4; script.event.raw.param4 = event_param4;
script.event.raw.param5 = event_param5; script.event.raw.param5 = event_param5;
script.event.raw.param6 = event_param6;
script.event.event_phase_mask = phaseMask; script.event.event_phase_mask = phaseMask;
script.event.event_flags = event_flags; script.event.event_flags = event_flags;
script.event.event_chance = 100; script.event.event_chance = 100;
@@ -4329,7 +4425,6 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
if (!me || !me->IsEngaged()) if (!me || !me->IsEngaged())
return; return;
float range = static_cast<float>(e.event.areaCasting.range);
ThreatContainer::StorageType threatList = me->GetThreatMgr().GetThreatList(); ThreatContainer::StorageType threatList = me->GetThreatMgr().GetThreatList();
for (ThreatContainer::StorageType::const_iterator i = threatList.begin(); i != threatList.end(); ++i) for (ThreatContainer::StorageType::const_iterator i = threatList.begin(); i != threatList.end(); ++i)
{ {
@@ -4338,7 +4433,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
if (!target || target->IsPet() || target->IsTotem() || !target->IsNonMeleeSpellCast(false, false, true)) if (!target || target->IsPet() || target->IsTotem() || !target->IsNonMeleeSpellCast(false, false, true))
continue; continue;
if (e.event.areaCasting.range && !me->IsWithinDistInMap(target, range)) if (e.event.areaCasting.rangeMin && !(me->IsInRange(target, (float)e.event.areaCasting.rangeMin, (float)e.event.areaCasting.rangeMax)))
continue; continue;
ProcessAction(e, target); ProcessAction(e, target);
@@ -4363,7 +4458,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
{ {
if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid())) if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()))
{ {
if (!(me->IsInRange(target, 0.f, (float)e.event.areaRange.range))) if (!(me->IsInRange(target, (float)e.event.areaRange.rangeMin, (float)e.event.areaRange.rangeMax)))
continue; continue;
ProcessAction(e, target); ProcessAction(e, target);
@@ -47,8 +47,8 @@ public:
void GetTargets(ObjectVector& targets, SmartScriptHolder const& e, Unit* invoker = nullptr) const; void GetTargets(ObjectVector& targets, SmartScriptHolder const& e, Unit* invoker = nullptr) const;
void GetWorldObjectsInDist(ObjectVector& objects, float dist) const; void GetWorldObjectsInDist(ObjectVector& objects, float dist) const;
void InstallTemplate(SmartScriptHolder const& e); void InstallTemplate(SmartScriptHolder const& e);
static SmartScriptHolder CreateSmartEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask); static SmartScriptHolder CreateSmartEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, uint32 event_param6, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask);
void AddEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask); void AddEvent(SMART_EVENT e, uint32 event_flags, uint32 event_param1, uint32 event_param2, uint32 event_param3, uint32 event_param4, uint32 event_param5, uint32 event_param6, SMART_ACTION action, uint32 action_param1, uint32 action_param2, uint32 action_param3, uint32 action_param4, uint32 action_param5, uint32 action_param6, SMARTAI_TARGETS t, uint32 target_param1, uint32 target_param2, uint32 target_param3, uint32 target_param4, uint32 phaseMask);
void SetPathId(uint32 id) { mPathId = id; } void SetPathId(uint32 id) { mPathId = id; }
uint32 GetPathId() const { return mPathId; } uint32 GetPathId() const { return mPathId; }
WorldObject* GetBaseObject() const WorldObject* GetBaseObject() const
@@ -223,24 +223,25 @@ void SmartAIMgr::LoadSmartAIFromDB()
temp.event.raw.param3 = fields[10].Get<uint32>(); temp.event.raw.param3 = fields[10].Get<uint32>();
temp.event.raw.param4 = fields[11].Get<uint32>(); temp.event.raw.param4 = fields[11].Get<uint32>();
temp.event.raw.param5 = fields[12].Get<uint32>(); temp.event.raw.param5 = fields[12].Get<uint32>();
temp.event.raw.param6 = fields[13].Get<uint32>();
temp.action.type = (SMART_ACTION)fields[13].Get<uint8>(); temp.action.type = (SMART_ACTION)fields[14].Get<uint8>();
temp.action.raw.param1 = fields[14].Get<uint32>(); temp.action.raw.param1 = fields[15].Get<uint32>();
temp.action.raw.param2 = fields[15].Get<uint32>(); temp.action.raw.param2 = fields[16].Get<uint32>();
temp.action.raw.param3 = fields[16].Get<uint32>(); temp.action.raw.param3 = fields[17].Get<uint32>();
temp.action.raw.param4 = fields[17].Get<uint32>(); temp.action.raw.param4 = fields[18].Get<uint32>();
temp.action.raw.param5 = fields[18].Get<uint32>(); temp.action.raw.param5 = fields[19].Get<uint32>();
temp.action.raw.param6 = fields[19].Get<uint32>(); temp.action.raw.param6 = fields[20].Get<uint32>();
temp.target.type = (SMARTAI_TARGETS)fields[20].Get<uint8>(); temp.target.type = (SMARTAI_TARGETS)fields[21].Get<uint8>();
temp.target.raw.param1 = fields[21].Get<uint32>(); temp.target.raw.param1 = fields[22].Get<uint32>();
temp.target.raw.param2 = fields[22].Get<uint32>(); temp.target.raw.param2 = fields[23].Get<uint32>();
temp.target.raw.param3 = fields[23].Get<uint32>(); temp.target.raw.param3 = fields[24].Get<uint32>();
temp.target.raw.param4 = fields[24].Get<uint32>(); temp.target.raw.param4 = fields[25].Get<uint32>();
temp.target.x = fields[25].Get<float>(); temp.target.x = fields[26].Get<float>();
temp.target.y = fields[26].Get<float>(); temp.target.y = fields[27].Get<float>();
temp.target.z = fields[27].Get<float>(); temp.target.z = fields[28].Get<float>();
temp.target.o = fields[28].Get<float>(); temp.target.o = fields[29].Get<float>();
//check target //check target
if (!IsTargetValid(temp)) if (!IsTargetValid(temp))
@@ -781,6 +782,7 @@ bool SmartAIMgr::CheckUnusedActionParams(SmartScriptHolder const& e)
case SMART_ACTION_SET_SCALE: return sizeof(SmartAction::setScale); case SMART_ACTION_SET_SCALE: return sizeof(SmartAction::setScale);
case SMART_ACTION_SUMMON_RADIAL: return sizeof(SmartAction::radialSummon); case SMART_ACTION_SUMMON_RADIAL: return sizeof(SmartAction::radialSummon);
case SMART_ACTION_PLAY_SPELL_VISUAL: return sizeof(SmartAction::spellVisual); case SMART_ACTION_PLAY_SPELL_VISUAL: return sizeof(SmartAction::spellVisual);
case SMART_ACTION_FOLLOW_GROUP: return sizeof(SmartAction::followGroup);
default: default:
LOG_WARN("sql.sql", "SmartAIMgr: entryorguid {} source_type {} id {} action_type {} is using an action with no unused params specified in SmartAIMgr::CheckUnusedActionParams(), please report this.", LOG_WARN("sql.sql", "SmartAIMgr: entryorguid {} source_type {} id {} action_type {} is using an action with no unused params specified in SmartAIMgr::CheckUnusedActionParams(), please report this.",
e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType());
@@ -977,6 +979,9 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
if (!IsMinMaxValid(e, e.event.areaRange.repeatMin, e.event.areaRange.repeatMax)) if (!IsMinMaxValid(e, e.event.areaRange.repeatMin, e.event.areaRange.repeatMax))
return false; return false;
if (!IsMinMaxValid(e, e.event.areaRange.rangeMin, e.event.areaRange.rangeMax))
return false;
break; break;
case SMART_EVENT_SPELLHIT: case SMART_EVENT_SPELLHIT:
case SMART_EVENT_SPELLHIT_TARGET: case SMART_EVENT_SPELLHIT_TARGET:
@@ -1073,6 +1078,9 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
if (!IsMinMaxValid(e, e.event.areaCasting.repeatMin, e.event.areaCasting.repeatMax)) if (!IsMinMaxValid(e, e.event.areaCasting.repeatMin, e.event.areaCasting.repeatMax))
return false; return false;
if (!IsMinMaxValid(e, e.event.areaCasting.rangeMin, e.event.areaCasting.rangeMax))
return false;
break; break;
case SMART_EVENT_PASSENGER_BOARDED: case SMART_EVENT_PASSENGER_BOARDED:
case SMART_EVENT_PASSENGER_REMOVED: case SMART_EVENT_PASSENGER_REMOVED:
@@ -1964,6 +1972,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_ACTION_SET_SCALE: case SMART_ACTION_SET_SCALE:
case SMART_ACTION_SUMMON_RADIAL: case SMART_ACTION_SUMMON_RADIAL:
case SMART_ACTION_PLAY_SPELL_VISUAL: case SMART_ACTION_PLAY_SPELL_VISUAL:
case SMART_ACTION_FOLLOW_GROUP:
break; break;
default: default:
LOG_ERROR("sql.sql", "SmartAIMgr: Not handled action_type({}), event_type({}), Entry {} SourceType {} Event {}, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id); LOG_ERROR("sql.sql", "SmartAIMgr: Not handled action_type({}), event_type({}), Entry {} SourceType {} Event {}, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id);
@@ -523,7 +523,8 @@ struct SmartEvent
uint32 max; uint32 max;
uint32 repeatMin; uint32 repeatMin;
uint32 repeatMax; uint32 repeatMax;
uint32 range; uint32 rangeMin;
uint32 rangeMax;
} areaCasting; } areaCasting;
struct struct
@@ -532,7 +533,8 @@ struct SmartEvent
uint32 max; uint32 max;
uint32 repeatMin; uint32 repeatMin;
uint32 repeatMax; uint32 repeatMax;
uint32 range; uint32 rangeMin;
uint32 rangeMax;
} areaRange; } areaRange;
struct struct
@@ -542,6 +544,7 @@ struct SmartEvent
uint32 param3; uint32 param3;
uint32 param4; uint32 param4;
uint32 param5; uint32 param5;
uint32 param6;
} raw; } raw;
}; };
@@ -739,8 +742,9 @@ enum SMART_ACTION
SMART_ACTION_SET_SCALE = 227, // scale SMART_ACTION_SET_SCALE = 227, // scale
SMART_ACTION_SUMMON_RADIAL = 228, // summonEntry, summonDuration, repetitions, startAngle, stepAngle, dist SMART_ACTION_SUMMON_RADIAL = 228, // summonEntry, summonDuration, repetitions, startAngle, stepAngle, dist
SMART_ACTION_PLAY_SPELL_VISUAL = 229, // visualId, visualIdImpact SMART_ACTION_PLAY_SPELL_VISUAL = 229, // visualId, visualIdImpact
SMART_ACTION_FOLLOW_GROUP = 230, // followState, followType, dist
SMART_ACTION_AC_END = 230, // placeholder SMART_ACTION_AC_END = 231, // placeholder
}; };
enum class SmartActionSummonCreatureFlags enum class SmartActionSummonCreatureFlags
@@ -1442,6 +1446,13 @@ struct SmartAction
{ {
uint32 visualId; uint32 visualId;
} spellVisual; } spellVisual;
struct
{
uint32 followState;
uint32 followType;
uint32 dist;
} followGroup;
//! Note for any new future actions //! Note for any new future actions
//! All parameters must have type uint32 //! All parameters must have type uint32
@@ -1880,6 +1891,16 @@ enum SmartCastFlags
SMARTCAST_THREATLIST_NOT_SINGLE = 0x80 //Only cast if the source's threatlist is higher than one. This includes pets (see Skeram's True Fulfillment) SMARTCAST_THREATLIST_NOT_SINGLE = 0x80 //Only cast if the source's threatlist is higher than one. This includes pets (see Skeram's True Fulfillment)
}; };
enum SmartFollowType
{
FOLLOW_TYPE_CIRCLE = 1, // 360 degrees around leader, 90 degrees is the maximum angle
FOLLOW_TYPE_SEMI_CIRCLE_BEHIND = 2, // 180 degrees behind leader
FOLLOW_TYPE_SEMI_CIRCLE_FRONT = 3, // 180 degrees in front of leader
FOLLOW_TYPE_LINE = 4, // front -> back -> front -> back
FOLLOW_TYPE_COLUMN = 5, // left -> right -> left -> right
FOLLOW_TYPE_ANGULAR = 6 // geese-like formation 135 and 225 degrees behind leader
};
// one line in DB is one event // one line in DB is one event
struct SmartScriptHolder struct SmartScriptHolder
{ {
@@ -916,9 +916,49 @@ void Battleground::EndBattleground(PvPTeamId winnerTeamId)
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, player->GetMapId()); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, player->GetMapId());
} }
if (IsEventActive(EVENT_SPIRIT_OF_COMPETITION) && isBattleground())
SpiritofCompetitionEvent(winnerTeamId);
sScriptMgr->OnBattlegroundEnd(this, GetTeamId(winnerTeamId)); sScriptMgr->OnBattlegroundEnd(this, GetTeamId(winnerTeamId));
} }
bool Battleground::SpiritofCompetitionEvent(PvPTeamId winnerTeamId)
{
// Everyone is eligible for tabard reward
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
{
Player* player = itr->second;
bool questStatus = player->GetQuestStatus(QUEST_FLAG_PARTICIPANT) != QUEST_STATUS_REWARDED;
if (player && questStatus)
player->CastSpell(player, SPELL_SPIRIT_OF_COMPETITION_PARTICIPANT, true);
}
// In case of a draw nobody get rewarded
if (winnerTeamId == PVP_TEAM_NEUTRAL)
return false;
std::vector<Player*> filteredPlayers;
for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
{
Player* player = itr->second;
bool playerTeam = player->GetBgTeamId() == GetTeamId(winnerTeamId);
bool questStatus = player->GetQuestStatus(QUEST_FLAG_WINNER) != QUEST_STATUS_REWARDED;
if (player && playerTeam && questStatus)
filteredPlayers.push_back(player);
}
if (filteredPlayers.size())
{
if (Player* wPlayer = filteredPlayers[rand() % filteredPlayers.size()])
wPlayer->CastSpell(wPlayer, SPELL_SPIRIT_OF_COMPETITION_WINNER, true);
}
return true;
}
uint32 Battleground::GetBonusHonorFromKill(uint32 kills) const uint32 Battleground::GetBonusHonorFromKill(uint32 kills) const
{ {
//variable kills means how many honorable kills you scored (so we need kills * honor_for_one_kill) //variable kills means how many honorable kills you scored (so we need kills * honor_for_one_kill)
@@ -238,6 +238,15 @@ enum BattlegroundStartingEventsIds
BG_STARTING_EVENT_FOURTH = 3 BG_STARTING_EVENT_FOURTH = 3
}; };
enum SpiritOfCompetitionEvent
{
EVENT_SPIRIT_OF_COMPETITION = 46,
QUEST_FLAG_PARTICIPANT = 12187,
QUEST_FLAG_WINNER = 12186,
SPELL_SPIRIT_OF_COMPETITION_PARTICIPANT = 48163,
SPELL_SPIRIT_OF_COMPETITION_WINNER = 48164,
};
constexpr auto BG_STARTING_EVENT_COUNT = 4; constexpr auto BG_STARTING_EVENT_COUNT = 4;
class ArenaLogEntryData class ArenaLogEntryData
@@ -338,6 +347,9 @@ public:
[[nodiscard]] uint32 GetScriptId() const { return ScriptId; } [[nodiscard]] uint32 GetScriptId() const { return ScriptId; }
[[nodiscard]] uint32 GetBonusHonorFromKill(uint32 kills) const; [[nodiscard]] uint32 GetBonusHonorFromKill(uint32 kills) const;
// Spirit of Competition event
bool SpiritofCompetitionEvent(PvPTeamId winnerTeamId);
bool IsRandom() { return m_IsRandom; } bool IsRandom() { return m_IsRandom; }
// Set methods: // Set methods:
+16 -12
View File
@@ -48,7 +48,7 @@ Pet::Pet(Player* owner, PetType type) : Guardian(nullptr, owner ? owner->GetGUID
m_loading(false), m_loading(false),
m_petRegenTimer(PET_FOCUS_REGEN_INTERVAL), m_petRegenTimer(PET_FOCUS_REGEN_INTERVAL),
m_tempspellTarget(nullptr), m_tempspellTarget(nullptr),
m_tempoldTarget(nullptr), m_tempoldTarget(),
m_tempspellIsPositive(false), m_tempspellIsPositive(false),
m_tempspell(0) m_tempspell(0)
{ {
@@ -710,7 +710,11 @@ void Pet::Update(uint32 diff)
if (m_tempspell) if (m_tempspell)
{ {
Unit* tempspellTarget = m_tempspellTarget; Unit* tempspellTarget = m_tempspellTarget;
Unit* tempoldTarget = m_tempoldTarget; Unit* tempoldTarget = nullptr;
if (!m_tempoldTarget.IsEmpty())
tempoldTarget = ObjectAccessor::GetUnit(*this, m_tempoldTarget);
bool tempspellIsPositive = m_tempspellIsPositive; bool tempspellIsPositive = m_tempspellIsPositive;
uint32 tempspell = m_tempspell; uint32 tempspell = m_tempspell;
Unit* charmer = GetCharmerOrOwner(); Unit* charmer = GetCharmerOrOwner();
@@ -783,7 +787,7 @@ void Pet::Update(uint32 diff)
} }
} }
m_tempoldTarget = nullptr; m_tempoldTarget = ObjectGuid::Empty;
m_tempspellIsPositive = false; m_tempspellIsPositive = false;
} }
} }
@@ -793,7 +797,7 @@ void Pet::Update(uint32 diff)
{ {
m_tempspell = 0; m_tempspell = 0;
m_tempspellTarget = nullptr; m_tempspellTarget = nullptr;
m_tempoldTarget = nullptr; m_tempoldTarget = ObjectGuid::Empty;
m_tempspellIsPositive = false; m_tempspellIsPositive = false;
Unit* victim = charmer->GetVictim(); Unit* victim = charmer->GetVictim();
@@ -1218,11 +1222,11 @@ bool Guardian::InitStatsForLevel(uint8 petlevel)
} }
case NPC_INFERNAL: case NPC_INFERNAL:
{ {
float highAmt = petlevel / 11.0f; if (pInfo)
float lowAmt = petlevel / 12.0f; {
SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, lowAmt * lowAmt * lowAmt); SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(pInfo->min_dmg));
SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, highAmt * highAmt * highAmt); SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(pInfo->max_dmg));
}
AddAura(SPELL_PET_AVOIDANCE, this); AddAura(SPELL_PET_AVOIDANCE, this);
AddAura(SPELL_WARLOCK_PET_SCALING_05, this); AddAura(SPELL_WARLOCK_PET_SCALING_05, this);
AddAura(SPELL_INFERNAL_SCALING_01, this); AddAura(SPELL_INFERNAL_SCALING_01, this);
@@ -2414,7 +2418,7 @@ void Pet::SetDisplayId(uint32 modelId)
player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_MODEL_ID); player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_MODEL_ID);
} }
void Pet::CastWhenWillAvailable(uint32 spellid, Unit* spellTarget, Unit* oldTarget, bool spellIsPositive) void Pet::CastWhenWillAvailable(uint32 spellid, Unit* spellTarget, ObjectGuid oldTarget, bool spellIsPositive)
{ {
if (!spellid) if (!spellid)
return; return;
@@ -2426,7 +2430,7 @@ void Pet::CastWhenWillAvailable(uint32 spellid, Unit* spellTarget, Unit* oldTarg
m_tempspell = spellid; m_tempspell = spellid;
m_tempspellIsPositive = spellIsPositive; m_tempspellIsPositive = spellIsPositive;
if (oldTarget) if (!oldTarget.IsEmpty())
m_tempoldTarget = oldTarget; m_tempoldTarget = oldTarget;
} }
@@ -2435,7 +2439,7 @@ void Pet::ClearCastWhenWillAvailable()
m_tempspellIsPositive = false; m_tempspellIsPositive = false;
m_tempspell = 0; m_tempspell = 0;
m_tempspellTarget = nullptr; m_tempspellTarget = nullptr;
m_tempoldTarget = nullptr; m_tempoldTarget = ObjectGuid::Empty;
} }
void Pet::RemoveSpellCooldown(uint32 spell_id, bool update /* = false */) void Pet::RemoveSpellCooldown(uint32 spell_id, bool update /* = false */)
+2 -2
View File
@@ -96,7 +96,7 @@ public:
void LearnPetPassives(); void LearnPetPassives();
void CastPetAuras(bool current); void CastPetAuras(bool current);
void CastWhenWillAvailable(uint32 spellid, Unit* spellTarget, Unit* oldTarget, bool spellIsPositive = false); void CastWhenWillAvailable(uint32 spellid, Unit* spellTarget, ObjectGuid oldTarget, bool spellIsPositive = false);
void ClearCastWhenWillAvailable(); void ClearCastWhenWillAvailable();
void RemoveSpellCooldown(uint32 spell_id, bool update /* = false */); void RemoveSpellCooldown(uint32 spell_id, bool update /* = false */);
@@ -158,7 +158,7 @@ protected:
std::unique_ptr<DeclinedName> m_declinedname; std::unique_ptr<DeclinedName> m_declinedname;
Unit* m_tempspellTarget; Unit* m_tempspellTarget;
Unit* m_tempoldTarget; ObjectGuid m_tempoldTarget;
bool m_tempspellIsPositive; bool m_tempspellIsPositive;
uint32 m_tempspell; uint32 m_tempspell;
@@ -39,6 +39,8 @@ MotionTransport::MotionTransport() : Transport(), _transportInfo(nullptr), _isMo
MotionTransport::~MotionTransport() MotionTransport::~MotionTransport()
{ {
HashMapHolder<MotionTransport>::Remove(this);
ASSERT(_passengers.empty()); ASSERT(_passengers.empty());
UnloadStaticPassengers(); UnloadStaticPassengers();
} }
+9 -12
View File
@@ -388,22 +388,19 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
&& unit->GetTypeId() == TYPEID_PLAYER && unit->GetTypeId() == TYPEID_PLAYER
&& seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL) && seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_CAN_CONTROL)
{ {
try // Removed try catch + ABORT() here, and make it as simple condition check.
{
if (!_me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE)) if (!_me->SetCharmedBy(unit, CHARM_TYPE_VEHICLE))
ABORT();
}
catch (...)
{ {
LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy()!"); // I assume SetCharmedBy should always be true.
LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). not null: {}", _me ? 1 : 0); // If not, let's log some debug info.
LOG_INFO("vehicles", "Crash recovered in Unit::SetCharmedBy(). not null: {}", _me ? 1 : 0);
if (!_me) if (!_me)
return false; return false;
LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). Is: {}!", _me->IsInWorld()); LOG_INFO("vehicles", "Crash recovered in Unit::SetCharmedBy(). Is: {}!", _me->IsInWorld());
LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). Is2: {}!", _me->IsDuringRemoveFromWorld()); LOG_INFO("vehicles", "Crash recovered in Unit::SetCharmedBy(). Is2: {}!", _me->IsDuringRemoveFromWorld());
LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). Unit {}!", _me->GetName()); LOG_INFO("vehicles", "Crash recovered in Unit::SetCharmedBy(). Unit {}!", _me->GetName());
LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). typeid: {}!", _me->GetTypeId()); LOG_INFO("vehicles", "Crash recovered in Unit::SetCharmedBy(). typeid: {}!", _me->GetTypeId());
LOG_INFO("vehicles", "CRASH! Try-catch in Unit::SetCharmedBy(). Unit {}, typeid: {}, in world: {}, duringremove: {} has wrong CharmType! Charmer {}, typeid: {}, in world: {}, duringremove: {}.", _me->GetName(), _me->GetTypeId(), _me->IsInWorld(), _me->IsDuringRemoveFromWorld(), unit->GetName(), unit->GetTypeId(), unit->IsInWorld(), unit->IsDuringRemoveFromWorld()); LOG_INFO("vehicles", "Crash recovered in Unit::SetCharmedBy(). Unit {}, typeid: {}, in world: {}, duringremove: {} has wrong CharmType! Charmer {}, typeid: {}, in world: {}, duringremove: {}.", _me->GetName(), _me->GetTypeId(), _me->IsInWorld(), _me->IsDuringRemoveFromWorld(), unit->GetName(), unit->GetTypeId(), unit->IsInWorld(), unit->IsDuringRemoveFromWorld());
return false; return false;
} }
} }
+3 -3
View File
@@ -491,7 +491,7 @@ void ObjectMgr::LoadGossipMenuItemsLocales()
{ {
Field* fields = result->Fetch(); Field* fields = result->Fetch();
uint16 MenuID = fields[0].Get<uint16>(); uint32 MenuID = fields[0].Get<uint32>();
uint16 OptionID = fields[1].Get<uint16>(); uint16 OptionID = fields[1].Get<uint16>();
LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>()); LocaleConstant locale = GetLocaleByName(fields[2].Get<std::string>());
@@ -9226,7 +9226,7 @@ void ObjectMgr::LoadGossipMenu()
GossipMenus gMenu; GossipMenus gMenu;
gMenu.MenuID = fields[0].Get<uint16>(); gMenu.MenuID = fields[0].Get<uint32>();
gMenu.TextID = fields[1].Get<uint32>(); gMenu.TextID = fields[1].Get<uint32>();
if (!GetGossipText(gMenu.TextID)) if (!GetGossipText(gMenu.TextID))
@@ -9266,7 +9266,7 @@ void ObjectMgr::LoadGossipMenuItems()
GossipMenuItems gMenuItem; GossipMenuItems gMenuItem;
gMenuItem.MenuID = fields[0].Get<uint16>(); gMenuItem.MenuID = fields[0].Get<uint32>();
gMenuItem.OptionID = fields[1].Get<uint16>(); gMenuItem.OptionID = fields[1].Get<uint16>();
gMenuItem.OptionIcon = fields[2].Get<uint32>(); gMenuItem.OptionIcon = fields[2].Get<uint32>();
gMenuItem.OptionText = fields[3].Get<std::string>(); gMenuItem.OptionText = fields[3].Get<std::string>();
+6 -2
View File
@@ -530,7 +530,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe
pet->SendPetAIReaction(guid1); pet->SendPetAIReaction(guid1);
} }
pet->ToPet()->CastWhenWillAvailable(spellId, unit_target, nullptr, tempspellIsPositive); pet->ToPet()->CastWhenWillAvailable(spellId, unit_target, ObjectGuid::Empty, tempspellIsPositive);
} }
} }
else if (haspositiveeffect) else if (haspositiveeffect)
@@ -566,7 +566,11 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe
pet->SendPetAIReaction(guid1); pet->SendPetAIReaction(guid1);
} }
pet->ToPet()->CastWhenWillAvailable(spellId, unit_target, victim, tmpSpellIsPositive); ObjectGuid oldTarget = ObjectGuid::Empty;
if (victim)
oldTarget = victim->GetGUID();
pet->ToPet()->CastWhenWillAvailable(spellId, unit_target, oldTarget, tmpSpellIsPositive);
} }
} }
} }
+4 -1
View File
@@ -645,7 +645,10 @@ enum AcoreStrings
// End Level 3 list, continued at 1100 // End Level 3 list, continued at 1100
// 600-704 - free LANG_EVENT_STARTED = 600,
LANG_EVENT_STOPPED = 601,
// 602-704 - free
LANG_WAIT_BEFORE_SPEAKING = 705, LANG_WAIT_BEFORE_SPEAKING = 705,
LANG_NOT_EQUIPPED_ITEM = 706, LANG_NOT_EQUIPPED_ITEM = 706,
@@ -4560,6 +4560,12 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->Effects[EFFECT_0].TriggerSpell = 62585; // Mulgore Hatchling (fear) spellInfo->Effects[EFFECT_0].TriggerSpell = 62585; // Mulgore Hatchling (fear)
}); });
// Poultryized!
ApplySpellFix({ 30504 }, [](SpellInfo* spellInfo)
{
spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_TAKE_DAMAGE;
});
for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i) for (uint32 i = 0; i < GetSpellInfoStoreSize(); ++i)
{ {
SpellInfo* spellInfo = mSpellInfoMap[i]; SpellInfo* spellInfo = mSpellInfoMap[i];
+4 -2
View File
@@ -152,11 +152,12 @@ public:
GameEventMgr::ActiveEvents const& activeEvents = sGameEventMgr->GetActiveEventList(); GameEventMgr::ActiveEvents const& activeEvents = sGameEventMgr->GetActiveEventList();
if (activeEvents.find(eventId) != activeEvents.end()) if (activeEvents.find(eventId) != activeEvents.end())
{ {
handler->PSendSysMessage(LANG_EVENT_ALREADY_ACTIVE, uint16(eventId)); handler->PSendSysMessage(LANG_EVENT_ALREADY_ACTIVE, uint16(eventId), eventData.description.c_str());
handler->SetSentErrorMessage(true); handler->SetSentErrorMessage(true);
return false; return false;
} }
handler->PSendSysMessage(LANG_EVENT_STARTED, uint16(eventId), eventData.description.c_str());
sGameEventMgr->StartEvent(eventId, true); sGameEventMgr->StartEvent(eventId, true);
return true; return true;
} }
@@ -184,11 +185,12 @@ public:
if (activeEvents.find(eventId) == activeEvents.end()) if (activeEvents.find(eventId) == activeEvents.end())
{ {
handler->PSendSysMessage(LANG_EVENT_NOT_ACTIVE, uint16(eventId)); handler->PSendSysMessage(LANG_EVENT_NOT_ACTIVE, uint16(eventId), eventData.description.c_str());
handler->SetSentErrorMessage(true); handler->SetSentErrorMessage(true);
return false; return false;
} }
handler->PSendSysMessage(LANG_EVENT_STOPPED, uint16(eventId), eventData.description.c_str());
sGameEventMgr->StopEvent(eventId, true); sGameEventMgr->StopEvent(eventId, true);
return true; return true;
} }
@@ -31,8 +31,8 @@ uint32 const DragonspireMobs[3] = { NPC_BLACKHAND_DREADWEAVER, NPC_BLACKHAND_SUM
enum EventIds enum EventIds
{ {
EVENT_DARGONSPIRE_ROOM_STORE = 1, EVENT_DRAGONSPIRE_ROOM_STORE = 1,
EVENT_DARGONSPIRE_ROOM_CHECK = 2, EVENT_DRAGONSPIRE_ROOM_CHECK = 2,
EVENT_SOLAKAR_WAVE = 3 EVENT_SOLAKAR_WAVE = 3
}; };
@@ -352,7 +352,7 @@ public:
if (data == AREATRIGGER_DRAGONSPIRE_HALL) if (data == AREATRIGGER_DRAGONSPIRE_HALL)
{ {
if (GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE) if (GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE)
Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_STORE, 1s); Events.ScheduleEvent(EVENT_DRAGONSPIRE_ROOM_STORE, 1s);
} }
break; break;
case DATA_SOLAKAR_FLAMEWREATH: case DATA_SOLAKAR_FLAMEWREATH:
@@ -555,14 +555,14 @@ public:
{ {
switch (eventId) switch (eventId)
{ {
case EVENT_DARGONSPIRE_ROOM_STORE: case EVENT_DRAGONSPIRE_ROOM_STORE:
Dragonspireroomstore(); Dragonspireroomstore();
Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s); Events.ScheduleEvent(EVENT_DRAGONSPIRE_ROOM_CHECK, 3s);
break; break;
case EVENT_DARGONSPIRE_ROOM_CHECK: case EVENT_DRAGONSPIRE_ROOM_CHECK:
Dragonspireroomcheck(); Dragonspireroomcheck();
if ((GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE)) if ((GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE))
Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s); Events.ScheduleEvent(EVENT_DRAGONSPIRE_ROOM_CHECK, 3s);
break; break;
case EVENT_SOLAKAR_WAVE: case EVENT_SOLAKAR_WAVE:
SummonSolakarWave(CurrentSolakarWave); SummonSolakarWave(CurrentSolakarWave);
@@ -38,11 +38,12 @@ enum Spells
struct boss_maiden_of_virtue : public BossAI struct boss_maiden_of_virtue : public BossAI
{ {
boss_maiden_of_virtue(Creature* creature) : BossAI(creature, DATA_MAIDEN) { } boss_maiden_of_virtue(Creature* creature) : BossAI(creature, DATA_MAIDEN)
void Reset() override
{ {
BossAI::Reset(); scheduler.SetValidator([this]
{
return !me->HasUnitState(UNIT_STATE_CASTING);
});
} }
void JustEngagedWith(Unit* who) override void JustEngagedWith(Unit* who) override
@@ -82,18 +83,6 @@ struct boss_maiden_of_virtue : public BossAI
BossAI::JustDied(killer); BossAI::JustDied(killer);
Talk(SAY_DEATH); Talk(SAY_DEATH);
} }
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
scheduler.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
DoMeleeAttackIfReady();
}
}; };
void AddSC_boss_maiden_of_virtue() void AddSC_boss_maiden_of_virtue()
@@ -40,30 +40,11 @@ struct boss_servant_quarters : public BossAI
void Reset() override void Reset() override
{ {
_scheduler.CancelAll(); _scheduler.CancelAll();
me->SetVisible(false);
me->SetReactState(REACT_PASSIVE);
me->SetFaction(FACTION_FRIENDLY);
_scheduler.Schedule(5s, [this](TaskContext context)
{
if (instance->GetBossState(DATA_SERVANT_QUARTERS) == DONE)
{
me->SetVisible(true);
me->SetReactState(REACT_AGGRESSIVE);
me->RestoreFaction();
}
else
{
context.Repeat(5s);
}
});
if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) if (me->GetEntry() == NPC_HYAKISS_THE_LURKER)
{ {
DoCastSelf(SPELL_SNEAK, true); DoCastSelf(SPELL_SNEAK, true);
} }
if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry())
{
me->DespawnOrUnsummon(1);
}
} }
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
File diff suppressed because it is too large Load Diff
@@ -35,7 +35,14 @@ const Position OptionalSpawn[] =
ObjectData const creatureData[] = ObjectData const creatureData[] =
{ {
{ NPC_ATTUMEN_THE_HUNTSMAN, DATA_ATTUMEN }, { NPC_ATTUMEN_THE_HUNTSMAN, DATA_ATTUMEN },
{ NPC_MIDNIGHT, DATA_MIDNIGHT } { NPC_MIDNIGHT, DATA_MIDNIGHT },
{ NPC_DOROTHEE, DATA_DOROTHEE },
{ NPC_TITO, DATA_TITO },
{ NPC_ROAR, DATA_ROAR },
{ NPC_STRAWMAN, DATA_STRAWMAN },
{ NPC_TINHEAD, DATA_TINHEAD },
{ NPC_ROMULO, DATA_ROMULO },
{ NPC_JULIANNE, DATA_JULIANNE },
}; };
class instance_karazhan : public InstanceMapScript class instance_karazhan : public InstanceMapScript
@@ -40,11 +40,10 @@ enum KZDataTypes
DATA_MALCHEZZAR = 10, DATA_MALCHEZZAR = 10,
DATA_NIGHTBANE = 11, DATA_NIGHTBANE = 11,
DATA_SERVANT_QUARTERS = 12, DATA_SERVANT_QUARTERS = 12,
DATA_SELECTED_RARE = 13, DATA_OPERA_OZ_DEATHCOUNT = 13,
DATA_OPERA_OZ_DEATHCOUNT = 14, DATA_KILREK = 14,
DATA_KILREK = 15,
MAX_ENCOUNTERS = 16, MAX_ENCOUNTERS = 15,
DATA_GO_CURTAINS = 18, DATA_GO_CURTAINS = 18,
DATA_GO_STAGEDOORLEFT = 19, DATA_GO_STAGEDOORLEFT = 19,
@@ -67,7 +66,17 @@ enum KZDataTypes
DATA_CHESS_REINIT_PIECES = 34, DATA_CHESS_REINIT_PIECES = 34,
DATA_CHESS_GAME_PHASE = 35, DATA_CHESS_GAME_PHASE = 35,
DATA_ECHO_OF_MEDIVH = 36, DATA_ECHO_OF_MEDIVH = 36,
DATA_DUST_COVERED_CHEST = 37 DATA_DUST_COVERED_CHEST = 37,
// Specific Opera Data
DATA_DOROTHEE = 38,
DATA_ROMULO = 39,
DATA_JULIANNE = 40,
DATA_ROAR = 41,
DATA_STRAWMAN = 42,
DATA_TINHEAD = 43,
DATA_TITO = 44
}; };
enum KZOperaEvents enum KZOperaEvents
@@ -101,6 +110,13 @@ enum KZCreatures
NPC_KILREK = 17229, NPC_KILREK = 17229,
NPC_RELAY = 17645, NPC_RELAY = 17645,
NPC_BARNES = 16812, NPC_BARNES = 16812,
NPC_DOROTHEE = 17535,
NPC_TITO = 17548,
NPC_ROMULO = 17533,
NPC_JULIANNE = 17534,
NPC_ROAR = 17546,
NPC_STRAWMAN = 17543,
NPC_TINHEAD = 17547,
// Chess Event // Chess Event
NPC_ECHO_OF_MEDIVH = 16816, NPC_ECHO_OF_MEDIVH = 16816,
@@ -112,10 +112,6 @@ struct boss_lieutenant_drake : public BossAI
{ {
_JustDied(); _JustDied();
Talk(SAY_DEATH); Talk(SAY_DEATH);
if (InstanceScript* instance = me->GetInstanceScript())
{
instance->SetData(DATA_ESCORT_PROGRESS, ENCOUNTER_PROGRESS_DRAKE_KILLED);
}
} }
void MovementInform(uint32 type, uint32 point) override void MovementInform(uint32 type, uint32 point) override
@@ -257,7 +257,7 @@ public:
{ {
switch (param) switch (param)
{ {
case ENCOUNTER_PROGRESS_DRAKE_KILLED: case ENCOUNTER_PROGRESS_BARRELS:
events.ScheduleEvent(EVENT_OPEN_DOORS, 0); events.ScheduleEvent(EVENT_OPEN_DOORS, 0);
events.ScheduleEvent(EVENT_START_WP, 3000); events.ScheduleEvent(EVENT_START_WP, 3000);
break; break;
@@ -74,7 +74,7 @@ enum MiscIds
ENCOUNTER_PROGRESS_NONE = 0, ENCOUNTER_PROGRESS_NONE = 0,
ENCOUNTER_PROGRESS_BARRELS = 1, ENCOUNTER_PROGRESS_BARRELS = 1,
ENCOUNTER_PROGRESS_DRAKE_KILLED = 2, //ENCOUNTER_PROGRESS_DRAKE_KILLED = 2, No longer used. Kept as reference as DB might rely on the existing order.
ENCOUNTER_PROGRESS_THRALL_ARMORED = 3, ENCOUNTER_PROGRESS_THRALL_ARMORED = 3,
ENCOUNTER_PROGRESS_AMBUSHES_1 = 4, ENCOUNTER_PROGRESS_AMBUSHES_1 = 4,
ENCOUNTER_PROGRESS_SKARLOC_KILLED = 5, ENCOUNTER_PROGRESS_SKARLOC_KILLED = 5,
@@ -39,6 +39,8 @@ EndContentData */
#include "ScriptedCreature.h" #include "ScriptedCreature.h"
#include "ScriptedEscortAI.h" #include "ScriptedEscortAI.h"
#include "ScriptedGossip.h" #include "ScriptedGossip.h"
#include "SpellAuras.h"
#include "SpellScript.h"
/*###### /*######
## npc_draenei_survivor ## npc_draenei_survivor
@@ -522,6 +524,55 @@ public:
} }
}; };
enum NestlewoodOwlkin
{
NPC_NESTLEWOOD_OWLKIN_ENTRY = 16518,
NPC_INOCULATED_OWLKIN_ENTRY = 16534,
TALK_OWLKIN = 0
};
class spell_inoculate_nestlewood_owlkin : public AuraScript
{
public:
PrepareAuraScript(spell_inoculate_nestlewood_owlkin)
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (Creature* owlkin = GetTarget()->ToCreature())
if (owlkin->GetEntry() == NPC_NESTLEWOOD_OWLKIN_ENTRY)
owlkin->SetFacingToObject(GetCaster());
}
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
return;
if (Creature* owlkin = GetTarget()->ToCreature())
{
if (owlkin->GetEntry() == NPC_NESTLEWOOD_OWLKIN_ENTRY)
{
Player* caster = GetCaster()->ToPlayer();
if (owlkin->UpdateEntry(NPC_INOCULATED_OWLKIN_ENTRY))
{
owlkin->AI()->Talk(TALK_OWLKIN);
owlkin->GetMotionMaster()->MoveRandom(15.0f);
owlkin->SetUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_PC));
owlkin->DespawnOrUnsummon(15s, 0s);
caster->RewardPlayerAndGroupAtEvent(NPC_INOCULATED_OWLKIN_ENTRY, caster);
}
}
}
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_inoculate_nestlewood_owlkin::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
AfterEffectRemove += AuraEffectRemoveFn(spell_inoculate_nestlewood_owlkin::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
void AddSC_azuremyst_isle() void AddSC_azuremyst_isle()
{ {
new npc_draenei_survivor(); new npc_draenei_survivor();
@@ -531,4 +582,5 @@ void AddSC_azuremyst_isle()
new go_ravager_cage(); new go_ravager_cage();
new npc_stillpine_capitive(); new npc_stillpine_capitive();
new go_bristlelimb_cage(); new go_bristlelimb_cage();
RegisterSpellScript(spell_inoculate_nestlewood_owlkin);
} }
@@ -702,7 +702,6 @@ public:
} }
} }
me->RemoveVehicleKit(); // not Crash (;
events.ScheduleEvent(EVENT_TAKE_OFF, 2s); events.ScheduleEvent(EVENT_TAKE_OFF, 2s);
me->CastSpell(passenger, VEHICLE_SPELL_PARACHUTE, true); me->CastSpell(passenger, VEHICLE_SPELL_PARACHUTE, true);
} }
@@ -73,6 +73,13 @@ struct boss_harbinger_skyriss : public BossAI
}); });
} }
void EnterEvadeMode(EvadeReason why) override
{
BossAI::EnterEvadeMode(why);
instance->DoRespawnCreature(DATA_WARDEN_MELLICHAR, true);
me->DespawnOrUnsummon();
}
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
{ {
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
@@ -4917,6 +4917,87 @@ class spell_gen_curse_of_pain : public AuraScript
} }
}; };
enum SpiritofCompetition
{
// Spells
SPELL_SPIRIT_OF_COMPETITION_PARTICIPANT_EFFECT = 48056,
SPELL_SPIRIT_OF_COMPETITION_WINNER_EFFECT = 48057,
// Mail
MAIL_THE_COMPETITIORS_TABARD = 195,
MAIL_A_GOLD_MEDALLION = 196,
// NPC
NPC_SPIRIT_OF_COMPETITION = 27217,
// Items
ITEM_COMPETITORS_TABARD = 36941,
ITEM_GOLD_MEDALLION = 37297,
};
class spell_gen_spirit_of_competition_participant : public SpellScript
{
PrepareSpellScript(spell_gen_spirit_of_competition_participant);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SPIRIT_OF_COMPETITION_PARTICIPANT_EFFECT });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Player* player = GetHitPlayer())
{
player->CastSpell(player, SPELL_SPIRIT_OF_COMPETITION_PARTICIPANT_EFFECT, true);
Item* item = Item::CreateItem(ITEM_COMPETITORS_TABARD, 1);
if (!item)
return;
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
MailDraft(MAIL_THE_COMPETITIORS_TABARD)
.AddItem(item)
.SendMailTo(trans, player, MailSender(NPC_SPIRIT_OF_COMPETITION), MAIL_CHECK_MASK_HAS_BODY);
CharacterDatabase.CommitTransaction(trans);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_of_competition_participant::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
class spell_gen_spirit_of_competition_winner : public SpellScript
{
PrepareSpellScript(spell_gen_spirit_of_competition_winner);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SPIRIT_OF_COMPETITION_WINNER_EFFECT });
}
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Player* player = GetHitPlayer())
{
player->CastSpell(player, SPELL_SPIRIT_OF_COMPETITION_WINNER_EFFECT, true);
Item* item = Item::CreateItem(ITEM_GOLD_MEDALLION, 1);
if (!item)
return;
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
MailDraft(MAIL_A_GOLD_MEDALLION)
.AddItem(item)
.SendMailTo(trans, player, MailSender(NPC_SPIRIT_OF_COMPETITION), MAIL_CHECK_MASK_HAS_BODY);
CharacterDatabase.CommitTransaction(trans);
}
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_of_competition_winner::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_generic_spell_scripts() void AddSC_generic_spell_scripts()
{ {
RegisterSpellScript(spell_silithyst); RegisterSpellScript(spell_silithyst);
@@ -5063,4 +5144,6 @@ void AddSC_generic_spell_scripts()
RegisterSpellScript(spell_gen_threshalisk_charge); RegisterSpellScript(spell_gen_threshalisk_charge);
RegisterSpellScript(spell_gen_shriveling_gaze); RegisterSpellScript(spell_gen_shriveling_gaze);
RegisterSpellScript(spell_gen_curse_of_pain); RegisterSpellScript(spell_gen_curse_of_pain);
RegisterSpellScript(spell_gen_spirit_of_competition_participant);
RegisterSpellScript(spell_gen_spirit_of_competition_winner);
} }
+14 -4
View File
@@ -2975,8 +2975,9 @@ class spell_item_nigh_invulnerability : public SpellScript
enum Poultryzer enum Poultryzer
{ {
SPELL_POULTRYIZER_SUCCESS = 30501, SPELL_POULTRYIZER_SUCCESS_1 = 30501,
SPELL_POULTRYIZER_BACKFIRE = 30504, SPELL_POULTRYIZER_SUCCESS_2 = 30504, // malfunction
SPELL_POULTRYIZER_BACKFIRE = 30506, // Not removed on damage
}; };
class spell_item_poultryizer : public SpellScript class spell_item_poultryizer : public SpellScript
@@ -2985,13 +2986,22 @@ class spell_item_poultryizer : public SpellScript
bool Validate(SpellInfo const* /*spell*/) override bool Validate(SpellInfo const* /*spell*/) override
{ {
return ValidateSpellInfo({ SPELL_POULTRYIZER_SUCCESS, SPELL_POULTRYIZER_BACKFIRE }); return ValidateSpellInfo({ SPELL_POULTRYIZER_SUCCESS_1, SPELL_POULTRYIZER_SUCCESS_2, SPELL_POULTRYIZER_BACKFIRE });
} }
void HandleDummy(SpellEffIndex /* effIndex */) void HandleDummy(SpellEffIndex /* effIndex */)
{ {
if (GetCastItem() && GetHitUnit()) if (GetCastItem() && GetHitUnit())
GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS : SPELL_POULTRYIZER_BACKFIRE, true, GetCastItem()); {
if (roll_chance_i(80))
{
GetCaster()->CastSpell(GetHitUnit(), roll_chance_i(80) ? SPELL_POULTRYIZER_SUCCESS_1 : SPELL_POULTRYIZER_SUCCESS_2, true, GetCastItem());
}
else
{
GetCaster()->CastSpell(GetCaster(), SPELL_POULTRYIZER_BACKFIRE, true, GetCastItem());
}
}
} }
void Register() override void Register() override
+22
View File
@@ -2451,6 +2451,27 @@ class spell_q4735_collect_rookery_egg : public SpellScript
} }
}; };
enum BookOfFelNames
{
SPELL_METAMORPHOSIS = 36298
};
class spell_q10651_q10692_book_of_fel_names : public SpellScript
{
PrepareSpellScript(spell_q10651_q10692_book_of_fel_names);
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (GetHitUnit()->HasAura(SPELL_METAMORPHOSIS))
GetHitUnit()->RemoveAurasDueToSpell(SPELL_METAMORPHOSIS);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_q10651_q10692_book_of_fel_names::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
void AddSC_quest_spell_scripts() void AddSC_quest_spell_scripts()
{ {
RegisterSpellAndAuraScriptPair(spell_q11065_wrangle_some_aether_rays, spell_q11065_wrangle_some_aether_rays_aura); RegisterSpellAndAuraScriptPair(spell_q11065_wrangle_some_aether_rays, spell_q11065_wrangle_some_aether_rays_aura);
@@ -2522,4 +2543,5 @@ void AddSC_quest_spell_scripts()
RegisterSpellScript(spell_q12919_gymers_throw); RegisterSpellScript(spell_q12919_gymers_throw);
RegisterSpellScript(spell_q5056_summon_shy_rotam); RegisterSpellScript(spell_q5056_summon_shy_rotam);
RegisterSpellScript(spell_q4735_collect_rookery_egg); RegisterSpellScript(spell_q4735_collect_rookery_egg);
RegisterSpellScript(spell_q10651_q10692_book_of_fel_names);
} }
+125
View File
@@ -0,0 +1,125 @@
/*
* This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by the
* Free Software Foundation; either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Config.h"
#include "gtest/gtest.h"
#include <boost/filesystem.hpp>
#include <cstdlib>
#include <fstream>
#include <string>
std::string CreateConfigWithMap(std::map<std::string, std::string> const& map)
{
auto mTempFileRel = boost::filesystem::unique_path("deleteme.ini");
auto mTempFileAbs = boost::filesystem::temp_directory_path() / mTempFileRel;
std::ofstream iniStream;
iniStream.open(mTempFileAbs.c_str());
iniStream << "[test]\n";
for (auto const& itr : map)
iniStream << itr.first << " = " << itr.second << "\n";
iniStream.close();
return mTempFileAbs.native();
}
class ConfigEnvTest : public testing::Test {
protected:
void SetUp() override {
std::map<std::string, std::string> config;
config["Int.Nested"] = "4242";
config["lower"] = "simpleString";
config["UPPER"] = "simpleString";
config["SomeLong.NestedNameWithNumber.Like1"] = "1";
config["GM.InGMList.Level"] = "50";
confFilePath = CreateConfigWithMap(config);
sConfigMgr->Configure(confFilePath, std::vector<std::string>());
sConfigMgr->LoadAppConfigs();
}
void TearDown() override {
std::remove(confFilePath.c_str());
}
std::string confFilePath;
};
TEST_F(ConfigEnvTest, NestedInt)
{
EXPECT_EQ(sConfigMgr->GetOption<int32>("Int.Nested", 10), 4242);
setenv("AC_INT_NESTED", "8080", 1);
EXPECT_EQ(sConfigMgr->OverrideWithEnvVariablesIfAny().empty(), false);
EXPECT_EQ(sConfigMgr->GetOption<int32>("Int.Nested", 10), 8080);
}
TEST_F(ConfigEnvTest, SimpleLowerString)
{
EXPECT_EQ(sConfigMgr->GetOption<std::string>("lower", ""), "simpleString");
setenv("AC_LOWER", "envstring", 1);
EXPECT_EQ(sConfigMgr->OverrideWithEnvVariablesIfAny().empty(), false);
EXPECT_EQ(sConfigMgr->GetOption<std::string>("lower", ""), "envstring");
}
TEST_F(ConfigEnvTest, SimpleUpperString)
{
EXPECT_EQ(sConfigMgr->GetOption<std::string>("UPPER", ""), "simpleString");
setenv("AC_UPPER", "envupperstring", 1);
EXPECT_EQ(sConfigMgr->OverrideWithEnvVariablesIfAny().empty(), false);
EXPECT_EQ(sConfigMgr->GetOption<std::string>("UPPER", ""), "envupperstring");
}
TEST_F(ConfigEnvTest, LongNestedNameWithNumber)
{
EXPECT_EQ(sConfigMgr->GetOption<float>("SomeLong.NestedNameWithNumber.Like1", 0), 1);
setenv("AC_SOME_LONG_NESTED_NAME_WITH_NUMBER_LIKE_1", "42", 1);
EXPECT_EQ(sConfigMgr->OverrideWithEnvVariablesIfAny().empty(), false);
EXPECT_EQ(sConfigMgr->GetOption<float>("SomeLong.NestedNameWithNumber.Like1", 0), 42);
}
TEST_F(ConfigEnvTest, ValueWithSeveralUpperlLaters)
{
EXPECT_EQ(sConfigMgr->GetOption<int>("GM.InGMList.Level", 1), 50);
setenv("AC_GM_IN_GMLIST_LEVEL", "42", 1);
EXPECT_EQ(sConfigMgr->OverrideWithEnvVariablesIfAny().empty(), false);
EXPECT_EQ(sConfigMgr->GetOption<int>("GM.InGMList.Level", 0), 42);
}
TEST_F(ConfigEnvTest, StringThatNotExistInConfig)
{
setenv("AC_UNIQUE_STRING", "somevalue", 1);
EXPECT_EQ(sConfigMgr->GetOption<std::string>("Unique.String", ""), "somevalue");
}
TEST_F(ConfigEnvTest, IntThatNotExistInConfig)
{
setenv("AC_UNIQUE_INT", "100", 1);
EXPECT_EQ(sConfigMgr->GetOption<int>("Unique.Int", 1), 100);
}
TEST_F(ConfigEnvTest, NotExistingString)
{
EXPECT_EQ(sConfigMgr->GetOption<std::string>("NotFound.String", "none"), "none");
}
TEST_F(ConfigEnvTest, NotExistingInt)
{
EXPECT_EQ(sConfigMgr->GetOption<int>("NotFound.Int", 1), 1);
}
+5
View File
@@ -62,6 +62,8 @@ int main(int argc, char** argv)
if (!sConfigMgr->LoadAppConfigs()) if (!sConfigMgr->LoadAppConfigs())
return 1; return 1;
std::vector<std::string> overriddenKeys = sConfigMgr->OverrideWithEnvVariablesIfAny();
// Init logging // Init logging
sLog->Initialize(); sLog->Initialize();
@@ -78,6 +80,9 @@ int main(int argc, char** argv)
} }
); );
for (std::string const& key : overriddenKeys)
LOG_INFO("dbimport", "Configuration field {} was overridden with environment variable.", key);
OpenSSLCrypto::threadsSetup(); OpenSSLCrypto::threadsSetup();
std::shared_ptr<void> opensslHandle(nullptr, [](void*) { OpenSSLCrypto::threadsCleanup(); }); std::shared_ptr<void> opensslHandle(nullptr, [](void*) { OpenSSLCrypto::threadsCleanup(); });