Fix typo in race bonus fix : race<RC_NONE_ && race<RC_MAX
Fix bugreport:8418 => clif_instance_changestatus possible mapcrash
Reduce lot of variable scope and fix unsafe scanf
This commit is contained in:
lighta
2014-01-09 02:18:51 -05:00
parent 4af314500e
commit b92230e33e
11 changed files with 99 additions and 107 deletions

View File

@@ -1089,9 +1089,9 @@ int access_ipmask(const char* str, AccessControl* acc)
unsigned int a[4];
unsigned int m[4];
int n;
if( ((n=sscanf(str,"%u.%u.%u.%u/%u.%u.%u.%u",a,a+1,a+2,a+3,m,m+1,m+2,m+3)) != 8 && // not an ip + standard mask
(n=sscanf(str,"%u.%u.%u.%u/%u",a,a+1,a+2,a+3,m)) != 5 && // not an ip + bit mask
(n=sscanf(str,"%u.%u.%u.%u",a,a+1,a+2,a+3)) != 4 ) || // not an ip
if( ((n=sscanf(str,"%3u.%3u.%3u.%3u/%3u.%3u.%3u.%3u",a,a+1,a+2,a+3,m,m+1,m+2,m+3)) != 8 && // not an ip + standard mask
(n=sscanf(str,"%3u.%3u.%3u.%3u/%3u",a,a+1,a+2,a+3,m)) != 5 && // not an ip + bit mask
(n=sscanf(str,"%3u.%3u.%3u.%3u",a,a+1,a+2,a+3)) != 4 ) || // not an ip
a[0] > 255 || a[1] > 255 || a[2] > 255 || a[3] > 255 || // invalid ip
(n == 8 && (m[0] > 255 || m[1] > 255 || m[2] > 255 || m[3] > 255)) || // invalid standard mask
(n == 5 && m[0] > 32) ){ // invalid bit mask
@@ -1139,7 +1139,7 @@ int socket_config_read(const char* cfgName)
{
if(line[0] == '/' && line[1] == '/')
continue;
if(sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2)
if(sscanf(line, "%1023[^:]: %1023[^\r\n]", w1, w2) != 2)
continue;
if (!strcmpi(w1, "stall_time")) {

View File

@@ -457,7 +457,6 @@ void split_time(int timein, int* year, int* month, int* day, int* hour, int* min
*/
double solve_time(char* modif_p) {
double totaltime = 0;
int value = 0;
struct tm then_tm;
time_t now = time(NULL);
time_t then = now;
@@ -466,7 +465,7 @@ double solve_time(char* modif_p) {
nullpo_retr(0,modif_p);
while (modif_p[0] != '\0') {
value = atoi(modif_p);
int value = atoi(modif_p);
if (value == 0)
modif_p++;
else {

View File

@@ -345,7 +345,7 @@ int login_lan_config_read(const char *lancfgName)
if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
continue;
if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4)
if(sscanf(line,"%63[^:]: %63[^:]:%63[^:]:%63[^\r\n]", w1, w2, w3, w4) != 4)
{
ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
continue;
@@ -922,21 +922,18 @@ int parse_fromchar(int fd){
if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
return 0;
else{
struct online_login_data *p;
int aid;
uint32 i, users;
online_db->foreach(online_db, online_db_setoffline, id); //Set all chars from this char-server offline first
users = RFIFOW(fd,4);
for (i = 0; i < users; i++) {
aid = RFIFOL(fd,6+i*4);
p = idb_ensure(online_db, aid, create_online_user);
int aid = RFIFOL(fd,6+i*4);
struct online_login_data *p = idb_ensure(online_db, aid, create_online_user);
p->char_server = id;
if (p->waiting_disconnect != INVALID_TIMER){
delete_timer(p->waiting_disconnect, waiting_disconnect_timer);
p->waiting_disconnect = INVALID_TIMER;
}
}
RFIFOSKIP(fd,RFIFOW(fd,2));
}
break;
@@ -1773,7 +1770,7 @@ int login_config_read(const char* cfgName)
if (line[0] == '/' && line[1] == '/')
continue;
if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) < 2)
if (sscanf(line, "%1023[^:]: %1023[^\r\n]", w1, w2) < 2)
continue;
if(!strcmpi(w1,"timestamp_format"))
@@ -1835,7 +1832,7 @@ int login_config_read(const char* cfgName)
else if(!strcmpi(w1, "client_hash")) {
int group = 0;
char md5[33];
if (sscanf(w2, "%d, %32s", &group, md5) == 2) {
if (sscanf(w2, "%3d, %32s", &group, md5) == 2) {
struct client_hash_node *nnode;
int i;
CREATE(nnode, struct client_hash_node, 1);
@@ -1844,7 +1841,7 @@ int login_config_read(const char* cfgName)
unsigned int byte;
memcpy(buf, &md5[i], 2);
buf[2] = 0;
sscanf(buf, "%x", &byte);
sscanf(buf, "%2x", &byte);
nnode->hash[i / 2] = (uint8)(byte & 0xFF);
}
nnode->group_id = group;

View File

@@ -3922,7 +3922,6 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list
struct status_change *tsc = status_get_sc(target);
struct status_data *sstatus = status_get_status_data(src);
struct status_data *tstatus = status_get_status_data(target);
int i;
//Defense reduction
short vit_def;
@@ -3932,11 +3931,9 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list
if( tsc && tsc->data[SC_ASSUMPTIO] )
def1 <<= 1; // only eDEF is doubled
#endif
if( sd )
{
i = sd->ignore_def_by_race[tstatus->race] + sd->ignore_def_by_race[RC_ALL];
if( i )
{
if( sd ) {
int i = sd->ignore_def_by_race[tstatus->race] + sd->ignore_def_by_race[RC_ALL];
if( i ) {
if( i > 100 ) i = 100;
def1 -= def1 * i / 100;
def2 -= def2 * i / 100;

View File

@@ -117,14 +117,13 @@ int channel_delete(struct Channel *channel) {
* -3 : sd banned
*/
int channel_join(struct Channel *channel, struct map_session_data *sd) {
char output[128];
if(!channel || !sd)
return -1;
if(channel_haspc(channel,sd)==1)
return -2;
if(channel_haspcbanned(channel,sd)==1){
char output[128];
sprintf(output, msg_txt(sd,1438),channel->name); //You're currently banned from the '%s' channel.
clif_displaymessage(sd->fd, output);
return -3;
@@ -211,10 +210,8 @@ int channel_ajoin(struct guild *g){
int channel_gjoin(struct map_session_data *sd, int flag){
struct Channel *channel;
struct guild *g;
int i;
if(!sd) return -1;
g = sd->guild;
if(!g) return -2;
@@ -228,6 +225,7 @@ int channel_gjoin(struct map_session_data *sd, int flag){
channel_join(channel,sd); //join our guild chat
}
if(flag&2){
int i;
for (i = 0; i < MAX_GUILDALLIANCE; i++){
struct guild *ag; //allied guld
struct guild_alliance *ga = &g->alliance[i]; //guild alliance
@@ -305,8 +303,8 @@ int channel_pcquit(struct map_session_data *sd, int type){
channel_clean(g->channel,sd,0); //leave guild chan
}
if(type&2){
struct guild *ag; //allied guild
for (i = 0; i < MAX_GUILDALLIANCE; i++) { //leave all alliance chan
struct guild *ag; //allied guild
if( g->alliance[i].guild_id && (ag = guild_search(g->alliance[i].guild_id) ) ) {
if(channel_haspc(ag->channel,sd) == 1)
channel_clean(ag->channel,sd,0);
@@ -538,7 +536,6 @@ int channel_display_list(struct map_session_data *sd, char *options){
* -1 : fail
*/
int channel_pccreate(struct map_session_data *sd, char *chname, char *chpass){
struct Channel *channel;
char output[128];
int8 res;
@@ -547,7 +544,7 @@ int channel_pccreate(struct map_session_data *sd, char *chname, char *chpass){
res = channel_chk(chname,chpass,7);
if(res==0){ //success
channel = channel_create(chname + 1,chpass,0,CHAN_TYPE_PRIVATE,sd->status.char_id);
struct Channel *channel = channel_create(chname + 1,chpass,0,CHAN_TYPE_PRIVATE,sd->status.char_id);
channel_join(channel,sd);
if( !( channel->opt & CHAN_OPT_ANNOUNCE_JOIN ) ) {
sprintf(output, msg_txt(sd,1403),chname); // You're now in the '%s' channel.
@@ -931,7 +928,7 @@ int channel_pcsetopt(struct map_session_data *sd, char *chname, const char *opti
return -1;
}
if(!option || option == '\0' ) {
if(!option || option[0] == '\0' ) {
clif_displaymessage(sd->fd, msg_txt(sd,1446));// You need to input an option.
return -1;
}
@@ -1152,8 +1149,7 @@ int do_init_channel(void) {
void do_final_channel(void) {
DBIterator *iter;
struct Channel *channel;
int i=0;
//delete all in remaining chan db
iter = db_iterator(channel_db);
for( channel = dbi_first(iter); dbi_exists(iter); channel = dbi_next(iter) ) {
@@ -1165,6 +1161,7 @@ void do_final_channel(void) {
//delete all color thing
if( Channel_Config.colors_count ) {
int i=0;
for(i = 0; i < Channel_Config.colors_count; i++) {
aFree(Channel_Config.colors_name[i]);
}

View File

@@ -15719,7 +15719,7 @@ void clif_instance_create(struct map_session_data *sd, const char *name, int num
#if PACKETVER >= 20071128
unsigned char buf[65];
nullpo_retv(sd);
if(!sd) return;
WBUFW(buf,0) = 0x2cb;
safestrncpy( WBUFP(buf,2), name, 62 );
@@ -15738,7 +15738,7 @@ void clif_instance_changewait(struct map_session_data *sd, int num, int flag)
#if PACKETVER >= 20071128
unsigned char buf[4];
nullpo_retv(sd);
if(!sd) return;
WBUFW(buf,0) = 0x2cc;
WBUFW(buf,2) = num;
@@ -15776,7 +15776,7 @@ void clif_instance_changestatus(struct map_session_data *sd, int type, unsigned
#if PACKETVER >= 20071128
unsigned char buf[10];
nullpo_retv(sd);
if(!sd) return;
WBUFW(buf,0) = 0x2ce;
WBUFL(buf,2) = type;

View File

@@ -887,10 +887,11 @@ void guild_retrieveitembound(int char_id,int aid,int guild_id)
TBL_PC *sd = map_id2sd(aid);
if(sd){ //Character is online
int idxlist[MAX_INVENTORY];
int j,i;
int j;
j = pc_bound_chk(sd,2,idxlist);
if(j) {
struct guild_storage* stor = guild2storage(sd->status.guild_id);
int i;
for(i=0;i<j;i++) { //Loop the matching items, guild_storage_additem takes care of opening storage
if(stor)
guild_storage_additem(sd,stor,&sd->status.inventory[idxlist[i]],sd->status.inventory[idxlist[i]].amount);
@@ -902,9 +903,9 @@ void guild_retrieveitembound(int char_id,int aid,int guild_id)
else { //Character is offline, ask char server to do the job
struct guild_storage* stor = guild2storage2(guild_id);
struct guild *g = guild_search(guild_id);
int i;
nullpo_retv(g);
if(stor && stor->storage_status == 1) { //Someone is in guild storage, close them
int i;
for(i=0; i<g->max_member; i++){
TBL_PC *pl_sd = g->member[i].sd;
if(pl_sd && pl_sd->state.storage_flag == 2)
@@ -1120,7 +1121,6 @@ int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes
int guild_notice_changed(int guild_id,const char *mes1,const char *mes2)
{
int i;
struct map_session_data *sd;
struct guild *g=guild_search(guild_id);
if(g==NULL)
return 0;
@@ -1129,7 +1129,8 @@ int guild_notice_changed(int guild_id,const char *mes1,const char *mes2)
memcpy(g->mes2,mes2,MAX_GUILDMES2);
for(i=0;i<g->max_member;i++){
if((sd=g->member[i].sd)!=NULL)
struct map_session_data *sd = g->member[i].sd;
if(sd != NULL)
clif_guild_notice(sd,g);
}
return 0;
@@ -1660,13 +1661,14 @@ int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id
for (i = 0; i < 2 - (flag & 1); i++) { // Retransmission of the relationship list to all members
struct map_session_data *sd;
if(g[i]!=NULL)
for(j=0;j<g[i]->max_member;j++)
if((sd=g[i]->member[j].sd)!=NULL){
for(j=0;j<g[i]->max_member;j++) {
struct map_session_data *sd = g[i]->member[j].sd;
if( sd!=NULL){
clif_guild_allianceinfo(sd);
channel_gjoin(sd,2); //join ally join
}
}
}
return 0;
}
@@ -1724,14 +1726,14 @@ int castle_guild_broken_sub(DBKey key, DBData *data, va_list ap)
int guild_broken(int guild_id,int flag)
{
struct guild *g = guild_search(guild_id);
struct map_session_data *sd = NULL;
int i;
if(flag!=0 || g==NULL)
return 0;
for(i=0;i<g->max_member;i++){ // Destroy all relationships
if((sd=g->member[i].sd)!=NULL){
struct map_session_data *sd = sd=g->member[i].sd;
if(sd != NULL){
if(sd->state.storage_flag == 2)
storage_guild_storage_quit(sd,1);
sd->status.guild_id=0;
@@ -1873,12 +1875,12 @@ int guild_break(struct map_session_data *sd,char *name)
*/
void guild_castle_map_init(void)
{
DBIterator* iter = NULL;
int num = db_size(castle_db);
if (num > 0) {
struct guild_castle* gc = NULL;
int *castle_ids, *cursor;
DBIterator* iter = NULL;
CREATE(castle_ids, int, num);
cursor = castle_ids;
@@ -1914,11 +1916,12 @@ int guild_castledatasave(int castle_id, int index, int value)
case 1: // The castle's owner has changed? Update or remove Guardians too. [Skotlex]
{
int i;
struct mob_data *gd;
gc->guild_id = value;
for (i = 0; i < MAX_GUARDIANS; i++)
for (i = 0; i < MAX_GUARDIANS; i++){
struct mob_data *gd;
if (gc->guardian[i].visible && (gd = map_id2md(gc->guardian[i].id)) != NULL)
mob_guardian_guildchange(gd);
}
break;
}
case 2:
@@ -1926,11 +1929,12 @@ int guild_castledatasave(int castle_id, int index, int value)
case 3: // defense invest change -> recalculate guardian hp
{
int i;
struct mob_data *gd;
gc->defense = value;
for (i = 0; i < MAX_GUARDIANS; i++)
for (i = 0; i < MAX_GUARDIANS; i++){
struct mob_data *gd;
if (gc->guardian[i].visible && (gd = map_id2md(gc->guardian[i].id)) != NULL)
status_calc_mob(gd, 0);
}
break;
}
case 4:

View File

@@ -938,20 +938,17 @@ int mapif_parse_WisToGM(int fd)
{
int permission, mes_len;
char Wisp_name[NAME_LENGTH];
char mbuf[255];
char *message;
mes_len = RFIFOW(fd,2) - 32;
message = (char *) (mes_len >= 255 ? (char *) aMalloc(mes_len) : mbuf);
message = (char *) aMalloc(mes_len);
permission = RFIFOL(fd,28);
safestrncpy(Wisp_name, (char*)RFIFOP(fd,4), NAME_LENGTH);
safestrncpy(message, (char*)RFIFOP(fd,32), mes_len);
// information is sent to all online GM
map_foreachpc(mapif_parse_WisToGM_sub, permission, Wisp_name, message, mes_len);
if (message != mbuf)
aFree(message);
aFree(message);
return 0;
}

View File

@@ -3380,7 +3380,7 @@ int map_config_read(char *cfgName)
continue;
if( (ptr = strstr(line, "//")) != NULL )
*ptr = '\n'; //Strip comments
if( sscanf(line, "%[^:]: %[^\t\r\n]", w1, w2) < 2 )
if( sscanf(line, "%1023[^:]: %1023[^\t\r\n]", w1, w2) < 2 )
continue;
//Strip trailing spaces
@@ -3482,7 +3482,7 @@ void map_reloadnpc_sub(char *cfgName)
continue;
if( (ptr = strstr(line, "//")) != NULL )
*ptr = '\n'; //Strip comments
if( sscanf(line, "%[^:]: %[^\t\r\n]", w1, w2) < 2 )
if( sscanf(line, "%1023[^:]: %1023[^\t\r\n]", w1, w2) < 2 )
continue;
//Strip trailing spaces
@@ -3530,7 +3530,7 @@ int inter_config_read(char *cfgName)
{
if(line[0] == '/' && line[1] == '/')
continue;
if( sscanf(line,"%[^:]: %[^\r\n]",w1,w2) < 2 )
if( sscanf(line,"%1023[^:]: %1023[^\r\n]",w1,w2) < 2 )
continue;
if(strcmpi(w1,"item_db_db")==0)

View File

@@ -1915,10 +1915,10 @@ static int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id
if(
((id && drop[i].id == id) ||
(group && drop[i].group == group))
&& ((race<RC_NONE_ && race<RC_MAX) || (class_<CLASS_NONE && class_<CLASS_MAX))
&& ((race>RC_NONE_ && race<RC_MAX) || (class_>CLASS_NONE && class_<CLASS_MAX))
) {
if(race<RC_NONE_ && race<RC_MAX) drop[i].race |= 1<<race;
if(class_<CLASS_NONE && class_<CLASS_MAX) drop[i].class_ |= 1<<class_;
if(race>RC_NONE_ && race<RC_MAX) drop[i].race |= 1<<race;
if(class_>CLASS_NONE && class_<CLASS_MAX) drop[i].class_ |= 1<<class_;
if(drop[i].rate > 0 && rate > 0)
{ //Both are absolute rates.
if (drop[i].rate < rate)
@@ -1939,8 +1939,8 @@ static int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id
}
drop[i].id = id;
drop[i].group = group;
if(race<RC_NONE_ && race<RC_MAX) drop[i].race |= 1<<race;
if(class_<CLASS_NONE && class_<CLASS_MAX) drop[i].class_ |= 1<<class_;
if(race>RC_NONE_ && race<RC_MAX) drop[i].race |= 1<<race;
if(class_>CLASS_NONE && class_<CLASS_MAX) drop[i].class_ |= 1<<class_;
drop[i].rate = rate;
return 1;
}
@@ -4176,20 +4176,16 @@ int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem)
if (sd->status.party_id)
p = party_search(sd->status.party_id);
if(fitem->first_get_charid > 0 && fitem->first_get_charid != sd->status.char_id)
{
struct map_session_data *first_sd = NULL,*second_sd = NULL,*third_sd = NULL;
first_sd = map_charid2sd(fitem->first_get_charid);
if(fitem->first_get_charid > 0 && fitem->first_get_charid != sd->status.char_id) {
struct map_session_data *first_sd = map_charid2sd(fitem->first_get_charid);
if(DIFF_TICK(tick,fitem->first_get_tick) < 0) {
if (!(p && p->party.item&1 &&
first_sd && first_sd->status.party_id == sd->status.party_id
))
return 0;
}
else
if(fitem->second_get_charid > 0 && fitem->second_get_charid != sd->status.char_id)
{
second_sd = map_charid2sd(fitem->second_get_charid);
else if(fitem->second_get_charid > 0 && fitem->second_get_charid != sd->status.char_id) {
struct map_session_data *second_sd = map_charid2sd(fitem->second_get_charid);
if(DIFF_TICK(tick, fitem->second_get_tick) < 0) {
if(!(p && p->party.item&1 &&
((first_sd && first_sd->status.party_id == sd->status.party_id) ||
@@ -4197,10 +4193,8 @@ int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem)
))
return 0;
}
else
if(fitem->third_get_charid > 0 && fitem->third_get_charid != sd->status.char_id)
{
third_sd = map_charid2sd(fitem->third_get_charid);
else if(fitem->third_get_charid > 0 && fitem->third_get_charid != sd->status.char_id){
struct map_session_data *third_sd = map_charid2sd(fitem->third_get_charid);
if(DIFF_TICK(tick,fitem->third_get_tick) < 0) {
if(!(p && p->party.item&1 &&
((first_sd && first_sd->status.party_id == sd->status.party_id) ||

View File

@@ -10991,11 +10991,9 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
break;
case GN_CRAZYWEED: {
int area = skill_get_splash(GN_CRAZYWEED_ATK, skill_lv);
short x1 = 0, y1 = 0;
for( i = 0; i < 3 + (skill_lv/2); i++ ) {
x1 = x - area + rnd()%(area * 2 + 1);
y1 = y - area + rnd()%(area * 2 + 1);
int x1 = x - area + rnd()%(area * 2 + 1);
int y1 = y - area + rnd()%(area * 2 + 1);
skill_addtimerskill(src,tick+i*150,0,x1,y1,GN_CRAZYWEED_ATK,skill_lv,-1,0);
}
}
@@ -13395,11 +13393,10 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
break;
case AS_CLOAKING:
{
static int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1};
static int dy[] = {-1, 0, 1, 0, -1, -1, 1, 1};
if( skill_lv < 3 && ((sd->bl.type == BL_PC && battle_config.pc_cloak_check_type&1)
|| (sd->bl.type != BL_PC && battle_config.monster_cloak_check_type&1) )) { //Check for walls.
static int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1};
static int dy[] = {-1, 0, 1, 0, -1, -1, 1, 1};
int i;
ARR_FIND( 0, 8, i, map_getcell(sd->bl.m, sd->bl.x+dx[i], sd->bl.y+dy[i], CELL_CHKNOPASS) != 0 );
if( i == 8 ) {
@@ -13552,11 +13549,11 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
break;
case CG_MOONLIT: //Check there's no wall in the range+1 area around the caster. [Skotlex]
{
int i,x,y,range = skill_get_splash(skill_id, skill_lv)+1;
int i,range = skill_get_splash(skill_id, skill_lv)+1;
int size = range*2+1;
for (i=0;i<size*size;i++) {
x = sd->bl.x+(i%size-range);
y = sd->bl.y+(i/size-range);
int x = sd->bl.x+(i%size-range);
int y = sd->bl.y+(i/size-range);
if (map_getcell(sd->bl.m,x,y,CELL_CHKWALL)) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
return 0;
@@ -13577,11 +13574,11 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
case HP_BASILICA:
if( !sc || (sc && !sc->data[SC_BASILICA])) {
if( sd ) {
int i,x,y,range = skill_get_unit_range(skill_id,skill_lv)+1;
int i,range = skill_get_unit_range(skill_id,skill_lv)+1;
int size = range*2+1;
for( i=0;i<size*size;i++ ) {
x = sd->bl.x+(i%size-range);
y = sd->bl.y+(i/size-range);
int x = sd->bl.x+(i%size-range);
int y = sd->bl.y+(i/size-range);
if( map_getcell(sd->bl.m,x,y,CELL_CHKWALL) ) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
return 0;
@@ -14170,7 +14167,7 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
}
case NC_SILVERSNIPER:
case NC_MAGICDECOY: {
int c = 0, j;
int c = 0;
int maxcount = skill_get_maxcount(skill_id,skill_lv);
int mob_class = MOBID_SILVERSNIPER;
if( skill_id == NC_MAGICDECOY )
@@ -14178,6 +14175,7 @@ int skill_check_condition_castend(struct map_session_data* sd, uint16 skill_id,
if( battle_config.land_skill_limit && maxcount > 0 && ( battle_config.land_skill_limit&BL_PC ) ) {
if( skill_id == NC_MAGICDECOY ) {
int j;
for( j = mob_class; j <= MOBID_MAGICDECOY_WIND; j++ )
map_foreachinmap(skill_check_condition_mob_master_sub, sd->bl.m, BL_MOB, sd->bl.id, j, skill_id, &c);
} else
@@ -15241,14 +15239,14 @@ void skill_weaponrefine (struct map_session_data *sd, int idx)
if (idx >= 0 && idx < MAX_INVENTORY)
{
int i = 0, ep = 0, per;
int material[5] = { 0, ITEMID_PHRACON, ITEMID_EMVERETARCON, ITEMID_ORIDECON, ITEMID_ORIDECON, };
struct item *item;
struct item_data *ditem = sd->inventory_data[idx];
item = &sd->status.inventory[idx];
if(item->nameid > 0 && ditem->type == IT_WEAPON)
{
int i = 0, ep = 0, per;
int material[5] = { 0, ITEMID_PHRACON, ITEMID_EMVERETARCON, ITEMID_ORIDECON, ITEMID_ORIDECON, };
if( ditem->flag.no_refine ) { // if the item isn't refinable
clif_skill_fail(sd,sd->menuskill_id,USESKILL_FAIL_LEVEL,0);
return;
@@ -15951,13 +15949,13 @@ int skill_enchant_elemental_end (struct block_list *bl, int type)
bool skill_check_cloaking(struct block_list *bl, struct status_change_entry *sce)
{
static int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1};
static int dy[] = {-1, 0, 1, 0, -1, -1, 1, 1};
bool wall = true;
if( (bl->type == BL_PC && battle_config.pc_cloak_check_type&1)
|| (bl->type != BL_PC && battle_config.monster_cloak_check_type&1) )
{ //Check for walls.
static int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1};
static int dy[] = {-1, 0, 1, 0, -1, -1, 1, 1};
int i;
ARR_FIND( 0, 8, i, map_getcell(bl->m, bl->x+dx[i], bl->y+dy[i], CELL_CHKNOPASS) != 0 );
if( i == 8 )
@@ -15984,11 +15982,11 @@ bool skill_check_cloaking(struct block_list *bl, struct status_change_entry *sce
}
bool skill_check_camouflage(struct block_list *bl, struct status_change_entry *sce)
{
static int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1};
static int dy[] = {-1, 0, 1, 0, -1, -1, 1, 1};
bool wall = true;
if( bl->type == BL_PC ) { //Check for walls.
static int dx[] = { 0, 1, 0, -1, -1, 1, 1, -1};
static int dy[] = {-1, 0, 1, 0, -1, -1, 1, 1};
int i;
ARR_FIND( 0, 8, i, map_getcell(bl->m, bl->x+dx[i], bl->y+dy[i], CELL_CHKNOPASS) != 0 );
if( i == 8 )
@@ -16188,12 +16186,14 @@ struct skill_unit_group* skill_initunitgroup (struct block_list* src, int count,
if(i == MAX_SKILLUNITGROUP) {
// array is full, make room by discarding oldest group
int j=0;
unsigned maxdiff=0,x,tick=gettick();
for(i=0;i<MAX_SKILLUNITGROUP && ud->skillunit[i];i++)
if((x=DIFF_TICK(tick,ud->skillunit[i]->tick))>maxdiff){
unsigned maxdiff=0,tick=gettick();
for(i=0;i<MAX_SKILLUNITGROUP && ud->skillunit[i];i++){
unsigned int x=DIFF_TICK(tick,ud->skillunit[i]->tick);
if(x>maxdiff){
maxdiff=x;
j=i;
}
}
skill_delunitgroup(ud->skillunit[j]);
//Since elements must have shifted, we use the last slot.
i = MAX_SKILLUNITGROUP-1;
@@ -16384,7 +16384,7 @@ int skill_clear_unitgroup (struct block_list *src)
*
*------------------------------------------*/
struct skill_unit_group_tickset *skill_unitgrouptickset_search (struct block_list *bl, struct skill_unit_group *group, int tick) {
int i,j=-1,k,s,id;
int i,j=-1,s,id;
struct unit_data *ud;
struct skill_unit_group_tickset *set;
@@ -16403,7 +16403,7 @@ struct skill_unit_group_tickset *skill_unitgrouptickset_search (struct block_lis
id = s = group->group_id;
for (i=0; i<MAX_SKILLUNITGROUPTICKSET; i++) {
k = (i+s) % MAX_SKILLUNITGROUPTICKSET;
int k = (i+s) % MAX_SKILLUNITGROUPTICKSET;
if (set[k].id == id)
return &set[k];
else if (j==-1 && (DIFF_TICK(tick,set[k].tick)>0 || set[k].id==0))
@@ -16941,7 +16941,7 @@ int skill_can_produce_mix (struct map_session_data *sd, int nameid, int trigger,
}
for(j=0;j<MAX_PRODUCE_RESOURCE;j++){
int id,x,y;
int id;
if( (id=skill_produce_db[i].mat_id[j]) <= 0 )
continue;
if(skill_produce_db[i].mat_amount[j] <= 0) {
@@ -16949,6 +16949,7 @@ int skill_can_produce_mix (struct map_session_data *sd, int nameid, int trigger,
return 0;
}
else {
int x,y;
for(y=0,x=0;y<MAX_INVENTORY;y++)
if( sd->status.inventory[y].nameid == id )
x+=sd->status.inventory[y].amount;
@@ -17767,7 +17768,7 @@ int skill_elementalanalysis(struct map_session_data* sd, int n, uint16 skill_lv,
return 1;
for( i = 0; i < n; i++ ) {
int nameid, add_amount, del_amount, idx, product, flag;
int nameid, add_amount, del_amount, idx, product;
struct item tmp_item;
idx = item_list[i*2+0]-2;
@@ -17815,7 +17816,8 @@ int skill_elementalanalysis(struct map_session_data* sd, int n, uint16 skill_lv,
tmp_item.identify = 1;
if( tmp_item.amount ) {
if( (flag = pc_additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_CONSUME)) ) {
int flag = pc_additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_CONSUME);
if( flag != 0 ) {
clif_additem(sd,0,0,flag);
map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0);
}
@@ -18079,11 +18081,16 @@ int skill_split_str (char *str, char **val, int num) {
return i;
}
/*
*
/**
* Split the string with ':' as separator and put each value for a skilllv
* if no more value found put the latest to fill the array
* @param str : string to split
* @param val : array of MAX_SKILL_LEVEL to put value into
* @return 0:error, x:number of value assign (should be MAX_SKILL_LEVEL)
*/
int skill_split_atoi (char *str, int *val) {
int i, j, diff, step = 1;
int i, j, step = 1;
for (i=0; i<MAX_SKILL_LEVEL; i++) {
if (!str) break;
@@ -18101,7 +18108,7 @@ int skill_split_atoi (char *str, int *val) {
}
//Check for linear change with increasing steps until we reach half of the data acquired.
for (step = 1; step <= i/2; step++) {
diff = val[i-1] - val[i-step-1];
int diff = val[i-1] - val[i-step-1];
for(j = i-1; j >= step; j--)
if ((val[j]-val[j-step]) != diff)
break;
@@ -18126,13 +18133,13 @@ int skill_split_atoi (char *str, int *val) {
*
*/
void skill_init_unit_layout (void) {
int i,j,size,pos = 0;
int i,j,pos = 0;
memset(skill_unit_layout,0,sizeof(skill_unit_layout));
// standard square layouts go first
for (i=0; i<=MAX_SQUARE_LAYOUT; i++) {
size = i*2+1;
int size = i*2+1;
skill_unit_layout[i].count = size*size;
for (j=0; j<size*size; j++) {
skill_unit_layout[i].dx[j] = (j%size-i);