diff --git a/db/pre-re/skill_cast_db.txt b/db/pre-re/skill_cast_db.txt index 718bac4e44..4bf4ccdcde 100644 --- a/db/pre-re/skill_cast_db.txt +++ b/db/pre-re/skill_cast_db.txt @@ -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 diff --git a/db/re/skill_cast_db.txt b/db/re/skill_cast_db.txt index dfa17cd3db..16aaba0a90 100644 --- a/db/re/skill_cast_db.txt +++ b/db/re/skill_cast_db.txt @@ -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 diff --git a/src/map/battle.c b/src/map/battle.c index fbe810df5a..8ef1e5e6db 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -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 *------------------------------------------*/ diff --git a/src/map/skill.c b/src/map/skill.c index 125e069298..dd77c0a7db 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -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); diff --git a/src/map/skill.h b/src/map/skill.h index d521d1ccdb..4a10271b22 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -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; diff --git a/src/map/status.c b/src/map/status.c index e81721a219..083c7eeee3 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -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 ); diff --git a/src/map/unit.c b/src/map/unit.c index 516de460da..2357bd234b 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -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;