|
@@ -2969,7 +2969,6 @@ int skill_is_combo(uint16 skill_id) {
|
|
case TK_COUNTER:
|
|
case TK_COUNTER:
|
|
case TK_JUMPKICK:
|
|
case TK_JUMPKICK:
|
|
case HT_POWER:
|
|
case HT_POWER:
|
|
- case GC_WEAPONCRUSH:
|
|
|
|
case SR_DRAGONCOMBO:
|
|
case SR_DRAGONCOMBO:
|
|
return 1;
|
|
return 1;
|
|
case SR_FALLENEMPIRE:
|
|
case SR_FALLENEMPIRE:
|
|
@@ -4859,6 +4858,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
case NC_POWERSWING:
|
|
case NC_POWERSWING:
|
|
case NC_MAGMA_ERUPTION:
|
|
case NC_MAGMA_ERUPTION:
|
|
case GC_CROSSIMPACT:
|
|
case GC_CROSSIMPACT:
|
|
|
|
+ case GC_WEAPONCRUSH:
|
|
case GC_VENOMPRESSURE:
|
|
case GC_VENOMPRESSURE:
|
|
case SC_TRIANGLESHOT:
|
|
case SC_TRIANGLESHOT:
|
|
case SC_FEINTBOMB:
|
|
case SC_FEINTBOMB:
|
|
@@ -5703,13 +5703,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
- case GC_WEAPONCRUSH:
|
|
|
|
- if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == GC_WEAPONBLOCKING )
|
|
|
|
- skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
|
|
- else if( sd )
|
|
|
|
- clif_skill_fail(sd,skill_id,USESKILL_FAIL_GC_WEAPONBLOCKING,0);
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
case GC_CROSSRIPPERSLASHER:
|
|
case GC_CROSSRIPPERSLASHER:
|
|
if( sd && !(sc && sc->data[SC_ROLLINGCUTTER]) )
|
|
if( sd && !(sc && sc->data[SC_ROLLINGCUTTER]) )
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_CONDITION,0);
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_CONDITION,0);
|
|
@@ -11502,11 +11495,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
// Main target always receives damage
|
|
// Main target always receives damage
|
|
clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
|
|
clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
|
|
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_LEVEL);
|
|
skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_LEVEL);
|
|
- }
|
|
|
|
- else {
|
|
|
|
|
|
+ } else {
|
|
clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
|
|
clif_skill_nodamage(src, src, skill_id, skill_lv, 1);
|
|
map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
|
map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);
|
|
}
|
|
}
|
|
|
|
+ status_change_end(src, SC_QD_SHOT_READY, INVALID_TIMER); // End here to prevent spamming of the skill onto the target.
|
|
skill_area_temp[0] = 0;
|
|
skill_area_temp[0] = 0;
|
|
skill_area_temp[1] = 0;
|
|
skill_area_temp[1] = 0;
|
|
break;
|
|
break;
|
|
@@ -15507,54 +15500,47 @@ int skill_isammotype(struct map_session_data *sd, unsigned short skill_id)
|
|
* @return True if condition is met, False otherwise
|
|
* @return True if condition is met, False otherwise
|
|
**/
|
|
**/
|
|
static bool skill_check_condition_sc_required(struct map_session_data *sd, unsigned short skill_id, struct s_skill_condition *require) {
|
|
static bool skill_check_condition_sc_required(struct map_session_data *sd, unsigned short skill_id, struct s_skill_condition *require) {
|
|
- struct status_change *sc = NULL;
|
|
|
|
-
|
|
|
|
- if (require->status.empty())
|
|
|
|
|
|
+ if (require == nullptr || require->status.empty())
|
|
return true;
|
|
return true;
|
|
|
|
|
|
nullpo_ret(sd);
|
|
nullpo_ret(sd);
|
|
|
|
|
|
- if (!require)
|
|
|
|
- return false;
|
|
|
|
|
|
+ status_change *sc = &sd->sc;
|
|
|
|
|
|
- if (!(sc = &sd->sc)) {
|
|
|
|
|
|
+ if (sc == nullptr) {
|
|
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
|
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
- /* May has multiple requirements */
|
|
|
|
|
|
+ // May have multiple requirements
|
|
for (const auto &reqStatus : require->status) {
|
|
for (const auto &reqStatus : require->status) {
|
|
if (reqStatus == SC_NONE)
|
|
if (reqStatus == SC_NONE)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
|
|
+ useskill_fail_cause cause;
|
|
|
|
+
|
|
switch (reqStatus) {
|
|
switch (reqStatus) {
|
|
- /* Official fail msg */
|
|
|
|
|
|
+ // Official fail message
|
|
case SC_PUSH_CART:
|
|
case SC_PUSH_CART:
|
|
- if (!sc->data[SC_PUSH_CART]) {
|
|
|
|
- clif_skill_fail(sd, skill_id, USESKILL_FAIL_CART, 0);
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
|
|
+ cause = USESKILL_FAIL_CART;
|
|
break;
|
|
break;
|
|
case SC_POISONINGWEAPON:
|
|
case SC_POISONINGWEAPON:
|
|
- if (!sc->data[SC_POISONINGWEAPON]) {
|
|
|
|
- clif_skill_fail(sd, skill_id, USESKILL_FAIL_GC_POISONINGWEAPON, 0);
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
|
|
+ cause = USESKILL_FAIL_GC_POISONINGWEAPON;
|
|
break;
|
|
break;
|
|
- case GC_COUNTERSLASH:
|
|
|
|
- if (!sc->data[SC_WEAPONBLOCK_ON]) {
|
|
|
|
- clif_skill_fail(sd, skill_id, USESKILL_FAIL_GC_WEAPONBLOCKING, 0);
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
|
|
+ case SC_WEAPONBLOCK_ON:
|
|
|
|
+ cause = USESKILL_FAIL_GC_WEAPONBLOCKING;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
- if (!sc->data[reqStatus]) {
|
|
|
|
- clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
|
|
+ cause = USESKILL_FAIL_LEVEL;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (!sc->data[reqStatus]) {
|
|
|
|
+ clif_skill_fail(sd, skill_id, cause, 0);
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -16107,12 +16093,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
- case GC_WEAPONCRUSH:
|
|
|
|
- if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == GC_WEAPONBLOCKING) ) {
|
|
|
|
- clif_skill_fail(sd, skill_id, USESKILL_FAIL_GC_WEAPONBLOCKING, 0);
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
case RA_WUGMASTERY:
|
|
case RA_WUGMASTERY:
|
|
if( (pc_isfalcon(sd) && !battle_config.warg_can_falcon) || pc_isridingwug(sd) || sd->sc.data[SC__GROOMY]) {
|
|
if( (pc_isfalcon(sd) && !battle_config.warg_can_falcon) || pc_isridingwug(sd) || sd->sc.data[SC__GROOMY]) {
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|