[Quest API] Add Area Damage Methods to Perl/Lua. (#2549)

* [Quest API] Add Area Damage Methods to Perl/Lua.

# Perl
- Add `$mob->DamageArea(damage)`.
- Add `$mob->DamageArea(damage, distance)`.
- Add `$mob->DamageAreaBots(damage)`.
- Add `$mob->DamageAreaBots(damage, distance)`.
- Add `$mob->DamageAreaClients(damage)`.
- Add `$mob->DamageAreaClients(damage, distance)`.
- Add `$mob->DamageAreaNPCs(damage)`.
- Add `$mob->DamageAreaNPCs(damage, distance)`.
- Add `$mob->DamageAreaPercentage(damage)`.
- Add `$mob->DamageAreaPercentage(damage, distance)`.
- Add `$mob->DamageAreaBotsPercentage(damage)`.
- Add `$mob->DamageAreaBotsPercentage(damage, distance)`.
- Add `$mob->DamageAreaClientsPercentage(damage)`.
- Add `$mob->DamageAreaClientsPercentage(damage, distance)`.
- Add `$mob->DamageAreaNPCsPercentage(damage)`.
- Add `$mob->DamageAreaNPCsPercentage(damage, distance)`.

# Lua
- Add `mob:DamageArea(damage)`.
- Add `mob:DamageArea(damage, distance)`.
- Add `mob:DamageAreaBots(damage)`.
- Add `mob:DamageAreaBots(damage, distance)`.
- Add `mob:DamageAreaClients(damage)`.
- Add `mob:DamageAreaClients(damage, distance)`.
- Add `mob:DamageAreaNPCs(damage)`.
- Add `mob:DamageAreaNPCs(damage, distance)`.
- Add `mob:DamageAreaPercentage(damage)`.
- Add `mob:DamageAreaPercentage(damage, distance)`.
- Add `mob:DamageAreaBotsPercentage(damage)`.
- Add `mob:DamageAreaBotsPercentage(damage, distance)`.
- Add `mob:DamageAreaClientsPercentage(damage)`.
- Add `mob:DamageAreaClientsPercentage(damage, distance)`.
- Add `mob:DamageAreaNPCsPercentage(damage)`.
- Add `mob:DamageAreaNPCsPercentage(damage, distance)`.

# Notes
- Cleanup parameter order of damage methods.
- These methods allow you to damage all Bots, Clients, Mobs, or NPCs in a zone or by distance from the Mob.
- Fix math with percentage damage.

* Update entity.cpp
This commit is contained in:
Kinglykrab
2022-11-16 22:11:01 -05:00
committed by GitHub
parent 856aa51cb8
commit 0003f6f863
9 changed files with 373 additions and 81 deletions
+65
View File
@@ -15,6 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "../common/data_verification.h"
#include "../common/global_define.h"
#include <stdlib.h>
#include <stdio.h>
@@ -5856,3 +5857,67 @@ void EntityList::Marquee(
}
}
}
std::vector<Mob*> EntityList::GetFilteredEntityList(Mob* sender, uint32 distance, uint8 filter_type)
{
std::vector<Mob *> l;
if (!sender) {
return l;
}
const auto squared_distance = (distance * distance);
const auto position = sender->GetPosition();
for (auto &m: mob_list) {
if (!m.second) {
continue;
}
if (m.second == sender) {
continue;
}
if (
distance &&
DistanceSquaredNoZ(
position,
m.second->GetPosition()
) > squared_distance
) {
continue;
}
if (
(filter_type == EntityFilterTypes::Bots && !m.second->IsBot()) ||
(filter_type == EntityFilterTypes::Clients && !m.second->IsClient()) ||
(filter_type == EntityFilterTypes::NPCs && !m.second->IsNPC())
) {
continue;
}
l.push_back(m.second);
}
return l;
}
void EntityList::DamageArea(Mob* sender, int64 damage, uint32 distance, uint8 filter_type, bool is_percentage)
{
if (!sender) {
return;
}
if (damage <= 0) {
return;
}
const auto& l = GetFilteredEntityList(sender, distance, filter_type);
for (const auto& e : l) {
if (is_percentage) {
const auto damage_percentage = EQ::Clamp(damage, static_cast<int64>(1), static_cast<int64>(100));
const auto total_damage = (e->GetMaxHP() / 100) * damage_percentage;
e->Damage(sender, total_damage, SPELL_UNKNOWN, EQ::skills::SkillEagleStrike);
} else {
e->Damage(sender, damage, SPELL_UNKNOWN, EQ::skills::SkillEagleStrike);
}
}
}