Several no-damage status change skills updated
* Scream and Frost Joke (fixes #945) -- The delay until the status change kicks in was increased from 2s to 3s -- Aftercast delay in pre-renewal was increased from 3s to 4s (already 4s in renewal) -- Duration of Freeze from Frost Joke increased from 10-14s to 30s * Hammer Fall, Lex Divina and offensive Status Recovery (fixes #945) -- A delay of 1 second until the status change kicks in was added -- Hammer Fall will hit the targets that are in the AoE before the delay (so you can't dodge) -- Offensive Status Recovery's base duration reduced from 30s to 20s and base chance increased to 100% -- Increased the maximum number of skill timers from 15 to 40 as they are needed for delayed status changes * Stone and Freeze now remove Lex Aeterna (fixes #947) -- For stone this refers to the second phase * Scream, Frost Joke and Hammer Fall no longer make a target stop (fixes #948) -- Similar behavior to e.g. Ankle Snare against bosses or in WoE -- If the target was singing/dancing, it will still stop and the song/dance will be canceled -- Fixed a bug that caused position lag when targets that are still moving but can't move anymore are hit
This commit is contained in:
@@ -135,7 +135,7 @@
|
||||
//-- PR_SLOWPOISON
|
||||
71,0,0,0,10000:20000:30000:40000,0,0
|
||||
//-- PR_STRECOVERY
|
||||
72,0,2000,0,0,30000,0
|
||||
72,0,2000,0,0,20000,0
|
||||
//-- PR_KYRIE
|
||||
73,2000,2000,0,120000,0,0
|
||||
//-- PR_MAGNIFICAT
|
||||
@@ -143,7 +143,7 @@
|
||||
//-- PR_GLORIA
|
||||
75,0,2000,0,10000:15000:20000:25000:30000,0,0
|
||||
//-- PR_LEXDIVINA
|
||||
76,0,3000,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0
|
||||
76,0,3000,0,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0
|
||||
//-- PR_TURNUNDEAD
|
||||
77,1000,3000,0,0,0,0
|
||||
//-- PR_LEXAETERNA
|
||||
@@ -472,7 +472,7 @@
|
||||
//-- BA_DISSONANCE
|
||||
317,0,0,0,30000,3000,0
|
||||
//-- BA_FROSTJOKE
|
||||
318,0,3000,0,0,10000:11000:12000:13000:14000,0
|
||||
318,0,4000,0,0,30000,0
|
||||
//-- BA_WHISTLE
|
||||
319,0,0,0,60000,20000,0
|
||||
//-- BA_ASSASSINCROSS
|
||||
@@ -490,7 +490,7 @@
|
||||
//-- DC_UGLYDANCE
|
||||
325,0,0,0,30000,3000,0
|
||||
//-- DC_SCREAM
|
||||
326,0,3000,0,0,5000,0
|
||||
326,0,4000,0,0,5000,0
|
||||
//-- DC_HUMMING
|
||||
327,0,0,0,60000,20000,0
|
||||
//-- DC_DONTFORGETME
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
//-- PR_SLOWPOISON
|
||||
71,0,0,0,10000:20000:30000:40000,0,0,0
|
||||
//-- PR_STRECOVERY
|
||||
72,0,2000,0,0,30000,0,0
|
||||
72,0,2000,0,0,20000,0,0
|
||||
//-- PR_KYRIE
|
||||
73,1600,2000,0,120000,0,0,400
|
||||
//-- PR_MAGNIFICAT
|
||||
@@ -143,7 +143,7 @@
|
||||
//-- PR_GLORIA
|
||||
75,0,2000,0,10000:15000:20000:25000:30000,0,0,0
|
||||
//-- PR_LEXDIVINA
|
||||
76,0,3000,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0,0
|
||||
76,0,3000,0,0,30000:35000:40000:45000:50000:60000:60000:60000:60000:60000,0,0
|
||||
//-- PR_TURNUNDEAD
|
||||
77,800,3000,0,0,0,0,200
|
||||
//-- PR_LEXAETERNA
|
||||
@@ -466,7 +466,7 @@
|
||||
//-- BA_DISSONANCE
|
||||
317,0,0,0,30000,3000,0,0
|
||||
//-- BA_FROSTJOKER
|
||||
318,0,4000,0,0,10000:11000:12000:13000:14000,0,0
|
||||
318,0,4000,0,0,30000,0,0
|
||||
//-- BA_WHISTLE
|
||||
319,0,0,0,60000,20000,0,0
|
||||
//-- BA_ASSASSINCROSS
|
||||
|
||||
@@ -252,7 +252,7 @@ struct block_list* battle_getenemyarea(struct block_list *src, int x, int y, int
|
||||
* @param skill_lv: Level of skill used
|
||||
* @param skill_id: ID o skill used
|
||||
* @param dmg_lv: State of the attack (miss, etc.)
|
||||
* @param attack_type: Damage delay
|
||||
* @param attack_type: Type of the attack (BF_NORMAL|BF_SKILL|BF_SHORT|BF_LONG|BF_WEAPON|BF_MAGIC|BF_MISC)
|
||||
* @param additional_effects: Whether additional effect should be applied
|
||||
* @param tick: Current tick
|
||||
*------------------------------------------*/
|
||||
|
||||
@@ -3892,6 +3892,11 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
|
||||
map_foreachinarea(skill_frostjoke_scream,skl->map,skl->x-range,skl->y-range,
|
||||
skl->x+range,skl->y+range,BL_CHAR,src,skl->skill_id,skl->skill_lv,tick);
|
||||
break;
|
||||
case PR_LEXDIVINA:
|
||||
case PR_STRECOVERY:
|
||||
case BS_HAMMERFALL:
|
||||
sc_start(src, target, status_skill2sc(skl->skill_id), skl->type, skl->skill_lv, skill_get_time2(skl->skill_id, skl->skill_lv));
|
||||
break;
|
||||
case NPC_EARTHQUAKE:
|
||||
if( skl->type > 1 )
|
||||
skill_addtimerskill(src,tick+250,src->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag);
|
||||
@@ -5998,10 +6003,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
|
||||
case PR_LEXDIVINA:
|
||||
case MER_LEXDIVINA:
|
||||
if( tsce )
|
||||
status_change_end(bl,type, INVALID_TIMER);
|
||||
if (tsce)
|
||||
status_change_end(bl, type, INVALID_TIMER);
|
||||
else
|
||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||
skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, 100, flag);
|
||||
clif_skill_nodamage (src, bl, skill_id, skill_lv, 1);
|
||||
break;
|
||||
|
||||
@@ -6699,9 +6704,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
|
||||
case BS_HAMMERFALL:
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
||||
sc_start(src,bl,SC_STUN,(20 + 10 * skill_lv),skill_lv,skill_get_time2(skill_id,skill_lv)));
|
||||
skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, (20 + 10 * skill_lv), flag);
|
||||
break;
|
||||
|
||||
case RG_RAID:
|
||||
skill_area_temp[1] = 0;
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
@@ -6971,7 +6976,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case BA_FROSTJOKER:
|
||||
case DC_SCREAM:
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
skill_addtimerskill(src,tick+2000,bl->id,src->x,src->y,skill_id,skill_lv,0,flag);
|
||||
skill_addtimerskill(src,tick+3000,bl->id,src->x,src->y,skill_id,skill_lv,0,flag);
|
||||
|
||||
if (md) {
|
||||
// custom hack to make the mob display the skill, because these skills don't show the skill use text themselves
|
||||
@@ -7098,14 +7103,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
status_change_end(bl, SC_WHITEIMPRISON, INVALID_TIMER);
|
||||
}
|
||||
status_change_end(bl, SC_STASIS, INVALID_TIMER);
|
||||
//Is this equation really right? It looks so... special.
|
||||
if(battle_check_undead(tstatus->race,tstatus->def_ele))
|
||||
{
|
||||
status_change_start(src,bl, SC_BLIND,
|
||||
100*(100-(tstatus->int_/2+tstatus->vit/3+tstatus->luk/10)),
|
||||
1,0,0,0,
|
||||
skill_get_time2(skill_id, skill_lv) * (100-(tstatus->int_+tstatus->vit)/2)/100,SCSTART_NONE);
|
||||
}
|
||||
skill_addtimerskill(src, tick+1000, bl->id, 0, 0, skill_id, skill_lv, 100, flag);
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
if(dstmd)
|
||||
mob_unlocktarget(dstmd,tick);
|
||||
|
||||
@@ -242,7 +242,7 @@ struct s_skill_nounit_layout {
|
||||
int dy[MAX_SKILL_UNIT_COUNT];
|
||||
};
|
||||
|
||||
#define MAX_SKILLTIMERSKILL 15
|
||||
#define MAX_SKILLTIMERSKILL 40
|
||||
struct skill_timerskill {
|
||||
int timer;
|
||||
int src_id;
|
||||
|
||||
@@ -255,6 +255,7 @@ void initChangeTables(void)
|
||||
set_sc( PR_KYRIE , SC_KYRIE , SI_KYRIE , SCB_NONE );
|
||||
set_sc( PR_MAGNIFICAT , SC_MAGNIFICAT , SI_MAGNIFICAT , SCB_REGEN );
|
||||
set_sc( PR_GLORIA , SC_GLORIA , SI_GLORIA , SCB_LUK );
|
||||
add_sc( PR_STRECOVERY , SC_BLIND );
|
||||
add_sc( PR_LEXDIVINA , SC_SILENCE );
|
||||
set_sc( PR_LEXAETERNA , SC_AETERNA , SI_AETERNA , SCB_NONE );
|
||||
add_sc( WZ_METEOR , SC_STUN );
|
||||
@@ -262,6 +263,7 @@ void initChangeTables(void)
|
||||
add_sc( WZ_FROSTNOVA , SC_FREEZE );
|
||||
add_sc( WZ_STORMGUST , SC_FREEZE );
|
||||
set_sc( WZ_QUAGMIRE , SC_QUAGMIRE , SI_QUAGMIRE , SCB_AGI|SCB_DEX|SCB_ASPD|SCB_SPEED );
|
||||
add_sc( BS_HAMMERFALL , SC_STUN );
|
||||
set_sc( BS_ADRENALINE , SC_ADRENALINE , SI_ADRENALINE , SCB_ASPD );
|
||||
set_sc( BS_WEAPONPERFECT , SC_WEAPONPERFECTION , SI_WEAPONPERFECTION , SCB_NONE );
|
||||
set_sc( BS_OVERTHRUST , SC_OVERTHRUST , SI_OVERTHRUST , SCB_NONE );
|
||||
@@ -8355,6 +8357,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if (sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF)
|
||||
status_change_end(bl, SC_GOSPEL, INVALID_TIMER);
|
||||
break;
|
||||
case SC_FREEZE:
|
||||
status_change_end(bl, SC_AETERNA, INVALID_TIMER);
|
||||
break;
|
||||
case SC_HIDING:
|
||||
status_change_end(bl, SC_CLOSECONFINE, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CLOSECONFINE2, INVALID_TIMER);
|
||||
@@ -10465,6 +10470,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
switch (type) {
|
||||
case SC_FREEZE:
|
||||
case SC_STUN:
|
||||
if(sc->data[SC_DANCING])
|
||||
unit_stop_walking(bl, 1);
|
||||
case SC_SLEEP:
|
||||
case SC_STONE:
|
||||
case SC_WHITEIMPRISON:
|
||||
@@ -10480,6 +10487,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
// Fall through
|
||||
case SC_CURSEDCIRCLE_ATKER:
|
||||
unit_stop_attack(bl);
|
||||
if (type == SC_FREEZE || type == SC_STUN)
|
||||
break; //Handled above
|
||||
// Fall through
|
||||
case SC_STOP:
|
||||
case SC_CONFUSION:
|
||||
@@ -11880,6 +11889,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
|
||||
sce->val4 = 0;
|
||||
unit_stop_walking(bl,1);
|
||||
unit_stop_attack(bl);
|
||||
status_change_end(bl, SC_AETERNA, INVALID_TIMER);
|
||||
sc->opt1 = OPT1_STONE;
|
||||
clif_changeoption(bl);
|
||||
sc_timer_next(1000+tick,status_change_timer, bl->id, data );
|
||||
|
||||
@@ -1436,8 +1436,10 @@ int unit_set_walkdelay(struct block_list *bl, unsigned int tick, int delay, int
|
||||
return 0;
|
||||
} else {
|
||||
// Don't set walk delays when already trapped.
|
||||
if (!unit_can_move(bl))
|
||||
if (!unit_can_move(bl)) {
|
||||
unit_stop_walking(bl,4); //Unit might still be moving even though it can't move
|
||||
return 0;
|
||||
}
|
||||
//Immune to being stopped for double the flinch time
|
||||
if (DIFF_TICK(ud->canmove_tick, tick-delay) > 0)
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user