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];
|
addvalue += m_powerFraction[power];
|
||||||
uint32 integerValue = uint32(std::fabs(addvalue));
|
uint32 integerValue = uint32(std::fabs(addvalue));
|
||||||
|
|
||||||
|
bool forcedUpdate = false;
|
||||||
if (addvalue < 0.0f)
|
if (addvalue < 0.0f)
|
||||||
{
|
{
|
||||||
if (curValue > integerValue)
|
if (curValue > integerValue)
|
||||||
@@ -1930,24 +1931,33 @@ void Player::Regenerate(Powers power)
|
|||||||
{
|
{
|
||||||
curValue = 0;
|
curValue = 0;
|
||||||
m_powerFraction[power] = 0;
|
m_powerFraction[power] = 0;
|
||||||
|
forcedUpdate = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
curValue += integerValue;
|
curValue += integerValue;
|
||||||
|
|
||||||
if (curValue > maxValue)
|
if (curValue >= maxValue)
|
||||||
{
|
{
|
||||||
curValue = maxValue;
|
curValue = maxValue;
|
||||||
m_powerFraction[power] = 0;
|
m_powerFraction[power] = 0;
|
||||||
|
forcedUpdate = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
m_powerFraction[power] = addvalue - integerValue;
|
m_powerFraction[power] = addvalue - integerValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_regenTimerCount >= 2000 || forcedUpdate)
|
||||||
|
{
|
||||||
|
SetPower(power, curValue, true, true);
|
||||||
}
|
}
|
||||||
if (m_regenTimerCount >= 2000)
|
|
||||||
SetPower(power, curValue);
|
|
||||||
else
|
else
|
||||||
|
{
|
||||||
UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, curValue);
|
UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, curValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::RegenerateHealth()
|
void Player::RegenerateHealth()
|
||||||
|
|||||||
@@ -15449,16 +15449,28 @@ void Unit::SetMaxHealth(uint32 val)
|
|||||||
SetHealth(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;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
uint32 maxPower = GetMaxPower(power);
|
uint32 maxPower = GetMaxPower(power);
|
||||||
if (maxPower < val)
|
if (maxPower < val)
|
||||||
|
{
|
||||||
val = maxPower;
|
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)
|
if (withPowerUpdate)
|
||||||
{
|
{
|
||||||
@@ -15474,10 +15486,14 @@ void Unit::SetPower(Powers power, uint32 val, bool withPowerUpdate /*= true*/)
|
|||||||
{
|
{
|
||||||
Player* player = ToPlayer();
|
Player* player = ToPlayer();
|
||||||
if (getPowerType() == power && player->NeedSendSpectatorData())
|
if (getPowerType() == power && player->NeedSendSpectatorData())
|
||||||
|
{
|
||||||
ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
|
ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
|
||||||
|
}
|
||||||
|
|
||||||
if (player->GetGroup())
|
if (player->GetGroup())
|
||||||
|
{
|
||||||
player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_CUR_POWER);
|
player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_CUR_POWER);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (Pet* pet = ToCreature()->ToPet())
|
else if (Pet* pet = ToCreature()->ToPet())
|
||||||
{
|
{
|
||||||
@@ -15485,12 +15501,16 @@ void Unit::SetPower(Powers power, uint32 val, bool withPowerUpdate /*= true*/)
|
|||||||
{
|
{
|
||||||
Unit* owner = GetOwner();
|
Unit* owner = GetOwner();
|
||||||
if (owner && (owner->GetTypeId() == TYPEID_PLAYER) && owner->ToPlayer()->GetGroup())
|
if (owner && (owner->GetTypeId() == TYPEID_PLAYER) && owner->ToPlayer()->GetGroup())
|
||||||
|
{
|
||||||
owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_CUR_POWER);
|
owner->ToPlayer()->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_CUR_POWER);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the pet's character sheet with happiness damage bonus
|
// Update the pet's character sheet with happiness damage bonus
|
||||||
if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
|
if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
|
||||||
|
{
|
||||||
pet->UpdateDamagePhysical(BASE_ATTACK);
|
pet->UpdateDamagePhysical(BASE_ATTACK);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1460,7 +1460,7 @@ public:
|
|||||||
void setPowerType(Powers power);
|
void setPowerType(Powers power);
|
||||||
[[nodiscard]] uint32 GetPower(Powers power) const { return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + 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); }
|
[[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);
|
void SetMaxPower(Powers power, uint32 val);
|
||||||
// returns the change in power
|
// returns the change in power
|
||||||
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate = true);
|
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate = true);
|
||||||
|
|||||||
@@ -1714,10 +1714,9 @@ void Group::UpdatePlayerOutOfRange(Player* player)
|
|||||||
WorldPacket data;
|
WorldPacket data;
|
||||||
player->GetSession()->BuildPartyMemberStatsChangedPacket(player, &data);
|
player->GetSession()->BuildPartyMemberStatsChangedPacket(player, &data);
|
||||||
|
|
||||||
Player* member;
|
|
||||||
for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
|
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)))
|
if (member && (!member->IsInMap(player) || !member->IsWithinDist(player, member->GetSightRange(player), false)))
|
||||||
member->GetSession()->SendPacket(&data);
|
member->GetSession()->SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user