Преглед изворни кода

* Fixed wrong index calculation in TXT char creation code (ref: r11410)
* Fixed SQL itemdb loading crash on NULL columns (ref: 11398)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11434 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage пре 17 година
родитељ
комит
8ac3690bca
5 измењених фајлова са 22 додато и 15 уклоњено
  1. 2 0
      Changelog-Trunk.txt
  2. 14 13
      src/char/char.c
  3. 1 1
      src/char_sql/char.c
  4. 4 0
      src/map/itemdb.c
  5. 1 1
      src/map/skill.c

+ 2 - 0
Changelog-Trunk.txt

@@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2007/10/12
+	* Fixed wrong index calculation in TXT char creation code (ref: r11410)
+	* Fixed SQL itemdb loading crash on NULL column (ref: 11398) [ultramage]
 	* Updated the skill_delayfix function to behave as recently discovered by
 	  Tharis: Skills with no delay set will use amotion ONLY if the skill was
 	  instant-casted. [Skotlex]

+ 14 - 13
src/char/char.c

@@ -1179,6 +1179,19 @@ int make_new_char(struct char_session_data* sd, char* name_, int str, int agi, i
 		return -1;
 	}
 
+	// Check Authorised letters/symbols in the name of the character
+	if( char_name_option == 1 ) { // only letters/symbols in char_name_letters are authorised
+		for( i = 0; i < NAME_LENGTH && name[i]; i++ )
+			if (strchr(char_name_letters, name[i]) == NULL)
+				return -2;
+	} else
+	if( char_name_option == 2 ) { // letters/symbols in char_name_letters are forbidden
+		for( i = 0; i < NAME_LENGTH && name[i]; i++ )
+			if( strchr(char_name_letters, name[i]) != NULL )
+				return -2;
+	} // else, all letters/symbols are authorised (except control char removed before)
+
+	//FIXME: the code way below actually depends on the value of 'i' that's used here! [ultramage]
 	for( i = 0; i < char_num; i++ ) {
 		// check if name doesn't already exist
 		if ((name_ignoring_case != 0 && strncmp(char_dat[i].status.name, name, NAME_LENGTH) == 0) ||
@@ -1195,18 +1208,6 @@ int make_new_char(struct char_session_data* sd, char* name_, int str, int agi, i
 		}
 	}
 
-	// Check Authorised letters/symbols in the name of the character
-	if( char_name_option == 1 ) { // only letters/symbols in char_name_letters are authorised
-		for( i = 0; i < NAME_LENGTH && name[i]; i++ )
-			if (strchr(char_name_letters, name[i]) == NULL)
-				return -2;
-	} else
-	if( char_name_option == 2 ) { // letters/symbols in char_name_letters are forbidden
-		for( i = 0; i < NAME_LENGTH && name[i]; i++ )
-			if( strchr(char_name_letters, name[i]) != NULL )
-				return -2;
-	} // else, all letters/symbols are authorised (except control char removed before)
-
 	//check other inputs
 	if((char_num >= MAX_CHARS) // slots
 	|| (hair_style >= 24) // hair style
@@ -3587,7 +3588,7 @@ int parse_char(int fd)
 				// add new entry to the chars list
 				ARR_FIND( 0, MAX_CHARS, ch, sd->found_char[ch] == -1 );
 				if( ch < MAX_CHARS )
-						sd->found_char[ch] = i;
+						sd->found_char[ch] = i; // position of the new char in the char_dat[] array
 			}
 
 			RFIFOSKIP(fd,37);

+ 1 - 1
src/char_sql/char.c

@@ -2952,7 +2952,7 @@ int parse_char(int fd)
 				// add new entry to the chars list
 				ARR_FIND( 0, MAX_CHARS, ch, sd->found_char[ch] == -1 );
 				if( ch < MAX_CHARS )
-						sd->found_char[ch] = i;
+						sd->found_char[ch] = i; // the char_id of the new char
 			}
 
 			RFIFOSKIP(fd,37);

+ 4 - 0
src/map/itemdb.c

@@ -929,10 +929,14 @@ static int itemdb_read_sqldb(void)
 		while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
 		{// wrap the result into a TXT-compatible format
 			char* str[22];
+			char* dummy = "";
 			int i;
 			++lines;
 			for( i = 0; i < 22; ++i )
+			{
 				Sql_GetData(mmysql_handle, i, &str[i], NULL);
+				if( str[i] == NULL ) str[i] = dummy; // get rid of NULL columns
+			}
 
 			if (!itemdb_parse_dbrow(str, item_db_name[fi], lines, 0))
 				continue;

+ 1 - 1
src/map/skill.c

@@ -8865,7 +8865,7 @@ int skill_delayfix (struct block_list *bl, int skill_id, int skill_lv, bool inst
 	if (bl->type&battle_config.no_skill_delay)
 		return battle_config.min_skill_delay_limit; 
 
-	// instant delay skills have aspd delay IF they were also instant cast (reported by Tharis) [Skotlex]
+	// no-delay skills get aspd delay IF they were also instant cast (reported by Tharis) [Skotlex]
 	if (time == 0) {
 		if (instantcast)
 			time = status_get_amotion(bl); //Use attack delay.