~mser/vmangos-docker

3f3403b22f643c123ec44f8f7d199a5f56e930b4 — Michael Serajnik 5 months ago
Add initial version
A  => .dockerignore +7 -0
@@ 1,7 @@
.git
.gitmodules
*.md
src/client_data
src/data
src/database
src/world_database

A  => .gitignore +12 -0
@@ 1,12 @@
/backup/*
/config/mangosd.conf
/config/realmd.conf
/docker-compose.yml
/src/ccache/*
/src/client_data/*
/src/data/*
/src/world_database/*
/vmangos/*
development
*.bak
!/**/.gitkeep

A  => .gitmodules +8 -0
@@ 1,8 @@
[submodule "src/core"]
	path = src/core
	url = https://github.com/vmangos/core
	branch = development
[submodule "src/database"]
	path = src/database
	url = https://github.com/brotalnia/database
	branch = master

A  => 00-create-database-backup.sh +53 -0
@@ 1,53 @@
#!/bin/sh

# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

script_path=$(readlink -f "$0")
repository_path=$(dirname "$script_path")

cd "$repository_path"

echo "[VMaNGOS]: Stopping potentially running containers..."

docker-compose down

echo "[VMaNGOS]: Recreating database container..."

docker-compose up -d vmangos_database

echo "[VMaNGOS]: Waiting a minute for the database to settle..."

sleep 60

echo "[VMaNGOS]: Backing up databases..."

docker-compose exec vmangos_database sh -c \
  'rm -rf /backup/*'
docker-compose exec vmangos_database sh -c \
  'mysqldump -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD mangos > /backup/mangos.sql'
docker-compose exec vmangos_database sh -c \
  'mysqldump -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD characters > /backup/characters.sql'
docker-compose exec vmangos_database sh -c \
  'mysqldump -h 127.0.0.1 -u root -p$MYSQL_ROOT_PASSWORD realmd > /backup/realmd.sql'
docker-compose exec vmangos_database sh -c \
  'chown -R $VMANGOS_USER_ID:$VMANGOS_GROUP_ID /backup'

echo "[VMaNGOS]: Recreating other containers..."

docker-compose up -d

echo "[VMaNGOS]: Backup complete!"

A  => 00-create-or-reset-config-files.sh +32 -0
@@ 1,32 @@
#!/bin/sh

# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

script_path=$(readlink -f "$0")
repository_path=$(dirname "$script_path")

rm -f "$repository_path/config/*.conf"
cp "$repository_path/config/mangosd.conf.example" \
  "$repository_path/config/mangosd.conf"
cp "$repository_path/config/realmd.conf.example" \
  "$repository_path/config/realmd.conf"

rm -f "$repository_path/docker-compose.yml"
cp "$repository_path/docker-compose.yml.example" \
  "$repository_path/docker-compose.yml"

echo "[VMaNGOS]: Config creation complete!"

A  => 00-extract-client-data.sh +115 -0
@@ 1,115 @@
#!/bin/sh

# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Replace if needed; e.g., to match your host user/group ID
user_id=1000
group_id=1000

# Replace with different client version, if required
# See https://github.com/vmangos/core#currently-supported-builds
client_version=5875

# Replace with a different world database import name in case there is an
# update
world_database_import_name=world_full_14_june_2021

script_path=$(readlink -f "$0")
repository_path=$(dirname "$script_path")

cd "$repository_path"

echo "[VMaNGOS]: Stopping potentially running containers..."

docker-compose down

echo "[VMaNGOS]: Cleaning ccache..."

