diff options
Diffstat (limited to 'src/map/unit.c')
-rw-r--r-- | src/map/unit.c | 73 |
1 files changed, 45 insertions, 28 deletions
diff --git a/src/map/unit.c b/src/map/unit.c index 2ab13b121..64885541f 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -100,6 +100,13 @@ int unit_walktoxy_sub(struct block_list *bl) if( !path->search(&wpd,bl->m,bl->x,bl->y,ud->to_x,ud->to_y,ud->state.walk_easy,CELL_CHKNOPASS) ) return 0; +#ifdef OFFICIAL_WALKPATH + if( !path->search_long(NULL, bl->m, bl->x, bl->y, ud->to_x, ud->to_y, CELL_CHKNOPASS) // Check if there is an obstacle between + && wpd.path_len > 14 // Official number of walkable cells is 14 if and only if there is an obstacle between. [malufett] + && (bl->type != BL_NPC) ) // If type is a NPC, please disregard. + return 0; +#endif + memcpy(&ud->walkpath,&wpd,sizeof(wpd)); if (ud->target_to && ud->chaserange>1) { @@ -391,8 +398,14 @@ int unit_walktoxy_timer(int tid, int64 tick, int id, intptr_t data) { ud->steptimer = timer->add(tick+i, unit->step_timer, bl->id, 0); } - if(ud->state.change_walk_target) - return unit->walktoxy_sub(bl); + if(ud->state.change_walk_target) { + if(unit->walktoxy_sub(bl)) { + return 1; + } else { + clif->fixpos(bl); + return 0; + } + } ud->walkpath.path_pos++; if(ud->walkpath.path_pos>=ud->walkpath.path_len) @@ -572,6 +585,10 @@ int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, int ud->to_y = bl->y; ud->target_to = 0; return 0; + } else if (range == 0) { + //Should walk on the same cell as target (for looters) + ud->to_x = tbl->x; + ud->to_y = tbl->y; } ud->state.walk_easy = flag&1; @@ -1131,6 +1148,10 @@ int unit_set_walkdelay(struct block_list *bl, int64 tick, int delay, int type) { if (delay <= 0 || !ud) return 0; if (type) { + //Bosses can ignore skill induced walkdelay (but not damage induced) + if(bl->type == BL_MOB && (((TBL_MOB*)bl)->status.mode&MD_BOSS)) + return 0; + //Make sure walk delay is not decreased if (DIFF_TICK(ud->canmove_tick, tick+delay) > 0) return 0; } else { @@ -1294,31 +1315,31 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui tstatus = status->get_status_data(target); // Record the status of the previous skill) - if(sd) { + if (sd) { - if( (skill->get_inf2(skill_id)&INF2_ENSEMBLE_SKILL) && skill->check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1 ) { - clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); + if ((skill->get_inf2(skill_id)&INF2_ENSEMBLE_SKILL) && skill->check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1) { + clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); return 0; } - switch(skill_id){ + switch (skill_id){ case SA_CASTCANCEL: - if(ud->skill_id != skill_id){ + if (ud->skill_id != skill_id){ sd->skill_id_old = ud->skill_id; sd->skill_lv_old = ud->skill_lv; } break; case BD_ENCORE: //Prevent using the dance skill if you no longer have the skill in your tree. - if(!sd->skill_id_dance || pc->checkskill(sd,sd->skill_id_dance)<=0){ - clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); + if (!sd->skill_id_dance || pc->checkskill(sd, sd->skill_id_dance) <= 0){ + clif->skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); return 0; } sd->skill_id_old = skill_id; break; case WL_WHITEIMPRISON: - if( battle->check_target(src,target,BCT_SELF|BCT_ENEMY) < 0 ) { - clif->skill_fail(sd,skill_id,USESKILL_FAIL_TOTARGET,0); + if (battle->check_target(src, target, BCT_SELF | BCT_ENEMY) < 0) { + clif->skill_fail(sd, skill_id, USESKILL_FAIL_TOTARGET, 0); return 0; } break; @@ -1329,13 +1350,20 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui sd->skill_lv_old = skill_lv; break; } - /* temporarily disabled, awaiting for kenpachi to detail this so we can make it work properly */ + } + + if (sd || src->type == BL_HOM){ + if (!sd && (target = battle->get_master(src))) + sd = map->id2sd(target->id); + if (sd){ + /* temporarily disabled, awaiting for kenpachi to detail this so we can make it work properly */ #if 0 - if ( sd->skillitem != skill_id && !skill->check_condition_castbegin(sd, skill_id, skill_lv) ) + if (sd->skillitem != skill_id && !skill->check_condition_castbegin(sd, skill_id, skill_lv)) #else - if ( !skill->check_condition_castbegin(sd, skill_id, skill_lv) ) + if (!skill->check_condition_castbegin(sd, skill_id, skill_lv)) #endif - return 0; + return 0; + } } if( src->type == BL_MOB ) @@ -1619,14 +1647,6 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui if( skill->not_ok(skill_id, sd) || !skill->check_condition_castbegin(sd, skill_id, skill_lv) ) return 0; /** - * "WHY IS IT HEREE": pneuma cannot be canceled past this point, the client displays the animation even, - * if we cancel it from nodamage_id, so it has to be here for it to not display the animation. - **/ - if( skill_id == AL_PNEUMA && map->getcell(src->m, skill_x, skill_y, CELL_CHKLANDPROTECTOR) ) { - clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); - return 0; - } - /** * "WHY IS IT HEREE": ice wall cannot be canceled past this point, the client displays the animation even, * if we cancel it from castend_pos, so it has to be here for it to not display the animation. **/ @@ -2310,7 +2330,7 @@ int unit_remove_map(struct block_list *bl, clr_type clrtype, const char* file, i //Clear target even if there is no timer if (ud->target || ud->attacktimer != INVALID_TIMER) - unit_stop_attack(bl); + unit->stop_attack(bl); //Clear stepaction even if there is no timer if (ud->stepaction || ud->steptimer != INVALID_TIMER) @@ -2660,10 +2680,7 @@ int unit_free(struct block_list *bl, clr_type clrtype) { if( pd->s_skill ) { if (pd->s_skill->timer != INVALID_TIMER) { - if (pd->s_skill->id) - timer->delete(pd->s_skill->timer, pet->skill_support_timer); - else - timer->delete(pd->s_skill->timer, pet->heal_timer); + timer->delete(pd->s_skill->timer, pet->skill_support_timer); } aFree(pd->s_skill); pd->s_skill = NULL; |