mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-11 11:48: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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user