diff options
Diffstat (limited to 'src/char')
-rw-r--r-- | src/char/char.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/src/char/char.c b/src/char/char.c index be98af10e..d5064eee2 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -146,6 +146,8 @@ unsigned int save_flag = 0; // Initial position (it's possible to set it in conf file) struct point start_point = { 0, 53, 111 }; +unsigned short skillid2idx[MAX_SKILL_ID]; + //----------------------------------------------------- // Auth database //----------------------------------------------------- @@ -565,18 +567,10 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus* p) strcat(save_status, " memo"); } - //FIXME: is this neccessary? [ultramage] - for(i=0;i<MAX_SKILL;i++) - if ((p->skill[i].lv != 0) && (p->skill[i].id == 0)) - p->skill[i].id = i; // Fix skill tree - - //skills - if( memcmp(p->skill, cp->skill, sizeof(p->skill)) ) - { + if( memcmp(p->skill, cp->skill, sizeof(p->skill)) ) { //`skill` (`char_id`, `id`, `lv`) - if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", skill_db, p->char_id) ) - { + if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `char_id`='%d'", skill_db, p->char_id) ) { Sql_ShowDebug(sql_handle); errors++; } @@ -1278,10 +1272,9 @@ int mmo_char_fromsql(int char_id, struct mmo_charstatus* p, bool load_everything if( tmp_skill.flag != SKILL_FLAG_PERM_GRANTED ) tmp_skill.flag = SKILL_FLAG_PERMANENT; - for( i = 0; i < MAX_SKILL && SQL_SUCCESS == SqlStmt_NextRow(stmt); ++i ) - { - if( tmp_skill.id < ARRAYLENGTH(p->skill) ) - memcpy(&p->skill[tmp_skill.id], &tmp_skill, sizeof(tmp_skill)); + for( i = 0; i < MAX_SKILL && SQL_SUCCESS == SqlStmt_NextRow(stmt); ++i ) { + if( skillid2idx[tmp_skill.id] ) + memcpy(&p->skill[skillid2idx[tmp_skill.id]], &tmp_skill, sizeof(tmp_skill)); else ShowWarning("mmo_char_fromsql: ignoring invalid skill (id=%u,lv=%u) of character %s (AID=%d,CID=%d)\n", tmp_skill.id, tmp_skill.lv, p->name, p->account_id, p->char_id); } @@ -2702,7 +2695,22 @@ int parse_frommap(int fd) RFIFOSKIP(fd,RFIFOW(fd,2)); break; - + case 0x2b0b: + if( RFIFOREST(fd) < RFIFOW(fd, 2) ) + return 0; + memset(&skillid2idx, 0, sizeof(skillid2idx)); + j = RFIFOW(fd, 2) - 4; + if( j ) + j /= 4; + for(i = 0; i < j; i++) { + if( RFIFOW(fd, 4 + (i*4)) > MAX_SKILL_ID ) { + ShowWarning("Error skillid2dx[%d] = %d failed, %d is higher than MAX_SKILL_ID (%d)\n",RFIFOW(fd, 4 + (i*4)), RFIFOW(fd, 6 + (i*4)),RFIFOW(fd, 4 + (i*4)),MAX_SKILL_ID); + continue; + } + skillid2idx[RFIFOW(fd, 4 + (i*4))] = RFIFOW(fd, 6 + (i*4)); + } + RFIFOSKIP(fd, RFIFOW(fd, 2)); + break; case 0x2afa: // Receiving map names list from the map-server if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) return 0; @@ -4920,8 +4928,8 @@ void do_shutdown(void) } -int do_init(int argc, char **argv) -{ +int do_init(int argc, char **argv) { + memset(&skillid2idx, 0, sizeof(skillid2idx)); //Read map indexes mapindex_init(); start_point.map = mapindex_name2id("new_zone01"); |