mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-17 07:18:37 +00:00
[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:
+31
-25
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user