فهرست منبع

- Added support for the new "make new char" packet that has the rename button data. Thanks to Sara-chan for the format change update.
- Fixed itemdb.c sql compilation
- Now when you specify a max level beyond what the exp table has, the last entry of the exp table will be duplicated to fill in the remaining levels.


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

skotlex 18 سال پیش
والد
کامیت
2208728178
5فایلهای تغییر یافته به همراه37 افزوده شده و 19 حذف شده
  1. 3 0
      Changelog-Trunk.txt
  2. 10 4
      src/char/char.c
  3. 12 8
      src/char_sql/char.c
  4. 6 6
      src/map/itemdb.c
  5. 6 1
      src/map/pc.c

+ 3 - 0
Changelog-Trunk.txt

@@ -4,6 +4,9 @@ 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.
 
 2006/12/22
+	* Now when you specify a max level beyond what the exp table has, the last
+	  entry of the exp table will be duplicated to fill in the remaining levels.
+	  [Skotlex]
 	* Change strncpy to memcpy when parsing switches in the script engine 
 	  since it's guaranteed to be a word of that size (skip_word).
 	* Made scriptlabel_db duplicate the key. When str_buf is reallocated, the 

+ 10 - 4
src/char/char.c

@@ -3631,9 +3631,9 @@ int parse_char(int fd) {
 				break;
 			}
 		{	//Send to player.
-			WFIFOHEAD(fd, 108);
+			WFIFOHEAD(fd, 110);
 			WFIFOW(fd,0) = 0x6d;
-			memset(WFIFOP(fd,2), 0, 106);
+			memset(WFIFOP(fd,2), 0, 108);
 
 			WFIFOL(fd,2) = char_dat[i].status.char_id;
 			WFIFOL(fd,2+4) = char_dat[i].status.base_exp>LONG_MAX?LONG_MAX:char_dat[i].status.base_exp;
@@ -3649,7 +3649,7 @@ int parse_char(int fd) {
 			WFIFOW(fd,2+44) = (char_dat[i].status.max_hp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.max_hp;
 			WFIFOW(fd,2+46) = (char_dat[i].status.sp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.sp;
 			WFIFOW(fd,2+48) = (char_dat[i].status.max_sp > SHRT_MAX) ? SHRT_MAX : char_dat[i].status.max_sp;
-			WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].status.speed;
+			WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED;
 			WFIFOW(fd,2+52) = char_dat[i].status.class_;
 			WFIFOW(fd,2+54) = char_dat[i].status.hair;
 
@@ -3669,9 +3669,15 @@ int parse_char(int fd) {
 			WFIFOB(fd,2+101) = (char_dat[i].status.int_ > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.int_;
 			WFIFOB(fd,2+102) = (char_dat[i].status.dex > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.dex;
 			WFIFOB(fd,2+103) = (char_dat[i].status.luk > UCHAR_MAX) ? UCHAR_MAX : char_dat[i].status.luk;
+#if PACKETVER > 7
+			//Updated packet structure with rename-button included. Credits to Sara-chan
+			WFIFOW(fd,2+104) = char_dat[i].status.char_num;
+			WFIFOB(fd,2+106) = 1; //Rename bit.
+			WFIFOSET(fd,110);
+#else
 			WFIFOB(fd,2+104) = char_dat[i].status.char_num;
-
 			WFIFOSET(fd,108);
+#endif	
 			RFIFOSKIP(fd,37);
 		}
 			for(ch = 0; ch < 9; ch++) {

+ 12 - 8
src/char_sql/char.c

@@ -1680,11 +1680,7 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
 	int i, j, found_num = 0;
 	struct mmo_charstatus *p = NULL;
 	const int offset = 24;
-#if PACKETVER > 7
 	WFIFOHEAD(fd, offset +9*108);
-#else
-	WFIFOHEAD(fd, offset +9*106);
-#endif
     
 	set_char_online(-1, 99,sd->account_id);
 
@@ -1712,6 +1708,7 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
 	WFIFOW(fd, 0) = 0x6b;
 
 #if PACKETVER > 7
+	//Updated packet structure with rename-button included. Credits to Sara-chan
 	memset(WFIFOP(fd, 0), 0, offset + found_num * 108);
 	WFIFOW(fd, 2) = offset + found_num * 108;
 #else
@@ -1773,6 +1770,7 @@ int mmo_char_send006b(int fd, struct char_session_data *sd) {
 		WFIFOB(fd,j+102) = (p->dex > UCHAR_MAX) ? UCHAR_MAX : p->dex;
 		WFIFOB(fd,j+103) = (p->luk > UCHAR_MAX) ? UCHAR_MAX : p->luk;
 #if PACKETVER > 7
+		//Updated packet structure with rename-button included. Credits to Sara-chan
 		WFIFOW(fd,j+104) = p->char_num;
 		WFIFOB(fd,j+106) = 1; //TODO: Handle this rename bit: 0 to enable renaming
 #else
@@ -3435,12 +3433,12 @@ int parse_char(int fd) {
 				break;
 			}
 		{	//Send data.
-			WFIFOHEAD(fd, 108);
+			WFIFOHEAD(fd, 110);
 			WFIFOW(fd, 0) = 0x6d;
-			memset(WFIFOP(fd, 2), 0x00, 106);
+			memset(WFIFOP(fd, 2), 0x00, 108);
 
 			mmo_char_fromsql_short(i, &char_dat); //Only the short data is needed.
-			WFIFOL(fd, 2) = char_dat.char_id;
+			WFIFOL(fd,2) = char_dat.char_id;
 			WFIFOL(fd,2+4) = char_dat.base_exp>LONG_MAX?LONG_MAX:char_dat.base_exp;
 			WFIFOL(fd,2+8) = char_dat.zeny;
 			WFIFOL(fd,2+12) = char_dat.job_exp>LONG_MAX?LONG_MAX:char_dat.job_exp;
@@ -3474,9 +3472,15 @@ int parse_char(int fd) {
 			WFIFOB(fd,2+101) = char_dat.int_>UCHAR_MAX?UCHAR_MAX:char_dat.int_;
 			WFIFOB(fd,2+102) = char_dat.dex>UCHAR_MAX?UCHAR_MAX:char_dat.dex;
 			WFIFOB(fd,2+103) = char_dat.luk>UCHAR_MAX?UCHAR_MAX:char_dat.luk;
+#if PACKETVER > 7
+			//Updated packet structure with rename-button included. Credits to Sara-chan
+			WFIFOW(fd,2+104) = char_dat.char_num;
+			WFIFOB(fd,2+106) = 1; //Rename bit.
+			WFIFOSET(fd, 110);
+#else
 			WFIFOB(fd,2+104) = char_dat.char_num;
-
 			WFIFOSET(fd, 108);
+#endif	
 			RFIFOSKIP(fd, 37);
 		}	
 			//to do

+ 6 - 6
src/map/itemdb.c

@@ -954,10 +954,10 @@ static int itemdb_read_sqldb(void)
 						script_free_code(id->script);
 					if (sql_row[19] != NULL) {
 						if (sql_row[19][0] == '{')
-							id->script = parse_script((unsigned char *) sql_row[19],item_db_name[i], 0);
+							id->script = parse_script((unsigned char *) sql_row[19],item_db_name[i], ln, 0);
 						else {
 							sprintf(script, "{%s}", sql_row[19]);
-							id->script = parse_script((unsigned char *) script, item_db_name[i], 0);
+							id->script = parse_script((unsigned char *) script, item_db_name[i], ln, 0);
 						}
 					} else id->script = NULL;
 	
@@ -965,10 +965,10 @@ static int itemdb_read_sqldb(void)
 						script_free_code(id->equip_script);
 					if (sql_row[20] != NULL) {
 						if (sql_row[20][0] == '{')
-							id->equip_script = parse_script((unsigned char *) sql_row[20], item_db_name[i], 0);
+							id->equip_script = parse_script((unsigned char *) sql_row[20], item_db_name[i], ln, 0);
 						else {
 							sprintf(script, "{%s}", sql_row[20]);
-							id->equip_script = parse_script((unsigned char *) script, item_db_name[i], 0);
+							id->equip_script = parse_script((unsigned char *) script, item_db_name[i], ln, 0);
 						}
 					} else id->equip_script = NULL;
 	
@@ -976,10 +976,10 @@ static int itemdb_read_sqldb(void)
 						script_free_code(id->unequip_script);
 					if (sql_row[21] != NULL) {
 						if (sql_row[21][0] == '{')
-							id->unequip_script = parse_script((unsigned char *) sql_row[21],item_db_name[i], 0);
+							id->unequip_script = parse_script((unsigned char *) sql_row[21],item_db_name[i], ln, 0);
 						else {
 							sprintf(script, "{%s}", sql_row[21]);
-							id->unequip_script = parse_script((unsigned char *) script, item_db_name[i], 0);
+							id->unequip_script = parse_script((unsigned char *) script, item_db_name[i], ln, 0);
 						}
 					} else id->unequip_script = NULL;
 				

+ 6 - 1
src/map/pc.c

@@ -7314,7 +7314,12 @@ int pc_readdb(void)
 			max_level[job][type]--;
 		if (max_level[job][type] < max) {
 			ShowWarning("pc_readdb: Specified max %d for job %d, but that job's exp table only goes up to level %d.\n", max, job, max_level[job][type]);
-			ShowNotice("(You may still reach lv %d through scripts/gm-commands)\n", max);
+			ShowInfo("Filling the missing values with the last exp entry.\n");
+			//Fill the requested values with the last entry.
+			i = max_level[job][type]-2;
+			if (i < 0) i = 0;
+			for (; i < max-2; i++)
+				exp_table[job][type][i] = exp_table[job][type][i-1];
 			max_level[job][type] = max;
 		}
 //		ShowDebug("%s - Class %d: %d\n", type?"Job":"Base", job, max_level[job][type]);