Clean up usage of unit_movepos
and GVG/BG mpa checks on skill.c.
* Follow up 5afc620e740f03775b36925cb187b7d54124274a, 45936c7dc607f25ce3c7a33020aa691176978b73 Signed-off-by: Cydh Ramdh <cydh@pservero.com>
This commit is contained in:
parent
fd1b360c93
commit
dddc313c7d
@ -126,13 +126,15 @@ int overbrand_brandish_nounit_pos;
|
|||||||
|
|
||||||
static char dir_ka = -1; // Holds temporary direction to the target for SR_KNUCKLEARROW
|
static char dir_ka = -1; // Holds temporary direction to the target for SR_KNUCKLEARROW
|
||||||
|
|
||||||
//early declaration
|
//Early declaration
|
||||||
int skill_block_check(struct block_list *bl, enum sc_type type, uint16 skill_id);
|
int skill_block_check(struct block_list *bl, enum sc_type type, uint16 skill_id);
|
||||||
static int skill_check_unit_range (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
|
static int skill_check_unit_range (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
|
||||||
static int skill_check_unit_range2 (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv, bool isNearNPC);
|
static int skill_check_unit_range2 (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv, bool isNearNPC);
|
||||||
static int skill_destroy_trap( struct block_list *bl, va_list ap );
|
static int skill_destroy_trap( struct block_list *bl, va_list ap );
|
||||||
static int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap);
|
static int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap);
|
||||||
static bool skill_check_condition_sc_required(struct map_session_data *sd, unsigned short skill_id, struct skill_condition *require);
|
static bool skill_check_condition_sc_required(struct map_session_data *sd, unsigned short skill_id, struct skill_condition *require);
|
||||||
|
static bool skill_check_unit_movepos(uint8 check_flag, struct block_list *bl, short dst_x, short dst_y, int easy, bool checkpath);
|
||||||
|
|
||||||
// Since only mob-casted splash skills can hit ice-walls
|
// Since only mob-casted splash skills can hit ice-walls
|
||||||
static inline int splash_target(struct block_list* bl) {
|
static inline int splash_target(struct block_list* bl) {
|
||||||
#ifndef RENEWAL
|
#ifndef RENEWAL
|
||||||
@ -2922,7 +2924,7 @@ void skill_attack_blow(struct block_list *src, struct block_list *dsrc, struct b
|
|||||||
dir_ka = -1;
|
dir_ka = -1;
|
||||||
|
|
||||||
// Move attacker to the target position after knocked back
|
// Move attacker to the target position after knocked back
|
||||||
if ((target->x != x || target->y != y) && unit_movepos(src,target->x,target->y,1,1) && !map_flag_gvg2(src->m) && !map[src->m].flag.battleground)
|
if ((target->x != x || target->y != y) && skill_check_unit_movepos(5,src,target->x,target->y,1,1))
|
||||||
clif_blown(src);
|
clif_blown(src);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -4426,7 +4428,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
uint8 dir = map_calc_dir(bl, src->x, src->y);
|
uint8 dir = map_calc_dir(bl, src->x, src->y);
|
||||||
|
|
||||||
// teleport to target (if not on WoE grounds)
|
// teleport to target (if not on WoE grounds)
|
||||||
if (!map_flag_gvg(src->m) && !map[src->m].flag.battleground && unit_movepos(src, bl->x, bl->y, 0, 1))
|
if (skill_check_unit_movepos(3, src, bl->x, bl->y, 0, 1))
|
||||||
skill_blown(src, src, 1, (dir+4)%8, 0); //Target position is actually one cell next to the target
|
skill_blown(src, src, 1, (dir+4)%8, 0); //Target position is actually one cell next to the target
|
||||||
|
|
||||||
// cause damage and knockback if the path to target was a straight one
|
// cause damage and knockback if the path to target was a straight one
|
||||||
@ -4933,7 +4935,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
else
|
else
|
||||||
y = 0;
|
y = 0;
|
||||||
// Doesn't have slide effect in GVG
|
// Doesn't have slide effect in GVG
|
||||||
if (!map_flag_gvg2(src->m) && !map[src->m].flag.battleground && unit_movepos(src, bl->x + x, bl->y + y, 1, 1)) {
|
if (skill_check_unit_movepos(5, src, bl->x + x, bl->y + y, 1, 1)) {
|
||||||
clif_blown(src);
|
clif_blown(src);
|
||||||
clif_spiritball(src);
|
clif_spiritball(src);
|
||||||
}
|
}
|
||||||
@ -5342,7 +5344,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case LG_PINPOINTATTACK:
|
case LG_PINPOINTATTACK:
|
||||||
if( !map_flag_gvg(src->m) && !map[src->m].flag.battleground && unit_movepos(src, bl->x, bl->y, 1, 1) )
|
if (skill_check_unit_movepos(3, src, bl->x, bl->y, 1, 1))
|
||||||
clif_blown(src);
|
clif_blown(src);
|
||||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||||
break;
|
break;
|
||||||
@ -5363,7 +5365,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|||||||
// Holds current direction of bl/target to src/attacker before the src is moved to bl location
|
// Holds current direction of bl/target to src/attacker before the src is moved to bl location
|
||||||
dir_ka = map_calc_dir(bl, src->x, src->y);
|
dir_ka = map_calc_dir(bl, src->x, src->y);
|
||||||
// Has slide effect
|
// Has slide effect
|
||||||
if (unit_movepos(src, bl->x, bl->y, 1, 1) && !map_flag_gvg2(src->m) && !map[src->m].flag.battleground)
|
if (skill_check_unit_movepos(5, src, bl->x, bl->y, 1, 1))
|
||||||
clif_blown(src);
|
clif_blown(src);
|
||||||
|
|
||||||
if( flag&1 )
|
if( flag&1 )
|
||||||
@ -10375,7 +10377,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
if (!is_boss(bl))
|
if (!is_boss(bl))
|
||||||
status_change_start(src, bl, SC_CONFUSION, 7500, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NORATEDEF);
|
status_change_start(src, bl, SC_CONFUSION, 7500, skill_lv, 0, 0, 0, skill_get_time(skill_id, skill_lv), SCSTART_NORATEDEF);
|
||||||
|
|
||||||
if (unit_movepos(src,bl->x,bl->y,0,0) && !map_flag_gvg2(src->m) && !map[src->m].flag.battleground) {
|
if (skill_check_unit_movepos(5,src,bl->x,bl->y,0,0)) {
|
||||||
clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
|
clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
|
||||||
clif_blown(src);
|
clif_blown(src);
|
||||||
if (!is_boss(bl) && unit_movepos(bl,x,y,0,0)) {
|
if (!is_boss(bl) && unit_movepos(bl,x,y,0,0)) {
|
||||||
@ -11545,7 +11547,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NJ_SHADOWJUMP:
|
case NJ_SHADOWJUMP:
|
||||||
if( !map_flag_gvg(src->m) && !map[src->m].flag.battleground && unit_movepos(src, x, y, 1, 0) ) //You don't move on GVG grounds.
|
if( skill_check_unit_movepos(3, src, x, y, 1, 0) ) //You don't move on GVG grounds.
|
||||||
clif_blown(src);
|
clif_blown(src);
|
||||||
status_change_end(src, SC_HIDING, INVALID_TIMER);
|
status_change_end(src, SC_HIDING, INVALID_TIMER);
|
||||||
break;
|
break;
|
||||||
@ -20293,6 +20295,24 @@ int skill_get_elemental_type( uint16 skill_id , uint16 skill_lv ) {
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check before do `unit_movepos` call
|
||||||
|
* @param check_flag Flags: 1:Check for BG map, 2:Check for GVG map on WOE, 4:Check for GVG map
|
||||||
|
* @return True:If unit can be moved, False:If check on flags are met or unit cannot be moved.
|
||||||
|
**/
|
||||||
|
static bool skill_check_unit_movepos(uint8 check_flag, struct block_list *bl, short dst_x, short dst_y, int easy, bool checkpath) {
|
||||||
|
nullpo_retr(false, bl);
|
||||||
|
|
||||||
|
if (check_flag&1 && map[bl->m].flag.battleground)
|
||||||
|
return false;
|
||||||
|
if (check_flag&2 && map_flag_gvg(bl->m))
|
||||||
|
return false;
|
||||||
|
if (check_flag&4 && map_flag_gvg2(bl->m))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return unit_movepos(bl, dst_x, dst_y, easy, checkpath);
|
||||||
|
}
|
||||||
|
|
||||||
/*==========================================
|
/*==========================================
|
||||||
* sub-function of DB reading.
|
* sub-function of DB reading.
|
||||||
* skill_db.txt
|
* skill_db.txt
|
||||||
|
@ -900,28 +900,28 @@ int unit_escape(struct block_list *bl, struct block_list *target, short dist)
|
|||||||
* @param dst_y: Y coordinate to warp to
|
* @param dst_y: Y coordinate to warp to
|
||||||
* @param easy: Easy(1) or Hard(0) path check (hard attempts to go around obstacles)
|
* @param easy: Easy(1) or Hard(0) path check (hard attempts to go around obstacles)
|
||||||
* @param checkpath: Whether or not to do a cell and path check for NOPASS and NOREACH
|
* @param checkpath: Whether or not to do a cell and path check for NOPASS and NOREACH
|
||||||
* @return 1: Success 0: Fail
|
* @return True: Success False: Fail
|
||||||
*/
|
*/
|
||||||
int unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool checkpath)
|
bool unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool checkpath)
|
||||||
{
|
{
|
||||||
short dx,dy;
|
short dx,dy;
|
||||||
uint8 dir;
|
uint8 dir;
|
||||||
struct unit_data *ud = NULL;
|
struct unit_data *ud = NULL;
|
||||||
struct map_session_data *sd = NULL;
|
struct map_session_data *sd = NULL;
|
||||||
|
|
||||||
nullpo_ret(bl);
|
nullpo_retr(false,bl);
|
||||||
|
|
||||||
sd = BL_CAST(BL_PC, bl);
|
sd = BL_CAST(BL_PC, bl);
|
||||||
ud = unit_bl2ud(bl);
|
ud = unit_bl2ud(bl);
|
||||||
|
|
||||||
if(ud == NULL)
|
if(ud == NULL)
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
unit_stop_walking(bl, 1);
|
unit_stop_walking(bl, 1);
|
||||||
unit_stop_attack(bl);
|
unit_stop_attack(bl);
|
||||||
|
|
||||||
if( checkpath && (map_getcell(bl->m,dst_x,dst_y,CELL_CHKNOPASS) || !path_search(NULL,bl->m,bl->x,bl->y,dst_x,dst_y,easy,CELL_CHKNOREACH)) )
|
if( checkpath && (map_getcell(bl->m,dst_x,dst_y,CELL_CHKNOPASS) || !path_search(NULL,bl->m,bl->x,bl->y,dst_x,dst_y,easy,CELL_CHKNOREACH)) )
|
||||||
return 0; // Unreachable
|
return false; // Unreachable
|
||||||
|
|
||||||
ud->to_x = dst_x;
|
ud->to_x = dst_x;
|
||||||
ud->to_y = dst_y;
|
ud->to_y = dst_y;
|
||||||
@ -948,7 +948,7 @@ int unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool
|
|||||||
npc_touch_areanpc(sd, bl->m, bl->x, bl->y);
|
npc_touch_areanpc(sd, bl->m, bl->x, bl->y);
|
||||||
|
|
||||||
if (bl->prev == NULL) // Script could have warped char, abort remaining of the function.
|
if (bl->prev == NULL) // Script could have warped char, abort remaining of the function.
|
||||||
return 0;
|
return false;
|
||||||
} else
|
} else
|
||||||
sd->areanpc_id=0;
|
sd->areanpc_id=0;
|
||||||
|
|
||||||
@ -969,7 +969,7 @@ int unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -100,7 +100,7 @@ int unit_set_walkdelay(struct block_list *bl, unsigned int tick, int delay, int
|
|||||||
int unit_escape(struct block_list *bl, struct block_list *target, short dist);
|
int unit_escape(struct block_list *bl, struct block_list *target, short dist);
|
||||||
|
|
||||||
// Instant unit changes
|
// Instant unit changes
|
||||||
int unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool checkpath);
|
bool unit_movepos(struct block_list *bl, short dst_x, short dst_y, int easy, bool checkpath);
|
||||||
int unit_warp(struct block_list *bl, short map, short x, short y, clr_type type);
|
int unit_warp(struct block_list *bl, short map, short x, short y, clr_type type);
|
||||||
int unit_setdir(struct block_list *bl, unsigned char dir);
|
int unit_setdir(struct block_list *bl, unsigned char dir);
|
||||||
uint8 unit_getdir(struct block_list *bl);
|
uint8 unit_getdir(struct block_list *bl);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user