diff --git a/conf/battle/skill.conf b/conf/battle/skill.conf index 8499897..10cca4a 100644 --- a/conf/battle/skill.conf +++ b/conf/battle/skill.conf @@ -127,6 +127,13 @@ traps_setting: 0 // one hydra out) summon_flora_setting: 3 +// When songs are canceled, terminated or the character goes out of the +// area of effect, there's an additional effect that lasts for 20 seconds +// Should that time be reset for each song? +// 0: No, you must recast the song AFTER those 20 seconds to have the effect again (Aegis) +// 1: Yes, recasting songs reset the 20 seconds timer (eathena) +song_timer_reset: 0 + // Whether placed down skills will check walls (Note 1) // (Makes it so that Storm Gust/Lord of Vermillion/etc when cast next to a wall, won't hit on the other side) skill_wall_check: yes diff --git a/src/map/battle.c b/src/map/battle.c index 30b3584..8930d3a 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -6733,6 +6733,7 @@ bool battle_check_range(struct block_list *src, struct block_list *bl, int range { "mail_show_status", &battle_config.mail_show_status, 0, 0, 2, }, { "client_limit_unit_lv", &battle_config.client_limit_unit_lv, 0, 0, BL_ALL, }, { "client_emblem_max_blank_percent", &battle_config.client_emblem_max_blank_percent, 100, 0, 100, }, + { "song_timer_reset", &battle_config.song_timer_reset, 0, 0, 1, }, // BattleGround Settings { "bg_update_interval", &battle_config.bg_update_interval, 1000, 100, INT_MAX, }, { "bg_flee_penalty", &battle_config.bg_flee_penalty, 20, 0, INT_MAX, }, diff --git a/src/map/battle.h b/src/map/battle.h index 8d1a3cd..161ddeb 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -169,6 +169,7 @@ struct Battle_Config { int emergency_call; int guild_aura; int pc_invincible_time; + int song_timer_reset; int pet_catch_rate; int pet_rename; diff --git a/src/map/skill.c b/src/map/skill.c index 3e3a650..53ac907 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -11458,13 +11458,15 @@ int skill_unit_onplace(struct skill_unit *src, struct block_list *bl, int64 tick return 0; if (!sc) return 0; - if (!sce) - sc_start4(ss,bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,sg->limit); - else if (sce->val4 == 1) { - //Readjust timers since the effect will not last long. - sce->val4 = 0; - timer->delete(sce->timer, status->change_timer); - sce->timer = timer->add(tick+sg->limit, status->change_timer, bl->id, type); + if (battle_config.song_timer_reset) { // Aegis like behaviour goes on skill_unit_onplace_timer + if (!sce) + sc_start4(ss,bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,sg->limit); + else if (sce->val4 == 1) { + //Readjust timers since the effect will not last long. + sce->val4 = 0; + timer->delete(sce->timer, status->change_timer); + sce->timer = timer->add(tick+sg->limit, status->change_timer, bl->id, type); + } } break; @@ -11848,6 +11850,12 @@ int skill_unit_onplace_timer(struct skill_unit *src, struct block_list *bl, int6 heal = ~heal + 1; clif->skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); status->heal(bl, heal, 0, 0); + + if (!(battle_config.song_timer_reset) // songs don't reset prior timers + && !(sg->src_id==bl->id && !(tsc && tsc->data[SC_SOULLINK] && tsc->data[SC_SOULLINK]->val2 == SL_BARDDANCER)) // Don't affect itself + && (!(tsc->data[type]) || (tsc->data[type] && tsc->data[type]->val4 != 1))) // Check for 20 seconds song effect + sc_start4(ss,bl,type,100,sg->skill_lv,sg->val1,sg->val2,0,sg->interval + 100); + break; } @@ -12362,7 +12370,7 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, int64 tick) { case DC_DONTFORGETME: case DC_FORTUNEKISS: case DC_SERVICEFORYOU: - if (sce) { + if ((battle_config.song_timer_reset && sce) || (!battle_config.song_timer_reset && sce && sce->val4 != 1)) { timer->delete(sce->timer, status->change_timer); //NOTE: It'd be nice if we could get the skill_lv for a more accurate extra time, but alas... //not possible on our current implementation.