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);