[Quest API] Add Mob Hate Methods to Perl/Lua. (#2548)

* [Quest API] Add Mob Hate Methods to Perl/Lua.

# Perl
- Add `$mob->DamageHateList(damage)` to Perl.
- Add `$mob->DamageHateList(damage, distance)` to Perl.
- Add `$mob->DamageHateListPercentage(damage)` to Perl.
- Add `$mob->DamageHateListPercentage(damage, distance)` to Perl.
- Add `$mob->DamageHateListBots(damage)` to Perl.
- Add `$mob->DamageHateListBots(damage, distance)` to Perl.
- Add `$mob->DamageHateListBotsPercentage(damage)` to Perl.
- Add `$mob->DamageHateListBotsPercentage(damage, distance)` to Perl.
- Add `$mob->DamageHateListClients(damage)` to Perl.
- Add `$mob->DamageHateListClients(damage, distance)` to Perl.
- Add `$mob->DamageHateListClientsPercentage(damage)` to Perl.
- Add `$mob->DamageHateListClientsPercentage(damage, distance)` to Perl.
- Add `$mob->DamageHateListNPCs(damage)` to Perl.
- Add `$mob->DamageHateListNPCs(damage, distance)` to Perl.
- Add `$mob->DamageHateListNPCsPercentage(damage)` to Perl.
- Add `$mob->DamageHateListNPCsPercentage(damage, distance)` to Perl.
- Add `$mob->GetHateListBots()` to Perl.
- Add `$mob->GetHateListBots(distance)` to Perl.
- Add `$mob->GetHateListClients()` to Perl.
- Add `$mob->GetHateListClients(distance)` to Perl.
- Add `$mob->GetHateListNPCs()` to Perl.
- Add `$mob->GetHateListNPCs(distance)` to Perl.

# Lua
- Add `mob:DamageHateList(damage)` to Lua.
- Add `mob:DamageHateList(damage, distance)` to Lua.
- Add `mob:DamageHateListPercentage(damage)` to Lua.
- Add `mob:DamageHateListPercentage(damage, distance)` to Lua.
- Add `mob:DamageHateListBots(damage)` to Lua.
- Add `mob:DamageHateListBots(damage, distance)` to Lua.
- Add `mob:DamageHateListBotsPercentage(damage)` to Lua.
- Add `mob:DamageHateListBotsPercentage(damage, distance)` to Lua.
- Add `mob:DamageHateListClients(damage)` to Lua.
- Add `mob:DamageHateListClients(damage, distance)` to Lua.
- Add `mob:DamageHateListClientsPercentage(damage)` to Lua.
- Add `mob:DamageHateListClientsPercentage(damage, distance)` to Lua.
- Add `mob:DamageHateListNPCs(damage)` to Lua.
- Add `mob:DamageHateListNPCs(damage, distance)` to Lua.
- Add `mob:DamageHateListNPCsPercentage(damage)` to Lua.
- Add `mob:DamageHateListNPCsPercentage(damage, distance)` to Lua.
- Add `mob:GetHateListBots()` to Lua.
- Add `mob:GetHateListBots(distance)` to Lua.
- Add `mob:GetHateListClients()` to Lua.
- Add `mob:GetHateListClients(distance)` to Lua.
- Add `mob:GetHateListNPCs()` to Lua.
- Add `mob:GetHateListNPCs(distance)` to Lua.

# Notes
- Offers an extreme amount of short hands when grabbing hate list entities by a specific type or damaging a specific type of entity on an NPC's hatelist.
- Should save operators having to use `GetHateList()` then loop it to get the entries they want to do something.

* Cleanup.
This commit is contained in:
Kinglykrab
2022-11-16 08:16:47 -05:00
committed by GitHub
parent 6ff52f94c4
commit 8c994fef97
6 changed files with 485 additions and 36 deletions
+47 -13
View File
@@ -850,19 +850,6 @@ void HateList::RemoveStaleEntries(int time_ms, float dist)
}
}
std::list<struct_HateList*> HateList::GetHateListByDistance(int distance)
{
std::list<struct_HateList*> hate_list;
int squared_distance = (distance * distance);
for (auto hate_iterator : list) {
auto hate_entry = hate_iterator->entity_on_hatelist;
if (distance == 0 || (distance > 0 && DistanceSquaredNoZ(hate_owner->GetPosition(), hate_entry->GetPosition()) <= squared_distance)) {
hate_list.push_back(hate_iterator);
}
}
return hate_list;
}
#ifdef BOTS
Bot* HateList::GetRandomBotOnHateList(bool skip_mezzed)
{
@@ -1011,3 +998,50 @@ NPC* HateList::GetRandomNPCOnHateList(bool skip_mezzed)
return nullptr;
}
void HateList::DamageHateList(int64 damage, uint32 distance, uint8 filter_type, bool is_percentage)
{
if (damage <= 0) {
return;
}
const auto& h_list = GetFilteredHateList(distance, filter_type);
for (const auto& h : h_list) {
auto hate_entry = 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);
} else {
hate_entry->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;
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);
}
}
return filtered_hate_list;
}