Merge branch 'master' into Playerbot

This commit is contained in:
郑佩茹
2022-05-31 09:11:39 -06:00
72 changed files with 1245 additions and 781 deletions

View File

@@ -37,15 +37,13 @@ jobs:
env:
CONTINUOUS_INTEGRATION: true
- name: Create conf/config.sh
run: source ./apps/ci/ci-conf.sh
run: source ./apps/ci/ci-conf-core.sh
- name: Process pending sql
run: bash bin/acore-db-pendings
- name: Import db
run: source ./apps/ci/ci-import-db.sh
- name: Build
run: source ./apps/ci/ci-compile.sh
- name: Dry run
run: source ./apps/ci/ci-worldserver-dry-run.sh
run: source ./apps/ci/ci-dry-run.sh worldserver
- name: Check startup errors
run: source ./apps/ci/ci-error-check.sh
- name: Run unit tests

View File

@@ -49,13 +49,11 @@ jobs:
env:
CONTINUOUS_INTEGRATION: true
- name: Create conf/config.sh
run: source ./apps/ci/ci-conf.sh
- name: Import db
run: source ./apps/ci/ci-import-db.sh
run: source ./apps/ci/ci-conf-core.sh
- name: Build
run: source ./apps/ci/ci-compile.sh
- name: Dry run
run: source ./apps/ci/ci-worldserver-dry-run.sh
run: source ./apps/ci/ci-dry-run.sh worldserver
- name: Check startup errors
run: source ./apps/ci/ci-error-check.sh
- name: Run unit tests

View File

@@ -42,13 +42,11 @@ jobs:
env:
CONTINUOUS_INTEGRATION: true
- name: Create conf/config.sh
run: source ./apps/ci/ci-conf.sh
- name: Import db
run: source ./apps/ci/ci-import-db.sh
run: source ./apps/ci/ci-conf-core.sh
- name: Build
run: source ./apps/ci/ci-compile.sh
- name: Dry run
run: source ./apps/ci/ci-worldserver-dry-run.sh
run: source ./apps/ci/ci-dry-run.sh worldserver
- name: Check startup errors
run: source ./apps/ci/ci-error-check.sh
- name: Run unit tests

View File

@@ -15,16 +15,16 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [windows-2019]
os: [windows-latest]
runs-on: ${{ matrix.os }}
name: ${{ matrix.os }}-MSVC16
name: ${{ matrix.os }}-${{ matrix.compiler }}
env:
BOOST_ROOT: C:\local\boost_1_74_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')
steps:
- uses: actions/checkout@v2
- name: Configure OS
run: choco install --no-progress openssl boost-msvc-14.2
run: choco install --no-progress openssl boost-msvc-14.3
- name: Build
shell: bash
run: |
@@ -39,5 +39,5 @@ jobs:
cp "/c/Program Files/OpenSSL-Win64/bin/libssl-1_1-x64.dll" "build/bin/Release/"
- uses: actions/upload-artifact@v2
with:
name: windows-2019-MSVC16-release
name: windows-2022-MSVC17-release
path: build/bin/Release

View File

@@ -41,6 +41,8 @@ include(CheckCXXSourceRuns)
include(CheckIncludeFiles)
include(ConfigureScripts)
include(ConfigureModules)
include(ConfigureApplications)
include(ConfigureTools)
# some utils for cmake
include(deps/acore/cmake-utils/utils.cmake)
@@ -96,9 +98,6 @@ include(ConfigInstall)
CU_RUN_HOOK("AFTER_LOAD_CMAKE_MODULES")
# basic packagesearching and setup (further support will be needed, this is a preliminary release!)
set(ACE_EXPECTED_VERSION 6.0.3)
find_package(PCHSupport)
find_package(MySQL REQUIRED)
@@ -121,14 +120,7 @@ include(src/cmake/showoptions.cmake)
#
add_subdirectory(deps)
if (SERVERS OR TOOLS)
add_subdirectory(src/common)
endif()
if (TOOLS)
add_subdirectory(src/tools)
endif()
add_subdirectory(src/common)
#
# Loading application sources
@@ -139,12 +131,14 @@ CU_RUN_HOOK("BEFORE_SRC_LOAD")
# add core sources
add_subdirectory(src)
# add modules sources
add_subdirectory(modules)
if (BUILD_APPLICATION_WORLDSERVER)
# add modules sources
add_subdirectory(modules)
endif()
CU_RUN_HOOK("AFTER_SRC_LOAD")
if( BUILD_TESTING )
if (BUILD_TESTING AND BUILD_APPLICATION_WORLDSERVER)
# we use these flags to get code coverage
set(UNIT_TEST_CXX_FLAGS "-fprofile-arcs -ftest-coverage -fno-inline")

View File

@@ -7,10 +7,9 @@ MTHREADS=$(($(grep -c ^processor /proc/cpuinfo) + 2))
CWARNINGS=ON
CDEBUG=OFF
CTYPE=Release
CTOOLS_BUILD=all
CSCRIPTS=static
CBUILD_TESTING=ON
CSERVERS=ON
CTOOLS=ON
CSCRIPTPCH=OFF
CCOREPCH=OFF
CCUSTOMOPTIONS='-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror"'
@@ -19,10 +18,6 @@ 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
if [[ $ENABLE_CPP_20 -eq 1 ]]; then
echo "CUSE_CPP_20=ON" >> ./conf/config.sh
fi
case $COMPILER in
# this is in order to use the "default" gcc version of the OS, without forcing a specific version

68
apps/ci/ci-conf-tools.sh Normal file
View File

@@ -0,0 +1,68 @@
#!/bin/bash
set -e
cat >>conf/config.sh <<CONFIG_SH
MTHREADS=$(($(grep -c ^processor /proc/cpuinfo) + 2))
CWARNINGS=ON
CDEBUG=OFF
CTYPE=Release
CSCRIPTS=static
CAPPS_BUILD=none
CTOOLS_BUILD=maps-only
CSCRIPTPCH=OFF
CCOREPCH=OFF
CCUSTOMOPTIONS='-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror"'
CONFIG_SH
case $COMPILER in
# this is in order to use the "default" gcc version of the OS, without forcing a specific version
"gcc" )
time sudo apt-get install -y gcc g++
echo "CCOMPILERC=\"gcc\"" >> ./conf/config.sh
echo "CCOMPILERCXX=\"g++\"" >> ./conf/config.sh
;;
"gcc8" )
time sudo apt-get install -y gcc-8 g++-8
echo "CCOMPILERC=\"gcc-8\"" >> ./conf/config.sh
echo "CCOMPILERCXX=\"g++-8\"" >> ./conf/config.sh
;;
"gcc10" )
time sudo apt-get install -y gcc-10 g++-10
echo "CCOMPILERC=\"gcc-10\"" >> ./conf/config.sh
echo "CCOMPILERCXX=\"g++-10\"" >> ./conf/config.sh
;;
# this is in order to use the "default" clang version of the OS, without forcing a specific version
"clang" )
time sudo apt-get install -y clang
echo "CCOMPILERC=\"clang\"" >> ./conf/config.sh
echo "CCOMPILERCXX=\"clang++\"" >> ./conf/config.sh
;;
"clang10" )
time sudo apt-get install -y clang-10
echo "CCOMPILERC=\"clang-10\"" >> ./conf/config.sh
echo "CCOMPILERCXX=\"clang++-10\"" >> ./conf/config.sh
;;
"clang11" )
time sudo apt-get install -y clang-11
echo "CCOMPILERC=\"clang-11\"" >> ./conf/config.sh
echo "CCOMPILERCXX=\"clang++-11\"" >> ./conf/config.sh
;;
"clang12" )
time sudo apt-get install -y clang-12
echo "CCOMPILERC=\"clang-12\"" >> ./conf/config.sh
echo "CCOMPILERCXX=\"clang++-12\"" >> ./conf/config.sh
;;
* )
echo "Unknown compiler $COMPILER"
exit 1
;;
esac

28
apps/ci/ci-dry-run.sh Normal file
View File

@@ -0,0 +1,28 @@
#!/bin/bash
set -e
# Start mysql
sudo systemctl start mysql
APP_NAME=$1
echo "LoginDatabaseInfo = \"localhost;3306;root;root;acore_auth\"" >> ./env/dist/etc/$APP_NAME.conf
if [[ $APP_NAME != "authserver" ]]; then
{
echo "WorldDatabaseInfo = \"localhost;3306;root;root;acore_world\""
echo "CharacterDatabaseInfo = \"localhost;3306;root;root;acore_characters\""
} >> ./env/dist/etc/$APP_NAME.conf
fi
if [[ $APP_NAME == "worldserver" ]]; then
echo "DataDir = \"../data/\"" >> ./env/dist/etc/$APP_NAME.conf
git clone --depth=1 --branch=master --single-branch https://github.com/ac-data/ac-data.git ./env/dist/data
fi
(cd ./env/dist/bin/ && timeout 5m ./$APP_NAME -dry-run)
# Stop mysql
sudo systemctl stop mysql

View File

@@ -1,11 +0,0 @@
#!/bin/bash
set -e
echo "[worldserver]" >> ./env/dist/etc/worldserver.conf
echo "DataDir = \"../data/\"" >> ./env/dist/etc/worldserver.conf
echo "LoginDatabaseInfo = \"localhost;3306;root;root;acore_auth\"" >> ./env/dist/etc/worldserver.conf
echo "WorldDatabaseInfo = \"localhost;3306;root;root;acore_world\"" >> ./env/dist/etc/worldserver.conf
echo "CharacterDatabaseInfo = \"localhost;3306;root;root;acore_characters\"" >> ./env/dist/etc/worldserver.conf
git clone --depth=1 --branch=master --single-branch https://github.com/ac-data/ac-data.git ./env/dist/data
(cd ./env/dist/bin/ && timeout 5m ./worldserver --dry-run)

View File

