diff --git a/.env.template b/.env.template index 6314c87..204268d 100644 --- a/.env.template +++ b/.env.template @@ -48,12 +48,12 @@ AC_DB_IMPORT_IMAGE=acore/ac-wotlk-db-import:14.0.0-dev AC_AUTHSERVER_IMAGE=acore/ac-wotlk-authserver:14.0.0-dev AC_WORLDSERVER_IMAGE=acore/ac-wotlk-worldserver:14.0.0-dev # Services (Playerbots) -AC_AUTHSERVER_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:authserver-Playerbot -AC_WORLDSERVER_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:worldserver-Playerbot +AC_AUTHSERVER_IMAGE_PLAYERBOTS=acore/ac-wotlk-authserver:master +AC_WORLDSERVER_IMAGE_PLAYERBOTS=acore/ac-wotlk-worldserver:master # Services (Module Build Tags) # Images used during module compilation and tagging -AC_AUTHSERVER_IMAGE_MODULES=uprightbass360/azerothcore-wotlk-playerbots:authserver-modules-latest -AC_WORLDSERVER_IMAGE_MODULES=uprightbass360/azerothcore-wotlk-playerbots:worldserver-modules-latest +AC_AUTHSERVER_IMAGE_MODULES=acore/ac-wotlk-authserver:modules-latest +AC_WORLDSERVER_IMAGE_MODULES=acore/ac-wotlk-worldserver:modules-latest # Client Data AC_CLIENT_DATA_IMAGE=acore/ac-wotlk-client-data:14.0.0-dev AC_CLIENT_DATA_IMAGE_PLAYERBOTS=uprightbass360/azerothcore-wotlk-playerbots:client-data-Playerbot @@ -163,6 +163,7 @@ MODULE_AUTO_REVIVE=0 MODULE_GAIN_HONOR_GUARD=0 MODULE_ARAC=0 MODULE_ELUNA=1 +# Enables AzerothCore Lua Engine (mod-ale) for Lua scripting # Requires optional SQL/DBC patches; leave off by default MODULE_TIME_IS_TIME=0 # Requires in-game NPC placement/config; leave off by default @@ -204,6 +205,14 @@ AUTO_REBUILD_ON_DEPLOY=0 # Default AzerothCore source checkout used for module rebuilds MODULES_REBUILD_SOURCE_PATH=${STORAGE_PATH_LOCAL}/source/azerothcore +# ===================== +# Source repositories +# ===================== +ACORE_REPO_STANDARD=https://github.com/azerothcore/azerothcore-wotlk.git +ACORE_BRANCH_STANDARD=master +ACORE_REPO_PLAYERBOTS=https://github.com/mod-playerbots/azerothcore-wotlk.git +ACORE_BRANCH_PLAYERBOTS=Playerbot + # ===================== # Eluna runtime (worldserver.conf overrides) # ===================== @@ -248,4 +257,4 @@ PMA_MEMORY_LIMIT=512M PMA_MAX_EXECUTION_TIME=600 KEIRA3_EXTERNAL_PORT=4201 KEIRA_DATABASE_HOST=ac-mysql -KEIRA_DATABASE_PORT=3306 \ No newline at end of file +KEIRA_DATABASE_PORT=3306 diff --git a/build.sh b/build.sh index d5f3dd1..639dcb5 100755 --- a/build.sh +++ b/build.sh @@ -85,10 +85,10 @@ COMPILE_MODULE_VARS=( MODULE_AOE_LOOT MODULE_LEARN_SPELLS MODULE_FIREWORKS MODULE_INDIVIDUAL_PROGRESSION MODULE_AHBOT MODULE_AUTOBALANCE MODULE_TRANSMOG MODULE_NPC_BUFFER MODULE_DYNAMIC_XP MODULE_SOLO_LFG MODULE_1V1_ARENA MODULE_PHASED_DUELS MODULE_BREAKING_NEWS MODULE_BOSS_ANNOUNCER MODULE_ACCOUNT_ACHIEVEMENTS MODULE_AUTO_REVIVE MODULE_GAIN_HONOR_GUARD - MODULE_TIME_IS_TIME MODULE_POCKET_PORTAL MODULE_RANDOM_ENCHANTS MODULE_SOLOCRAFT MODULE_PVP_TITLES MODULE_NPC_BEASTMASTER + MODULE_ELUNA MODULE_TIME_IS_TIME MODULE_POCKET_PORTAL MODULE_RANDOM_ENCHANTS MODULE_SOLOCRAFT MODULE_PVP_TITLES MODULE_NPC_BEASTMASTER MODULE_NPC_ENCHANTER MODULE_INSTANCE_RESET MODULE_LEVEL_GRANT MODULE_ARAC MODULE_ASSISTANT MODULE_REAGENT_BANK - MODULE_CHALLENGE_MODES MODULE_OLLAMA_CHAT MODULE_PLAYER_BOT_LEVEL_BRACKETS MODULE_STATBOOSTER MODULE_DUNGEON_RESPAWN - MODULE_SKELETON_MODULE MODULE_BG_SLAVERYVALLEY MODULE_AZEROTHSHARD MODULE_WORGOBLIN + MODULE_BLACK_MARKET_AUCTION_HOUSE MODULE_CHALLENGE_MODES MODULE_OLLAMA_CHAT MODULE_PLAYER_BOT_LEVEL_BRACKETS MODULE_STATBOOSTER MODULE_DUNGEON_RESPAWN + MODULE_SKELETON_MODULE MODULE_BG_SLAVERYVALLEY MODULE_AZEROTHSHARD MODULE_WORGOBLIN MODULE_ELUNA_TS ) requires_playerbot_source(){ @@ -354,7 +354,9 @@ stage_modules(){ local module_export_var for module_export_var in "${module_vars[@]}"; do - export "$module_export_var" + local module_value + module_value="$(read_env "$module_export_var" "0")" + export "${module_export_var}=${module_value:-0}" done local staging_modules_dir="${storage_path}/modules" @@ -391,27 +393,28 @@ stage_modules(){ rm -f "$staging_modules_dir/.modules_state" "$staging_modules_dir/.requires_rebuild" 2>/dev/null || true fi - if (cd "$local_modules_dir" && bash "$ROOT_DIR/scripts/manage-modules.sh"); then - ok "Module repositories staged to $local_modules_dir" - if [ -n "$staging_modules_dir" ]; then - if command -v rsync >/dev/null 2>&1; then - rsync -a --delete \ - --exclude '.modules_state' \ - --exclude '.requires_rebuild' \ - "$local_modules_dir"/ "$staging_modules_dir"/ - else - find "$staging_modules_dir" -mindepth 1 -maxdepth 1 \ - ! -name '.modules_state' \ - ! -name '.requires_rebuild' \ - -exec rm -rf {} + 2>/dev/null || true - (cd "$local_modules_dir" && tar cf - --exclude='.modules_state' --exclude='.requires_rebuild' .) | (cd "$staging_modules_dir" && tar xf -) - fi - if [ -f "$local_modules_dir/.modules_state" ]; then - cp "$local_modules_dir/.modules_state" "$staging_modules_dir/.modules_state" 2>/dev/null || true - fi + if ! (cd "$local_modules_dir" && bash "$ROOT_DIR/scripts/manage-modules.sh"); then + err "Module staging failed; aborting build" + return 1 + fi + + ok "Module repositories staged to $local_modules_dir" + if [ -n "$staging_modules_dir" ]; then + if command -v rsync >/dev/null 2>&1; then + rsync -a --delete \ + --exclude '.modules_state' \ + --exclude '.requires_rebuild' \ + "$local_modules_dir"/ "$staging_modules_dir"/ + else + find "$staging_modules_dir" -mindepth 1 -maxdepth 1 \ + ! -name '.modules_state' \ + ! -name '.requires_rebuild' \ + -exec rm -rf {} + 2>/dev/null || true + (cd "$local_modules_dir" && tar cf - --exclude='.modules_state' --exclude='.requires_rebuild' .) | (cd "$staging_modules_dir" && tar xf -) + fi + if [ -f "$local_modules_dir/.modules_state" ]; then + cp "$local_modules_dir/.modules_state" "$staging_modules_dir/.modules_state" 2>/dev/null || true fi - else - warn "Module staging encountered issues, but continuing with build" fi # Cleanup diff --git a/scripts/auto-post-install.sh b/scripts/auto-post-install.sh index c196d30..8e6e1f3 100755 --- a/scripts/auto-post-install.sh +++ b/scripts/auto-post-install.sh @@ -116,6 +116,21 @@ else echo " ✅ Created $created_count module configuration files" + # Ensure module configuration files exist under modules directory + MODULES_DIR="$CONFIG_DIR/modules" + if [ -d "$MODULES_DIR" ]; then + echo "" + echo " 🔧 Creating module configs in modules/..." + for file in "$MODULES_DIR"/*.conf.dist; do + [ -f "$file" ] || continue + target="${file%.dist}" + if [ ! -f "$target" ]; then + echo " 📝 Creating $(basename "$target") from $(basename "$file")" + cp "$file" "$target" + fi + done + fi + # Step 2: Update configuration files echo "" echo "🔧 Step 2: Updating configuration files..." @@ -130,6 +145,24 @@ else update_playerbots_conf /azerothcore/config/modules/playerbots.conf update_playerbots_conf /azerothcore/config/modules/playerbots.conf.dist + ensure_config_key(){ + local file="$1" + local key="$2" + local value="$3" + if [ ! -f "$file" ]; then + return + fi + if grep -qE "^[[:space:]]*${key}[[:space:]]*=" "$file"; then + return + fi + echo " ➕ Adding ${key} to $(basename "$file")" + printf '\n%s = %s\n' "$key" "$value" >> "$file" + } + + ensure_config_key /azerothcore/config/worldserver.conf "Account.Achievements.Excluded" "\"\"" + ensure_config_key /azerothcore/config/worldserver.conf "Playerbots.Updates.EnableDatabases" "1" + ensure_config_key /azerothcore/config/worldserver.conf "PlayerbotsDatabaseInfo" "\"${MYSQL_HOST};${MYSQL_PORT};${MYSQL_USER};${MYSQL_ROOT_PASSWORD};${DB_PLAYERBOTS_NAME}\"" + echo "✅ Configuration files updated" # Step 3: Update realmlist table diff --git a/scripts/manage-modules-sql.sh b/scripts/manage-modules-sql.sh index 904c079..fd0189d 100755 --- a/scripts/manage-modules-sql.sh +++ b/scripts/manage-modules-sql.sh @@ -144,131 +144,72 @@ execute_module_sql_scripts() { apk add --no-cache mariadb-client >/dev/null 2>&1 || echo "Warning: Could not install MariaDB client" } - # Execute SQL for enabled modules only - if [ "$MODULE_PLAYERBOTS" = "1" ] && [ -d "mod-playerbots" ]; then - execute_module_sql "mod-playerbots" "Playerbots" - fi + # Iterate modules from staging directory to catch new modules automatically + for module_dir in */; do + [[ -d "$module_dir" ]] || continue + [[ "$module_dir" == "." || "$module_dir" == ".." ]] && continue + module_dir="${module_dir%/}" + # Only process directories that follow mod-* convention or known module names + if [[ "$module_dir" != mod-* && "$module_dir" != StatBooster && "$module_dir" != DungeonRespawn && "$module_dir" != eluna-ts ]]; then + continue + fi - if [ "$MODULE_AOE_LOOT" = "1" ] && [ -d "mod-aoe-loot" ]; then - execute_module_sql "mod-aoe-loot" "AoE Loot" - fi + local enabled=0 + case "$module_dir" in + mod-playerbots) enabled="$MODULE_PLAYERBOTS" ;; + mod-aoe-loot) enabled="$MODULE_AOE_LOOT" ;; + mod-learn-spells) enabled="$MODULE_LEARN_SPELLS" ;; + mod-fireworks-on-level) enabled="$MODULE_FIREWORKS" ;; + mod-individual-progression) enabled="$MODULE_INDIVIDUAL_PROGRESSION" ;; + mod-ahbot) enabled="$MODULE_AHBOT" ;; + mod-autobalance) enabled="$MODULE_AUTOBALANCE" ;; + mod-transmog) enabled="$MODULE_TRANSMOG" ;; + mod-npc-buffer) enabled="$MODULE_NPC_BUFFER" ;; + mod-dynamic-xp) enabled="$MODULE_DYNAMIC_XP" ;; + mod-solo-lfg) enabled="$MODULE_SOLO_LFG" ;; + mod-1v1-arena) enabled="$MODULE_1V1_ARENA" ;; + mod-phased-duels) enabled="$MODULE_PHASED_DUELS" ;; + mod-breaking-news-override) enabled="$MODULE_BREAKING_NEWS" ;; + mod-boss-announcer) enabled="$MODULE_BOSS_ANNOUNCER" ;; + mod-account-achievements) enabled="$MODULE_ACCOUNT_ACHIEVEMENTS" ;; + mod-auto-revive) enabled="$MODULE_AUTO_REVIVE" ;; + mod-gain-honor-guard) enabled="$MODULE_GAIN_HONOR_GUARD" ;; + mod-ale) enabled="$MODULE_ELUNA" ;; + mod-TimeIsTime) enabled="$MODULE_TIME_IS_TIME" ;; + mod-pocket-portal) enabled="$MODULE_POCKET_PORTAL" ;; + mod-random-enchants) enabled="$MODULE_RANDOM_ENCHANTS" ;; + mod-solocraft) enabled="$MODULE_SOLOCRAFT" ;; + mod-pvp-titles) enabled="$MODULE_PVP_TITLES" ;; + mod-npc-beastmaster) enabled="$MODULE_NPC_BEASTMASTER" ;; + mod-npc-enchanter) enabled="$MODULE_NPC_ENCHANTER" ;; + mod-instance-reset) enabled="$MODULE_INSTANCE_RESET" ;; + mod-quest-count-level) enabled="$MODULE_LEVEL_GRANT" ;; + mod-arac) enabled="$MODULE_ARAC" ;; + mod-assistant) enabled="$MODULE_ASSISTANT" ;; + mod-reagent-bank) enabled="$MODULE_REAGENT_BANK" ;; + mod-black-market) enabled="$MODULE_BLACK_MARKET_AUCTION_HOUSE" ;; + mod-challenge-modes) enabled="$MODULE_CHALLENGE_MODES" ;; + mod-ollama-chat) enabled="$MODULE_OLLAMA_CHAT" ;; + mod-player-bot-level-brackets) enabled="$MODULE_PLAYER_BOT_LEVEL_BRACKETS" ;; + StatBooster) enabled="$MODULE_STATBOOSTER" ;; + DungeonRespawn) enabled="$MODULE_DUNGEON_RESPAWN" ;; + skeleton-module) enabled="$MODULE_SKELETON_MODULE" ;; + mod-bg-slaveryvalley) enabled="$MODULE_BG_SLAVERYVALLEY" ;; + mod-azerothshard) enabled="$MODULE_AZEROTHSHARD" ;; + mod-worgoblin) enabled="$MODULE_WORGOBLIN" ;; + eluna-ts) enabled="$MODULE_ELUNA_TS" ;; + *) enabled=1 ;; # Default to enabled for unknown module directories + esac - if [ "$MODULE_LEARN_SPELLS" = "1" ] && [ -d "mod-learn-spells" ]; then - execute_module_sql "mod-learn-spells" "Learn Spells" - fi - - if [ "$MODULE_FIREWORKS" = "1" ] && [ -d "mod-fireworks-on-level" ]; then - execute_module_sql "mod-fireworks-on-level" "Fireworks" - fi - - if [ "$MODULE_INDIVIDUAL_PROGRESSION" = "1" ] && [ -d "mod-individual-progression" ]; then - execute_module_sql "mod-individual-progression" "Individual Progression" - fi - - if [ "$MODULE_AHBOT" = "1" ] && [ -d "mod-ahbot" ]; then - execute_module_sql "mod-ahbot" "AHBot" - fi - - if [ "$MODULE_AUTOBALANCE" = "1" ] && [ -d "mod-autobalance" ]; then - execute_module_sql "mod-autobalance" "AutoBalance" - fi - - if [ "$MODULE_TRANSMOG" = "1" ] && [ -d "mod-transmog" ]; then - execute_module_sql "mod-transmog" "Transmog" - fi - - if [ "$MODULE_NPC_BUFFER" = "1" ] && [ -d "mod-npc-buffer" ]; then - execute_module_sql "mod-npc-buffer" "NPC Buffer" - fi - - if [ "$MODULE_DYNAMIC_XP" = "1" ] && [ -d "mod-dynamic-xp" ]; then - execute_module_sql "mod-dynamic-xp" "Dynamic XP" - fi - - if [ "$MODULE_SOLO_LFG" = "1" ] && [ -d "mod-solo-lfg" ]; then - execute_module_sql "mod-solo-lfg" "Solo LFG" - fi - - if [ "$MODULE_1V1_ARENA" = "1" ] && [ -d "mod-1v1-arena" ]; then - execute_module_sql "mod-1v1-arena" "1v1 Arena" - fi - - if [ "$MODULE_PHASED_DUELS" = "1" ] && [ -d "mod-phased-duels" ]; then - execute_module_sql "mod-phased-duels" "Phased Duels" - fi - - if [ "$MODULE_BREAKING_NEWS" = "1" ] && [ -d "mod-breaking-news-override" ]; then - execute_module_sql "mod-breaking-news-override" "Breaking News" - fi - - if [ "$MODULE_BOSS_ANNOUNCER" = "1" ] && [ -d "mod-boss-announcer" ]; then - execute_module_sql "mod-boss-announcer" "Boss Announcer" - fi - - if [ "$MODULE_ACCOUNT_ACHIEVEMENTS" = "1" ] && [ -d "mod-account-achievements" ]; then - execute_module_sql "mod-account-achievements" "Account Achievements" - fi - - if [ "$MODULE_AUTO_REVIVE" = "1" ] && [ -d "mod-auto-revive" ]; then - execute_module_sql "mod-auto-revive" "Auto Revive" - fi - - if [ "$MODULE_GAIN_HONOR_GUARD" = "1" ] && [ -d "mod-gain-honor-guard" ]; then - execute_module_sql "mod-gain-honor-guard" "Gain Honor Guard" - fi - - if [ "$MODULE_ELUNA" = "1" ] && [ -d "mod-eluna" ]; then - execute_module_sql "mod-eluna" "Eluna" - fi - if [ "$MODULE_ARAC" = "1" ] && [ -d "mod-arac" ]; then - execute_module_sql "mod-arac" "All Races All Classes" - fi - - if [ "$MODULE_TIME_IS_TIME" = "1" ] && [ -d "mod-TimeIsTime" ]; then - execute_module_sql "mod-TimeIsTime" "Time Is Time" - fi - - if [ "$MODULE_POCKET_PORTAL" = "1" ]; then - echo 'âš ī¸ Skipping mod-pocket-portal SQL: module disabled until C++20 patch is applied.' - MODULE_POCKET_PORTAL=0 - fi - - if [ "$MODULE_RANDOM_ENCHANTS" = "1" ] && [ -d "mod-random-enchants" ]; then - execute_module_sql "mod-random-enchants" "Random Enchants" - fi - - if [ "$MODULE_SOLOCRAFT" = "1" ] && [ -d "mod-solocraft" ]; then - execute_module_sql "mod-solocraft" "Solocraft" - fi - - if [ "$MODULE_PVP_TITLES" = "1" ] && [ -d "mod-pvp-titles" ]; then - execute_module_sql "mod-pvp-titles" "PvP Titles" - fi - - if [ "$MODULE_NPC_BEASTMASTER" = "1" ] && [ -d "mod-npc-beastmaster" ]; then - execute_module_sql "mod-npc-beastmaster" "NPC Beastmaster" - fi - - if [ "$MODULE_NPC_ENCHANTER" = "1" ] && [ -d "mod-npc-enchanter" ]; then - execute_module_sql "mod-npc-enchanter" "NPC Enchanter" - fi - - if [ "$MODULE_INSTANCE_RESET" = "1" ] && [ -d "mod-instance-reset" ]; then - execute_module_sql "mod-instance-reset" "Instance Reset" - fi - - if [ "$MODULE_LEVEL_GRANT" = "1" ] && [ -d "mod-quest-count-level" ]; then - execute_module_sql "mod-quest-count-level" "Level Grant" - fi - if [ "$MODULE_ASSISTANT" = "1" ] && [ -d "mod-assistant" ]; then - execute_module_sql "mod-assistant" "Assistant" - fi - if [ "$MODULE_REAGENT_BANK" = "1" ] && [ -d "mod-reagent-bank" ]; then - execute_module_sql "mod-reagent-bank" "Reagent Bank" - fi - if [ "$MODULE_BLACK_MARKET_AUCTION_HOUSE" = "1" ] && [ -d "mod-black-market" ]; then - execute_module_sql "mod-black-market" "Black Market" - fi + if [ "${enabled:-0}" = "1" ]; then + # Skip modules explicitly disabled for SQL + if [ "$module_dir" = "mod-pocket-portal" ]; then + echo 'âš ī¸ Skipping mod-pocket-portal SQL: module disabled until C++20 patch is applied.' + continue + fi + execute_module_sql "$module_dir" "$module_dir" + fi + done run_custom_sql_group world "${DB_WORLD_NAME}" "custom world SQL" run_custom_sql_group auth "${DB_AUTH_NAME}" "custom auth SQL" diff --git a/scripts/manage-modules.sh b/scripts/manage-modules.sh index 03ddffd..235a395 100755 --- a/scripts/manage-modules.sh +++ b/scripts/manage-modules.sh @@ -2,6 +2,9 @@ # ac-compose set -e +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" + echo 'Setting up git user' git config --global user.name "${GIT_USERNAME:-ac-compose}" git config --global user.email "${GIT_EMAIL:-noreply@azerothcore.org}" @@ -101,8 +104,12 @@ if [ "$MODULE_GAIN_HONOR_GUARD" != "1" ] && [ -d "mod-gain-honor-guard" ]; then rm -rf mod-gain-honor-guard fi -if [ "$MODULE_ELUNA" != "1" ] && [ -d "mod-eluna" ]; then - echo 'Removing mod-eluna (disabled)...' +if [ "$MODULE_ELUNA" != "1" ] && [ -d "mod-ale" ]; then + echo 'Removing mod-ale (disabled)...' + rm -rf mod-ale +fi +if [ "$MODULE_ELUNA" = "1" ] && [ -d "mod-eluna" ]; then + echo 'Removing legacy mod-eluna directory (superseded by mod-ale)...' rm -rf mod-eluna fi if [ "$MODULE_ARAC" != "1" ] && [ -d "mod-arac" ]; then @@ -366,13 +373,27 @@ if [ "$MODULE_GAIN_HONOR_GUARD" = "1" ] && [ ! -d "mod-gain-honor-guard" ]; then git clone https://github.com/azerothcore/mod-gain-honor-guard.git mod-gain-honor-guard fi -if [ "$MODULE_ELUNA" = "1" ] && [ ! -d "mod-eluna" ]; then - echo 'đŸ–Ĩī¸ Installing mod-eluna...' - echo ' 📖 Project: https://github.com/azerothcore/mod-eluna' - echo ' â„šī¸ Lua scripting engine for custom server functionality' +if [ "$MODULE_ELUNA" = "1" ] && [ ! -d "mod-ale" ]; then + echo 'đŸ–Ĩī¸ Installing mod-ale (AzerothCore Lua Engine)...' + echo ' 📖 Project: https://github.com/azerothcore/mod-ale' + echo ' â„šī¸ Next-generation Lua scripting engine for AzerothCore' echo ' 🔧 REBUILD REQUIRED: Container must be rebuilt with source-based compilation' - git clone https://github.com/azerothcore/mod-eluna.git mod-eluna + git clone https://github.com/azerothcore/mod-ale.git mod-ale fi + +if [ -d "mod-ale" ]; then + creature_methods_file="mod-ale/src/LuaEngine/methods/CreatureMethods.h" + if grep -q 'MoveWaypoint(creature->GetWaypointPath(), true);' "$creature_methods_file" 2>/dev/null; then + if sed -i 's/MoveWaypoint(creature->GetWaypointPath(), true);/MovePath(creature->GetWaypointPath(), true);/' "$creature_methods_file"; then + echo ' ✅ Applied mod-ale MovePath compatibility fix (upstream issue #336)' + else + echo ' âš ī¸ Failed to adjust mod-ale MoveWaypoint call' + fi + else + echo ' â„šī¸ mod-ale MovePath compatibility fix already present' + fi +fi + if [ "$MODULE_ARAC" = "1" ] && [ ! -d "mod-arac" ]; then echo '🌈 Installing mod-arac...' echo ' 📖 Project: https://github.com/heyitsbench/mod-arac' @@ -447,18 +468,31 @@ if [ "$MODULE_BLACK_MARKET_AUCTION_HOUSE" = "1" ] && [ ! -d "mod-black-market" ] echo ' 📖 Project: https://github.com/Youpeoples/Black-Market-Auction-House' echo ' â„šī¸ MoP Black Market Auction House backported using Eluna Lua engine' echo ' âš ī¸ SPECIAL MODULE: Uses Lua scripts, not C++ compilation' - echo ' 🔧 REQUIRES: mod-eluna must be enabled and functional' + echo ' 🔧 REQUIRES: mod-ale must be enabled and functional' git clone https://github.com/Youpeoples/Black-Market-Auction-House.git mod-black-market # Special handling: Copy Lua scripts to lua_scripts directory if [ "$MODULE_ELUNA" = "1" ] && [ -d "mod-black-market/Server Files/lua_scripts" ]; then - echo ' 🔧 Integrating Black Market Lua scripts with mod-eluna...' - mkdir -p /azerothcore/lua_scripts - cp -r mod-black-market/Server\ Files/lua_scripts/* /azerothcore/lua_scripts/ 2>/dev/null || true - echo ' ✅ Black Market Lua scripts copied to /azerothcore/lua_scripts directory' - ls -la /azerothcore/lua_scripts/ | grep -E "\.lua$" || echo " â„šī¸ No .lua files found after copy" + echo ' 🔧 Integrating Black Market Lua scripts with mod-ale...' + if mkdir -p /azerothcore/lua_scripts 2>/dev/null; then + if cp -r "mod-black-market/Server Files/lua_scripts/." /azerothcore/lua_scripts/ 2>/dev/null; then + echo ' ✅ Black Market Lua scripts copied to /azerothcore/lua_scripts directory' + ls -la /azerothcore/lua_scripts/ | grep -E "\.lua$" || echo " â„šī¸ No .lua files found after copy" + else + echo ' âš ī¸ WARNING: Failed to copy Lua scripts into /azerothcore/lua_scripts; continuing' + fi + elif [ -n "${MODULES_HOST_DIR:-}" ]; then + host_lua_dir="${MODULES_HOST_DIR%/}/lua_scripts" + if mkdir -p "$host_lua_dir" && cp -r "mod-black-market/Server Files/lua_scripts/." "$host_lua_dir/" 2>/dev/null; then + echo " ✅ Black Market Lua scripts staged to $host_lua_dir" + else + echo " âš ī¸ WARNING: Unable to stage Lua scripts to $host_lua_dir; continuing" + fi + else + echo ' âš ī¸ WARNING: No writable target for Lua scripts; continuing without copy' + fi else - echo ' âš ī¸ WARNING: mod-eluna not enabled - Black Market will not function' + echo ' âš ī¸ WARNING: mod-ale not enabled - Black Market will not function' fi fi @@ -687,6 +721,20 @@ for module_dir in mod-*; do fi done +# Populate module-specific configuration directory (/etc/modules) +MODULES_CONF_DIR="/azerothcore/env/dist/etc/modules" +mkdir -p "$MODULES_CONF_DIR" +rm -f "$MODULES_CONF_DIR"/*.conf "$MODULES_CONF_DIR"/*.conf.dist 2>/dev/null || true +for module_dir in mod-*; do + [ -d "$module_dir" ] || continue + while IFS= read -r conf_file; do + [ -n "$conf_file" ] || continue + base_name="$(basename "$conf_file")" + dest_name="${base_name%.dist}" + cp "$conf_file" "$MODULES_CONF_DIR/$dest_name" + done < <(find "$module_dir" -path "*/conf/*" -type f \( -name "*.conf" -o -name "*.conf.dist" \) 2>/dev/null) +done + if [ "$MODULE_AUTOBALANCE" = "1" ]; then if [ -f "/azerothcore/env/dist/etc/AutoBalance.conf.dist" ]; then sed -i 's/^AutoBalance\.LevelScaling\.EndGameBoost.*/AutoBalance.LevelScaling.EndGameBoost = false # disabled pending proper implementation/' \ @@ -772,7 +820,7 @@ ENABLED_MODULES="" [ "$MODULE_ACCOUNT_ACHIEVEMENTS" = "1" ] && ENABLED_MODULES="$ENABLED_MODULES mod-account-achievements" [ "$MODULE_AUTO_REVIVE" = "1" ] && ENABLED_MODULES="$ENABLED_MODULES mod-auto-revive" [ "$MODULE_GAIN_HONOR_GUARD" = "1" ] && ENABLED_MODULES="$ENABLED_MODULES mod-gain-honor-guard" -[ "$MODULE_ELUNA" = "1" ] && ENABLED_MODULES="$ENABLED_MODULES mod-eluna" +[ "$MODULE_ELUNA" = "1" ] && ENABLED_MODULES="$ENABLED_MODULES mod-ale" [ "$MODULE_TIME_IS_TIME" = "1" ] && ENABLED_MODULES="$ENABLED_MODULES mod-time-is-time" [ "$MODULE_RANDOM_ENCHANTS" = "1" ] && ENABLED_MODULES="$ENABLED_MODULES mod-random-enchants" [ "$MODULE_SOLOCRAFT" = "1" ] && ENABLED_MODULES="$ENABLED_MODULES mod-solocraft" diff --git a/scripts/rebuild-with-modules.sh b/scripts/rebuild-with-modules.sh index df9f7df..849baa7 100755 --- a/scripts/rebuild-with-modules.sh +++ b/scripts/rebuild-with-modules.sh @@ -88,10 +88,10 @@ COMPILE_MODULE_KEYS=( MODULE_AOE_LOOT MODULE_LEARN_SPELLS MODULE_FIREWORKS MODULE_INDIVIDUAL_PROGRESSION MODULE_AHBOT MODULE_AUTOBALANCE MODULE_TRANSMOG MODULE_NPC_BUFFER MODULE_DYNAMIC_XP MODULE_SOLO_LFG MODULE_1V1_ARENA MODULE_PHASED_DUELS MODULE_BREAKING_NEWS MODULE_BOSS_ANNOUNCER MODULE_ACCOUNT_ACHIEVEMENTS MODULE_AUTO_REVIVE MODULE_GAIN_HONOR_GUARD - MODULE_TIME_IS_TIME MODULE_POCKET_PORTAL MODULE_RANDOM_ENCHANTS MODULE_SOLOCRAFT MODULE_PVP_TITLES MODULE_NPC_BEASTMASTER + MODULE_ELUNA MODULE_TIME_IS_TIME MODULE_POCKET_PORTAL MODULE_RANDOM_ENCHANTS MODULE_SOLOCRAFT MODULE_PVP_TITLES MODULE_NPC_BEASTMASTER MODULE_NPC_ENCHANTER MODULE_INSTANCE_RESET MODULE_LEVEL_GRANT MODULE_ARAC MODULE_ASSISTANT MODULE_REAGENT_BANK - MODULE_CHALLENGE_MODES MODULE_OLLAMA_CHAT MODULE_PLAYER_BOT_LEVEL_BRACKETS MODULE_STATBOOSTER MODULE_DUNGEON_RESPAWN - MODULE_SKELETON_MODULE MODULE_BG_SLAVERYVALLEY MODULE_AZEROTHSHARD MODULE_WORGOBLIN + MODULE_BLACK_MARKET_AUCTION_HOUSE MODULE_CHALLENGE_MODES MODULE_OLLAMA_CHAT MODULE_PLAYER_BOT_LEVEL_BRACKETS MODULE_STATBOOSTER MODULE_DUNGEON_RESPAWN + MODULE_SKELETON_MODULE MODULE_BG_SLAVERYVALLEY MODULE_AZEROTHSHARD MODULE_WORGOBLIN MODULE_ELUNA_TS ) modules_require_playerbot_source(){ @@ -170,14 +170,15 @@ REBUILD_SOURCE_PATH="$(realpath "$REBUILD_SOURCE_PATH" 2>/dev/null || echo "$REB LOCAL_MODULES_DIR="$REBUILD_SOURCE_PATH/modules" LOCAL_STAGING_MODULES_DIR="$LOCAL_STORAGE_PATH/modules" -if [ -d "$LOCAL_MODULES_DIR" ]; then - echo "🔧 Using modules from source directory: $LOCAL_MODULES_DIR" - MODULES_DIR="$LOCAL_MODULES_DIR" - # Build sentinel always stays in local storage for consistency -else +if [ -d "$LOCAL_STAGING_MODULES_DIR" ] && [ "$(ls -A "$LOCAL_STAGING_MODULES_DIR" 2>/dev/null)" ]; then echo "🔧 Using modules from local staging: $LOCAL_STAGING_MODULES_DIR" MODULES_DIR="$LOCAL_STAGING_MODULES_DIR" - # Build sentinel always stays in local storage for consistency +elif [ -d "$LOCAL_MODULES_DIR" ]; then + echo "🔧 Using modules from source directory: $LOCAL_MODULES_DIR" + MODULES_DIR="$LOCAL_MODULES_DIR" +else + echo "âš ī¸ No local module staging detected; falling back to source directory $LOCAL_MODULES_DIR" + MODULES_DIR="$LOCAL_MODULES_DIR" fi SOURCE_COMPOSE="$REBUILD_SOURCE_PATH/docker-compose.yml" @@ -208,6 +209,7 @@ declare -A MODULE_REPO_MAP=( [MODULE_ACCOUNT_ACHIEVEMENTS]=mod-account-achievements [MODULE_AUTO_REVIVE]=mod-auto-revive [MODULE_GAIN_HONOR_GUARD]=mod-gain-honor-guard + [MODULE_ELUNA]=mod-ale [MODULE_TIME_IS_TIME]=mod-TimeIsTime [MODULE_POCKET_PORTAL]=mod-pocket-portal [MODULE_RANDOM_ENCHANTS]=mod-random-enchants @@ -220,6 +222,7 @@ declare -A MODULE_REPO_MAP=( [MODULE_ARAC]=mod-arac [MODULE_ASSISTANT]=mod-assistant [MODULE_REAGENT_BANK]=mod-reagent-bank + [MODULE_BLACK_MARKET_AUCTION_HOUSE]=mod-black-market [MODULE_CHALLENGE_MODES]=mod-challenge-modes [MODULE_OLLAMA_CHAT]=mod-ollama-chat [MODULE_PLAYER_BOT_LEVEL_BRACKETS]=mod-player-bot-level-brackets @@ -229,6 +232,7 @@ declare -A MODULE_REPO_MAP=( [MODULE_BG_SLAVERYVALLEY]=mod-bg-slaveryvalley [MODULE_AZEROTHSHARD]=mod-azerothshard [MODULE_WORGOBLIN]=mod-worgoblin + [MODULE_ELUNA_TS]=eluna-ts ) compile_modules=() diff --git a/scripts/sql/custom/characters/2025_10_XX_fix_playerbot_arena.sql b/scripts/sql/custom/characters/2025_10_XX_fix_playerbot_arena.sql new file mode 100644 index 0000000..27d7e85 --- /dev/null +++ b/scripts/sql/custom/characters/2025_10_XX_fix_playerbot_arena.sql @@ -0,0 +1,36 @@ +DELETE FROM arena_team_member +WHERE guid IN ( + SELECT guid + FROM arena_team_member atm + JOIN arena_team ate ON atm.arenaTeamId = ate.arenaTeamId + JOIN characters c ON c.guid = atm.guid + WHERE ate.type = 5 + AND c.deleteInfos_Account IS NULL + AND c.name IN ( + SELECT p.name + FROM playerbots p + WHERE p.bot = 1 + ) + AND EXISTS ( + SELECT 1 + FROM arena_team_member atm2 + JOIN characters c2 ON atm2.guid = c2.guid + WHERE atm2.arenaTeamId = atm.arenaTeamId + AND c2.deleteInfos_Account IS NULL + AND c2.guid != c.guid + ) +); + +DELETE atm +FROM arena_team_member atm +JOIN characters c ON c.guid = atm.guid +WHERE atm.guid IN ( + SELECT guid + FROM ( + SELECT guid, COUNT(*) AS cnt + FROM arena_team_member + GROUP BY guid + HAVING cnt > 1 + ) dup +) +AND c.deleteInfos_Account IS NULL;