diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 38 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.h | 2 | ||||
-rwxr-xr-x | src/server/game/Miscellaneous/SharedDefines.h | 2 |
3 files changed, 24 insertions, 18 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 46dd5759e78..bef557e0b8f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -836,7 +836,7 @@ Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_rep m_ChampioningFaction = 0; - for (uint8 i = 0; i < MAX_POWERS; ++i) + for (uint8 i = 0; i < MAX_POWERS_PER_CLASS; ++i) m_powerFraction[i] = 0; isDebugAreaTriggers = false; @@ -846,7 +846,7 @@ Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_rep m_SeasonalQuestChanged = false; SetPendingBind(0, 0); - + _activeCheats = CHEAT_NONE; memset(_voidStorageItems, 0, VOID_STORAGE_MAX_SLOT * sizeof(VoidStorageItem*)); @@ -2566,6 +2566,11 @@ void Player::Regenerate(Powers power) if (HasAuraTypeWithValue(SPELL_AURA_PREVENT_REGENERATE_POWER, power)) return; + // Skip regeneration for power type we cannot have + uint32 powerIndex = GetPowerIndexByClass(power, getClass()); + if (powerIndex == MAX_POWERS) + return; + float addvalue = 0.0f; // Powers now benefit from haste. @@ -2648,7 +2653,7 @@ void Player::Regenerate(Powers power) else return; - addvalue += m_powerFraction[power]; + addvalue += m_powerFraction[powerIndex]; uint32 integerValue = uint32(fabs(addvalue)); if (addvalue < 0.0f) @@ -2656,12 +2661,12 @@ void Player::Regenerate(Powers power) if (curValue > integerValue) { curValue -= integerValue; - m_powerFraction[power] = addvalue + integerValue; + m_powerFraction[powerIndex] = addvalue + integerValue; } else { curValue = 0; - m_powerFraction[power] = 0; + m_powerFraction[powerIndex] = 0; } } else @@ -2671,15 +2676,16 @@ void Player::Regenerate(Powers power) if (curValue > maxValue) { curValue = maxValue; - m_powerFraction[power] = 0; + m_powerFraction[powerIndex] = 0; } else - m_powerFraction[power] = addvalue - integerValue; + m_powerFraction[powerIndex] = addvalue - integerValue; } + if (m_regenTimerCount >= 2000) SetPower(power, curValue); else - UpdateUInt32Value(UNIT_FIELD_POWER1 + power, curValue); + UpdateUInt32Value(UNIT_FIELD_POWER1 + powerIndex, curValue); } void Player::RegenerateHealth() @@ -3105,7 +3111,7 @@ void Player::GiveLevel(uint8 level) sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, basehp, basemana); // send levelup info to client - WorldPacket data(SMSG_LEVELUP_INFO, (4+4+MAX_STORED_POWERS*4+MAX_STATS*4)); + WorldPacket data(SMSG_LEVELUP_INFO, (4+4+MAX_POWERS_PER_CLASS*4+MAX_STATS*4)); data << uint32(level); data << uint32(int32(basehp) - int32(GetCreateHealth())); // for (int i = 0; i < MAX_STORED_POWERS; ++i) // Powers loop (0-10) @@ -17230,12 +17236,12 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) uint32 savedPower = fields[47+loadedPowers].GetUInt32(); uint32 maxPower = GetUInt32Value(UNIT_FIELD_MAXPOWER1 + loadedPowers); SetPower(Powers(i), (savedPower > maxPower) ? maxPower : savedPower); - if (++loadedPowers >= MAX_STORED_POWERS) + if (++loadedPowers >= MAX_POWERS_PER_CLASS) break; } } - for (; loadedPowers < MAX_STORED_POWERS; ++loadedPowers) + for (; loadedPowers < MAX_POWERS_PER_CLASS; ++loadedPowers) SetUInt32Value(UNIT_FIELD_POWER1 + loadedPowers, 0); SetPower(POWER_ECLIPSE, 0); @@ -18740,12 +18746,12 @@ void Player::SaveToDB(bool create /*=false*/) if (GetPowerIndexByClass(Powers(i), getClass()) != MAX_POWERS) { stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_POWER1 + storedPowers)); - if (++storedPowers >= MAX_STORED_POWERS) + if (++storedPowers >= MAX_POWERS_PER_CLASS) break; } } - for (; storedPowers < MAX_STORED_POWERS; ++storedPowers) + for (; storedPowers < MAX_POWERS_PER_CLASS; ++storedPowers) stmt->setUInt32(index++, 0); stmt->setUInt32(index++, GetSession()->GetLatency()); @@ -18860,12 +18866,12 @@ void Player::SaveToDB(bool create /*=false*/) if (GetPowerIndexByClass(Powers(i), getClass()) != MAX_POWERS) { stmt->setUInt32(index++, GetUInt32Value(UNIT_FIELD_POWER1 + storedPowers)); - if (++storedPowers >= MAX_STORED_POWERS) + if (++storedPowers >= MAX_POWERS_PER_CLASS) break; } } - for (; storedPowers < MAX_STORED_POWERS; ++storedPowers) + for (; storedPowers < MAX_POWERS_PER_CLASS; ++storedPowers) stmt->setUInt32(index++, 0); stmt->setUInt32(index++, GetSession()->GetLatency()); @@ -19571,7 +19577,7 @@ void Player::_SaveStats(SQLTransaction& trans) stmt->setUInt32(index++, GetGUIDLow()); stmt->setUInt32(index++, GetMaxHealth()); - for (uint8 i = 0; i < MAX_STORED_POWERS; ++i) + for (uint8 i = 0; i < MAX_POWERS_PER_CLASS; ++i) stmt->setUInt32(index++, GetMaxPower(Powers(i))); for (uint8 i = 0; i < MAX_STATS; ++i) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index bf3d061d21e..bfa70e611e6 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2644,7 +2644,7 @@ class Player : public Unit, public GridObject<Player> uint32 m_regenTimerCount; uint32 m_holyPowerRegenTimerCount; uint32 m_focusRegenTimerCount; - float m_powerFraction[MAX_POWERS]; + float m_powerFraction[MAX_POWERS_PER_CLASS]; uint32 m_contestedPvPTimer; /*********************************************************/ diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index fc656f2e88b..52be807ee06 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -191,7 +191,7 @@ enum Powers POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value) }; -#define MAX_STORED_POWERS 5 +#define MAX_POWERS_PER_CLASS 5 enum SpellSchools { |