@@ -70,27 +70,25 @@ function comp_configure() {
comp_ccacheEnable
cmake $SRCPATH -DCMAKE_INSTALL_PREFIX=$BINPATH $DCONF -DSERVERS=$CSERVERS \
cmake $SRCPATH -DCMAKE_INSTALL_PREFIX=$BINPATH $DCONF \
-DAPPS_BUILD=$CAPPS_BUILD \
-DTOOLS_BUILD=$CTOOLS_BUILD \
-DSCRIPTS=$CSCRIPTS \
-DUSE_CPP_20=$CUSE_CPP_20 \
-DMODULES=$CMODULES \
-DBUILD_TESTING=$CBUILD_TESTING \
-DTOOLS=$CTOOLS \
-DUSE_SCRIPTPCH=$CSCRIPTPCH \
-DUSE_COREPCH=$CCOREPCH \
-DWITH_COREDEBUG=$CDEBUG \
-DCMAKE_BUILD_TYPE=$CTYPE \
-DWITH_WARNINGS=$CWARNINGS \
-DCMAKE_C_COMPILER=$CCOMPILERC \
-DCMAKE_CXX_COMPILER=$CCOMPILERCXX \
"-DDISABLED_AC_MODULES=$CDISABLED_AC_MODULES" \
$CCUSTOMOPTIONS
$CBUILD_APPS_LIST $CBUILD_TOOLS_LIST $CCUSTOMOPTIONS
cd $CWD
runHooks "ON_AFTER_CONFIG"
}
function comp_compile() {
[ $MTHREADS == 0 ] && MTHREADS=$(grep -c ^processor /proc/cpuinfo) && MTHREADS=$(($MTHREADS + 2))
@@ -117,9 +115,9 @@ function comp_compile() {
runHooks "ON_AFTER_BUILD"
# set worldserver SUID bit
sudo chown root:root "$AC_BINPATH_FULL/worldserver"
sudo chmod u+s "$AC_BINPATH_FULL/worldserver"
# set all aplications SUID bit
sudo chown -R root:root "$AC_BINPATH_FULL"
sudo chmod -R u+s "$AC_BINPATH_FULL"
}
function comp_build() {
@@ -128,6 +126,6 @@ function comp_build() {
}
function comp_all() {
comp_clean
comp_build
comp_clean
comp_build
}

View File

@@ -189,7 +189,8 @@ ENV AC_CCACHE=true
ENV CCACHE_CPP2=true
ENV CSCRIPTPCH=OFF
ENV CCOREPCH=OFF
ENV CTOOLS=ON
# ENV CTOOLS_BUILD=all
ENV CTOOLS_BUILD=maps-only
ENV CSCRIPTS=static
RUN bash apps/docker/docker-build-prod.sh
@@ -303,8 +304,9 @@ RUN mkdir -p /azerothcore/env/client/maps
RUN mkdir -p /azerothcore/env/client/mmaps
RUN mkdir -p /azerothcore/env/client/vmaps
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/vmap4assembler /azerothcore/env/client/vmap4assembler
COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/vmap4extractor /azerothcore/env/client/vmap4extractor
# Need fix
# 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/vmap4assembler /azerothcore/env/client/vmap4assembler
# COPY --chown=$DOCKER_USER:$DOCKER_USER --from=build /azerothcore/env/dist/bin/vmap4extractor /azerothcore/env/client/vmap4extractor

View File

@@ -11,15 +11,21 @@
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
option(SERVERS "Build worldserver and authserver" 1)
set(SCRIPTS_AVAILABLE_OPTIONS none static dynamic minimal-static minimal-dynamic)
set(MODULES_AVAILABLE_OPTIONS none static dynamic)
set(BUILD_APPS_AVAILABLE_OPTIONS none all auth-only world-only)
# set(BUILD_TOOLS_AVAILABLE_OPTIONS none all db-only maps-only) # DB import PR
set(BUILD_TOOLS_AVAILABLE_OPTIONS none all maps-only)
set(SCRIPTS "static" CACHE STRING "Build core with scripts")
set(MODULES "static" CACHE STRING "Build core with modules")
set(APPS_BUILD "all" CACHE STRING "Build list for applications")
set(TOOLS_BUILD "none" CACHE STRING "Build list for tools")
set_property(CACHE SCRIPTS PROPERTY STRINGS ${SCRIPTS_AVAILABLE_OPTIONS})
set_property(CACHE MODULES PROPERTY STRINGS ${MODULES_AVAILABLE_OPTIONS})
set_property(CACHE APPS_BUILD PROPERTY STRINGS ${BUILD_APPS_AVAILABLE_OPTIONS})
set_property(CACHE TOOLS_BUILD PROPERTY STRINGS ${BUILD_TOOLS_AVAILABLE_OPTIONS})
# Log a error when the value of the SCRIPTS variable isn't a valid option.
if(SCRIPTS)
@@ -30,7 +36,7 @@ if(SCRIPTS)
endif()
endif()
# Log a error when the value of the SCRIPTS variable isn't a valid option.
# Log a error when the value of the MODULES variable isn't a valid option.
if(MODULES)
list(FIND MODULES_AVAILABLE_OPTIONS "${MODULES}" MODULES_INDEX)
if(${MODULES_INDEX} EQUAL -1)
@@ -39,6 +45,24 @@ if(MODULES)
endif()
endif()
# Log a fatal error when the value of the APPS_BUILD variable isn't a valid option.
if(APPS_BUILD)
list(FIND BUILD_APPS_AVAILABLE_OPTIONS "${APPS_BUILD}" BUILD_APPS_INDEX)
if(${BUILD_APPS_INDEX} EQUAL -1)
message(FATAL_ERROR "The value (${APPS_BUILD}) of your APPS_BUILD variable is invalid! "
"Allowed values are: ${BUILD_APPS_AVAILABLE_OPTIONS}. Set default")
endif()
endif()
# Log a fatal error when the value of the TOOLS_BUILD variable isn't a valid option.
if(TOOLS_BUILD)
list(FIND BUILD_TOOLS_AVAILABLE_OPTIONS "${TOOLS_BUILD}" BUILD_TOOLS_INDEX)
if(${BUILD_TOOLS_INDEX} EQUAL -1)
message(FATAL_ERROR "The value (${TOOLS_BUILD}) of your TOOLS_BUILD variable is invalid! "
"Allowed values are: ${BUILD_TOOLS_AVAILABLE_OPTIONS}. Set default")
endif()
endif()
# Build a list of all script modules when -DSCRIPT="custom" is selected
GetScriptModuleList(SCRIPT_MODULE_LIST)
foreach(SCRIPT_MODULE ${SCRIPT_MODULE_LIST})
@@ -47,7 +71,7 @@ foreach(SCRIPT_MODULE ${SCRIPT_MODULE_LIST})
set_property(CACHE ${SCRIPT_MODULE_VARIABLE} PROPERTY STRINGS default disabled static dynamic)
endforeach()
# Build a list of all modules script when -DSCRIPT="custom" is selected
# Build a list of all modules script when -DMODULE="custom" is selected
GetModuleSourceList(SCRIPT_MODULE_LIST)
foreach(SCRIPT_MODULE ${SCRIPT_MODULE_LIST})
ModuleNameToVariable(${SCRIPT_MODULE} SCRIPT_MODULE_VARIABLE)
@@ -55,8 +79,23 @@ foreach(SCRIPT_MODULE ${SCRIPT_MODULE_LIST})
set_property(CACHE ${SCRIPT_MODULE_VARIABLE} PROPERTY STRINGS default disabled static dynamic)
endforeach()
# Build a list of all applications when -DBUILD_APPS="custom" is selected
GetApplicationsList(APPLICATIONS_BUILD_LIST)
foreach(APPLICATION_BUILD_NAME ${APPLICATIONS_BUILD_LIST})
ApplicationNameToVariable(${APPLICATION_BUILD_NAME} APPLICATION_BUILD_VARIABLE)
set(${APPLICATION_BUILD_VARIABLE} "default" CACHE STRING "Enable build the ${APPLICATION_BUILD_NAME} application.")
set_property(CACHE ${APPLICATION_BUILD_VARIABLE} PROPERTY STRINGS default enabled disabled)
endforeach()
# Build a list of all applications when -DBUILD_TOOLS="custom" is selected
GetToolsList(TOOLS_BUILD_LIST)
foreach(TOOL_BUILD_NAME ${TOOLS_BUILD_LIST})
ToolNameToVariable(${TOOL_BUILD_NAME} TOOL_BUILD_VARIABLE)
set(${TOOL_BUILD_VARIABLE} "default" CACHE STRING "Enable build the ${TOOL_BUILD_NAME} tool.")
set_property(CACHE ${TOOL_BUILD_VARIABLE} PROPERTY STRINGS default enabled disabled)
endforeach()
option(BUILD_TESTING "Build unit tests" 0)
option(TOOLS "Build map/vmap/mmap extraction/assembler tools" 0)
option(USE_SCRIPTPCH "Use precompiled headers when compiling scripts" 1)
option(USE_COREPCH "Use precompiled headers when compiling servers" 1)
option(WITH_WARNINGS "Show all warnings during compile" 0)
@@ -69,6 +108,8 @@ option(WITH_STRICT_DATABASE_TYPE_CHECKS "Enable strict checking of database fiel
option(WITHOUT_METRICS "Disable metrics reporting (i.e. InfluxDB and Grafana)" 0)
option(WITH_DETAILED_METRICS "Enable detailed metrics reporting (i.e. time each session takes to update)" 0)
CheckApplicationsBuildList()
CheckToolsBuildList()
IsDynamicLinkingRequired(WITH_DYNAMIC_LINKING_FORCED)
IsDynamicLinkingModulesRequired(WITH_DYNAMIC_LINKING_FORCED)

35
conf/dist/config.sh vendored
View File

@@ -30,12 +30,12 @@ BINPATH="$AC_PATH_ROOT/env/dist"
# DATAPATH_ZIP="$DATAPATH/data.zip"
# azerothcore's official remote source address to pull from
# by default git will fetch form the azrothcore remote
# by default git will fetch form the azrothcore remote
# You can change it to "origin" if you want to fetch/pull from the set remote
ORIGIN_REMOTE="https://github.com/azerothcore/azerothcore-wotlk.git"
# Branch configuration for the installer to pull from.
# By default git will select the current working branch
# Branch configuration for the installer to pull from.
# By default git will select the current working branch
# You can set it to "master" if you want the latest updates
INSTALLER_PULL_FROM=
@@ -44,8 +44,6 @@ INSTALLER_PULL_FROM=
# COMPILER_CONFIGURATIONS
#
##############################################
# Set preferred compilers.
# To use gcc (not suggested) instead of clang change in:
# CCOMPILERC="/usr/bin/gcc"
@@ -54,7 +52,6 @@ INSTALLER_PULL_FROM=
CCOMPILERC="/usr/bin/clang"
CCOMPILERCXX="/usr/bin/clang++"
# how many thread must be used for compilation ( leave zero to use all available )
MTHREADS=${MTHREADS:-0}
# enable/disable warnings during compilation
@@ -69,23 +66,31 @@ CDEBUG=OFF
# * RelWithDebInfo: optimized, *with* debug info, but no debug (output) code or asserts.
# * MinSizeRel: same as Release but optimizing for size rather than speed.
CTYPE=${CTYPE:-Release}
# compile scripts
CSCRIPTS=${CSCRIPTS:-static}
# compile scripts
CMODULES=${CMODULES:-none}
# compile unit tests
CBUILD_TESTING=OFF
# compile server
CSERVERS=${CSERVERS:-ON}
# compile tools
CTOOLS=${CTOOLS:-OFF}
# use precompiled headers ( fatest compilation but not optimized if you change headers often )
CSCRIPTPCH=${CSCRIPTPCH:-ON}
CCOREPCH=${CCOREPCH:-ON}
# compile with C++20
CUSE_CPP_20=${CUSE_CPP_20:-OFF}
# Skip specific modules from compilation (cmake reconfigure needed)
# use semicolon ; to separate modules
CDISABLED_AC_MODULES=""
# build apps list variable
CAPPS_BUILD=${CAPPS_BUILD:-all}
# build tools list variable
CTOOLS_BUILD=${CTOOLS_BUILD:-none}
# build apps list
CBUILD_APPS_LIST=${CBUILD_APPS_LIST:-''}
# build tools list
CBUILD_TOOLS_LIST=${CBUILD_TOOLS_LIST:-''}
# you can add your custom definitions here ( -D )
# example: CCUSTOMOPTIONS=" -DWITH_PERFTOOLS=ON

View File

@@ -0,0 +1,6 @@
-- DB update 2022_05_29_01 -> 2022_05_30_00
--
UPDATE `smart_scripts` SET `event_type`=60 WHERE `entryorguid`=14122 AND `source_type`=0 AND `id`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid`=14122 AND `source_type`=0 AND `id`=1;
INSERT INTO `smart_scripts` VALUES
(14122,0,1,0,54,0,100,0,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,'Hydrospawn - on summon - set passive react');

View File

@@ -0,0 +1,3 @@
-- DB update 2022_05_30_00 -> 2022_05_30_01
-- BroadcastTextId for Leviathan Mk II's plasma blast
UPDATE `creature_text` SET `BroadcastTextId` = 34217 WHERE `CreatureID` = 33432 AND `GroupID` = 0;

View File

@@ -0,0 +1,51 @@
-- DB update 2022_05_30_01 -> 2022_05_30_02
DELETE FROM `creature_loot_template` WHERE (`Entry` IN (14507, 14509, 14510, 14515, 14517) AND `Item` IN (22711, 22712, 22713, 22714, 22715, 22716, 22718, 22720, 22721, 22722, 30546)) OR (`Entry` = 14834) AND (`Item` IN (34090, 30398)) OR (`Entry` IN (15084, 15082, 15085, 15083));
INSERT INTO `creature_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
(14507, 30546, 30546, 100, 0, 1, 0, 1, 1, ''),
(14509, 30546, 30546, 100, 0, 1, 0, 1, 1, ''),
(14510, 30546, 30546, 100, 0, 1, 0, 1, 1, ''),
(14515, 30546, 30546, 100, 0, 1, 0, 1, 1, ''),
(14517, 30546, 30546, 100, 0, 1, 0, 1, 1, ''),
(14834, 34090, 34090, 100, 0, 1, 1, 1, 1, 'Hakkar - (ReferenceTable)'),
(14834, 30398, 30398, 100, 0, 1, 0, 1, 1, ''),
(15082, 19939, 0, 100, 0, 1, 2, 1, 1, 'Gri\'lek - Gri\'lek\'s Blood'),
(15082, 19939, 0, 20, 0, 1, 3, 1, 1, 'Gri\'lek - Gri\'lek\'s Blood'),
(15082, 19939, 0, 20, 0, 1, 4, 1, 1, 'Gri\'lek - Gri\'lek\'s Blood'),
(15082, 19961, 0, 0, 0, 1, 1, 1, 1, 'Gri\'lek - Gri\'lek\'s Grinder'),
(15082, 19962, 0, 0, 0, 1, 1, 1, 1, 'Gri\'lek - Gri\'lek\'s Carver'),
(15084, 19940, 0, 100, 0, 1, 2, 1, 1, 'Renataki - Renataki\'s Tooth'),
(15084, 19940, 0, 20, 0, 1, 3, 1, 1, 'Renataki - Renataki\'s Tooth'),
(15084, 19940, 0, 20, 0, 1, 4, 1, 1, 'Renataki - Renataki\'s Tooth'),
(15084, 19963, 0, 0, 0, 1, 1, 1, 1, 'Renataki - Pitchfork of Madness'),
(15084, 19964, 0, 0, 0, 1, 1, 1, 1, 'Renataki - Renataki\'s Soul Conduit'),
(15083, 19942, 0, 100, 0, 1, 2, 1, 1, 'Hazza\'rah - Hazza\'rah\'s Dream Thread'),
(15083, 19942, 0, 20, 0, 1, 3, 1, 1, 'Hazza\'rah - Hazza\'rah\'s Dream Thread'),
(15083, 19942, 0, 20, 0, 1, 4, 1, 1, 'Hazza\'rah - Hazza\'rah\'s Dream Thread'),
(15083, 19967, 0, 0, 0, 1, 1, 1, 1, 'Hazza\'rah - Thoughtblighter'),
(15083, 19968, 0, 0, 0, 1, 1, 1, 1, 'Hazza\'rah - Fiery Retributer'),
(15085, 19941, 0, 100, 0, 1, 2, 1, 1, 'Wushoolay - Wushoolay\'s Mane'),
(15085, 19941, 0, 20, 0, 1, 3, 1, 1, 'Wushoolay - Wushoolay\'s Mane'),
(15085, 19941, 0, 20, 0, 1, 4, 1, 1, 'Wushoolay - Wushoolay\'s Mane'),
(15085, 19965, 0, 0, 0, 1, 1, 1, 1, 'Wushoolay - Wushoolay\'s Poker'),
(15085, 19993, 0, 0, 0, 1, 1, 1, 1, 'Wushoolay - Hoodoo Hunting Bow');
DELETE FROM `reference_loot_template` WHERE (`Entry` = 30546) AND (`Item` IN (22711, 22712, 22713, 22714, 22715, 22716, 22718, 22720, 22721, 22722)) OR (`Entry` = 30398) AND (`Item` IN (19852, 19853, 19856, 19857, 19864, 20257, 20264)) OR (`Entry` = 34090) AND (`Item` IN (19852, 19853, 19856, 19857, 19864, 20257, 20264));
INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
(30546, 22711, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22712, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22713, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22714, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22715, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22716, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22718, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22720, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22721, 0, 0, 0, 1, 1, 1, 1, ''),
(30546, 22722, 0, 0, 0, 1, 1, 1, 1, ''),
(30398, 19852, 0, 0, 0, 1, 1, 1, 1, ''),
(30398, 19853, 0, 0, 0, 1, 1, 1, 1, ''),
(30398, 19856, 0, 0, 0, 1, 1, 1, 1, ''),
(30398, 19857, 0, 0, 0, 1, 1, 1, 1, ''),
(30398, 19864, 0, 0, 0, 1, 1, 1, 1, ''),
(30398, 20257, 0, 0, 0, 1, 1, 1, 1, ''),
(30398, 20264, 0, 0, 0, 1, 1, 1, 1, '');

28
deps/CMakeLists.txt vendored
View File

@@ -16,30 +16,34 @@ if(CMAKE_SYSTEM_NAME MATCHES "Windows")
endif()
endif()
add_subdirectory(SFMT)
add_subdirectory(argon2)
add_subdirectory(boost)
add_subdirectory(fmt)
add_subdirectory(jemalloc)
add_subdirectory(openssl)
add_subdirectory(stdfs)
add_subdirectory(threads)
add_subdirectory(utf8cpp)
if(SERVERS OR TOOLS)
add_subdirectory(boost)
# if ((APPS_BUILD AND (NOT APPS_BUILD STREQUAL "none")) OR BUILD_TOOLS_DB_IMPORT) #DB import PR
if ((APPS_BUILD AND (NOT APPS_BUILD STREQUAL "none")))
add_subdirectory(mysql)
endif()
if (BUILD_APPLICATION_WORLDSERVER OR BUILD_TOOLS_MAPS)
add_subdirectory(zlib)
add_subdirectory(g3dlite)
add_subdirectory(recastnavigation)
add_subdirectory(fmt)
add_subdirectory(SFMT)
add_subdirectory(utf8cpp)
add_subdirectory(openssl)
add_subdirectory(argon2)
add_subdirectory(jemalloc)
add_subdirectory(stdfs)
endif()
if(SERVERS)
add_subdirectory(mysql)
if (BUILD_APPLICATION_WORLDSERVER)
add_subdirectory(readline)
add_subdirectory(gsoap)
add_subdirectory(gperftools)
endif()
if(TOOLS)
if (BUILD_TOOLS_MAPS)
add_subdirectory(bzip2)
add_subdirectory(libmpq)
endif()

View File

@@ -14,12 +14,26 @@
# This to stop a few silly crashes that could have been avoided IF people
# weren't doing some -O3 psychooptimizations etc.
# Specified files for Windows
if (WIN32)
# Crash logs
set(winDebugging
${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.cpp
${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.h)
# Service
set(winService
${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.cpp
${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.h)
endif()
if(CMAKE_COMPILER_IS_GNUCXX AND NOT MINGW)
add_definitions(-fno-delete-null-pointer-checks)
endif()
add_subdirectory(genrev)
add_subdirectory(server)
if( SERVERS )
add_subdirectory(server)
if (TOOLS_BUILD AND NOT TOOLS_BUILD STREQUAL "none")
add_subdirectory(tools)
endif()

View File

@@ -12,32 +12,62 @@
#
# Use it like:
# CopyDefaultConfig(worldserver)
# CopyApplicationConfig(${APP_PROJECT_NAME} ${APPLICATION_NAME})
#
function(CopyDefaultConfig servertype)
function(CopyApplicationConfig projectName appName)
GetPathToApplication(${appName} SOURCE_APP_PATH)
if(WIN32)
if("${CMAKE_MAKE_PROGRAM}" MATCHES "MSBuild")
add_custom_command(TARGET ${servertype}
add_custom_command(TARGET ${projectName}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/configs")
add_custom_command(TARGET ${servertype}
add_custom_command(TARGET ${projectName}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${servertype}.conf.dist" "${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/configs")
COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE_APP_PATH}/${appName}.conf.dist" "${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/configs")
elseif(MINGW)
add_custom_command(TARGET ${servertype}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bin/configs")
add_custom_command(TARGET ${servertype}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/${servertype}.conf.dist ${CMAKE_BINARY_DIR}/bin/configs")
COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE_APP_PATH}/${appName}.conf.dist ${CMAKE_BINARY_DIR}/bin/configs")
endif()
endif()
if(UNIX)
install(FILES "${servertype}.conf.dist" DESTINATION "${CONF_DIR}")
install(FILES "${SOURCE_APP_PATH}/${appName}.conf.dist" DESTINATION "${CONF_DIR}")
elseif(WIN32)
install(FILES "${servertype}.conf.dist" DESTINATION "${CMAKE_INSTALL_PREFIX}/configs")
install(FILES "${SOURCE_APP_PATH}/${appName}.conf.dist" DESTINATION "${CMAKE_INSTALL_PREFIX}/configs")
endif()
endfunction()
function(CopyToolConfig projectName appName)
GetPathToTool(${appName} SOURCE_APP_PATH)
if(WIN32)
if("${CMAKE_MAKE_PROGRAM}" MATCHES "MSBuild")
add_custom_command(TARGET ${projectName}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/configs")
add_custom_command(TARGET ${projectName}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE_APP_PATH}/${appName}.conf.dist" "${CMAKE_BINARY_DIR}/bin/$(ConfigurationName)/configs")
elseif(MINGW)
add_custom_command(TARGET ${servertype}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bin/configs")
add_custom_command(TARGET ${servertype}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy "${SOURCE_APP_PATH}/${appName}.conf.dist ${CMAKE_BINARY_DIR}/bin/configs")
endif()
endif()
if(UNIX)
install(FILES "${SOURCE_APP_PATH}/${appName}.conf.dist" DESTINATION "${CONF_DIR}")
elseif(WIN32)
install(FILES "${SOURCE_APP_PATH}/${appName}.conf.dist" DESTINATION "${CMAKE_INSTALL_PREFIX}/configs")
endif()
endfunction()

View File

@@ -0,0 +1,108 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
set(BUILD_APPLICATION_AUTHSERVER 0)
set(BUILD_APPLICATION_WORLDSERVER 0)
# Returns the base path to the apps directory in the source directory
function(GetApplicationsBasePath variable)
set(${variable} "${CMAKE_SOURCE_DIR}/src/server/apps" PARENT_SCOPE)
endfunction()
# Stores the absolut path of the given app in the variable
function(GetPathToApplication app variable)
GetApplicationsBasePath(APPS_BASE_PATH)
set(${variable} "${APPS_BASE_PATH}/${app}" PARENT_SCOPE)
endfunction()
# Stores the project name of the given app in the variable
function(GetProjectNameOfApplicationName app variable)
string(TOLOWER "${app}" GENERATED_NAME)
set(${variable} "${GENERATED_NAME}" PARENT_SCOPE)
endfunction()
# Creates a list of all applications and stores it in the given variable.
function(GetApplicationsList variable)
GetApplicationsBasePath(BASE_PATH)
file(GLOB LOCALE_SOURCE_APP_LIST RELATIVE
${BASE_PATH}
${BASE_PATH}/*)
set(${variable})
foreach(SOURCE_APP ${LOCALE_SOURCE_APP_LIST})
GetPathToApplication(${SOURCE_APP} SOURCE_APP_PATH)
if(IS_DIRECTORY ${SOURCE_APP_PATH})
list(APPEND ${variable} ${SOURCE_APP})
endif()
endforeach()
set(${variable} ${${variable}} PARENT_SCOPE)
endfunction()
# Converts the given application name into it's
# variable name which holds the build type.
function(ApplicationNameToVariable application variable)
string(TOUPPER ${application} ${variable})
set(${variable} "APP_${${variable}}")
set(${variable} ${${variable}} PARENT_SCOPE)
endfunction()
function(CheckApplicationsBuildList)
GetApplicationsList(APPLICATIONS_BUILD_LIST)
if (APPS_BUILD STREQUAL "none")
set(APPS_DEFAULT_BUILD "disabled")
else()
set(APPS_DEFAULT_BUILD "enabled")
endif()
# Sets BUILD_APPS_USE_WHITELIST
# Sets BUILD_APPS_WHITELIST
if (APPS_BUILD MATCHES "-only")
set(BUILD_APPS_USE_WHITELIST ON)
if (APPS_BUILD STREQUAL "servers-only")
list(APPEND BUILD_APPS_WHITELIST authserver worldserver)
endif()
if (APPS_BUILD STREQUAL "dbimport-only")
list(APPEND BUILD_APPS_WHITELIST dbimport)
endif()
endif()
foreach(APPLICATION_BUILD_NAME ${APPLICATIONS_BUILD_LIST})
ApplicationNameToVariable(${APPLICATION_BUILD_NAME} APPLICATION_BUILD_VARIABLE)
if(${APPLICATION_BUILD_VARIABLE} STREQUAL "default")
if(BUILD_APPS_USE_WHITELIST)
list(FIND BUILD_APPS_WHITELIST "${APPLICATION_BUILD_NAME}" INDEX)
if(${INDEX} GREATER -1)
set(${APPLICATION_BUILD_VARIABLE} ${APPS_DEFAULT_BUILD})
else()
set(${APPLICATION_BUILD_VARIABLE} "disabled")
endif()
else()
set(${APPLICATION_BUILD_VARIABLE} ${APPS_DEFAULT_BUILD})
endif()
endif()
# Build the Graph values
if(${APPLICATION_BUILD_VARIABLE} MATCHES "enabled")
if (${APPLICATION_BUILD_NAME} MATCHES "authserver")
set (BUILD_APPLICATION_AUTHSERVER 1 PARENT_SCOPE)
elseif(${APPLICATION_BUILD_NAME} MATCHES "worldserver")
set (BUILD_APPLICATION_WORLDSERVER 1 PARENT_SCOPE)
endif()
endif()
endforeach()
endfunction()

View File

@@ -0,0 +1,110 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
set(BUILD_TOOLS_MAPS 0)
set(BUILD_TOOLS_DB_IMPORT 0)
# Returns the base path to the tools directory in the source directory
function(GetToolsBasePath variable)
set(${variable} "${CMAKE_SOURCE_DIR}/src/tools" PARENT_SCOPE)
endfunction()
# Stores the absolut path of the given tool in the variable
function(GetPathToTool tool variable)
GetToolsBasePath(TOOLS_BASE_PATH)
set(${variable} "${TOOLS_BASE_PATH}/${tool}" PARENT_SCOPE)
endfunction()
# Stores the project name of the given tool in the variable
function(GetProjectNameOfToolName tool variable)
string(TOLOWER "${tool}" GENERATED_NAME)
set(${variable} "${GENERATED_NAME}" PARENT_SCOPE)
endfunction()
# Creates a list of all applications and stores it in the given variable.
function(GetToolsList variable)
GetToolsBasePath(BASE_PATH)
file(GLOB LOCALE_SOURCE_TOOL_LIST RELATIVE
${BASE_PATH}
${BASE_PATH}/*)
set(${variable})
foreach(SOURCE_TOOL ${LOCALE_SOURCE_TOOL_LIST})
GetPathToTool(${SOURCE_TOOL} SOURCE_TOOL_PATH)
if(IS_DIRECTORY ${SOURCE_TOOL_PATH})
list(APPEND ${variable} ${SOURCE_TOOL})
endif()
endforeach()
set(${variable} ${${variable}} PARENT_SCOPE)
endfunction()
# Converts the given application name into it's
# variable name which holds the build type.
function(ToolNameToVariable application variable)
string(TOUPPER ${application} ${variable})
set(${variable} "TOOL_${${variable}}")
set(${variable} ${${variable}} PARENT_SCOPE)
endfunction()
function(CheckToolsBuildList)
GetToolsList(TOOLS_BUILD_LIST)
if (TOOLS_BUILD STREQUAL "none")
set(TOOLS_DEFAULT_BUILD "disabled")
else()
set(TOOLS_DEFAULT_BUILD "enabled")
endif()
# Sets BUILD_TOOLS_USE_WHITELIST
# Sets BUILD_TOOLS_WHITELIST
if (TOOLS_BUILD MATCHES "-only")
set(BUILD_TOOLS_USE_WHITELIST ON)
if (TOOLS_BUILD STREQUAL "maps-only")
list(APPEND BUILD_TOOLS_WHITELIST map_extractor mmaps_generator vmap4_assembler vmap4_extractor)
endif()
# if (TOOLS_BUILD STREQUAL "db-only")
# list(APPEND BUILD_TOOLS_WHITELIST dbimport)
# endif()
endif()
# Set the TOOL_${TOOL_BUILD_NAME} variables from the
# variables set above
foreach(TOOL_BUILD_NAME ${TOOLS_BUILD_LIST})
ToolNameToVariable(${TOOL_BUILD_NAME} TOOL_BUILD_VARIABLE)
if (${TOOL_BUILD_VARIABLE} STREQUAL "default")
if (BUILD_TOOLS_USE_WHITELIST)
list(FIND BUILD_TOOLS_WHITELIST "${TOOL_BUILD_NAME}" INDEX)
if (${INDEX} GREATER -1)
set(${TOOL_BUILD_VARIABLE} ${TOOLS_DEFAULT_BUILD})
else()
set(${TOOL_BUILD_VARIABLE} "disabled")
endif()
else()
set(${TOOL_BUILD_VARIABLE} ${TOOLS_DEFAULT_BUILD})
endif()
endif()
# Build the Graph values
if (${TOOL_BUILD_VARIABLE} MATCHES "enabled")
if (${TOOL_BUILD_NAME} MATCHES "dbimport")
set(BUILD_TOOLS_DB_IMPORT 1 PARENT_SCOPE)
else()
set(BUILD_TOOLS_MAPS 1 PARENT_SCOPE)
endif()
endif()
endforeach()
endfunction()

View File

@@ -32,31 +32,32 @@ message("")
# Show infomation about the options selected during configuration
if( SERVERS )
message("* Build world/auth : Yes (default)")
if (APPS_BUILD AND (NOT APPS_BUILD STREQUAL "none"))
message("* Build applications : Yes (${APPS_BUILD})")
else()
message("* Build world/authserver : No")
message("* Build applications : No")
endif()
if(SCRIPTS AND (NOT SCRIPTS STREQUAL "none"))
if (TOOLS_BUILD AND (NOT TOOLS_BUILD STREQUAL "none"))
message("* Build tools : Yes (${TOOLS_BUILD})")
add_definitions(-DNO_CORE_FUNCS)
else()
message("* Build tools : No")
endif()
if (SCRIPTS AND (NOT SCRIPTS STREQUAL "none"))
message("* Build with scripts : Yes (${SCRIPTS})")
else()
message("* Build with scripts : No")
endif()
if(MODULES AND (NOT MODULES STREQUAL "none"))
if (MODULES AND (NOT MODULES STREQUAL "none"))
message("* Build with modules : Yes (${MODULES})")
else()
message("* Build with modules : No")
endif()
if( TOOLS )
message("* Build map/vmap tools : Yes")
add_definitions(-DNO_CORE_FUNCS)
else()
message("* Build map/vmap tools : No (default)")
endif()
if( BUILD_TESTING )
message("* Build unit tests : Yes")
else()

View File

@@ -16,8 +16,21 @@ CollectSourceFiles(
# Exclude
${CMAKE_CURRENT_SOURCE_DIR}/Debugging
${CMAKE_CURRENT_SOURCE_DIR}/Platform
${CMAKE_CURRENT_SOURCE_DIR}/Collision
${CMAKE_CURRENT_SOURCE_DIR}/Navigation
${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
if (BUILD_APPLICATION_WORLDSERVER OR BUILD_TOOLS_MAPS)
unset(PRIVATE_SOURCES)
CollectSourceFiles(
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE_SOURCES
# Exclude
${CMAKE_CURRENT_SOURCE_DIR}/Debugging
${CMAKE_CURRENT_SOURCE_DIR}/Platform
${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
endif()
# Manually set sources for Debugging directory as we don't want to include WheatyExceptionReport in common project
# It needs to be included both in authserver and worldserver for the static global variable to be properly initialized
# and to handle crash logs on windows
@@ -55,8 +68,6 @@ target_link_libraries(common
PUBLIC
boost
argon2
g3dlib
Detour
sfmt
utf8cpp
openssl
@@ -65,6 +76,13 @@ target_link_libraries(common
stdfs
fmt)
if (BUILD_APPLICATION_WORLDSERVER OR BUILD_TOOLS_MAPS)
target_link_libraries(common
PUBLIC
g3dlib
Detour)
endif()
set_target_properties(common
PROPERTIES
FOLDER

View File

@@ -60,7 +60,7 @@ private:
public:
static Log* instance();
void Initialize(Acore::Asio::IoContext* ioContext);
void Initialize(Acore::Asio::IoContext* ioContext = nullptr);
void SetSynchronous(); // Not threadsafe - should only be called from main() after all threads are joined
void LoadFromConfig();
void Close();

View File

@@ -10,22 +10,19 @@
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Specified files for Windows
if (WIN32)
# Crash logs
set(winDebugging
${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.cpp
${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.h)
add_subdirectory(apps)
# Service
set(winService
${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.cpp
${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.h)
# if ((APPS_BUILD AND NOT APPS_BUILD STREQUAL "none") OR BUILD_TOOLS_DB_IMPORT) # DB import PR
if ((APPS_BUILD AND NOT APPS_BUILD STREQUAL "none"))
add_subdirectory(database)
endif()
if (BUILD_APPLICATION_AUTHSERVER OR BUILD_APPLICATION_WORLDSERVER)
add_subdirectory(shared)
endif()
if (BUILD_APPLICATION_WORLDSERVER)
add_subdirectory(game)
add_subdirectory(scripts)
endif()
add_subdirectory(authserver)
add_subdirectory(database)
add_subdirectory(game)
add_subdirectory(shared)
add_subdirectory(scripts)
add_subdirectory(worldserver)

View File

@@ -0,0 +1,198 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# Make the script module list available in the current scope
GetApplicationsList(APPLICATIONS_BUILD_LIST)
if (APPS_BUILD STREQUAL "none")
set(APPS_DEFAULT_BUILD "disabled")
else()
set(APPS_DEFAULT_BUILD "enabled")
endif()
# Sets BUILD_APPS_USE_WHITELIST
# Sets BUILD_APPS_WHITELIST
if (APPS_BUILD MATCHES "-only")
set(BUILD_APPS_USE_WHITELIST ON)
if (APPS_BUILD STREQUAL "auth-only")
list(APPEND BUILD_APPS_WHITELIST authserver)
endif()
if (APPS_BUILD STREQUAL "world-only")
list(APPEND BUILD_APPS_WHITELIST worldserver)
endif()
endif()
# Set the SCRIPTS_${BUILD_APP} variables from the
# variables set above
foreach(BUILD_APP ${APPLICATIONS_BUILD_LIST})
ApplicationNameToVariable(${BUILD_APP} BUILD_APP_VARIABLE)
if(${BUILD_APP_VARIABLE} STREQUAL "default")
if(BUILD_APPS_USE_WHITELIST)
list(FIND BUILD_APPS_WHITELIST "${BUILD_APP}" INDEX)
if(${INDEX} GREATER -1)
set(${BUILD_APP_VARIABLE} ${APPS_DEFAULT_BUILD})
else()
set(${BUILD_APP_VARIABLE} "disabled")
endif()
else()
set(${BUILD_APP_VARIABLE} ${APPS_DEFAULT_BUILD})
endif()
endif()
# Build the Graph values
if(${BUILD_APP_VARIABLE} MATCHES "enabled")
list(APPEND BUILD_APP_GRAPH_KEYS apps)
set(BUILD_APP_VALUE_DISPLAY_apps apps)
list(APPEND BUILD_APP_VALUE_CONTAINS_apps ${BUILD_APP})
if (${BUILD_APP} MATCHES "authserver")
set (BUILD_APPLICATION_AUTHSERVER 1)
elseif(${BUILD_APP} MATCHES "worldserver")
set (BUILD_APPLICATION_WORLDSERVER 1)
endif()
else()
list(APPEND BUILD_APP_GRAPH_KEYS disabled)
set(BUILD_APP_VALUE_DISPLAY_disabled disabled)
list(APPEND BUILD_APP_VALUE_CONTAINS_disabled ${BUILD_APP})
endif()
endforeach()
list(SORT BUILD_APP_GRAPH_KEYS)
list(REMOVE_DUPLICATES BUILD_APP_GRAPH_KEYS)
# Display the graphs
message("")
message("* Apps build list (${APPS_BUILD}):")
message(" |")
foreach(BUILD_APP_GRAPH_KEY ${BUILD_APP_GRAPH_KEYS})
if(NOT BUILD_APP_GRAPH_KEY STREQUAL "disabled")
message(" +- ${BUILD_APP_VALUE_DISPLAY_${BUILD_APP_GRAPH_KEY}}")
else()
message(" | ${BUILD_APP_VALUE_DISPLAY_${BUILD_APP_GRAPH_KEY}}")
endif()
foreach(BUILD_APP_GRAPH_ENTRY ${BUILD_APP_VALUE_CONTAINS_${BUILD_APP_GRAPH_KEY}})
message(" | +- ${BUILD_APP_GRAPH_ENTRY}")
endforeach()
message(" |")
endforeach()
message("")
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
# Generates the actual apps projects
foreach(APPLICATION_NAME ${APPLICATIONS_BUILD_LIST})
GetPathToApplication(${APPLICATION_NAME} SOURCE_APP_PATH)
ApplicationNameToVariable(${APPLICATION_NAME} BUILD_APP_VARIABLE)
if (${BUILD_APP_VARIABLE} STREQUAL "disabled")
continue()
endif()
unset(APP_PRIVATE_SOURCES)
CollectSourceFiles(
${SOURCE_APP_PATH}
APP_PRIVATE_SOURCES
# Exclude
${SOURCE_APP_PATH}/PrecompiledHeaders)
if (WIN32)
list(APPEND APP_PRIVATE_SOURCES ${winDebugging})
if (${APPLICATION_NAME} MATCHES "worldserver")
list(APPEND APP_PRIVATE_SOURCES ${winService})
endif()
if (MSVC)
list(APPEND APP_PRIVATE_SOURCES ${SOURCE_APP_PATH}/${APPLICATION_NAME}.rc)
endif()
endif()
GetProjectNameOfApplicationName(${APPLICATION_NAME} APP_PROJECT_NAME)
# Create the application project
add_executable(${APP_PROJECT_NAME}
${APP_PRIVATE_SOURCES})
add_dependencies(${APP_PROJECT_NAME} revision.h)
target_link_libraries(${APP_PROJECT_NAME}
PRIVATE
acore-core-interface)
if (${APP_PROJECT_NAME} MATCHES "authserver")
target_link_libraries(${APP_PROJECT_NAME}
PUBLIC
shared)
elseif(${APP_PROJECT_NAME} MATCHES "worldserver")
target_link_libraries(${APP_PROJECT_NAME}
PUBLIC
modules
scripts
game
gsoap
readline
gperftools)
if (UNIX AND NOT NOJEM)
set(${APP_PROJECT_NAME}_LINK_FLAGS "-pthread -lncurses ${${APP_PROJECT_NAME}_LINK_FLAGS}")
endif()
set_target_properties(${APP_PROJECT_NAME} PROPERTIES LINK_FLAGS "${${APP_PROJECT_NAME}_LINK_FLAGS}")
# Add all dynamic projects as dependency to the worldserver
if (WORLDSERVER_DYNAMIC_SCRIPT_MODULES_DEPENDENCIES)
add_dependencies(${APP_PROJECT_NAME} ${WORLDSERVER_DYNAMIC_SCRIPT_MODULES_DEPENDENCIES})
endif()
endif()
unset(APP_PUBLIC_INCLUDES)
CollectIncludeDirectories(
${SOURCE_APP_PATH}
APP_PUBLIC_INCLUDES
# Exclude
${SOURCE_APP_PATH}/PrecompiledHeaders)
target_include_directories(${APP_PROJECT_NAME}
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(${APP_PROJECT_NAME}
PUBLIC
${APP_PUBLIC_INCLUDES}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/${APPLICATION_NAME})
set_target_properties(${APP_PROJECT_NAME}
PROPERTIES
FOLDER
"server")
# Install config
CopyApplicationConfig(${APP_PROJECT_NAME} ${APPLICATION_NAME})
if (UNIX)
install(TARGETS ${APP_PROJECT_NAME} DESTINATION bin)
elseif (WIN32)
install(TARGETS ${APP_PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_PREFIX}")
endif()
set(PATH_TO_PCH ${SOURCE_APP_PATH}/PrecompiledHeaders/${APPLICATION_NAME}PCH.h)
# Generate precompiled header
if (USE_COREPCH AND EXISTS ${PATH_TO_PCH})
add_cxx_pch(${APP_PROJECT_NAME} ${PATH_TO_PCH})
endif()
endforeach()

View File

@@ -41,8 +41,11 @@
#include "SharedDefines.h"
#include "Util.h"
#include <boost/asio/signal_set.hpp>
#include <boost/program_options.hpp>
#include <boost/version.hpp>
#include <csignal>
#include <filesystem>
#include <iostream>
#include <openssl/crypto.h>
#include <openssl/opensslv.h>
@@ -51,19 +54,15 @@
#endif
using boost::asio::ip::tcp;
using namespace boost::program_options;
namespace fs = std::filesystem;
bool StartDB();
void StopDB();
void SignalHandler(std::weak_ptr<Acore::Asio::IoContext> ioContextRef, boost::system::error_code const& error, int signalNumber);
void KeepDatabaseAliveHandler(std::weak_ptr<Acore::Asio::DeadlineTimer> dbPingTimerRef, int32 dbPingInterval, boost::system::error_code const& error);
void BanExpiryHandler(std::weak_ptr<Acore::Asio::DeadlineTimer> banExpiryCheckTimerRef, int32 banExpiryCheckInterval, boost::system::error_code const& error);
/// Print out the usage string for this program on the console.
void usage(const char* prog)
{
LOG_INFO("server.authserver", "Usage: \n {} [<options>]\n"
" -c config_file use config_file as configuration file\n\r", prog);
}
variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile);
/// Launch the auth server
int main(int argc, char** argv)
@@ -71,27 +70,16 @@ int main(int argc, char** argv)
Acore::Impl::CurrentServerProcessHolder::_type = SERVER_PROCESS_AUTHSERVER;
signal(SIGABRT, &Acore::AbortHandler);
// Command line parsing to get the configuration file name
std::string configFile = sConfigMgr->GetConfigPath() + std::string(_ACORE_REALM_CONFIG);
int count = 1;
while (count < argc)
{
if (strcmp(argv[count], "-c") == 0)
{
if (++count >= argc)
{
printf("Runtime-Error: -c option requires an input argument\n");
usage(argv[0]);
return 1;
}
else
configFile = argv[count];
}
++count;
}
// Command line parsing
auto configFile = fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_REALM_CONFIG));
auto vm = GetConsoleArguments(argc, argv, configFile);
// exit if help or version is enabled
if (vm.count("help"))
return 0;
// Add file and args in config
sConfigMgr->Configure(configFile, std::vector<std::string>(argv, argv + argc));
sConfigMgr->Configure(configFile.generic_string(), std::vector<std::string>(argv, argv + argc));
if (!sConfigMgr->LoadAppConfigs())
return 1;
@@ -149,6 +137,13 @@ int main(int argc, char** argv)
return 1;
}
// Stop auth server if dry run
if (sConfigMgr->isDryRun())
{
LOG_INFO("server.authserver", "Dry run completed, terminating.");
return 0;
}
// Start the listening port (acceptor) for auth connections
int32 port = sConfigMgr->GetOption<int32>("RealmServerPort", 3724);
if (port < 0 || port > 0xFFFF)
@@ -268,3 +263,36 @@ void BanExpiryHandler(std::weak_ptr<Acore::Asio::DeadlineTimer> banExpiryCheckTi
}
}
}
variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile)
{
options_description all("Allowed options");
all.add_options()
("help,h", "print usage message")
("version,v", "print version build info")
("dry-run,d", "Dry run")
("config,c", value<fs::path>(&configFile)->default_value(fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_REALM_CONFIG))), "use <arg> as configuration file");
variables_map variablesMap;
try
{
store(command_line_parser(argc, argv).options(all).allow_unregistered().run(), variablesMap);
notify(variablesMap);
}
catch (std::exception const& e)
{
std::cerr << e.what() << "\n";
}
if (variablesMap.count("help"))
{
std::cout << all << "\n";
}
else if (variablesMap.count("dry-run"))
{
sConfigMgr->setDryRun(true);
}
return variablesMap;
}

View File

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

View File

@@ -36,6 +36,7 @@
#include "IoContext.h"
#include "MapMgr.h"
#include "Metric.h"
#include "ModuleMgr.h"
#include "ModulesScriptLoader.h"
#include "MySQLThreading.h"
#include "OpenSSLCrypto.h"
@@ -54,12 +55,12 @@
#include <boost/asio/signal_set.hpp>
#include <boost/program_options.hpp>
#include <csignal>
#include <filesystem>
#include <iostream>
#include <openssl/crypto.h>
#include <openssl/opensslv.h>
#include "ModuleMgr.h"
#ifdef _WIN32
#if AC_PLATFORM == AC_PLATFORM_WINDOWS
#include "ServiceWin32.h"
char serviceName[] = "worldserver";
char serviceLongName[] = "AzerothCore world service";
@@ -78,6 +79,8 @@ int m_ServiceStatus = -1;
#endif
#define WORLD_SLEEP_CONST 10
using namespace boost::program_options;
namespace fs = std::filesystem;
class FreezeDetector
{
@@ -110,20 +113,7 @@ void ShutdownCLIThread(std::thread* cliThread);
void AuctionListingRunnable();
void ShutdownAuctionListingThread(std::thread* thread);
void WorldUpdateLoop();
/// Print out the usage string for this program on the console.
void usage(const char* prog)
{
printf("Usage:\n");
printf(" %s [<options>]\n", prog);
printf(" -c config_file use config_file as configuration file\n");
#ifdef _WIN32
printf(" Running as service functions:\n");
printf(" --service run as service\n");
printf(" -s install install service\n");
printf(" -s uninstall uninstall service\n");
#endif
}
variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile, [[maybe_unused]] std::string& cfg_service);
/// Launch the Azeroth server
int main(int argc, char** argv)
@@ -131,66 +121,26 @@ int main(int argc, char** argv)
Acore::Impl::CurrentServerProcessHolder::_type = SERVER_PROCESS_WORLDSERVER;
signal(SIGABRT, &Acore::AbortHandler);
///- Command line parsing to get the configuration file name
std::string configFile = sConfigMgr->GetConfigPath() + std::string(_ACORE_CORE_CONFIG);
int c = 1;
while (c < argc)
{
if (strcmp(argv[c], "--dry-run") == 0)
{
sConfigMgr->setDryRun(true);
}
// Command line parsing
auto configFile = fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_CORE_CONFIG));
std::string configService;
auto vm = GetConsoleArguments(argc, argv, configFile, configService);
if (!strcmp(argv[c], "-c"))
{
if (++c >= argc)
{
printf("Runtime-Error: -c option requires an input argument");
usage(argv[0]);
return 1;
}
else
configFile = argv[c];
}
// exit if help or version is enabled
if (vm.count("help"))
return 0;
#ifdef _WIN32
if (strcmp(argv[c], "-s") == 0) // Services
{
if (++c >= argc)
{
printf("Runtime-Error: -s option requires an input argument");
usage(argv[0]);
return 1;
}
if (strcmp(argv[c], "install") == 0)
{
if (WinServiceInstall())
printf("Installing service\n");
return 1;
}
else if (strcmp(argv[c], "uninstall") == 0)
{
if (WinServiceUninstall())
printf("Uninstalling service\n");
return 1;
}
else
{
printf("Runtime-Error: unsupported option %s", argv[c]);
usage(argv[0]);
return 1;
}
}
if (strcmp(argv[c], "--service") == 0)
WinServiceRun();
#if AC_PLATFORM == AC_PLATFORM_WINDOWS
if (configService.compare("install") == 0)
return WinServiceInstall() == true ? 0 : 1;
else if (configService.compare("uninstall") == 0)
return WinServiceUninstall() == true ? 0 : 1;
else if (configService.compare("run") == 0)
WinServiceRun();
#endif
++c;
}
// Add file and args in config
sConfigMgr->Configure(configFile, { argv, argv + argc }, CONFIG_FILE_LIST);
sConfigMgr->Configure(configFile.generic_string(), {argv, argv + argc}, CONFIG_FILE_LIST);
if (!sConfigMgr->LoadAppConfigs())
return 1;
@@ -400,7 +350,7 @@ int main(int argc, char** argv)
// Launch CliRunnable thread
std::shared_ptr<std::thread> cliThread;
#ifdef _WIN32
#if AC_PLATFORM == AC_PLATFORM_WINDOWS
if (sConfigMgr->GetOption<bool>("Console.Enable", true) && (m_ServiceStatus == -1)/* need disable console in service mode*/)
#else
if (sConfigMgr->GetOption<bool>("Console.Enable", true))
@@ -780,3 +730,44 @@ void ShutdownAuctionListingThread(std::thread* thread)
delete thread;
}
}
variables_map GetConsoleArguments(int argc, char** argv, fs::path& configFile, [[maybe_unused]] std::string& configService)
{
options_description all("Allowed options");
all.add_options()
("help,h", "print usage message")
("version,v", "print version build info")
("dry-run,d", "Dry run")
("config,c", value<fs::path>(&configFile)->default_value(fs::path(sConfigMgr->GetConfigPath() + std::string(_ACORE_CORE_CONFIG))), "use <arg> as configuration file");
#if AC_PLATFORM == WARHEAD_PLATFORM_WINDOWS
options_description win("Windows platform specific options");
win.add_options()
("service,s", value<std::string>(&configService)->default_value(""), "Windows service options: [install | uninstall]");
all.add(win);
#endif
variables_map vm;
try
{
store(command_line_parser(argc, argv).options(all).allow_unregistered().run(), vm);
notify(vm);
}
catch (std::exception const& e)
{
std::cerr << e.what() << "\n";
}
if (vm.count("help"))
{
std::cout << all << "\n";
}
else if (vm.count("dry-run"))
{
sConfigMgr->setDryRun(true);
}
return vm;
}

View File

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

View File

@@ -1,77 +0,0 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
########### authserver ###############
CollectSourceFiles(
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE_SOURCES
# Exclude
${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
if( WIN32 )
list(APPEND PRIVATE_SOURCES ${winDebugging})
if ( MSVC )
list(APPEND PRIVATE_SOURCES authserver.rc)
endif()
endif()
if (USE_COREPCH)
set(PRIVATE_PCH_HEADER PrecompiledHeaders/authPCH.h)
endif()
# Group sources
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
add_executable(authserver
${PRIVATE_SOURCES})
add_dependencies(authserver revision.h)
target_link_libraries(authserver
PRIVATE
acore-core-interface
PUBLIC
shared)
CollectIncludeDirectories(
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC_INCLUDES
# Exclude
${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
target_include_directories(authserver
PUBLIC
${PUBLIC_INCLUDES}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR})
set_target_properties(authserver
PROPERTIES
FOLDER
"server")
# Install config
CopyDefaultConfig(authserver)
if ( UNIX )
install(TARGETS authserver DESTINATION bin)
elseif ( WIN32 )
install(TARGETS authserver DESTINATION "${CMAKE_INSTALL_PREFIX}")
endif()
# Generate precompiled header
if (USE_COREPCH)
add_cxx_pch(authserver ${PRIVATE_PCH_HEADER})
endif()
CU_RUN_HOOK("AFTER_AUTHSERVER_CMAKE")

View File

@@ -90,7 +90,7 @@ uint32 MySQLConnection::Open()
MYSQL* mysqlInit = mysql_init(nullptr);
if (!mysqlInit)
{
LOG_ERROR("sql.sql", "Could not initialize Mysql connection to database `{}`", m_connectionInfo.database);
LOG_ERROR("sql.driver", "Could not initialize Mysql connection to database `{}`", m_connectionInfo.database);
return CR_UNKNOWN_ERROR;
}
@@ -170,7 +170,7 @@ uint32 MySQLConnection::Open()
}
else
{
LOG_ERROR("sql.sql", "Could not connect to MySQL database at {}: {}", m_connectionInfo.host, mysql_error(mysqlInit));
LOG_ERROR("sql.driver", "Could not connect to MySQL database at {}: {}", m_connectionInfo.host, mysql_error(mysqlInit));
uint32 errorCode = mysql_errno(mysqlInit);
mysql_close(mysqlInit);
return errorCode;

View File

@@ -181,16 +181,6 @@ void Player::SendResetFailedNotify(uint32 mapid)
GetSession()->SendPacket(&data);
}
void DeleteInstanceSavedData(uint32 instanceId)
{
if (instanceId)
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DELETE_INSTANCE_SAVED_DATA);
stmt->SetData(0, instanceId);
CharacterDatabase.Execute(stmt);
}
}
/// Reset all solo instances and optionally send a message on success for each
void Player::ResetInstances(ObjectGuid guid, uint8 method, bool isRaid)
{
@@ -223,7 +213,7 @@ void Player::ResetInstances(ObjectGuid guid, uint8 method, bool isRaid)
p->SendResetInstanceFailed(0, instanceSave->GetMapId());
}
DeleteInstanceSavedData(instanceSave->GetInstanceId());
sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
}
for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
{
@@ -258,7 +248,7 @@ void Player::ResetInstances(ObjectGuid guid, uint8 method, bool isRaid)
p->SendResetInstanceFailed(0, instanceSave->GetMapId());
}
DeleteInstanceSavedData(instanceSave->GetInstanceId());
sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
}
for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
sInstanceSaveMgr->UnbindAllFor(*itr);
@@ -287,7 +277,7 @@ void Player::ResetInstances(ObjectGuid guid, uint8 method, bool isRaid)
//else
// p->SendResetInstanceFailed(0, instanceSave->GetMapId());
DeleteInstanceSavedData(instanceSave->GetInstanceId());
sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
}
for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
sInstanceSaveMgr->PlayerUnbindInstance(p->GetGUID(), (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);

View File

@@ -17950,7 +17950,9 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
if (GetTypeId() == TYPEID_UNIT)
{
GetMotionMaster()->Clear(false);
GetMotionMaster()->MoveIdle();
StopMoving();
if (charmer->GetTypeId() == TYPEID_PLAYER &&
charmer->getClass() == CLASS_WARLOCK)

View File

@@ -829,12 +829,7 @@ void Group::Disband(bool hideDestroy /* = false */)
}
// Cleaning up instance saved data for gameobjects when a group is disbanded
if (instanceId)
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DELETE_INSTANCE_SAVED_DATA);
stmt->SetData(0, instanceId);
CharacterDatabase.Execute(stmt);
}
sInstanceSaveMgr->DeleteInstanceSavedData(instanceId);
sGroupMgr->RemoveGroup(this);
delete this;
@@ -2037,16 +2032,6 @@ void Group::SetRaidDifficulty(Difficulty difficulty)
}
}
void Group::ResetInstanceSavedGameobjects(uint32 instanceId)
{
if (instanceId)
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DELETE_INSTANCE_SAVED_DATA);
stmt->SetData(0, instanceId);
CharacterDatabase.Execute(stmt);
}
}
void Group::ResetInstances(uint8 method, bool isRaid, Player* leader)
{
if (isBGGroup() || isBFGroup() || isLFGGroup())
@@ -2078,7 +2063,7 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* leader)
leader->SendResetInstanceFailed(0, instanceSave->GetMapId());
}
ResetInstanceSavedGameobjects(instanceSave->GetInstanceId());
sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
}
for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
sInstanceSaveMgr->UnbindAllFor(*itr);
@@ -2106,7 +2091,7 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* leader)
leader->SendResetInstanceFailed(0, instanceSave->GetMapId());
}
ResetInstanceSavedGameobjects(instanceSave->GetInstanceId());
sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
}
for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
sInstanceSaveMgr->UnbindAllFor(*itr);

