From 2c0d7f91953d8268b1baceea39bad84213de8414 Mon Sep 17 00:00:00 2001 From: AwkwardDev Date: Mon, 3 Sep 2012 00:23:13 +0300 Subject: Haste cap patch applied. --- src/server/game/Entities/Player/Player.cpp | 46 ++++++++++++++++++++++++++ src/server/game/World/World.cpp | 3 ++ src/server/game/World/World.h | 1 + src/server/worldserver/worldserver.conf.dist | 9 +++++ 4 files changed, 59 insertions(+) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 65f6588..827bb7b 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5940,6 +5940,52 @@ void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply) UpdateRating(cr); } +void Player::UpdateInstantHasteCap() +{ + if (sWorld->getIntConfig(CONFIG_PLAYER_HASTE_CAP) == -1) + { + return; + } + + bool hasInstantHasteCap = (GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 0) == 1 + || GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1) == 1 + || GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 2) == 1 + || GetFloatValue(UNIT_MOD_CAST_SPEED) == 0); + + if (m_baseRatingValue[CR_HASTE_MELEE] >= sWorld->getIntConfig(CONFIG_PLAYER_HASTE_CAP)) + { + SetFloatValue(UNIT_MOD_CAST_SPEED, 0); + SetFloatValue(UNIT_FIELD_BASEATTACKTIME + BASE_ATTACK, 1); + SetFloatValue(UNIT_FIELD_BASEATTACKTIME + OFF_ATTACK, 1); + SetFloatValue(UNIT_FIELD_BASEATTACKTIME + RANGED_ATTACK, 1); + } + + else if (hasInstantHasteCap && m_baseRatingValue[CR_HASTE_MELEE] < sWorld->getIntConfig(CONFIG_PLAYER_HASTE_CAP)) + { + SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); + SetRegularAttackTime(); + ApplyCastTimePercentMod(m_baseRatingValue[CR_HASTE_SPELL] * GetRatingMultiplier(CR_HASTE_SPELL), true); + + if (GetShapeshiftForm()) + { + SpellShapeshiftEntry const* ssEntry = sSpellShapeshiftStore.LookupEntry(GetShapeshiftForm()); + if (ssEntry && ssEntry->attackSpeed) + { + SetAttackTime(BASE_ATTACK, ssEntry->attackSpeed); + SetAttackTime(OFF_ATTACK, ssEntry->attackSpeed); + SetAttackTime(RANGED_ATTACK, BASE_ATTACK_TIME); + } + } + } + + if (CanModifyStats()) + { + UpdateDamagePhysical(BASE_ATTACK); + UpdateDamagePhysical(OFF_ATTACK); + UpdateDamagePhysical(RANGED_ATTACK); + } +} + void Player::UpdateRating(CombatRating cr) { int32 amount = m_baseRatingValue[cr]; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index ea74b6d..0e2dd6a 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1210,6 +1210,9 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_WINTERGRASP_NOBATTLETIME] = ConfigMgr::GetIntDefault("Wintergrasp.NoBattleTimer", 150); m_int_configs[CONFIG_WINTERGRASP_RESTART_AFTER_CRASH] = ConfigMgr::GetIntDefault("Wintergrasp.CrashRestartTimer", 10); + // Player haste cap + m_int_configs[CONFIG_PLAYER_HASTE_CAP] = ConfigMgr::GetIntDefault("Player.HasteCap", 0); + if (reload) sScriptMgr->OnConfigLoad(reload); } diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index a6cdd47..e0abdd4 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -325,6 +325,7 @@ enum WorldIntConfigs CONFIG_WINTERGRASP_BATTLETIME, CONFIG_WINTERGRASP_NOBATTLETIME, CONFIG_WINTERGRASP_RESTART_AFTER_CRASH, + CONFIG_PLAYER_HASTE_CAP, // Player haste cap INT_CONFIG_VALUE_COUNT }; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index ce65517..8e5765e 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2642,6 +2642,15 @@ PlayerDump.DisallowPaths = 1 PlayerDump.DisallowOverwrite = 1 # +# Player.HasteCap +# Description: Haste rating at which attack and casting speed will be set to instant (0). +# Default: -1 - (Disabled) +# 0+ - (Enabled) +# Example: Player.HasteCap = 2000 + +Player.HasteCap = 2000 + +# ################################################################################################### ################################################################################################### -- 1.7.10.msysgit.1