Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
- index c3adb55..c2f6f0b 100644
- --- a/src/server/game/Entities/Player/Player.cpp
- +++ b/src/server/game/Entities/Player/Player.cpp
- @@ -173,6 +173,8 @@ uint32 const MAX_MONEY_AMOUNT = static_cast<uint32>(std::numeric_limits<int32>::
- Player::Player(WorldSession* session): Unit(true)
- {
- + // 1557 HasteCap
- + hasteMod = 2.1059f;
- m_speakTime = 0;
- m_speakCount = 0;
- @@ -1141,10 +1143,10 @@ void Player::Update(uint32 p_time)
- m_swingErrorMsg = 0; // reset swing error state
- // prevent base and off attack in same time, delay attack at 0.2 sec
- - if (haveOffhandWeapon())
- + /*if (haveOffhandWeapon())
- if (getAttackTimer(OFF_ATTACK) < ATTACK_DISPLAY_DELAY)
- setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY);
- -
- + */
- // do attack
- AttackerStateUpdate(victim, BASE_ATTACK);
- resetAttackTimer(BASE_ATTACK);
- @@ -1160,9 +1162,9 @@ void Player::Update(uint32 p_time)
- else
- {
- // prevent base and off attack in same time, delay attack at 0.2 sec
- - if (getAttackTimer(BASE_ATTACK) < ATTACK_DISPLAY_DELAY)
- + /*if (getAttackTimer(BASE_ATTACK) < ATTACK_DISPLAY_DELAY)
- setAttackTimer(BASE_ATTACK, ATTACK_DISPLAY_DELAY);
- -
- + */
- // do attack
- AttackerStateUpdate(victim, OFF_ATTACK);
- resetAttackTimer(OFF_ATTACK);
- @@ -5468,7 +5470,7 @@ float Player::OCTRegenMPPerSpirit() const
- return regen;
- }
- -void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply)
- +/*void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply)
- {
- float oldRating = m_baseRatingValue[combatRating];
- m_baseRatingValue[combatRating] += (apply ? value : -value);
- @@ -5498,6 +5500,72 @@ void Player::ApplyRatingMod(CombatRating combatRating, int32 value, bool apply)
- }
- UpdateRating(combatRating);
- +}*/
- +
- +void Player::SetAttackTime(WeaponAttackType att, uint32 val) {
- + switch (att) {
- + case BASE_ATTACK:
- + ApplyHasteMod(m_baseRatingValue[CR_HASTE_MELEE], BASE_ATTACK, CR_HASTE_MELEE, val);
- + break;
- +
- + case OFF_ATTACK:
- + ApplyHasteMod(m_baseRatingValue[CR_HASTE_MELEE], OFF_ATTACK, CR_HASTE_MELEE, val);
- + break;
- + case RANGED_ATTACK:
- + ApplyHasteMod(m_baseRatingValue[CR_HASTE_RANGED], RANGED_ATTACK, CR_HASTE_RANGED, val);
- + break;
- +
- + default:
- + SetFloatValue(UNIT_FIELD_BASEATTACKTIME + att, val * m_modAttackSpeedPct[att]);
- + }
- +}
- +
- +void Player::ApplyHasteMod(int16 val, uint32 att, CombatRating cr, float speed) {
- + float atkSpd = speed * ((100.0f - ((val / 32.789989f) * hasteMod)) / 100.0f);
- + if (atkSpd < 0) atkSpd = 0;
- + SetFloatValue(UNIT_FIELD_BASEATTACKTIME + att, atkSpd);
- +}
- +
- +// This function had to be completely replaced.
- +void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
- +{
- + m_baseRatingValue[cr] += (apply ? value : -value);
- + // explicit affected values
- + switch (cr)
- + {
- + case CR_HASTE_MELEE:
- + {
- + Item* mainhand = m_items[EQUIPMENT_SLOT_MAINHAND];
- + Item* offhand = m_items[EQUIPMENT_SLOT_OFFHAND];
- + float speed1 = mainhand ? (float)mainhand->GetTemplate()->Delay : 2000.0f;
- + float speed2 = offhand ? (float)offhand->GetTemplate()->Delay : 2000.0f;
- +
- + ApplyHasteMod(m_baseRatingValue[cr], BASE_ATTACK, cr, speed1);
- + ApplyHasteMod(m_baseRatingValue[cr], OFF_ATTACK, cr, speed2);
- +
- + float RatingChange = value / value;
- + (RatingChange = 0) ? ApplyAttackTimePercentMod(BASE_ATTACK, RatingChange, false) : ApplyAttackTimePercentMod(BASE_ATTACK, -RatingChange, true);
- + (RatingChange = 0) ? ApplyAttackTimePercentMod(OFF_ATTACK, RatingChange, false) : ApplyAttackTimePercentMod(OFF_ATTACK, -RatingChange, true);
- + break;
- + }
- + case CR_HASTE_RANGED:
- + {
- + Item* ranged = m_items[EQUIPMENT_SLOT_RANGED];
- + float speed = ranged ? (float)ranged->GetTemplate()->Delay : 2000.0f;
- + ApplyHasteMod(m_baseRatingValue[cr], RANGED_ATTACK, cr, speed);
- + float RatingChange = value / value;
- + (RatingChange = 0) ? ApplyAttackTimePercentMod(RANGED_ATTACK, RatingChange, false) : ApplyAttackTimePercentMod(RANGED_ATTACK, -RatingChange, true);
- + break;
- + }
- + case CR_HASTE_SPELL:
- + {
- + ApplyHasteMod(m_baseRatingValue[cr], CR_HASTE_SPELL - 1, cr, 1.0f);
- + }
- + default:
- + break;
- + }
- +
- + UpdateRating(cr);
- }
- void Player::UpdateRating(CombatRating cr)
- diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
- index 4e2f674..94d2b8a 100644
- --- a/src/server/game/Entities/Player/Player.h
- +++ b/src/server/game/Entities/Player/Player.h
- @@ -2496,6 +2496,13 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
- uint32 manaBeforeDuel;
- WorldLocation _corpseLocation;
- +
- + float hasteMod;
- + public:
- + float GetHasteMod() const { return hasteMod; }
- + void SetHasteMod(float val) { hasteMod = val; }
- + void ApplyHasteMod(int16 val, uint32 att, CombatRating cr, float speed);
- + void SetAttackTime(WeaponAttackType att, uint32 val);
- };
- TC_GAME_API void AddItemsSetItem(Player* player, Item* item);
- diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
- index 0458f14..e279d2b 100644
- --- a/src/server/game/Entities/Unit/StatSystem.cpp
- +++ b/src/server/game/Entities/Unit/StatSystem.cpp
- @@ -531,64 +531,64 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bo
- }
- UnitMods unitMod;
- + Item* Weapon = NULL;
- switch (attType)
- {
- - case BASE_ATTACK:
- - default:
- - unitMod = UNIT_MOD_DAMAGE_MAINHAND;
- - break;
- - case OFF_ATTACK:
- - unitMod = UNIT_MOD_DAMAGE_OFFHAND;
- - break;
- - case RANGED_ATTACK:
- - unitMod = UNIT_MOD_DAMAGE_RANGED;
- - break;
- + case BASE_ATTACK:
- + default:
- + Weapon = m_items[EQUIPMENT_SLOT_MAINHAND];
- + unitMod = UNIT_MOD_DAMAGE_MAINHAND;
- + break;
- + case OFF_ATTACK:
- + Weapon = m_items[EQUIPMENT_SLOT_OFFHAND];
- + unitMod = UNIT_MOD_DAMAGE_OFFHAND;
- + break;
- + case RANGED_ATTACK:
- + Weapon = m_items[EQUIPMENT_SLOT_RANGED];
- + unitMod = UNIT_MOD_DAMAGE_RANGED;
- + break;
- }
- - float const attackPowerMod = std::max(GetAPMultiplier(attType, normalized), 0.25f);
- -
- - float baseValue = GetFlatModifierValue(unitMod, BASE_VALUE);
- - baseValue += GetTotalAttackPowerValue(attType) / 14.0f * attackPowerMod;
- -
- - float basePct = GetPctModifierValue(unitMod, BASE_PCT);
- - float totalValue = GetFlatModifierValue(unitMod, TOTAL_VALUE);
- - float totalPct = addTotalPct ? GetPctModifierValue(unitMod, TOTAL_PCT) : 1.0f;
- + float wep_speed = (!Weapon) ? 2200.00f : Weapon->GetTemplate()->Delay;
- + float base_value = GetFlatModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 14.0f * (wep_speed / 1000.00f);
- + float att_speed = GetAPMultiplier(attType, normalized);
- + float base_pct = GetPctModifierValue(unitMod, BASE_PCT);
- + float total_value = GetFlatModifierValue(unitMod, TOTAL_VALUE);
- + float total_pct = addTotalPct ? GetPctModifierValue(unitMod, TOTAL_PCT) : 1.0f;
- - float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);
- - float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);
- + float weapon_mindamage = GetWeaponDamageRange(attType, MINDAMAGE);
- + float weapon_maxdamage = GetWeaponDamageRange(attType, MAXDAMAGE);
- - // check if player is druid and in cat or bear forms
- - if (IsInFeralForm())
- + if (IsInFeralForm()) //check if player is druid and in cat or bear forms
- {
- uint8 lvl = GetLevel();
- if (lvl > 60)
- lvl = 60;
- - weaponMinDamage = lvl * 0.85f * attackPowerMod;
- - weaponMaxDamage = lvl * 1.25f * attackPowerMod;
- + weapon_mindamage = lvl * 3.0f * wep_speed / 1000; //fix druid damage dalton
- + weapon_maxdamage = lvl * 5.0f * wep_speed / 1000;
- }
- - else if (!CanUseAttackType(attType)) // check if player not in form but still can't use (disarm case)
- + else if (!CanUseAttackType(attType)) //check if player not in form but still can't use (disarm case)
- {
- - // cannot use ranged/off attack, set values to 0
- + //cannot use ranged/off attack, set values to 0
- if (attType != BASE_ATTACK)
- {
- - minDamage = 0.f;
- - maxDamage = 0.f;
- + minDamage = 0;
- + maxDamage = 0;
- return;
- }
- -
- - weaponMinDamage = BASE_MINDAMAGE;
- - weaponMaxDamage = BASE_MAXDAMAGE;
- + weapon_mindamage = BASE_MINDAMAGE;
- + weapon_maxdamage = BASE_MAXDAMAGE;
- }
- - else if (attType == RANGED_ATTACK) // add ammo DPS to ranged primary damage
- + else if (attType == RANGED_ATTACK) //add ammo DPS to ranged damage
- {
- - weaponMinDamage += GetAmmoDPS() * attackPowerMod;
- - weaponMaxDamage += GetAmmoDPS() * attackPowerMod;
- + weapon_mindamage += GetAmmoDPS() * att_speed;
- + weapon_maxdamage += GetAmmoDPS() * att_speed;
- }
- - minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
- - maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
- + minDamage = ((base_value + weapon_mindamage) * base_pct + total_value) * total_pct;
- + maxDamage = ((base_value + weapon_maxdamage) * base_pct + total_value) * total_pct;
- }
- void Player::UpdateDefenseBonusesMod()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement