From eeddf631e8a0a10ea25035554d08c2f2f77005e3 Mon Sep 17 00:00:00 2001 From: csnv Date: Mon, 13 Nov 2023 17:50:26 +0100 Subject: [PATCH] Fixed songs not triggering onleft events on dissonance --- src/map/skill.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/map/skill.c b/src/map/skill.c index 4d3bb0e176a..85eb061533e 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -14923,6 +14923,7 @@ static int skill_unit_onleft(uint16 skill_id, struct block_list *bl, int64 tick) * flag values: * flag&1: Invoke onplace function (otherwise invoke onout) * flag&4: Invoke a onleft call (the unit might be scheduled for deletion) + * flag&8: Skip initial check for dissonance *------------------------------------------*/ static int skill_unit_effect(struct block_list *bl, va_list ap) { @@ -14931,7 +14932,7 @@ static int skill_unit_effect(struct block_list *bl, va_list ap) int64 tick = va_arg(ap,int64); unsigned int flag = va_arg(ap,unsigned int); uint16 skill_id; - bool dissonance; + bool dissonance = false; nullpo_ret(bl); nullpo_ret(su); @@ -14942,7 +14943,8 @@ static int skill_unit_effect(struct block_list *bl, va_list ap) nullpo_ret(group); - dissonance = skill->dance_switch(su, 0); + if ((flag & 8) == 0) + dissonance = skill->dance_switch(su, 0); //Necessary in case the group is deleted after calling on_place/on_out [Skotlex] skill_id = group->skill_id; @@ -14960,7 +14962,11 @@ static int skill_unit_effect(struct block_list *bl, va_list ap) skill->unit_onleft(skill_id, bl, tick); } - if( dissonance ) skill->dance_switch(su, 1); + if (dissonance) { + skill->dance_switch(su, 1); + // su was changed to dissonance, trigger songs being terminated + map->foreachincell(skill->unit_effect, su->bl.m, su->bl.x, su->bl.y, group->bl_flag, &su->bl, timer->gettick(), 4 | 8); + } return 0; } @@ -19407,7 +19413,10 @@ static int skill_unit_move_sub(struct block_list *bl, va_list ap) if( su->group->interval != -1 && !(skill->get_unit_flag(skill_id)&UF_DUALMODE) && skill_id != BD_LULLABY ) { //Lullaby is the exception, bugreport:411 //Non-dualmode unit skills with a timer don't trigger when walking, so just return - if( dissonance ) skill->dance_switch(su, 1); + if (dissonance) { + skill->dance_switch(su, 1); + skill->unit_onleft(skill->unit_onout(su, target, tick), target, tick); // su was changed to dissonance, trigger songs being terminated + } return 0; }