Browse Source

-Fix SC__SHADOWFORM not ending if target does not move after being warp. bugreport:7271
-- Thus allowing to inflict damage between map (only if both player don't move).
-- Cleanup old map-check on move check.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@17148 54d463be-8e91-2dee-dedb-b68131a5f0ec

glighta 12 years ago
parent
commit
085fe52dbc
3 changed files with 14 additions and 9 deletions
  1. 2 2
      src/map/battle.c
  2. 2 2
      src/map/map.c
  3. 10 5
      src/map/unit.c

+ 2 - 2
src/map/battle.c

@@ -1147,7 +1147,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,struct Damag
 
 		if( sc && sc->data[SC__SHADOWFORM] ) {
 			struct block_list *s_bl = map_id2bl(sc->data[SC__SHADOWFORM]->val2);
-			if( !s_bl ) { // If the shadow form target is not present remove the sc.
+			if( !s_bl || s_bl->m != bl->m ) { // If the shadow form target is not present remove the sc.
 				status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
 			} else if( status_isdead(s_bl) || !battle_check_target(src,s_bl,BCT_ENEMY)) { // If the shadow form target is dead or not your enemy remove the sc in both.
 				status_change_end(bl, SC__SHADOWFORM, INVALID_TIMER);
@@ -1877,7 +1877,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src,struct blo
 			wd.div_ = skill_get_num(GS_CHAINACTION,skill_lv);
 			wd.type = 0x08;
 		}
-		else if(sc && sc->data[SC_FEARBREEZE] && sd->weapontype1==W_BOW 
+		else if(sc && sc->data[SC_FEARBREEZE] && sd->weapontype1==W_BOW
 			&& (i = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[i] && sd->status.inventory[i].amount > 1){
 				int chance = rand()%100;
 				wd.type = 0x08;

+ 2 - 2
src/map/map.c

@@ -415,7 +415,7 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick)
 
 		if( bl->type == BL_PC && ((TBL_PC*)bl)->shadowform_id ) {//Shadow Form Target Moving
 			struct block_list *d_bl;
-			if( (d_bl = map_id2bl(((TBL_PC*)bl)->shadowform_id)) == NULL || bl->m != d_bl->m || !check_distance_bl(bl,d_bl,10) ) {
+			if( (d_bl = map_id2bl(((TBL_PC*)bl)->shadowform_id)) == NULL || !check_distance_bl(bl,d_bl,10) ) {
 				if( d_bl )
 					status_change_end(d_bl,SC__SHADOWFORM,INVALID_TIMER);
 				((TBL_PC*)bl)->shadowform_id = 0;
@@ -440,7 +440,7 @@ int map_moveblock(struct block_list *bl, int x1, int y1, unsigned int tick)
 
 				if( sc->data[SC__SHADOWFORM] ) {//Shadow Form Caster Moving
 					struct block_list *d_bl;
-					if( (d_bl = map_id2bl(sc->data[SC__SHADOWFORM]->val2)) == NULL || bl->m != d_bl->m || !check_distance_bl(bl,d_bl,10) )
+					if( (d_bl = map_id2bl(sc->data[SC__SHADOWFORM]->val2)) == NULL || !check_distance_bl(bl,d_bl,10) )
 						status_change_end(bl,SC__SHADOWFORM,INVALID_TIMER);
 				}
 

+ 10 - 5
src/map/unit.c

@@ -407,7 +407,7 @@ int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, int
 
 	ud = unit_bl2ud(bl);
 	if( ud == NULL) return 0;
-	
+
 	if (!(status_get_mode(bl)&MD_CANMOVE))
 		return 0;
 
@@ -417,13 +417,13 @@ int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, int
 		ud->target_to = 0;
 		return 0;
 	}
-	
+
 	ud->state.walk_easy = flag&1;
 	ud->target_to = tbl->id;
 	ud->chaserange = range; //Note that if flag&2, this SHOULD be attack-range
 	ud->state.attack_continue = flag&2?1:0; //Chase to attack.
 	unit_set_target(ud, 0);
-	
+
 	sc = status_get_sc(bl);
 	if (sc && sc->data[SC_CONFUSION]) //Randomize the target position
 		map_random_dir(bl, &ud->to_x, &ud->to_y);
@@ -435,7 +435,7 @@ int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, int
 		set_mobstate(bl, flag&2);
 		return 1;
 	}
-	
+
 	if(DIFF_TICK(ud->canmove_tick, gettick()) > 0)
 	{	//Can't move, wait a bit before invoking the movement.
 		add_timer(ud->canmove_tick+1, unit_walktobl_sub, bl->id, ud->target);
@@ -939,7 +939,7 @@ int unit_can_move(struct block_list *bl) {
 
 		if( sc->data[SC_ANKLE] && ( battle_config.skill_trap_type || ( !map_flag_gvg(bl->m) && !unit_is_walking(bl) ) ) ) // Ankle only stops you after you're done moving
 			return 0;
-			
+
 		if (sc->opt1 > 0 && sc->opt1 != OPT1_STONEWAIT && sc->opt1 != OPT1_BURNING && !(sc->opt1 == OPT1_CRYSTALIZE && bl->type == BL_MOB))
 			return 0;
 
@@ -2085,6 +2085,11 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
 		case BL_PC: {
 			struct map_session_data *sd = (struct map_session_data*)bl;
 
+			if(sd->shadowform_id){
+			    struct block_list *d_bl = map_id2bl(sd->shadowform_id);
+			    if( d_bl )
+				    status_change_end(d_bl,SC__SHADOWFORM,INVALID_TIMER);
+			}
 			//Leave/reject all invitations.
 			if(sd->chatID)
 				chat_leavechat(sd,0);