View File

@@ -320,8 +320,6 @@ public:
void SetDifficultyChangePrevention(DifficultyPreventionChangeType type);
void DoForAllMembers(std::function<void(Player*)> const& worker);
// Reset Instance Gameobjects
void ResetInstanceSavedGameobjects(uint32 instanceId);
protected:
void _homebindIfInstance(Player* player);
void _cancelHomebindIfInstance(Player* player);

View File

@@ -132,6 +132,7 @@ bool InstanceSaveMgr::DeleteInstanceSaveIfNeeded(InstanceSave* save, bool skipMa
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INSTANCE_BY_INSTANCE);
stmt->SetData(0, save->GetInstanceId());
CharacterDatabase.Execute(stmt);
DeleteInstanceSavedData(save->GetInstanceId());
// clear respawn times (if map is loaded do it just to be sure, if already unloaded it won't do it by itself)
Map::DeleteRespawnTimesInDB(save->GetMapId(), save->GetInstanceId());
@@ -244,6 +245,16 @@ void InstanceSaveMgr::SanitizeInstanceSavedData()
CharacterDatabase.Execute(stmt);
}
void InstanceSaveMgr::DeleteInstanceSavedData(uint32 instanceId)
{
if (instanceId)
{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DELETE_INSTANCE_SAVED_DATA);
stmt->SetData(0, instanceId);
CharacterDatabase.Execute(stmt);
}
}
void InstanceSaveMgr::LoadInstances()
{
uint32 oldMSTime = getMSTime();
@@ -512,6 +523,7 @@ void InstanceSaveMgr::_ResetSave(InstanceSaveHashMap::iterator& itr)
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INSTANCE_BY_INSTANCE);
stmt->SetData(0, itr->second->GetInstanceId());
CharacterDatabase.Execute(stmt);
DeleteInstanceSavedData(itr->second->GetInstanceId());
// clear respawn times if the map is already unloaded and won't do it by itself
if (!sMapMgr->FindMap(itr->second->GetMapId(), itr->second->GetInstanceId()))

View File

@@ -183,6 +183,7 @@ public:
void UnbindAllFor(InstanceSave* save);
void SanitizeInstanceSavedData();
void DeleteInstanceSavedData(uint32 instanceId);
protected:
static uint16 ResetTimeDelay[];
static PlayerBindStorage playerBindStorage;

View File

@@ -12,11 +12,8 @@
CU_RUN_HOOK(BEFORE_SCRIPTS_LIBRARY)
message("")
# Make the script module list available in the current scope
GetScriptModuleList(SCRIPT_MODULE_LIST)
GetModuleSourceList(MODULES_MODULE_LIST)
# Make the native install offset available in this scope
GetInstallOffset(INSTALL_OFFSET)
@@ -33,18 +30,6 @@ else()
set(SCRIPTS_DEFAULT_LINKAGE "disabled")
endif()
# Sets the MODULES_${SOURCE_MODULE} variables
# when using predefined templates for script building
# like dynamic, static
# Sets MODULES_DEFAULT_LINKAGE
if(MODULES MATCHES "dynamic")
set(MODULES_DEFAULT_LINKAGE "dynamic")
elseif(MODULES MATCHES "static")
set(MODULES_DEFAULT_LINKAGE "static")
else()
set(MODULES_DEFAULT_LINKAGE "disabled")
endif()
# Sets SCRIPTS_USE_WHITELIST
# Sets SCRIPTS_WHITELIST
if(SCRIPTS MATCHES "minimal")
@@ -93,8 +78,8 @@ list(SORT SCRIPT_GRAPH_KEYS)
list(REMOVE_DUPLICATES SCRIPT_GRAPH_KEYS)
# Display the script graph
message("* Script configuration (${SCRIPTS}):
|")
message("* Script configuration (${SCRIPTS}):")
message(" |")
foreach(SCRIPT_GRAPH_KEY ${SCRIPT_GRAPH_KEYS})
if(NOT SCRIPT_GRAPH_KEY STREQUAL "disabled")
@@ -108,10 +93,8 @@ foreach(SCRIPT_GRAPH_KEY ${SCRIPT_GRAPH_KEYS})
message(" |")
endforeach()
message("")
# Base sources which are used by every script project
if(USE_SCRIPTPCH)
if (USE_SCRIPTPCH)
set(PRIVATE_PCH_HEADER ScriptPCH.h)
endif()

View File

@@ -78,7 +78,7 @@ public:
{
uint32 CurrentSolakarWave = 0;
uint32 SolakarState = NOT_STARTED; // there should be a global instance encounter state, where is it?
std::vector<TempSummon*> SolakarSummons;
GuidVector SolakarSummons;
instance_blackrock_spireMapScript(InstanceMap* map) : InstanceScript(map)
{
@@ -360,11 +360,11 @@ public:
}
break;
case FAIL:
for (const auto& creature : SolakarSummons)
for (ObjectGuid const& guid : SolakarSummons)
{
if (creature)
if (Creature* creature = instance->GetCreature(guid))
{
creature->RemoveFromWorld();
creature->DespawnOrUnsummon();
}
}
SolakarSummons.clear();
@@ -429,11 +429,19 @@ public:
{
if (number < MAX_WAVE_COUNT)
{
SolakarSummons.push_back(instance->SummonCreature(NPC_ROOKERY_GUARDIAN, SolakarPosLeft));
SolakarSummons.push_back(instance->SummonCreature(NPC_ROOKERY_HATCHER, SolakarPosRight));
if (Creature* summon = instance->SummonCreature(NPC_ROOKERY_GUARDIAN, SolakarPosLeft))
{
SolakarSummons.push_back(summon->GetGUID());
}
if (Creature* summon = instance->SummonCreature(NPC_ROOKERY_HATCHER, SolakarPosRight))
{
SolakarSummons.push_back(summon->GetGUID());
}
if (number == 0)
{
if (Creature* FirstHatcher = SolakarSummons.back()) // works because we spawned a hatcher second
if (Creature* FirstHatcher = instance->GetCreature(SolakarSummons.back())) // works because we spawned a hatcher second
{
FirstHatcher->AI()->Talk(SAY_SOLAKAR_FIRST_HATCHER);
}
@@ -441,7 +449,10 @@ public:
}
else if (number == MAX_WAVE_COUNT)
{
SolakarSummons.push_back(instance->SummonCreature(NPC_SOLAKAR, SolakarPosBoss));
if (Creature* summon = instance->SummonCreature(NPC_SOLAKAR, SolakarPosBoss))
{
SolakarSummons.push_back(summon->GetGUID());
}
}
}

View File

@@ -29,7 +29,7 @@ EndScriptData */
enum Spells
{
SPELL_FROSTBREATH = 16099,
SPELL_MASSIVEGEYSER = 22421, // Not working. (summon)
SPELL_MASSIVEGEYSER = 22421,
SPELL_SLAM = 24326
};

View File

@@ -39,7 +39,7 @@ enum Spells
{
SPELL_BLOOD_SIPHON = 24322, // Buggy ?
SPELL_CORRUPTED_BLOOD = 24328,
SPELL_CAUSE_INSANITY = 24327, // Spell needs scripting.
SPELL_CAUSE_INSANITY = 24327,
SPELL_WILL_OF_HAKKAR = 24178,
SPELL_ENRAGE = 24318,
// The Aspects of all High Priests spells
@@ -54,7 +54,7 @@ enum Events
{
EVENT_BLOOD_SIPHON = 1,
EVENT_CORRUPTED_BLOOD = 2,
EVENT_CAUSE_INSANITY = 3, // Spell needs scripting. Event disabled
EVENT_CAUSE_INSANITY = 3,
EVENT_WILL_OF_HAKKAR = 4,
EVENT_ENRAGE = 5,
// The Aspects of all High Priests events
@@ -128,8 +128,11 @@ public:
events.ScheduleEvent(EVENT_CORRUPTED_BLOOD, urand(30000, 45000));
break;
case EVENT_CAUSE_INSANITY:
// DoCast(SelectTarget(SelectTargetMethod::Random, 0, 100, true), SPELL_CAUSE_INSANITY);
// events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000));
if (Unit* victim = SelectTarget(SelectTargetMethod::MaxThreat, 0))
{
DoCast(victim, SPELL_CAUSE_INSANITY, true);
}
events.ScheduleEvent(EVENT_CAUSE_INSANITY, urand(35000, 45000));
break;
case EVENT_WILL_OF_HAKKAR:
// Xinef: Skip Tank

View File

@@ -110,12 +110,7 @@ public:
events.ScheduleEvent(EVENT_POWERFULLHEALINGWARD, urand(14000, 20000));
break;
case EVENT_HEX:
if (Unit* target = me->GetVictim())
{
DoCast(target, SPELL_HEX, true);
if (DoGetThreat(target))
DoModifyThreatPercent(target, -80);
}
DoCastVictim(SPELL_HEX, true);
events.ScheduleEvent(EVENT_HEX, urand(12000, 20000));
break;
case EVENT_DELUSIONSOFJINDO: // HACK
@@ -174,6 +169,11 @@ public:
DoMeleeAttackIfReady();
}
bool CanAIAttack(Unit const* target) const override
{
return !target->HasAura(SPELL_HEX);
}
};
CreatureAI* GetAI(Creature* creature) const override

View File

@@ -78,6 +78,15 @@ public:
}
};
// The cleansing
enum TurmoilTexts
{
SAY_TURMOIL_0 = 0,
SAY_TURMOIL_1 = 1,
SAY_TURMOIL_HALF_HP = 2,
SAY_TURMOIL_DEATH = 3,
};
class npc_your_inner_turmoil : public CreatureScript
{
public:
@@ -89,16 +98,18 @@ public:
uint32 timer;
short phase;
bool health50;
void Reset() override
{
timer = 0;
phase = 0;
health50 = false;
}
void UpdateAI(uint32 diff) override
{
if (timer >= 6000 && phase < 4)
if (timer >= 6000 && phase < 2)
{
phase++;
setphase(phase);
@@ -110,6 +121,20 @@ public:
DoMeleeAttackIfReady();
}
void DamageTaken(Unit*, uint32& /*damage*/, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override
{
if (HealthBelowPct(50) && !health50)
{
Talk(SAY_TURMOIL_HALF_HP, me->ToTempSummon()->GetSummonerUnit()->ToPlayer());
health50 = true;
}
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_TURMOIL_DEATH, me->ToTempSummon()->GetSummonerUnit()->ToPlayer());
}
void setphase(short newPhase)
{
Unit* summoner = me->ToTempSummon() ? me->ToTempSummon()->GetSummonerUnit() : nullptr;
@@ -119,16 +144,11 @@ public:
switch (newPhase)
{
case 1:
me->Whisper("You think that you can get rid of me through meditation?", LANG_UNIVERSAL, summoner->ToPlayer());
Talk(SAY_TURMOIL_0, summoner->ToPlayer());
return;
case 2:
me->Whisper("Fool! I will destroy you and finally become that which has been building inside of you all these years!", LANG_UNIVERSAL, summoner->ToPlayer());
return;
case 3:
me->Whisper("You cannot defeat me. I'm an inseparable part of you!", LANG_UNIVERSAL, summoner->ToPlayer());
return;
case 4:
me->Whisper("NOOOOOOOoooooooooo!", LANG_UNIVERSAL, summoner->ToPlayer());
{
Talk(SAY_TURMOIL_1, summoner->ToPlayer());
me->SetLevel(summoner->getLevel());
me->SetFaction(FACTION_MONSTER);
if (me->GetExactDist(summoner) < 50.0f)
@@ -137,6 +157,7 @@ public:
summoner->CastSpell(me, 50218, true); // clone caster
AttackStart(summoner);
}
}
}
}
};

View File

@@ -85,6 +85,7 @@ enum AHerosBurden
NPC_JALOOT = 28667,
NPC_ZEPIK = 28668,
NPC_ARTRUIS = 28659,
EVENT_CAST_FROST_BOLT = 1,
EVENT_CAST_FROST_NOVA = 2,
@@ -99,6 +100,16 @@ enum AHerosBurden
ACTION_MAKE_FRIENDLY = 2,
GO_ARTRUIS_PHYLACTERY = 190777,
// Texts
SAY_TURNED_FRIENDLY = 0, // Zepik and Jaloot
SAY_ARTRUIS_AGGRO = 0,
SAY_ARTRUIS_TALK_1 = 1,
SAY_ARTRUIS_TALK_2 = 2,
SAY_ARTRUIS_TALK_3 = 3,
SAY_ARTRUIS_SHIELD = 4, // Boss emote
SAY_ARTRUIS_TALK_4 = 5,
};
class npc_artruis_the_hearthless : public CreatureScript
@@ -143,7 +154,7 @@ public:
void EnterCombat(Unit* /*who*/) override
{
me->Yell("Ah, the heroes. Your little friends said you would come. This certainly saves me the trouble of hunting you down myself.", LANG_UNIVERSAL);
Talk(SAY_ARTRUIS_AGGRO);
me->CastSpell(me, SPELL_ARTRUIS_ICY_VEINS, true);
events.RescheduleEvent(EVENT_CAST_FROST_BOLT, 4000);
events.RescheduleEvent(EVENT_CAST_FROST_NOVA, 15000);
@@ -187,7 +198,7 @@ public:
}
else if (action == ACTION_MAKE_FRIENDLY && me->GetVictim())
{
minion->Say("Now you not catch us with back turned! Now we hurt you bad undead. BAD!", LANG_UNIVERSAL);
minion->AI()->Talk(SAY_TURNED_FRIENDLY);
minion->RemoveAurasDueToSpell(SPELL_ARTRUIS_BINDING);
minion->SetFaction(me->GetVictim()->GetFaction());
minion->AddThreat(me, 100000.0f);
@@ -215,21 +226,22 @@ public:
if (me->GetHealthPct() <= 30)
{
me->SetControlled(true, UNIT_STATE_STUNNED);
me->TextEmote("Artruis is shielded. You must choose your side quickly to break his spell.", nullptr, true);
Talk(SAY_ARTRUIS_SHIELD);
Talk(SAY_ARTRUIS_TALK_3);
SummonsAction(ACTION_BIND_MINIONS);
break;
}
events.RepeatEvent(1000);
break;
case EVENT_ARTRUIS_TALK1:
me->Yell("I have weathered a hundred years of war and suffering. Do you truly think it wise to pit your mortal bodies against a being that cannot die? I'd venture you have more to lose.", LANG_UNIVERSAL);
Talk(SAY_ARTRUIS_TALK_1);
events.RescheduleEvent(EVENT_ARTRUIS_TALK2, 10000);
break;
case EVENT_ARTRUIS_TALK2:
me->Yell("Even shattered into countless pieces, the crystals all around weaken me... perhaps i should not have underestimated the titans so...", LANG_UNIVERSAL);
Talk(SAY_ARTRUIS_TALK_2);
break;
case EVENT_ARTRUIS_TALK3:
me->Yell("Arthas once mustered strength... of the very same sort... perhaps he is the path that you will follow.", LANG_UNIVERSAL);
Talk(SAY_ARTRUIS_TALK_4);
break;
case EVENT_CAST_FROST_BOLT:
me->CastSpell(me->GetVictim(), SPELL_ARTRUIS_FROSTBOLT, false);
@@ -261,24 +273,24 @@ public:
quest Still At It (12644)
******/
#define MCM_TEXT_START "Beginning the distillation in 5 seconds."
#define MCM_TEXT_PRESSURE "Pressure's too high! Open the pressure valve!"
#define MCM_TEXT_HEAT "The still needs heat! Light the brazier!"
#define MCM_TEXT_BANANA "Add bananas!"
#define MCM_TEXT_ORANGE "Add another orange! Quickly!"
#define MCM_TEXT_PAPAYA "Put a papaya in the still!"
#define MCM_TEXT_CORRECT1 "Nicely handled! Stay on your toes!"
#define MCM_TEXT_CORRECT2 "That'll do. Never know what it'll need next..."
#define MCM_TEXT_CORRECT3 "Good job! Keep your eyes open, now."
#define MCM_TEXT_SUCCESS1 "Well done! Be ready for anything!"
#define MCM_TEXT_SUCCESS2 "We've done it! Come get the cask."
#define MCM_TEXT_FAILED "You have FAILED!!!"
#define ACTION_PRESSURE 1
#define ACTION_HEAT 2
//#define ACTION_BANANA 3
//#define ACTION_ORANGE 4
//#define ACTION_PAPAYA 5
#define NPC_WANTS_BANANAS 28537
enum StillAtIt
{
NPC_MANUS = 28566,
NPC_WANTS_BANANAS = 28537,
QUEST_STILL_AT_IT = 12644,
GOSSIP_MANUS_MENU = 9713,
SAY_MANUS_START = 0,
SAY_MANUS_ORANGE = 1,
SAY_MANUS_PAPAYA = 2,
SAY_MANUS_BANANA = 3,
SAY_MANUS_PRESSUE = 4,
SAY_MANUS_HEAT = 5,
SAY_MANUS_WELL_DONE = 6,
SAY_MANUS_FAILED = 7,
SAY_MANUS_END = 8,
};
class npc_still_at_it_trigger : public CreatureScript
{
@@ -305,6 +317,8 @@ public:
npc_still_at_it_triggerAI(Creature* pCreature) : NullCreatureAI(pCreature) {}
Creature* GetManus() {return ObjectAccessor::GetCreature(*me, thunderbrewGUID);}
void Reset() override
{
running = false;
@@ -324,20 +338,12 @@ public:
damage = 0;
}
void Say(const char* text)
{
if (Creature* th = ObjectAccessor::GetCreature(*me, thunderbrewGUID))
th->Say(text, LANG_UNIVERSAL);
else
Reset();
}
void Start()
{
timer = 5000;
running = true;
stepcount = urand(5, 10);
Say(MCM_TEXT_START);
GetManus()->AI()->Talk(SAY_MANUS_START);
}
void CheckAction(uint8 a, ObjectGuid guid)
@@ -348,27 +354,15 @@ public:
if (a == expectedaction)
{
currentstep++;
uint8 s = urand(0, 2);
if (Creature* th = ObjectAccessor::GetCreature(*me, thunderbrewGUID))
th->HandleEmoteCommand(EMOTE_ONESHOT_CHEER_NO_SHEATHE);
switch (s)
{
case 0:
Say(MCM_TEXT_CORRECT1);
break;
case 1:
Say(MCM_TEXT_CORRECT2);
break;
default:
Say(MCM_TEXT_CORRECT3);
break;
}
GetManus()->AI()->Talk(SAY_MANUS_WELL_DONE);
if (currentstep >= stepcount)
{
Say(MCM_TEXT_SUCCESS1);
GetManus()->AI()->Talk(SAY_MANUS_WELL_DONE);
success = true;
timer = 3000;
}
@@ -380,7 +374,7 @@ public:
}
else
{
Say(MCM_TEXT_FAILED);
GetManus()->AI()->Talk(SAY_MANUS_FAILED);
Reset();
}
}
@@ -417,15 +411,15 @@ public:
if( timer < 0 )
timer = 0;
}
else if ( success)
else if (success)
{
Say(MCM_TEXT_SUCCESS2);
me->SummonGameObject(190643, 5546.55f, 5768.0f, -78.03f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 60000);
GetManus()->AI()->Talk(SAY_MANUS_END);
me->SummonGameObject(190643, 5546.55f, 5768.0f, -78.03f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0);
Reset();
}
else if (expectedaction != 0) // didn't make it in 10 seconds
{
Say(MCM_TEXT_FAILED);
GetManus()->AI()->Talk(SAY_MANUS_FAILED);
Reset();
}
else // it's time to rand next move
@@ -434,19 +428,19 @@ public:
switch (expectedaction)
{
case 1:
Say(MCM_TEXT_PRESSURE);
GetManus()->AI()->Talk(SAY_MANUS_PRESSUE);
break;
case 2:
Say(MCM_TEXT_HEAT);
GetManus()->AI()->Talk(SAY_MANUS_HEAT);
break;
case 3:
Say(MCM_TEXT_BANANA);
GetManus()->AI()->Talk(SAY_MANUS_BANANA);
break;
case 4:
Say(MCM_TEXT_ORANGE);
GetManus()->AI()->Talk(SAY_MANUS_ORANGE);
break;
case 5:
Say(MCM_TEXT_PAPAYA);
GetManus()->AI()->Talk(SAY_MANUS_PAPAYA);
break;
}
timer = 10000;
@@ -469,8 +463,8 @@ public:
if (creature->IsQuestGiver())
player->PrepareQuestMenu(creature->GetGUID());
if (player->GetQuestStatus(12644) == QUEST_STATUS_INCOMPLETE)
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "I'm ready to start the distillation, uh, Tipsy.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
if (player->GetQuestStatus(QUEST_STILL_AT_IT) == QUEST_STATUS_INCOMPLETE)
AddGossipItemFor(player, GOSSIP_MANUS_MENU, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
return true;
@@ -541,13 +535,13 @@ public:
## npc_vekjik
######*/
#define GOSSIP_VEKJIK_ITEM1 "Shaman Vekjik, I have spoken with the big-tongues and they desire peace. I have brought this offering on their behalf."
#define GOSSIP_VEKJIK_ITEM2 "No no... I had no intentions of betraying your people. I was only defending myself. it was all a misunderstanding."
enum Vekjik
{
GOSSIP_TEXTID_VEKJIK1 = 13137,
GOSSIP_TEXTID_VEKJIK2 = 13138,
GOSSIP_VEKJIK_MENU_1 = 9678,
GOSSIP_VEKJIK_MENU_2 = 9686,
GOSSIP_TEXTID_VEKJIK_1 = 13137,
GOSSIP_TEXTID_VEKJIK_2 = 13138,
SAY_TEXTID_VEKJIK1 = 0,
@@ -568,8 +562,8 @@ public:
if (player->GetQuestStatus(QUEST_MAKING_PEACE) == QUEST_STATUS_INCOMPLETE)
{
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK1, creature->GetGUID());
AddGossipItemFor(player, GOSSIP_VEKJIK_MENU_1, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK_1, creature->GetGUID());
return true;
}
@@ -583,8 +577,8 @@ public:
switch (action)
{
case GOSSIP_ACTION_INFO_DEF+1:
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_VEKJIK_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK2, creature->GetGUID());
AddGossipItemFor(player, GOSSIP_VEKJIK_MENU_2, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, GOSSIP_TEXTID_VEKJIK_2, creature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
CloseGossipMenuFor(player);
@@ -603,19 +597,19 @@ public:
## avatar_of_freya
######*/
#define GOSSIP_ITEM_AOF1 "I want to stop the Scourge as much as you do. How can I help?"
#define GOSSIP_ITEM_AOF2 "You can trust me. I am no friend of the Lich King."
#define GOSSIP_ITEM_AOF3 "I will not fail."
enum Freya
{
QUEST_FREYA_PACT = 12621,
SPELL_FREYA_CONVERSATION = 52045,
GOSSIP_TEXTID_AVATAR1 = 13303,
GOSSIP_TEXTID_AVATAR2 = 13304,
GOSSIP_TEXTID_AVATAR3 = 13305
GOSSIP_AVATAR_MENU_1 = 9720,
GOSSIP_AVATAR_MENU_2 = 9721,
GOSSIP_AVATAR_MENU_3 = 9722,
GOSSIP_TEXTID_AVATAR_1 = 13303,
GOSSIP_TEXTID_AVATAR_2 = 13304,
GOSSIP_TEXTID_AVATAR_3 = 13305,
};
class npc_avatar_of_freya : public CreatureScript
@@ -629,9 +623,9 @@ public:
player->PrepareQuestMenu(creature->GetGUID());
if (player->GetQuestStatus(QUEST_FREYA_PACT) == QUEST_STATUS_INCOMPLETE)
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
AddGossipItemFor(player, GOSSIP_AVATAR_MENU_1, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR1, creature);
SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR_1, creature);
return true;
}
@@ -641,12 +635,12 @@ public:
switch (action)
{
case GOSSIP_ACTION_INFO_DEF+1:
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR2, creature);
AddGossipItemFor(player, GOSSIP_AVATAR_MENU_2, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR_2, creature);
break;
case GOSSIP_ACTION_INFO_DEF+2:
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_AOF3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR3, creature);
AddGossipItemFor(player, GOSSIP_AVATAR_MENU_3, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
SendGossipMenuFor(player, GOSSIP_TEXTID_AVATAR_3, creature);
break;
case GOSSIP_ACTION_INFO_DEF+3:
player->CastSpell(player, SPELL_FREYA_CONVERSATION, true);
@@ -828,8 +822,6 @@ public:
## npc_jungle_punch_target
#####*/
constexpr auto SAY_OFFER = "Care to try Grimbooze Thunderbrew's new jungle punch?";
enum JunglePunch
{
ITEM_TANKARD = 2705,
@@ -846,7 +838,10 @@ enum JunglePunch
SAY_HEMET_HADRIUS_TAMARA_3 = 2,
SAY_HEMET_4 = 3, // unused
SAY_HEMET_5 = 4 // unused
SAY_HEMET_5 = 4, // unused
// Player Say
SAY_OFFER = 28558,
};
enum NesingwaryChildrensWeek
@@ -1013,7 +1008,7 @@ public:
continue;
player->KilledMonsterCredit(me->GetEntry());
player->Say(SAY_OFFER, LANG_UNIVERSAL);
player->Say(SAY_OFFER);
sayStep = 1;
break;
}
@@ -1038,10 +1033,6 @@ public:
## npc_adventurous_dwarf
######*/
#define GOSSIP_OPTION_ORANGE "Can you spare an orange?"
#define GOSSIP_OPTION_BANANAS "Have a spare bunch of bananas?"
#define GOSSIP_OPTION_PAPAYA "I could really use a papaya."
enum AdventurousDwarf
{
QUEST_12634 = 12634,
@@ -1054,10 +1045,14 @@ enum AdventurousDwarf
SPELL_ADD_BANANAS = 52074,
SPELL_ADD_PAPAYA = 52076,
GOSSIP_MENU_DWARF = 13307,
SAY_DWARF_OUCH = 0,
SAY_DWARF_HELP = 1
SAY_DWARF_HELP = 1,
// Gossips
GOSSIP_DWARF_MENU = 9724,
GOSSIP_DWARF_ORANGE = 0,
GOSSIP_DWARF_BANANA = 1,
GOSSIP_DWARF_PAPAYA = 2,
};
class npc_adventurous_dwarf : public CreatureScript
@@ -1084,15 +1079,15 @@ public:
return false;
if (player->GetItemCount(ITEM_ORANGE) < 1)
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_ORANGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
AddGossipItemFor(player, GOSSIP_DWARF_MENU, GOSSIP_DWARF_ORANGE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
if (player->GetItemCount(ITEM_BANANAS) < 2)
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_BANANAS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
AddGossipItemFor(player, GOSSIP_DWARF_MENU, GOSSIP_DWARF_BANANA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2);
if (player->GetItemCount(ITEM_PAPAYA) < 1)
AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_OPTION_PAPAYA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
AddGossipItemFor(player, GOSSIP_DWARF_MENU, GOSSIP_DWARF_PAPAYA, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3);
SendGossipMenuFor(player, GOSSIP_MENU_DWARF, creature);
SendGossipMenuFor(player, player->GetGossipTextId(creature), creature);
return true;
}

View File

@@ -41,6 +41,8 @@ enum eWGqueuenpctext
WG_NPCQUEUE_TEXT_A_QUEUE = 14791,
WG_NPCQUEUE_TEXT_A_WAR = 14781,
WG_NPCQUEUE_TEXTOPTION_JOIN = -1850507,
WG_GOSSIP_MENU_QUEUE = 10662,
};
enum Spells
@@ -295,7 +297,7 @@ public:
if (wintergrasp->IsWarTime())
{
AddGossipItemFor(player, GOSSIP_ICON_CHAT_19, "Queue for Wintergrasp.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
AddGossipItemFor(player, WG_GOSSIP_MENU_QUEUE, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_WAR : WG_NPCQUEUE_TEXT_A_WAR, creature->GetGUID());
}
else
@@ -304,7 +306,7 @@ public:
player->SendUpdateWorldState(4354, GameTime::GetGameTime().count() + timer);
if (timer < 15 * MINUTE)
{
AddGossipItemFor(player, GOSSIP_ICON_CHAT, "Queue for Wintergrasp.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
AddGossipItemFor(player, WG_GOSSIP_MENU_QUEUE, 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF);
SendGossipMenuFor(player, wintergrasp->GetDefenderTeam() ? WG_NPCQUEUE_TEXT_H_QUEUE : WG_NPCQUEUE_TEXT_A_QUEUE, creature->GetGUID());
}
else

View File

@@ -19,7 +19,6 @@
#define ACORE_SHAREDDEFINES_H
#include "Define.h"
#include "DetourNavMesh.h"
#include "EnumFlag.h"
#include <cassert>

View File

@@ -1,91 +0,0 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
CollectSourceFiles(
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE_SOURCES
# Exclude
${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
if( WIN32 )
list(APPEND PRIVATE_SOURCES ${winDebugging} ${winService})
if ( MSVC )
list(APPEND PRIVATE_SOURCES worldserver.rc)
endif()
endif()
if (USE_COREPCH)
set(PRIVATE_PCH_HEADER PrecompiledHeaders/worldPCH.h)
endif()
# Group sources
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
add_executable(worldserver
${PRIVATE_SOURCES})
add_dependencies(worldserver revision.h)
if(UNIX AND NOT NOJEM)
set(worldserver_LINK_FLAGS "-pthread -lncurses ${worldserver_LINK_FLAGS}")
endif()
set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAGS}")
CollectIncludeDirectories(
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC_INCLUDES
# Exclude
${CMAKE_CURRENT_SOURCE_DIR}/PrecompiledHeaders)
target_include_directories(worldserver
PUBLIC
${PUBLIC_INCLUDES}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(worldserver
PRIVATE
acore-core-interface
PUBLIC
modules
scripts
game
gsoap
readline
gperftools)
set_target_properties(worldserver
PROPERTIES
FOLDER
"server")
# Add all dynamic projects as dependency to the worldserver
if(WORLDSERVER_DYNAMIC_SCRIPT_MODULES_DEPENDENCIES)
add_dependencies(worldserver ${WORLDSERVER_DYNAMIC_SCRIPT_MODULES_DEPENDENCIES})
endif()
# Install config
CopyDefaultConfig(worldserver)
if( UNIX )
install(TARGETS worldserver DESTINATION bin)
elseif( WIN32 )
install(TARGETS worldserver DESTINATION "${CMAKE_INSTALL_PREFIX}")
endif()
# Generate precompiled header
if( USE_COREPCH )
add_cxx_pch(worldserver ${PRIVATE_PCH_HEADER})
endif()
CU_RUN_HOOK("AFTER_WORLDSERVER_CMAKE")

View File

@@ -8,9 +8,155 @@
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
add_subdirectory(map_extractor)
add_subdirectory(vmap4_assembler)
add_subdirectory(vmap4_extractor)
add_subdirectory(mmaps_generator)
# Make the tools list available in the current scope
GetToolsList(TOOLS_BUILD_LIST)
if (TOOLS_BUILD STREQUAL "none")
set(TOOLS_DEFAULT_BUILD "disabled")
else()
set(TOOLS_DEFAULT_BUILD "enabled")
endif()
# Sets BUILD_TOOLS_USE_WHITELIST
# Sets BUILD_TOOLS_WHITELIST
if (TOOLS_BUILD MATCHES "-only")
set(BUILD_TOOLS_USE_WHITELIST ON)
if (TOOLS_BUILD STREQUAL "maps-only")
list(APPEND BUILD_TOOLS_WHITELIST map_extractor mmaps_generator vmap4_assembler vmap4_extractor)
endif()
# if (TOOLS_BUILD STREQUAL "db-only")
# list(APPEND BUILD_TOOLS_WHITELIST dbimport)
# endif()
endif()
# Set the TOOL_${TOOL_BUILD_NAME} variables from the
# variables set above
foreach(TOOL_BUILD_NAME ${TOOLS_BUILD_LIST})
ToolNameToVariable(${TOOL_BUILD_NAME} TOOL_BUILD_VARIABLE)
if(${TOOL_BUILD_VARIABLE} STREQUAL "default")
if(BUILD_TOOLS_USE_WHITELIST)
list(FIND BUILD_TOOLS_WHITELIST "${TOOL_BUILD_NAME}" INDEX)
if(${INDEX} GREATER -1)
set(${TOOL_BUILD_VARIABLE} ${TOOLS_DEFAULT_BUILD})
else()
set(${TOOL_BUILD_VARIABLE} "disabled")
endif()
else()
set(${TOOL_BUILD_VARIABLE} ${TOOLS_DEFAULT_BUILD})
endif()
endif()
# Build the Graph values
if(${TOOL_BUILD_VARIABLE} MATCHES "enabled")
list(APPEND TOOL_BUILD_GRAPH_KEYS tools)
set(TOOL_BUILD_VALUE_DISPLAY_tools tools)
list(APPEND TOOL_BUILD_VALUE_CONTAINS_tools ${TOOL_BUILD_NAME})
else()
list(APPEND TOOL_BUILD_GRAPH_KEYS disabled)
set(TOOL_BUILD_VALUE_DISPLAY_disabled disabled)
list(APPEND TOOL_BUILD_VALUE_CONTAINS_disabled ${TOOL_BUILD_NAME})
endif()
endforeach()
list(SORT TOOL_BUILD_GRAPH_KEYS)
list(REMOVE_DUPLICATES TOOL_BUILD_GRAPH_KEYS)
# Display the graphs
# message("")
message("* Tools build list (${TOOLS_BUILD}):")
message(" |")
foreach(TOOL_BUILD_GRAPH_KEY ${TOOL_BUILD_GRAPH_KEYS})
if(NOT TOOL_BUILD_GRAPH_KEY STREQUAL "disabled")
message(" +- ${TOOL_BUILD_VALUE_DISPLAY_${TOOL_BUILD_GRAPH_KEY}}")
else()
message(" | ${TOOL_BUILD_VALUE_DISPLAY_${TOOL_BUILD_GRAPH_KEY}}")
endif()
foreach(TOOL_BUILD_GRAPH_ENTRY ${TOOL_BUILD_VALUE_CONTAINS_${TOOL_BUILD_GRAPH_KEY}})
message(" | +- ${TOOL_BUILD_GRAPH_ENTRY}")
endforeach()
message(" |")
endforeach()
message("")
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
# Generates the actual tools projects
foreach(TOOL_NAME ${TOOLS_BUILD_LIST})
GetPathToTool(${TOOL_NAME} SOURCE_TOOL_PATH)
ToolNameToVariable(${TOOL_NAME} TOOL_BUILD_VARIABLE)
if (${TOOL_BUILD_VARIABLE} STREQUAL "disabled")
continue()
endif()
unset(TOOL_PRIVATE_SOURCES)
CollectSourceFiles(
${SOURCE_TOOL_PATH}
TOOL_PRIVATE_SOURCES)
if (WIN32)
list(APPEND TOOL_PRIVATE_SOURCES ${winDebugging})
endif()
GetProjectNameOfToolName(${TOOL_NAME} TOOL_PROJECT_NAME)
# Create the application project
add_executable(${TOOL_PROJECT_NAME}
${TOOL_PRIVATE_SOURCES})
add_dependencies(${TOOL_PROJECT_NAME} revision.h)
# Need fix errors
# target_link_libraries(${TOOL_PROJECT_NAME}
# PRIVATE
# acore-core-interface)
# if (${TOOL_PROJECT_NAME} MATCHES "dbimport")
# target_link_libraries(${TOOL_PROJECT_NAME}
# PUBLIC
# database)
# # Install config
# CopyToolConfig(${TOOL_PROJECT_NAME} ${TOOL_NAME})
# else()
target_link_libraries(${TOOL_PROJECT_NAME}
PUBLIC
common
mpq
zlib
Recast
g3dlib)
# endif()
unset(TOOL_PUBLIC_INCLUDES)
CollectIncludeDirectories(
${SOURCE_TOOL_PATH}
TOOL_PUBLIC_INCLUDES)
target_include_directories(${TOOL_PROJECT_NAME}
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(${TOOL_PROJECT_NAME}
PUBLIC
${TOOL_PUBLIC_INCLUDES}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/${TOOL_NAME})
set_target_properties(${TOOL_PROJECT_NAME}
PROPERTIES
FOLDER
"tools")
if (UNIX)
install(TARGETS ${TOOL_PROJECT_NAME} DESTINATION bin)
elseif (WIN32)
install(TARGETS ${TOOL_PROJECT_NAME} DESTINATION "${CMAKE_INSTALL_PREFIX}")
endif()
endforeach()

View File

@@ -1,55 +0,0 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
CollectSourceFiles(
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE_SOURCES)
add_executable(mapextractor
${PRIVATE_SOURCES}
)
target_include_directories(mapextractor
PUBLIC
${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/loadlib)
target_link_libraries(mapextractor
PRIVATE
acore-core-interface
PUBLIC
common
mpq)
CollectIncludeDirectories(
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC_INCLUDES)
# Group sources
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
target_include_directories(mapextractor
PUBLIC
${PUBLIC_INCLUDES}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR})
set_target_properties(mapextractor
PROPERTIES
FOLDER
"tools")
if( UNIX )
install(TARGETS mapextractor DESTINATION bin)
elseif( WIN32 )
install(TARGETS mapextractor DESTINATION "${CMAKE_INSTALL_PREFIX}")
endif()

View File

@@ -1,50 +0,0 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
CollectSourceFiles(
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE_SOURCES)
add_executable(mmaps_generator ${PRIVATE_SOURCES})
target_link_libraries(mmaps_generator
PRIVATE
acore-core-interface
PUBLIC
common
Recast
mpq)
# Group sources
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
CollectIncludeDirectories(
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC_INCLUDES)
target_include_directories(mmaps_generator
PUBLIC
${PUBLIC_INCLUDES}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_SOURCE_DIR}/src/server/game/Conditions)
set_target_properties(mmaps_generator
PROPERTIES
FOLDER
"tools")
if( UNIX )
install(TARGETS mmaps_generator DESTINATION bin)
elseif( WIN32 )
install(TARGETS mmaps_generator DESTINATION "${CMAKE_INSTALL_PREFIX}")
endif()

View File

@@ -1,38 +0,0 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
add_executable(vmap4assembler VMapAssembler.cpp)
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
set_target_properties(vmap4assembler PROPERTIES LINK_FLAGS "-framework Carbon")
endif()
target_link_libraries(vmap4assembler
PRIVATE
acore-core-interface
PUBLIC
common
zlib)
# Group sources
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
set_target_properties(vmap4assembler
PROPERTIES
FOLDER
"tools")
if( UNIX )
install(TARGETS vmap4assembler DESTINATION bin)
elseif( WIN32 )
install(TARGETS vmap4assembler DESTINATION "${CMAKE_INSTALL_PREFIX}")
endif()

View File

@@ -1,46 +0,0 @@
#
# This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
CollectSourceFiles(
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE_SOURCES)
add_executable(vmap4extractor ${PRIVATE_SOURCES})
target_link_libraries(vmap4extractor
PUBLIC
g3dlib
mpq)
# Group sources
GroupSources(${CMAKE_CURRENT_SOURCE_DIR})
CollectIncludeDirectories(
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC_INCLUDES)
target_include_directories(vmap4extractor
PUBLIC
${PUBLIC_INCLUDES}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR})
set_target_properties(vmap4extractor
PROPERTIES
FOLDER
"tools")
if( UNIX )
install(TARGETS vmap4extractor DESTINATION bin)
elseif( WIN32 )
install(TARGETS vmap4extractor DESTINATION "${CMAKE_INSTALL_PREFIX}")
endif()