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 b5f283c..83f6caf 100644
- --- a/src/server/game/Entities/Player/Player.cpp
- +++ b/src/server/game/Entities/Player/Player.cpp
- @@ -653,6 +653,7 @@ Player::Player(WorldSession* session): Unit(true)
- #pragma warning(default:4355)
- #endif
- + hasteMod = 2.9;
- m_speakTime = 0;
- m_speakCount = 0;
- @@ -1649,9 +1650,11 @@ 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())
- + /* hastemod
- + if (haveOffhandWeapon())
- if (getAttackTimer(OFF_ATTACK) < ATTACK_DISPLAY_DELAY)
- setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY);
- + */
- // do attack
- AttackerStateUpdate(victim, BASE_ATTACK);
- @@ -1668,8 +1671,10 @@ void Player::Update(uint32 p_time)
- else
- {
- // prevent base and off attack in same time, delay attack at 0.2 sec
- + /* hastemod
- if (getAttackTimer(BASE_ATTACK) < ATTACK_DISPLAY_DELAY)
- setAttackTimer(BASE_ATTACK, ATTACK_DISPLAY_DELAY);
- + */
- // do attack
- AttackerStateUpdate(victim, OFF_ATTACK);
- @@ -5926,30 +5931,68 @@ float Player::OCTRegenMPPerSpirit()
- return regen;
- }
- +// hastemod begins
- +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);
- +}
- +
- +// hastemod ends
- +
- void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
- {
- m_baseRatingValue[cr]+=(apply ? value : -value);
- - // explicit affected values
- - switch (cr)
- - {
- - case CR_HASTE_MELEE:
- - {
- - float RatingChange = value * GetRatingMultiplier(cr);
- - ApplyAttackTimePercentMod(BASE_ATTACK, RatingChange, apply);
- - ApplyAttackTimePercentMod(OFF_ATTACK, RatingChange, 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) ? ApplyPercentModFloatVar(m_modAttackSpeedPct[BASE_ATTACK], RatingChange, !apply) : ApplyPercentModFloatVar(m_modAttackSpeedPct[BASE_ATTACK], -RatingChange, apply);
- + (RatingChange = 0) ? ApplyPercentModFloatVar(m_modAttackSpeedPct[OFF_ATTACK], RatingChange, !apply) : ApplyPercentModFloatVar(m_modAttackSpeedPct[OFF_ATTACK], -RatingChange, apply);
- break;
- }
- case CR_HASTE_RANGED:
- {
- - float RatingChange = value * GetRatingMultiplier(cr);
- - ApplyAttackTimePercentMod(RANGED_ATTACK, RatingChange, apply);
- + 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) ? ApplyPercentModFloatVar(m_modAttackSpeedPct[RANGED_ATTACK], RatingChange, !apply) : ApplyPercentModFloatVar(m_modAttackSpeedPct[RANGED_ATTACK], -RatingChange, apply);
- break;
- }
- case CR_HASTE_SPELL:
- {
- - float RatingChange = value * GetRatingMultiplier(cr);
- - ApplyCastTimePercentMod(RatingChange, apply);
- + ApplyHasteMod(m_baseRatingValue[cr], CR_HASTE_SPELL-1, cr, 1.0f);
- break;
- }
- default:
- diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
- index 6aa19b5..b6ed92b 100644
- --- a/src/server/game/Entities/Player/Player.h
- +++ b/src/server/game/Entities/Player/Player.h
- @@ -2616,6 +2616,14 @@ class Player : public Unit, public GridObject<Player>
- uint32 m_timeSyncTimer;
- uint32 m_timeSyncClient;
- uint32 m_timeSyncServer;
- +
- + 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);
- InstanceTimeMap _instanceResetTimes;
- uint32 _pendingBindId;
- diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
- index d2b7fc6..7d763e3 100644
- --- a/src/server/game/Entities/Unit/StatSystem.cpp
- +++ b/src/server/game/Entities/Unit/StatSystem.cpp
- @@ -480,27 +480,31 @@ void Player::UpdateShieldBlockValue()
- void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& min_damage, float& max_damage)
- {
- UnitMods unitMod;
- -
- + Item *Weapon = NULL;
- +
- switch (attType)
- {
- 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 att_speed = GetAPMultiplier(attType, normalized);
- -
- - float base_value = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType)/ 14.0f * att_speed;
- - float base_pct = GetModifierValue(unitMod, BASE_PCT);
- - float total_value = GetModifierValue(unitMod, TOTAL_VALUE);
- - float total_pct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
- + float wep_speed =(!Weapon) ? 2200.00f : Weapon->GetTemplate()->Delay;
- + float base_value = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType)/ 14.0f * (wep_speed/1000.00f);
- + float att_speed = GetAPMultiplier(attType,normalized);
- + float base_pct = GetModifierValue(unitMod, BASE_PCT);
- + float total_value = GetModifierValue(unitMod, TOTAL_VALUE);
- + float total_pct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
- float weapon_mindamage = GetWeaponDamageRange(attType, MINDAMAGE);
- float weapon_maxdamage = GetWeaponDamageRange(attType, MAXDAMAGE);
- @@ -511,8 +515,8 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bo
- if (lvl > 60)
- lvl = 60;
- - weapon_mindamage = lvl*0.85f*att_speed;
- - weapon_maxdamage = lvl*1.25f*att_speed;
- + weapon_mindamage = lvl*3.0f*wep_speed/1000;
- + 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)
- {
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement