Merge branch 'azerothcore:master' into Playerbot

This commit is contained in:
ZhengPeiRu21
2022-11-07 13:20:52 -07:00
committed by GitHub
56 changed files with 702 additions and 334 deletions
+1 -1
View File
@@ -49,5 +49,5 @@
// "postCreateCommand": "apt-get update && apt-get install -y curl", // "postCreateCommand": "apt-get update && apt-get install -y curl",
// Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root. // Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
"remoteUser": "acore" "remoteUser": "root"
} }
+1 -1
View File
@@ -7,7 +7,7 @@ insert_final_newline = true
trim_trailing_whitespace = true trim_trailing_whitespace = true
max_line_length = 80 max_line_length = 80
[*.{json,ts,js}] [*.{json,ts,js,yml}]
charset = utf-8 charset = utf-8
indent_style = space indent_style = space
indent_size = 2 indent_size = 2
+1
View File
@@ -21,6 +21,7 @@ jobs:
name: ${{ matrix.compiler }} name: ${{ matrix.compiler }}
env: env:
COMPILER: ${{ matrix.compiler }} COMPILER: ${{ matrix.compiler }}
if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Cache - name: Cache
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
name: ${{ matrix.os }}-${{ matrix.compiler }} name: ${{ matrix.os }}-${{ matrix.compiler }}
env: env:
COMPILER: ${{ matrix.compiler }} COMPILER: ${{ matrix.compiler }}
if: github.repository == 'azerothcore/azerothcore-wotlk' if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Cache - name: Cache
+10 -1
View File
@@ -29,7 +29,16 @@ jobs:
name: ${{ matrix.os }}-${{ matrix.compiler }} name: ${{ matrix.os }}-${{ matrix.compiler }}
env: env:
COMPILER: ${{ matrix.compiler }} COMPILER: ${{ matrix.compiler }}
if: github.repository == 'azerothcore/azerothcore-wotlk' && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'file-cpp') || github.event.label.name == 'file-cpp' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') if: |
github.repository == 'azerothcore/azerothcore-wotlk'
&& !github.event.pull_request.draft
&& (
github.ref == 'refs/heads/master'
|| contains(github.event.pull_request.labels.*.name, 'file-cpp'
|| github.event.label.name == 'file-cpp'
|| contains(github.event.pull_request.labels.*.name, 'run-build')
|| github.event.label.name == 'run-build')
)
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Cache - name: Cache
+10 -1
View File
@@ -23,7 +23,16 @@ jobs:
name: ${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.modules }}-modules name: ${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.modules }}-modules
env: env:
COMPILER: ${{ matrix.compiler }} COMPILER: ${{ matrix.compiler }}
if: github.repository == 'azerothcore/azerothcore-wotlk' && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'file-cpp') || github.event.label.name == 'file-cpp' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') if: |
github.repository == 'azerothcore/azerothcore-wotlk'
&& !github.event.pull_request.draft
&& (
github.ref == 'refs/heads/master'
|| contains(github.event.pull_request.labels.*.name, 'file-cpp'
|| github.event.label.name == 'file-cpp'
|| contains(github.event.pull_request.labels.*.name, 'run-build')
|| github.event.label.name == 'run-build')
)
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Checkout modules - name: Checkout modules
+84 -17
View File
@@ -11,13 +11,16 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
docker-build-n-deploy: docker-build-n-deploy-dev:
strategy: strategy:
fail-fast: true fail-fast: true
matrix: matrix:
os: [ubuntu-20.04] os: [ubuntu-20.04]
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
if: github.repository == 'azerothcore/azerothcore-wotlk' && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') if: |
github.repository == 'azerothcore/azerothcore-wotlk'
&& !github.event.pull_request.draft
&& (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build')
env: env:
COMPOSE_DOCKER_CLI_BUILD: 1 COMPOSE_DOCKER_CLI_BUILD: 1
DOCKER_BUILDKIT: 1 DOCKER_BUILDKIT: 1
@@ -40,13 +43,8 @@ jobs:
docker --version docker --version
docker compose --version docker compose --version
# TODO: make it work - name: Set up Docker Buildx
# - uses: whoan/docker-build-with-cache-action@v5 uses: docker/setup-buildx-action@v1
# with:
# image_tag: master
# username: ${{ secrets.DOCKERHUB_USERNAME }}
# password: ${{ secrets.DOCKERHUB_TOKEN }}
# compose_file: docker-compose.yml
- name: Login to Docker Hub - name: Login to Docker Hub
if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master' if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master'
@@ -55,20 +53,21 @@ jobs:
username: ${{ secrets.DOCKERHUB_USERNAME }} username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
# before cache
# needed to avoid ccache injected into these images
- name: Build Dev - name: Build Dev
if: github.repository == 'azerothcore/azerothcore-wotlk' if: github.repository == 'azerothcore/azerothcore-wotlk'
env: env:
#DOCKER_IMAGE_TAG: ${{ steps.extract_branch.outputs.branch }} #DOCKER_IMAGE_TAG: ${{ steps.extract_branch.outputs.branch }}
DOCKER_EXTENDS_BIND: abstract-no-bind
DOCKER_CLIENT_TIMEOUT: 400 DOCKER_CLIENT_TIMEOUT: 400
COMPOSE_HTTP_TIMEOUT: 400 COMPOSE_HTTP_TIMEOUT: 400
run: | run: |
export CACHEBUST=$EPOCHSECONDS
export DOCKER_USER_ID=$(id -u) export DOCKER_USER_ID=$(id -u)
export DOCKER_GROUP_ID=$(id -u) export DOCKER_GROUP_ID=$(id -u)
# pull the images first to load the docker cache layers
./acore.sh docker pull
./acore.sh docker build ./acore.sh docker build
output=$(./acore.sh version | grep "AzerothCore Rev. ") && version=${output#"AzerothCore Rev. "}
DOCKER_IMAGE_TAG=$version docker compose --profile dev --profile local build
- name: Deploy Dev - name: Deploy Dev
#env: #env:
@@ -76,6 +75,50 @@ jobs:
if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master' if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master'
run: | run: |
docker compose --profile dev --profile local push docker compose --profile dev --profile local push
output=$(./acore.sh version | grep "AzerothCore Rev. ") && version=${output#"AzerothCore Rev. "}
DOCKER_IMAGE_TAG=$version docker compose --profile dev --profile local push
docker-build-n-deploy-prod:
strategy:
fail-fast: true
matrix:
os: [ubuntu-20.04]
runs-on: ${{ matrix.os }}
if: |
github.repository == 'azerothcore/azerothcore-wotlk'
&& !github.event.pull_request.draft
&& (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build')
env:
COMPOSE_DOCKER_CLI_BUILD: 1
DOCKER_BUILDKIT: 1
BUILDKIT_INLINE_CACHE: 1
steps:
- name: Extract branch name
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
- uses: actions/checkout@v2
- name: Configure
run: |
sudo rm -rf /usr/local/lib/android
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
docker --version
docker compose --version
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to Docker Hub
if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master'
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Cache - name: Cache
uses: actions/cache@v2 uses: actions/cache@v2
@@ -90,16 +133,19 @@ jobs:
if: github.repository == 'azerothcore/azerothcore-wotlk' if: github.repository == 'azerothcore/azerothcore-wotlk'
env: env:
#DOCKER_IMAGE_TAG: ${{ steps.extract_branch.outputs.branch }} #DOCKER_IMAGE_TAG: ${{ steps.extract_branch.outputs.branch }}
DOCKER_EXTENDS_BIND: abstract-no-bind
DOCKER_AC_BUILD_TARGET: build
DOCKER_CLIENT_TIMEOUT: 220 DOCKER_CLIENT_TIMEOUT: 220
COMPOSE_HTTP_TIMEOUT: 220 COMPOSE_HTTP_TIMEOUT: 220
run: | run: |
export DOCKER_USER_ID=$(id -u) export DOCKER_USER_ID=$(id -u)
export DOCKER_GROUP_ID=$(id -u) export DOCKER_GROUP_ID=$(id -u)
# pull the images first to load the docker cache layers
./acore.sh docker prod:pull
./acore.sh docker prod:build ./acore.sh docker prod:build
docker compose run --no-deps --name build ac-build echo "image created" output=$(./acore.sh version | grep "AzerothCore Rev. ") && version=${output#"AzerothCore Rev. "}
docker cp build:/azerothcore/var/ccache var/docker/ DOCKER_IMAGE_TAG=$version ./acore.sh docker prod:build
# create the container to allow the copy right after
docker compose create ac-build-prod
docker compose cp ac-build-prod:/azerothcore/var/ccache var/docker/
echo "ccache exported" echo "ccache exported"
- name: Deploy Production images - name: Deploy Production images
@@ -108,3 +154,24 @@ jobs:
if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master' if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master'
run: | run: |
docker compose --profile prod push docker compose --profile prod push
output=$(./acore.sh version | grep "AzerothCore Rev. ") && version=${output#"AzerothCore Rev. "}
DOCKER_IMAGE_TAG=$version docker compose --profile prod push
dispatch-acore-docker:
needs: [ docker-build-n-deploy-prod , docker-build-n-deploy-dev]
runs-on: ubuntu-latest
steps:
- name: Extract branch name
shell: bash
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
id: extract_branch
- name: Repository Dispatch
if: github.repository == 'azerothcore/azerothcore-wotlk' && steps.extract_branch.outputs.branch == 'master'
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ secrets.ACORE_DOCKER_REPO_ACCESS_TOKEN }}
repository: azerothcore/acore-docker
event-type: azerothcore-new-images
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'
+1 -1
View File
@@ -9,7 +9,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
if: github.repository == 'azerothcore/azerothcore-wotlk' if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
with: with:
+1 -1
View File
@@ -5,7 +5,7 @@ on:
jobs: jobs:
issue_labeler: issue_labeler:
if: github.repository == 'azerothcore/azerothcore-wotlk' if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Issue Labeler name: Issue Labeler
steps: steps:
+4 -1
View File
@@ -20,7 +20,10 @@ jobs:
- macos-12 - macos-12
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
name: ${{ matrix.os }} name: ${{ matrix.os }}
if: github.repository == 'azerothcore/azerothcore-wotlk' && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') if: |
github.repository == 'azerothcore/azerothcore-wotlk'
&& !github.event.pull_request.draft
&& (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build')
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Cache - name: Cache
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
name: ${{ matrix.os }}-${{ matrix.compiler }} name: ${{ matrix.os }}-${{ matrix.compiler }}
env: env:
COMPILER: ${{ matrix.compiler }} COMPILER: ${{ matrix.compiler }}
if: github.repository == 'azerothcore/azerothcore-wotlk' if: github.repository == 'azerothcore/azerothcore-wotlk' && !github.event.pull_request.draft
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Cache - name: Cache
+4 -1
View File
@@ -20,7 +20,10 @@ jobs:
name: ${{ matrix.os }} name: ${{ matrix.os }}
env: env:
BOOST_ROOT: C:\local\boost_1_79_0 BOOST_ROOT: C:\local\boost_1_79_0
if: github.repository == 'azerothcore/azerothcore-wotlk' && (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build') if: |
github.repository == 'azerothcore/azerothcore-wotlk'
&& !github.event.pull_request.draft
&& (github.ref == 'refs/heads/master' || contains(github.event.pull_request.labels.*.name, 'run-build') || github.event.label.name == 'run-build')
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Configure OS - name: Configure OS
+1 -1
View File
@@ -9,7 +9,7 @@ USER_CONF_PATH=${USER_CONF_PATH:-"$AC_PATH_CONF/config.sh"}
if [ -f "$USER_CONF_PATH" ]; then if [ -f "$USER_CONF_PATH" ]; then
source "$USER_CONF_PATH" # should overwrite previous source "$USER_CONF_PATH" # should overwrite previous
else else
echo "NOTICE: file <$USER_CONF_PATH> has not been found, you should create and configure it." echo "NOTICE: file <$USER_CONF_PATH> not found, we use default configuration only."
fi fi
# #
-3
View File
@@ -14,9 +14,6 @@ CBUILD_TESTING=ON
CSCRIPTPCH=OFF CSCRIPTPCH=OFF
CCOREPCH=OFF CCOREPCH=OFF
CCUSTOMOPTIONS='-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror"' CCUSTOMOPTIONS='-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror"'
DB_CHARACTERS_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
DB_AUTH_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
DB_WORLD_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
CONFIG_SH CONFIG_SH
case $COMPILER in case $COMPILER in
-3
View File
@@ -12,9 +12,6 @@ CTOOLS_BUILD=db-only
CSCRIPTPCH=OFF CSCRIPTPCH=OFF
CCOREPCH=OFF CCOREPCH=OFF
CCUSTOMOPTIONS='-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror"' CCUSTOMOPTIONS='-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror"'
DB_CHARACTERS_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
DB_AUTH_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
DB_WORLD_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
CONFIG_SH CONFIG_SH
case $COMPILER in case $COMPILER in
-3
View File
@@ -14,9 +14,6 @@ CTOOLS=ON
CSCRIPTPCH=OFF CSCRIPTPCH=OFF
CCOREPCH=OFF CCOREPCH=OFF
CCUSTOMOPTIONS='-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror"' CCUSTOMOPTIONS='-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror"'
DB_CHARACTERS_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
DB_AUTH_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
DB_WORLD_CONF="MYSQL_USER='root'; MYSQL_PASS='root'; MYSQL_HOST='localhost';"
CONFIG_SH CONFIG_SH
time sudo apt-get update -y time sudo apt-get update -y
+2
View File
@@ -29,6 +29,7 @@ comp_options=(
"compile: Compile only" "compile: Compile only"
"all: clean, configure and compile" "all: clean, configure and compile"
"ccacheClean: Clean ccache files, normally not needed" "ccacheClean: Clean ccache files, normally not needed"
"ccacheShowStats: show ccache statistics"
"quit: Close this menu") "quit: Close this menu")
comp_functions=( comp_functions=(
"comp_build" "comp_build"
@@ -37,6 +38,7 @@ comp_functions=(
"comp_compile" "comp_compile"
"comp_all" "comp_all"
"comp_ccacheClean" "comp_ccacheClean"
"comp_ccacheShowStats"
"comp_quit") "comp_quit")
PS3='[ Please enter your choice ]: ' PS3='[ Please enter your choice ]: '
+4
View File
@@ -17,6 +17,8 @@ function comp_ccacheEnable() {
export CCACHE_CPP2=${CCACHE_CPP2:-true} # optimization for clang export CCACHE_CPP2=${CCACHE_CPP2:-true} # optimization for clang
export CCACHE_COMPRESS=${CCACHE_COMPRESS:-1} export CCACHE_COMPRESS=${CCACHE_COMPRESS:-1}
export CCACHE_COMPRESSLEVEL=${CCACHE_COMPRESSLEVEL:-9} export CCACHE_COMPRESSLEVEL=${CCACHE_COMPRESSLEVEL:-9}
export CCACHE_COMPILERCHECK=${CCACHE_COMPILERCHECK:-content}
export CCACHE_LOGFILE=${CCACHE_LOGFILE:-"$CCACHE_DIR/cache.debug"}
#export CCACHE_NODIRECT=true #export CCACHE_NODIRECT=true
export CCUSTOMOPTIONS="$CCUSTOMOPTIONS -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache" export CCUSTOMOPTIONS="$CCUSTOMOPTIONS -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
@@ -106,6 +108,8 @@ function comp_compile() {
cd $BUILDPATH cd $BUILDPATH
comp_ccacheEnable
comp_ccacheResetStats comp_ccacheResetStats
time cmake --build . --config $CTYPE -j $MTHREADS time cmake --build . --config $CTYPE -j $MTHREADS
+49 -23
View File
@@ -45,7 +45,11 @@ RUN addgroup --gid $GROUP_ID acore && \
# must be created to set the correct permissions on them # must be created to set the correct permissions on them
RUN mkdir -p /azerothcore/env/dist/bin RUN mkdir -p /azerothcore/env/dist/bin
RUN mkdir -p /azerothcore/env/dist/data RUN mkdir -p /azerothcore/env/dist/data/Cameras
RUN mkdir -p /azerothcore/env/dist/data/dbc
RUN mkdir -p /azerothcore/env/dist/data/maps
RUN mkdir -p /azerothcore/env/dist/data/mmaps
RUN mkdir -p /azerothcore/env/dist/data/vmaps
RUN mkdir -p /azerothcore/env/dist/logs RUN mkdir -p /azerothcore/env/dist/logs
RUN mkdir -p /azerothcore/env/dist/temp RUN mkdir -p /azerothcore/env/dist/temp
RUN mkdir -p /azerothcore/env/dist/etc RUN mkdir -p /azerothcore/env/dist/etc
@@ -59,10 +63,14 @@ RUN chown -R $DOCKER_USER:$DOCKER_USER /azerothcore
USER $DOCKER_USER USER $DOCKER_USER
# copy everything so we can work directly within the container # copy only necessary files for the acore dashboard
# using tools such as vscode dev-container COPY --chown=$DOCKER_USER:$DOCKER_USER apps /azerothcore/apps
# NOTE: this folder is different by the /azerothcore (which is binded instead) COPY --chown=$DOCKER_USER:$DOCKER_USER bin /azerothcore/bin
COPY --chown=$DOCKER_USER:$DOCKER_USER . /azerothcore COPY --chown=$DOCKER_USER:$DOCKER_USER conf /azerothcore/conf
COPY --chown=$DOCKER_USER:$DOCKER_USER data /azerothcore/data
COPY --chown=$DOCKER_USER:$DOCKER_USER deps /azerothcore/deps
COPY --chown=$DOCKER_USER:$DOCKER_USER acore.json /azerothcore/acore.json
COPY --chown=$DOCKER_USER:$DOCKER_USER acore.sh /azerothcore/acore.sh
# Download deno and make sure the dashboard works # Download deno and make sure the dashboard works
RUN bash /azerothcore/acore.sh quit RUN bash /azerothcore/acore.sh quit
@@ -79,6 +87,13 @@ FROM base as dev
LABEL description="AC dev image for dev containers" LABEL description="AC dev image for dev containers"
USER $DOCKER_USER
# copy everything so we can work directly within the container
# using tools such as vscode dev-container
# NOTE: this folder is different by the /azerothcore (which is binded instead)
COPY --chown=$DOCKER_USER:$DOCKER_USER . /azerothcore
#================================================================ #================================================================
# #
# SERVICE BASE: prepare the OS for the production-ready services # SERVICE BASE: prepare the OS for the production-ready services
@@ -115,26 +130,21 @@ RUN apt-get update && apt-get install -y dos2unix gdb gdbserver google-perftools
# change timezone in container # change timezone in container
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata
# copy the sources from the host machine
COPY --chown=$DOCKER_USER:$DOCKER_USER apps /azerothcore/apps
COPY --chown=$DOCKER_USER:$DOCKER_USER bin /azerothcore/bin
COPY --chown=$DOCKER_USER:$DOCKER_USER conf /azerothcore/conf
COPY --chown=$DOCKER_USER:$DOCKER_USER data /azerothcore/data
COPY --chown=$DOCKER_USER:$DOCKER_USER deps /azerothcore/deps
COPY --chown=$DOCKER_USER:$DOCKER_USER acore.json /azerothcore/acore.json
COPY --chown=$DOCKER_USER:$DOCKER_USER acore.sh /azerothcore/acore.sh
# Correct permissions for non-root operations # Correct permissions for non-root operations
RUN chown -R $DOCKER_USER:$DOCKER_USER /home/acore RUN chown -R $DOCKER_USER:$DOCKER_USER /home/acore
RUN chown -R $DOCKER_USER:$DOCKER_USER /run RUN chown -R $DOCKER_USER:$DOCKER_USER /run
RUN chown -R $DOCKER_USER:$DOCKER_USER /opt RUN chown -R $DOCKER_USER:$DOCKER_USER /opt
RUN chown $DOCKER_USER:$DOCKER_USER /azerothcore COPY --chown=$DOCKER_USER:$DOCKER_USER --from=base /azerothcore /azerothcore
USER $DOCKER_USER USER $DOCKER_USER
# must be created to avoid permissions errors # must be created to avoid permissions errors
RUN mkdir -p /azerothcore/env/dist/data RUN mkdir -p /azerothcore/env/dist/data/Cameras
RUN mkdir -p /azerothcore/env/dist/data/dbc
RUN mkdir -p /azerothcore/env/dist/data/maps
RUN mkdir -p /azerothcore/env/dist/data/mmaps
RUN mkdir -p /azerothcore/env/dist/data/vmaps
RUN mkdir -p /azerothcore/env/dist/logs RUN mkdir -p /azerothcore/env/dist/logs
RUN mkdir -p /azerothcore/env/dist/etc RUN mkdir -p /azerothcore/env/dist/etc
RUN mkdir -p /azerothcore/env/dist/bin RUN mkdir -p /azerothcore/env/dist/bin
@@ -157,12 +167,16 @@ LABEL description="AC authserver image for local environment"
CMD ./acore.sh run-authserver CMD ./acore.sh run-authserver
USER $DOCKER_USER
FROM servicebase as worldserver-local FROM servicebase as worldserver-local
LABEL description="AC worldserver image for local environment" LABEL description="AC worldserver image for local environment"
CMD ./acore.sh run-worldserver CMD ./acore.sh run-worldserver
USER $DOCKER_USER
#================================================================ #================================================================
# #
# BUILD: compile sources # BUILD: compile sources
@@ -171,12 +185,20 @@ CMD ./acore.sh run-worldserver
FROM base as build FROM base as build
ARG DOCKER_USER=acore ARG DOCKER_USER=acore
USER $DOCKER_USER
LABEL description="AC Image used by the build stage to generate production images" LABEL description="AC Image used by the build stage to generate production images"
RUN mkdir -p /azerothcore/env/etc/ RUN mkdir -p /azerothcore/env/etc/
# .git is needed by the compiler
COPY --chown=$DOCKER_USER:$DOCKER_USER ./.git /azerothcore/.git
COPY --chown=$DOCKER_USER:$DOCKER_USER ./CMakeLists.txt /azerothcore/CMakeLists.txt
COPY --chown=$DOCKER_USER:$DOCKER_USER ./deps /azerothcore/deps
COPY --chown=$DOCKER_USER:$DOCKER_USER ./src /azerothcore/src
COPY --chown=$DOCKER_USER:$DOCKER_USER ./modules /azerothcore/modules
# check if we have ccache files available outside # check if we have ccache files available outside
RUN rm -rf /azerothcore/var/ccache/*
COPY --chown=$DOCKER_USER:$DOCKER_USER var/docker/ccache /azerothcore/var/ccache COPY --chown=$DOCKER_USER:$DOCKER_USER var/docker/ccache /azerothcore/var/ccache
COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/authserver.conf.dockerdist /azerothcore/env/dist/etc/authserver.conf.dockerdist COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/authserver.conf.dockerdist /azerothcore/env/dist/etc/authserver.conf.dockerdist
COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/worldserver.conf.dockerdist /azerothcore/env/dist/etc/worldserver.conf.dockerdist COPY --chown=$DOCKER_USER:$DOCKER_USER env/docker/etc/worldserver.conf.dockerdist /azerothcore/env/dist/etc/worldserver.conf.dockerdist
@@ -207,6 +229,7 @@ FROM authserver-local as authserver
LABEL description="AC Production: authserver" LABEL description="AC Production: authserver"
ARG DOCKER_USER=acore ARG DOCKER_USER=acore
USER $DOCKER_USER
COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/etc /azerothcore/env/dist/etc COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/etc /azerothcore/env/dist/etc
COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/authserver /azerothcore/env/dist/bin/authserver COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/authserver /azerothcore/env/dist/bin/authserver
@@ -222,6 +245,7 @@ FROM worldserver-local as worldserver
LABEL description="AC Production: worldserver" LABEL description="AC Production: worldserver"
ARG DOCKER_USER=acore ARG DOCKER_USER=acore
USER $DOCKER_USER
RUN mkdir -p /azerothcore/env/dist/bin/lua_scripts RUN mkdir -p /azerothcore/env/dist/bin/lua_scripts
COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/etc /azerothcore/env/dist/etc COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/etc /azerothcore/env/dist/etc
@@ -255,13 +279,15 @@ RUN addgroup --gid $GROUP_ID acore && \
passwd -d acore && \ passwd -d acore && \
echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers echo 'acore ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
# ENV DATAPATH=/azerothcore/env/dist/data-temp
ENV DATAPATH=/azerothcore/env/dist/data ENV DATAPATH=/azerothcore/env/dist/data
ENV DATAPATH_ZIP=/tmp/data.zip ENV DATAPATH_ZIP=/tmp/data.zip
RUN mkdir -p "$DATAPATH"
ARG CACHEBUST=1
# RUN --mount=type=bind,target=/azerothcore-temp,readwrite --mount=type=cache,target=/azerothcore/env/dist/data-temp /azerothcore-temp/acore.sh client-data && cp -rT /azerothcore/env/dist/data-temp/ /azerothcore/env/dist/data && chown -R $DOCKER_USER:$DOCKER_USER /azerothcore
RUN --mount=type=bind,target=/azerothcore-temp,readwrite /azerothcore-temp/acore.sh client-data && chown -R $DOCKER_USER:$DOCKER_USER /azerothcore RUN --mount=type=bind,target=/azerothcore-temp,readwrite /azerothcore-temp/acore.sh client-data && chown -R $DOCKER_USER:$DOCKER_USER /azerothcore
RUN apt-get remove --purge -y tzdata curl unzip && apt-get autoremove -y
USER $DOCKER_USER USER $DOCKER_USER
#================================================================ #================================================================
@@ -302,14 +328,14 @@ USER $DOCKER_USER
WORKDIR /azerothcore/env/client/ WORKDIR /azerothcore/env/client/
RUN mkdir -p /azerothcore/env/client/Cameras
RUN mkdir -p /azerothcore/env/client/dbc RUN mkdir -p /azerothcore/env/client/dbc
RUN mkdir -p /azerothcore/env/client/maps RUN mkdir -p /azerothcore/env/client/maps
RUN mkdir -p /azerothcore/env/client/mmaps RUN mkdir -p /azerothcore/env/client/mmaps
RUN mkdir -p /azerothcore/env/client/vmaps RUN mkdir -p /azerothcore/env/client/vmaps
# Need fix COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/map_extractor /azerothcore/env/client/map_extractor
# COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/mapextractor /azerothcore/env/client/mapextractor COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/mmaps_generator /azerothcore/env/client/mmaps_generator
# COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/mmaps_generator /azerothcore/env/client/mmaps_generator COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/vmap4_assembler /azerothcore/env/client/vmap4_assembler
# COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/vmap4assembler /azerothcore/env/client/vmap4assembler COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/vmap4_extractor /azerothcore/env/client/vmap4_extractor
# COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/vmap4extractor /azerothcore/env/client/vmap4extractor
+2
View File
@@ -1,5 +1,7 @@
CUR_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" CUR_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
CTOOLS_BUILD=all
# allow the user to override configs # allow the user to override configs
if [ -f "$AC_PATH_CONF/config.sh" ]; then if [ -f "$AC_PATH_CONF/config.sh" ]; then
source "$AC_PATH_CONF/config.sh" # should overwrite previous source "$AC_PATH_CONF/config.sh" # should overwrite previous
+23 -25
View File
@@ -39,9 +39,19 @@ shellCommandFactory(
"build", "build",
"Build the authserver and worldserver", "Build the authserver and worldserver",
[ [
"docker compose --profile local build --parallel", "docker compose --profile local --profile dev --profile dev-build build --parallel",
"docker image prune -f",
"docker compose run --rm --no-deps ac-dev-build bash apps/docker/docker-build-dev.sh",
],
env
);
shellCommandFactory(
"pull",
"Pull build and local images",
[
"docker compose --profile local --profile dev --profile dev-build pull --parallel",
"docker image prune -f", "docker image prune -f",
"docker compose run --rm ac-build bash apps/docker/docker-build-dev.sh",
], ],
env env
); );
@@ -50,20 +60,9 @@ shellCommandFactory(
"build:nocache", "build:nocache",
"Build the authserver and worldserver without docker cache", "Build the authserver and worldserver without docker cache",
[ [
"docker compose --profile local build --no-cache --parallel", "docker compose --profile local --profile dev --profile dev-build build --no-cache --parallel",
"docker image prune -f", "docker image prune -f",
"docker compose run --rm ac-build bash apps/docker/docker-build-dev.sh", "docker compose run --rm --no-deps ac-dev-build bash apps/docker/docker-build-dev.sh",
],
env
);
shellCommandFactory(
"build:compile",
"Run the compilation process only, without rebuilding all docker images",
[
"docker compose build --parallel ac-build",
"docker image prune -f",
"docker compose run --rm ac-build bash apps/docker/docker-build-dev.sh",
], ],
env env
); );
@@ -73,7 +72,8 @@ shellCommandFactory(
"Clean build files", "Clean build files",
[ [
"docker image prune -f", "docker image prune -f",
`docker compose run --rm ac-build bash acore.sh compiler clean`, `docker compose run --rm --no-deps ac-dev-server bash acore.sh compiler clean`,
`docker compose run --rm --no-deps ac-dev-server bash acore.sh compiler ccacheClean`,
], ],
env env
); );
@@ -81,7 +81,7 @@ shellCommandFactory(
shellCommandFactory( shellCommandFactory(
"client-data", "client-data",
"Download client data inside the ac-data volume", "Download client data inside the ac-data volume",
["docker compose run --rm ac-build bash acore.sh client-data"], ["docker compose run --rm --no-deps ac-dev-server bash acore.sh client-data"],
env env
); );
@@ -94,7 +94,7 @@ shellCommandFactory(
shellCommandFactory( shellCommandFactory(
"dev:build", "dev:build",
"Build using the dev server, it uses volumes to compile which can be faster on linux & WSL", "Build using the dev server",
["docker compose run --rm ac-dev-server bash acore.sh compiler build"], ["docker compose run --rm ac-dev-server bash acore.sh compiler build"],
env env
); );
@@ -118,28 +118,28 @@ shellCommandFactory(
shellCommandFactory( shellCommandFactory(
"prod:build", "prod:build",
"Build producion services", "[TEST ONLY] Build producion services",
["docker compose --profile prod build --parallel", "docker image prune -f"], ["docker compose --profile prod build --parallel", "docker image prune -f"],
env env
); );
shellCommandFactory( shellCommandFactory(
"prod:pull", "prod:pull",
"Pull production services from the remote registry", "[TEST ONLY] Pull production services from the remote registry",
["docker compose --profile prod pull"], ["docker compose --profile prod pull"],
env env
); );
shellCommandFactory( shellCommandFactory(
"prod:up", "prod:up",
"Start production services (foreground)", "[TEST ONLY] Start production services (foreground)",
["docker compose --profile prod-app up"], ["docker compose --profile prod-app up"],
env env
); );
shellCommandFactory( shellCommandFactory(
"prod:up:d", "prod:up:d",
"Start production services (background)", "[TEST ONLY] Start production services (background)",
["docker compose --profile prod-app up -d"], ["docker compose --profile prod-app up -d"],
env env
); );
@@ -176,7 +176,7 @@ program
} }
services.pop(); services.pop();
services = services.slice(2); services = services.slice(1);
res.close(); // Don't forget to close it res.close(); // Don't forget to close it
@@ -304,8 +304,6 @@ async function checkDockerVersion() {
} }
async function main() { async function main() {
// Handle it however you like
// e.g. display usage
while (true) { while (true) {
const version = await checkDockerVersion(); const version = await checkDockerVersion();
if (version !== true) { if (version !== true) {
+5 -1
View File
@@ -67,7 +67,11 @@ function _switch() {
DOCKER=1 denoRunFile "$AC_PATH_APPS/docker/docker-cmd.ts" "${@:2}" DOCKER=1 denoRunFile "$AC_PATH_APPS/docker/docker-cmd.ts" "${@:2}"
exit exit
;; ;;
""|"quit"|"14") ""|"v"|"version"|"14")
denoRunFile "$AC_PATH_APPS/installer/main.ts" "version"
exit
;;
""|"quit"|"15")
echo "Goodbye!" echo "Goodbye!"
exit exit
;; ;;
+43
View File
@@ -0,0 +1,43 @@
import { Command } from "https://cdn.deno.land/cmd/versions/v1.2.0/raw/mod.ts";
import { getAcoreReleaseVersion } from "./utils.ts";
import { Input } from "https://deno.land/x/cliffy@v0.25.2/prompt/mod.ts";
const program = new Command();
program
.name("acore.sh")
.description("Shell scripts for docker")
.version("1.0.0");
// program
// .command("quit")
// .description("Close docker command")
// .action(() => {
// process.exit(0);
// });
program
.command("version")
.description("Get the version of the current AzerothCore revision")
.action(async () => {
console.log(await getAcoreReleaseVersion());
});
async function main() {
let exit = false;
do {
if (Deno.args.length === 0) {
program.outputHelp();
const command = await Input.prompt({
message: "Enter the command:",
});
console.log(command);
await program.parseAsync(command.split(" "));
} else {
exit = true;
await program.parseAsync(Deno.args);
process.exit(0);
}
} while (!exit);
}
main();
+17
View File
@@ -0,0 +1,17 @@
import * as path from "https://deno.land/std/path/mod.ts";
import makeloc from "https://deno.land/x/dirname@1.1.2/mod.ts";
const { __dirname } = makeloc(import.meta);
// specify the needed paths here
const ACORE_JSON = path.resolve(__dirname + "/../../acore.json");
export async function getAcoreReleaseVersion() {
// read the acore.json file to work with the versioning
const decoder = new TextDecoder("utf-8");
//console.debug(`Open ${ACORE_JSON}`)
const data = await Deno.readFile(ACORE_JSON);
const acoreInfo = JSON.parse(decoder.decode(data));
return `AzerothCore Rev. ${acoreInfo.version}`;
}
-12
View File
@@ -13,18 +13,6 @@ CTYPE=RelWithDebInfo
CSCRIPTS=static CSCRIPTS=static
AC_CCACHE=true AC_CCACHE=true
#
# DATABASE
#
OUTPUT_FOLDER=/azerothcore/var/build/sql/
DB_AUTH_CONF="MYSQL_USER='root'; MYSQL_PASS='password'; MYSQL_HOST='ac-database'; MYSQL_PORT='3306';"
DB_CHARACTERS_CONF="MYSQL_USER='root'; MYSQL_PASS='password'; MYSQL_HOST='ac-database'; MYSQL_PORT='3306';"
DB_WORLD_CONF="MYSQL_USER='root'; MYSQL_PASS='password'; MYSQL_HOST='ac-database'; MYSQL_PORT='3306';"
# #
# SIMPLE RESTARTER # SIMPLE RESTARTER
# #
+7 -7
View File
@@ -5,10 +5,15 @@
DOCKER_AC_ENV_FILE= DOCKER_AC_ENV_FILE=
DOCKER_VOL_DATA= DOCKER_VOL_ROOT=
DOCKER_VOL_CONF=
DOCKER_VOL_ETC= DOCKER_VOL_ETC=
DOCKER_VOL_LOGS= DOCKER_VOL_LOGS=
DOCKER_VOL_CONF= DOCKER_VOL_DATA_CAMERAS=
DOCKER_VOL_DATA_DBC=
DOCKER_VOL_DATA_MAPS=
DOCKER_VOL_DATA_VMAPS=
DOCKER_VOL_DATA_MMAPS=
DOCKER_WORLD_EXTERNAL_PORT= DOCKER_WORLD_EXTERNAL_PORT=
DOCKER_SOAP_EXTERNAL_PORT= DOCKER_SOAP_EXTERNAL_PORT=
@@ -20,8 +25,3 @@ DOCKER_USER=
DOCKER_USER_ID= DOCKER_USER_ID=
DOCKER_GROUP_ID= DOCKER_GROUP_ID=
# To maximize the performance on MAC you can change the DOCKER_EXTENDS_BIND variable
# to "abstract-no-bind", however it won't bind the host directory inside the container.
# It means that you need to work directly within the container using a tool
# like the VScode dev-container of the remote-extension suite
DOCKER_EXTENDS_BIND=
@@ -0,0 +1,4 @@
-- DB update 2022_11_03_08 -> 2022_11_04_00
--
SET @FACTION_BOTH := 6;
UPDATE `areatrigger_tavern` SET `faction` = @FACTION_BOTH WHERE `id` = 862;
@@ -0,0 +1,3 @@
-- DB update 2022_11_04_00 -> 2022_11_04_01
--
UPDATE `quest_template_addon` SET `SpecialFlags` = `SpecialFlags`|1 WHERE `id` IN (8789, 8790);
@@ -0,0 +1,4 @@
-- DB update 2022_11_04_01 -> 2022_11_04_02
--
UPDATE `creature` SET `spawntimesecs`=120 WHERE `guid`=84701 AND `id1`=18583;
@@ -0,0 +1,3 @@
-- DB update 2022_11_04_02 -> 2022_11_05_00
--
UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask` & 0xFFFFFF7F;
@@ -0,0 +1,44 @@
-- DB update 2022_11_05_00 -> 2022_11_05_01
-- Set CALLKILLEDMONSTER non repeteable
UPDATE `smart_scripts` SET `event_flags` = `event_flags`|1 WHERE `entryorguid` IN (21859, 21846) AND `source_type`=0 AND `id`=0 AND `link`=1;
-- Add spawns imported from TC
DELETE FROM `creature` WHERE `id1` IN (21846, 21859) AND `id2` IN (21846, 21859) AND `guid` BETWEEN @GUID+0 AND @GUID+35;
INSERT INTO `creature` (`guid`, `id1`, `id2`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `MovementType`) VALUES
(@GUID+0 , 21846, 21859, 530, 3519, 0, 1, 1, -3780.56, 5215.07, -23.1934, 0.0349066, 7, 0),
(@GUID+1 , 21846, 21859, 530, 3519, 0, 1, 1, -3777.38, 5184.86, -24.4552, 3.9968, 7, 0),
(@GUID+2 , 21846, 21859, 530, 3519, 0, 1, 1, -3772.17, 5211.63, -22.8059, 5.49779, 7, 0),
(@GUID+3 , 21846, 21859, 530, 3519, 0, 1, 1, -3770.83, 5121.01, -21.4213, 0.959931, 7, 0),
(@GUID+4 , 21846, 21859, 530, 3519, 0, 1, 1, -3766.29, 5062.47, -18.9817, 3.57792, 7, 0),
(@GUID+5 , 21846, 21859, 530, 3519, 0, 1, 1, -3764.99, 5095.88, -19.0595, 0.122173, 7, 0),
(@GUID+6 , 21846, 21859, 530, 3519, 0, 1, 1, -3762.46, 5171.85, -22.9264, 1.0821, 7, 0),
(@GUID+7 , 21846, 21859, 530, 3519, 0, 1, 1, -3759.02, 5140.41, -22.8351, 4.81711, 7, 0),
(@GUID+8 , 21846, 21859, 530, 3519, 0, 1, 1, -3758.07, 5261.12, -15.3995, 2.77507, 7, 0),
(@GUID+9 , 21846, 21859, 530, 3519, 0, 1, 1, -3753.9, 5294.92, -16.9184, 1.43117, 7, 0),
(@GUID+10, 21846, 21859, 530, 3519, 0, 1, 1, -3753.17, 5078.65, -18.2274, 0.872665, 7, 0),
(@GUID+11, 21846, 21859, 530, 3519, 0, 1, 1, -3750.03, 5125.17, -21.9827, 5.35816, 7, 0),
(@GUID+12, 21846, 21859, 530, 3519, 0, 1, 1, -3749.58, 5195.27, -22.6601, 3.68264, 7, 0),
(@GUID+13, 21846, 21859, 530, 3519, 0, 1, 1, -3741.7, 5160.73, -22.2081, 4.50295, 7, 0),
(@GUID+14, 21846, 21859, 530, 3519, 0, 1, 1, -3741.05, 5171.27, -21.8304, 2.14675, 7, 0),
(@GUID+15, 21846, 21859, 530, 3519, 0, 1, 1, -3739.48, 5271.71, -16.0977, 0.523599, 7, 0),
(@GUID+16, 21846, 21859, 530, 3519, 0, 1, 1, -3734.78, 5327.33, -13.0874, 3.9619, 7, 0),
(@GUID+17, 21846, 21859, 530, 3519, 0, 1, 1, -3733.21, 5061.52, -17.6918, 0.628319, 7, 0),
(@GUID+18, 21846, 21859, 530, 3519, 0, 1, 1, -3731.54, 5160.66, -22.2169, 3.4383, 7, 0),
(@GUID+19, 21846, 21859, 530, 3519, 0, 1, 1, -3726.95, 5263.67, -17.9404, 3.66519, 7, 0),
(@GUID+20, 21846, 21859, 530, 3519, 0, 1, 1, -3721.04, 5275.86, -18.5205, 1.25664, 7, 0),
(@GUID+21, 21846, 21859, 530, 3519, 0, 1, 1, -3720.57, 5205.87, -20.2053, 2.53073, 7, 0),
(@GUID+22, 21846, 21859, 530, 3519, 0, 1, 1, -3718.09, 5217.56, -21.3539, 2.75762, 7, 0),
(@GUID+23, 21846, 21859, 530, 3519, 0, 1, 1, -3713.32, 5257.14, -20.3728, 3.82227, 7, 0),
(@GUID+24, 21846, 21859, 530, 3519, 0, 1, 1, -3711.44, 5290.39, -18.9303, 0.0698132, 7, 0),
(@GUID+25, 21846, 21859, 530, 3519, 0, 1, 1, -3691.57, 5220.81, -21.1431, 2.54818, 7, 0),
(@GUID+26, 21846, 21859, 530, 3519, 0, 1, 1, -3689.51, 5295.31, -20.0296, 3.33358, 7, 0),
(@GUID+27, 21846, 21859, 530, 3519, 0, 1, 1, -3688.32, 5336.11, -15.1771, 3.735, 7, 0),
(@GUID+28, 21846, 21859, 530, 3519, 0, 1, 1, -3687.49, 5351.75, -13.172, 3.1765, 7, 0),
(@GUID+29, 21846, 21859, 530, 3519, 0, 1, 1, -3679.08, 5287.66, -20.6681, 0.0698132, 7, 0),
(@GUID+30, 21846, 21859, 530, 3519, 0, 1, 1, -3678.04, 5293.5, -20.3924, 1.78024, 7, 0),
(@GUID+31, 21846, 21859, 530, 3519, 0, 1, 1, -3676.77, 5334.48, -16.1081, 0.575959, 7, 0),
(@GUID+32, 21846, 21859, 530, 3519, 0, 1, 1, -3643.76, 5323.48, -18.2017, 4.08407, 7, 0),
(@GUID+33, 21846, 21859, 530, 3519, 0, 1, 1, -3640.03, 5318.27, -19.0845, 3.38594, 7, 0),
(@GUID+34, 21846, 21859, 530, 3519, 0, 1, 1, -3634.82, 5283.14, -21.9279, 4.5204, 7, 0),
(@GUID+35, 21846, 21859, 530, 3519, 0, 1, 1, -3783.05, 5215.14, -23.515, 1.76278, 7, 0);
@@ -0,0 +1,9 @@
-- DB update 2022_11_05_01 -> 2022_11_05_02
-- Quest: A Pilgrim's Plight
UPDATE `gameobject` SET `spawntimesecs`=1 WHERE `guid`=25340 AND `id`=184478;
-- Quest: The Dread Relic
UPDATE `gameobject` SET `spawntimesecs`=0 WHERE `guid`=26109 AND `id`=185220;
-- Quest: The Shadow Tomb
UPDATE `gameobject` SET `spawntimesecs`=0 WHERE `id` IN (185224, 185225, 185226) AND `guid` IN (26110, 26111, 47565);
-- Quest: A Damp Dark Place
UPDATE `gameobject` SET `spawntimesecs`=0 WHERE `guid`=22527 AND `id`=182122;
@@ -0,0 +1,5 @@
-- DB update 2022_11_05_02 -> 2022_11_05_03
--
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 15246) AND (`source_type` = 0) AND (`id` IN (1));
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(15246, 0, 1, 0, 6, 0, 100, 0, 0, 0, 0, 0, 0, 11, 26049, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Qiraji Mindslayer - On Just Died - Cast \'Mana Burn\'');
@@ -0,0 +1,6 @@
-- DB update 2022_11_05_03 -> 2022_11_06_00
-- lots of Reputation changes
DELETE FROM `creature_onkill_reputation` WHERE `creature_id`=26081;
INSERT INTO `creature_onkill_reputation` (`creature_id`, `RewOnKillRepFaction1`, `RewOnKillRepFaction2`, `MaxStanding1`, `IsTeamAward1`, `RewOnKillRepValue1`, `MaxStanding2`, `IsTeamAward2`, `RewOnKillRepValue2`, `TeamDependent`) VALUES (26081, 87, 21, 5, 0, 5, 7, 1, -25, 0);
-- Spawn to 8 hours
UPDATE `creature` SET `spawntimesecs`=28800 WHERE `guid`=1975960 AND `id1`=26081;
+235 -160
View File
@@ -5,7 +5,14 @@ x-networks: &networks
networks: networks:
- ac-network - ac-network
x-cache-from: &cache-from x-build-params: &build-params
context: .
dockerfile: ./apps/docker/Dockerfile
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
BUILDKIT_INLINE_CACHE: 1
cache_from: cache_from:
- acore/ac-wotlk-authserver:${DOCKER_IMAGE_TAG:-master} - acore/ac-wotlk-authserver:${DOCKER_IMAGE_TAG:-master}
- acore/ac-wotlk-authserver-local:${DOCKER_IMAGE_TAG:-master} - acore/ac-wotlk-authserver-local:${DOCKER_IMAGE_TAG:-master}
@@ -20,36 +27,17 @@ x-ac-shared-conf: &ac-shared-conf
working_dir: /azerothcore working_dir: /azerothcore
environment: environment:
AC_DISABLE_INTERACTIVE: "1" AC_DISABLE_INTERACTIVE: "1"
depends_on:
ac-database: x-ac-service-conf: &ac-service-conf
condition: service_healthy <<: *ac-shared-conf
# List can't be merged. See: https://forums.docker.com/t/how-to-merge-a-list-of-volumes-from-an-extension-field-into-the-service-definition/77454
# volumes:
# - ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
# # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
# - ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
services: services:
#============================
#
# Abstract services to extend
#
#============================
abstract-bind:
image: local/azerothcore/abstract-bind
volumes:
- .:/azerothcore
# expose some dist folder outside allowing the host to use them
- ${DOCKER_VOL_CONF:-./conf}:/azerothcore/conf
- ${DOCKER_VOL_BIN:-ac-bin}:/azerothcore/env/dist/bin
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
- ${DOCKER_VOL_DATA:-./env/docker/data}:/azerothcore/env/dist/data:delegated
profiles: [abstract-service] # do not run this
abstract-no-bind:
image: local/azerothcore/abstract-no-bind
volumes:
- ac-proj:/azerothcore
profiles: [abstract-service] # do not run this
#======================= #=======================
# #
# DATABASE # DATABASE
@@ -77,6 +65,106 @@ services:
timeout: 10s timeout: 10s
retries: 40 retries: 40
#======================
#
# Dev services
#
#======================
#
# Used for the build process to avoid the host binding of the /azerothcore
# and speedup the compilation by avoiding the host-container filesystem conversion issue
# on non-ext filesystems. Reference https://stackoverflow.com/a/63437557/1964544
#
ac-dev-build:
<<: [ *ac-shared-conf ] # merge with
image: acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master}
user: ${DOCKER_USER:-root}
cap_add:
- SYS_NICE # CAP_SYS_NICE
build:
target: dev
<<: *build-params
security_opt:
- seccomp:unconfined
env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
volumes:
# expose some dist folder outside allowing the host to use them
- ${DOCKER_VOL_CONF:-./conf}:/azerothcore/conf
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
- ac-build-dev:/azerothcore/var/build
- ac-ccache-dev:/azerothcore/var/ccache
profiles: [dev-build]
#
# Dev server with the ./azerothcore folder binded from the host
# Please use Linux, WSL2 or any ext-compatible filesystem
# to avoid performance issues
#
ac-dev-server:
<<: [ *ac-shared-conf ] # merge with
tty: true
image: acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master}
user: ${DOCKER_USER:-root}
cap_add:
- SYS_NICE # CAP_SYS_NICE
build:
target: dev
<<: *build-params
security_opt:
- seccomp:unconfined
env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
ports:
- ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724
- ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085
- ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878
volumes:
- ${DOCKER_VOL_ROOT:-.}:/azerothcore:cached
# expose some dist folder outside allowing the host to use them
- ${DOCKER_VOL_CONF:-./conf}:/azerothcore/conf
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
- ac-build-dev:/azerothcore/var/build
- ac-ccache-dev:/azerothcore/var/ccache
# client data
- ${DOCKER_VOL_DATA_CAMERAS:-./env/docker/data/Cameras}:/azerothcore/env/dist/data/Cameras
- ${DOCKER_VOL_DATA_DBC:-./env/docker/data/dbc}:/azerothcore/env/dist/data/dbc
- ${DOCKER_VOL_DATA_MAPS:-./env/docker/data/maps}:/azerothcore/env/dist/data/maps
- ${DOCKER_VOL_DATA_VMAPS:-./env/docker/data/vmaps}:/azerothcore/env/dist/data/vmaps
- ${DOCKER_VOL_DATA_MMAPS:-./env/docker/data/mmaps}:/azerothcore/env/dist/data/mmaps
# remount again for the extractors
- ${DOCKER_VOL_DATA_CAMERAS:-./env/docker/data/Cameras}:/azerothcore/env/dist/bin/Cameras
- ${DOCKER_VOL_DATA_DBC:-./env/docker/data/dbc}:/azerothcore/env/dist/bin/dbc
- ${DOCKER_VOL_DATA_MAPS:-./env/docker/data/maps}:/azerothcore/env/dist/bin/maps
- ${DOCKER_VOL_DATA_VMAPS:-./env/docker/data/vmaps}:/azerothcore/env/dist/bin/vmaps
- ${DOCKER_VOL_DATA_MMAPS:-./env/docker/data/mmaps}:/azerothcore/env/dist/bin/mmaps
# this is not the directory of the extracted data! It's the client folder used by the extractors
- ${DOCKER_AC_CLIENT_FOLDER:-./var/client}:/azerothcore/env/dist/bin/Data
profiles: [dev]
depends_on:
ac-database:
condition: service_healthy
ac-db-import:
<<: *ac-shared-conf
image: acore/ac-wotlk-worldserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
command: ./env/dist/bin/dbimport
volumes:
# read-only binaries compiled by ac-dev-server
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
profiles: [local, app, db-import-local]
depends_on:
ac-database:
condition: service_healthy
#======================= #=======================
# #
# APP Services # APP Services
@@ -84,236 +172,223 @@ services:
#======================= #=======================
ac-worldserver: ac-worldserver:
<<: *ac-shared-conf <<: *ac-service-conf # merge with ac-service-conf
extends: ${DOCKER_EXTENDS_BIND:-abstract-bind}
stdin_open: true stdin_open: true
tty: true tty: true
cap_add:
- SYS_NICE # CAP_SYS_NICE
command: ./acore.sh run-worldserver command: ./acore.sh run-worldserver
image: acore/ac-wotlk-worldserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-worldserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
user: ${DOCKER_USER:-acore} user: ${DOCKER_USER:-root}
privileged: true privileged: true
build: build:
context: .
target: worldserver-local target: worldserver-local
dockerfile: ./apps/docker/Dockerfile <<: *build-params
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
<<: *cache-from
ports: ports:
- ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085
- ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878
volumes:
# read-only binaries compiled by ac-dev-server
- ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro
- ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
# [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
# client data
- ${DOCKER_VOL_DATA_CAMERAS:-./env/docker/data/Cameras}:/azerothcore/env/dist/data/Cameras
- ${DOCKER_VOL_DATA_DBC:-./env/docker/data/dbc}:/azerothcore/env/dist/data/dbc
- ${DOCKER_VOL_DATA_MAPS:-./env/docker/data/maps}:/azerothcore/env/dist/data/maps
- ${DOCKER_VOL_DATA_VMAPS:-./env/docker/data/vmaps}:/azerothcore/env/dist/data/vmaps
- ${DOCKER_VOL_DATA_MMAPS:-./env/docker/data/mmaps}:/azerothcore/env/dist/data/mmaps
profiles: [local, app, worldserver] profiles: [local, app, worldserver]
depends_on:
ac-database:
condition: service_healthy
ac-db-import:
condition: service_completed_successfully
ac-authserver: ac-authserver:
<<: *ac-shared-conf <<: *ac-service-conf # merge with ac-service-conf
extends: ${DOCKER_EXTENDS_BIND:-abstract-bind}
tty: true tty: true
command: ./acore.sh run-authserver command: ./acore.sh run-authserver
image: acore/ac-wotlk-authserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-authserver-local:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
user: ${DOCKER_USER:-acore} user: ${DOCKER_USER:-root}
build: build:
context: .
target: authserver-local target: authserver-local
dockerfile: ./apps/docker/Dockerfile <<: *build-params
args: volumes:
USER_ID: ${DOCKER_USER_ID:-1000} # read-only binaries compiled by ac-dev-server
GROUP_ID: ${DOCKER_GROUP_ID:-1000} - ${DOCKER_VOL_BIN:-ac-bin-dev}:/azerothcore/env/dist/bin:ro
DOCKER_USER: ${DOCKER_USER:-acore} - ${DOCKER_VOL_ETC:-./env/docker/etc}:/azerothcore/env/dist/etc
<<: *cache-from # [osxfs optimization]: https://stackoverflow.com/a/63437557/1964544
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
ports: ports:
- ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724
profiles: [local, app, authserver] profiles: [local, app, authserver]
depends_on:
#====================== ac-database:
# condition: service_healthy
# Dev services ac-db-import:
# condition: service_completed_successfully
#======================
ac-build:
<<: *ac-shared-conf
extends: ${DOCKER_EXTENDS_BIND:-abstract-bind}
image: acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master}
build:
context: .
target: ${DOCKER_AC_BUILD_TARGET:-dev}
dockerfile: ./apps/docker/Dockerfile
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
<<: *cache-from
env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
working_dir: /azerothcore/
volumes:
- ${DOCKER_VOL_BUILD:-ac-build}:/azerothcore/var/build
# with this conf you can use an external path for it (useful for CI)
- ${DOCKER_VOL_CCACHE:-ac-ccache}:/azerothcore/var/ccache
# use internal copied files instead of volumes
- /azerothcore/src
- /azerothcore/data
- /azerothcore/modules
profiles: [local, build]
ac-dev-server:
<<: *ac-shared-conf
extends: ${DOCKER_EXTENDS_BIND:-abstract-bind}
tty: true
image: acore/ac-wotlk-dev-server:${DOCKER_IMAGE_TAG:-master}
build:
context: .
target: dev
dockerfile: ./apps/docker/Dockerfile
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
<<: *cache-from
security_opt:
- seccomp:unconfined
env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
user: ${DOCKER_USER:-acore}
environment:
DBLIST: AUTH,CHARACTERS,WORLD
ports:
- ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724
- ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085
- ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878
volumes:
- ac-build-dev:/azerothcore/var/build
- ac-ccache-dev:/azerothcore/var/ccache
# this is not the directory of the extracted data! It's the client folder used by the extractors
- ${DOCKER_CLIENT_DATA_FOLDER:-./var/client}:/azerothcore/env/dist/bin/Data
profiles: [dev]
#====================== #======================
# #
# Production services # Production services
# #
# The following services are used to test the production images
# Do not use them unless you know what you're doing!
# We do not offer support for them
#
# For a production-ready docker-compose, please check the official repo: https://github.com/azerothcore/acore-docker
#
#====================== #======================
ac-database-prod:
<<: *networks
image: mysql:8.0
restart: unless-stopped
cap_add:
- SYS_NICE # CAP_SYS_NICE
ports:
- ${DOCKER_DB_EXTERNAL_PORT:-3306}:3306
environment:
- MYSQL_ROOT_PASSWORD=${DOCKER_DB_ROOT_PASSWORD:-password}
volumes:
- type: volume
source: ac-database-prod
target: /var/lib/mysql
healthcheck:
test: "/usr/bin/mysql --user=root --password=$$MYSQL_ROOT_PASSWORD --execute \"SHOW DATABASES;\""
interval: 5s
timeout: 10s
retries: 40
profiles: [prod]
ac-worldserver-prod: ac-worldserver-prod:
<<: *ac-shared-conf <<: *ac-service-conf # merge with ac-service-conf
stdin_open: true stdin_open: true
tty: true tty: true
cap_add:
- SYS_NICE # CAP_SYS_NICE
command: ./acore.sh run-worldserver command: ./acore.sh run-worldserver
image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
user: ${DOCKER_USER:-acore} user: ${DOCKER_USER:-root}
privileged: true privileged: true
build: build:
context: .
target: worldserver target: worldserver
dockerfile: ./apps/docker/Dockerfile <<: *build-params
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
<<: *cache-from
ports: ports:
- ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085 - ${DOCKER_WORLD_EXTERNAL_PORT:-8085}:8085
- ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878 - ${DOCKER_SOAP_EXTERNAL_PORT:-7878}:7878
volumes: volumes:
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated - ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
volumes_from: - ${DOCKER_VOL_CLIENT_DATA_PROD:-ac-client-data-prod}:/azerothcore/env/dist/data:ro
- ac-client-data-server:ro
depends_on:
- ac-client-data-server
profiles: [prod, prod-app, prod-worldserver] profiles: [prod, prod-app, prod-worldserver]
depends_on:
ac-database-prod:
condition: service_healthy
ac-db-import-prod:
condition: service_completed_successfully
ac-client-data-init:
condition: service_started
ac-authserver-prod: ac-authserver-prod:
<<: *ac-shared-conf <<: *ac-service-conf # merge with ac-service-conf
tty: true tty: true
command: ./acore.sh run-authserver command: ./acore.sh run-authserver
image: acore/ac-wotlk-authserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-authserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
restart: unless-stopped restart: unless-stopped
env_file: env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac} ${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
user: ${DOCKER_USER:-acore} user: ${DOCKER_USER:-root}
build: build:
context: .
target: authserver target: authserver
dockerfile: ./apps/docker/Dockerfile <<: *build-params
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
<<: *cache-from
volumes: volumes:
- ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated - ${DOCKER_VOL_LOGS:-./env/docker/logs}:/azerothcore/env/dist/logs:delegated
ports: ports:
- ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724 - ${DOCKER_AUTH_EXTERNAL_PORT:-3724}:3724
profiles: [prod, prod-app, prod-authserver] profiles: [prod, prod-app, prod-authserver]
depends_on:
ac-database-prod:
condition: service_healthy
ac-db-import-prod:
condition: service_completed_successfully
ac-client-data-server:
ac-client-data-init:
image: acore/ac-wotlk-client-data:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-client-data:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
user: ${DOCKER_USER:-acore} user: ${DOCKER_USER:-root}
build: build:
context: .
target: client-data target: client-data
dockerfile: ./apps/docker/Dockerfile <<: *build-params
args: args:
USER_ID: ${DOCKER_USER_ID:-1000} USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000} GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore} DOCKER_USER: ${DOCKER_USER:-acore}
<<: *cache-from BUILDKIT_INLINE_CACHE: 1
volumes: volumes:
- /azerothcore/env/dist/data - ${DOCKER_VOL_CLIENT_DATA_PROD:-ac-client-data-prod}:/azerothcore/env/dist/data:ro
profiles: [prod, prod-app, clientdata] profiles: [prod, prod-app, clientdata]
ac-tools: ac-tools:
image: acore/ac-wotlk-tools:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-tools:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
user: ${DOCKER_USER:-acore} user: ${DOCKER_USER:-root}
build: build:
context: .
target: tools target: tools
dockerfile: ./apps/docker/Dockerfile <<: *build-params
args:
USER_ID: ${DOCKER_USER_ID:-1000}
GROUP_ID: ${DOCKER_GROUP_ID:-1000}
DOCKER_USER: ${DOCKER_USER:-acore}
<<: *cache-from
working_dir: /azerothcore/env/client/ working_dir: /azerothcore/env/client/
volumes: volumes:
- ${DOCKER_CLIENT_DATA_FOLDER:-./var/client}:/azerothcore/env/client/Data # this is not the directory of the extracted data! It's the client folder used by the extractors
- ${DOCKER_VOL_TOOLS_DBC:-./var/extractors/dbc}:/azerothcore/env/client/dbc - ${DOCKER_AC_CLIENT_FOLDER:-./var/client}:/azerothcore/env/dist/bin/Data
- ${DOCKER_VOL_TOOLS_MAPS:-./var/extractors/maps}:/azerothcore/env/client/maps
- ${DOCKER_VOL_TOOLS_VMAPS:-./var/extractors/vmaps}:/azerothcore/env/client/vmaps
- ${DOCKER_VOL_TOOLS_MMAPS:-./var/extractors/mmaps}:/azerothcore/env/client/mmaps
profiles: [prod, tools] profiles: [prod, tools]
ac-db-import: ac-db-import-prod:
<<: *ac-shared-conf <<: *ac-shared-conf
image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally image: acore/ac-wotlk-worldserver:${DOCKER_IMAGE_TAG:-master} # name of the generated image after built locally
command: ./env/dist/bin/dbimport command: ./env/dist/bin/dbimport
profiles: [db-import] profiles: [prod, prod-app, db-import-prod]
#
# Only for internal tests
#
ac-build-prod:
<<: *ac-shared-conf
build:
target: build
<<: *build-params
env_file:
${DOCKER_AC_ENV_FILE:-conf/dist/env.ac}
working_dir: /azerothcore/
profiles: [prod-build]
volumes: volumes:
ac-database: ac-database:
ac-bin: ac-database-prod:
ac-bin-dev:
ac-build-dev: ac-build-dev:
ac-build:
ac-ccache-dev: ac-ccache-dev:
ac-ccache:
ac-proj: ac-proj:
ac-client-data-prod:
# not used, but you can use them by setting # not used, but you can use them by setting
# the DOCKER_VOL_* env variabiles # the DOCKER_VOL_* env variabiles
ac-root:
ac-conf: ac-conf:
ac-etc: ac-etc:
ac-logs: ac-logs:
ac-client-data: ac-client-data-cameras:
ac-client-data-prod: ac-client-data-dbc:
ac-client-data-maps:
ac-client-data-vmaps:
ac-client-data-mmaps:
networks: networks:
ac-network: ac-network:
View File
View File
View File
View File
View File
+1 -1
View File
@@ -16,7 +16,7 @@ TempDir = "/azerothcore/env/dist/temp"
LoginDatabaseInfo = "ac-database;3306;root;password;acore_auth" LoginDatabaseInfo = "ac-database;3306;root;password;acore_auth"
# Add more configuration overwrites by copying settings from from authserver.conf.dist # Add more configuration overwrites by copying settings from from authserver.conf.dist
LogLevel = 3
SQLDriverLogFile = "SQLDriver.log" SQLDriverLogFile = "SQLDriver.log"
SQLDriverQueryLogging = 1 SQLDriverQueryLogging = 1
-1
View File
@@ -13,7 +13,6 @@ WorldDatabaseInfo = "ac-database;3306;root;password;acore_world"
CharacterDatabaseInfo = "ac-database;3306;root;password;acore_characters" CharacterDatabaseInfo = "ac-database;3306;root;password;acore_characters"
# Add more configuration overwrites by copying settings from worldserver.conf.dist # Add more configuration overwrites by copying settings from worldserver.conf.dist
LogLevel = 2
# Disable idle connections automatic kick since it doesn't work well on macOS + Docker # Disable idle connections automatic kick since it doesn't work well on macOS + Docker
CloseIdleConnections = 0 CloseIdleConnections = 0
-1
View File
@@ -18,7 +18,6 @@ WorldDatabaseInfo = "ac-database;3306;root;password;acore_world"
CharacterDatabaseInfo = "ac-database;3306;root;password;acore_characters" CharacterDatabaseInfo = "ac-database;3306;root;password;acore_characters"
# Add more configuration overwrites by copying settings from worldserver.conf.dist # Add more configuration overwrites by copying settings from worldserver.conf.dist
LogLevel = 2
# Disable idle connections automatic kick since it doesn't work well on macOS + Docker # Disable idle connections automatic kick since it doesn't work well on macOS + Docker
CloseIdleConnections = 0 CloseIdleConnections = 0
@@ -2594,7 +2594,7 @@ Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update
CharacterDatabase.Execute(stmt); CharacterDatabase.Execute(stmt);
} }
sScriptMgr->OnLootItem(this, pItem, count, ObjectGuid::Empty); sScriptMgr->OnStoreNewItem(this, pItem, count);
} }
return pItem; return pItem;
} }
+7 -3
View File
@@ -469,7 +469,11 @@ void Unit::Update(uint32 p_time)
extraAttacksTargets.erase(itr); extraAttacksTargets.erase(itr);
if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid)) if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
{ {
HandleProcExtraAttackFor(victim, count); if (_lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || _lastExtraAttackSpell == SPELL_HACK_AND_SLASH
|| victim->IsWithinMeleeRange(this))
{
HandleProcExtraAttackFor(victim, count);
}
} }
} }
_lastExtraAttackSpell = 0; _lastExtraAttackSpell = 0;
@@ -1302,7 +1306,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
uint32 crTypeMask = victim->GetCreatureTypeMask(); uint32 crTypeMask = victim->GetCreatureTypeMask();
// Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage); sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
int32 cleanDamage = 0; int32 cleanDamage = 0;
if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo)) if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
@@ -9373,7 +9377,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
// Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
// 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue) // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
if (lastExtraAttackSpell == 16459 || lastExtraAttackSpell == 66923) if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
{ {
return false; return false;
} }
+6
View File
@@ -717,6 +717,12 @@ enum MeleeHitOutcome
MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL
}; };
enum ExtraAttackSpells
{
SPELL_SWORD_SPECIALIZATION = 16459,
SPELL_HACK_AND_SLASH = 66923
};
class DispelInfo class DispelInfo
{ {
public: public:
@@ -590,6 +590,14 @@ void ScriptMgr::OnLootItem(Player* player, Item* item, uint32 count, ObjectGuid
}); });
} }
void ScriptMgr::OnStoreNewItem(Player* player, Item* item, uint32 count)
{
ExecuteScript<PlayerScript>([&](PlayerScript* script)
{
script->OnStoreNewItem(player, item, count);
});
}
void ScriptMgr::OnCreateItem(Player* player, Item* item, uint32 count) void ScriptMgr::OnCreateItem(Player* player, Item* item, uint32 count)
{ {
ExecuteScript<PlayerScript>([&](PlayerScript* script) ExecuteScript<PlayerScript>([&](PlayerScript* script)
@@ -69,11 +69,11 @@ void ScriptMgr::ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage)
}); });
} }
void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage) void ScriptMgr::ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage, SpellInfo const* spellInfo)
{ {
ExecuteScript<UnitScript>([&](UnitScript* script) ExecuteScript<UnitScript>([&](UnitScript* script)
{ {
script->ModifySpellDamageTaken(target, attacker, damage); script->ModifySpellDamageTaken(target, attacker, damage, spellInfo);
}); });
} }
+6 -2
View File
@@ -429,7 +429,7 @@ public:
virtual void ModifyMeleeDamage(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/) { } virtual void ModifyMeleeDamage(Unit* /*target*/, Unit* /*attacker*/, uint32& /*damage*/) { }
// Called when Spell Damage is being Dealt // Called when Spell Damage is being Dealt
virtual void ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/) { } virtual void ModifySpellDamageTaken(Unit* /*target*/, Unit* /*attacker*/, int32& /*damage*/, SpellInfo const* /*spellInfo*/) { }
// Called when Heal is Recieved // Called when Heal is Recieved
virtual void ModifyHealReceived(Unit* /*target*/, Unit* /*healer*/, uint32& /*heal*/, SpellInfo const* /*spellInfo*/) { } virtual void ModifyHealReceived(Unit* /*target*/, Unit* /*healer*/, uint32& /*heal*/, SpellInfo const* /*spellInfo*/) { }
@@ -1182,6 +1182,9 @@ public:
//After looting item //After looting item
virtual void OnLootItem(Player* /*player*/, Item* /*item*/, uint32 /*count*/, ObjectGuid /*lootguid*/) { } virtual void OnLootItem(Player* /*player*/, Item* /*item*/, uint32 /*count*/, ObjectGuid /*lootguid*/) { }
//After looting item (includes master loot).
virtual void OnStoreNewItem(Player* /*player*/, Item* /*item*/, uint32 /*count*/) { }
//After creating item (eg profession item creation) //After creating item (eg profession item creation)
virtual void OnCreateItem(Player* /*player*/, Item* /*item*/, uint32 /*count*/) { } virtual void OnCreateItem(Player* /*player*/, Item* /*item*/, uint32 /*count*/) { }
@@ -2316,6 +2319,7 @@ public: /* PlayerScript */
void GetCustomArenaPersonalRating(Player const* player, uint8 slot, uint32& rating) const; void GetCustomArenaPersonalRating(Player const* player, uint8 slot, uint32& rating) const;
void OnGetMaxPersonalArenaRatingRequirement(Player const* player, uint32 minSlot, uint32& maxArenaRating) const; void OnGetMaxPersonalArenaRatingRequirement(Player const* player, uint32 minSlot, uint32& maxArenaRating) const;
void OnLootItem(Player* player, Item* item, uint32 count, ObjectGuid lootguid); void OnLootItem(Player* player, Item* item, uint32 count, ObjectGuid lootguid);
void OnStoreNewItem(Player* player, Item* item, uint32 count);
void OnCreateItem(Player* player, Item* item, uint32 count); void OnCreateItem(Player* player, Item* item, uint32 count);
void OnQuestRewardItem(Player* player, Item* item, uint32 count); void OnQuestRewardItem(Player* player, Item* item, uint32 count);
void OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll); void OnGroupRollRewardItem(Player* player, Item* item, uint32 count, RollVote voteType, Roll* roll);
@@ -2473,7 +2477,7 @@ public: /* UnitScript */
void OnDamage(Unit* attacker, Unit* victim, uint32& damage); void OnDamage(Unit* attacker, Unit* victim, uint32& damage);
void ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage); void ModifyPeriodicDamageAurasTick(Unit* target, Unit* attacker, uint32& damage);
void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage); void ModifyMeleeDamage(Unit* target, Unit* attacker, uint32& damage);
void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage); void ModifySpellDamageTaken(Unit* target, Unit* attacker, int32& damage, SpellInfo const* spellInfo);
void ModifyHealReceived(Unit* target, Unit* healer, uint32& addHealth, SpellInfo const* spellInfo); void ModifyHealReceived(Unit* target, Unit* healer, uint32& addHealth, SpellInfo const* spellInfo);
uint32 DealDamage(Unit* AttackerUnit, Unit* pVictim, uint32 damage, DamageEffectType damagetype); uint32 DealDamage(Unit* AttackerUnit, Unit* pVictim, uint32 damage, DamageEffectType damagetype);
void OnBeforeRollMeleeOutcomeAgainst(Unit const* attacker, Unit const* victim, WeaponAttackType attType, int32& attackerMaxSkillValueForLevel, int32& victimMaxSkillValueForLevel, int32& attackerWeaponSkill, int32& victimDefenseSkill, int32& crit_chance, int32& miss_chance, int32& dodge_chance, int32& parry_chance, int32& block_chance); void OnBeforeRollMeleeOutcomeAgainst(Unit const* attacker, Unit const* victim, WeaponAttackType attType, int32& attackerMaxSkillValueForLevel, int32& victimMaxSkillValueForLevel, int32& attackerWeaponSkill, int32& victimDefenseSkill, int32& crit_chance, int32& miss_chance, int32& dodge_chance, int32& parry_chance, int32& block_chance);
@@ -79,15 +79,29 @@ public:
void EnterCombatWithTrio(Unit* who) void EnterCombatWithTrio(Unit* who)
{ {
BossAI::EnterCombat(who);
if (Creature* vem = instance->GetCreature(DATA_VEM)) if (Creature* vem = instance->GetCreature(DATA_VEM))
{
if (vem->GetGUID() != me->GetGUID()) if (vem->GetGUID() != me->GetGUID())
{
vem->GetAI()->AttackStart(who); vem->GetAI()->AttackStart(who);
}
}
if (Creature* kri = instance->GetCreature(DATA_KRI)) if (Creature* kri = instance->GetCreature(DATA_KRI))
{
if (kri->GetGUID() != me->GetGUID()) if (kri->GetGUID() != me->GetGUID())
{
kri->GetAI()->AttackStart(who); kri->GetAI()->AttackStart(who);
}
}
if (Creature* yauj = instance->GetCreature(DATA_YAUJ)) if (Creature* yauj = instance->GetCreature(DATA_YAUJ))
{
if (yauj->GetGUID() != me->GetGUID()) if (yauj->GetGUID() != me->GetGUID())
{
yauj->GetAI()->AttackStart(who); yauj->GetAI()->AttackStart(who);
}
}
} }
void EvadeAllBosses(EvadeReason why) void EvadeAllBosses(EvadeReason why)
@@ -602,11 +602,14 @@ struct npc_eye_tentacle : public ScriptedAI
portal->SetReactState(REACT_PASSIVE); portal->SetReactState(REACT_PASSIVE);
_portalGUID = portal->GetGUID(); _portalGUID = portal->GetGUID();
if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) if (me->ToTempSummon())
{ {
if (Creature* creature = summoner->ToCreature()) if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit())
{ {
creature->AI()->JustSummoned(portal); if (Creature* creature = summoner->ToCreature())
{
creature->AI()->JustSummoned(portal);
}
} }
} }
} }
@@ -673,11 +676,14 @@ struct npc_claw_tentacle : public ScriptedAI
portal->SetReactState(REACT_PASSIVE); portal->SetReactState(REACT_PASSIVE);
_portalGUID = portal->GetGUID(); _portalGUID = portal->GetGUID();
if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) if (me->ToTempSummon())
{ {
if (Creature* creature = summoner->ToCreature()) if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit())
{ {
creature->AI()->JustSummoned(portal); if (Creature* creature = summoner->ToCreature())
{
creature->AI()->JustSummoned(portal);
}
} }
} }
} }
@@ -740,11 +746,14 @@ struct npc_giant_claw_tentacle : public ScriptedAI
portal->SetReactState(REACT_PASSIVE); portal->SetReactState(REACT_PASSIVE);
_portalGUID = portal->GetGUID(); _portalGUID = portal->GetGUID();
if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) if (me->ToTempSummon())
{ {
if (Creature* creature = summoner->ToCreature()) if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit())
{ {
creature->AI()->JustSummoned(portal); if (Creature* creature = summoner->ToCreature())
{
creature->AI()->JustSummoned(portal);
}
} }
} }
} }
@@ -771,24 +780,10 @@ struct npc_giant_claw_tentacle : public ScriptedAI
void EnterCombat(Unit* /*who*/) override void EnterCombat(Unit* /*who*/) override
{ {
DoZoneInCombat(); DoZoneInCombat();
ScheduleTasks();
_scheduler.Schedule(2s, [this](TaskContext context)
{
DoCastVictim(SPELL_HAMSTRING);
context.Repeat(10s);
}).Schedule(5s, [this](TaskContext context)
{
DoCastSelf(SPELL_THRASH);
context.Repeat(10s);
}).Schedule(3s, [this](TaskContext /*context*/)
{
_canAttack = true;
});
ScheduleMeleeCheck();
} }
void ScheduleMeleeCheck() void ScheduleTasks()
{ {
// Check if a target is in melee range // Check if a target is in melee range
_scheduler.Schedule(10s, [this](TaskContext task) _scheduler.Schedule(10s, [this](TaskContext task)
@@ -810,6 +805,17 @@ struct npc_giant_claw_tentacle : public ScriptedAI
} }
task.Repeat(); task.Repeat();
}).Schedule(2s, [this](TaskContext context)
{
DoCastVictim(SPELL_HAMSTRING);
context.Repeat(10s);
}).Schedule(5s, [this](TaskContext context)
{
DoCastSelf(SPELL_THRASH);
context.Repeat(10s);
}).Schedule(3s, [this](TaskContext /*context*/)
{
_canAttack = true;
}); });
} }
@@ -856,13 +862,8 @@ struct npc_giant_claw_tentacle : public ScriptedAI
DoCastAOE(SPELL_MASSIVE_GROUND_RUPTURE, true); DoCastAOE(SPELL_MASSIVE_GROUND_RUPTURE, true);
me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
ScheduleMeleeCheck(); ScheduleTasks();
} }
_scheduler.Schedule(3s, [this](TaskContext /*context*/)
{
_canAttack = true;
});
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@@ -896,11 +897,14 @@ struct npc_giant_eye_tentacle : public ScriptedAI
portal->SetReactState(REACT_PASSIVE); portal->SetReactState(REACT_PASSIVE);
_portalGUID = portal->GetGUID(); _portalGUID = portal->GetGUID();
if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit()) if (me->ToTempSummon())
{ {
if (Creature* creature = summoner->ToCreature()) if (Unit* summoner = me->ToTempSummon()->GetSummonerUnit())
{ {
creature->AI()->JustSummoned(portal); if (Creature* creature = summoner->ToCreature())
{
creature->AI()->JustSummoned(portal);
}
} }
} }
} }
@@ -61,8 +61,9 @@ struct boss_huhuran : public BossAI
_hardEnrage = false; _hardEnrage = false;
} }
void EnterCombat(Unit* /*who*/) override void EnterCombat(Unit* who) override
{ {
BossAI::EnterCombat(who);
events.ScheduleEvent(EVENT_FRENZY, 12s, 21s); events.ScheduleEvent(EVENT_FRENZY, 12s, 21s);
events.ScheduleEvent(EVENT_WYVERN_STING, 25s, 43s); events.ScheduleEvent(EVENT_WYVERN_STING, 25s, 43s);
events.ScheduleEvent(EVENT_ACID_SPIT, 1s, 20s); events.ScheduleEvent(EVENT_ACID_SPIT, 1s, 20s);
@@ -292,9 +292,7 @@ struct boss_ouro : public BossAI
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
//Return since we have no target UpdateVictim();
if (!UpdateVictim())
return;
_scheduler.Update(diff, [this] _scheduler.Update(diff, [this]
{ {
@@ -105,7 +105,7 @@ struct boss_sartura : public BossAI
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (!UpdateVictimWithGaze()) if (!UpdateVictim())
return; return;
events.Update(diff); events.Update(diff);
@@ -117,7 +117,8 @@ struct boss_sartura : public BossAI
case EVENT_SARTURA_WHIRLWIND: case EVENT_SARTURA_WHIRLWIND:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true))
{ {
SetGazeOn(target); me->GetThreatMgr().ResetAllThreat();
me->AddThreat(target, 1000.0f);
} }
DoCastSelf(SPELL_WHIRLWIND); DoCastSelf(SPELL_WHIRLWIND);
events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_RANDOM, 2s, 7s); events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND_RANDOM, 2s, 7s);
@@ -126,11 +127,13 @@ struct boss_sartura : public BossAI
case EVENT_SARTURA_WHIRLWIND_RANDOM: case EVENT_SARTURA_WHIRLWIND_RANDOM:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
{ {
SetGazeOn(target); me->GetThreatMgr().ResetAllThreat();
me->AddThreat(target, 1000.0f);
} }
events.Repeat(2s, 7s); events.Repeat(2s, 7s);
break; break;
case EVENT_SARTURA_WHIRLWIND_END: case EVENT_SARTURA_WHIRLWIND_END:
me->GetThreatMgr().ResetAllThreat();
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
events.CancelEvent(EVENT_SARTURA_WHIRLWIND_RANDOM); events.CancelEvent(EVENT_SARTURA_WHIRLWIND_RANDOM);
events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND, 5s, 11s); events.ScheduleEvent(EVENT_SARTURA_WHIRLWIND, 5s, 11s);
@@ -186,7 +189,7 @@ struct npc_sartura_royal_guard : public ScriptedAI
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
{ {
if (!UpdateVictimWithGaze()) if (!UpdateVictim())
return; return;
events.Update(diff); events.Update(diff);
@@ -198,7 +201,8 @@ struct npc_sartura_royal_guard : public ScriptedAI
case EVENT_GUARD_WHIRLWIND: case EVENT_GUARD_WHIRLWIND:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true)) if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true))
{ {
SetGazeOn(target); me->GetThreatMgr().ResetAllThreat();
me->AddThreat(target, 1000.0f);
} }
DoCastSelf(SPELL_GUARD_WHIRLWIND); DoCastSelf(SPELL_GUARD_WHIRLWIND);
events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_RANDOM, 2s, 7s); events.ScheduleEvent(EVENT_GUARD_WHIRLWIND_RANDOM, 2s, 7s);
@@ -207,11 +211,13 @@ struct npc_sartura_royal_guard : public ScriptedAI
case EVENT_GUARD_WHIRLWIND_RANDOM: case EVENT_GUARD_WHIRLWIND_RANDOM:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
{ {
SetGazeOn(target); me->GetThreatMgr().ResetAllThreat();
me->AddThreat(target, 1000.0f);
} }
events.Repeat(2s, 7s); events.Repeat(2s, 7s);
break; break;
case EVENT_GUARD_WHIRLWIND_END: case EVENT_GUARD_WHIRLWIND_END:
me->GetThreatMgr().ResetAllThreat();
me->SetReactState(REACT_AGGRESSIVE); me->SetReactState(REACT_AGGRESSIVE);
events.CancelEvent(EVENT_GUARD_WHIRLWIND_RANDOM); events.CancelEvent(EVENT_GUARD_WHIRLWIND_RANDOM);
events.ScheduleEvent(EVENT_GUARD_WHIRLWIND, 500ms, 9s); events.ScheduleEvent(EVENT_GUARD_WHIRLWIND, 500ms, 9s);
@@ -243,14 +243,14 @@ struct npc_obsidian_eradicator : public ScriptedAI
{ {
_scheduler.CancelAll(); _scheduler.CancelAll();
me->SetPower(POWER_MANA, 0); me->SetPower(POWER_MANA, 0);
_targets.clear(); _targetGUIDs.clear();
} }
void EnterCombat(Unit* /*who*/) override void EnterCombat(Unit* /*who*/) override
{ {
_scheduler.Schedule(3500ms, [this](TaskContext context) _scheduler.Schedule(3500ms, [this](TaskContext context)
{ {
if (_targets.empty()) if (_targetGUIDs.empty())
{ {
Map::PlayerList const& players = me->GetMap()->GetPlayers(); Map::PlayerList const& players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
@@ -259,17 +259,20 @@ struct npc_obsidian_eradicator : public ScriptedAI
{ {
if (player->IsAlive() && !player->IsGameMaster() && !player->IsSpectator() && player->GetPower(POWER_MANA) > 0) if (player->IsAlive() && !player->IsGameMaster() && !player->IsSpectator() && player->GetPower(POWER_MANA) > 0)
{ {
_targets.push_back(player); _targetGUIDs.push_back(player->GetGUID());
} }
} }
} }
Acore::Containers::RandomResize(_targets, 10); Acore::Containers::RandomResize(_targetGUIDs, 10);
} }
for (Unit* target : _targets) for (ObjectGuid guid : _targetGUIDs)
{ {
DoCast(target, SPELL_DRAIN_MANA_ERADICATOR, true); if (Unit* target = ObjectAccessor::GetUnit(*me, guid))
{
DoCast(target, SPELL_DRAIN_MANA_ERADICATOR, true);
}
} }
if (me->GetPowerPct(POWER_MANA) >= 100.f) if (me->GetPowerPct(POWER_MANA) >= 100.f)
@@ -294,7 +297,7 @@ struct npc_obsidian_eradicator : public ScriptedAI
private: private:
TaskScheduler _scheduler; TaskScheduler _scheduler;
std::list<Player*> _targets; GuidList _targetGUIDs;
}; };
struct npc_anubisath_warder : public ScriptedAI struct npc_anubisath_warder : public ScriptedAI
@@ -376,14 +379,14 @@ struct npc_obsidian_nullifier : public ScriptedAI
{ {
_scheduler.CancelAll(); _scheduler.CancelAll();
me->SetPower(POWER_MANA, 0); me->SetPower(POWER_MANA, 0);
_targets.clear(); _targetGUIDs.clear();
} }
void EnterCombat(Unit* /*who*/) override void EnterCombat(Unit* /*who*/) override
{ {
_scheduler.Schedule(6s, [this](TaskContext context) _scheduler.Schedule(6s, [this](TaskContext context)
{ {
if (_targets.empty()) if (_targetGUIDs.empty())
{ {
Map::PlayerList const& players = me->GetMap()->GetPlayers(); Map::PlayerList const& players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
@@ -392,18 +395,20 @@ struct npc_obsidian_nullifier : public ScriptedAI
{ {
if (player->IsAlive() && !player->IsGameMaster() && !player->IsSpectator() && player->GetPower(POWER_MANA) > 0) if (player->IsAlive() && !player->IsGameMaster() && !player->IsSpectator() && player->GetPower(POWER_MANA) > 0)
{ {
_targets.push_back(player); _targetGUIDs.push_back(player->GetGUID());
} }
} }
} }
Acore::Containers::RandomResize(_targets, 11); Acore::Containers::RandomResize(_targetGUIDs, 11);
} }
for (Unit* target : _targets) for (ObjectGuid guid : _targetGUIDs)
{ {
if (target) if (Unit* target = ObjectAccessor::GetUnit(*me, guid))
{
DoCast(target, SPELL_DRAIN_MANA_NULLIFIER, true); DoCast(target, SPELL_DRAIN_MANA_NULLIFIER, true);
}
} }
if (me->GetPowerPct(POWER_MANA) >= 100.f) if (me->GetPowerPct(POWER_MANA) >= 100.f)
@@ -433,7 +438,7 @@ struct npc_obsidian_nullifier : public ScriptedAI
private: private:
TaskScheduler _scheduler; TaskScheduler _scheduler;
std::list<Player*> _targets; GuidList _targetGUIDs;
}; };
struct npc_ahnqiraji_critter : public ScriptedAI struct npc_ahnqiraji_critter : public ScriptedAI
View File