mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 10:31:29 +00:00
[Crash Fix] Fix Possible Crashes with Raid Methods (#4955)
This commit is contained in:
parent
76d46ceaf0
commit
13aad6229f
108
zone/raids.cpp
108
zone/raids.cpp
@ -717,7 +717,7 @@ uint32 Raid::GetTotalRaidDamage(Mob* other)
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Raid::HealGroup(uint32 heal_amt, Mob* caster, uint32 gid, float range)
|
void Raid::HealGroup(uint32 heal_amount, Mob* caster, uint32 group_id, float range)
|
||||||
{
|
{
|
||||||
if (!caster) {
|
if (!caster) {
|
||||||
return;
|
return;
|
||||||
@ -728,26 +728,30 @@ void Raid::HealGroup(uint32 heal_amt, Mob* caster, uint32 gid, float range)
|
|||||||
}
|
}
|
||||||
|
|
||||||
float distance;
|
float distance;
|
||||||
float range2 = range*range;
|
float range_squared = range * range;
|
||||||
|
|
||||||
|
int member_count = 0;
|
||||||
|
|
||||||
int numMem = 0;
|
|
||||||
for (const auto& m : members) {
|
for (const auto& m : members) {
|
||||||
if (m.member && m.group_number == gid) {
|
if (m.member && m.group_number == group_id) {
|
||||||
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
||||||
|
|
||||||
if (distance <= range2) {
|
if (distance <= range_squared) {
|
||||||
numMem += 1;
|
member_count += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
heal_amt /= numMem;
|
if (member_count > 0) {
|
||||||
|
heal_amount /= member_count;
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto& m : members) {
|
for (const auto& m : members) {
|
||||||
if (m.member && m.group_number == gid) {
|
if (m.member && m.group_number == group_id) {
|
||||||
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
||||||
|
|
||||||
if (distance <= range2) {
|
if (distance <= range_squared) {
|
||||||
m.member->SetHP(m.member->GetHP() + heal_amt);
|
m.member->SetHP(m.member->GetHP() + heal_amount);
|
||||||
m.member->SendHPUpdate();
|
m.member->SendHPUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -755,7 +759,7 @@ void Raid::HealGroup(uint32 heal_amt, Mob* caster, uint32 gid, float range)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Raid::BalanceHP(int32 penalty, uint32 gid, float range, Mob* caster, int32 limit)
|
void Raid::BalanceHP(int32 penalty, uint32 group_id, float range, Mob* caster, int32 limit)
|
||||||
{
|
{
|
||||||
if (!caster) {
|
if (!caster) {
|
||||||
return;
|
return;
|
||||||
@ -765,44 +769,48 @@ void Raid::BalanceHP(int32 penalty, uint32 gid, float range, Mob* caster, int32
|
|||||||
range = 200;
|
range = 200;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dmgtaken = 0, numMem = 0, dmgtaken_tmp = 0;
|
int damage_taken = 0;
|
||||||
|
int damage_taken_temporary = 0;
|
||||||
|
int member_count = 0;
|
||||||
|
|
||||||
float distance;
|
float distance;
|
||||||
float range2 = range*range;
|
float range_squared = range * range;
|
||||||
|
|
||||||
for (const auto& m : members) {
|
for (const auto& m : members) {
|
||||||
if (m.member && m.group_number == gid) {
|
if (m.member && m.group_number == group_id) {
|
||||||
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
||||||
|
|
||||||
if (distance <= range2) {
|
if (distance <= range_squared) {
|
||||||
dmgtaken_tmp = m.member->GetMaxHP() - m.member->GetHP();
|
damage_taken_temporary = m.member->GetMaxHP() - m.member->GetHP();
|
||||||
|
|
||||||
if (limit && (dmgtaken_tmp > limit)) {
|
if (limit && (damage_taken_temporary > limit)) {
|
||||||
dmgtaken_tmp = limit;
|
damage_taken_temporary = limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
dmgtaken += dmgtaken_tmp;
|
damage_taken += damage_taken_temporary;
|
||||||
numMem += 1;
|
member_count += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dmgtaken += dmgtaken * penalty / 100;
|
damage_taken += damage_taken * penalty / 100;
|
||||||
dmgtaken /= numMem;
|
|
||||||
|
if (member_count > 0) {
|
||||||
|
damage_taken /= member_count;
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto& m : members) {
|
for (const auto& m : members) {
|
||||||
if (m.member && m.group_number == gid) {
|
if (m.member && m.group_number == group_id) {
|
||||||
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
||||||
|
|
||||||
//this way the ability will never kill someone
|
//this way the ability will never kill someone
|
||||||
//but it will come darn close
|
//but it will come darn close
|
||||||
if (distance <= range2) {
|
if (distance <= range_squared) {
|
||||||
if ((m.member->GetMaxHP() - dmgtaken) < 1) {
|
if ((m.member->GetMaxHP() - damage_taken) < 1) {
|
||||||
m.member->SetHP(1);
|
m.member->SetHP(1);
|
||||||
m.member->SendHPUpdate();
|
m.member->SendHPUpdate();
|
||||||
}
|
} else {
|
||||||
|
m.member->SetHP(m.member->GetMaxHP() - damage_taken);
|
||||||
else {
|
|
||||||
m.member->SetHP(m.member->GetMaxHP() - dmgtaken);
|
|
||||||
m.member->SendHPUpdate();
|
m.member->SendHPUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -810,7 +818,7 @@ void Raid::BalanceHP(int32 penalty, uint32 gid, float range, Mob* caster, int32
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Raid::BalanceMana(int32 penalty, uint32 gid, float range, Mob* caster, int32 limit)
|
void Raid::BalanceMana(int32 penalty, uint32 group_id, float range, Mob* caster, int32 limit)
|
||||||
{
|
{
|
||||||
if (!caster) {
|
if (!caster) {
|
||||||
return;
|
return;
|
||||||
@ -821,54 +829,56 @@ void Raid::BalanceMana(int32 penalty, uint32 gid, float range, Mob* caster, int3
|
|||||||
}
|
}
|
||||||
|
|
||||||
float distance;
|
float distance;
|
||||||
float range2 = range*range;
|
float range_squared = range * range;
|
||||||
|
|
||||||
int manataken = 0;
|
int mana_taken = 0;
|
||||||
int numMem = 0;
|
int mana_taken_temporary = 0;
|
||||||
int manataken_tmp = 0;
|
int member_count = 0;
|
||||||
|
|
||||||
for (const auto& m : members) {
|
for (const auto& m : members) {
|
||||||
if (m.is_bot) {
|
if (m.is_bot) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.member && m.group_number == gid && m.member->GetMaxMana() > 0) {
|
if (m.member && m.group_number == group_id && m.member->GetMaxMana() > 0) {
|
||||||
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
||||||
|
|
||||||
if (distance <= range2) {
|
if (distance <= range_squared) {
|
||||||
manataken_tmp = m.member->GetMaxMana() - m.member->GetMana();
|
mana_taken_temporary = m.member->GetMaxMana() - m.member->GetMana();
|
||||||
|
|
||||||
if (limit && (manataken_tmp > limit)) {
|
if (limit && (mana_taken_temporary > limit)) {
|
||||||
manataken_tmp = limit;
|
mana_taken_temporary = limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
manataken += manataken_tmp;
|
mana_taken += mana_taken_temporary;
|
||||||
numMem += 1;
|
member_count += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
manataken += manataken * penalty / 100;
|
mana_taken += mana_taken * penalty / 100;
|
||||||
manataken /= numMem;
|
|
||||||
|
if (member_count > 0) {
|
||||||
|
mana_taken /= member_count;
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto& m : members) {
|
for (const auto& m : members) {
|
||||||
if (m.is_bot) {
|
if (m.is_bot) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m.member && m.group_number == gid) {
|
if (m.member && m.group_number == group_id) {
|
||||||
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
distance = DistanceSquared(caster->GetPosition(), m.member->GetPosition());
|
||||||
|
|
||||||
if (distance <= range2) {
|
if (distance <= range_squared) {
|
||||||
if ((m.member->GetMaxMana() - manataken) < 1) {
|
if ((m.member->GetMaxMana() - mana_taken) < 1) {
|
||||||
m.member->SetMana(1);
|
m.member->SetMana(1);
|
||||||
|
|
||||||
if (m.member->IsClient()) {
|
if (m.member->IsClient()) {
|
||||||
m.member->CastToClient()->SendManaUpdate();
|
m.member->CastToClient()->SendManaUpdate();
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
m.member->SetMana(m.member->GetMaxMana() - mana_taken);
|
||||||
m.member->SetMana(m.member->GetMaxMana() - manataken);
|
|
||||||
|
|
||||||
if (m.member->IsClient()) {
|
if (m.member->IsClient()) {
|
||||||
m.member->CastToClient()->SendManaUpdate();
|
m.member->CastToClient()->SendManaUpdate();
|
||||||
|
|||||||
@ -167,9 +167,9 @@ public:
|
|||||||
void CastGroupSpell(Mob* caster,uint16 spellid, uint32 gid);
|
void CastGroupSpell(Mob* caster,uint16 spellid, uint32 gid);
|
||||||
void SplitExp(ExpSource exp_source, const uint64 exp, Mob* other);
|
void SplitExp(ExpSource exp_source, const uint64 exp, Mob* other);
|
||||||
uint32 GetTotalRaidDamage(Mob* other);
|
uint32 GetTotalRaidDamage(Mob* other);
|
||||||
void BalanceHP(int32 penalty, uint32 gid, float range = 0, Mob* caster = nullptr, int32 limit = 0);
|
void BalanceHP(int32 penalty, uint32 group_id, float range = 0, Mob* caster = nullptr, int32 limit = 0);
|
||||||
void BalanceMana(int32 penalty, uint32 gid, float range = 0, Mob* caster = nullptr, int32 limit = 0);
|
void BalanceMana(int32 penalty, uint32 group_id, float range = 0, Mob* caster = nullptr, int32 limit = 0);
|
||||||
void HealGroup(uint32 heal_amt, Mob* caster, uint32 gid, float range = 0);
|
void HealGroup(uint32 heal_amount, Mob* caster, uint32 group_id, float range = 0);
|
||||||
void SplitMoney(uint32 gid, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, Client *splitter = nullptr);
|
void SplitMoney(uint32 gid, uint32 copper, uint32 silver, uint32 gold, uint32 platinum, Client *splitter = nullptr);
|
||||||
|
|
||||||
void TeleportGroup(Mob* sender, uint32 zoneID, uint16 instance_id, float x, float y, float z, float heading, uint32 gid);
|
void TeleportGroup(Mob* sender, uint32 zoneID, uint16 instance_id, float x, float y, float z, float heading, uint32 gid);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user