diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index 641340e54..0e644f4f2 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -3446,6 +3446,36 @@ void Lua_Mob::MassGroupBuff(Lua_Mob center, uint16 spell_id, bool affect_caster) entity_list.MassGroupBuff(self, center, spell_id, affect_caster); } +void Lua_Mob::BuffFadeBeneficial() +{ + Lua_Safe_Call_Void(); + self->BuffFadeBeneficial(); +} + +void Lua_Mob::BuffFadeDetrimental() +{ + Lua_Safe_Call_Void(); + self->BuffFadeDetrimental(); +} + +void Lua_Mob::BuffFadeDetrimentalByCaster(Lua_Mob caster) +{ + Lua_Safe_Call_Void(); + self->BuffFadeDetrimentalByCaster(caster); +} + +void Lua_Mob::BuffFadeNonPersistDeath() +{ + Lua_Safe_Call_Void(); + self->BuffFadeNonPersistDeath(); +} + +void Lua_Mob::BuffFadeSongs() +{ + Lua_Safe_Call_Void(); + self->BuffFadeSongs(); +} + luabind::scope lua_register_mob() { return luabind::class_("Mob") .def(luabind::constructor<>()) @@ -3483,11 +3513,16 @@ luabind::scope lua_register_mob() { .def("BuffCount", (uint32(Lua_Mob::*)(bool))&Lua_Mob::BuffCount) .def("BuffCount", (uint32(Lua_Mob::*)(bool,bool))&Lua_Mob::BuffCount) .def("BuffFadeAll", (void(Lua_Mob::*)(void))&Lua_Mob::BuffFadeAll) + .def("BuffFadeBeneficial", (void(Lua_Mob::*)(void))&Lua_Mob::BuffFadeBeneficial) .def("BuffFadeByEffect", (void(Lua_Mob::*)(int))&Lua_Mob::BuffFadeByEffect) .def("BuffFadeByEffect", (void(Lua_Mob::*)(int,int))&Lua_Mob::BuffFadeByEffect) .def("BuffFadeBySlot", (void(Lua_Mob::*)(int))&Lua_Mob::BuffFadeBySlot) .def("BuffFadeBySlot", (void(Lua_Mob::*)(int,bool))&Lua_Mob::BuffFadeBySlot) .def("BuffFadeBySpellID", (void(Lua_Mob::*)(int))&Lua_Mob::BuffFadeBySpellID) + .def("BuffFadeDetrimental", (void(Lua_Mob::*)(void))&Lua_Mob::BuffFadeDetrimental) + .def("BuffFadeDetrimentalByCaster", (void(Lua_Mob::*)(Lua_Mob))&Lua_Mob::BuffFadeDetrimentalByCaster) + .def("BuffFadeNonPersistDeath", (void(Lua_Mob::*)(void))&Lua_Mob::BuffFadeNonPersistDeath) + .def("BuffFadeSongs", (void(Lua_Mob::*)(void))&Lua_Mob::BuffFadeSongs) .def("CalculateDistance", (float(Lua_Mob::*)(double,double,double))&Lua_Mob::CalculateDistance) .def("CalculateDistance", (float(Lua_Mob::*)(Lua_Mob))&Lua_Mob::CalculateDistance) .def("CalculateHeadingToTarget", (double(Lua_Mob::*)(double,double))&Lua_Mob::CalculateHeadingToTarget) diff --git a/zone/lua_mob.h b/zone/lua_mob.h index d3fae9f1b..2e42bd9f6 100644 --- a/zone/lua_mob.h +++ b/zone/lua_mob.h @@ -605,6 +605,11 @@ public: void AreaSpell(Lua_Mob center, uint16 spell_id, bool affect_caster, int16 resist_adjust, int max_targets); void MassGroupBuff(Lua_Mob center, uint16 spell_id); void MassGroupBuff(Lua_Mob center, uint16 spell_id, bool affect_caster); + void BuffFadeBeneficial(); + void BuffFadeDetrimental(); + void BuffFadeDetrimentalByCaster(Lua_Mob caster); + void BuffFadeNonPersistDeath(); + void BuffFadeSongs(); }; #endif diff --git a/zone/mob.h b/zone/mob.h index 31f189cbb..8914534cb 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -447,6 +447,7 @@ public: void BuffFadeBySlot(int slot, bool iRecalcBonuses = true); void BuffFadeDetrimentalByCaster(Mob *caster); void BuffFadeBySitModifier(); + void BuffFadeSongs(); void BuffDetachCaster(Mob *caster); bool IsAffectedByBuffByGlobalGroup(GlobalGroup group); void BuffModifyDurationBySpellID(uint16 spell_id, int32 newDuration); diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index 045ea4600..a4042dc4b 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -3543,6 +3543,31 @@ void Perl_Mob_MassGroupBuff(Mob* self, Mob* center, uint16 spell_id, bool affect entity_list.MassGroupBuff(self, center, spell_id, affect_caster); } +void Perl_Mob_BuffFadeBeneficial(Mob* self) +{ + self->BuffFadeBeneficial(); +} + +void Perl_Mob_BuffFadeDetrimental(Mob* self) +{ + self->BuffFadeDetrimental(); +} + +void Perl_Mob_BuffFadeDetrimentalByCaster(Mob* self, Mob* caster) +{ + self->BuffFadeDetrimentalByCaster(caster); +} + +void Perl_Mob_BuffFadeNonPersistDeath(Mob* self) +{ + self->BuffFadeNonPersistDeath(); +} + +void Perl_Mob_BuffFadeSongs(Mob* self) +{ + self->BuffFadeSongs(); +} + void perl_register_mob() { perl::interpreter perl(PERL_GET_THX); @@ -3578,11 +3603,16 @@ void perl_register_mob() package.add("BuffCount", (uint32(*)(Mob*, bool))&Perl_Mob_BuffCount); package.add("BuffCount", (uint32(*)(Mob*, bool, bool))&Perl_Mob_BuffCount); package.add("BuffFadeAll", &Perl_Mob_BuffFadeAll); + package.add("BuffFadeBeneficial", &Perl_Mob_BuffFadeBeneficial); package.add("BuffFadeByEffect", (void(*)(Mob*, int))&Perl_Mob_BuffFadeByEffect); package.add("BuffFadeByEffect", (void(*)(Mob*, int, int))&Perl_Mob_BuffFadeByEffect); package.add("BuffFadeBySlot", (void(*)(Mob*, int))&Perl_Mob_BuffFadeBySlot); package.add("BuffFadeBySlot", (void(*)(Mob*, int, bool))&Perl_Mob_BuffFadeBySlot); package.add("BuffFadeBySpellID", &Perl_Mob_BuffFadeBySpellID); + package.add("BuffFadeDetrimental", &Perl_Mob_BuffFadeDetrimental); + package.add("BuffFadeDetrimentalByCaster", &Perl_Mob_BuffFadeDetrimentalByCaster); + package.add("BuffFadeNonPersistDeath", &Perl_Mob_BuffFadeNonPersistDeath); + package.add("BuffFadeSongs", &Perl_Mob_BuffFadeSongs); package.add("CalculateDistance", (float(*)(Mob*, float, float, float))&Perl_Mob_CalculateDistance); package.add("CalculateDistance", (float(*)(Mob*, Mob*))&Perl_Mob_CalculateDistance); package.add("CalculateHeadingToTarget", &Perl_Mob_CalculateHeadingToTarget); diff --git a/zone/spells.cpp b/zone/spells.cpp index df3fe0dbf..05755f929 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -4984,6 +4984,23 @@ void Mob::BuffFadeByEffect(int effect_id, int slot_to_skip) } } +void Mob::BuffFadeSongs() { + bool recalc_bonus = false; + int buff_count = GetMaxTotalSlots(); + + for (int buff_slot = 0; buff_slot < buff_count; buff_slot++) { + const uint16 current_spell_id = buffs[buff_slot].spellid; + if (IsBardSong(current_spell_id)) { + BuffFadeBySlot(buff_slot, false); + recalc_bonus = true; + } + } + + if (recalc_bonus) { + CalcBonuses(); + } +} + bool Mob::IsAffectedByBuffByGlobalGroup(GlobalGroup group) { int buff_count = GetMaxTotalSlots();