Selaa lähdekoodia

Bug fixes:
* #331: Fixed Auto Shadow Spell always failed, 9d3d34205fdb424e4a9281c3e6a951a1f0cdbdc1 fault
* #340: Phantom Thrust can be used to pull a party member

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>

Cydh Ramdh 10 vuotta sitten
vanhempi
commit
46f010cb28
3 muutettua tiedostoa jossa 38 lisäystä ja 37 poistoa
  1. 15 15
      src/map/battle.c
  2. 13 17
      src/map/skill.c
  3. 10 5
      src/map/unit.c

+ 15 - 15
src/map/battle.c

@@ -6997,21 +6997,21 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
 					}
 				}
 
-                if (sd->state.autocast == 0) {
-                    sd->state.autocast = 1;
-                    skill_consume_requirement(sd, r_skill, r_lv, 3);
-                    switch (type) {
-                        case CAST_GROUND:
-                            skill_castend_pos2(src, target->x, target->y, r_skill, r_lv, tick, flag);
-                            break;
-                        case CAST_NODAMAGE:
-                            skill_castend_nodamage_id(src, target, r_skill, r_lv, tick, flag);
-                            break;
-                        case CAST_DAMAGE:
-                            skill_castend_damage_id(src, target, r_skill, r_lv, tick, flag);
-                            break;
-                    }
-                }
+				if (sd->state.autocast == 0) {
+					sd->state.autocast = 1;
+					skill_consume_requirement(sd, r_skill, r_lv, 3);
+					switch (type) {
+						case CAST_GROUND:
+							skill_castend_pos2(src, target->x, target->y, r_skill, r_lv, tick, flag);
+							break;
+						case CAST_NODAMAGE:
+							skill_castend_nodamage_id(src, target, r_skill, r_lv, tick, flag);
+							break;
+						case CAST_DAMAGE:
+							skill_castend_damage_id(src, target, r_skill, r_lv, tick, flag);
+							break;
+					}
+				}
 				sd->state.autocast = 0;
 
 				sd->ud.canact_tick = tick + skill_delayfix(src, r_skill, r_lv);

+ 13 - 17
src/map/skill.c

@@ -10514,21 +10514,16 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
 				break;
 			}
 		}
