diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 50109b15e..789cd1c43 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1919,6 +1919,7 @@ void Player::Regenerate(Powers power) addvalue += m_powerFraction[power]; uint32 integerValue = uint32(std::fabs(addvalue)); + bool forcedUpdate = false; if (addvalue < 0.0f) { if (curValue > integerValue) @@ -1930,24 +1931,33 @@ void Player::Regenerate(Powers power) { curValue = 0; m_powerFraction[power] = 0; + forcedUpdate = true; } } else { curValue += integerValue; - if (curValue > maxValue) + if (curValue >= maxValue) { curValue = maxValue; m_powerFraction[power] = 0; + forcedUpdate = true; } else + { m_powerFraction[power] = addvalue - integerValue; + } + } + + if (m_regenTimerCount >= 2000 || forcedUpdate) + { + SetPower(power, curValue, true, true); } - if (m_regenTimerCount >= 2000) - SetPower(power, curValue); else + { UpdateUInt32Value(static_cast(UNIT_FIELD_POWER1) + power, curValue); + } } void Player::RegenerateHealth() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 8fbe44c39..78da2dd7a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -15449,16 +15449,28 @@ void Unit::SetMaxHealth(uint32 val) SetHealth(val); } -void Unit::SetPower(Powers power, uint32 val, bool withPowerUpdate /*= true*/) +void Unit::SetPower(Powers power, uint32 val, bool withPowerUpdate /*= true*/, bool fromRegenerate /* = false */) { - if (GetPower(power) == val) + if (!fromRegenerate && GetPower(power) == val) + { return; + } uint32 maxPower = GetMaxPower(power); if (maxPower < val) + { val = maxPower; + } - SetStatInt32Value(static_cast(UNIT_FIELD_POWER1) + power, val); + if (fromRegenerate) + { + UpdateUInt32Value(static_cast(UNIT_FIELD_POWER1) + power, val); + AddToObjectUpdateIfNeeded(); + } + else + { + SetStatInt32Value(static_cast(UNIT_FIELD_POWER1) + power, val); + } if (withPowerUpdate) { @@ -15474,10 +15486,14 @@ void Unit::SetPower(Powers power, uint32 val, bool withPowerUpdate /*= true*/) { Player* player = ToPlayer(); if (getPowerType() == power && player->NeedSendSpectatorData()) + { ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val); + } if (player->GetGroup()) + { player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_CUR_POWER); + } } else if (Pet* pet = ToCreature()->ToPet()) { @@ -15485,12 +15501,16 @@ void Unit::SetPower(Powers power, uint32 val, bool withPowerUpdate /*= true*/) { Unit* owner = GetOwner(); if (owner && (owner->GetTypeId() == TYPEID_PLAYER) && owner->ToPlayer()->GetGroup()) + { owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_CUR_POWER); + } } // Update the pet's character sheet with happiness damage bonus if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS) + { pet->UpdateDamagePhysical(BASE_ATTACK); + } } } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 9de9f0bb3..8e67412fc 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1460,7 +1460,7 @@ public: void setPowerType(Powers power); [[nodiscard]] uint32 GetPower(Powers power) const { return GetUInt32Value(static_cast(UNIT_FIELD_POWER1) + power); } [[nodiscard]] uint32 GetMaxPower(Powers power) const { return GetUInt32Value(static_cast(UNIT_FIELD_MAXPOWER1) + power); } - void SetPower(Powers power, uint32 val, bool withPowerUpdate = true); + void SetPower(Powers power, uint32 val, bool withPowerUpdate = true, bool fromRegenerate = false); void SetMaxPower(Powers power, uint32 val); // returns the change in power int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate = true); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 49535085a..e2208fa84 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1714,10 +1714,9 @@ void Group::UpdatePlayerOutOfRange(Player* player) WorldPacket data; player->GetSession()->BuildPartyMemberStatsChangedPacket(player, &data); - Player* member; for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) { - member = itr->GetSource(); + Player* member = itr->GetSource(); if (member && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(player), false))) member->GetSession()->SendPacket(&data); }