mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-19 11:55:43 +00:00
fix(Core/Players): Fixed sending power regen update to nearby players. (#14043)
This commit is contained in:
@@ -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<uint16>(UNIT_FIELD_POWER1) + power, curValue);
|
||||
}
|
||||
}
|
||||
|
||||
void Player::RegenerateHealth()
|
||||
|
||||
@@ -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<uint16>(UNIT_FIELD_POWER1) + power, val);
|
||||
if (fromRegenerate)
|
||||
{
|
||||
UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, val);
|
||||
AddToObjectUpdateIfNeeded();
|
||||
}
|
||||
else
|
||||
{
|
||||
SetStatInt32Value(static_cast<uint16>(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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1460,7 +1460,7 @@ public:
|
||||
void setPowerType(Powers power);
|
||||
[[nodiscard]] uint32 GetPower(Powers power) const { return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
|
||||
[[nodiscard]] uint32 GetMaxPower(Powers power) const { return GetUInt32Value(static_cast<uint16>(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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user