-
-		if( ud->skill_id == PR_TURNUNDEAD )
-		{
+		else if( ud->skill_id == PR_TURNUNDEAD ) {
 			struct status_data *tstatus = status_get_status_data(target);
 			if( !battle_check_undead(tstatus->race, tstatus->def_ele) )
 				break;
 		}
-
-		if( ud->skill_id == RA_WUGSTRIKE ){
+		else if( ud->skill_id == RA_WUGSTRIKE ){
 			if( !path_search(NULL,src->m,src->x,src->y,target->x,target->y,1,CELL_CHKNOREACH))
 				break;
 		}
-
-		if( ud->skill_id == PR_LEXDIVINA || ud->skill_id == MER_LEXDIVINA )
-		{
+		else if( ud->skill_id == PR_LEXDIVINA || ud->skill_id == MER_LEXDIVINA ) {
 			sc = status_get_sc(target);
 			if( battle_check_target(src,target, BCT_ENEMY) <= 0 && (!sc || !sc->data[SC_SILENCE]) )
 			{ //If it's not an enemy, and not silenced, you can't use the skill on them. [Skotlex]
@@ -10536,8 +10531,7 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
 				break;
 			}
 		}
-		else
-		{ // Check target validity.
+		else { // Check target validity.
 			inf = skill_get_inf(ud->skill_id);
 			inf2 = skill_get_inf2(ud->skill_id);
 
@@ -10559,15 +10553,11 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
 				inf &= ~BCT_NEUTRAL;
 			}
 
-			if( ud->skill_id >= SL_SKE && ud->skill_id <= SL_SKA && target->type == BL_MOB )
-			{
+			// Specific skill check first
+			if( ud->skill_id >= SL_SKE && ud->skill_id <= SL_SKA && target->type == BL_MOB ) {
 				if( ((TBL_MOB*)target)->mob_id == MOBID_EMPERIUM )
 					break;
 			}
-			else if (inf && battle_check_target(src, target, inf) <= 0){
-				if (sd) clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0);
-				break;
-			}
 			else if( ud->skill_id == RK_PHANTOMTHRUST && target->type != BL_MOB ) {
 				if( !map_flag_vs(src->m) && battle_check_target(src,target,BCT_PARTY) <= 0 )
 					break; // You can use Phantom Thurst on party members in normal maps too. [pakpil]
@@ -10580,6 +10570,12 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
 				clif_skill_fail(sd, ud->skill_id, USESKILL_FAIL_NEED_HELPER, 0);
 				break;
 			}
+			// Common check
+			else if (inf && battle_check_target(src, target, inf) <= 0){
+				if (sd)
+					clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0);
+				break;
+			}
 
 			if(inf&BCT_ENEMY && (sc = status_get_sc(target)) &&
 				sc->data[SC_FOGWALL] &&
@@ -18912,7 +18908,7 @@ int skill_select_menu(struct map_session_data *sd,uint16 skill_id) {
 		status_change_end(&sd->bl,SC_STOP,INVALID_TIMER);
 	}
 
-	if (!skill_id || (sk_idx = skill_get_index(skill_id)))
+	if (!skill_id || !(sk_idx = skill_get_index(skill_id)))
 		return 0;
 
 	if( !(skill_get_inf2(skill_id)&INF2_AUTOSHADOWSPELL) || (id = sd->status.skill[sk_idx].id) == 0 || sd->status.skill[sk_idx].flag != SKILL_FLAG_PLAGIARIZED ) {

+ 10 - 5
src/map/unit.c

@@ -1482,6 +1482,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 	struct block_list * target = NULL;
 	unsigned int tick = gettick();
 	int combo = 0, range;
+	uint8 inf = 0;
+	uint32 inf2 = 0;
 
 	nullpo_ret(src);
 
@@ -1499,6 +1501,9 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 	if (sc && !sc->count)
 		sc = NULL; // Unneeded
 
+	inf = skill_get_inf(skill_id);
+	inf2 = skill_get_inf2(skill_id);
+
 	// temp: used to signal combo-skills right now.
 	if (sc && sc->data[SC_COMBO] &&
 		skill_is_combo(skill_id) &&
@@ -1509,13 +1514,13 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 		else if (target_id == src->id || ud->target > 0)
 			target_id = ud->target;
 
-		if( skill_get_inf(skill_id)&INF_SELF_SKILL && skill_get_nk(skill_id)&NK_NO_DAMAGE )// exploit fix
+		if( inf&INF_SELF_SKILL && skill_get_nk(skill_id)&NK_NO_DAMAGE )// exploit fix
 			target_id = src->id;
 
 		combo = 1;
 	} else if ( target_id == src->id &&
-		skill_get_inf(skill_id)&INF_SELF_SKILL &&
-		(skill_get_inf2(skill_id)&INF2_NO_TARGET_SELF ||
+		inf&INF_SELF_SKILL &&
+		(inf2&INF2_NO_TARGET_SELF ||
 		(skill_id == RL_QD_SHOT && sc && sc->data[SC_QD_SHOT_READY])) ) {
 		target_id = ud->target; // Auto-select target. [Skotlex]
 		combo = 1;
@@ -1589,14 +1594,14 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 	if(ud->skilltimer != INVALID_TIMER && skill_id != SA_CASTCANCEL && skill_id != SO_SPELLFIST)
 		return 0;
 
-	if(skill_get_inf2(skill_id)&INF2_NO_TARGET_SELF && src->id == target_id)
+	if(inf2&INF2_NO_TARGET_SELF && src->id == target_id)
 		return 0;
 
 	if(!status_check_skilluse(src, target, skill_id, 0))
 		return 0;
 
 	// Fail if the targetted skill is near NPC [Cydh]
-	if(skill_get_inf2(skill_id)&INF2_NO_NEARNPC && skill_isNotOk_npcRange(src,skill_id,skill_lv,target->x,target->y)) {
+	if(inf2&INF2_NO_NEARNPC && skill_isNotOk_npcRange(src,skill_id,skill_lv,target->x,target->y)) {
 		if (sd)
 			clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);