|
@@ -1424,6 +1424,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
|
case AS_VENOMKNIFE:
|
|
|
if (sd) //Poison chance must be that of Envenom. [Skotlex]
|
|
|
skill_lv = pc_checkskill(sd, TF_POISON);
|
|
|
+ [[fallthrough]];
|
|
|
case TF_POISON:
|
|
|
case AS_SPLASHER:
|
|
|
if(!sc_start2(src,bl,SC_POISON,(4*skill_lv+10),skill_lv,src->id,skill_get_time2(skill_id,skill_lv))
|
|
@@ -1433,6 +1434,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
|
break;
|
|
|
|
|
|
case AS_SONICBLOW:
|
|
|
+ case HN_MEGA_SONIC_BLOW:
|
|
|
sc_start(src,bl,SC_STUN,(2*skill_lv+10),skill_lv,skill_get_time2(skill_id,skill_lv));
|
|
|
break;
|
|
|
|
|
@@ -1479,6 +1481,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
|
break;
|
|
|
|
|
|
case WZ_METEOR:
|
|
|
+ case HN_METEOR_STORM_BUSTER:
|
|
|
sc_start(src,bl,SC_STUN,3*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv));
|
|
|
break;
|
|
|
|
|
@@ -1568,7 +1571,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
|
#ifndef RENEWAL
|
|
|
case PA_PRESSURE:
|
|
|
status_percent_damage(src, bl, 0, 15+5*skill_lv, false);
|
|
|
- //Fall through
|
|
|
+ [[fallthrough]];
|
|
|
case HW_GRAVITATION:
|
|
|
//Pressure and Gravitation can trigger physical autospells
|
|
|
attack_type |= BF_NORMAL;
|
|
@@ -1695,6 +1698,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
|
|
|
|
case LK_SPIRALPIERCE:
|
|
|
case ML_SPIRALPIERCE:
|
|
|
+ case HN_SPIRAL_PIERCE_MAX:
|
|
|
if( dstsd || ( dstmd && !status_bl_has_mode(bl,MD_STATUSIMMUNE) ) ) //Does not work on status immune
|
|
|
sc_start(src,bl,SC_STOP,100,0,skill_get_time2(skill_id,skill_lv));
|
|
|
break;
|
|
@@ -1728,6 +1732,7 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
|
break;
|
|
|
|
|
|
case HW_NAPALMVULCAN:
|
|
|
+ case HN_NAPALM_VULCAN_STRIKE:
|
|
|
sc_start(src,bl,SC_CURSE,5*skill_lv,skill_lv,skill_get_time2(skill_id,skill_lv));
|
|
|
break;
|
|
|
|
|
@@ -2179,10 +2184,9 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
|
break;
|
|
|
case TR_ROSEBLOSSOM:// Rose blossom seed can only bloom if the target is hit.
|
|
|
sc_start4(src, bl, SC_ROSEBLOSSOM, 100, skill_lv, TR_ROSEBLOSSOM_ATK, src->id, 0, skill_get_time(skill_id, skill_lv));
|
|
|
+ [[fallthrough]];
|
|
|
case WM_METALICSOUND:
|
|
|
case WM_REVERBERATION:
|
|
|
- case TR_RHYTHMSHOOTING:
|
|
|
- case TR_METALIC_FURY:
|
|
|
status_change_end(bl, SC_SOUNDBLEND);
|
|
|
break;
|
|
|
case EM_DIAMOND_STORM:
|
|
@@ -2203,6 +2207,11 @@ int skill_additional_effect( struct block_list* src, struct block_list *bl, uint
|
|
|
case MT_RUSH_QUAKE:
|
|
|
sc_start( src, bl, SC_RUSH_QUAKE1, 100, skill_lv, skill_get_time( skill_id, skill_lv ) );
|
|
|
break;
|
|
|
+ case HN_SHIELD_CHAIN_RUSH:
|
|
|
+ case HN_JACK_FROST_NOVA:
|
|
|
+ case HN_GROUND_GRAVITATION:
|
|
|
+ sc_start(src, bl, skill_get_sc(skill_id), 100, 0, skill_get_time2(skill_id, skill_lv));
|
|
|
+ break;
|
|
|
} //end switch skill_id
|
|
|
|
|
|
if (md && battle_config.summons_trigger_autospells && md->master_id && md->special_state.ai && md->special_state.ai != AI_ABR && md->special_state.ai != AI_BIONIC)
|
|
@@ -3305,11 +3314,13 @@ void skill_combo(struct block_list* src,struct block_list *dsrc, struct block_li
|
|
|
duration = 1;
|
|
|
target_id = 0; // Will target current auto-target instead
|
|
|
}
|
|
|
+ [[fallthrough]]; // so we can possibly cast TigerFist or straight to ExtremityFist
|
|
|
case CH_TIGERFIST:
|
|
|
if (!duration && pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1) {
|
|
|
duration = 1;
|
|
|
target_id = 0; // Will target current auto-target instead
|
|
|
}
|
|
|
+ [[fallthrough]]; // so we can possibly cast ChainCrush or straight to ExtremityFist
|
|
|
case CH_CHAINCRUSH:
|
|
|
if (!duration && pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball > 0 && sd->sc.getSCE(SC_EXPLOSIONSPIRITS)) {
|
|
|
duration = 1;
|
|
@@ -3814,7 +3825,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
|
if(src->type == BL_PC)
|
|
|
dmg.blewcount = 10;
|
|
|
dmg.amotion = 0; //Disable delay or attack will do no damage since source is dead by the time it takes effect. [Skotlex]
|
|
|
- // fall through
|
|
|
+ [[fallthrough]];
|
|
|
case KN_AUTOCOUNTER:
|
|
|
case NPC_CRITICALSLASH:
|
|
|
case TF_DOUBLE:
|
|
@@ -3896,7 +3907,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
|
dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, (flag&SD_LEVEL) ? -1 : skill_lv, DMG_SPLASH);
|
|
|
if( dsrc != src ) // avoid damage display redundancy
|
|
|
break;
|
|
|
- //Fall through
|
|
|
+ [[fallthrough]];
|
|
|
case HT_LANDMINE:
|
|
|
dmg.dmotion = clif_skill_damage(dsrc,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, dmg_type);
|
|
|
break;
|
|
@@ -3917,7 +3928,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
|
type = DMG_SPLASH;
|
|
|
if (!(flag&SD_ANIMATION))
|
|
|
clif_skill_nodamage(dsrc, bl, skill_id, skill_lv, 1);
|
|
|
- // Fall through
|
|
|
+ [[fallthrough]];
|
|
|
case WM_REVERBERATION:
|
|
|
dmg.dmotion = clif_skill_damage(dsrc, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -2, dmg_type);
|
|
|
break;
|
|
@@ -3948,6 +3959,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
|
case AB_DUPLELIGHT_MELEE:
|
|
|
case AB_DUPLELIGHT_MAGIC:
|
|
|
dmg.amotion = 300;/* makes the damage value not overlap with previous damage (when displayed by the client) */
|
|
|
+ [[fallthrough]];
|
|
|
default:
|
|
|
if( flag&SD_ANIMATION && dmg.div_ < 2 ) //Disabling skill animation doesn't works on multi-hit.
|
|
|
dmg_type = DMG_SPLASH;
|
|
@@ -4143,10 +4155,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
|
|
if (status_get_lv(src) > 29 && rnd() % 100 < 10 * status_get_lv(src) / 30)
|
|
|
skill_addtimerskill(src, tick + dmg.amotion + skill_get_delay(skill_id, skill_lv), bl->id, 0, 0, skill_id, skill_lv, attack_type, flag|2);
|
|
|
break;
|
|
|
- case ABC_DEFT_STAB:
|
|
|
- if (skill_area_temp[1] == bl->id && rnd()%100 < 4 * skill_lv)// Need official autocast chance. [Rytech]
|
|
|
- skill_addtimerskill(src, tick + dmg.amotion, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, 2);
|
|
|
- break;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -4217,7 +4225,7 @@ static int skill_check_unit_range_sub(struct block_list *bl, va_list ap)
|
|
|
case AL_PNEUMA: //Pneuma doesn't work even if just one cell overlaps with Land Protector
|
|
|
if(g_skill_id == SA_LANDPROTECTOR)
|
|
|
break;
|
|
|
- //Fall through
|
|
|
+ [[fallthrough]];
|
|
|
case MH_STEINWAND:
|
|
|
case MG_SAFETYWALL:
|
|
|
case SC_MAELSTROM:
|
|
@@ -4604,7 +4612,8 @@ static TIMER_FUNC(skill_timerskill){
|
|
|
if (unit)
|
|
|
break;
|
|
|
}
|
|
|
- } // Fall through
|
|
|
+ }
|
|
|
+ [[fallthrough]];
|
|
|
case WZ_JUPITEL:
|
|
|
// Official behaviour is to hit as long as there is a line of sight, regardless of distance
|
|
|
if (skl->type > 0 && !status_isdead(target) && path_search_long(NULL,src->m,src->x,src->y,target->x,target->y,CELL_CHKWALL)) {
|
|
@@ -4753,6 +4762,7 @@ static TIMER_FUNC(skill_timerskill){
|
|
|
int dummy = 1, i = skill_get_unit_range(skl->skill_id,skl->skill_lv);
|
|
|
map_foreachinarea(skill_cell_overlap, src->m, skl->x-i, skl->y-i, skl->x+i, skl->y+i, BL_SKILL, skl->skill_id, &dummy, src);
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case WL_EARTHSTRAIN:
|
|
|
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,(skl->type<<16)|skl->flag);
|
|
|
break;
|
|
@@ -4768,6 +4778,22 @@ static TIMER_FUNC(skill_timerskill){
|
|
|
case NC_MAGMA_ERUPTION:
|
|
|
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,0);
|
|
|
break;
|
|
|
+ case HN_METEOR_STORM_BUSTER: {
|
|
|
+ int16 area = 4;
|
|
|
+ int16 tmpx = rnd_value( skl->x - area, skl->x + area );
|
|
|
+ int16 tmpy = rnd_value( skl->y - area, skl->y + area );
|
|
|
+
|
|
|
+ if( map_getcell(src->m, tmpx, tmpy, CELL_CHKLANDPROTECTOR) ) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int splash = skill_get_splash(skl->skill_id, skl->skill_lv);
|
|
|
+
|
|
|
+ clif_skill_poseffect(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, tick);
|
|
|
+ map_foreachinarea(skill_area_sub, src->m, tmpx - splash, tmpy - splash, tmpx + splash, tmpy + splash, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
|
|
|
+ skill_unitsetting(src, skl->skill_id, skl->skill_lv, tmpx, tmpy, skill_get_unit_interval(skl->skill_id));
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
} while (0);
|
|
@@ -5211,27 +5237,20 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
case MT_TRIPLE_LASER:
|
|
|
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
|
break;
|
|
|
-
|
|
|
- case IG_SHIELD_SHOOTING:
|
|
|
- clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
- skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
- sc_start(src, src, SC_SHIELD_POWER, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
|
- break;
|
|
|
case DK_DRAGONIC_AURA:
|
|
|
case DK_STORMSLASH:
|
|
|
- case IG_GRAND_JUDGEMENT:
|
|
|
case CD_EFFLIGO:
|
|
|
case ABC_FRENZY_SHOT:
|
|
|
case WH_HAWKRUSH:
|
|
|
case WH_HAWKBOOMERANG:
|
|
|
case TR_ROSEBLOSSOM:
|
|
|
case TR_RHYTHMSHOOTING:
|
|
|
+ case HN_MEGA_SONIC_BLOW:
|
|
|
+ case HN_SPIRAL_PIERCE_MAX:
|
|
|
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
if (skill_id == DK_DRAGONIC_AURA)
|
|
|
sc_start(src, src, SC_DRAGONIC_AURA, 100, skill_lv, skill_get_time(skill_id,skill_lv));
|
|
|
- else if (skill_id == IG_GRAND_JUDGEMENT)
|
|
|
- sc_start(src, src, SC_SPEAR_SCAR, 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
|
break;
|
|
|
|
|
|
case SHC_ETERNAL_SLASH:
|
|
@@ -5244,8 +5263,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
break;
|
|
|
|
|
|
case SHC_SHADOW_STAB:
|
|
|
- if (sc && (sc->getSCE(SC_CLOAKING) || sc->getSCE(SC_CLOAKINGEXCEED)))
|
|
|
- flag |= 2;// Flag to deal 2 hits.
|
|
|
+ if (sc && sc->getSCE(SC_CLOAKINGEXCEED))
|
|
|
+ flag |= 2;// Flag to deal 3 hits.
|
|
|
|
|
|
status_change_end(src, SC_CLOAKING);
|
|
|
status_change_end(src, SC_CLOAKINGEXCEED);
|
|
@@ -5360,6 +5379,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
#ifndef RENEWAL
|
|
|
case SN_SHARPSHOOTING:
|
|
|
flag |= 2; // Flag for specific mob damage formula
|
|
|
+ [[fallthrough]];
|
|
|
#endif
|
|
|
case MA_SHARPSHOOTING:
|
|
|
case NJ_KAMAITACHI:
|
|
@@ -5515,6 +5535,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
|
|
|
case SU_PICKYPECK:
|
|
|
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
+ [[fallthrough]];
|
|
|
case SU_BITE:
|
|
|
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
break;
|
|
@@ -5530,6 +5551,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
case MC_CARTREVOLUTION:
|
|
|
case NPC_SPLASHATTACK:
|
|
|
flag |= SD_PREAMBLE; // a fake packet will be sent for the first target to be hit
|
|
|
+ [[fallthrough]];
|
|
|
case AS_SPLASHER:
|
|
|
case HT_BLITZBEAT:
|
|
|
case AC_SHOWER:
|
|
@@ -5671,6 +5693,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
case BO_EXPLOSIVE_POWDER:
|
|
|
case BO_MAYHEMIC_THORNS:
|
|
|
case NPC_WIDECRITICALWOUND:
|
|
|
+ case IG_SHIELD_SHOOTING:
|
|
|
+ case TR_METALIC_FURY:
|
|
|
+ case IG_GRAND_JUDGEMENT:
|
|
|
+ case HN_JUPITEL_THUNDER_STORM:
|
|
|
if( flag&1 ) {//Recursive invocation
|
|
|
int sflag = skill_area_temp[0] & 0xFFF;
|
|
|
int heal = 0;
|
|
@@ -5741,6 +5767,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
case DK_DRAGONIC_BREATH:
|
|
|
case DK_HACKANDSLASHER:
|
|
|
case MT_SPARK_BLASTER:
|
|
|
+ case HN_JUPITEL_THUNDER_STORM:
|
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
|
|
break;
|
|
|
#ifdef RENEWAL
|
|
@@ -5867,6 +5894,11 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
// TODO: does this buff start before or after dealing damage? [Muh]
|
|
|
sc_start( src, src, SC_RUSH_QUAKE2, 100, skill_lv, skill_get_time2( skill_id, skill_lv ) );
|
|
|
break;
|
|
|
+ case IG_SHIELD_SHOOTING:
|
|
|
+ case IG_GRAND_JUDGEMENT:
|
|
|
+ clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
+ sc_start(src, src, skill_get_sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv));
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
// if skill damage should be split among targets, count them
|
|
@@ -5886,24 +5918,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
- case TR_METALIC_FURY:
|
|
|
- {
|
|
|
- if (flag & 1) {
|
|
|
- clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
- skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
- } else {
|
|
|
- int area = skill_get_splash(skill_id, skill_lv);
|
|
|
- int count = map_forcountinarea(skill_check_bl_sc,bl->m,bl->x - area,bl->y - area,bl->x + area,bl->y + area,5,BL_MOB,SC_SOUNDBLEND);
|
|
|
- if (count > 0){
|
|
|
- map_foreachinarea(skill_area_sub, bl->m, bl->x - area, bl->y - area, bl->x + area, bl->y + area, BL_CHAR,
|
|
|
- src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id);
|
|
|
- } else{
|
|
|
- clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
- skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
|
|
|
//Place units around target
|
|
|
case NJ_BAKUENRYU:
|
|
@@ -6073,6 +6087,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
|
|
|
case AL_HOLYLIGHT:
|
|
|
status_change_end(bl, SC_P_ALTER);
|
|
|
+ [[fallthrough]];
|
|
|
case MG_SOULSTRIKE:
|
|
|
case NPC_DARKSTRIKE:
|
|
|
case MG_COLDBOLT:
|
|
@@ -6101,6 +6116,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
case AG_ASTRAL_STRIKE_ATK:
|
|
|
case AG_DESTRUCTIVE_HURRICANE_CLIMAX:
|
|
|
case CD_ARBITRIUM:
|
|
|
+ case HN_METEOR_STORM_BUSTER:
|
|
|
skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
|
break;
|
|
|
|
|
@@ -6175,6 +6191,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
|
|
|
case SL_SMA:
|
|
|
status_change_end(src, SC_SMA);
|
|
|
+ [[fallthrough]];
|
|
|
case SL_STIN:
|
|
|
case SL_STUN:
|
|
|
case SP_SPA:
|
|
@@ -6190,6 +6207,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
clif_emotion(src,ET_ANGER);
|
|
|
if (rnd() % 2 == 0)
|
|
|
break; // 50% chance
|
|
|
+ [[fallthrough]];
|
|
|
case SN_FALCONASSAULT:
|
|
|
#ifndef RENEWAL
|
|
|
case PA_PRESSURE:
|
|
@@ -6246,6 +6264,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
case NPC_SELFDESTRUCTION:
|
|
|
if( tsc && tsc->getSCE(SC_HIDING) )
|
|
|
break;
|
|
|
+ [[fallthrough]];
|
|
|
case HVAN_EXPLOSION:
|
|
|
if (src != bl)
|
|
|
skill_attack(BF_MISC,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
@@ -6568,6 +6587,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case RA_WUGBITE:
|
|
|
if( path_search(NULL,src->m,src->x,src->y,bl->x,bl->y,1,CELL_CHKNOREACH) ) {
|
|
|
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
|
@@ -7021,6 +7041,44 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
|
|
sc_start(src, bl, SC_VENOMIMPRESS, 100, skill_lv, skill_get_time(skill_id,skill_lv));
|
|
|
break;
|
|
|
|
|
|
+ case HN_DOUBLEBOWLINGBASH:
|
|
|
+ if (flag & 1) {
|
|
|
+ skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, skill_area_temp[0] & 0xFFF);
|
|
|
+ } else {
|
|
|
+ int splash = skill_get_splash(skill_id, skill_lv);
|
|
|
+ clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
+ skill_area_temp[0] = map_foreachinallrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, BCT_ENEMY, skill_area_sub_count);
|
|
|
+ map_foreachinrange(skill_area_sub, bl, splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id);
|
|
|
+ sc_start(src, src, SC_HNNOWEAPON, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HN_SHIELD_CHAIN_RUSH:
|
|
|
+ if (flag & 1) {
|
|
|
+ skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
+ } else {
|
|
|
+ clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
+ map_foreachinrange(skill_area_sub, bl, 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);
|
|
|
+ sc_start(src, src, SC_HNNOWEAPON, 100, skill_lv, skill_get_time2(skill_id, skill_lv));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HN_JACK_FROST_NOVA:
|
|
|
+ case HN_HELLS_DRIVE:
|
|
|
+ case HN_GROUND_GRAVITATION:
|
|
|
+ if (flag & 1)
|
|
|
+ skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HN_NAPALM_VULCAN_STRIKE:
|
|
|
+ if (flag & 1) {
|
|
|
+ skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag);
|
|
|
+ } else {
|
|
|
+ clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
+ map_foreachinrange(skill_area_sub, bl, 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);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
ShowWarning("skill_castend_damage_id: Unknown skill used:%d\n",skill_id);
|
|
|
clif_skill_damage(src, bl, tick, status_get_amotion(src), tstatus->dmotion,
|
|
@@ -7204,6 +7262,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
if (sd) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0) ;
|
|
|
break ;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case AL_HEAL:
|
|
|
case ALL_RESURRECTION:
|
|
|
case PR_ASPERSIO:
|
|
@@ -7332,11 +7391,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
#endif
|
|
|
status_set_hp(src, 1, 0);
|
|
|
break;
|
|
|
- } else if (status_isdead(bl) && flag&1) { //Revive
|
|
|
- skill_area_temp[0]++; //Count it in, then fall-through to the Resurrection code.
|
|
|
- skill_lv = 3; //Resurrection level 3 is used
|
|
|
- } else //Invalid target, skip resurrection.
|
|
|
+ } else if (!(status_isdead(bl) && flag&1)) {
|
|
|
+ //Invalid target, skip resurrection.
|
|
|
break;
|
|
|
+ }
|
|
|
+ //Revive
|
|
|
+ skill_area_temp[0]++; //Count it in, then fall-through to the Resurrection code.
|
|
|
+ skill_lv = 3; //Resurrection level 3 is used
|
|
|
+ [[fallthrough]];
|
|
|
|
|
|
case ALL_RESURRECTION:
|
|
|
if(sd && (map_flag_gvg2(bl->m) || map_getmapflag(bl->m, MF_BATTLEGROUND)))
|
|
@@ -7506,7 +7568,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
break;
|
|
|
case SA_SUMMONMONSTER:
|
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
|
|
- if (sd) mob_once_spawn(sd, src->m, src->x, src->y,"--ja--", -1, 1, "", SZ_SMALL, AI_NONE);
|
|
|
+ if (sd)
|
|
|
+ mob_once_spawn(sd, src->m, src->x, src->y,"--ja--", -1, 1, "", SZ_SMALL, AI_NONE);
|
|
|
break;
|
|
|
case SA_LEVELUP:
|
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
|
@@ -7519,6 +7582,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
break;
|
|
|
case SA_QUESTION:
|
|
|
clif_emotion(src,ET_QUESTION);
|
|
|
+ [[fallthrough]];
|
|
|
case SA_GRAVITY:
|
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
|
|
break;
|
|
@@ -7774,6 +7838,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
clif_skill_fail(sd, skill_id, USESKILL_FAIL, 0);
|
|
|
break;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case PR_SLOWPOISON:
|
|
|
case PR_LEXAETERNA:
|
|
|
#ifndef RENEWAL
|
|
@@ -7903,6 +7968,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
case NPC_DAMAGE_HEAL:
|
|
|
case NPC_RELIEVE_ON:
|
|
|
case NPC_RELIEVE_OFF:
|
|
|
+ case HN_BREAKINGLIMIT:
|
|
|
+ case HN_RULEBREAK:
|
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,
|
|
|
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)));
|
|
|
break;
|
|
@@ -7969,7 +8036,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
if (skill_id == AG_DESTRUCTIVE_HURRICANE)
|
|
|
splash_size = 9; // 19x19
|
|
|
else if(skill_id == AG_CRYSTAL_IMPACT)
|
|
|
- splash_size = AREA_SIZE; // 29x29 - Entire screen.
|
|
|
+ splash_size = 7; // 15x15
|
|
|
}
|
|
|
|
|
|
skill_area_temp[1] = 0;
|
|
@@ -8627,6 +8694,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
case SR_WINDMILL:
|
|
|
case GN_CART_TORNADO:
|
|
|
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
|
|
+ [[fallthrough]];
|
|
|
case SR_EARTHSHAKER:
|
|
|
case NC_INFRAREDSCAN:
|
|
|
case NPC_VAMPIRE_GIFT:
|
|
@@ -9125,6 +9193,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
if( !mer )
|
|
|
break;
|
|
|
sd = mer->master;
|
|
|
+ [[fallthrough]];
|
|
|
case WZ_ESTIMATION:
|
|
|
if( sd == NULL )
|
|
|
break;
|
|
@@ -9716,6 +9785,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
case SA_ELEMENTWIND:
|
|
|
if (sd && (!dstmd || status_has_mode(tstatus,MD_STATUSIMMUNE))) // Only works on monsters (Except status immune monsters).
|
|
|
break;
|
|
|
+ [[fallthrough]];
|
|
|
case NPC_ATTRICHANGE:
|
|
|
case NPC_CHANGEWATER:
|
|
|
case NPC_CHANGEGROUND:
|
|
@@ -10068,7 +10138,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
// if it is already trapping something don't spring it,
|
|
|
// remove trap should be used instead
|
|
|
break;
|
|
|
- // otherwise fallthrough to below
|
|
|
+ [[fallthrough]];
|
|
|
case UNT_BLASTMINE:
|
|
|
case UNT_SKIDTRAP:
|
|
|
case UNT_LANDMINE:
|
|
@@ -10348,6 +10418,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
status_change_end(bl, SC_SWOO);
|
|
|
break;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case SL_SKA: // [marquis007]
|
|
|
case SL_SKE:
|
|
|
if (sd && !battle_config.allow_es_magic_pc && bl->type != BL_MOB) {
|
|
@@ -10600,6 +10671,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case NPC_WIDEBLEEDING:
|
|
|
case NPC_WIDEBLEEDING2:
|
|
|
case NPC_WIDECONFUSE:
|
|
@@ -12149,6 +12221,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
|
break;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case KO_IZAYOI:
|
|
|
case OB_ZANGETSU:
|
|
|
case KG_KYOMU:
|
|
@@ -12789,6 +12862,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
+ case HN_HELLS_DRIVE:
|
|
|
+ clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
|
|
|
+ map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | 1, skill_castend_damage_id);
|
|
|
+ break;
|
|
|
+
|
|
|
default: {
|
|
|
std::shared_ptr<s_skill_db> skill = skill_db.find(skill_id);
|
|
|
ShowWarning("skill_castend_nodamage_id: missing code case for skill %s(%d)\n", skill ? skill->name : "UNKNOWN", skill_id);
|
|
@@ -13526,6 +13604,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
case SC_ESCAPE:
|
|
|
case SU_CN_METEOR:
|
|
|
case NPC_RAINOFMETEOR:
|
|
|
+ case HN_METEOR_STORM_BUSTER:
|
|
|
break; //Effect is displayed on respective switch case.
|
|
|
default:
|
|
|
if(skill_get_inf(skill_id)&INF_SELF_SKILL)
|
|
@@ -13605,6 +13684,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
return 0; // Don't consume gems if cast on Land Protector
|
|
|
}
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case MG_FIREWALL:
|
|
|
case MG_THUNDERSTORM:
|
|
|
case AL_PNEUMA:
|
|
@@ -13738,6 +13818,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
case EM_CONFLAGRATION:
|
|
|
case EM_TERRA_DRIVE:
|
|
|
flag|=1;//Set flag to 1 to prevent deleting ammo (it will be deleted on group-delete).
|
|
|
+ [[fallthrough]];
|
|
|
case GS_GROUNDDRIFT: //Ammo should be deleted right away.
|
|
|
case GN_WALLOFTHORN:
|
|
|
case GN_DEMONIC_FIRE:
|
|
@@ -13813,7 +13894,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
if (pc_checkskill(sd, SU_SPIRITOFLAND))
|
|
|
sc_start(src, src, SC_DORAM_SVSP, 100, 100, skill_get_time(SU_SPIRITOFLAND, 1));
|
|
|
}
|
|
|
- // Fall through
|
|
|
+ [[fallthrough]];
|
|
|
case WZ_METEOR:
|
|
|
{
|
|
|
int area = skill_get_splash(skill_id, skill_lv);
|
|
@@ -14054,6 +14135,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
|
|
|
case AC_SHOWER:
|
|
|
status_change_end(src, SC_CAMOUFLAGE);
|
|
|
+ [[fallthrough]];
|
|
|
case MA_SHOWER:
|
|
|
case NC_COLDSLOWER:
|
|
|
case RK_DRAGONBREATH:
|
|
@@ -14430,6 +14512,41 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
+ case HN_JACK_FROST_NOVA:
|
|
|
+ case HN_GROUND_GRAVITATION: {
|
|
|
+ if( map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) {
|
|
|
+ clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int splash = skill_get_splash(skill_id, skill_lv);
|
|
|
+
|
|
|
+ map_foreachinarea(skill_area_sub, src->m, x - splash, y - splash, x + splash, y + splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
|
|
|
+ skill_unitsetting(src, skill_id, skill_lv, x, y, flag);
|
|
|
+
|
|
|
+ for (i = 1; i <= (skill_get_time(skill_id, skill_lv) / skill_get_unit_interval(skill_id)); i++) {
|
|
|
+ skill_addtimerskill(src, tick + (t_tick)i*skill_get_unit_interval(skill_id), 0, x, y, skill_id, skill_lv, 0, flag);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case HN_METEOR_STORM_BUSTER: {
|
|
|
+ if( map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) {
|
|
|
+ clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ int splash = skill_get_splash(skill_id, skill_lv);
|
|
|
+
|
|
|
+ map_foreachinarea(skill_area_sub, src->m, x - splash, y - splash, x + splash, y + splash, BL_CHAR, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | SKILL_ALTDMG_FLAG | 1, skill_castend_damage_id);
|
|
|
+ skill_unitsetting(src, skill_id, skill_lv, x, y, skill_get_unit_interval(skill_id));
|
|
|
+
|
|
|
+ for (i = 1; i <= (skill_get_time(skill_id, skill_lv) / skill_get_time2(skill_id, skill_lv)); i++) {
|
|
|
+ skill_addtimerskill(src, tick + (t_tick)i*skill_get_time2(skill_id, skill_lv), 0, x, y, skill_id, skill_lv, 0, flag);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
ShowWarning("skill_castend_pos2: Unknown skill used:%d\n",skill_id);
|
|
|
return 1;
|
|
@@ -14769,6 +14886,7 @@ std::shared_ptr<s_skill_unit_group> skill_unitsetting(struct block_list *src, ui
|
|
|
case SU_CN_METEOR:
|
|
|
case SU_CN_METEOR2:
|
|
|
case NPC_RAINOFMETEOR:
|
|
|
+ case HN_METEOR_STORM_BUSTER:
|
|
|
limit = flag;
|
|
|
flag = 0; // Flag should not influence anything else for these skills
|
|
|
break;
|
|
@@ -14788,6 +14906,7 @@ std::shared_ptr<s_skill_unit_group> skill_unitsetting(struct block_list *src, ui
|
|
|
case MA_SKIDTRAP:
|
|
|
//Save position of caster
|
|
|
val1 = ((src->x)<<16)|(src->y);
|
|
|
+ [[fallthrough]];
|
|
|
case HT_ANKLESNARE:
|
|
|
case HT_SHOCKWAVE:
|
|
|
case HT_SANDMAN:
|
|
@@ -14960,12 +15079,16 @@ std::shared_ptr<s_skill_unit_group> skill_unitsetting(struct block_list *src, ui
|
|
|
switch (val1) {
|
|
|
case ELE_FIRE:
|
|
|
subunt++;
|
|
|
+ [[fallthrough]];
|
|
|
case ELE_WATER:
|
|
|
subunt++;
|
|
|
+ [[fallthrough]];
|
|
|
case ELE_POISON:
|
|
|
subunt++;
|
|
|
+ [[fallthrough]];
|
|
|
case ELE_DARK:
|
|
|
subunt++;
|
|
|
+ [[fallthrough]];
|
|
|
case ELE_WIND:
|
|
|
break;
|
|
|
default:
|
|
@@ -15001,6 +15124,7 @@ std::shared_ptr<s_skill_unit_group> skill_unitsetting(struct block_list *src, ui
|
|
|
case WM_POEMOFNETHERWORLD: // Can't be placed on top of Land Protector.
|
|
|
if( skill_id == WM_POEMOFNETHERWORLD && map_flag_gvg2(src->m) )
|
|
|
target = BCT_ALL;
|
|
|
+ [[fallthrough]];
|
|
|
case WM_SEVERE_RAINSTORM:
|
|
|
case SO_WATER_INSIGNIA:
|
|
|
case SO_FIRE_INSIGNIA:
|
|
@@ -15470,6 +15594,7 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, t_
|
|
|
case UNT_HERMODE:
|
|
|
if (sg->src_id!=bl->id && battle_check_target(&unit->bl,bl,BCT_PARTY|BCT_GUILD) > 0)
|
|
|
status_change_clear_buffs(bl, SCCB_HERMODE); //Should dispell only allies.
|
|
|
+ [[fallthrough]];
|
|
|
case UNT_RICHMANKIM:
|
|
|
case UNT_ETERNALCHAOS:
|
|
|
case UNT_DRUMBATTLEFIELD:
|
|
@@ -15947,11 +16072,13 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t
|
|
|
case UNT_VERDURETRAP:
|
|
|
if( bl->type == BL_PC )// it won't work on players
|
|
|
break;
|
|
|
+ [[fallthrough]];
|
|
|
case UNT_FIRINGTRAP:
|
|
|
case UNT_ICEBOUNDTRAP:
|
|
|
case UNT_CLUSTERBOMB:
|
|
|
if( bl->id == ss->id )// it won't trigger on caster
|
|
|
break;
|
|
|
+ [[fallthrough]];
|
|
|
case UNT_BLASTMINE:
|
|
|
case UNT_SHOCKWAVE:
|
|
|
case UNT_SANDMAN:
|
|
@@ -16469,6 +16596,7 @@ int skill_unit_onout(struct skill_unit *src, struct block_list *bl, t_tick tick)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case UNT_WHISTLE:
|
|
|
case UNT_ASSASSINCROSS:
|
|
|
case UNT_POEMBRAGI:
|
|
@@ -16528,6 +16656,7 @@ int skill_unit_onleft(uint16 skill_id, struct block_list *bl, t_tick tick)
|
|
|
//your own. Let's pray that scenario is pretty unlikely and noone will complain too much about it.
|
|
|
status_change_end(bl, SC_DANCING);
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case MH_STEINWAND:
|
|
|
case MG_SAFETYWALL:
|
|
|
case AL_PNEUMA:
|
|
@@ -17168,15 +17297,15 @@ bool skill_check_condition_castbegin(map_session_data* sd, uint16 skill_id, uint
|
|
|
// perform skill-group checks
|
|
|
if(skill_id != WM_GREAT_ECHO && inf2[INF2_ISCHORUS]) {
|
|
|
if (skill_check_pc_partner(sd, skill_id, &skill_lv, AREA_SIZE, 0) < 1) {
|
|
|
- clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
|
- return false;
|
|
|
+ clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
|
+ return false;
|
|
|
}
|
|
|
}
|
|
|
else if(inf2[INF2_ISENSEMBLE]) {
|
|
|
- if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1 && !(sc && sc->getSCE(SC_KVASIR_SONATA))) {
|
|
|
- clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
|
- return false;
|
|
|
- }
|
|
|
+ if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1 && !(sc && sc->getSCE(SC_KVASIR_SONATA))) {
|
|
|
+ clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
// perform skill-specific checks (and actions)
|
|
|
switch( skill_id ) {
|
|
@@ -17191,6 +17320,7 @@ bool skill_check_condition_castbegin(map_session_data* sd, uint16 skill_id, uint
|
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
|
return false;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case SA_CASTCANCEL:
|
|
|
if(sd->ud.skilltimer == INVALID_TIMER) {
|
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
@@ -17478,6 +17608,7 @@ bool skill_check_condition_castbegin(map_session_data* sd, uint16 skill_id, uint
|
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
|
return false;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case GD_EMERGENCYCALL:
|
|
|
case GD_ITEMEMERGENCYCALL:
|
|
|
// other checks were already done in skill_isNotOk()
|
|
@@ -17501,6 +17632,7 @@ bool skill_check_condition_castbegin(map_session_data* sd, uint16 skill_id, uint
|
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
|
return false;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case NJ_BUNSINJYUTSU:
|
|
|
if (!(sc && sc->getSCE(SC_NEN))) {
|
|
|
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
|
|
@@ -18363,7 +18495,7 @@ void skill_consume_requirement(map_session_data *sd, uint16 skill_id, uint16 ski
|
|
|
case MO_KITRANSLATION:
|
|
|
//Spiritual Bestowment only uses spirit sphere when giving it to someone
|
|
|
require.spiritball = 0;
|
|
|
- //Fall through
|
|
|
+ [[fallthrough]];
|
|
|
default:
|
|
|
if(sd->state.autocast)
|
|
|
require.sp = 0;
|
|
@@ -18602,7 +18734,7 @@ struct s_skill_condition skill_get_requirement(map_session_data* sd, uint16 skil
|
|
|
case NC_REPAIR: // NOTE: Repair_Kit must be last in the ItemCost list depending on the skill's max level
|
|
|
req.itemid[1] = skill->require.itemid[skill->max];
|
|
|
req.amount[1] = skill->require.amount[skill->max];
|
|
|
- // Fall through
|
|
|
+ [[fallthrough]];
|
|
|
|
|
|
/* Normal skill requirements and gemstone checks */
|
|
|
default:
|
|
@@ -19697,7 +19829,7 @@ int skill_attack_area(struct block_list *bl, va_list ap)
|
|
|
return 0; //Does not hit current cell
|
|
|
if (map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR)) // Attack should not happen if the target is on Land Protector
|
|
|
return 0;
|
|
|
- //Fall through
|
|
|
+ [[fallthrough]];
|
|
|
case NPC_ACIDBREATH:
|
|
|
case NPC_DARKNESSBREATH:
|
|
|
case NPC_FIREBREATH:
|
|
@@ -19979,6 +20111,7 @@ static int skill_cell_overlap(struct block_list *bl, va_list ap)
|
|
|
case GN_CRAZYWEED_ATK:
|
|
|
if (skill_get_unit_flag(unit->group->skill_id, UF_CRAZYWEEDIMMUNE))
|
|
|
break;
|
|
|
+ [[fallthrough]];
|
|
|
case HW_GANBANTEIN:
|
|
|
case LG_EARTHDRIVE:
|
|
|
// Officially songs/dances are removed
|
|
@@ -20161,6 +20294,7 @@ static int skill_trap_splash(struct block_list *bl, va_list ap)
|
|
|
if (su && su->group->unit_id == UNT_USED_TRAPS)
|
|
|
break;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case UNT_CLUSTERBOMB:
|
|
|
if( ss != bl )
|
|
|
skill_attack(BF_MISC,ss,src,bl,sg->skill_id,sg->skill_lv,tick,sg->val1|SD_LEVEL);
|
|
@@ -20189,6 +20323,7 @@ static int skill_trap_splash(struct block_list *bl, va_list ap)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
default: {
|
|
|
int split_count = 0;
|
|
|
|
|
@@ -20948,7 +21083,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
unit->limit = DIFF_TICK(tick + group->interval,group->tick);
|
|
|
if( unit->val1 <= 0 )
|
|
|
skill_delunit(unit);
|
|
|
- break;
|
|
|
+ break;
|
|
|
case UNT_BLASTMINE:
|
|
|
#ifdef RENEWAL
|
|
|
case UNT_CLAYMORETRAP:
|
|
@@ -20962,7 +21097,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
//clif_changetraplook(bl, UNT_FIREPILLAR_ACTIVE);
|
|
|
group->limit=DIFF_TICK(tick+1500,group->tick);
|
|
|
unit->limit=DIFF_TICK(tick+1500,group->tick);
|
|
|
- break;
|
|
|
+ break;
|
|
|
|
|
|
case UNT_ANKLESNARE:
|
|
|
case UNT_ELECTRICSHOCKER:
|
|
@@ -20970,6 +21105,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
skill_delunit(unit);
|
|
|
break;
|
|
|
}
|
|
|
+ [[fallthrough]];
|
|
|
case UNT_SKIDTRAP:
|
|
|
case UNT_LANDMINE:
|
|
|
case UNT_SHOCKWAVE:
|
|
@@ -20999,7 +21135,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
}
|
|
|
skill_delunit(unit);
|
|
|
}
|
|
|
- break;
|
|
|
+ break;
|
|
|
|
|
|
case UNT_WARP_ACTIVE:
|
|
|
// warp portal opens (morph to a UNT_WARP_WAITING cell)
|
|
@@ -21010,7 +21146,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
unit->limit = skill_get_time(group->skill_id,group->skill_lv);
|
|
|
// apply effect to all units standing on it
|
|
|
map_foreachincell(skill_unit_effect,unit->bl.m,unit->bl.x,unit->bl.y,group->bl_flag,&unit->bl,gettick(),1);
|
|
|
- break;
|
|
|
+ break;
|
|
|
|
|
|
case UNT_CALLFAMILY:
|
|
|
{
|
|
@@ -21029,7 +21165,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
}
|
|
|
skill_delunit(unit);
|
|
|
}
|
|
|
- break;
|
|
|
+ break;
|
|
|
|
|
|
case UNT_REVERBERATION:
|
|
|
case UNT_NETHERWORLD:
|
|
@@ -21052,7 +21188,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
map_foreachinrange(skill_area_sub, &unit->bl, unit->range, BL_CHAR|BL_SKILL, src, group->skill_id, group->skill_lv, tick, BCT_ENEMY|SD_ANIMATION|5, skill_castend_damage_id);
|
|
|
skill_delunit(unit);
|
|
|
}
|
|
|
- break;
|
|
|
+ break;
|
|
|
|
|
|
case UNT_BANDING:
|
|
|
{
|
|
@@ -21066,7 +21202,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
group->limit = DIFF_TICK(tick+group->interval,group->tick);
|
|
|
unit->limit = DIFF_TICK(tick+group->interval,group->tick);
|
|
|
}
|
|
|
- break;
|
|
|
+ break;
|
|
|
|
|
|
case UNT_B_TRAP:
|
|
|
{
|
|
@@ -21084,7 +21220,8 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
|
|
|
default:
|
|
|
if (group->val2 == 1 && (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 ||
|
|
|
- group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR)) {
|
|
|
+ group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR ||
|
|
|
+ group->skill_id == HN_METEOR_STORM_BUSTER)) {
|
|
|
// Deal damage before expiration
|
|
|
break;
|
|
|
}
|
|
@@ -21140,7 +21277,8 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
break;
|
|
|
default:
|
|
|
if (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 ||
|
|
|
- group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR) {
|
|
|
+ group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR ||
|
|
|
+ group->skill_id == HN_METEOR_STORM_BUSTER) {
|
|
|
if (group->val2 == 0 && (DIFF_TICK(tick, group->tick) >= group->limit - group->interval || DIFF_TICK(tick, group->tick) >= unit->limit - group->interval)) {
|
|
|
// Unit will expire the next interval, start dropping Meteor
|
|
|
block_list *src = map_id2bl(group->src_id);
|
|
@@ -21182,6 +21320,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap)
|
|
|
}
|
|
|
else if (group->skill_id == WZ_METEOR || group->skill_id == SU_CN_METEOR || group->skill_id == SU_CN_METEOR2 ||
|
|
|
group->skill_id == AG_VIOLENT_QUAKE_ATK || group->skill_id == AG_ALL_BLOOM_ATK || group->skill_id == AG_ALL_BLOOM_ATK2 || group->skill_id == NPC_RAINOFMETEOR ||
|
|
|
+ group->skill_id == HN_METEOR_STORM_BUSTER ||
|
|
|
((group->skill_id == CR_GRANDCROSS || group->skill_id == NPC_GRANDDARKNESS) && unit->val1 <= 0)) {
|
|
|
skill_delunit(unit);
|
|
|
return 0;
|
|
@@ -22129,6 +22268,7 @@ bool skill_produce_mix(map_session_data *sd, uint16 skill_id, t_itemid nameid, i
|
|
|
switch (skill_id) {
|
|
|
case ASC_CDP: //25% Damage yourself, and display same effect as failed potion.
|
|
|
status_percent_damage(NULL, &sd->bl, -25, 0, true);
|
|
|
+ [[fallthrough]];
|
|
|
case AM_PHARMACY:
|
|
|
case AM_TWILIGHT1:
|
|
|
case AM_TWILIGHT2:
|
|
@@ -23333,6 +23473,7 @@ int skill_block_check(struct block_list *bl, sc_type type , uint16 skill_id) {
|
|
|
case SC_KAGEHUMI:
|
|
|
if (skill_get_inf2(skill_id, INF2_IGNOREKAGEHUMI))
|
|
|
return 1;
|
|
|
+ break;
|
|
|
case SC_BITE:
|
|
|
if (skill_get_inf2(skill_id, INF2_IGNOREWUGBITE))
|
|
|
return 1;
|