[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
+31 -25
View File
@@ -1005,43 +1005,49 @@ void HateList::DamageHateList(int64 damage, uint32 distance, uint8 filter_type,
return;
}
const auto& h_list = GetFilteredHateList(distance, filter_type);
for (const auto& h : h_list) {
auto hate_entry = h->entity_on_hatelist;
const auto& l = GetFilteredHateList(distance, filter_type);
for (const auto& h : l) {
auto e = h->entity_on_hatelist;
if (is_percentage) {
const auto damage_percentage = EQ::Clamp(damage, static_cast<int64>(1), static_cast<int64>(100));
const auto total_damage = hate_entry->GetMaxHP() / damage_percentage * 100;
hate_entry->Damage(hate_owner, total_damage, SPELL_UNKNOWN, EQ::skills::SkillEagleStrike);
const auto total_damage = (e->GetMaxHP() / 100) * damage_percentage;
e->Damage(hate_owner, total_damage, SPELL_UNKNOWN, EQ::skills::SkillEagleStrike);
} else {
hate_entry->Damage(hate_owner, damage, SPELL_UNKNOWN, EQ::skills::SkillEagleStrike);
e->Damage(hate_owner, damage, SPELL_UNKNOWN, EQ::skills::SkillEagleStrike);
}
}
}
std::list<struct_HateList*> HateList::GetFilteredHateList(uint32 distance, uint8 filter_type)
{
std::list<struct_HateList*> filtered_hate_list;
std::list<struct_HateList*> l;
const auto squared_distance = (distance * distance);
for (auto h : list) {
auto hate_entry = h->entity_on_hatelist;
if (
(
!distance ||
DistanceSquaredNoZ(
hate_owner->GetPosition(),
hate_entry->GetPosition()
) <= squared_distance
) &&
(
filter_type == HateListFilterTypes::All ||
(filter_type == HateListFilterTypes::Bots && hate_entry->IsBot()) ||
(filter_type == HateListFilterTypes::Clients && hate_entry->IsClient()) ||
(filter_type == HateListFilterTypes::NPCs && hate_entry->IsNPC())
)
) {
filtered_hate_list.push_back(h);
auto e = h->entity_on_hatelist;
if (!e) {
continue;
}
if (
distance &&
DistanceSquaredNoZ(
hate_owner->GetPosition(),
e->GetPosition()
) > squared_distance
) {
continue;
}
if (
(filter_type == EntityFilterTypes::Bots && !e->IsBot()) ||
(filter_type == EntityFilterTypes::Clients && !e->IsClient()) ||
(filter_type == EntityFilterTypes::NPCs && !e->IsNPC())
) {
continue;
}
l.push_back(h);
}
return filtered_hate_list;
return l;
}