From eca4fa0e38c060c0f9918d11899ee00d099a16f7 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Mon, 6 Jan 2014 14:18:51 -0500 Subject: [PATCH] Bug Fixes * Fixed an operator check for WE_MALE and WE_FEMALE. Thanks Baalberith. Optimizations * Fixed a possible null pointer dereference in Spirit Ball check, Change Cart check, WE_BABY, MH_PYROCLASTIC, and MH_LIGHT_OF_REGENE. * Fixed a reassigned value being reset before being checked. * Fixed a homunculus expression always being false because of prior check. * Fixed sprintf specifier output trying to display int value when return value is unsigned int. * Fixed a redundant check for when monster's HP is less than 0 when HP is declared as an unsigned int. * Fixed a redundant check for when uAccLen or uTokenLen are less then 0 when both are declared as unsigned int. * Various other clean ups. --- src/login/login.c | 2 +- src/map/atcommand.c | 18 +++++++++--------- src/map/battle.c | 7 +++---- src/map/clif.c | 4 ++-- src/map/homunculus.c | 34 +++++++++++++++++----------------- src/map/homunculus.h | 7 ++++--- src/map/mob.c | 4 ++-- src/map/path.c | 2 +- src/map/pc.c | 2 +- src/map/skill.c | 37 ++++++++++++++++--------------------- 10 files changed, 56 insertions(+), 61 deletions(-) diff --git a/src/login/login.c b/src/login/login.c index 6f6502a273..b4ac08ff9e 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -1573,7 +1573,7 @@ int parse_login(int fd) version = RFIFOL(fd,4); - if(uAccLen > NAME_LENGTH - 1 || uAccLen <= 0 || uTokenLen > NAME_LENGTH - 1 || uTokenLen <= 0) + if(uAccLen > NAME_LENGTH - 1 || uAccLen == 0 || uTokenLen > NAME_LENGTH - 1 || uTokenLen == 0) { login_auth_failed(sd, 3); return 0; diff --git a/src/map/atcommand.c b/src/map/atcommand.c index cd090a5467..3ae74c2d10 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -2807,7 +2807,7 @@ ACMD_FUNC(char_ban) { char * modif_p; int32 timediff=0; //don't set this as uint as we may want to decrease banned time - int bantype=2; //2=account block, 6=char specific + int bantype=0; //2=account block, 6=char specific char output[256]; nullpo_retr(-1, sd); @@ -2880,7 +2880,7 @@ ACMD_FUNC(char_unblock) * char unban command (usage: charunban ) *------------------------------------------*/ ACMD_FUNC(char_unban){ - int unbantype=4; + int unbantype=0; nullpo_retr(-1, sd); memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); @@ -7942,7 +7942,7 @@ ACMD_FUNC(duel) } if( message[0] ) { - if(sscanf(message, "%d", &maxpl) >= 1) { + if(sscanf(message, "%ui", &maxpl) >= 1) { if(maxpl < 2 || maxpl > 65535) { clif_displaymessage(fd, msg_txt(sd,357)); // "Duel: Invalid value." return 0; @@ -8653,7 +8653,7 @@ static void atcommand_commands_sub(struct map_session_data* sd, const int fd, At if ( atcmd_binding_count ) { int i, count_bind, gm_lvl = pc_get_group_level(sd); for( i = count_bind = 0; i < atcmd_binding_count; i++ ) { - if ( gm_lvl >= ( type -1 ? atcmd_binding[i]->level2 : atcmd_binding[i]->level ) ) { + if ( gm_lvl >= ( (type - 1) ? atcmd_binding[i]->level2 : atcmd_binding[i]->level ) ) { unsigned int slen = strlen(atcmd_binding[i]->command); if ( count_bind == 0 ) { cur = line_buff; @@ -9143,12 +9143,12 @@ ACMD_FUNC(fontcolor) ACMD_FUNC(langtype) { char langstr[8]; - int i=0, test=0; + int i=0, fail=0; memset(langstr, '\0', sizeof(langstr)); if(sscanf(message, "%3s", langstr) >= 1){ - int lang=-1; + int lang=0; lang = msg_langstr2langtype(langstr); //Switch langstr to associated langtype if( msg_checklangtype(lang,false) == 1 ){ //Verify it's enabled and set it char output[100]; @@ -9166,9 +9166,9 @@ ACMD_FUNC(langtype) //wrong or no entry clif_displaymessage(fd,msg_txt(sd,460)); // Please enter a valid language (usage: @langtype ). clif_displaymessage(fd,msg_txt(sd,464)); // ---- Available languages: - while(test!=-1){ //out of range - test = msg_checklangtype(i,false); - if(test == 1) + while(fail != -1){ //out of range + fail = msg_checklangtype(i,false); + if(fail == 1) clif_displaymessage(fd,msg_langtype2langstr(i)); i++; } diff --git a/src/map/battle.c b/src/map/battle.c index 78b8a556be..c09374707c 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -5548,11 +5548,10 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list * if(mflag > 1) //Autocasted Blitz. nk|=NK_SPLASHSPLIT; - if (skill_id == SN_FALCONASSAULT) - { + if (skill_id == SN_FALCONASSAULT) { //Div fix of Blitzbeat - skill = skill_get_num(HT_BLITZBEAT, 5); - damage_div_fix(md.damage, skill); + md.div_ = skill_get_num(HT_BLITZBEAT, 5); + damage_div_fix(md.damage, md.div_); //Falcon Assault Modifier md.damage=(int64)md.damage*(150+70*skill_lv)/100; diff --git a/src/map/clif.c b/src/map/clif.c index 4a9d7ee4cb..ecf893aa8a 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -8746,7 +8746,7 @@ void clif_charnameack (int fd, struct block_list *bl) if( battle_config.show_mob_info&1 ) str_p += sprintf(str_p, "HP: %u/%u | ", md->status.hp, md->status.max_hp); if( battle_config.show_mob_info&2 ) - str_p += sprintf(str_p, "HP: %d%% | ", get_percentage(md->status.hp, md->status.max_hp)); + str_p += sprintf(str_p, "HP: %ui%% | ", get_percentage(md->status.hp, md->status.max_hp)); //Even thought mobhp ain't a name, we send it as one so the client //can parse it. [Skotlex] if( str_p != mobhp ) @@ -11024,7 +11024,7 @@ void clif_parse_ChangeCart(int fd,struct map_session_data *sd) {// TODO: State tracking? int type; - if( sd && pc_checkskill(sd, MC_CHANGECART) < 1 ) + if( !sd || pc_checkskill(sd, MC_CHANGECART) < 1 ) return; type = (int)RFIFOW(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0]); diff --git a/src/map/homunculus.c b/src/map/homunculus.c index 1a15234ac1..c5382fc227 100644 --- a/src/map/homunculus.c +++ b/src/map/homunculus.c @@ -58,14 +58,14 @@ struct view_data* merc_get_hom_viewdata(int class_) enum homun_type hom_class2type(int class_) { int mid = hom_class2mapid(class_); - if(mid&(HOM_REG|HOM_EVO)) + if((mid&(HOM_REG|HOM_EVO)) == (HOM_REG|HOM_EVO)) return HT_EVO; else if(mid&(HOM_REG)) return HT_REG; else if(mid&(HOM_S)) return HT_S; - else //invalid type - return -1; + else + return HT_INVALID; } int hom_class2mapid(int hom_class) @@ -73,23 +73,23 @@ int hom_class2mapid(int hom_class) switch(hom_class) { // Normal Homunculus - case 6001: case 6005: return MAPID_LIF; - case 6002: case 6006: return MAPID_AMISTR; - case 6003: case 6007: return MAPID_FILIR; - case 6004: case 6008: return MAPID_VANILMIRTH; + case 6001: case 6005: return MAPID_LIF; + case 6002: case 6006: return MAPID_AMISTR; + case 6003: case 6007: return MAPID_FILIR; + case 6004: case 6008: return MAPID_VANILMIRTH; // Evolved Homunculus - case 6009: case 6013: return MAPID_LIF_E; - case 6010: case 6014: return MAPID_AMISTR_E; - case 6011: case 6015: return MAPID_FILIR_E; - case 6012: case 6016: return MAPID_VANILMIRTH_E; + case 6009: case 6013: return MAPID_LIF_E; + case 6010: case 6014: return MAPID_AMISTR_E; + case 6011: case 6015: return MAPID_FILIR_E; + case 6012: case 6016: return MAPID_VANILMIRTH_E; // Homunculus S - case 6048: return MAPID_EIRA; - case 6049: return MAPID_BAYERI; - case 6050: return MAPID_SERA; - case 6051: return MAPID_DIETER; - case 6052: return MAPID_ELANOR; + case 6048: return MAPID_EIRA; + case 6049: return MAPID_BAYERI; + case 6050: return MAPID_SERA; + case 6051: return MAPID_DIETER; + case 6052: return MAPID_ELANOR; - default: return -1; + default: return -1; } } diff --git a/src/map/homunculus.h b/src/map/homunculus.h index 44c5dc91a0..0bd63809b1 100644 --- a/src/map/homunculus.h +++ b/src/map/homunculus.h @@ -91,9 +91,10 @@ enum { MAPID_ELANOR, }; enum homun_type { - HT_REG = 0x1, - HT_EVO = 0x2, - HT_S = 0x4, + HT_REG = 0x1, + HT_EVO = 0x2, + HT_S = 0x4, + HT_INVALID = -1, }; #define homdb_checkid(id) (id >= HM_CLASS_BASE && id <= HM_CLASS_MAX) diff --git a/src/map/mob.c b/src/map/mob.c index 2d569894af..c571688131 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -1417,7 +1417,7 @@ static bool mob_ai_sub_hard(struct mob_data *md, unsigned int tick) int mode; int view_range, can_move; - if(md->bl.prev == NULL || md->status.hp <= 0) + if(md->bl.prev == NULL || md->status.hp == 0) return false; if (DIFF_TICK(tick, md->last_thinktime) < MIN_MOBTHINKTIME) @@ -3338,7 +3338,7 @@ int mobskill_event(struct mob_data *md, struct block_list *src, unsigned int tic { int target_id, res = 0; - if(md->bl.prev == NULL || md->status.hp <= 0) + if(md->bl.prev == NULL || md->status.hp == 0) return 0; target_id = md->target_id; diff --git a/src/map/path.c b/src/map/path.c index ed559cbc5e..8dc47907b4 100644 --- a/src/map/path.c +++ b/src/map/path.c @@ -274,7 +274,7 @@ bool path_search(struct walkpath_data *wpd,int16 m,int16 x0,int16 y0,int16 x1,in { int heap[MAX_HEAP+1]; struct tmp_path tp[MAX_WALKPATH*MAX_WALKPATH]; - register int i,j,len,x,y,dx,dy; + register int i,j,len,x,y,dx=0,dy=0; int rp,xs,ys; struct map_data *md; struct walkpath_data s_wpd; diff --git a/src/map/pc.c b/src/map/pc.c index b968b91dbd..c4921db845 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -6887,7 +6887,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) //Reset ticks. sd->hp_loss.tick = sd->sp_loss.tick = sd->hp_regen.tick = sd->sp_regen.tick = 0; - if ( sd && (sd->spiritball)!=0 ) + if ( sd->spiritball !=0 ) pc_delspiritball(sd,sd->spiritball,0); for(i = 1; i < 5; i++) diff --git a/src/map/skill.c b/src/map/skill.c index 1acf7ffccd..1b1277e7c2 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -1659,14 +1659,13 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint skill = (sd->autospell[i].id > 0) ? sd->autospell[i].id : -sd->autospell[i].id; sd->state.autocast = 1; + if ( skill_isNotOk(skill, sd) ) + continue; sd->state.autocast = 0; skill_lv = sd->autospell[i].lv?sd->autospell[i].lv:1; if (skill_lv < 0) skill_lv = 1+rnd()%(-skill_lv); - if ( skill_isNotOk(skill, sd) ) - continue; - rate = (!sd->state.arrow_atk) ? sd->autospell[i].rate : sd->autospell[i].rate / 2; if (rnd()%1000 >= rate) @@ -2002,10 +2001,9 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list * rate>>=1; dstsd->state.autocast = 1; - dstsd->state.autocast = 0; - if ( skill_isNotOk(skill_id, dstsd) ) continue; + dstsd->state.autocast = 0; if (rnd()%1000 >= rate) continue; @@ -7255,14 +7253,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case WE_MALE: - if( status_get_hp(bl) < status_get_max_hp(bl) / 10 ) { + if( status_get_hp(bl) > status_get_max_hp(bl) / 10 ) { int hp_rate=(!skill_lv)? 0:skill_get_hp_rate(skill_id, skill_lv); int gain_hp= tstatus->max_hp*abs(hp_rate)/100; // The earned is the same % of the target HP than it costed the caster. [Skotlex] clif_skill_nodamage(src,bl,skill_id,status_heal(bl, gain_hp, 0, 0),1); } break; case WE_FEMALE: - if( status_get_sp(bl) < status_get_max_sp(bl) / 10 ) { + if( status_get_sp(bl) > status_get_max_sp(bl) / 10 ) { int sp_rate=(!skill_lv)? 0:skill_get_sp_rate(skill_id, skill_lv); int gain_sp=tstatus->max_sp*abs(sp_rate)/100;// The earned is the same % of the target SP than it costed the caster. [Skotlex] clif_skill_nodamage(src,bl,skill_id,status_heal(bl, 0, gain_sp, 0),1); @@ -7274,16 +7272,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if(sd){ struct map_session_data *f_sd = pc_get_father(sd); struct map_session_data *m_sd = pc_get_mother(sd); - struct block_list *b_bl = map_id2bl(sd->bl.id); - struct block_list *f_bl = map_id2bl(f_sd->bl.id); - struct block_list *m_bl = map_id2bl(m_sd->bl.id); if( (!f_sd && !m_sd) // if neither was found || (sd->status.party_id != 0 && //not in same party ((!f_sd || sd->status.party_id != f_sd->status.party_id) && (!m_sd || sd->status.party_id != m_sd->status.party_id) //if both are online they should all be in same team )) - || ((!f_sd || !check_distance_bl(b_bl, f_bl, AREA_SIZE)) //not in same screen - && (!m_bl && !check_distance_bl(b_bl, m_bl, AREA_SIZE))) + || ((!f_sd || !check_distance_bl(&sd->bl, &f_sd->bl, AREA_SIZE)) //not in same screen + && (!m_sd || !check_distance_bl(&sd->bl, &m_sd->bl, AREA_SIZE))) ) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); map_freeblock_unlock(); @@ -9702,19 +9697,19 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui break; case MH_GRANITIC_ARMOR: case MH_PYROCLASTIC: - { - struct block_list *s_bl = battle_get_master(src); - if(s_bl) sc_start2(src, s_bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); //start on master - sc_start2(src, bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); - if (hd) skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); + if(hd) { + struct block_list *s_bl = battle_get_master(src); + if(s_bl) sc_start2(src, s_bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); //start on master + sc_start2(src, bl, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); + skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); } break; case MH_LIGHT_OF_REGENE: //self - sc_start2(src, src, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); if(hd) { - hd->homunculus.intimacy = 251; //change to neutral (can't be cast if < 750) - if(sd) clif_send_homdata(sd, SP_INTIMATE, hd->homunculus.intimacy); //refresh intimacy info - skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); + sc_start2(src, src, type, 100, skill_lv, hd->homunculus.level, skill_get_time(skill_id, skill_lv)); + hd->homunculus.intimacy = 251; //change to neutral (can't be cast if < 750) + if(sd) clif_send_homdata(sd, SP_INTIMATE, hd->homunculus.intimacy); //refresh intimacy info + skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); } break; case MH_STYLE_CHANGE: