diff --git a/data/sql/updates/db_world/2023_08_08_00.sql b/data/sql/updates/db_world/2023_08_08_00.sql new file mode 100644 index 000000000..bb8c9fa13 --- /dev/null +++ b/data/sql/updates/db_world/2023_08_08_00.sql @@ -0,0 +1,3 @@ +-- DB update 2023_08_07_00 -> 2023_08_08_00 +-- +UPDATE `creature_template` SET `mechanic_immune_mask`=`mechanic_immune_mask`|4|33554432 WHERE `entry` = 18168; diff --git a/data/sql/updates/db_world/2023_08_09_00.sql b/data/sql/updates/db_world/2023_08_09_00.sql new file mode 100644 index 000000000..a70365d11 --- /dev/null +++ b/data/sql/updates/db_world/2023_08_09_00.sql @@ -0,0 +1,5 @@ +-- DB update 2023_08_08_00 -> 2023_08_09_00 +-- +UPDATE `quest_template_addon` SET `RequiredMaxRepFaction` = 0, `RequiredMaxRepValue` = 0 WHERE `ID` IN (10106, 10110); +UPDATE `quest_template_addon` SET `PrevQuestID` = 10143 WHERE (`ID` = 13408); +UPDATE `quest_template_addon` SET `PrevQuestID` = 10124 WHERE (`ID` = 13409); diff --git a/data/sql/updates/db_world/2023_08_09_01.sql b/data/sql/updates/db_world/2023_08_09_01.sql new file mode 100644 index 000000000..1127b9094 --- /dev/null +++ b/data/sql/updates/db_world/2023_08_09_01.sql @@ -0,0 +1,3 @@ +-- DB update 2023_08_09_00 -> 2023_08_09_01 +-- +UPDATE `creature_template` SET `mechanic_immune_mask`=`mechanic_immune_mask`|8388608 WHERE `entry` = 19261; diff --git a/data/sql/updates/db_world/2023_08_09_02.sql b/data/sql/updates/db_world/2023_08_09_02.sql new file mode 100644 index 000000000..71aba8584 --- /dev/null +++ b/data/sql/updates/db_world/2023_08_09_02.sql @@ -0,0 +1,14 @@ +-- DB update 2023_08_09_01 -> 2023_08_09_02 +-- +-- Add acore_strings for arena queue announcer with less detail about the teams +DELETE FROM `acore_string` WHERE `entry` IN (773, 774, 775, 776, 777, 778); +INSERT INTO `acore_string` (`entry`, `content_default`, `locale_frFR`, `locale_deDE`, `locale_zhCN`) VALUES +(773, '|cffff0000[Arena Queue Announcer]:|r %s -- Joined : %ux%u|r', '|cffff0000[Annonce File d''Attente Arène]:|r %s -- Rejoint : %ux%u|r', '|cffff0000[BG Ansager für Warteschlange]:|r %s -- beigetreten : %ux%u|r', '|cffff0000[竞技场列队公告]:|r %s -- 加入 : %ux%u|r'), +(774, '|cffff0000[Arena Queue Announcer]:|r %s -- Exited : %ux%u|r', '|cffff0000[Annonce File d''Attente Arène]:|r %s -- Quitté : %ux%u|r', '|cffff0000[BG Ansager für Warteschlange]:|r %s -- verlassen : %ux%u|r', '|cffff0000[竞技场列队公告]:|r %s -- 退出 : %ux%u|r'), +(775, '|cffff0000[Arena Queue Announcer]:|r Joined : %ux%u : %u|r', '|cffff0000[Annonce File d''Attente Arène]:|r Rejoint : %ux%u : %u|r', '|cffff0000[BG Ansager für Warteschlange]:|r beigetreten : %ux%u : %u|r', '|cffff0000[竞技场列队公告]:|r 加入 : %ux%u : %u|r'), +(776, '|cffff0000[Arena Queue Announcer]:|r Exited : %ux%u : %u|r', '|cffff0000[Annonce File d''Attente Arène]:|r Quitté : %ux%u : %u|r', '|cffff0000[BG Ansager für Warteschlange]:|r verlassen : %ux%u : %u|r', '|cffff0000[竞技场列队公告]:|r 退出 : %ux%u : %u|r'), +(777, '|cffff0000[Arena Queue Announcer]:|r Joined : %ux%u|r', '|cffff0000[Annonce File d''Attente Arène]:|r Rejoint : %ux%u|r', '|cffff0000[BG Ansager für Warteschlange]:|r beigetreten : %ux%u|r', '|cffff0000[竞技场列队公告]:|r 加入 : %ux%u|r'), +(778, '|cffff0000[Arena Queue Announcer]:|r Exited : %ux%u|r', '|cffff0000[Annonce File d''Attente Arène]:|r Quitté : %ux%u|r', '|cffff0000[BG Ansager für Warteschlange]:|r verlassen : %ux%u|r', '|cffff0000[竞技场列队公告]:|r 退出 : %ux%u|r'); + +UPDATE `acore_string` SET `locale_frFR` = '|cffff0000[Annonce File d''Attente Arène]:|r %s -- Rejoint : %ux%u : %u|r' WHERE `entry` = 718; +UPDATE `acore_string` SET `locale_frFR` = '|cffff0000[Annonce File d''Attente Arène]:|r %s -- Quitté : %ux%u : %u|r' WHERE `entry` = 719; diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 75eaca284..13f3bd716 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -948,6 +948,14 @@ MaxArenaPoints = 10000 StartArenaPoints = 0 +# +# Arena.LegacyArenaPoints +# Description: Use arena point calculation from TBC for season 1 - 5 when rating is less or equal to 1500 +# Default: 1 - (Enabled) +# 0 - (Disabled) + +Arena.LegacyArenaPoints = 0 + # # RecruitAFriend.MaxLevel # Description: Highest level up to which a character can benefit from the Recruit-A-Friend @@ -3051,14 +3059,25 @@ Arena.GamesRequired = 10 Arena.QueueAnnouncer.Enable = 0 # -# Battleground.QueueAnnouncer.PlayerOnly -# Description: Battleground queue announcement type. +# Arena.QueueAnnouncer.PlayerOnly +# Description: Arena queue announcement type. # Default: 0 - (System message, Anyone can see it) # 1 - (Private, Only queued players can see it) # Arena.QueueAnnouncer.PlayerOnly = 0 +# +# Arena.QueueAnnouncer.Detail +# Description: The amount of detail to announce on teams queued for arenas. +# Default: 3 - (Announce the team's name and rating) +# 2 - (Announce only the team's name) +# 1 - (Announce only the team's rating) +# 0 - (Do not announce any information about the teams) +# + +Arena.QueueAnnouncer.Detail = 3 + # # Arena.ArenaSeason.ID # Description: Current arena season id shown in clients. diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index d362277f4..03986cb19 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -658,7 +658,7 @@ uint32 ArenaTeam::GetPoints(uint32 memberRating) if (rating <= 1500) { - if (sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID) < 6) + if (sWorld->getIntConfig(CONFIG_ARENA_SEASON_ID) < 6 && !sWorld->getIntConfig(CONFIG_LEGACY_ARENA_POINTS_CALC)) points = (float)rating * 0.22f + 14.0f; else points = 344; diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index dc326d784..f0d4fe2b5 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -1143,7 +1143,22 @@ void BattlegroundQueue::SendJoinMessageArenaQueue(Player* leader, GroupQueueInfo uint32 ArenaTeamRating = ginfo->ArenaTeamRating; std::string TeamName = team->GetName(); - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType, ArenaTeamRating); + uint32 announcementDetail = sWorld->getIntConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_DETAIL); + switch (announcementDetail) + { + case 3: + sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_NAME_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType, ArenaTeamRating); + break; + case 2: + sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_NAME, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType); + break; + case 1: + sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType, ArenaTeamRating); + break; + default: + sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType); + break; + } } } @@ -1168,7 +1183,22 @@ void BattlegroundQueue::SendExitMessageArenaQueue(GroupQueueInfo* ginfo) if (ArenaType && ginfo->Players.empty()) { - sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType, ArenaTeamRating); + uint32 announcementDetail = sWorld->getIntConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_DETAIL); + switch (announcementDetail) + { + case 3: + sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_NAME_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType, ArenaTeamRating); + break; + case 2: + sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_NAME, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, TeamName.c_str(), ArenaType, ArenaType); + break; + case 1: + sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_RATING, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType, ArenaTeamRating); + break; + default: + sWorld->SendWorldTextOptional(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, ANNOUNCER_FLAG_DISABLE_ARENA_QUEUE, ArenaType, ArenaType); + break; + } } } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 7f3fd9e6f..8a29cc2af 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -2480,34 +2480,34 @@ Player* Pet::GetOwner() const float Pet::GetNativeObjectScale() const { - CreatureFamilyEntry const* creatureFamily = sCreatureFamilyStore.LookupEntry(GetCreatureTemplate()->family); - if (creatureFamily && creatureFamily->minScale > 0.0f && getPetType() == HUNTER_PET) - { - float scale; - if (GetLevel() >= creatureFamily->maxScaleLevel) - scale = creatureFamily->maxScale; - else if (GetLevel() <= creatureFamily->minScaleLevel) - scale = creatureFamily->minScale; - else - scale = creatureFamily->minScale + float(GetLevel() - creatureFamily->minScaleLevel) / creatureFamily->maxScaleLevel * (creatureFamily->maxScale - creatureFamily->minScale); + uint8 ctFamily = GetCreatureTemplate()->family; - if (CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId())) - { - if (displayInfo->scale > 1.f && GetCreatureTemplate()->IsExotic()) - { - // Exotic pets have a scale of 1 - scale = 1.0f; - } - else - { - scale *= displayInfo->scale; - } - } + // hackfix: Edge case where DBC scale values for DEVILSAUR pets make them too small. + // Therefore we take data from spirit beast instead. + if (ctFamily && ctFamily == CREATURE_FAMILY_DEVILSAUR) + ctFamily = CREATURE_FAMILY_SPIRIT_BEAST; + + CreatureFamilyEntry const* creatureFamily = sCreatureFamilyStore.LookupEntry(ctFamily); + if (creatureFamily && creatureFamily->minScale > 0.0f && getPetType() & HUNTER_PET) + { + float minScaleLevel = creatureFamily->minScaleLevel; + uint8 level = getLevel(); + + float minLevelScaleMod = level >= minScaleLevel ? (level / minScaleLevel) : 0.0f; + float maxScaleMod = creatureFamily->maxScaleLevel - minScaleLevel; + + if (minLevelScaleMod > maxScaleMod) + minLevelScaleMod = maxScaleMod; + + float scaleMod = creatureFamily->maxScaleLevel != minScaleLevel ? minLevelScaleMod / maxScaleMod : 0.f; + + float scale = (creatureFamily->maxScale - creatureFamily->minScale) * scaleMod + creatureFamily->minScale; return scale; } - // Fallback value if the conditions are not met - return 1.0f; + + // take value for non-hunter pets from DB + return Guardian::GetNativeObjectScale(); } std::string Pet::GenerateActionBarData() const diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 08f548aab..05c04b9b4 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4766,6 +4766,14 @@ void Unit::RemoveAura(AuraApplication* aurApp, AuraRemoveMode mode) { if (aurApp == iter->second) { + // Prevent Arena Preparation aura from being removed by player actions + // It's an invisibility spell so any interaction/spell cast etc. removes it. + // Should only be removed by the arena script, once the match starts. + if (aurApp->GetBase()->HasEffectType(SPELL_AURA_ARENA_PREPARATION)) + { + return; + } + RemoveAura(iter, mode); return; } diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 8f314fa38..0ac55cbf4 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -666,8 +666,8 @@ enum AcoreStrings LANG_YOUR_BG_LEVEL_REQ_ERROR = 715, // = 716, see LANG_PINFO_MAP_OFFLINE LANG_BG_STARTED_ANNOUNCE_WORLD = 717, - LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN = 718, - LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT = 719, + LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_NAME_RATING = 718, + LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_NAME_RATING = 719, LANG_BG_GROUP_TOO_LARGE = 720, // "Your group is too large for this battleground. Please regroup to join." LANG_ARENA_GROUP_TOO_LARGE = 721, // "Your group is too large for this arena. Please regroup to join." @@ -702,7 +702,13 @@ enum AcoreStrings LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS = 751, // "Not enough players. This game will close in %u seconds." // = 752, see LANG_PINFO_ACC_IP - // Room for BG/ARENA = 773-784, 788-799 not used + // Room for BG/ARENA = 779-784, 788-799 not used + LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_NAME = 773, + LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_NAME = 774, + LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN_RATING = 775, + LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT_RATING = 776, + LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN = 777, + LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT = 778, LANG_ARENA_TESTING = 785, LANG_AUTO_ANN = 786, LANG_ANNOUNCE_COLOR = 787, diff --git a/src/server/game/World/IWorld.h b/src/server/game/World/IWorld.h index d1b216507..25c0e0a88 100644 --- a/src/server/game/World/IWorld.h +++ b/src/server/game/World/IWorld.h @@ -326,8 +326,10 @@ enum WorldIntConfigs CONFIG_ARENA_GAMES_REQUIRED, CONFIG_ARENA_SEASON_ID, CONFIG_ARENA_START_RATING, + CONFIG_LEGACY_ARENA_POINTS_CALC, CONFIG_ARENA_START_PERSONAL_RATING, CONFIG_ARENA_START_MATCHMAKER_RATING, + CONFIG_ARENA_QUEUE_ANNOUNCER_DETAIL, CONFIG_HONOR_AFTER_DUEL, CONFIG_PVP_TOKEN_MAP_TYPE, CONFIG_PVP_TOKEN_ID, diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index a35a7642d..00580196c 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1180,6 +1180,7 @@ void World::LoadConfigSettings(bool reload) _int_configs[CONFIG_ARENA_GAMES_REQUIRED] = sConfigMgr->GetOption("Arena.GamesRequired", 10); _int_configs[CONFIG_ARENA_SEASON_ID] = sConfigMgr->GetOption("Arena.ArenaSeason.ID", 1); _int_configs[CONFIG_ARENA_START_RATING] = sConfigMgr->GetOption("Arena.ArenaStartRating", 0); + _int_configs[CONFIG_LEGACY_ARENA_POINTS_CALC] = sConfigMgr->GetOption("Arena.LegacyArenaPoints", 0); _int_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfigMgr->GetOption("Arena.ArenaStartPersonalRating", 1000); _int_configs[CONFIG_ARENA_START_MATCHMAKER_RATING] = sConfigMgr->GetOption("Arena.ArenaStartMatchmakerRating", 1500); _bool_configs[CONFIG_ARENA_SEASON_IN_PROGRESS] = sConfigMgr->GetOption("Arena.ArenaSeason.InProgress", true); @@ -1189,6 +1190,7 @@ void World::LoadConfigSettings(bool reload) _float_configs[CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER] = sConfigMgr->GetOption("Arena.ArenaMatchmakerRatingModifier", 24.0f); _bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE] = sConfigMgr->GetOption("Arena.QueueAnnouncer.Enable", false); _bool_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY] = sConfigMgr->GetOption("Arena.QueueAnnouncer.PlayerOnly", false); + _int_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_DETAIL] = sConfigMgr->GetOption("Arena.QueueAnnouncer.Detail", 3); _bool_configs[CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN] = sConfigMgr->GetOption("OffhandCheckAtSpellUnlearn", true); _int_configs[CONFIG_CREATURE_STOP_FOR_PLAYER] = sConfigMgr->GetOption("Creature.MovingStopTimeForPlayer", 3 * MINUTE * IN_MILLISECONDS);