diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 9ce390b033..c17e2f740f 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -3243,6 +3243,7 @@ int mob_class_change (struct mob_data *md, int mob_id) memcpy(md->name,md->db->jname,NAME_LENGTH); status_change_end(&md->bl,SC_KEEPING,INVALID_TIMER); // End before calling status_calc_mob(). + status_change_end(&md->bl,SC_BARRIER,INVALID_TIMER); mob_stop_attack(md); mob_stop_walking(md, 0); unit_skillcastcancel(&md->bl, 0); diff --git a/src/map/skill.cpp b/src/map/skill.cpp index 657b4cd0b3..6b669fbf68 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -6752,6 +6752,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case NPC_DEFENDER: case NPC_MAGICMIRROR: case ST_PRESERVE: + case NPC_KEEPING: + case NPC_BARRIER: case NPC_INVINCIBLE: case NPC_INVINCIBLEOFF: case MER_INVINCIBLEOFF2: @@ -8222,21 +8224,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if (md) mob_unlocktarget(md, tick); break; - case NPC_KEEPING: - case NPC_BARRIER: - { - int skill_time = skill_get_time(skill_id,skill_lv); - struct unit_data *ud = unit_bl2ud(bl); - if (clif_skill_nodamage(src,bl,skill_id,skill_lv, - sc_start(src,bl,type,100,skill_lv,skill_time)) - && ud) { //Disable attacking/acting/moving for skill's duration. - ud->attackabletime = - ud->canact_tick = - ud->canmove_tick = tick + skill_time; - } - } - break; - case NPC_REBIRTH: if( md && md->state.rebirth ) break; // only works once diff --git a/src/map/status.cpp b/src/map/status.cpp index 9b0df3a496..2d54e07ad2 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -9553,6 +9553,14 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick = INFINITE_TICK; break; + case SC_KEEPING: + case SC_BARRIER: { + unit_data *ud = unit_bl2ud(bl); + + if (ud) + ud->attackabletime = ud->canact_tick = ud->canmove_tick = gettick() + tick; + } + break; case SC_DECREASEAGI: case SC_INCREASEAGI: case SC_ADORAMUS: @@ -12178,6 +12186,14 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const vd = status_get_viewdata(bl); calc_flag = static_cast(StatusChangeFlagTable[type]); switch(type) { + case SC_KEEPING: + case SC_BARRIER: { + unit_data *ud = unit_bl2ud(bl); + + if (ud) + ud->attackabletime = ud->canact_tick = ud->canmove_tick = gettick(); + } + break; case SC_GRANITIC_ARMOR: { int damage = status->max_hp*sce->val3/100;