From 91ea6462f2c87efb4e4ad52b0b97305bfb761235 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Tue, 6 Dec 2022 08:38:51 -0500 Subject: [PATCH] [Quest API] Add CopyHateList() to Perl/Lua. (#2623) * [Quest API] Add CopyHateList() to Perl/Lua. # Perl - Add `$mob->CopyHateList(to_mob)`. # Lua - Add `mob:CopyHateList(to_mob)`. # Notes - Allows operators to easily copy and entire hatelist from one mob to another. * Update mob.cpp --- zone/lua_mob.cpp | 6 ++++++ zone/lua_mob.h | 1 + zone/mob.cpp | 12 ++++++++++++ zone/mob.h | 2 ++ zone/perl_mob.cpp | 6 ++++++ 5 files changed, 27 insertions(+) diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index 75f61b1b3..9034b21e3 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -2747,6 +2747,11 @@ void Lua_Mob::SendPayload(int payload_id, std::string payload_value) { } } +void Lua_Mob::CopyHateList(Lua_Mob to) { + Lua_Safe_Call_Void(); + self->CopyHateList(to); +} + #ifdef BOTS void Lua_Mob::DamageAreaBots(int64 damage) { Lua_Safe_Call_Void(); @@ -2898,6 +2903,7 @@ luabind::scope lua_register_mob() { .def("CloneAppearance", (void(Lua_Mob::*)(Lua_Mob))&Lua_Mob::CloneAppearance) .def("CloneAppearance", (void(Lua_Mob::*)(Lua_Mob,bool))&Lua_Mob::CloneAppearance) .def("CombatRange", (bool(Lua_Mob::*)(Lua_Mob))&Lua_Mob::CombatRange) + .def("CopyHateList", (void(Lua_Mob::*)(Lua_Mob))&Lua_Mob::CopyHateList) .def("Damage", (void(Lua_Mob::*)(Lua_Mob,int64,int,int))&Lua_Mob::Damage) .def("Damage", (void(Lua_Mob::*)(Lua_Mob,int64,int,int,bool))&Lua_Mob::Damage) .def("Damage", (void(Lua_Mob::*)(Lua_Mob,int64,int,int,bool,int))&Lua_Mob::Damage) diff --git a/zone/lua_mob.h b/zone/lua_mob.h index cb13c591d..8d15b1953 100644 --- a/zone/lua_mob.h +++ b/zone/lua_mob.h @@ -519,6 +519,7 @@ public: void DamageHateListNPCs(int64 damage, uint32 distance); void DamageHateListNPCsPercentage(int64 damage); void DamageHateListNPCsPercentage(int64 damage, uint32 distance); + void CopyHateList(Lua_Mob to); }; #endif diff --git a/zone/mob.cpp b/zone/mob.cpp index 2633a3654..902ebb112 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -7051,3 +7051,15 @@ void Mob::CloneAppearance(Mob* other, bool clone_name) TempName(other->GetCleanName()); } } + +void Mob::CopyHateList(Mob* to) { + if (hate_list.IsHateListEmpty() || !to || to->IsClient()) { + return; + } + + for (const auto& h : hate_list.GetHateList()) { + if (h->entity_on_hatelist) { + to->AddToHateList(h->entity_on_hatelist, h->stored_hate_amount, h->hatelist_damage); + } + } +} diff --git a/zone/mob.h b/zone/mob.h index cb8e5e81f..a45e88baf 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -654,6 +654,8 @@ public: inline const bool AlwaysAggro() const { return always_aggro; } inline int32 GetHeroicStrikethrough() const { return heroic_strikethrough; } + void CopyHateList(Mob* to); + //Group virtual bool HasRaid() = 0; virtual bool HasGroup() = 0; diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index 772fd4f0b..ea6039289 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -2678,6 +2678,11 @@ void Perl_Mob_SetEntityVariable(Mob* self, std::string variable_name, std::strin self->SetEntityVariable(variable_name, variable_value); } +void Perl_Mob_CopyHateList(Mob* self, Mob* to) +{ + self->CopyHateList(to); +} + #ifdef BOTS void Perl_Mob_DamageAreaBots(Mob* self, int64 damage) // @categories Hate and Aggro { @@ -2827,6 +2832,7 @@ void perl_register_mob() package.add("CloneAppearance", (void(*)(Mob*, Mob*))&Perl_Mob_CloneAppearance); package.add("CloneAppearance", (void(*)(Mob*, Mob*, bool))&Perl_Mob_CloneAppearance); package.add("CombatRange", &Perl_Mob_CombatRange); + package.add("CopyHateList", &Perl_Mob_CopyHateList); package.add("Damage", (void(*)(Mob*, Mob*, int64, uint16_t, int))&Perl_Mob_Damage); package.add("Damage", (void(*)(Mob*, Mob*, int64, uint16_t, int, bool))&Perl_Mob_Damage); package.add("Damage", (void(*)(Mob*, Mob*, int64, uint16_t, int, bool, int8_t))&Perl_Mob_Damage);