diff --git a/db/pre-re/skill_db.yml b/db/pre-re/skill_db.yml index ae124f184b..3c4031a070 100644 --- a/db/pre-re/skill_db.yml +++ b/db/pre-re/skill_db.yml @@ -18583,6 +18583,8 @@ Body: Duration1: 60000 Requires: SpCost: 20 + Status: + Weaponblock_On: true - Id: 2031 Name: GC_VENOMPRESSURE Description: Venom Pressure diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index 4a960ce3a4..fa3f96191e 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -19339,6 +19339,8 @@ Body: FixedCastTime: -1 Requires: SpCost: 20 + Status: + Weaponblock_On: true - Id: 2031 Name: GC_VENOMPRESSURE Description: Venom Pressure diff --git a/src/map/battle.cpp b/src/map/battle.cpp index f641a3fca0..23afdeaa92 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -1171,7 +1171,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if( sc->data[SC_WEAPONBLOCKING] && flag&(BF_SHORT|BF_WEAPON) && rnd()%100 < sc->data[SC_WEAPONBLOCKING]->val2 ) { clif_skill_nodamage(bl,src,GC_WEAPONBLOCKING,sc->data[SC_WEAPONBLOCKING]->val1,1); - sc_start(src, bl, SC_WEAPONBLOCK_ON, 100, 0, skill_get_time2(GC_WEAPONBLOCKING, 1)); + sc_start(src, bl, SC_WEAPONBLOCK_ON, 100, src->id, skill_get_time2(GC_WEAPONBLOCKING, 1)); d->dmg_lv = ATK_BLOCK; return 0; } @@ -3483,7 +3483,11 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s { wd->div_ = skill_get_num(GS_CHAINACTION,skill_lv); wd->type = DMG_MULTI_HIT; - sc_start(src,src,SC_QD_SHOT_READY,100,target->id,skill_get_time(RL_QD_SHOT,1)); + + status_data *status = status_get_status_data(src); + + if (status && status->amotion > 70) // Only triggers if ASPD < 193 + sc_start(src,src,SC_QD_SHOT_READY,100,target->id,skill_get_time(RL_QD_SHOT,1)); } else if(sc && sc->data[SC_FEARBREEZE] && sd->weapontype1==W_BOW && (i = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[i] && sd->inventory.u.items_inventory[i].amount > 1) diff --git a/src/map/skill.cpp b/src/map/skill.cpp index b90d56880f..013099aaf4 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -2969,7 +2969,6 @@ int skill_is_combo(uint16 skill_id) { case TK_COUNTER: case TK_JUMPKICK: case HT_POWER: - case GC_WEAPONCRUSH: case SR_DRAGONCOMBO: return 1; 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_MAGMA_ERUPTION: case GC_CROSSIMPACT: + case GC_WEAPONCRUSH: case GC_VENOMPRESSURE: case SC_TRIANGLESHOT: case SC_FEINTBOMB: @@ -5703,13 +5703,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } 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: if( sd && !(sc && sc->data[SC_ROLLINGCUTTER]) ) 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 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); - } - else { + } else { 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); } + 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[1] = 0; 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 **/ 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; 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); return false; } - /* May has multiple requirements */ + // May have multiple requirements for (const auto &reqStatus : require->status) { if (reqStatus == SC_NONE) continue; + useskill_fail_cause cause; + switch (reqStatus) { - /* Official fail msg */ + // Official fail message 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; 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; - 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; default: - if (!sc->data[reqStatus]) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); - return false; - } + cause = USESKILL_FAIL_LEVEL; break; } + + if (!sc->data[reqStatus]) { + clif_skill_fail(sd, skill_id, cause, 0); + return false; + } } + return true; } @@ -16107,12 +16093,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i return false; } 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: 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); diff --git a/src/map/unit.cpp b/src/map/unit.cpp index cb6a209a4c..25acc3c751 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -1574,10 +1574,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui target_id = src->id; combo = 1; - } else if ( target_id == src->id && - inf&INF_SELF_SKILL && - (skill->inf2[INF2_NOTARGETSELF] || - (skill_id == RL_QD_SHOT && sc && sc->data[SC_QD_SHOT_READY])) ) { + } else if (target_id == src->id && inf&INF_SELF_SKILL && skill->inf2[INF2_NOTARGETSELF]) { target_id = ud->target; // Auto-select target. [Skotlex] combo = 1; } @@ -1594,6 +1591,20 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui return 0; } break; + case GC_WEAPONCRUSH: + if (sc && sc->data[SC_WEAPONBLOCK_ON]) { + if ((target = map_id2bl(sc->data[SC_WEAPONBLOCK_ON]->val1)) == nullptr) + return 0; + combo = 1; + } + break; + case RL_QD_SHOT: + if (sc && sc->data[SC_QD_SHOT_READY]) { + if ((target = map_id2bl(sc->data[SC_QD_SHOT_READY]->val1)) == nullptr) + return 0; + combo = 1; + } + break; case WE_MALE: case WE_FEMALE: if (!sd->status.partner_id)