viewing paste Unknown #14936 | Diff

Posted on the
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
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.
Viewed 564 times, submitted by Guest.