@@ -2386,6 +2386,7 @@ DBOptions db_fix_options(DBType type, DBOptions options)
|
||||
|
||||
default:
|
||||
ShowError("db_fix_options: Unknown database type %u with options %x\n", type, options);
|
||||
[[fallthrough]];
|
||||
case DB_STRING:
|
||||
case DB_ISTRING: // String databases, no fix required
|
||||
return options;
|
||||
|
||||
@@ -164,6 +164,7 @@ void mapindex_init(void) {
|
||||
switch (sscanf(line, "%11s\t%d", map_name, &index)) {
|
||||
case 1: //Map with no ID given, auto-assign
|
||||
index = last_index+1;
|
||||
[[fallthrough]];
|
||||
case 2: //Map with ID given
|
||||
mapindex_addmap(index,map_name);
|
||||
break;
|
||||
|
||||
@@ -511,59 +511,91 @@ static int Sql_P_BindSqlDataType(MYSQL_BIND* bind, enum SqlDataType buffer_type,
|
||||
memset(bind, 0, sizeof(MYSQL_BIND));
|
||||
switch( buffer_type )
|
||||
{
|
||||
case SQLDT_NULL: bind->buffer_type = MYSQL_TYPE_NULL;
|
||||
case SQLDT_NULL:
|
||||
bind->buffer_type = MYSQL_TYPE_NULL;
|
||||
buffer_len = 0;// FIXME length = ? [FlavioJS]
|
||||
break;
|
||||
// fixed size
|
||||
case SQLDT_UINT8: bind->is_unsigned = 1;
|
||||
case SQLDT_INT8: bind->buffer_type = MYSQL_TYPE_TINY;
|
||||
case SQLDT_UINT8:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_INT8:
|
||||
bind->buffer_type = MYSQL_TYPE_TINY;
|
||||
buffer_len = 1;
|
||||
break;
|
||||
case SQLDT_UINT16: bind->is_unsigned = 1;
|
||||
case SQLDT_INT16: bind->buffer_type = MYSQL_TYPE_SHORT;
|
||||
case SQLDT_UINT16:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_INT16:
|
||||
bind->buffer_type = MYSQL_TYPE_SHORT;
|
||||
buffer_len = 2;
|
||||
break;
|
||||
case SQLDT_UINT32: bind->is_unsigned = 1;
|
||||
case SQLDT_INT32: bind->buffer_type = MYSQL_TYPE_LONG;
|
||||
case SQLDT_UINT32:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_INT32:
|
||||
bind->buffer_type = MYSQL_TYPE_LONG;
|
||||
buffer_len = 4;
|
||||
break;
|
||||
case SQLDT_UINT64: bind->is_unsigned = 1;
|
||||
case SQLDT_INT64: bind->buffer_type = MYSQL_TYPE_LONGLONG;
|
||||
case SQLDT_UINT64:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_INT64:
|
||||
bind->buffer_type = MYSQL_TYPE_LONGLONG;
|
||||
buffer_len = 8;
|
||||
break;
|
||||
// platform dependent size
|
||||
case SQLDT_UCHAR: bind->is_unsigned = 1;
|
||||
case SQLDT_CHAR: bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(char));
|
||||
case SQLDT_UCHAR:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_CHAR:
|
||||
bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(char));
|
||||
buffer_len = sizeof(char);
|
||||
break;
|
||||
case SQLDT_USHORT: bind->is_unsigned = 1;
|
||||
case SQLDT_SHORT: bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(short));
|
||||
case SQLDT_USHORT:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_SHORT:
|
||||
bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(short));
|
||||
buffer_len = sizeof(short);
|
||||
break;
|
||||
case SQLDT_UINT: bind->is_unsigned = 1;
|
||||
case SQLDT_INT: bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(int));
|
||||
case SQLDT_UINT:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_INT:
|
||||
bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(int));
|
||||
buffer_len = sizeof(int);
|
||||
break;
|
||||
case SQLDT_ULONG: bind->is_unsigned = 1;
|
||||
case SQLDT_LONG: bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(long));
|
||||
case SQLDT_ULONG:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_LONG:
|
||||
bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(long));
|
||||
buffer_len = sizeof(long);
|
||||
break;
|
||||
case SQLDT_ULONGLONG: bind->is_unsigned = 1;
|
||||
case SQLDT_LONGLONG: bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(int64));
|
||||
case SQLDT_ULONGLONG:
|
||||
bind->is_unsigned = 1;
|
||||
[[fallthrough]];
|
||||
case SQLDT_LONGLONG:
|
||||
bind->buffer_type = Sql_P_SizeToMysqlIntType(sizeof(int64));
|
||||
buffer_len = sizeof(int64);
|
||||
break;
|
||||
// floating point
|
||||
case SQLDT_FLOAT: bind->buffer_type = MYSQL_TYPE_FLOAT;
|
||||
case SQLDT_FLOAT:
|
||||
bind->buffer_type = MYSQL_TYPE_FLOAT;
|
||||
buffer_len = 4;
|
||||
break;
|
||||
case SQLDT_DOUBLE: bind->buffer_type = MYSQL_TYPE_DOUBLE;
|
||||
case SQLDT_DOUBLE:
|
||||
bind->buffer_type = MYSQL_TYPE_DOUBLE;
|
||||
buffer_len = 8;
|
||||
break;
|
||||
// other
|
||||
case SQLDT_STRING:
|
||||
case SQLDT_ENUM: bind->buffer_type = MYSQL_TYPE_STRING;
|
||||
case SQLDT_ENUM:
|
||||
bind->buffer_type = MYSQL_TYPE_STRING;
|
||||
break;
|
||||
case SQLDT_BLOB: bind->buffer_type = MYSQL_TYPE_BLOB;
|
||||
case SQLDT_BLOB:
|
||||
bind->buffer_type = MYSQL_TYPE_BLOB;
|
||||
break;
|
||||
default:
|
||||
ShowDebug("Sql_P_BindSqlDataType: unsupported buffer type (%d)\n", buffer_type);
|
||||
|
||||
@@ -1605,6 +1605,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam
|
||||
case W_WHIP:
|
||||
if(!tsd->state.arrow_atk)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
case W_BOW:
|
||||
case W_REVOLVER:
|
||||
case W_RIFLE:
|
||||
@@ -2263,7 +2264,7 @@ int64 battle_addmastery(map_session_data *sd,struct block_list *target,int64 dmg
|
||||
case W_FIST:
|
||||
if((skill = pc_checkskill(sd,TK_RUN)) > 0)
|
||||
damage += (skill * 10);
|
||||
// No break, fallthrough to Knuckles
|
||||
[[fallthrough]];
|
||||
case W_KNUCKLE:
|
||||
if((skill = pc_checkskill(sd,MO_IRONHAND)) > 0)
|
||||
damage += (skill * 3);
|
||||
@@ -2924,6 +2925,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct
|
||||
break;
|
||||
clif_specialeffect(src, EF_AUTOCOUNTER, AREA);
|
||||
status_change_end(src, SC_AUTOCOUNTER);
|
||||
[[fallthrough]];
|
||||
case KN_AUTOCOUNTER:
|
||||
if(battle_config.auto_counter_type &&
|
||||
(battle_config.auto_counter_type&src->type))
|
||||
@@ -4036,11 +4038,30 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s
|
||||
{
|
||||
int chance = rnd()%100;
|
||||
switch(sc->getSCE(SC_FEARBREEZE)->val1) {
|
||||
case 5: if( chance < 4) { wd->div_ = 5; break; } // 3 % chance to attack 5 times.
|
||||
case 4: if( chance < 7) { wd->div_ = 4; break; } // 6 % chance to attack 4 times.
|
||||
case 3: if( chance < 10) { wd->div_ = 3; break; } // 9 % chance to attack 3 times.
|
||||
case 5:
|
||||
if (chance < 4) {
|
||||
wd->div_ = 5;
|
||||
break;
|
||||
} // 3 % chance to attack 5 times.
|
||||
[[fallthrough]];
|
||||
case 4:
|
||||
if (chance < 7) {
|
||||
wd->div_ = 4;
|
||||
break;
|
||||
} // 6 % chance to attack 4 times.
|
||||
[[fallthrough]];
|
||||
case 3:
|
||||
if (chance < 10) {
|
||||
wd->div_ = 3;
|
||||
break;
|
||||
} // 9 % chance to attack 3 times.
|
||||
[[fallthrough]];
|
||||
case 2:
|
||||
case 1: if( chance < 13) { wd->div_ = 2; break; } // 12 % chance to attack 2 times.
|
||||
case 1:
|
||||
if (chance < 13) {
|
||||
wd->div_ = 2;
|
||||
break;
|
||||
} // 12 % chance to attack 2 times.
|
||||
}
|
||||
wd->div_ = min(wd->div_,sd->inventory.u.items_inventory[i].amount);
|
||||
sc->getSCE(SC_FEARBREEZE)->val4 = wd->div_-1;
|
||||
@@ -4491,7 +4512,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list *
|
||||
skillratio += 100 + 50 * skill_lv;
|
||||
break;
|
||||
}
|
||||
// Fall through
|
||||
[[fallthrough]];
|
||||
case MA_SHARPSHOOTING:
|
||||
#ifdef RENEWAL
|
||||
skillratio += -100 + 300 + 300 * skill_lv;
|
||||
@@ -6608,7 +6629,7 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block
|
||||
|
||||
case GS_GROUNDDRIFT:
|
||||
wd.amotion = sstatus->amotion;
|
||||
//Fall through
|
||||
[[fallthrough]];
|
||||
case KN_SPEARSTAB:
|
||||
#ifndef RENEWAL
|
||||
case KN_BOWLINGBASH:
|
||||
@@ -7267,7 +7288,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
|
||||
case MG_FIREWALL:
|
||||
if ( tstatus->def_ele == ELE_FIRE || battle_check_undead(tstatus->race, tstatus->def_ele) )
|
||||
ad.blewcount = 0; //No knockback
|
||||
//Fall through
|
||||
[[fallthrough]];
|
||||
case NJ_KAENSIN:
|
||||
case PR_SANCTUARY:
|
||||
ad.dmotion = 1; //No flinch animation.
|
||||
@@ -8649,6 +8670,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
||||
case RA_ICEBOUNDTRAP:
|
||||
if (md.damage == 1)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
case RA_CLUSTERBOMB:
|
||||
{
|
||||
struct Damage wd = battle_calc_weapon_attack(src,target,skill_id,skill_lv,mflag);
|
||||
|
||||
@@ -66,6 +66,7 @@ struct Channel* channel_create(struct Channel *tmp_chan) {
|
||||
break;
|
||||
case CHAN_TYPE_PRIVATE:
|
||||
channel->char_id = tmp_chan->char_id;
|
||||
[[fallthrough]];
|
||||
default:
|
||||
strdb_put(channel_db, channel->name, channel);
|
||||
break;
|
||||
|
||||
@@ -915,6 +915,7 @@ static void chrif_ack_login_req(int aid, const char* player_name, uint16 type, u
|
||||
case CHRIF_OP_LOGIN_CHANGESEX:
|
||||
case CHRIF_OP_CHANGECHARSEX:
|
||||
type = CHRIF_OP_LOGIN_CHANGESEX; // So we don't have to create a new msgstring.
|
||||
[[fallthrough]];
|
||||
case CHRIF_OP_LOGIN_BLOCK:
|
||||
case CHRIF_OP_LOGIN_BAN:
|
||||
case CHRIF_OP_LOGIN_UNBLOCK:
|
||||
|
||||
@@ -529,6 +529,7 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
|
||||
case AREA_WOSC:
|
||||
if (sd && bl->prev == NULL) //Otherwise source misses the packet.[Skotlex]
|
||||
clif_send (buf, len, bl, SELF);
|
||||
[[fallthrough]];
|
||||
case AREA_WOC:
|
||||
case AREA_WOS:
|
||||
map_foreachinallarea(clif_send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE,
|
||||
@@ -568,6 +569,7 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
|
||||
y0 = bl->y - AREA_SIZE;
|
||||
x1 = bl->x + AREA_SIZE;
|
||||
y1 = bl->y + AREA_SIZE;
|
||||
[[fallthrough]];
|
||||
case PARTY:
|
||||
case PARTY_WOS:
|
||||
case PARTY_SAMEMAP:
|
||||
@@ -644,6 +646,7 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
|
||||
y0 = bl->y - AREA_SIZE;
|
||||
x1 = bl->x + AREA_SIZE;
|
||||
y1 = bl->y + AREA_SIZE;
|
||||
[[fallthrough]];
|
||||
case GUILD_SAMEMAP:
|
||||
case GUILD_SAMEMAP_WOS:
|
||||
case GUILD:
|
||||
@@ -695,6 +698,7 @@ int clif_send(const void* buf, int len, struct block_list* bl, enum send_target
|
||||
y0 = bl->y - AREA_SIZE;
|
||||
x1 = bl->x + AREA_SIZE;
|
||||
y1 = bl->y + AREA_SIZE;
|
||||
[[fallthrough]];
|
||||
case BG_SAMEMAP:
|
||||
case BG_SAMEMAP_WOS:
|
||||
case BG:
|
||||
@@ -15165,6 +15169,7 @@ void clif_parse_NoviceDoriDori(int fd, map_session_data *sd)
|
||||
case MAPID_TAEKWON:
|
||||
if (!sd->state.rest)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
case MAPID_SUPER_NOVICE:
|
||||
case MAPID_SUPER_BABY:
|
||||
case MAPID_SUPER_NOVICE_E:
|
||||
@@ -17672,7 +17677,7 @@ std::string clif_quest_string( std::shared_ptr<s_quest_objective> objective ){
|
||||
case RC_DRAGON: race_name = "Dragon"; break;
|
||||
default:
|
||||
ShowWarning( "clif_quest_string: Unsupported race %d - using empty string...\n", objective->race );
|
||||
// Fallthrough
|
||||
[[fallthrough]];
|
||||
case RC_ALL: race_name = ""; break;
|
||||
}
|
||||
|
||||
@@ -17684,7 +17689,7 @@ std::string clif_quest_string( std::shared_ptr<s_quest_objective> objective ){
|
||||
case SZ_BIG: size_name = "Large"; break;
|
||||
default:
|
||||
ShowWarning( "clif_quest_string: Unsupported size %d - using empty string...\n", objective->size );
|
||||
// Fallthrough
|
||||
[[fallthrough]];
|
||||
case SZ_ALL: size_name = ""; break;
|
||||
}
|
||||
|
||||
@@ -17703,7 +17708,7 @@ std::string clif_quest_string( std::shared_ptr<s_quest_objective> objective ){
|
||||
case ELE_UNDEAD: ele_name = "Undead Element"; break;
|
||||
default:
|
||||
ShowWarning( "clif_quest_string: Unsupported element %d - using empty string...\n", objective->element );
|
||||
// Fallthrough
|
||||
[[fallthrough]];
|
||||
case ELE_ALL: ele_name = ""; break;
|
||||
}
|
||||
|
||||
|
||||
@@ -514,23 +514,16 @@ static int elemental_ai_sub_timer_activesearch(block_list *bl, va_list ap) {
|
||||
if( battle_check_target(&ed->bl,bl,BCT_ENEMY) <= 0 )
|
||||
return 0;
|
||||
|
||||
int dist;
|
||||
|
||||
switch( bl->type ) {
|
||||
case BL_PC:
|
||||
if( !map_flag_vs(ed->bl.m) )
|
||||
return 0;
|
||||
default:
|
||||
dist = distance_bl(&ed->bl, bl);
|
||||
if( ((*target) == NULL || !check_distance_bl(&ed->bl, *target, dist)) && battle_check_range(&ed->bl,bl,ed->db->range2) ) { //Pick closest target?
|
||||
(*target) = bl;
|
||||
ed->target_id = bl->id;
|
||||
ed->min_chase = dist + ed->db->range3;
|
||||
if( ed->min_chase > AREA_SIZE )
|
||||
ed->min_chase = AREA_SIZE;
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
if (bl->type == BL_PC && !map_flag_vs(ed->bl.m))
|
||||
return 0;
|
||||
int dist = distance_bl(&ed->bl, bl);
|
||||
if( ((*target) == nullptr || !check_distance_bl(&ed->bl, *target, dist)) && battle_check_range(&ed->bl,bl,ed->db->range2) ) { //Pick closest target?
|
||||
(*target) = bl;
|
||||
ed->target_id = bl->id;
|
||||
ed->min_chase = dist + ed->db->range3;
|
||||
if( ed->min_chase > AREA_SIZE )
|
||||
ed->min_chase = AREA_SIZE;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1281,37 +1281,33 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
|
||||
if(battle_check_target(&md->bl,bl,BCT_ENEMY)<=0)
|
||||
return 0;
|
||||
|
||||
switch (bl->type)
|
||||
{
|
||||
case BL_PC:
|
||||
if (((TBL_PC*)bl)->state.gangsterparadise &&
|
||||
!status_has_mode(&md->status,MD_STATUSIMMUNE))
|
||||
return 0; //Gangster paradise protection.
|
||||
default:
|
||||
if (battle_config.hom_setting&HOMSET_FIRST_TARGET &&
|
||||
(*target) && (*target)->type == BL_HOM && bl->type != BL_HOM)
|
||||
return 0; //For some reason Homun targets are never overriden.
|
||||
if (bl->type == BL_PC && BL_CAST(BL_PC, bl)->state.gangsterparadise &&
|
||||
!status_has_mode(&md->status,MD_STATUSIMMUNE))
|
||||
return 0; //Gangster paradise protection.
|
||||
|
||||
dist = distance_bl(&md->bl, bl);
|
||||
if(
|
||||
((*target) == NULL || !check_distance_bl(&md->bl, *target, dist)) &&
|
||||
battle_check_range(&md->bl,bl,md->db->range2)
|
||||
) { //Pick closest target?
|
||||
if (battle_config.hom_setting&HOMSET_FIRST_TARGET &&
|
||||
(*target) != nullptr && (*target)->type == BL_HOM && bl->type != BL_HOM)
|
||||
return 0; //For some reason Homun targets are never overriden.
|
||||
|
||||
dist = distance_bl(&md->bl, bl);
|
||||
if(
|
||||
((*target) == nullptr || !check_distance_bl(&md->bl, *target, dist)) &&
|
||||
battle_check_range(&md->bl,bl,md->db->range2)
|
||||
) { //Pick closest target?
|
||||
#ifdef ACTIVEPATHSEARCH
|
||||
struct walkpath_data wpd;
|
||||
if (!path_search(&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x, bl->y, 0, CELL_CHKWALL)) // Count walk path cells
|
||||
return 0;
|
||||
//Standing monsters use range2, walking monsters use range3
|
||||
if ((md->ud.walktimer == INVALID_TIMER && wpd.path_len > md->db->range2)
|
||||
|| (md->ud.walktimer != INVALID_TIMER && wpd.path_len > md->db->range3))
|
||||
return 0;
|
||||
struct walkpath_data wpd;
|
||||
if (!path_search(&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x, bl->y, 0, CELL_CHKWALL)) // Count walk path cells
|
||||
return 0;
|
||||
//Standing monsters use range2, walking monsters use range3
|
||||
if ((md->ud.walktimer == INVALID_TIMER && wpd.path_len > md->db->range2)
|
||||
|| (md->ud.walktimer != INVALID_TIMER && wpd.path_len > md->db->range3))
|
||||
return 0;
|
||||
#endif
|
||||
(*target) = bl;
|
||||
md->target_id=bl->id;
|
||||
md->min_chase = cap_value(dist + md->db->range3 - md->status.rhw.range, md->db->range3, MAX_MINCHASE);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
(*target) = bl;
|
||||
md->target_id=bl->id;
|
||||
md->min_chase = cap_value(dist + md->db->range3 - md->status.rhw.range, md->db->range3, MAX_MINCHASE);
|
||||
return 1;
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -1518,6 +1514,7 @@ int mob_unlocktarget(struct mob_data *md, t_tick tick)
|
||||
break;
|
||||
//Because it is not unset when the mob finishes walking.
|
||||
md->state.skillstate = MSS_IDLE;
|
||||
[[fallthrough]];
|
||||
case MSS_IDLE:
|
||||
if( md->ud.walktimer == INVALID_TIMER && md->idle_event[0] && npc_event_do_id( md->idle_event, md->bl.id ) > 0 ){
|
||||
md->idle_event[0] = 0;
|
||||
@@ -3857,8 +3854,9 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event, int64 damage)
|
||||
bl = &md->bl;
|
||||
if (md->master_id)
|
||||
bl = map_id2bl(md->master_id);
|
||||
if (bl) //Otherwise, fall through.
|
||||
if (bl)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
case MST_FRIEND:
|
||||
bl = fbl?fbl:(fmd?&fmd->bl:&md->bl);
|
||||
break;
|
||||
@@ -3907,8 +3905,9 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event, int64 damage)
|
||||
bl = &md->bl;
|
||||
if (md->master_id)
|
||||
bl = map_id2bl(md->master_id);
|
||||
if (bl) //Otherwise, fall through.
|
||||
if (bl)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
case MST_FRIEND:
|
||||
if (fbl) {
|
||||
bl = fbl;
|
||||
@@ -3916,7 +3915,8 @@ int mobskill_use(struct mob_data *md, t_tick tick, int event, int64 damage)
|
||||
} else if (fmd) {
|
||||
bl = &fmd->bl;
|
||||
break;
|
||||
} // else fall through
|
||||
}
|
||||
[[fallthrough]];
|
||||
default:
|
||||
bl = &md->bl;
|
||||
break;
|
||||
|
||||
@@ -4288,6 +4288,7 @@ void pc_bonus(map_session_data *sd,int type,int val)
|
||||
case SP_LONG_SP_GAIN_VALUE:
|
||||
if(!sd->state.lr_flag)
|
||||
sd->bonus.long_sp_gain_value += val;
|
||||
break;
|
||||
case SP_LONG_HP_GAIN_VALUE:
|
||||
if(!sd->state.lr_flag)
|
||||
sd->bonus.long_hp_gain_value += val;
|
||||
|
||||
@@ -5883,13 +5883,13 @@ BUILDIN_FUNC(warpparty)
|
||||
case WARPPARTY_LEADER:
|
||||
if (p->party.member[i].leader)
|
||||
continue;
|
||||
// Fall through
|
||||
[[fallthrough]];
|
||||
case WARPPARTY_RANDOMALL:
|
||||
if (pl_sd == sd) {
|
||||
ret = pc_setpos(pl_sd, mapindex, x, y, CLR_TELEPORT);
|
||||
break;
|
||||
}
|
||||
// Fall through
|
||||
[[fallthrough]];
|
||||
case WARPPARTY_RANDOMALLAREA:
|
||||
if(!mapdata->getMapFlag(MF_NORETURN) && !mapdata->getMapFlag(MF_NOWARP) && pc_job_can_entermap((enum e_job)pl_sd->status.class_, m, pc_get_group_level(pl_sd))){
|
||||
if (rx || ry) {
|
||||
@@ -15731,6 +15731,7 @@ BUILDIN_FUNC(recovery)
|
||||
map_idx = sd->bl.m;
|
||||
if(map_idx < 1)
|
||||
return SCRIPT_CMD_FAILURE; //No sd and no map given - return
|
||||
[[fallthrough]];
|
||||
case 4:
|
||||
{
|
||||
struct s_mapiterator *iter;
|
||||
|
||||
@@ -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))
|
||||
@@ -1568,7 +1569,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;
|
||||
@@ -2179,6 +2180,7 @@ 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:
|
||||
@@ -3305,11 +3307,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 +3818,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 +3900,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 +3921,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 +3952,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;
|
||||
@@ -4217,7 +4222,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 +4609,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 +4759,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;
|
||||
@@ -5360,6 +5367,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 +5523,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 +5539,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:
|
||||
@@ -6073,6 +6083,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:
|
||||
@@ -6175,6 +6186,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 +6202,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 +6259,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 +6582,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);
|
||||
@@ -7204,6 +7219,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:
|
||||
@@ -7335,6 +7351,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
} 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
|
||||
[[fallthrough]];
|
||||
} else //Invalid target, skip resurrection.
|
||||
break;
|
||||
|
||||
@@ -7506,7 +7523,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 +7537,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 +7793,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
|
||||
@@ -8627,6 +8647,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 +9146,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 +9738,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 +10091,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 +10371,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 +10624,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 +12174,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:
|
||||
@@ -13605,6 +13631,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 +13765,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 +13841,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 +14082,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:
|
||||
@@ -14788,6 +14817,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 +14990,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 +15035,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 +15505,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 +15983,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 +16507,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 +16567,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 +17208,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 +17231,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 +17519,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 +17543,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 +18406,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 +18645,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 +19740,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 +20022,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 +20205,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 +20234,7 @@ static int skill_trap_splash(struct block_list *bl, va_list ap)
|
||||
break;
|
||||
}
|
||||
}
|
||||
[[fallthrough]];
|
||||
default: {
|
||||
int split_count = 0;
|
||||
|
||||
@@ -20948,7 +20994,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 +21008,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 +21016,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 +21046,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 +21057,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 +21076,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 +21099,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 +21113,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:
|
||||
{
|
||||
@@ -22129,6 +22176,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 +23381,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;
|
||||
|
||||
@@ -2017,11 +2017,24 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
||||
|
||||
if (sc->getSCE(SC_BLADESTOP)) {
|
||||
switch (sc->getSCE(SC_BLADESTOP)->val1) {
|
||||
case 5: if (skill_id == MO_EXTREMITYFIST) break;
|
||||
case 4: if (skill_id == MO_CHAINCOMBO) break;
|
||||
case 3: if (skill_id == MO_INVESTIGATE) break;
|
||||
case 2: if (skill_id == MO_FINGEROFFENSIVE) break;
|
||||
default: return false;
|
||||
case 5:
|
||||
if (skill_id == MO_EXTREMITYFIST)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
case 4:
|
||||
if (skill_id == MO_CHAINCOMBO)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
case 3:
|
||||
if (skill_id == MO_INVESTIGATE)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
case 2:
|
||||
if (skill_id == MO_FINGEROFFENSIVE)
|
||||
break;
|
||||
[[fallthrough]];
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2157,6 +2170,7 @@ bool status_check_skilluse(struct block_list *src, struct block_list *target, ui
|
||||
return false; // Can't use Potion Pitcher on Mercenaries
|
||||
if (tsc && tsc->getSCE(SC_ELEMENTAL_VEIL) && !(src && status_get_class_(src) == CLASS_BOSS) && !status_has_mode(status, MD_DETECTOR))
|
||||
return false;
|
||||
[[fallthrough]];
|
||||
default:
|
||||
// Check for chase-walk/hiding/cloaking opponents.
|
||||
if( tsc ) {
|
||||
@@ -10398,6 +10412,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_BERSERK:
|
||||
case SC_SATURDAYNIGHTFEVER:
|
||||
sc->getSCE(rem_sc)->val2 = 0; // Mark to not lose hp
|
||||
[[fallthrough]];
|
||||
default:
|
||||
status_change_end(bl, rem_sc);
|
||||
break;
|
||||
@@ -10502,6 +10517,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if (sc && sc->getSCE(type)->val2 & BREAK_NECK)
|
||||
return 0; // BREAK_NECK cannot be stacked with new breaks until the status is over.
|
||||
val2 |= sce->val2; // Stackable ailments
|
||||
[[fallthrough]];
|
||||
default:
|
||||
if (scdb->flag[SCF_OVERLAPIGNORELEVEL])
|
||||
break;
|
||||
@@ -10868,7 +10884,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
diff = status->hp - (status->max_hp / 4);
|
||||
status_zap(bl, diff, 0);
|
||||
}
|
||||
// Fall through
|
||||
[[fallthrough]];
|
||||
case SC_STONE:
|
||||
case SC_POISON:
|
||||
case SC_BLEEDING:
|
||||
@@ -10889,6 +10905,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
break;
|
||||
tick_time = status_get_sc_interval(type);
|
||||
val4 = tick - tick_time; // Remaining time
|
||||
break;
|
||||
case SC_LEECHESEND:
|
||||
if (val3 == 0)
|
||||
break;
|
||||
@@ -11227,6 +11244,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
switch (val1) {
|
||||
case 3: // 33*3 + 1 -> 100%
|
||||
val2++;
|
||||
[[fallthrough]];
|
||||
case 1:
|
||||
case 2: // 33, 66%
|
||||
val2 += 33*val1;
|
||||
@@ -11454,6 +11472,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
// Level 1 ~ 5 & 6 ~ 10 has different duration
|
||||
// Level 6 ~ 10 use effect of level 1 ~ 5
|
||||
val1 = 1 + ((val1-1)%5);
|
||||
[[fallthrough]];
|
||||
case SC_SLOWCAST:
|
||||
val2 = 20*val1; // Magic reflection/cast rate
|
||||
break;
|
||||
@@ -11975,17 +11994,20 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
case SC_WILD_STORM:
|
||||
case SC_UPHEAVAL:
|
||||
val2 += 10;
|
||||
[[fallthrough]];
|
||||
case SC_HEATER:
|
||||
case SC_COOLER:
|
||||
case SC_BLAST:
|
||||
case SC_CURSED_SOIL:
|
||||
val2 += 10;
|
||||
[[fallthrough]];
|
||||
case SC_PYROTECHNIC:
|
||||
case SC_AQUAPLAY:
|
||||
case SC_GUST:
|
||||
case SC_PETROLOGY:
|
||||
val2 += 5;
|
||||
val3 += 9000;
|
||||
[[fallthrough]];
|
||||
case SC_CIRCLE_OF_FIRE:
|
||||
case SC_FIRE_CLOAK:
|
||||
case SC_WATER_DROP:
|
||||
@@ -12729,6 +12751,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
break;
|
||||
tick_time = tick;
|
||||
tick = tick_time + max(val4, 0);
|
||||
[[fallthrough]];
|
||||
case SC_MAGICMUSHROOM:
|
||||
case SC_PYREXIA:
|
||||
case SC_LEECHESEND:
|
||||
@@ -13332,16 +13355,18 @@ int status_change_end(struct block_list* bl, enum sc_type type, int tid)
|
||||
skill_castend_damage_id(src, bl, sce->val2, sce->val1, gettick(), SD_LEVEL );
|
||||
}
|
||||
break;
|
||||
case SC_CLOSECONFINE2:{
|
||||
struct block_list *src = sce->val2?map_id2bl(sce->val2):NULL;
|
||||
status_change *sc2 = src?status_get_sc(src):NULL;
|
||||
if (src && sc2 && sc2->getSCE(SC_CLOSECONFINE)) {
|
||||
// If status was already ended, do nothing.
|
||||
// Decrease count
|
||||
if (--(sc2->getSCE(SC_CLOSECONFINE)->val1) <= 0) // No more holds, free him up.
|
||||
status_change_end(src, SC_CLOSECONFINE);
|
||||
case SC_CLOSECONFINE2:
|
||||
{
|
||||
struct block_list *src = sce->val2?map_id2bl(sce->val2):nullptr;
|
||||
status_change *sc2 = src?status_get_sc(src):nullptr;
|
||||
if (src && sc2 && sc2->getSCE(SC_CLOSECONFINE)) {
|
||||
// If status was already ended, do nothing.
|
||||
// Decrease count
|
||||
if (--(sc2->getSCE(SC_CLOSECONFINE)->val1) <= 0) // No more holds, free him up.
|
||||
status_change_end(src, SC_CLOSECONFINE);
|
||||
}
|
||||
}
|
||||
}
|
||||
[[fallthrough]];
|
||||
case SC_CLOSECONFINE:
|
||||
if (sce->val2 > 0) {
|
||||
// Caster has been unlocked... nearby chars need to be unlocked.
|
||||
@@ -14102,6 +14127,7 @@ TIMER_FUNC(status_change_timer){
|
||||
sp= 4*(sce->val1>>16);
|
||||
// Upkeep is also every 10 secs.
|
||||
#ifndef RENEWAL
|
||||
[[fallthrough]];
|
||||
case DC_DONTFORGETME:
|
||||
#endif
|
||||
s=10;
|
||||
|
||||
@@ -3290,7 +3290,7 @@ int unit_remove_map_(struct block_list *bl, clr_type clrtype, const char* file,
|
||||
map_delblock(bl);
|
||||
break;
|
||||
}
|
||||
// Fall through
|
||||
[[fallthrough]];
|
||||
default:
|
||||
clif_clearunit_area(bl, clrtype);
|
||||
map_delblock(bl);
|
||||
|
||||
Reference in New Issue
Block a user