rm -rf ./src/ccache/*

echo "[VMaNGOS]: Updating submodules..."

git submodule update --init --remote --recursive

echo "[VMaNGOS]: Building VMaNGOS..."

docker build \
  --build-arg VMANGOS_USER_ID=$user_id \
  --build-arg VMANGOS_GROUP_ID=$group_id \
  -t vmangos_build \
  -f ./docker/build/Dockerfile .

docker run \
  -v "$repository_path/vmangos:/vmangos" \
  -v "$repository_path/src/database:/database" \
  -v "$repository_path/src/world_database:/world_database" \
  -v "$repository_path/src/ccache:/ccache" \
  -e CCACHE_DIR=/ccache \
  -e VMANGOS_CLIENT=$client_version \
  -e VMANGOS_WORLD=$world_database_import_name \
  -e VMANGOS_THREADS=$((`nproc` > 1 ? `nproc` - 1 : 1)) \
  --rm \
  vmangos_build

echo "[VMaNGOS]: Running client data extractors."
echo "[VMaNGOS]: This will take a long time..."

if [ ! -d "./src/client_data/Data" ]; then
  echo "[VMaNGOS]: Client data missing, aborting extraction."
  exit 1
fi

docker build -t vmangos_extractors -f ./docker/extractors/Dockerfile .

docker run \
  -v "$repository_path/src/client_data:/client_data" \
  --rm \
  vmangos_extractors \
  /opt/vmangos/bin/mapextractor

docker run \
  -v "$repository_path/src/client_data:/client_data" \
  --rm \
  vmangos_extractors \
  /opt/vmangos/bin/vmapextractor

docker run \
  -v "$repository_path/src/client_data:/client_data" \
  --rm \
  vmangos_extractors \
  /opt/vmangos/bin/vmap_assembler

docker run \
  -v "$repository_path/src/client_data:/client_data" \
  -v "$repository_path/src/core/contrib/mmap:/mmap_contrib" \
  --rm \
  vmangos_extractors \
  /opt/vmangos/bin/MoveMapGen --offMeshInput /mmap_contrib/offmesh.txt

# This data isn't used. delete it to avoid confusion
rm -rf ./src/client_data/Buildings

# Remove potentially existing partial data
rm -rf ./src/data/*
mkdir -p "./src/data/$client_version"

mv ./src/client_data/dbc "./src/data/$client_version/"
mv ./src/client_data/maps ./src/data/
mv ./src/client_data/mmaps ./src/data/
mv ./src/client_data/vmaps ./src/data/

echo "[VMaNGOS]: Client data extraction complete!"

A  => 00-install.sh +120 -0
@@ 1,120 @@
#!/bin/sh

# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Replace if needed; e.g., to match your host user/group ID
user_id=1000
group_id=1000

# Replace with different client version, if required
# See https://github.com/vmangos/core#currently-supported-builds
client_version=5875

# Replace with a different world database import name in case there is an
# update
world_database_import_name=world_full_14_june_2021

script_path=$(readlink -f "$0")
repository_path=$(dirname "$script_path")

cd "$repository_path"

echo "[VMaNGOS]: Updating submodules..."

git submodule update --init --remote --recursive

echo "[VMaNGOS]: Building VMaNGOS..."

docker build \
  --build-arg VMANGOS_USER_ID=$user_id \
  --build-arg VMANGOS_GROUP_ID=$group_id \
  -t vmangos_build \
  -f ./docker/build/Dockerfile .

docker run \
  -v "$repository_path/vmangos:/vmangos" \
  -v "$repository_path/src/database:/database" \
  -v "$repository_path/src/world_database:/world_database" \
  -v "$repository_path/src/ccache:/ccache" \
  -e CCACHE_DIR=/ccache \
  -e VMANGOS_CLIENT=$client_version \
  -e VMANGOS_WORLD=$world_database_import_name \
  -e VMANGOS_THREADS=$((`nproc` > 1 ? `nproc` - 1 : 1)) \
  --rm \
  vmangos_build

if [ $(ls -l ./src/data | wc -l) -eq 1 ]; then
  echo "[VMaNGOS]: Extracted client data missing, running extractors."
  echo "[VMaNGOS]: This will take a long time..."

  if [ ! -d "./src/client_data/Data" ]; then
    echo "[VMaNGOS]: Client data missing, aborting installation."
    exit 1
  fi

  docker build -t vmangos_extractors -f ./docker/extractors/Dockerfile .

  docker run \
    -v "$repository_path/src/client_data:/client_data" \
    --rm \
    vmangos_extractors \
    /opt/vmangos/bin/mapextractor

  docker run \
    -v "$repository_path/src/client_data:/client_data" \
    --rm \
    vmangos_extractors \
    /opt/vmangos/bin/vmapextractor

  docker run \
    -v "$repository_path/src/client_data:/client_data" \
    --rm \
    vmangos_extractors \
    /opt/vmangos/bin/vmap_assembler

  docker run \
    -v "$repository_path/src/client_data:/client_data" \
    -v "$repository_path/src/core/contrib/mmap:/mmap_contrib" \
    --rm \
    vmangos_extractors \
    /opt/vmangos/bin/MoveMapGen --offMeshInput /mmap_contrib/offmesh.txt

  # This data isn't used. delete it to avoid confusion
  rm -rf ./src/client_data/Buildings

  # Remove potentially existing partial data
  rm -rf ./src/data/*
  mkdir -p "./src/data/$client_version"

  mv ./src/client_data/dbc "./src/data/$client_version/"
  mv ./src/client_data/maps ./src/data/
  mv ./src/client_data/mmaps ./src/data/
  mv ./src/client_data/vmaps ./src/data/
fi

echo "[VMaNGOS]: Merging database migrations..."

cd ./src/core/sql/migrations
./merge.sh
cd "$repository_path"

echo "[VMaNGOS]: Creating containers..."

docker-compose up -d

echo "[VMaNGOS]: Installation complete!"
echo "[VMaNGOS]: Please wait a few minutes for the database to get built before trying to access it."

A  => 00-start.sh +26 -0
@@ 1,26 @@
#!/bin/sh

# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

script_path=$(readlink -f "$0")
repository_path=$(dirname "$script_path")

cd "$repository_path"

docker-compose up -d

echo "[VMaNGOS]: VMaNGOS has started!"

A  => 00-stop.sh +26 -0
@@ 1,26 @@
#!/bin/sh

# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

script_path=$(readlink -f "$0")
repository_path=$(dirname "$script_path")

cd "$repository_path"

docker-compose down

echo "[VMaNGOS]: VMaNGOS has been stopped (if it was running)!"

A  => 00-update-including-world-database-import.sh +101 -0
@@ 1,101 @@
#!/bin/sh

# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Replace if needed; e.g., to match your host user/group ID
user_id=1000
group_id=1000

# Replace with different client version, if required
# See https://github.com/vmangos/core#currently-supported-builds
client_version=5875

# Replace with a different world database import name in case there is an
# update
world_database_import_name=world_full_14_june_2021

script_path=$(readlink -f "$0")
repository_path=$(dirname "$script_path")

cd "$repository_path"

echo "[VMaNGOS]: Stopping potentially running containers..."

docker-compose down

echo "[VMaNGOS]: Cleaning ccache..."

rm -rf ./src/ccache/*

echo "[VMaNGOS]: Updating submodules..."

git submodule update --init --remote --recursive

echo "[VMaNGOS]: Building VMaNGOS..."

docker build \
  --build-arg VMANGOS_USER_ID=$user_id \
  --build-arg VMANGOS_GROUP_ID=$group_id \
  -t vmangos_build \
  -f ./docker/build/Dockerfile .

docker run \
  -v "$repository_path/vmangos:/vmangos" \
  -v "$repository_path/src/database:/database" \
  -v "$repository_path/src/world_database:/world_database" \
  -v "$repository_path/src/ccache:/ccache" \
  -e CCACHE_DIR=/ccache \
  -e VMANGOS_CLIENT=$client_version \
  -e VMANGOS_WORLD=$world_database_import_name \
  -e VMANGOS_THREADS=$((`nproc` > 1 ? `nproc` - 1 : 1)) \
  --rm \
  vmangos_build

echo "[VMaNGOS]: Merging database migrations..."

cd ./src/core/sql/migrations
./merge.sh
cd "$repository_path"

echo "[VMaNGOS]: Rebuilding containers..."

docker-compose build

echo "[VMaNGOS]: Recreating database container..."

docker-compose up -d vmangos_database

echo "[VMaNGOS]: Waiting a minute for the database to settle..."

sleep 60

echo "[VMaNGOS]: Importing database updates..."

docker-compose exec vmangos_database sh -c \
  '[ -e /opt/vmangos/sql/world_database/$VMANGOS_WORLD.sql ] && mysql -u root -p$MYSQL_ROOT_PASSWORD < /sql/regenerate-world-db.sql && mysql -u root -p$MYSQL_ROOT_PASSWORD mangos < /opt/vmangos/sql/world_database/$VMANGOS_WORLD.sql'
docker-compose exec vmangos_database sh -c \
  '[ -e /opt/vmangos/sql/migrations/world_db_updates.sql ] && mysql -u root -p$MYSQL_ROOT_PASSWORD mangos < /opt/vmangos/sql/migrations/world_db_updates.sql'
docker-compose exec vmangos_database sh -c \
  '[ -e /opt/vmangos/sql/migrations/characters_db_updates.sql ] && mysql -u root -p$MYSQL_ROOT_PASSWORD characters < /opt/vmangos/sql/migrations/characters_db_updates.sql'
docker-compose exec vmangos_database sh -c \
  '[ -e /opt/vmangos/sql/migrations/logon_db_updates.sql ] && mysql -u root -p$MYSQL_ROOT_PASSWORD realmd < /opt/vmangos/sql/migrations/logon_db_updates.sql'

echo "[VMaNGOS]: Recreating other containers..."

docker-compose up -d

echo "[VMaNGOS]: Update complete!"

A  => 00-update.sh +109 -0
@@ 1,109 @@
#!/bin/sh

# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Replace if needed; e.g., to match your host user/group ID
user_id=1000
group_id=1000

# Replace with different client version, if required
# See https://github.com/vmangos/core#currently-supported-builds
client_version=5875

# Replace with a different world database import name in case there is an
# update
world_database_import_name=world_full_14_june_2021

script_path=$(readlink -f "$0")
repository_path=$(dirname "$script_path")

cd "$repository_path"

echo "[VMaNGOS]: Stopping potentially running containers..."

docker-compose down

echo "[VMaNGOS]: Cleaning ccache..."

rm -rf ./src/ccache/*

echo "[VMaNGOS]: Updating submodules..."

git submodule update --init --remote --recursive

echo "[VMaNGOS]: Building VMaNGOS..."

docker build \
  --build-arg VMANGOS_USER_ID=$user_id \
  --build-arg VMANGOS_GROUP_ID=$group_id \
  -t vmangos_build \
  -f ./docker/build/Dockerfile .

docker run \
  -v "$repository_path/vmangos:/vmangos" \
  -v "$repository_path/src/database:/database" \
  -v "$repository_path/src/world_database:/world_database" \
  -v "$repository_path/src/ccache:/ccache" \
  -e CCACHE_DIR=/ccache \
  -e VMANGOS_CLIENT=$client_version \
  -e VMANGOS_WORLD=$world_database_import_name \
  -e VMANGOS_THREADS=$((`nproc` > 1 ? `nproc` - 1 : 1)) \
  --rm \
  vmangos_build

if [ $(ls -l ./src/world_database | wc -l) -gt 2 ]; then
  echo "[VMaNGOS]: It looks like there is a new world database import; aborting update."
  echo "[VMaNGOS]: Please manually update by first checking the file name of the new world database import in ./src/world_database. You will need that file name (without the .sql extension!) in the following steps."
  echo "[VMaNGOS]: Then, replace occurrences of \"world_database_import_name=$world_database_import_name\" with \"world_database_import_name=<new world database import file name>\" throughout the repository."
  echo "[VMaNGOS]: After that, adjust the \"VMANGOS_WORLD\" environment variable for the vmangos_database service in docker-compose.yml too."
  echo "[VMaNGOS]: Finally, delete ./src/world_database/$world_database_import_name.sql and run 00-update-including-world-database-import.sh instead of 00-update.sh."
  echo "[VMaNGOS]: It is recommended to create a database backup before doing this."
  exit 1
fi

echo "[VMaNGOS]: Merging database migrations..."

cd ./src/core/sql/migrations
./merge.sh
cd "$repository_path"

echo "[VMaNGOS]: Rebuilding containers..."

docker-compose build

echo "[VMaNGOS]: Recreating database container..."

docker-compose up -d vmangos_database

echo "[VMaNGOS]: Waiting a minute for the database to settle..."

sleep 60

echo "[VMaNGOS]: Importing database updates..."

docker-compose exec vmangos_database sh -c \
  '[ -e /opt/vmangos/sql/migrations/world_db_updates.sql ] && mysql -u root -p$MYSQL_ROOT_PASSWORD mangos < /opt/vmangos/sql/migrations/world_db_updates.sql'
docker-compose exec vmangos_database sh -c \
  '[ -e /opt/vmangos/sql/migrations/characters_db_updates.sql ] && mysql -u root -p$MYSQL_ROOT_PASSWORD characters < /opt/vmangos/sql/migrations/characters_db_updates.sql'
docker-compose exec vmangos_database sh -c \
  '[ -e /opt/vmangos/sql/migrations/logon_db_updates.sql ] && mysql -u root -p$MYSQL_ROOT_PASSWORD realmd < /opt/vmangos/sql/migrations/logon_db_updates.sql'

echo "[VMaNGOS]: Recreating other containers..."

docker-compose up -d

echo "[VMaNGOS]: Update complete!"

A  => LICENSE +661 -0
@@ 1,661 @@
GNU AFFERO GENERAL PUBLIC LICENSE
   Version 3, 19 November 2007

Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

        Preamble

The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

The precise terms and conditions for copying, distribution and
modification follow.

   TERMS AND CONDITIONS

0. Definitions.

"This License" refers to version 3 of the GNU Affero General Public License.

"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

"The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

A "covered work" means either the unmodified Program or a work based
on the Program.

To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

1. Source Code.

The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

The Corresponding Source for a work in source code form is that
same work.

2. Basic Permissions.

All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

4. Conveying Verbatim Copies.

You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.

b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7.  This requirement modifies the requirement in section 4 to
"keep intact all notices".

c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy.  This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged.  This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.

d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.

A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

6. Conveying Non-Source Forms.

You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.

b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.

c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source.  This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.

d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge.  You need not require recipients to copy the
Corresponding Source along with the object code.  If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source.  Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.

e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.

A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

7. Additional Terms.

"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or

b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or

c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or

d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or

e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or

f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.

All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

8. Termination.

You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

9. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

11. Patents.

A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.

If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

13. Remote Network Interaction; Use with the GNU General Public License.

Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

14. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

15. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

 END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year>  <name of author>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.

A  => README.md +178 -0
@@ 1,178 @@
# vmangos-docker

> A Docker setup for VMaNGOS

This is a simple Docker setup for [VMaNGOS][vmangos]. It is heavily inspired by
[tonymmm1/vmangos-docker][tonymmm1-vmangos-docker], which has some good ideas,
but, in my opinion, falls a bit flat in execution.

In particular, I did not like the convoluted Python script used to control
everything, the lack of an easy way to back up the databases, a missing
built-in solution to extract client data and the fact that all the containers
are executed as root, causing potential security issues and permission
headaches on the host; among other, more minor things.

## Install

### Dependencies

+ [Docker][docker]
+ [Docker Compose][docker-compose]
+ A POSIX-compliant shell as well as various core utilities (such as `cp` and
  `rm`) if you intend to use the provided scripts to install, update and manage
  VMaNGOS

### Preface

This assumed client version is `5875` (patch `1.12.1`); if you want to set up
VMaNGOS to use a different version, search the provided `00`-prefixed scripts
for occurrences of `client_version=5875` and modify them accordingly. You will
also have to adjust the `./src/data/5875:/opt/vmangos/bin/5875:ro` bind mount
for the `vmangos_mangos` service in `./docker-compose.yml` accordingly.

The user that is used inside the containers has UID `1000` and GID `1000` by
default. You can adjust this, if needed; e.g., to match your host UID/GID. This
requires searching the scripts for `user_id=1000` and `group_id=1000` and
modifying these values as well as adjusting the environment variables
`VMANGOS_USER_ID` and `VMANGOS_GROUP_ID`in `./docker-compose.yml`.

### Instructions

First, clone the repository, initialize the submodules and generate the config
files:

```sh
user@local:~$ git clone https://git.sr.ht/~mser/vmangos-docker
user@local:~$ cd vmangos-docker
user@local:vmangos-docker$ git submodule update --init --remote --recursive
user@local:vmangos-docker$ ./00-create-or-reset-config-files.sh
```

At this point, you have to adjust the two configuration files in `./config` as
well as `./docker-compose.yml` for your desired setup. The default setup will
only allow local connections (from the same machine). To make the server
public, it is required to change the `VMANGOS_REALM_IP` environment variable
for the `vmangos_database` service in `./docker-compose.yml`. Simply replace
`127.0.0.1` with the server's WAN IP (or LAN IP, if you don't want to make it
accessible over the Internet).

VMaNGOS also requires some data generated/extracted from the client to work
correctly. To generate that data automatically during the installation, copy
the contents of your World of Warcraft client directory into
`./src/client_data`.

After that, simply execute the installer:

```sh
user@local:vmangos-docker$ ./00-install.sh
```

Note that generating the required data will take many hours (depending on your
hardware). Some notices/errors during the generation are normal and nothing to
worry about.

Alternatively, if you have acquired the extracted/generated data previously,
you can place it directly into `./src/data`, in which case the installer will
skip extracting/generating the data.

After the installer has finished, you should have a running installation and
can create your first account by attaching to the `vmangos_mangos` service:

```sh
user@local:vmangos-docker$ docker attach vmangos_mangos
```

After attaching, create the account and assign an account level:

```sh
account create <account name> <account password>
account set gmlevel <account name> <account level> # see https://github.com/vmangos/core/blob/79efe80ae39d94a5e52b71179583509b1df75899/src/shared/Common.h#L184-L191
```

When you are done, detach from the Docker container by pressing
<kbd>Ctrl</kbd>+<kbd>P</kbd> and <kbd>Ctrl</kbd>+<kbd>Q</kbd>.

## Usage

For your convenience, a number of shell scripts are provided to keep managing
your VMaNGOS installation simple, without requiring detailed knowledge about
how VMaNGOS or Docker work.

These scripts are all in the root directory of this repository and prefixed
with `00` (so they are grouped together when viewing the directory).

I recommend taking a look at them to understand how they work and, if needed,
modifying them to better suit your needs.

### Starting and stopping VMaNGOS

VMaNGOS can be started and stopped using the following scripts:

```sh
user@local:vmangos-docker$ ./00-start.sh
user@local:vmangos-docker$ ./00-stop.sh
```

### Updating

Updating can be done via the provided update script. This will update the
submodules, rebuild the Docker images and run databases migrations:

```sh
user@local:vmangos-docker$ ./00-update.sh
```

If the update script fails with the notice that there is new world database
import, simply follow the instructions that are also printed in such a case.

At times, this repository might also get updated. Please do not blindly run
`git pull` without looking at the commits to see what (potentially breaking)
changes have been introduced.

### Creating a database backup

The three important databases VMaNGOS uses, `mangos`, `characters` and
`realmd`, can be exported as SQL dumps with the following script:

```sh
user@local:vmangos-docker$ ./00-create-database-backup.sh
```

The dumped databases can, by default, be found in `./backup`. If you want to
change that path, adjust the `./backup:/backup` bind mount for the
`vmangos_database` service in `./docker-compose.yml` accordingly.

### Extracting client data

If at any point after the initial installation you need to re-extract the
client data, you can do so by running the following script:

```sh
user@local:vmangos-docker$ ./00-extract-client-data.sh
```

Note that this will also remove any existing data in `./src/data`, so make sure
to create a backup of that in case you want to save it.

## Maintainer

[Michael Serajnik][maintainer]

## Contribute

You are welcome to help out!

[Open a ticket][tickets] or [send a patch][patches].

## License

[AGPL-3.0-or-later](LICENSE) © Michael Serajnik

[vmangos]: https://github.com/vmangos/core
[tonymmm1-vmangos-docker]: https://github.com/tonymmm1/vmangos-docker
[docker]: https://docs.docker.com/get-docker/
[docker-compose]: https://docs.docker.com/compose/install/

[maintainer]: https://sr.ht/~mser/
[tickets]: https://todo.sr.ht/~mser/vmangos-docker
[patches]: https://lists.sr.ht/~mser/public-inbox

A  => backup/.gitkeep +0 -0
A  => config/mangosd.conf.example +2890 -0
@@ 1,2890 @@
#####################################
# MaNGOS Configuration file         #
#####################################

[MangosdConf]
ConfVersion=2010100901

###################################################################################################################
# CONNECTIONS AND DIRECTORIES
#
#    RealmID
#        RealmID must match the realmlist inside the realmd database
#
#    DataDir
#        Data directory setting.
#        Important: DataDir needs to be quoted, as it is a string which may contain space characters.
#        Example: "/opt/vmangos/share/mangos"
#
#    LogsDir
#        Logs directory setting.
#        Important: Logs dir must exists, or all logs need to be disabled
#        Default: "" - no log directory prefix. if used log names aren't absolute paths
#                      then logs will be stored in the current directory of the running program.
#
#	HonorDir
#		Folder to store HCR files. These are logs of weekly honor calculation.
#		By default logs are stored in the current directory of the running program.
#
#    LoginDatabase.Info
#    WorldDatabase.Info
#    CharacterDatabase.Info
#    LogsDatabase.Info
#        Database connection settings for the world server.
#        Default:
#                ---MYSQL---
#                    hostname;port;username;password;database
#                    .;somenumber;username;password;database - use named pipes at Windows
#                        Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini
#                    .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux
#                ---PGSQL---
#                    hostname;port;username;password;database
#                    .;/path/to/unix_socket/DIRECTORY or . for default path;username;password;database - use Unix sockets at Unix/Linux
#
#	LoginDatabase.Connections
#	WorldDatabase.Connections
#	CharacterDatabase.Connections
#   LogsDatabase.Connections
#		 Amount of connections to database which will be used for SELECT queries. Maximum 16 connections per database.
#		 Default: 1 connection for SELECT statements
#
#   LoginDatabase.WorkerThreads
#   WorldDatabase.WorkerThreads
#   CharacterDatabase.WorkerThreads
#   LogsDatabase.WorkerThreads
#        Amount of async threads (with dedicated connection) which will be used for async SELECT, executes, and transactions.
#        Default: 1 async worker
#
#    MaxPingTime
#        Settings for maximum database-ping interval (minutes between pings)
#
#    WorldServerPort
#        Port on which the server will listen
#
#    BindIP
#        Bind World Server to IP/hostname
#        This option is useful for running multiple worldd/realmd instances
#        on different IP addresses using default ports.
#        DO NOT CHANGE THIS UNLESS YOU _REALLY_ KNOW WHAT YOU'RE DOING
#
###################################################################################################################

RealmID = 1
DataDir = "."
LogsDir = ""
HonorDir = ""
LoginDatabase.Info              = "vmangos_database;3306;mangos;mangos;realmd"
LoginDatabase.Connections       = 1
LoginDatabase.WorkerThreads     = 1
WorldDatabase.Info              = "vmangos_database;3306;mangos;mangos;mangos"
WorldDatabase.Connections       = 1
WorldDatabase.WorkerThreads     = 1
CharacterDatabase.Info          = "vmangos_database;3306;mangos;mangos;characters"
CharacterDatabase.Connections   = 1
CharacterDatabase.WorkerThreads = 1
LogsDatabase.Info               = "vmangos_database;3306;mangos;mangos;logs"
LogsDatabase.Connections        = 1
LogsDatabase.WorkerThreads      = 1
MaxPingTime = 30
WorldServerPort = 8085
BindIP = "0.0.0.0"

###################################################################################################################
# PERFORMANCE SETTINGS
#
#    UseProcessors
#        Used processors mask for multi-processors system (Used only at Windows)
#        Default: 0 (selected by OS)
#                 number (bitmask value of selected processors)
#
#    ProcessPriority
#        Process priority setting (Used only at Windows)
#        Default: 1 (HIGH)
#                 0 (Normal)
#
#    Compression
#        Compression level for update packages sent to client (1..9)
#        Default: 1 (speed)
#                 9 (best compression)
#
#    PlayerLimit
#        Initial realm capacity. Excluding Mods, GM's and Admins
#        Default: 100
#                 0 (for infinite players)
#                -1 (for Mods, GM's and Admins only)
#                -2 (for GM's and Admins only)
#                -3 (for Admins only)
#
#    PlayerHardLimit
#        Maximum number of players in the world, after increasing PlayerLimit with LoginPerTick.
#        Default: 0 - Disabled. No population limit.
#
#    LoginQueue.GracePeriodSecs
#        How many seconds after last logout can we login and skip the queue
#        Default: 0 - Disabled
#
#    LoginPerTick
#        Maximum number of players allowed to login from the queue during a world update tick (~every 100 ms)
#        WARNING: Overwrites $PlayerLimit value.
#        Default: 0 (disabled)
#
#    CharacterScreenMaxIdleTime
#        Number of seconds to allow for players to remain on the character screen before disconnecting
#        Default: 0 - Disabled
#
#    SaveRespawnTimeImmediately
#        Save respawn time for creatures at death and for gameobjects at use/open
#        Default: 1 (save creature/gameobject respawn time without waiting grid unload)
#                 0 (save creature/gameobject respawn time at grid unload)
#
#    MaxOverspeedPings
#        Maximum overspeed ping count before player kick (minimum is 2, 0 used to disable check)
#        Default: 2
#
#    GridUnload
#        Unload grids (if you have lot memory you can disable it to speed up player move to new grids second time)
#        Default: 1 (unload grids)
#                 0 (do not unload grids)
#
#    GridCleanUpDelay
#        Grid clean up delay (in milliseconds)
#        Default: 300000 (5 min)
#
#    MapUpdateInterval
#        Map update interval (in milliseconds)
#        Default: 100
#
#    ChangeWeatherInterval
#        Weather update interval (in milliseconds)
#        Default: 600000 (10 min)
#
#    PlayerSave.Interval
#        Player save interval (in milliseconds)
#        Default: 900000 (15 min)
#
#    PlayerSave.Stats.MinLevel
#        Minimum level for saving character stats for external usage in database
#        Default: 0  (do not save character stats)
#                 1+ (save stats for characters with level 1+)
#
#    PlayerSave.Stats.SaveOnlyOnLogout
#        Enable/Disable saving of character stats only on logout
#        Default: 1 (only save on logout)
#                 0 (save on every player save)
#
#    Terrain.Preload.Continents
#    Terrain.Preload.Instances
#        Enable/Disable to load all terrain data on server startup
#        Recommended value: 1. Else, can cause crashes if 'MapUpdate.Threads' > 1 (one map loads a tile, while the other uses pathfinding etc ...)
#        Disable on dev realms to speedup startup by 90%.
#        Default: 0
#
#    vmap.enableLOS
#    vmap.enableHeight
#        Enable/Disable VMaps support for line of sight and height calculation
#        You need to extract the VMaps in order to enable those options
#        Default: 1 (true)
#                 0 (false)
#
#    vmap.ignoreSpellIds
#        These spells are ignored for LoS calculation
#        List of ids with delimiter ','
#
#    vmap.enableIndoorCheck
#        Enable/Disable VMap based indoor check to remove outdoor-only auras (mounts etc.).
#        Requires VMaps enabled to work.
#        Default: 1 (Enabled)
#                 0 (Disabled)
#
#    mmap.enabled
#        Enable/Disable pathfinding using mmaps
#        Default: 1 (Enabled)
#                 0 (Disabled)
#
#    Collision.Models.Unload
#        Free model when no one uses it anymore
#        Default: 1 (Enabled)
#                 0 (Disabled)
#
#    DetectPosCollision
#        Check final move position, summon position, etc for visible collision with other objects or
#        wall (wall only if vmaps are enabled)
#        Default: 1 (enable, requires more CPU power)
#                 0 (disable, not so nice position selection but will require less CPU power)
#
#    TargetPosRecalculateRange
#        Max distance from movement target point (+moving unit size) and targeted object (+size)
#        after that new target movement point calculated. Max: melee attack range (5), min: contact range (0.5)
#        More distance let have better performence, less distance let have more sensitive reaction at target move.
#        Default: 1.5
#
#    UpdateUptimeInterval
#        Update realm uptime period in minutes (for save data in 'uptime' table). Must be > 0
#        Default: 10 (minutes)
#
#    MaxCoreStuckTime
#        Periodically check if the process got freezed, if this is the case force crash after the specified
#        amount of seconds. Must be > 0. Recommended > 10 secs if you use this.
#        Default: 0 (Disabled)
#
#    BanListReloadTimer
#        Time between 'ip_banned' / 'account_banned' reload. Useful in multi realm cases.
#        Default: 120
#
#    AddonChannel
#        Permit/disable the use of the addon channel through the server
#        (some client side addons can stop work correctly with disabled addon channel)
#        Default: 1 (permit addon channel)
#                 0 (do not permit addon channel)
#
#    CleanCharacterDB
#        Perform character db cleanups on start up
#        Default: 1 (Enable)
#                 0 (Disabled)
#
###################################################################################################################

UseProcessors = 0
ProcessPriority = 1
Compression = 1
PlayerLimit = 100
PlayerHardLimit = 0
LoginQueue.GracePeriodSecs = 0
LoginPerTick = 0
CharacterScreenMaxIdleTime = 900
SaveRespawnTimeImmediately = 1
MaxOverspeedPings = 2
GridUnload = 0
GridCleanUpDelay = 300000
CleanupTerrain = 1
MapUpdateInterval = 100
ChangeWeatherInterval = 600000
PlayerSave.Interval = 900000
PlayerSave.Stats.MinLevel = 0
PlayerSave.Stats.SaveOnlyOnLogout = 1
Terrain.Preload.Continents = 0
Terrain.Preload.Instances  = 0
vmap.enableLOS = 1
vmap.enableHeight = 1
vmap.ignoreSpellIds = "7720"
vmap.enableIndoorCheck = 1
vmap.petLOS = 1
mmap.enabled = 1
Collision.Models.Unload = 1
DetectPosCollision = 1
TargetPosRecalculateRange = 1.5
UpdateUptimeInterval = 10
MaxCoreStuckTime = 0
BanListReloadTimer = 120
AddonChannel = 1
CleanCharacterDB = 1

# Optimization / load mitigation settings
Continents.Instanciate                      = 0
Continents.InactivePlayers.SkipUpdates      = 0
MapUpdate.ReduceGridActivationDist.Tick     = 0
MapUpdate.IncreaseGridActivationDist.Tick   = 0
MapUpdate.MinGridActivationDistance         = 0
MapUpdate.ReduceVisDist.Tick                = 0
MapUpdate.IncreaseVisDist.Tick              = 0
MapUpdate.MinVisibilityDistance             = 0

# Maps with no player for more than $UpdateTime (ms) will no longer be updated (0 to disable)
MapUpdate.Empty.UpdateTime                  = 0

# Per-map threading
MapUpdate.Instanced.UpdateThreads       = 2

# Per-map subthreads (not for instanced maps)
MapUpdate.ObjectsUpdate.MaxThreads      = 4
MapUpdate.ObjectsUpdate.Timeout         = 100
MapUpdate.VisibilityUpdate.MaxThreads   = 4
MapUpdate.VisibilityUpdate.Timeout      = 100

# Hardcode multithreading options
MapUpdate.UpdatePacketsDiff             = 100
MapUpdate.UpdatePlayersDiff             = 100
MapUpdate.UpdateCellsDiff               = 100

# Parallelized execution of cells from same map
#   MTCells.Threads       Number of different cells to update at the sametime
#   MTCells.SafeDistance  2 cells wont be updated at the same time if they are at an inferior distance from each other (thread race issues)
MapUpdate.Continents.MTCells.Threads               = 0
MapUpdate.Continents.MTCells.SafeDistance          = 1066
Continents.MotionUpdate.Threads         = 0

# Number of threads for async tasks (/who, list AH items ...)
AsyncTasks.Threads                      = 1
AsyncQueriesTickTimeout = 0

# Movement extrapolation system - not stable now
Movement.ExtrapolateChargePosition = 1
Movement.ExtrapolatePetPosition = 1

# Delayed repositionning checks (mounts inside / swimming ...). 0 to disable.
Movement.RelocationVmapsCheckDelay = 0
Movement.MaxPointsPerPacket = 80

###################################################################################################################
# ANTICRASH CONFIGURATION
#
#    Anticrash.Options
#        Flag values: 1 announce, 2 save all, 4 crash instances, 8 crash continents, coredump 16
#        Default: 28
#
#    Anticrash.Rearm.Timer
#        Timer between 2 crashes to be protected by anticrash
#        Default: 60000
#                 0 - disable automatic rearm
#
###################################################################################################################

Anticrash.Options = 28
Anticrash.Rearm.Timer = 60000

###################################################################################################################
#
# PROGRESSION CONFIG
#    NOTE: Generally not applicable to database-set progression fields, except for the WowPatch which
#          defines which data is loaded from the database.
#
#
#    WowPatch
#        The current patch the server targets for quest, NPC, dungeon and raid availability.
#        1.2   = 0
#        1.3   = 1
#        1.4   = 2
#        1.5   = 3
#        1.6   = 4
#        1.7   = 5
#        1.8   = 6
#        1.9   = 7
#        1.10  = 8
#        1.11  = 9
#        1.12  = 10
#
#    PvP.AccurateEquipRequirements
#        Whether to enforce Blizzlike PVP rank requirements to equip PVP gear before patch 1.6.
#        Default: 1
#
#    PvP.AccuratePurchaseRequirements
#        Whether to enforce Blizzlike PVP rank requirements to purchase PVP gear (i.e. lifetime or current rank).
#        Default: 1 (require current rank)
#
#    PvP.AccurateTimeline
#        Whether to enforce accurate PVP timelines. eg. the honour system was not implemented before patch 1.4.
#        If set, players will be unable to gain rank until the appropriate patch.
#        Default: 1
#
#    PvP.AccurateRewards
#        Whether to alter PVP reputation and honorable kill rewards based on patch (changed several times).
#        Default: 1
#
#    PvP.DishonorableKills
#        Whether to give dishonorable kills to players who kill civilians.
#        Default: 1
#
#    PvP.CityProtector
#        Whether to assign City Protector titles on honor update or not.
#        Default: 0
#
#    Progression.AccuratePetStatistics
#        Whether to allow Blizzlike pet statistic (damage, speed, resists) progression.
#        Default: 1
#
#    Progression.AccurateLFGAvailability
#        If set, disables the LFG system pre-1.3
#        Default: 1
#
#    Progression.AccuratePVEEvents
#        Whether to apply progressional changes in PVE events (NOT boss scripts). These are events which
#        affect quests and other scripted scenes.
#        Default: 1
#
#    Progression.AccurateSpellEffects
#        Whether to accurately portray changes in spell effects (eg. Deviate Fish). NOT applicable to effects
#        which change their functionality (eg. spell changed) or values between patches. Only affects
#        spells which had effects added or removed which still exist in the game client.
#        Default: 1
#
#    Progression.RestoreDeletedItems
#        Whether to automatically restore items which were previously deleted because no item template with
#        this entry existed on that content patch. Players will receive the item in the mail once it has been
#        added to the game.
#        Default: 1
#
#    Progression.NoRespecPriceDecay
#        If set, the talent respec cost will not decay until patch 1.11 when the monthly reduction was added.
#        Default: 1
#
#    Progression.NoQuestXpToGold
#        If set, quest xp gained at max level will not be converted to gold until patch 1.10 when the feature was added.
#        Default: 1
#
#    Progression.UnlinkedAuctionHouses
#        If set, every auction house is separate until patch 1.9. Does not apply to goblin auction houses.
#        Default: 1
#
#    DebuffLimit
#        How many debuffs can be present on a target simultaneously
#        Default: 0  - Decide automatically based on patch
#                      In patch 1.7 the limit was increased from 8 to 16
#
###################################################################################################################

WowPatch = 10

PvP.AccurateEquipRequirements = 1
PvP.AccuratePurchaseRequirements = 1
PvP.AccurateTimeline = 1
PvP.AccurateRewards = 1
PvP.DishonorableKills = 1
PvP.CityProtector = 0

Progression.RestoreDeletedItems = 1
Progression.AccuratePetStatistics = 1
Progression.AccurateLFGAvailability = 1
Progression.AccuratePVEEvents = 1
Progression.AccurateSpellEffects = 1
Progression.NoRespecPriceDecay = 1
Progression.NoQuestXpToGold = 1
Progression.UnlinkedAuctionHouses = 1
DebuffLimit = 0

###################################################################################################################
# SERVER LOGGING
#
#    LogSQL
#        Enable logging of GM commands - all SQL code will be written to a log file
#        All commands are written to a file: YYYY-MM-DD_logSQL.sql
#        If a new day starts (00:00:00), a new file is created - the old file will not be deleted.
#        Default: 1 - Write SQL code to logfile
#                 0 - Do not log
#
#    PidFile
#        World daemon PID file
#        Default: ""             - do not create PID file
#                 "./worldd.pid" - create PID file (recommended name)
#
#    LogLevel
#        Server console level of logging
#        0 = Minimum; 1 = Basic&Error; 2 = Detail; 3 = Full/Debug
#        Default: 3
#
#    LogTime
#        Include time in server console output [hh:mm:ss]
#        Default: 0 (no time)
#                 1 (print time)
#
#    LogFile
#        Logfile name
#        Default: "Server.log"
#                 "" - Empty name disable creating log file
#
#    LogTimestamp
#        Logfile with timestamp of server start in name
#        Default: 0 - no timestamp in name
#                 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
#
#    LogFileLevel
#        Server file level of logging
#        0 = Minimum; 1 = Error; 2 = Detail; 3 = Full/Debug
#        Default: 0
#
#    LogFilter_TransportMoves
#    LogFilter_CreatureMoves
#    LogFilter_VisibilityChanges
#    LogFilter_Weather
#    LogFilter_DbStrictedCheck
#        Log filters (active by default)
#        Default: 1 - not include with any log level
#                 0 - include in log if log level permit
#
#    LogFilter_PeriodicAffects
#    LogFilter_PlayerMoves
#    LogFilter_SQLText
#    LogFilter_AIAndMovegens
#    LogFilter_PlayerStats
#    LogFilter_Damage
#    LogFilter_Combat
#    LogFilter_SpellCast
#        Log filters (disabled by default, mostly debug only output affected cases)
#        Default: 0 - include in log if log level permit
#                 1 - not include with any log level
#
#    AnticheatLogFile
#        Log file for anticheat check results
#        Default: "anticheat.log"
#
#    AnticheatLogTimestamp
#        Logfile with timestamp of server start in name
#        Default: 0 - no timestamp in name
#                 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
#
#    WardenLogFile
#        Log file for warden check results
#        Default: "warden.log"
#
#    WardenLogTimestamp
#        Logfile with timestamp of server start in name
#        Default: 0 - no timestamp in name
#                 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
#
#    WorldLogFile
#        Packet logging file for the worldserver
#        Default: "world.log"
#
#    WorldLogTimestamp
#        Logfile with timestamp of server start in name
#        Default: 0 - no timestamp in name
#                 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
#
#    DBErrorLogFile
#        Log file of DB errors detected at server run
#        Default: "DBErrors.log"
#
#    DBErrorFixFile
#        Log file of SQL requests to apply to fix detected database errors
#        Default: ""
#
#    CharLogFile
#        Character operations logfile name
#        Default: "Char.log"
#                 "" - Empty name disable creating log file
#
#    CharLogTimestamp
#        Log file with timestamp of server start in name
#        Default: 0 - no timestamp in name
#                 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
#
#    CharLogDump
#        Write character dump before deleting in Char.log
#        For restoration, cut character data from log starting from
#        line == START DUMP == to line == END DUMP == (without its) in file and load it using loadpdump command
#        Default: 0 - don't include dumping chars to log
#                 1 - include dumping chars to log
#
#    ChatLogEnable
#        Enable or disable logging of player chat.
#        Default: 1
#
#    ChatLogFile
#        Log file for player chat.
#        Default: "Chat.log"
#
#    ChatLogTimestamp
#        Add time stamp to logged chat messages.
#        Default: 0
#
#    BgLogFile
#        Log file for battlegrounds system.
#        Default: "bg.log"
#
#    BgLogTimestamp
#        Add time stamp to battleground logs.
#        Default: 0
#
#    GmLogFile
#        GM Log file of gm commands
#        Default: "" (Disable)
#
#    GmLogTimestamp
#        GM Logfile with timestamp of server start in name
#        Default: 0 - no timestamp in name
#                 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
#
#    GmLogPerAccount
#        GM Logfiles with GM account id (Note: logs not created if GmLogFile not set)
#        Default: 0 - add gm log data to single log file
#                 1 - add gm log data to account specific log files with name
#                     in form Logname_#ID_YYYY-MM-DD_HH-MM-SS.Ext
#                     or form Logname_#ID.Ext
#
#    CriticalCommandsLogFile
#        Log file for commands marked as critical, when used on own character (same IP for example)
#        Default: "gm_critical.log"
#                 "" - Empty name for disable
#
#    ExploitsLogFile
#        Log file for possible exploits for abuse detection
#        Default: "" - Empty name for disable
#
#    RaLogFile
#        Log file of RA commands
#        Default: "Ra.log"
#                 "" - Empty name for disable
#
#    LogColors
#        Color for messages (format "normal_color details_color debug_color error_color")
#        Colors: 0 - BLACK, 1 - RED, 2 - GREEN,  3 - BROWN, 4 - BLUE, 5 - MAGENTA, 6 -  CYAN, 7 - GREY,
#                8 - YELLOW, 9 - LRED, 10 - LGREEN, 11 - LBLUE, 12 - LMAGENTA, 13 - LCYAN, 14 - WHITE
#        Default: "" - none colors
#        Example: "13 7 11 9"
#
#    LogsDB.Chat
#        Enable or disable database chat logs.
#        Default: 0
#
#    LogsDB.Characters
#        Enable or disable database character logs.
#        Default: 0
#
#    LogsDB.Trades
#        Enable or disable database trade logs.
#        Default: 0
#
#    LogsDB.Transactions
#        Enable or disable database transaction logs.
#        Default: 0
#
#    LogsDB.Battlegrounds
#        Enable or disable database battleground logs.
#        Default: 0
#
###################################################################################################################

LogSQL = 1
PidFile = ""
LogLevel = 1
LogTime = 0
LogFile = "Server.log"
LogTimestamp = 0
LogFileLevel = 1
LogFilter_TransportMoves = 1
LogFilter_CreatureMoves = 1
LogFilter_VisibilityChanges = 1
LogFilter_Weather = 1
LogFilter_PlayerStats = 0
LogFilter_SQLText = 0
LogFilter_PlayerMoves = 0
LogFilter_PeriodicAffects = 0
LogFilter_AIAndMovegens = 0
LogFilter_Damage = 0
LogFilter_Combat = 0
LogFilter_SpellCast = 0
LogFilter_DbStrictedCheck = 1
LogFilter_Pathfinding = 0
LogFilter_Honor = 1
AnticheatLogFile = "anticheat.log"
AnticheatLogTimestamp = 0
WardenLogFile = "warden.log"
WardenLogTimestamp = 0
WorldLogFile = ""
WorldLogTimestamp = 0
HonorLogFile = ""
HonorLogTimestamp = 0
DBErrorLogFile = "DBErrors.log"
DBErrorFixFile = ""
ClientIdsLogFile = "client.log"
LootsLogFile = "loot.log"
LevelupLogFile = "levelup.log"
LogMoneyTrades = "trades.log"
LogMoneyTreshold = 10000
CharLogFile = "Char.log"
CharLogTimestamp = 0
CharLogDump = 0
ChatLogFile = "Chat.log"
ChatLogEnable = 1
ChatLogTimestamp = 0
BgLogFile = "bg.log"
BgLogTimestamp = 0
GmLogFile = ""
GmLogTimestamp = 0
GmLogPerAccount = 0
CriticalCommandsLogFile = "gm_critical.log"
ExploitsLogFile = ""
RaLogFile = ""
NostalriusLogFile = "Info.log"
NostalriusLogTimestamp = 0
LogColors = ""

LogsDB.Chat                 = 0
LogsDB.Characters           = 0
LogsDB.Trades               = 0
LogsDB.Transactions         = 0
LogsDB.Battlegrounds        = 0

PerformanceLog.File                     = "perf.log"
PerformanceLog.SlowWorldUpdate          = 100
PerformanceLog.SlowMapSystemUpdate      = 100
PerformanceLog.SlowSessionsUpdate       = 100
PerformanceLog.SlowUniqueSessionUpdate  = 20
PerformanceLog.SlowMapUpdate            = 100
PerformanceLog.SlowAsynQueries          = 100
PerformanceLog.SlowPackets              = 20
PerformanceLog.SlowMapPackets           = 60
PerformanceLog.SlowPacketBroadcast      = 0

###################################################################################################################
# SERVER SETTINGS
#
#    GameType
#        Server realm style
#        0 = NORMAL; 1 = PVP; 4 = NORMAL; 6 = RP; 8 = RPPVP
#        also custom type: 16 FFA_PVP (free for all pvp mode like arena PvP in all zones except rest
#        activated places and sanctuaries)
#
#    RealmZone
#        Server realm zone (set allowed alphabet in character names/etc). See also Strict*Names options.
#        Be careful when changing this as it can cause the realm to not be visible on certain clients.
#
#    1 Development    - any language (Default)
#    2 United States  - extended-Latin
#    3 Oceanic        - extended-Latin
#    4 Latin America  - extended-Latin
#    5 Tournament     - basic-Latin at create, any at login
#    6 Korea          - East-Asian
#    7 Tournament     - basic-Latin at create, any at login
#    8 English        - extended-Latin
#    9 German         - extended-Latin
#    10 French        - extended-Latin
#    11 Spanish       - extended-Latin
#    12 Russian       - Cyrillic
#    13 Tournament    - basic-Latin at create, any at login
#    14 Taiwan        - East-Asian
#    15 Tournament    - basic-Latin at create, any at login
#    16 China         - East-Asian
#    17 CN1           - basic-Latin at create, any at login
#    18 CN2           - basic-Latin at create, any at login
#    19 CN3           - basic-Latin at create, any at login
#    20 CN4           - basic-Latin at create, any at login
#    21 CN5           - basic-Latin at create, any at login
#    22 CN6           - basic-Latin at create, any at login
#    23 CN7           - basic-Latin at create, any at login
#    24 CN8           - basic-Latin at create, any at login
#    25 Tournament    - basic-Latin at create, any at login
#    26 Test Server   - any language
#    27 Tournament    - basic-Latin at create, any at login
#    28 QA Server     - any language
#    29 CN9           - basic-Latin at create, any at login
#
#    TimeZoneOffset
#        Time zone offset in hours
#        0 - UTC (default)
#
#    DBC.Locale
#        DBC Language Settings
#        0 = English; 1 = Korean; 2 = French; 3 = German; 4 = Chinese; 5 = Taiwanese; 6 = Spanish;
#        255 = Auto Detect (Default)
#
#    StrictPlayerNames
#        Limit player name to language specific symbols set, not allow create characters, and set rename request and disconnect at not allowed symbols name
#        Default: 0 disable (but limited server timezone dependent client check)
#                 1 basic latin characters  (strict)
#                 2 realm zone specific (strict). See RealmZone setting.
#                   Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
#                   (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
#                 3 basic latin characters + server timezone specific
#
#    StrictCharterNames
#        Limit guild team charter names to language specific symbols set, not allow create charters with not allowed symbols in name
#        Default: 0 disable
#                 1 basic latin characters  (strict)
#                 2 realm zone specific (strict). See RealmZone setting.
#                   Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
#                   (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
#                 3 basic latin characters + server timezone specific
#
#    StrictPetNames
#        Limit pet names to language specific symbols set
#        Default: 0 disable
#                 1 basic latin characters  (strict)
#                 2 realm zone specific (strict). See RealmZone setting.
#                   Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
#                   (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
#                 3 basic latin characters + server timezone specific
#
#    MinPlayerName
#        Minimal name length (1..12)
#        Default: 2
#
#    MinCharterName
#        Minimal name length (1..24)
#        Default: 2
#
#    MinPetName
#        Minimal name length (1..12)
#        Default: 2
#
#    WorldAvailable
#        If players are allowed to enter the world. Character creation will still be possible if world is disabled.
#        Default: 1 (Enabled)
#                 0 (Disabled)
#
#    CharactersCreatingDisabled
#        Disable characters creating for specific team or any (non-player accounts not affected)
#        Default: 0 - enabled
#                 1 - disabled only for Alliance
#                 2 - disabled only for Horde
#                 3 - disabled for both teams
#
#    CharactersPerAccount
#        Limit numbers of characters per account (at all realms).
#        Note: this setting limits the character creating at the _current_ realm base at characters amount at all realms
#        Default: 50
#                The number must be >= CharactersPerRealm
#
#    CharactersPerRealm
#        Limit numbers of characters for account at realm
#        Default: 10 (client limitation)
#                The number must be between 1 and 10
#
#    SkipCinematics
#        Disable in-game script movie at first character's login(allows to prevent buggy intro in case of custom start location coordinates)
#        Default: 0 - show intro for each new character
#                 1 - show intro only for first character of selected race
#                 2 - disable intro in all cases
#
#    ShowHealthValues
#        Show real NPC/player health values instead of percentages.
#        Default: 0 (hide values)
#                 1 (show values)
#
#    MaxPlayerLevel
#        Max level that can be reached by a player for experience (in range from 1 to 100).
#        Change not recommended
#        Default: 60
#
#    StartPlayerLevel
#        Staring level that have character at creating (in range 1 to MaxPlayerLevel)
#        Default: 1
#
#    StartPlayerMoney
#        Amount of money that new players will start with.
#        If you want to start with one silver, use for example 100 (100 copper = 1 silver)
#        Default: 0
#
#    MaxHonorPoints
#        Max honor points that player can have.
#        Default: 75000
#
#    StartHonorPoints
#        Amount of honor that new players will start with
#        Default: 0
#
#    MinHonorKills
#        Min kills that players must obtain to enter in weekly honor calculation
#        Default: 15
#
#    MaintenanceDay
#        The day of the week is performed server maintenance ( currently used for Honor distribution )
#        range (0..6): 0 is the first day of the week (normally sunday), 6 is the latest
#        Default: 3 (Wednesday in EU)
#
#    InstantLogout
#        Enable or disable instant logout for security level (0..4) or high (NOT in combat/while dueling/while falling)
#        Default: 1 (Mods/GMs/Admins)
#
#    ForceLogoutDelay
#        Keep player characters ingame for some time after a client disconnects unexpectedly.
#        Default: 1 (true)
#                 0 (false)
#
#    AutoHonorRestart
#        Server will schedule a restart on its own when it's time to perform PvP rank calculations.
#        Default: 1
#
#    AllFlightPaths
#        Players will start with all flight paths (Note: ALL flight paths, not only player's team)
#        Default: 0 (true)
#                 1 (false)
#
#    AlwaysMaxSkillForLevel
#        Players will automatically gain max level dependent (weapon/defense) skill when logging in, leveling up etc.
#        Default: 0 (false)
#                 1 (true)
#
#    ActivateWeather
#        Activate weather system
#        Default: 1 (true)
#                 0 (false)
#
#    CastUnstuck
#        Allow cast Unstuck spell at .start or client Help option use
#        Default: 1 (true)
#                 0 (false)
#
#    MaxSpellCastsInChain
#        Max amount triggered spell casts in chain by one caster, prevent stack overflow crash
#        Too Low value will make some correct triggered casts fail
#                 0 (no limit)
#        Default: 10
#
#    Instance.IgnoreLevel
#        Ignore level requirement to enter instance
#        Default: 0 (false)
#                 1 (true)
#
#    Instance.IgnoreRaid
#        Ignore raid requirement to enter instance
#        Default: 0 (false)
#                 1 (true)
#
#    Instance.ResetTimeHour
#        The hour of the day (0-23) when the global instance resets occur.
#        Default: 4
#
#    Instance.UnloadDelay
#        Unload the instance map from memory after some time if no players are inside.
#        Default: 1800000 (miliseconds, i.e 30 minutes)
#                 0 (instance maps are kept in memory until they are reset)
#
#    Item.InstantSaveQuality
#        Save character inventory instantly on receiving item of this quality or higher.
#        Default: 6 - Artifact
#
#    Item.PreventDataMining
#        Forbid querying information about items that have never been obtained.
#        Default: 1 (true)
#                 0 (false)
#
#    Quests.LowLevelHideDiff
#        Quest level difference to hide for player low level quests:
#        if player_level > quest_level + LowLevelQuestsHideDiff then quest "!" mark not show for quest giver
#        Default: 4
#                -1 (show all available quests marks)
#
#    Quests.HighLevelHideDiff
#        Quest level difference to hide for player high level quests:
#        if player_level < quest_min_level - HighLevelQuestsHideDiff then quest "!" mark not show for quest giver
#        Default: 7
#                -1 (show all available quests marks)
#
#    Quests.IgnoreRaid
#        Non-raid quests allowed in raids
#        Default: 0 (not allowed)
#                 1 (allowed)
#
#    Group.OfflineLeaderDelay
#        A grace period for an offline group leader to reconnect before tranfering leadership to a next suitable member of the group (in secs)
#        Default: 300 (5 minutes)
#                   0 (Do not transfer group leadership)
#
#    Guild.EventLogRecordsCount
#        Count of guild event log records stored in guild_eventlog table
#        Increase to store more guild events in table, minimum is 100
#        You can set it to very high value to prevent oldest guild events to be rewritten by latest guild events - but it can slow down performance
#        Default: 100
#
#    MirrorTimer.Fatigue.Max
#        Fatigue max timer value (in secs)
#        Default: 60 (1 minute)
#                  0 (instant exhaustion damage start)
#
#    MirrorTimer.Breath.Max
#        Waterbreathing max timer value (in secs)
#        Default: 60
#                  0 (instant underwater breathing damage start)
#
#    MirrorTimer.Environmental.Max
#        Generic environmental (lava/slime/etc) damage delay max timer value (in secs)
#        Default:  1
#                  0 (instant in liquid damage start)
#
#    MaxPrimaryTradeSkill
#        Max count that player can learn the primary trade skill.
#        Default: 2
#        Max : 10
#
#    MinPetitionSigns
#        Min signatures count to creating guild (0..9).
#        Default: 9
#
#    MaxGroupXPDistance
#        Max distance to creature for group memeber to get XP at creature death.
#        Default: 74
#
#    MailDeliveryDelay
#        Mail delivery delay time for item sending
#        Default: 3600 sec (1 hour)
#
#    Mails.COD.ForceTag.MaxLevel
#        Prevent COD scam attempts by adding "COD" prefix to the mail subject
#        Only affects senders below given level
#        Default: 0
#
#    MassMailer.SendPerTick
#        Max amount mail send each tick from mails list scheduled for mass mailer proccesing.
#        More mails increase server load but speedup mass mail proccess. Normal tick length: 50 msecs, so 20 ticks in sec and 200 mails in sec by default.
#        Default: 10
#
#    PetUnsummonAtMount
#        Permanent pet will unsummoned at player mount
#        Default: 0 - not unsummon
#                 1 - unsummon for any mount
#
#    PetDefaultLoyalty
#        Initial loyalty level for newly tamed pets
#        Default: 1
#
#    PlayerCommands
#        Should player chat be parsed for GM commands
#        Default: 1 (parse commands)
#                 0 (ignore commands)
#
#    Event.Announce
#        Sends an announcement to players when a game event starts.
#        Default: 0 (false)
#                 1 (true)
#
#    AutoBroadcast.Timer
#        Server autobroadcast interval set in miliseconds.
#        Default: 1800000 = 30 min
#
#    Spell.EffectDelay
#        Delay in milliseconds before most spell effects are processed.
#        Default: 400
#
#    Spell.ProcDelay
#        Delay in milliseconds before processing procs. Spells triggered by aura procs also seem
#        to be subject to a batching delay, so we double the procs delay to recreate the effect.
#        Default: 800
#
#    BeepAtStart
#        Beep at mangosd start finished (mostly work only at Unix/Linux systems)
#        Default: 1 (true)
#                 0 (false)
#
#    ShowProgressBars
#        Control show progress bars for load steps at server startup
#        Default: 1 (true)
#                 0 (false)
#
#    WaitAtStartupError
#        After startup error report wait <Enter> or some time before continue (and possible close console window)
#                 -1 (wait until <Enter> press)
#        Default:  0 (not wait)
#                  N (>0, wait N secs)
#
#    Motd
#        Message of the Day. Displayed at worldlogin for every user ('@' for a newline).
#
###################################################################################################################

GameType = 1
RealmZone = 1
TimeZoneOffset = 0
DBC.Locale = 255
DeclinedNames = 0
StrictPlayerNames = 0
StrictCharterNames = 0
StrictPetNames = 0
MinPlayerName = 2
MinCharterName = 2
MinPetName = 2
WorldAvailable = 1
CharactersCreatingDisabled = 0
CharactersPerAccount = 50
CharactersPerRealm = 10
SkipCinematics = 0
ShowHealthValues = 0
MaxPlayerLevel = 60
StartPlayerLevel = 1
StartPlayerMoney = 0
MinHonorKills = 15
MaintenanceDay = 3
InstantLogout = 1
ForceLogoutDelay = 0
AutoHonorRestart = 1
AllFlightPaths = 0
AlwaysMaxSkillForLevel = 0
ActivateWeather = 1
CastUnstuck = 1
MaxSpellCastsInChain = 10
Instance.IgnoreLevel = 0
Instance.IgnoreRaid = 0
Instance.ResetTimeHour = 4
Instance.UnloadDelay = 1800000
Item.InstantSaveQuality = 6
Item.PreventDataMining = 1
Quests.LowLevelHideDiff = 4
Quests.HighLevelHideDiff = 7
Quests.IgnoreRaid = 0
Group.OfflineLeaderDelay = 300
Guild.EventLogRecordsCount = 100
MirrorTimer.Fatigue.Max = 60
MirrorTimer.Breath.Max = 60
MirrorTimer.Environmental.Max = 1
MaxPrimaryTradeSkill = 2
MinPetitionSigns = 9
MaxGroupXPDistance = 74
MailDeliveryDelay = 3600
Mails.COD.ForceTag.MaxLevel = 0
MassMailer.SendPerTick = 10
PetUnsummonAtMount = 0
PetDefaultLoyalty = 1
PlayerCommands = 1
Event.Announce = 0
AutoBroadcast.Timer = 1800000
Spell.EffectDelay = 400
Spell.ProcDelay = 800
BeepAtStart = 1
ShowProgressBars = 0
WaitAtStartupError = 0
Motd = "Welcome to World of Warcraft!"

###################################################################################################################
# PLAYER INTERACTION
#
#    AllowTwoSide.Accounts
#        Allow accounts to create characters in both teams in any game type.
#        Default: 0 (Not allowed)
#                 1 (Allowed)
#
#    AllowTwoSide.Interaction.Chat
#    AllowTwoSide.Interaction.Channel
#    AllowTwoSide.Interaction.Group
#    AllowTwoSide.Interaction.Guild
#    AllowTwoSide.Interaction.Trade
#    AllowTwoSide.Interaction.Auction
#    AllowTwoSide.Interaction.Mail
#        Allow or not common :chat(say,yell);channel(chat)group(join)guild(join);trade with different team,
#        merge all auction houses for players from different teams, send mail to different team.
#        Default: 0 (Not allowed)
#                 1 (Allowed)
#
#    AllowTwoSide.WhoList
#        Allow show player from both team in who list.
#        Default: 0 (Not allowed)
#                 1 (Allowed)
#
#    AllowTwoSide.AddFriend
#        Allow adding friends from other team in friend list.
#        Default: 0 (Not allowed)
#                 1 (Allowed)
#
###################################################################################################################

AllowTwoSide.Accounts = 0
AllowTwoSide.Interaction.Chat = 0
AllowTwoSide.Interaction.Channel = 0
GM.JoinOppositeFactionChannels = 0
AllowTwoSide.Interaction.Group = 0
AllowTwoSide.Interaction.Guild = 0
AllowTwoSide.Interaction.Trade = 0
AllowTwoSide.Interaction.Auction = 0
AllowTwoSide.Interaction.Mail = 0
AllowTwoSide.WhoList = 0
AllowTwoSide.AddFriend = 0

###################################################################################################################
# CREATURE AND GAMEOBJECT SETTINGS
#
#    ThreatRadius
#        Radius for creature to evade after being pulled away from combat start point
#        If ThreatRadius is less than creature aggro radius then aggro radius will be used
#        Default: 50 yards
#
#    MaxCreaturesAttackRadius
#        Creatures won't search for target farther than this.
#        Reduce for better performances.
#        Default: 40 yards
#
#    MaxPlayersStealthDetectRange
#        Players won't search for stealthed units farther than this.
#        Reduce for better performances.
#        Default: 30 yards
#
#    MaxCreaturesStealthDetectRange
#        Creatures won't search for stealthed units farther than this.
#        Reduce for better performances.
#        Default: 30 yards
#
#    MaxCreatureSummonLimit
#       Game objects (and other creatures) won't be able to summon more creatures than this limit
#       Default: 100
#
#    Rate.Creature.Aggro
#        Aggro radius percent or off.
#        Default: 1   - 100%
#                 1.5 - 150%
#                 0   - off (0%)
#
#    CreatureFamilyFleeAssistanceRadius
#        Radius which creature will use to seek for a near creature for assistance. Creature will flee to this creature.
#        Default: 30
#                 0   - off
#
#    CreatureFamilyAssistanceRadius
#        Radius which creature will use to call assistance without moving
#        Default: 10
#                 0   - off
#
#    CreatureFamilyAssistanceDelay
#        Reaction time for creature assistance call
#        Default: 1500 (1.5s)
#
#    CreatureFamilyFleeDelay
#        Time during which creature can flee when no assistant found
#        Default: 7000 (7s)
#
#    WorldBossLevelDiff
#        Difference for boss dynamic level with target
#        Default: 3
#
#    SendLootRollUponReconnect
#         Send active loot roll windows when a player reconnects
#         Default: 0  - not send
#                  1  - send
#
#    Corpse.EmptyLootShow
#        If target can have loot (or can be skining after loot) but no loot generated still show loot window
#        Default: 1 (show)
#                 0 (not show)
#
#    Corpse.Decay.NORMAL
#    Corpse.Decay.RARE
#    Corpse.Decay.ELITE
#    Corpse.Decay.RAREELITE
#    Corpse.Decay.WORLDBOSS
#        Seconds until creature corpse will decay without being looted or skinned (not used when creature does not have loot initially)
#        Default: 300, 900, 600, 1200, 3600
#
#    Rate.Corpse.Decay.Looted
#         Controls how long the creature corpse stays after it had been looted, as a multiplier of its Corpse.Decay.* config.
#         Default: 0.0 (will use modifier /3 of the creatures spawntimesecs when 0.0)
#
#    Rate.Creature.Normal.Damage
#    Rate.Creature.Elite.Elite.Damage
#    Rate.Creature.Elite.RAREELITE.Damage
#    Rate.Creature.Elite.WORLDBOSS.Damage
#    Rate.Creature.Elite.RARE.Damage
#        Creature Damage Rates.
#        Examples: 2 - creatures will damage 2x, 1.7 - 1.7x.
#
#    Rate.Creature.Normal.SpellDamage
#    Rate.Creature.Elite.Elite.SpellDamage
#    Rate.Creature.Elite.RAREELITE.SpellDamage
#    Rate.Creature.Elite.WORLDBOSS.SpellDamag
#    Rate.Creature.Elite.RARE.SpellDamage
#        Creature Spell Damage Rates.
#        Examples: 2 - creatures will damage with spells 2x, 1.7 - 1.7x.
#
#    Rate.Creature.Normal.HP
#    Rate.Creature.Elite.Elite.HP
#    Rate.Creature.Elite.RAREELITE.HP
#    Rate.Creature.Elite.WORLDBOSS.HP
#    Rate.Creature.Elite.RARE.HP
#        Creature Health Ammount Modifier.
#        Examples: 2 - creatures have 2x health, 1.7 - 1.7x.
#
#    ListenRange.Say
#        Distance from player to listen text that creature (or other world object) say
#        Default: 25
#
#    ListenRange.TextEmote
#        Distance from player to listen textemote that creature (or other world object) say
#        Default: 25
#
#    ListenRange.Yell
#        Distance from player to listen text that creature (or other world object) yell
#        Default: 300
#
#    GuidReserveSize.Creature
#    GuidReserveSize.GameObject
#        Amount guids reserved for .npc add/.gobject add directly after last used in DB static spawned creature/gameobject guid
#        Commands .npc add/.gobject add can be used only for guids from this reserve and required server restart if all guids
#        from reserve used before above commands can be used in like case. Less size increase amount guids for dynamic spawns
#        in game from other side
#        Default: 100
#
###################################################################################################################

ThreatRadius = 50
Rate.Creature.Aggro = 1
MaxCreaturesAttackRadius = 40
MaxPlayersStealthDetectRange = 30
MaxCreaturesStealthDetectRange = 30
MaxCreatureSummonLimit = 100
CreatureFamilyFleeAssistanceRadius = 30
CreatureFamilyAssistanceRadius = 10
CreatureFamilyAssistanceDelay = 1500
CreatureFamilyFleeDelay = 7000
WorldBossLevelDiff = 3
Corpse.EmptyLootShow = 1
Corpse.Decay.NORMAL = 300
Corpse.Decay.RARE = 900
Corpse.Decay.ELITE = 600
Corpse.Decay.RAREELITE = 1200
Corpse.Decay.WORLDBOSS = 3600
Rate.Corpse.Decay.Looted = 0.0
SendLootRollUponReconnect = 0
Rate.Creature.Normal.Damage = 1
Rate.Creature.Elite.Elite.Damage = 1
Rate.Creature.Elite.RAREELITE.Damage = 1
Rate.Creature.Elite.WORLDBOSS.Damage = 1
Rate.Creature.Elite.RARE.Damage = 1
Rate.Creature.Normal.SpellDamage = 1
Rate.Creature.Elite.Elite.SpellDamage = 1
Rate.Creature.Elite.RAREELITE.SpellDamage = 1
Rate.Creature.Elite.WORLDBOSS.SpellDamage = 1
Rate.Creature.Elite.RARE.SpellDamage = 1
Rate.Creature.Normal.HP = 1
Rate.Creature.Elite.Elite.HP = 1
Rate.Creature.Elite.RAREELITE.HP = 1
Rate.Creature.Elite.WORLDBOSS.HP = 1
Rate.Creature.Elite.RARE.HP = 1
ListenRange.Say = 40
ListenRange.TextEmote = 40
ListenRange.Yell = 300
GuidReserveSize.Creature = 1000
GuidReserveSize.GameObject = 1000


###################################################################################################################
# CHAT SETTINGS
#
#    ChatFakeMessagePreventing
#        Chat protection from creating fake messages using a lot spaces (other invisible symbols),
#        not applied to addon language messages, but can prevent working old addons
#        that use normal languages for sending data to another clients.
#        Default: 0 (disable fake messages preventing)
#                 1 (enable fake messages preventing)
#
#    ChatStrictLinkChecking.Severity
#        Check chat messages for ingame links to spells, items, quests, achievements etc.
#        Default: 0 (disable link checking)
#                 1 (check if only valid pipe commands are used. This prevents posting pictures for example)
#                 2 (verifiy that pipe commands are used in a correct order)
#                 3 (check if color, entry and name don't contradict each other. For correct work, please assure
#                    that you have extracted locale DBCs of every language specific client playing on this server.)
#
#    ChatStrictLinkChecking.Kick
#        Defines, what should be done if a message is considered to contain invalid pipe commands.
#        Default: 0 (silently ignore message)
#                 1 (kick players who sent invalid formed messages)
#
#    ChatFlood.MessageCount
#        Chat anti-flood protection, haste message count to activate protection
#        Default: 10
#                 0 (disable anti-flood protection)
#
#    ChatFlood.MessageDelay
#        Chat anti-flood protection, minimum message delay to count message
#        Default: 1 (in secs)
#
#    ChatFlood.MuteTime
#        Chat anti-flood protection, mute time at activation flood protection (not saved)
#        Default: 10 (in secs)
#
#    Channel.SilentlyGMJoin
#        Silently join GM characters (security level > 1) to channels
#        Default: 0 (join announcement in normal way)
#                 1 (GM join without announcement)
#
#    Channel.StrictLatinInGeneral
#        Filter out messages using non-Latin characters in general channels.
#        Default: 0 (disable)
#                 1 (enable)
#
#    WorldChan.MinLevel
#        Minimum level to use world channels
#        Default: 1
#
#    WorldChan.Cooldown
#    WorldChan.CooldownMaxLevel
#    WorldChan.CooldownScaling
#        Cooldown between messages on world channels
#        Default: 0
#
#    WhisperDiffZone.MinLevel
#        Minimum level to whisper players in other zones
#        Default: 1
#
#    YellMinLevel
#        Minimum level to /yell in chat
#        Default: 0
#
#    YellRange.LinearScale.MaxLevel
#    YellRange.QuadraticScale.MaxLevel
#        Limit yell range based on level
#        Default: 0
#
#    ChannelInvite.MinLevel
#        Minimum level to invite other players into a private channel
#        Default: 10
#
#    PublicChansMute.BypassLevel
#        Required character level on account to bypass all chat restrictions
#        Default: 61
#
#    WhisperRestriction
#        Allow players to disable whispers with .wr command
#        Default: 0
#
#    SayMinLevel
#        Minimum level to /say in chat
#        Default: 0
#
#    SayEmoteMinLevel
#        Minimum level to /me in chat
#        Default: 0
#
#    Antiflood.Sanction
#        Sanction applied to a player if sending too many packets
#        See enum CheatAction for all flags
#        Default: 4 - Kick
#
###################################################################################################################

ChatFakeMessagePreventing = 0
ChatStrictLinkChecking.Severity = 0
ChatStrictLinkChecking.Kick = 0
ChatFlood.MessageCount = 10
ChatFlood.MessageDelay = 1
ChatFlood.MuteTime = 10
Channel.SilentlyGMJoin = 0
Channel.StrictLatinInGeneral = 0
WorldChan.MinLevel = 1
WorldChan.Cooldown = 0
WorldChan.CooldownMaxLevel = 0
WorldChan.CooldownScaling = 0
WhisperDiffZone.MinLevel = 1
YellMinLevel = 0;
YellRange.LinearScale.MaxLevel = 0
YellRange.QuadraticScale.MaxLevel = 0
ChannelInvite.MinLevel = 10
PublicChansMute.BypassLevel = 61
WhisperRestriction = 0
SayMinLevel = 0;
SayEmoteMinLevel = 0;
Antiflood.Sanction = 4

###################################################################################################
# WARDEN SETTINGS
#
#    Warden.WinEnabled
#        Description: Enables Warden checks for Windows clients.
#        Default:     0 - (Disabled)
#                     1 - (Enabled)
#
#    Warden.OSXEnabled
#        Description: Enables Warden checks for OSX clients.
#        Default:     0 - (Disabled)
#                     1 - (Enabled)
#
#    Warden.PlayersOnly
#        Description: Ignore game master accounts.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Warden.NumMemChecks
#        Description: Number of Warden memory checks that are sent to the client each cycle.
#        Default:     3 - (Enabled)
#                     0 - (Disabled)
#
#    Warden.NumOtherChecks
#        Description: Number of Warden checks other than memory checks that are added to request
#                     each checking cycle.
#        Default:     7 - (Enabled)
#                     0 - (Disabled)
#
#    Warden.ClientResponseDelay
#        Description: Time (in seconds) before client is getting disconnecting for not responding.
#        Default:     120 - (2 Minutes)
#                     0 - (Disabled, client won't be kicked)
#
#    Warden.ClientCheckHoldOff
#        Description: Time (in seconds) to wait before sending the next check request to the client.
#                     A low number increases traffic and load on client and server side.
#        Default:     30 - (30 Seconds)
#                     0  - (Send check as soon as possible)
#
#    Warden.DefaultPenalty
#        Description: Default action being taken if a client check failed. Penalties can be
#                     customized per check id in the warden_checks table.
#        Default:     2 - (Ban)
#                     0 - (Disabled, Logging only)
#                     1 - (Kick)
#
#    Warden.BanDuration
#        Description: Time (in seconds) an account will be banned if Penalty is set
#                     to ban.
#        Default:     86400 - (24 hours)
#                     0     - (Permanent ban)
#
#    Warden.DebugLog
#        Description: Prints additional information about performed checks.
#        Default:     0 - (Disabled)
#                     1 - (Enabled)
#
#    Warden.DBLogLevel
#        Description: The minimal WardenActions value of Warden check to be logged into realmd.warden_log table.
#                     WardenActions: 0 - log, 1 - kick, 2 - ban
#
#        Deafult:     0 - (Logging any failed check)
#                     3 - (Disable DB logging)
#
#    Warden.ModuleDir
#        Description: Directory where warden modules are stored.
#        Default: "warden_modules"
#
###################################################################################################

Warden.WinEnabled            = 0
Warden.OSXEnabled            = 0
Warden.PlayersOnly           = 1
Warden.NumMemChecks          = 3
Warden.NumOtherChecks        = 7
Warden.ClientResponseDelay   = 120
Warden.ClientCheckHoldOff    = 30
Warden.DefaultPenalty        = 2
Warden.BanDuration           = 86400
Warden.DebugLog              = 0
Warden.DBLogLevel            = 0
Warden.ModuleDir             = "warden_modules"

###################################################################################################
# MOVEMENT ANTICHEAT SETTINGS
#
#    Anticheat.Enable
#        Description: Enables player movement checks.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.PlayersOnly
#        Description: Ignore game master accounts.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.NotifyCheaters
#        Description: Informs players if they fail a movement check.
#        Default:     0 - (Disabled)
#                     1 - (Enabled)
#
#    Anticheat.BanDuration
#        Description: Time (in seconds) an account will be banned if Penalty is set
#                     to ban.
#        Default:     86400 - (24 hours)
#                     0     - (Permanent ban)
#
#    Anticheat.LogData
#        Description: Save the result of every anticheat tick in the database.
#        Default:     0 - (Disabled)
#                     1 - (Enabled)
#
#    Anticheat.MaxAllowedDesync
#        Description: Client time desynchronization allowed when doing movement extrapolation.
#        Default:     0
#
#    Anticheat.ReverseTime.Enable
#        Description: Check for players whose clock went back in time.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.ReverseTime.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     1
#
#    Anticheat.ReverseTime.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.NullTime.Enable
#        Description: Check for players sending a null timestamp.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.NullTime.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     2
#
#    Anticheat.NullTime.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.SkippedHeartbeats.Enable
#        Description: Check for players missing a heartbeat packet.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.SkippedHeartbeats.Threshold.Tick
#        Description: Detections needed to trigger a penalty in one tick.
#        Default:     2
#
#    Anticheat.SkippedHeartbeats.Threshold.Total
#        Description: Detections needed to trigger a penalty total.
#        Default:     10
#
#    Anticheat.SkippedHeartbeats.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.TimeDesync.Enable
#        Description: Check for players that claim more time has passed for them than for the server since last time they moved.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.TimeDesync.Threshold
#        Description: Milliseconds of time difference tolerated.
#        Default:     10000
#
#    Anticheat.TimeDesync.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.NumDesyncs.Enable
#        Description: Check how many times the above described time desync has occurred.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.NumDesyncs.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     5
#
#    Anticheat.NumDesyncs.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.SpeedHack.Enable
#        Description: Check for players moving too fast using extrapolation.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.OverpspeedDistance.Enable
#        Description: Check for players that claim to have traveled further than possible.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.OverpspeedDistance.Threshold
#        Description: Yards traveled beyond what we think is possible.
#        Default:     30
#
#    Anticheat.OverpspeedDistance.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.OverspeedJump.Enable
#        Description: Check for players that are moving too fast while jumping.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.OverspeedJump.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.OverspeedJump.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     3
#
#    Anticheat.OverspeedJump.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.JumpSpeedChange.Enable
#        Description: Check for players that change speed while in the middle of a jump.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.JumpSpeedChange.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.JumpSpeedChange.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     3
#
#    Anticheat.JumpSpeedChange.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.MultiJump.Enable
#        Description: Check for players jumping while still in the air.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.MultiJump.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.MultiJump.Threshold.Tick
#        Description: Detections needed to trigger a penalty in one tick.
#        Default:     2
#
#    Anticheat.MultiJump.Threshold.Total
#        Description: Detections needed to trigger a penalty total.
#        Default:     10
#
#    Anticheat.MultiJump.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.WallClimb.Enable
#        Description: Check for players climbing a surface that is too steep.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.WallClimb.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.WallClimb.Angle
#        Description: Vertical angle in radians between two points that players are able to climb.
#        Default:     1.0
#
#    Anticheat.WallClimb.Threshold.Tick
#        Description: Detections needed to trigger a penalty in one tick.
#        Default:     3
#
#    Anticheat.WallClimb.Threshold.Total
#        Description: Detections needed to trigger a penalty total.
#        Default:     30
#
#    Anticheat.WallClimb.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.Unreachable.Enable
#        Description: Check for players that are in combat with a creature which can't reach them.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.Unreachable.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     40
#
#    Anticheat.Unreachable.Penalty
#        Description: Action to take upon failing this check.
#        Default:     3 - Log, Report to GM
#
#    Anticheat.FlyHack.Enable
#        Description: Check for players that are flying.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.FlyHack.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.FlyHack.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     3
#
#    Anticheat.FlyHack.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.NoFallTime.Enable
#        Description: Check for players that walking in the air.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.NoFallTime.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.NoFallTime.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     5
#
#    Anticheat.NoFallTime.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.Teleport.Enable
#        Description: Check for players teleporting far away from their current position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.Teleport.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.Teleport.Distance
#        Description: Yards that we allow players to travel in one packet.
#                     Setting this too low can cause false positives at high speeds.
#        Default:     40.0
#
#    Anticheat.Teleport.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     3
#
#    Anticheat.Teleport.Penalty
#        Description: Action to take upon failing this check.
#        Default:     19 - Log, Report to GM, Ban
#
#    Anticheat.TeleportToTransport.Enable
#        Description: Check for players teleporting on a transport.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.TeleportToTransport.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.TeleportToTransport.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     2
#
#    Anticheat.TeleportToTransport.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.FakeTransport.Enable
#        Description: Check for players claiming they have boarded a non-existent transport.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.FakeTransport.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     1
#
#    Anticheat.FakeTransport.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.WaterWalk.Enable
#        Description: Check for players walking on water without a water walking buff.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.WaterWalk.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.WaterWalk.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     5
#
#    Anticheat.WaterWalk.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#
#    Anticheat.SlowFall.Enable
#        Description: Check for players slow falling without a slow fall buff.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.SlowFall.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.SlowFall.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     5
#
#    Anticheat.SlowFall.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.Hover.Enable
#        Description: Check for players hovering without a hover buff.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.Hover.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.Hover.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     5
#
#    Anticheat.Hover.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.FixedZ.Enable
#        Description: Check for players that have a fixed Z axis.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.FixedZ.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.FixedZ.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     5
#
#    Anticheat.FixedZ.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.RootMove.Enable
#        Description: Check for players that are moving while rooted.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.RootMove.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.RootMove.Threshold.Tick
#        Description: Detections needed to trigger a penalty in one tick.
#        Default:     5
#
#    Anticheat.RootMove.Threshold.Total
#        Description: Detections needed to trigger a penalty in one tick.
#        Default:     30
#
#    Anticheat.RootMove.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.SelfRoot.Enable
#        Description: Check for players that have root flag but should not.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.SelfRoot.Reject
#        Description: Do not accept movement info and teleport to old position.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.SelfRoot.Threshold
#        Description: Detections needed to trigger a penalty in one tick.
#        Default:     1

#    Anticheat.SelfRoot.Penalty
#        Description: Action to take upon failing this check.
#        Default:     3 - Log, Report to GM
#
#    Anticheat.WrongAckData.Enable
#        Description: Check for players sending wrong data in an ACK packet.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.WrongAckData.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     3
#
#    Anticheat.WrongAckData.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.PendingAckDelay.Enable
#        Description: Check for players failing to acknowledge a forced movement change.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.PendingAckDelay.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     3
#
#    Anticheat.PendingAckDelay.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.ExploreArea.Enable
#        Description: Check for players that are exploring low level zones too quickly.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.ExploreArea.Threshold
#        Description: Count of areas explored this session.
#        Default:     100
#
#    Anticheat.ExploreArea.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.ExploreHighLevelArea.Enable
#        Description: Check for players that are exploring high level zones too quickly.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.ExploreHighLevelArea.Threshold
#        Description: Count of areas explored this session.
#        Default:     50
#
#    Anticheat.ExploreHighLevelArea.Penalty
#        Description: Action to take upon failing this check.
#        Default:     11 - Log, Report to GM, Kick
#
#    Anticheat.ForbiddenArea.Enable
#        Description: Check for players entering a forbidden area.
#        Default:     1 - (Enabled)
#                     0 - (Disabled)
#
#    Anticheat.ForbiddenArea.Threshold
#        Description: Detections needed to trigger a penalty.
#        Default:     1
#
#    Anticheat.ForbiddenArea.Penalty
#        Description: Action to take upon failing this check.
#        Default:     3 - Log, Report to GM
#
###################################################################################################

Anticheat.Enable = 1
Anticheat.PlayersOnly = 1
Anticheat.NotifyCheaters = 0
Anticheat.BanDuration = 86400
Anticheat.LogData = 0
Anticheat.MaxAllowedDesync = 0
Anticheat.ReverseTime.Enable = 1
Anticheat.ReverseTime.Threshold = 1
Anticheat.ReverseTime.Penalty = 11
Anticheat.NullTime.Enable = 1
Anticheat.NullTime.Threshold = 2
Anticheat.NullTime.Penalty = 11
Anticheat.SkippedHeartbeats.Enable = 1
Anticheat.SkippedHeartbeats.Threshold.Tick = 2
Anticheat.SkippedHeartbeats.Threshold.Total = 10
Anticheat.SkippedHeartbeats.Penalty = 11
Anticheat.TimeDesync.Enable = 1
Anticheat.TimeDesync.Threshold = 10000
Anticheat.TimeDesync.Penalty = 11
Anticheat.NumDesyncs.Enable = 1
Anticheat.NumDesyncs.Threshold = 5
Anticheat.NumDesyncs.Penalty = 11
Anticheat.SpeedHack.Enable = 1
Anticheat.OverpspeedDistance.Enable = 1
Anticheat.OverpspeedDistance.Threshold = 30
Anticheat.OverpspeedDistance.Penalty = 11
Anticheat.OverspeedJump.Enable = 1
Anticheat.OverspeedJump.Reject = 1
Anticheat.OverspeedJump.Threshold = 3
Anticheat.OverspeedJump.Penalty = 11
Anticheat.JumpSpeedChange.Enable = 1
Anticheat.JumpSpeedChange.Reject = 1
Anticheat.JumpSpeedChange.Threshold = 3
Anticheat.JumpSpeedChange.Penalty = 11
Anticheat.MultiJump.Enable = 1
Anticheat.MultiJump.Reject = 1
Anticheat.MultiJump.Threshold.Tick = 2
Anticheat.MultiJump.Threshold.Total = 10
Anticheat.MultiJump.Penalty = 11
Anticheat.WallClimb.Enable = 1
Anticheat.WallClimb.Reject = 1
Anticheat.WallClimb.Angle = 1.0
Anticheat.WallClimb.Threshold.Tick = 3
Anticheat.WallClimb.Threshold.Total = 30
Anticheat.WallClimb.Penalty = 11
Anticheat.Unreachable.Enable = 1
Anticheat.Unreachable.Threshold = 40
Anticheat.Unreachable.Penalty = 3
Anticheat.FlyHack.Enable = 1
Anticheat.FlyHack.Reject = 1
Anticheat.FlyHack.Threshold = 3
Anticheat.FlyHack.Penalty = 11
Anticheat.NoFallTime.Enable = 1
Anticheat.NoFallTime.Reject = 1
Anticheat.NoFallTime.Threshold = 5
Anticheat.NoFallTime.Penalty = 11
Anticheat.Teleport.Enable = 1
Anticheat.Teleport.Reject = 1
Anticheat.Teleport.Distance = 40.0
Anticheat.Teleport.Threshold = 3
Anticheat.Teleport.Penalty = 19
Anticheat.TeleportToTransport.Enable = 1
Anticheat.TeleportToTransport.Reject = 1
Anticheat.TeleportToTransport.Threshold = 2
Anticheat.TeleportToTransport.Penalty = 11
Anticheat.FakeTransport.Enable = 1
Anticheat.FakeTransport.Threshold = 1
Anticheat.FakeTransport.Penalty = 11
Anticheat.WaterWalk.Enable = 1
Anticheat.WaterWalk.Reject = 1
Anticheat.WaterWalk.Threshold = 5
Anticheat.WaterWalk.Penalty = 11
Anticheat.SlowFall.Enable = 1
Anticheat.SlowFall.Reject = 1
Anticheat.SlowFall.Threshold = 5
Anticheat.SlowFall.Penalty = 11
Anticheat.Hover.Enable = 1
Anticheat.Hover.Reject = 1
Anticheat.Hover.Threshold = 5
Anticheat.Hover.Penalty = 11
Anticheat.FixedZ.Enable = 1
Anticheat.FixedZ.Reject = 1
Anticheat.FixedZ.Threshold = 5
Anticheat.FixedZ.Penalty = 11
Anticheat.RootMove.Enable = 1
Anticheat.RootMove.Reject = 1
Anticheat.RootMove.Threshold.Tick = 5
Anticheat.RootMove.Threshold.Total = 30
Anticheat.RootMove.Penalty = 11
Anticheat.SelfRoot.Enable = 1
Anticheat.SelfRoot.Reject = 1
Anticheat.SelfRoot.Threshold = 1
Anticheat.SelfRoot.Penalty = 3
Anticheat.WrongAckData.Enable = 1
Anticheat.WrongAckData.Threshold = 3
Anticheat.WrongAckData.Penalty = 11
Anticheat.PendingAckDelay.Enable = 1
Anticheat.PendingAckDelay.Threshold = 3
Anticheat.PendingAckDelay.Penalty = 11
Anticheat.ExploreArea.Enable = 1
Anticheat.ExploreArea.Threshold = 100
Anticheat.ExploreArea.Penalty = 11
Anticheat.ExploreHighLevelArea.Enable = 1
Anticheat.ExploreHighLevelArea.Threshold = 50
Anticheat.ExploreHighLevelArea.Penalty = 11
Anticheat.ForbiddenArea.Enable = 1
Anticheat.ForbiddenArea.Threshold = 1
Anticheat.ForbiddenArea.Penalty = 3

# Time to wait for movement change ack
Movement.PendingAckResponseTime = 2000

###################################################################################################################
# GAME MASTER SETTINGS
#
#    GM.LoginState
#        GM mode at login
#        Default: 2 (last save state)
#                 0 (disable)
#                 1 (enable)
#
#    GM.Visible
#        GM visibility at login
#        Default: 2 (last save state)
#                 0 (invisible)
#                 1 (visible)
#
#    GM.AcceptTickets
#        Is GM accepting tickets from player by default or not.
#        Default: 2 (last save state)
#                 0 (disable)
#                 1 (enable)
#
#    GM.Chat
#        GM chat mode at login
#        Default: 2 (last save state)
#                 0 (disable)
#                 1 (enable)
#
#    GM.WhisperingTo
#        Is GM accepting whispers from player by default or not.
#        Default: 2 (last save state)
#                 0 (disable)
#                 1 (enable)
#
#    GM.InGMList.Level
#        Max GM level showed in GM list (if visible) in non-GM state (.gm off)
#                 0 (none)
#                 1 (only moderators)
#                 2 (only gamemasters)
#        Default: 3 (anyone)
#
#    GM.InWhoList.Level
#        Max GM level showed in who list (if visible).
#                 0 (only players)
#                 1 (only moderators)
#                 2 (only gamemasters)
#        Default: 3 (anyone)
#
#    GM.LogTrade
#        Include GM trade and trade slot enchanting operations in GM log if it enable
#        Default: 1 (include)
#                 0 (not include)
#
#    GM.StartLevel
#        GM starting level (1-255)
#        Default: 1
#
#    GM.LowerSecurity
#        Disallow a lower security member to interact with a higher one using commands
#        Default: 0 (disable)
#                 1 (enable)
#
#    GM.CreditOnDie
#        Give loot / money / reputation at ".die" command
#        Default: 1 (enable)
#
#    GM.AllowTrades
#        Allow trades / mails / AH / ...
#        Default: 1
#
#    GM.AllowPublicChannels
#        Allow to speak in general / world channels
#        Default: 0
#
#    GMTickets.Enable
#        Allow opening support tickets.
#        Default: 1
#
#    GMTickets.MinLevel
#        Minimum required character level to open a ticket.
#        Default: 0
#
#    GMTickets.Admin.Security
#        Required security rank to assign ticket in escalation queue.
#        Default: 7
#
###################################################################################################################

GM.LoginState            = 2
GM.Visible               = 2
GM.AcceptTickets         = 2
GM.Chat                  = 2
GM.WhisperingTo          = 2
GM.InGMList.Level        = 3
GM.InWhoList.Level       = 3
GM.LogTrade              = 1
GM.StartLevel            = 1
GM.LowerSecurity         = 0
GM.CreditOnDie           = 1
GM.AllowTrades           = 1
GM.AllowPublicChannels   = 0
GMTickets.Enable         = 1
GMTickets.MinLevel       = 0
GMTickets.Admin.Security = 7

###################################################################################################################
# VISIBILITY AND RADIUSES
#
#    Visibility.GroupMode
#        Group visibility modes
#        Default: 0 (standard setting: only members from same group can 100% auto detect invisible player)
#                 1 (raid members 100% auto detect invisible player from same raid)
#                 2 (players from same team can 100% auto detect invisible player)
#
#    Visibility.Distance.Continents
#    Visibility.Distance.Instances
#    Visibility.Distance.BG
#        Visibility distance for different ingame object in different maps.
#        Visibility on continents on offy ~90 yards. In BG ~180. For instances default ~120.
#        Max limited by active player zone: ~ 333
#        Min limit is max aggro radius (45) * Rate.Creature.Aggro
#    Visibility.Distance.Continents.Min
#        If bad performance, visibilityDistance may be reduced
#
#    Visibility.Distance.InFlight
#        Visible distance for player in flight
#        Min limit is 0 (not show any objects)
#
#    Visibility.Distance.Grey.Unit
#        Visibility grey distance for creatures/players (fast changing objects)
#        addition to appropriate object type Visibility.Distance.* use in case visibility removing to
#        object (except corpse around distances) If D is distance and G is grey distance then object
#        make visible if distance to it <= D but make non visible if distance > D+G
#        Default: 1 (yard)
#
#    Visibility.Distance.Grey.Object
#        Visibility grey distance for dynobjects/gameobjects/corpses/creature bodies
#        Default: 10 (yards)
#
#    Visibility.RelocationLowerLimit
#        Object's visibility update called, when distance between current object's position and position,
#        where visiblity was updated last time, reaches RelocationLoverLimit value
#        Default: 10 (yards)
#
#    Visibility.AIRelocationNotifyDelay
#        Delay time between creature AI reactions on nearby movements
#        Default: 1000 (milliseconds)
#
#    Visibility.ForceActiveObjects
#        Force any creatures or gameobjects with increased visibility set in template to be active objects.
#        The modifier will not work for creatures that don't have the active flag set in spawn table otherwise.
#        Default: 1 (enabled)
#                 0 (disabled)
#
###################################################################################################################

Visibility.GroupMode               = 0
Visibility.Distance.Continents     = 100
Visibility.Distance.Continents.Min = 60
Visibility.Distance.Instances      = 170
Visibility.Distance.BG             = 533
Visibility.Distance.InFlight       = 100
Visibility.Distance.Grey.Unit      = 1
Visibility.Distance.Grey.Object    = 10
Visibility.RelocationLowerLimit    = 10
Visibility.AIRelocationNotifyDelay = 1000
Visibility.ForceActiveObjects      = 1

###################################################################################################################
# SERVER RATES
#
#    Rate.Health
#    Rate.Mana
#    Rate.Rage.Income
#    Rate.Rage.Loss
#    Rate.Focus
#    Rate.Loyalty
#    Rate.Energy (Rogue)
#        Health and power regeneration and rage income from damage.
#        Default: 1
#
#    Rate.Skill.Discovery
#         Skill Discovery Rates
#         Default: 1
#
#    Rate.Drop.Item.Poor
#    Rate.Drop.Item.Normal
#    Rate.Drop.Item.Uncommon
#    Rate.Drop.Item.Rare
#    Rate.Drop.Item.Epic
#    Rate.Drop.Item.Legendary
#    Rate.Drop.Item.Artifact
#    Rate.Drop.Item.Referenced
#    Rate.Drop.Money
#         Drop rates (items by quality and money)
#         Default: 1
#
#    Rate.XP.Kill
#    Rate.XP.Kill.Elite
#    Rate.XP.Quest
#    Rate.XP.Explore
#    Rate.XP.Personal.Min
#    Rate.XP.Personal.Max
#        XP rates
#        Default: 1
#
#    Rate.Rest.InGame
#    Rate.Rest.Offline.InTavernOrCity
#    Rate.Rest.Offline.InWilderness
#        Resting points grow rates (1 - normal, 2 - double rate, 0.5 - half rate, etc) from standard values
#
#    Rate.Damage.Fall
#        Damage after fall rate. (1 - standard, 2 - double damage, 0.5 - half damage, etc)
#
#    Rate.Auction.Time
#    Rate.Auction.Deposit
#    Rate.Auction.Cut
#        Auction rates (auction time, deposit get at auction start, auction cut from price at auction end)
#
#    Auction.Deposit.Min
#        Minimum auction deposit size in copper
#        Default: 0
#
#    Auction.AccountConcurrentLimit
#        Maximum auctions (per auction house, including shared) an account can have posted at once. eg. limit of 100 -> 100 on Alliance auction house, 100 on Neutral auction house
#        Default: 0
#
#    Rate.Honor
#        Honor gain rate
#
#    Rate.Mining.Amount
#    Rate.Mining.Next
#        Mining Rates (Mining.Amount changes minimum/maximum usetimes of a deposit,
#        Mining.Next changes chance to have next use of a deposit)
#
#    Rate.Talent
#        Talent Point rates
#        Default: 1
#
#    Rate.RespecBaseCost
#        Minimum cost for unlearning talents, in gold
#        Default: 1
#
#    Rate.RespecMultiplicativeCost
#        Cost * multiplier = total cost of unlearning talents, in gold
#        Default: 5
#
#    Rate.RespecMaxMultiplier
#        RespecMultiplicativeCost * RespecMaxMultiplier = maximum cost of unlearning talents, in gold
#        Default: 10
#
#    Rate.RespecMinMultiplier
#        Once the player exceeds this multiplier value, they can never drop below it again
#        Default: 2
#
#    Rate.Reputation.Gain
#         Reputation Gain rate
#         Default: 1
#
#    Rate.Reputation.LowLevel.Kill
#         Reputation Gain form low level kill (grey creture)
#         Default: 0.2
#
#    Rate.Reputation.LowLevel.Quest
#         Reputation Gain rate
#         Default: 1
#
#    Rate.InstanceResetTime
#        Multiplier for the number of days in between global raid/heroic instance resets.
#        Default: 1
#
#    SkillGain.Crafting
#    SkillGain.Defense
#    SkillGain.Gathering
#    SkillGain.Weapon
#         crafting/defense/gathering/weapon skills gain at skill grow (1,2,...)
#         Default: 1
#
#    SkillChance.Orange
#    SkillChance.Yellow
#    SkillChance.Green
#    SkillChance.Grey
#        Skill chance values (0..100)
#        Default: 100-75-25-0
#
#    SkillChance.MiningSteps
#    SkillChance.SkinningSteps
#         For skinning and Mining chance decrease with skill level.
#         Default: 0  - no decrease
#                  75 - in 2 times each 75 skill points
#
#    SkillFail.Loot.Fishing
#         For fishing instead fail provided junk loot
#         Default: 0 (disabled)
#                  1 (enabled)
#
#    SkillFail.Gain.Fishing
#         For fishing skill gain possible at fail also
#         Default: 0 (disabled)
#                  1 (enabled)
#
#    SkillFail.Possible.FishingPool
#         For fishing pool impossible fail from low skill by default
#         Default: 1 (enabled)
#                  0 (disabled)
#
#    DurabilityLossChance.Damage
#         Chance lost one from equiped items durability point at damage apply or receive.
#         Default: 0.5 (100/0.5 = 200) Each 200 damage apply one from 19 possible equipped items
#
#    DurabilityLossChance.Absorb
#         Chance lost one from armor items durability point at damage absorb.
#         Default: 0.5 (100/0.5 = 200) Each 200 absorbs apply one from 15 possible armor equipped items
#
#    DurabilityLossChance.Parry
#         Chance lost weapon durability point at parry.
#         Default: 0.05 (100/0.05 = 2000) Each 2000 parry attacks main weapon lost point
#
#    DurabilityLossChance.Block
#         Chance lost sheild durability point at damage block.
#         Default: 0.05 (100/0.05 = 2000) Each 2000 partly or full blocked attacks shield lost point
#
#    Death.SicknessLevel
#         Starting Character start gain sickness at spirit resurrection (1 min)
#         Default: 11
#                  -10 - character will have full time (10min) sickness at 1 level
#                  maxplayerlevel+1 - character will not have sickness at any level
#
#    Death.CorpseReclaimDelay.PvP
#    Death.CorpseReclaimDelay.PvE
#         Enabled/disabled increase corpse reclaim delay at often PvP/PvE deaths
#         Default: 1 (enabled)
#                  0 (disabled)
#
#    Death.Bones.World
#    Death.Bones.Battleground
#         Enabled/disabled creating bones instead corpse at resurrection (in normal zones/instacnes, or battleground)
#         Default: 1 (enabled)
#                  0 (disabled)
#
#    Death.Ghost.RunSpeed.World
#    Death.Ghost.RunSpeed.Battleground
#         Modifies the speed of player's ghosts, removed upon reviving, not permanent/saved, in non-BG and BG maps
#         Default: 1.0 (normal speed)
#
###################################################################################################################

Rate.Health = 1
Rate.Mana = 1
Rate.Rage.Income = 1
Rate.Rage.Loss = 1
Rate.Focus = 1
Rate.Loyalty = 1
Rate.Energy = 1
Rate.Skill.Discovery = 1
Rate.Drop.Item.Poor = 1
Rate.Drop.Item.Normal = 1
Rate.Drop.Item.Uncommon = 1
Rate.Drop.Item.Rare = 1
Rate.Drop.Item.Epic = 1
Rate.Drop.Item.Legendary = 1
Rate.Drop.Item.Artifact = 1
Rate.Drop.Item.Referenced = 1
Rate.Drop.Money = 1
Rate.XP.Kill    = 1
Rate.XP.Kill.Elite = 1
Rate.XP.Quest   = 1
Rate.XP.Explore = 1
Rate.XP.Personal.Min = 1
Rate.XP.Personal.Max = 1
Rate.Rest.InGame = 1
Rate.Rest.Offline.InTavernOrCity = 1
Rate.Rest.Offline.InWilderness = 1
Rate.Damage.Fall = 1
Rate.Auction.Time = 1
Rate.Auction.Deposit = 1
Rate.Auction.Cut = 1
Auction.Deposit.Min = 0
Auction.AccountConcurrentLimit = 0
Rate.Honor = 1
Rate.Mining.Amount = 1
Rate.Mining.Next   = 1
Rate.Talent = 1
Rate.RespecBaseCost = 1
Rate.RespecMultiplicativeCost = 5
Rate.RespecMaxMultiplier = 10
Rate.RespecMinMultiplier = 2
Rate.Reputation.Gain = 1
Rate.Reputation.LowLevel.Kill    = 0.2
Rate.Reputation.LowLevel.Quest   = 1
Rate.InstanceResetTime = 1
SkillGain.Crafting = 1
SkillGain.Defense = 1
SkillGain.Gathering = 1
SkillGain.Weapon = 1
SkillChance.Orange = 100
SkillChance.Yellow = 75
SkillChance.Green  = 25
SkillChance.Grey   = 0
SkillChance.MiningSteps   = 0
SkillChance.SkinningSteps = 0
SkillFail.Loot.Fishing = 0
SkillFail.Gain.Fishing = 0
SkillFail.Possible.FishingPool = 1
DurabilityLossChance.Damage = 0.5
DurabilityLossChance.Absorb = 0.5
DurabilityLossChance.Parry  = 0.05
DurabilityLossChance.Block  = 0.05
Death.SicknessLevel = 11
Death.CorpseReclaimDelay.PvP = 1
Death.CorpseReclaimDelay.PvE = 1
Death.Bones.World = 1
Death.Bones.Battleground = 1
Corpses.UpdateMinutes = 20
Bones.ExpireMinutes   = 60
Death.Ghost.RunSpeed.World = 1.0
Death.Ghost.RunSpeed.Battleground = 1.0
Rate.WarEffortResourceComplete = 0.0
WarEffortResourceCompletePeriod = 86400

###################################################################################################################
# BATTLEGROUND CONFIG
#
#    Battleground.CastDeserter
#        Cast Deserter spell at player who leave battleground in progress
#        Default: 1 (enable)
#                 0 (disable)
#
#    Battleground.QueueAnnouncer.Join
#        Enable queue announcer posting to chat at join
#        Default: 0 (not send)
#                 1 (send to joined player only)
#                 2 (send to all players)
#
#    Battleground.QueueAnnouncer.Start
#        Enable queue announcer posting to chat at BG start
#        Default: 0 (disable)
#                 1 (enable)
#
#    Battleground.QueuesCount
#        Maximum battleground queues a player can join at the same time
#        Default: 0 (decide based on current content patch)
#
#    Battleground.InvitationType
#        Set Battleground invitation type
#        Default: 1 (Experimental - don't allow to invite much more players of one faction)
#                 0 (normal - invite as much players to bg as possible, don't bother with ballance)
#
#    Battleground.PrematureFinishTimer
#        The time to end the bg if there are less than MinPlayersPerTeam on one side in milliseconds
#        Default: 300000 (5 minutes)
#                 0 - disable (not recommended)
#
#    BattleGround.PremadeGroupWaitForMatch
#        The time in which premade group of 1 faction waits in BG Queue for premade group of other faction
#                 1800000 (30 minutes)
#        Default: 0 - disable premade group matches (group always added to bg team in normal way)
#
#    BattleGround.RandomizeQueues
#        Randomize the queue positions
#        Default: 0 - first players to queue will be invited first
#
#    BattleGround.GroupQueueLimit
#        The maximum number of players that can be queued as a group
#        If the group is bigger than this value, players are queued solo
#        Default: 40
#
#    Alterac.MinPlayersInQueue
#       Minimum players in queue per faction before starting a match.
#       Default: 0 - use database value
#
#    Alterac.InitMaxPlayers
#       Maximum number of players at AV creation.
#       To be efficient, you should have 'InitMaxPlayers * 2 > MinPlayersInQueue'
#       Default: 0 - use database value
#
###################################################################################################################

Battleground.CastDeserter = 1
Battleground.QueueAnnouncer.Join = 0
Battleground.QueueAnnouncer.Start = 0
Battleground.InvitationType = 1
BattleGround.PrematureFinishTimer = 300000
BattleGround.PremadeGroupWaitForMatch = 0
BattleGround.PremadeQueue.MinGroupSize = 6
BattleGround.QueuesCount            = 0
BattleGround.TagInBattleGrounds     = 1
BattleGround.RandomizeQueues = 0
BattleGround.GroupQueueLimit = 40
Alterac.MinPlayersInQueue = 0
Alterac.InitMaxPlayers = 0

###################################################################################################################
# OUTDOOR PVP CONFIG
#
#    OutdoorPvp.SIEnabled               #Enable Silithus Outdoor pvp
#    OutdoorPvp.EPEnabled               #Enable Eastern Plaguelands Outdoor pvp
#        Default: 1 (enable)
#                 0 (disable)
#
###################################################################################################################

OutdoorPvp.SIEnabled = 1
OutdoorPvp.EPEnabled = 1

###################################################################################################################
#
# NETWORK CONFIG
#
#    Network.Threads
#         Number of threads for network, recommend 1 thread per 1000 connections.
#         Default: 1
#
#    Network.OutKBuff
#         The size of the output kernel buffer used ( SO_SNDBUF socket option, tcp manual ).
#         Default: -1 (Use system default setting)
#
#    Network.OutUBuff
#         Userspace buffer for output. This is amount of memory reserved per each connection.
#         Default: 65536
#
#    Network.TcpNoDelay:
#         TCP Nagle algorithm setting
#         Default: 0 (enable Nagle algorithm, less traffic, more latency)
#                  1 (TCP_NO_DELAY, disable Nagle algorithm, more traffic but less latency)
#
#    Network.KickOnBadPacket
#         Kick player on bad packet format.
#         Default: 0 - do not kick
#                  1 - kick
#
#    Network.PacketBroadcast.Threads
#         Number of threads for packets broadcasting.
#         Default: 0 - disabled
#
#    Network.PacketBroadcast.Frequency
#         How often packet broadcasting threads run in milliseconds.
#         Default: 50
#
#    Network.Interval
#         How often ACE will transmit the client's outbound packet buffer in milliseconds.
#         Default: 10
#
###################################################################################################################

Network.Threads = 1
Network.OutKBuff = -1
Network.OutUBuff = 65536
Network.TcpNodelay = 1
Network.KickOnBadPacket = 0
Network.PacketBroadcast.Threads = 0
Network.PacketBroadcast.Frequency = 50
Network.PacketBroadcast.ReduceVisDistance.DiffAbove = 0
Network.Interval = 10

###################################################################################################################
# CONSOLE, REMOTE ACCESS AND SOAP
#
#    Console.Enable
#        Enable console
#        Default: 1 - on
#                 0 - off
#
#    Ra.Enable
#        Enable remote console
#        Default: 0 - off
#                 1 - on
#
#    Ra.IP
#        Default remote console ip address, use 0.0.0.0 for every address
#
#    Ra.Port
#        Default remote console port
#        Default: 3443
#
#    Ra.MinLevel
#        Minimum level that's required to login,3 by default
#        Default: 3 (Administrator)
#
#    Ra.Secure
#        Kick client on wrong pass
#                 0 - off
#        Default: 1 - on
#
#    Ra.Stricted
#        Not allow execute console level only commands remotly by RA
#                 0 - off
#        Default: 1 - on
#
#
#    SOAP.Enable
#        Enable soap service
#        Default: 0 - off
#                 1 - on
#
#    SOAP.IP
#        Bound SOAP service ip address, use 0.0.0.0 to access from everywhere
#        Default: 127.0.0.1
#
#    SOAP.Port
#        SOAP port
#        Default: 7878
#
###################################################################################################################

Console.Enable = 1
Ra.Enable = 0
Ra.IP = 0.0.0.0
Ra.Port = 3443
Ra.MinLevel = 3
Ra.Secure = 1
Ra.Stricted = 1

SOAP.Enabled = 0
SOAP.IP = 127.0.0.1
SOAP.Port = 7878

###################################################################################################################
# CHARACTER DELETION
#
#    CharDelete.Method
#        Character deletion behavior
#        Default: 0  - Completely remove the character from the database
#                 1  - Unlinking, the character gets unlinked from the account,
#                      the name gets freed up and appears as deleted ingame
#
#    CharDelete.MinLevel
#        Character gets deleted by CharDelete.Method=0 when the character
#        hasn't the specified level yet.
#        Default: 0  - For all characters the specified mode will be used
#                 1+ - Only for players which have reached the specified level
#                      will be deleted by the specified mode.
#                      the rest will be deleted by CharDelete.Method=0
#
#    CharDelete.KeepDays
#        Define the amount of days for which the characters are kept in the database before
#        they will be removed
#        Default: 30
#                 0  - Don't delete any characters, they stay in the database forever.
#
###################################################################################################################

CharDelete.Method = 0
CharDelete.MinLevel = 0
CharDelete.KeepDays = 30

###################################################################################################################
# AUCTION HOUSE BOT
#
#    AHBot.Enable
#        Enable AH bot.
#        Default: 0 - off
#                 1 - on
#
#    AHBot.ah.id
#        The ID of the auction house from AuctionHouse.dbc into which to put items.
#        Default: 7 - Blackwater Auction House
#
#    AHBot.ah.fid
#        The faction template ID of the virtual auctioneer.
#        Default: 120 - Booty Bay
#
#    AHBot.itemcount
#        How many items to put into the auction house.
#        Default: 50
#
###################################################################################################################
AHBot.Enable = 0
AHBot.ah.id = 7
AHBot.ah.fid = 120
AHBot.itemcount = 50
#AHBot.bot.guid = 1123
#AHBot.bot.account = 32377

###################################################################################################################
# PLAYER BOTS
#
#    RandomBot.Enable
#        Enables automatic spawning of random bots. These bots have no AI. You have to code one and assign it.
#        Default: 0 - off
#                 1 - on
#
#    RandomBot.MinBots
#        Minimum amount of random bots the server will try to spawn.
#        Default: 0
#
#    RandomBot.MaxBots
#        Maximum amount of random bots the server will try to spawn.
#        Default: 0
#
#    RandomBot.Refresh
#        How often the the server will check if there are enough bots spawned.
#        Default: 60000 (1 minute)
#
#    PlayerBot.Debug
#        Enables additional debugging information about bots that is printed in the console.
#        Default: 0 - off
#                 1 - on
#
#    PlayerBot.UpdateMs
#        How often the AI of bots will be updated. A bigger delay will make them less responsive.
#        Default: 1000 (1 second)
#
#    PlayerBot.ShowInWhoList
#        Enables displaying characters controlled by bots in /who results.
#        Default: 0 - off
#                 1 - on
#
#    PartyBot.MaxBots
#        Maximum number of party bots that normal players are allowed to summon.
#        Default: 0 (no limit)
#
#    PartyBot.SkipChecks
#        Disables the additional restrictions that apply when a normal player tries to summon a party bot.
#        Default: 0 (restricted)
#                 1 (no restrictions)
#
###################################################################################################################
RandomBot.Enable = 0
RandomBot.MinBots = 0
RandomBot.MaxBots = 0
RandomBot.Refresh = 60000
PlayerBot.Debug = 0
PlayerBot.UpdateMs = 1000
PlayerBot.ShowInWhoList = 0
PartyBot.MaxBots = 0
PartyBot.SkipChecks = 0

###################################################################################################################
#    Database-based chat
###################################################################################################################
OfflineChat.Enable = 0
OfflineChat.Port   = 3444
OfflineChat.IP     = 0.0.0.0
OfflineChat.Password= "p8zqkt"

###################################################################################################################
#    Mail flooding mitigation
###################################################################################################################
MailSpam.ExpireSecs                             = 0
MailSpam.MaxMails                               = 2
MailSpam.Level                                  = 1
MailSpam.Money                                  = 0
MailSpam.Item                                   = 0

###################################################################################################################
#    Dynamic respawn rates - Disabled by default
###################################################################################################################
DynamicRespawn.Range                    = -1
DynamicRespawn.PercentPerPlayer         = 0
DynamicRespawn.MaxReductionRate         = 0
DynamicRespawn.MinRespawnTime           = 0
DynamicRespawn.AffectRespawnTimeBelow   = 0
DynamicRespawn.AffectLevelBelow         = 0
DynamicRespawn.PlayersThreshold         = 0
DynamicRespawn.PlayersMaxLevelDiff      = 0

A  => config/realmd.conf.example +189 -0
@@ 1,189 @@
##################################4##########
# MaNGOS realmd configuration file         #
############################################

[RealmdConf]
ConfVersion=2020010501

###################################################################################################################
# REALMD SETTINGS
#
#    LoginDatabaseInfo
#        Database connection settings for the realm server.
#        Default: hostname;port;username;password;database
#                 .;somenumber;username;password;database - use named pipes at Windows
#                       Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini
#                 .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux
#                       Unix sockets: experimental, not tested
#
#    LogsDir
#         Logs directory setting.
#         Important: Logs dir must exists, or all logs be disable
#         Default: "" - no log directory prefix. if used log names aren't absolute paths
#                       then logs will be stored in the current directory of the running program.
#
#    PatchesDir
#         Folder to serve client patches.
#         Important: Patches dir must contain mpq files like this: <build><lang>.mpq e.g. 65535enGB.mpq
#         Default: "./patches"
#
#    MaxPingTime
#         Settings for maximum database-ping interval (minutes between pings)
#
#    RealmServerPort
#         Port on which the server will listen
#
#    BindIP
#         Bind Realm Server to IP/hostname
#         This option is useful for running multiple worldd/realmd instances
#         on different IP addresses using default ports.
#         DO NOT CHANGE THIS UNLESS YOU _REALLY_ KNOW WHAT YOU'RE DOING
#
#    PidFile
#        Realmd daemon PID file
#        Default: ""             - do not create PID file
#                 "./realmd.pid" - create PID file (recommended name)
#
#    LogLevel
#        Server console level of logging
#        0 = Minimum; 1 = Error; 2 = Detail; 3 = Full/Debug
#        Default: 0
#
#    LogTime
#        Include time in server console output [hh:mm:ss]
#        Default: 0 (no time)
#                 1 (print time)
#
#    LogFile
#        Logfile name
#        Default: "Realmd.log"
#                 "" - empty name disable creating log file
#
#    LogTimestamp
#        Logfile with timestamp of server start in name
#        Default: 0 - no timestamp in name
#                 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
#
#    LogFileLevel
#        Server file level of logging
#        0 = Minimum; 1 = Error; 2 = Detail; 3 = Full/Debug
#        Default: 0
#
#    LogColors
#        Color for messages (format "normal_color details_color debug_color error_color)
#        Colors: 0 - BLACK, 1 - RED, 2 - GREEN,  3 - BROWN, 4 - BLUE, 5 - MAGENTA, 6 -  CYAN, 7 - GREY,
#                8 - YELLOW, 9 - LRED, 10 - LGREEN, 11 - LBLUE, 12 - LMAGENTA, 13 - LCYAN, 14 - WHITE
#        Default: "" - none colors
#                 "13 7 11 9" - for example :)
#
#    UseProcessors
#        Used processors mask for multi-processors system (Used only at Windows)
#        Default: 0 (selected by OS)
#                 number (bitmask value of selected processors)
#
#    ProcessPriority
#        Process proirity setting (Used only at Windows)
#        Default: 1 (HIGH)
#                 0 (Normal)
#
#    WaitAtStartupError
#        After startup error report wait <Enter> or some time before continue (and possible close console window)
#                 -1 (wait until <Enter> press)
#        Default:  0 (not wait)
#                  N (>0, wait N secs)
#
#    MinRealmListDelay
#        Minimum amount of time, in seconds, that must pass before a second realm list request is considered legitimate
#        Default: 1
#
#    RealmsStateUpdateDelay
#        Realm list Update up delay (updated at realm list request if delay expired).
#        Default: 20
#                 0  (Disabled)
#
#    WrongPass.MaxCount
#        Number of login attemps with wrong password before the account or IP is banned
#        Default: 0  (Never ban)
#
#    WrongPass.BanTime
#        Duration of the ban in seconds (0 means permanent ban)
#        Default: 600
#
#    WrongPass.BanType
#        Ban the IP or account on which login is attempted
#        Default: 0 (Ban IP)
#                 1 (Ban Account)
#
#    ReqEmailVerification
#        Required that the user has verified their email address before allowing logins
#        Default: 0 (No verification required)
#                 1 (Verification required)
#
#    ReqEmailSince
#        Require the Email Verification Since the Timestamp
#        Default: 0 (Disabled)
#                 1530302395 (Timestamp)
#
#    GeoLocking
#        Blocks account logins when a change in geographical location is detected
#        Default: 0
#
#    StrictVersionCheck
#        Description: Prevent modified clients from connnecting
#        Default: 1 - (Enabled)
#                 0 - (Disabled)
#
#    SendMail
#        Whether the server is allowed to send emails
#        The server must have been compiled with USE_SENDGRID
#        Default: 0 (Do not send mail)
#
#    MailFrom
#        Specify the email address to send mail from
#        Default: ""
#
#    MailCertChecks
#        Whether to validate the certificates of the mail server
#        Default: 1 (Recommended)
#
#    SendGridKey
#        If SendGrid is being used for emailing, specify your API key here
#        This option must be set if SendGrid is enabled
#        Default: ""
#
#    GeolockGUID
#        The SendGrid template GUID for geolocking emails
#        Default: ""
#
###################################################################################################################

LoginDatabaseInfo = "vmangos_database;3306;mangos;mangos;realmd"
LogsDir = ""
PatchesDir = "./patches"
MaxPingTime = 30
RealmServerPort = 3724
BindIP = "0.0.0.0"
PidFile = ""
LogLevel = 0
LogTime = 0
LogFile = "Realmd.log"
LogTimestamp = 0
LogFileLevel = 0
LogColors = ""
UseProcessors = 0
ProcessPriority = 1
WaitAtStartupError = 0
MinRealmListDelay = 1
RealmsStateUpdateDelay = 20
WrongPass.MaxCount = 0
WrongPass.BanTime = 600
WrongPass.BanType = 0
ReqEmailVerification = 0
ReqEmailSince = 0
GeoLocking = 0
StrictVersionCheck = 1
SendMail = 0
MailFrom = ""
MailCertChecks = 1
SendGridKey = ""
GeolockGUID = ""

A  => docker-compose.yml.example +76 -0
@@ 1,76 @@
version: '3.7'

services:
  vmangos_database:
    container_name: vmangos_database
    build:
      context: .
      dockerfile: docker/database/Dockerfile
    restart: unless-stopped
    volumes:
      - vmangos_database:/var/lib/mysql
      - ./src/core/sql:/opt/vmangos/sql
      - ./src/world_database:/opt/vmangos/sql/world_database
      - ./backup:/backup
    environment:
      - TZ=Etc/UTC
      - MYSQL_ROOT_PASSWORD=password
      - VMANGOS_WORLD=world_full_14_june_2021
      - VMANGOS_REALM_NAME=vmangos
      - VMANGOS_REALM_IP=127.0.0.1
      - VMANGOS_REALM_PORT=8085
      - VMANGOS_REALM_ICON= 1
      - VMANGOS_REALM_FLAGS=0
      - VMANGOS_TIMEZONE=1
      - VMANGOS_ALLOWED_SECURITY_LEVEL=0
      - VMANGOS_POPULATION=0
      - VMANGOS_GAMEBUILD_MIN=0
      - VMANGOS_GAMEBUILD_MAX=0
      - VMANGOS_FLAG=2

  vmangos_realmd:
    container_name: vmangos_realmd
    build:
      context: .
      dockerfile: docker/realmd/Dockerfile
    depends_on:
      - vmangos_database
    restart: unless-stopped
    ports:
      - 3724:3724
    volumes:
      - ./config/realmd.conf:/opt/vmangos/etc/realmd.conf:ro
    environment:
      - TZ=Etc/UTC
      - WAIT_HOSTS=vmangos_database:3306
      - WAIT_TIMEOUT=120
      - VMANGOS_USER_ID=1000
      - VMANGOS_GROUP_ID=1000

  vmangos_mangos:
    container_name: vmangos_mangos
    tty: true
    stdin_open: true
    ports:
      - 8085:8085
    build:
      context: .
      dockerfile: docker/mangos/Dockerfile
    depends_on:
      - vmangos_database
    restart: unless-stopped
    volumes:
      - ./config/mangosd.conf:/opt/vmangos/etc/mangosd.conf:ro
      - ./src/data/5875:/opt/vmangos/bin/5875:ro
      - ./src/data/maps:/opt/vmangos/bin/maps:ro
      - ./src/data/mmaps:/opt/vmangos/bin/mmaps:ro
      - ./src/data/vmaps:/opt/vmangos/bin/vmaps:ro
    environment:
      - TZ=Etc/UTC
      - WAIT_HOSTS=vmangos_database:3306
      - WAIT_TIMEOUT=120
      - VMANGOS_USER_ID=1000
      - VMANGOS_GROUP_ID=1000

volumes:
  vmangos_database:

A  => docker/build/Dockerfile +102 -0
@@ 1,102 @@
# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

FROM ubuntu:20.04

ARG VMANGOS_USER_ID=1000
ARG VMANGOS_GROUP_ID=1000

ENV \
  VMANGOS_USER_ID=$VMANGOS_USER_ID \
  VMANGOS_GROUP_ID=$VMANGOS_GROUP_ID \
  DEBIAN_FRONTEND=noninteractive

RUN \
  apt-get update -y && \
  apt-get install -y \
    build-essential \
    ccache \
    cmake \
    git \
    libace-dev \
    libcurl4-openssl-dev \
    libmysqlclient-dev \
    libssl-dev \
    libtbb-dev \
    openssl \
    p7zip-full \
    zlib1g-dev

RUN \
  ln -s /usr/bin/ccache /usr/local/bin/gcc && \
  ln -s /usr/bin/ccache /usr/local/bin/g++ && \
  ln -s /usr/bin/ccache /usr/local/bin/cc && \
  ln -s /usr/bin/ccache /usr/local/bin/c++

RUN \
  export ACE_ROOT=/usr/include/ace && \
  export TBB_ROOT_DIR=/usr/include/tbb

COPY ./src/core/ /opt/core

RUN \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /opt/core && \
  mkdir -p /opt/vmangos && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /opt/vmangos && \
  mkdir -p /vmangos && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /vmangos && \
  mkdir -p /ccache && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /ccache && \
  mkdir -p /database && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /database && \
  mkdir -p /world_database && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /world_database

ENV \
  VMANGOS_THREADS=2 \
  VMANGOS_DEBUG=0 \
  VMANGOS_MALLOC=0 \
  VMANGOS_CLIENT=5875 \
  VMANGOS_EXTRACTORS=1 \
  VMANGOS_ANTICHEAT=0 \
  VMANGOS_SCRIPTS=1 \
  VMANGOS_LIBCURL=0 \
  VMANGOS_WORLD=world_full_14_june_2021

USER ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID}

CMD \
  mkdir /opt/core/build && \
  cd /opt/core/build && \
  cmake \
    -DDEBUG=$VMANGOS_DEBUG \
    -DUSE_STD_MALLOC=$VMANGOS_MALLOC \
    -DSUPPORTED_CLIENT_BUILD=$VMANGOS_CLIENT \
    -DUSE_EXTRACTORS=$VMANGOS_EXTRACTORS \
    -DUSE_ANTICHEAT=$VMANGOS_ANTICHEAT \
    -DSCRIPTS=$VMANGOS_SCRIPTS \
    -DUSE_LIBCURL=$VMANGOS_LIBCURL \
    -DCMAKE_INSTALL_PREFIX=/opt/vmangos ../ && \
  make -j $VMANGOS_THREADS && \
  make install && \
  mkdir /opt/vmangos/data && \
  mkdir /opt/vmangos/logs && \
  cp /opt/vmangos/etc/mangosd.conf.dist /opt/vmangos/etc/mangosd.conf && \
  cp /opt/vmangos/etc/realmd.conf.dist /opt/vmangos/etc/realmd.conf && \
  cp -r /opt/vmangos/* /vmangos && \
  cd /database && 7z e $VMANGOS_WORLD.7z && \
  rm -f /world_database/$VMANGOS_WORLD.sql && \
  mv $VMANGOS_WORLD.sql /world_database

A  => docker/database/Dockerfile +44 -0
@@ 1,44 @@
# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

FROM mariadb:10

ARG VMANGOS_USER_ID=1000
ARG VMANGOS_GROUP_ID=1000

ENV \
  VMANGOS_USER_ID=$VMANGOS_USER_ID \
  VMANGOS_GROUP_ID=$VMANGOS_GROUP_ID \
  VMANGOS_WORLD=world_full_14_june_2021

RUN \
  apt-get update -y && \
  apt-get install -y \
    mariadb-client \
    libcurl4-openssl-dev \
    libmysqlclient-dev \
    libssl-dev \
    openssl \
    p7zip-full \
    zlib1g-dev

RUN \
  mkdir -p /backup && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /backup

COPY ./docker/database/generate-db-1.sql /docker-entrypoint-initdb.d
COPY ./docker/database/generate-db-2.sh /docker-entrypoint-initdb.d
COPY ./docker/database/regenerate-world-db.sql /sql/regenerate-world-db.sql

A  => docker/database/generate-db-1.sql +13 -0
@@ 1,13 @@
CREATE DATABASE IF NOT EXISTS realmd DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS characters DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS mangos DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS logs DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create user 'mangos'@'localhost' identified by 'mangos';
SET PASSWORD FOR 'mangos'@'localhost' = PASSWORD('mangos');
GRANT ALL PRIVILEGES ON *.* TO 'mangos'@'%' IDENTIFIED BY 'mangos';
flush privileges;
grant all on realmd.* to mangos@'localhost' with grant option;
grant all on characters.* to mangos@'localhost' with grant option;
grant all on mangos.* to mangos@'localhost' with grant option;
grant all on logs.* to mangos@'localhost' with grant option;
flush privileges;

A  => docker/database/generate-db-2.sh +32 -0
@@ 1,32 @@
#!/bin/sh

echo "[VMaNGOS]: Importing databases..."

echo "[VMaNGOS]: Importing logon..."
mysql -u root -p$MYSQL_ROOT_PASSWORD realmd < /opt/vmangos/sql/logon.sql

echo "[VMaNGOS]: Importing logs..."
mysql -u root -p$MYSQL_ROOT_PASSWORD logs < /opt/vmangos/sql/logs.sql

echo "[VMaNGOS]: Importing characters..."
mysql -u root -p$MYSQL_ROOT_PASSWORD characters < /opt/vmangos/sql/characters.sql

echo "[VMaNGOS]: Importing world..."
mysql -u root -p$MYSQL_ROOT_PASSWORD mangos < /opt/vmangos/sql/world_database/$VMANGOS_WORLD.sql

echo "[VMaNGOS]: Importing database updates..."
[ -e /opt/vmangos/sql/migrations/world_db_updates.sql ] && \
  mysql -u root -p$MYSQL_ROOT_PASSWORD mangos < /opt/vmangos/sql/migrations/world_db_updates.sql
[ -e /opt/vmangos/sql/migrations/characters_db_updates.sql ] && \
  mysql -u root -p$MYSQL_ROOT_PASSWORD characters < /opt/vmangos/sql/migrations/characters_db_updates.sql
[ -e /opt/vmangos/sql/migrations/logon_db_updates.sql ] && \
  mysql -u root -p$MYSQL_ROOT_PASSWORD realmd < /opt/vmangos/sql/migrations/logon_db_updates.sql

echo "[VMaNGOS]: Upgrading mysql..."
mysql_upgrade -u root -p$MYSQL_ROOT_PASSWORD

echo "[VMaNGOS]: Configuring default realm..."
mysql -u root -p$MYSQL_ROOT_PASSWORD -e \
  "INSERT INTO realmd.realmlist (name, address, port, icon, realmflags, timezone, allowedSecurityLevel, population, gamebuild_min, gamebuild_max, flag, realmbuilds) VALUES ('$VMANGOS_REALM_NAME', '$VMANGOS_REALM_IP', '$VMANGOS_REALM_PORT', '$VMANGOS_REALM_ICON', '$VMANGOS_REALM_FLAGS', '$VMANGOS_TIMEZONE', '$VMANGOS_ALLOWED_SECURITY_LEVEL', '$VMANGOS_POPULATION', '$VMANGOS_GAMEBUILD_MIN', '$VMANGOS_GAMEBUILD_MAX', '$VMANGOS_FLAG', '');"

echo "[VMaNGOS]: Database creation complete!"

A  => docker/database/regenerate-world-db.sql +6 -0
@@ 1,6 @@
DROP DATABASE mangos;
CREATE DATABASE mangos DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON *.* TO 'mangos'@'%' IDENTIFIED BY 'mangos';
flush privileges;
grant all on mangos.* to mangos@'localhost' with grant option;
flush privileges;

A  => docker/extractors/Dockerfile +56 -0
@@ 1,56 @@
# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

FROM ubuntu:20.04

ARG VMANGOS_USER_ID=1000
ARG VMANGOS_GROUP_ID=1000

ENV \
  VMANGOS_USER_ID=$VMANGOS_USER_ID \
  VMANGOS_GROUP_ID=$VMANGOS_GROUP_ID \
  DEBIAN_FRONTEND=noninteractive

RUN \
  apt-get update -y && \
  apt-get install -y \
    libace-dev \
    libcurl4-openssl-dev \
    libmysqlclient-dev \
    libssl-dev \
    libtbb-dev \
    openssl \
    zlib1g-dev

RUN \
  mkdir -p /opt/vmangos && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /opt/vmangos && \
  mkdir -p /client_data && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /client_data && \
  mkdir -p /mmap_contrib && \
  chown -R ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID} /mmap_contrib

COPY ./vmangos/bin/mapextractor /opt/vmangos/bin/mapextractor
COPY ./vmangos/bin/vmapextractor /opt/vmangos/bin/vmapextractor
COPY ./vmangos/bin/vmap_assembler /opt/vmangos/bin/vmap_assembler
COPY ./vmangos/bin/MoveMapGen /opt/vmangos/bin/MoveMapGen
RUN chmod +x /opt/vmangos/bin

WORKDIR /client_data

USER ${VMANGOS_USER_ID}:${VMANGOS_GROUP_ID}

CMD /opt/vmangos/bin/mapextractor /client_data

A  => docker/mangos/Dockerfile +54 -0
@@ 1,54 @@
# vmangos-docker
# Copyright (C) 2021-present  Michael Serajnik  https://sr.ht/~mser/

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

FROM ubuntu:20.04

ARG VMANGOS_USER_ID=1000
ARG VMANGOS_GROUP_ID=1000

ENV \
  VMANGOS_USER_ID=$VMANGOS_USER_ID \
  VMANGOS_GROUP_ID=$VMANGOS_GROUP_ID \
  DEBIAN_FRONTEND=noninteractive

RUN \
  apt-get update -y && \
  apt-get install -y \
    libace-dev \
    libcurl4-openssl-dev \
    libmysqlclient-dev \
    libssl-dev \
    libtbb-dev \
    openssl \