From 76933b27327ed2feb1e70aad2ea1c0ebfe22ca7a Mon Sep 17 00:00:00 2001 From: Michael Richards Date: Sun, 28 Dec 2025 22:34:45 -0600 Subject: [PATCH] feat(Core/PvP): Outdoor PvP capture rate multiplier (#23902) --- src/server/apps/worldserver/worldserver.conf.dist | 13 +++++++++++++ src/server/game/OutdoorPvP/OutdoorPvP.cpp | 5 +++-- src/server/game/World/WorldConfig.cpp | 2 ++ src/server/game/World/WorldConfig.h | 1 + src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp | 4 ++-- 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index c34645af1..aefd61bf6 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -53,6 +53,7 @@ # CHARTER # GUILD # FFAPVP +# OUTDOORPVP # WINTERGRASP # BATTLEGROUND # ARENA @@ -3515,6 +3516,18 @@ FFAPvPTimer = 30 # ################################################################################################### +################################################################################################### +# OUTDOORPVP +# +# OutdoorPvPCaptureRate +# Description: Specify rate multiplier for outdoor PvP capture points. (e.g. Eastern Plaguelands, Hellfire Peninsula) +# Default: 1.0 + +OutdoorPvPCaptureRate = 1.0 + +# +################################################################################################### + ################################################################################################### # WINTERGRASP # diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 9ca84858d..88e210cfc 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -25,6 +25,7 @@ #include "ObjectMgr.h" #include "OutdoorPvPMgr.h" #include "WorldPacket.h" +#include "World.h" OPvPCapturePoint::OPvPCapturePoint(OutdoorPvP* pvp) : _pvp(pvp) @@ -349,12 +350,12 @@ bool OPvPCapturePoint::Update(uint32 diff) } // get the difference of numbers - float factDiff = ((float)_activePlayers[0].size() - (float)_activePlayers[1].size()) * float(diff) / OUTDOORPVP_OBJECTIVE_UPDATE_INTERVAL; + float factDiff = (((float)_activePlayers[0].size() - (float)_activePlayers[1].size()) * float(diff) / OUTDOORPVP_OBJECTIVE_UPDATE_INTERVAL) * sWorld->getFloatConfig(CONFIG_OUTDOOR_PVP_CAPTURE_RATE); if (factDiff == 0.f) return false; TeamId ChallengerId = TEAM_NEUTRAL; - float maxDiff = _maxSpeed * float(diff); + float maxDiff = (_maxSpeed * float(diff)) * sWorld->getFloatConfig(CONFIG_OUTDOOR_PVP_CAPTURE_RATE); if (factDiff < 0.f) { diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index 6ae1b16ce..1936df510 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -488,6 +488,8 @@ void WorldConfig::BuildConfigCache() SetConfigValue(CONFIG_FFA_PVP_TIMER, "FFAPvPTimer", 30); + SetConfigValue(CONFIG_OUTDOOR_PVP_CAPTURE_RATE, "OutdoorPvPCaptureRate", 1.0f); + SetConfigValue(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, "LootNeedBeforeGreedILvlRestriction", 70); SetConfigValue(CONFIG_PLAYER_SETTINGS_ENABLED, "EnablePlayerSettings", 0); diff --git a/src/server/game/World/WorldConfig.h b/src/server/game/World/WorldConfig.h index 7a34aad36..21efea51b 100644 --- a/src/server/game/World/WorldConfig.h +++ b/src/server/game/World/WorldConfig.h @@ -372,6 +372,7 @@ enum ServerConfigs CONFIG_NPC_EVADE_IF_NOT_REACHABLE, CONFIG_NPC_REGEN_TIME_IF_NOT_REACHABLE_IN_RAID, CONFIG_FFA_PVP_TIMER, + CONFIG_OUTDOOR_PVP_CAPTURE_RATE, CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, CONFIG_LFG_MAX_KICK_COUNT, CONFIG_LFG_KICK_PREVENTION_TIMER, diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp index e5d69d84b..1fe133ef0 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp @@ -673,11 +673,11 @@ bool OPvPCapturePointNA::Update(uint32 diff) m_RespawnTimer -= diff; // get the difference of numbers - float factDiff = ((float)_activePlayers[0].size() - (float)_activePlayers[1].size()) * diff / OUTDOORPVP_OBJECTIVE_UPDATE_INTERVAL; + float factDiff = (((float)_activePlayers[0].size() - (float)_activePlayers[1].size()) * diff / OUTDOORPVP_OBJECTIVE_UPDATE_INTERVAL) * sWorld->getFloatConfig(CONFIG_OUTDOOR_PVP_CAPTURE_RATE); if (!factDiff) return false; - float maxDiff = _maxSpeed * diff; + float maxDiff = _maxSpeed * diff * sWorld->getFloatConfig(CONFIG_OUTDOOR_PVP_CAPTURE_RATE); if (factDiff < 0) {