Forráskód Böngészése

updates

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@793 54d463be-8e91-2dee-dedb-b68131a5f0ec
amber 20 éve
szülő
commit
f922478b19
9 módosított fájl, 101 hozzáadás és 37 törlés
  1. 21 0
      Changelog.txt
  2. 1 1
      src/char_sql/char.c
  3. 38 16
      src/char_sql/int_guild.c
  4. 5 1
      src/common/socket.c
  5. 1 0
      src/common/socket.h
  6. 15 0
      src/map/chrif.c
  7. 2 0
      src/map/chrif.h
  8. 5 1
      src/map/map.c
  9. 13 18
      src/map/pc.c

+ 21 - 0
Changelog.txt

@@ -1,5 +1,26 @@
 Date	Added
 12/26
+	* @mapexit (and do_final) now persist all data to the
+	  char server before exiting to eliminate storage/inventory
+	  inconsistancies.. [MouseJstr]  (SVN 793)
+	* Some cleanup of spiritball memory management [MouseJstr] 
+	* Dramatic performance work for exp updates to sql.  Previously, [MouseJstr]
+	  when u killed a mob (in party share), it would cause the char_server to 
+
+	  	1) Delete all guilds for all members of your party
+	  	2) Re-create all guilds for all members of your party with the new exp
+	     		values.
+
+          Now it just generates 2 sql statements per party member,  
+
+		1) update the guild exp, 
+		2) update the guild_member exp.
+
+
+      		src/common/socket.c src/common/socket.h src/char_sql/char.c 
+		src/char_sql/int_guild.c src/map/chrif.h src/map/pc.c 
+		src/map/map.c src/map/chrif.c
+
         * Disabled import charcommand_conf.txt by default [celest]
         * Added Bitmap File system from jA 1086 - automatically generates a cache
           from maps in the GRF to speed up loading. You can enable/disable it with

+ 1 - 1
src/char_sql/char.c

@@ -3338,7 +3338,7 @@ int do_init(int argc, char **argv){
 #undef mysql_query
 
 int debug_mysql_query(char *file, int line, void *mysql, const char *q) {
-  //        printf("sql: %s:%d# %s\n", file, line, q);
+        printf("sql: %s:%d# %s\n", file, line, q);
         return mysql_query((MYSQL *) mysql, q);
 }
 

+ 38 - 16
src/char_sql/int_guild.c

@@ -1235,12 +1235,14 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
 {
 	// Could speed up by manipulating only guild_member
 	struct guild * g= inter_guild_fromsql(guild_id);
-	int i,alv,c;
+	int i,alv,c, idx;
 
 	if(g==NULL||g->guild_id<=0)
 		return 0;
 	
 	g->connect_member=0;
+
+	idx = -1;
 	
 	for(i=0,alv=0,c=0;i<g->max_member;i++){
 		if(	g->member[i].account_id==account_id &&
@@ -1250,6 +1252,7 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
 			g->member[i].lv=lv;
 			g->member[i].class=class;
 			mapif_guild_memberinfoshort(g,i);
+			idx = i;
 		}
 		if( g->member[i].account_id>0 ){
 			alv+=g->member[i].lv;
@@ -1260,8 +1263,14 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
 	}
 	// 平均レベル
 	g->average_lv=alv/c;
-	
-	inter_guild_tosql(g,3); // Change guild & guild_member
+
+	sprintf(tmp_sql, "UPDATE `%s` SET `connect_member`=%d,`average_lv`=%d WHERE `guild_id`='%d'", guild_db,  g->connect_member, g->average_lv,  g->guild_id);
+	if(mysql_query(&mysql_handle, tmp_sql) ) 
+	  printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) );
+
+	sprintf(tmp_sql, "UPDATE `%s` SET `online`=%d,`lv`=%d,`class`=%d WHERE `char_id`=%d", guild_member_db, g->member[idx].online, g->member[idx].lv, g->member[idx].class, g->member[idx].char_id);
+	if(mysql_query(&mysql_handle, tmp_sql) ) 
+	  printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) );
 	
 	return 0;
 }
@@ -1385,21 +1394,34 @@ int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int cha
 	}
 	switch(type){
 	case GMI_POSITION:	// 役職
-		g->member[i].position=*((int *)data);
-		break;
-	case GMI_EXP:	{	// EXP
-			int exp,oldexp=g->member[i].exp;
-			exp=g->member[i].exp=*((unsigned int *)data);
-			g->exp+=(exp-oldexp);
-			guild_calcinfo(g);	// Lvアップ判断
-			mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
-		}break;
+	  {
+	    g->member[i].position=*((int *)data);
+	    mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+	    inter_guild_tosql(g,3); // Change guild & guild_member
+	    break;
+	  }
+	case GMI_EXP:	
+	  {	// EXP
+	    int exp,oldexp=g->member[i].exp;
+	    exp=g->member[i].exp=*((unsigned int *)data);
+	    g->exp+=(exp-oldexp);
+	    guild_calcinfo(g);	// Lvアップ判断
+	    mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
+	    mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
+
+	    sprintf(tmp_sql, "UPDATE `%s` SET `guild_lv`=%d,`connect_member`=%d,`max_member`=%d,`average_lv`=%d,`exp`=%d,`next_exp`=%d,`skill_point`=%d WHERE `guild_id`='%d'", guild_db, g->guild_lv, g->connect_member, g->max_member, g->average_lv, g->exp, g->next_exp, g->skill_point, g->guild_id);
+	    if(mysql_query(&mysql_handle, tmp_sql) ) 
+	      printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) );
+
+	    sprintf(tmp_sql, "UPDATE `%s` SET `exp`=%d  WHERE `char_id`=%d", guild_member_db, g->member[i].exp, g->member[i].char_id);
+	    if(mysql_query(&mysql_handle, tmp_sql) ) 
+	      printf("DB server Error: %s - %s\n", tmp_sql, mysql_error(&mysql_handle) );
+	    break;
+	  }
 	default:
-		printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
-		break;
+	  printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
+	  break;
 	}
-	mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
-	inter_guild_tosql(g,3); // Change guild & guild_member
 	return 0;
 }
 

+ 5 - 1
src/common/socket.c

@@ -62,6 +62,10 @@ void set_defaultparse(int (*defaultparse)(int))
 	default_func_parse = defaultparse;
 }
 
+void set_nonblocking(int fd, int yes) {
+	setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
+}
+
 static void setsocketopts(int fd)
 {
 	int yes = 1; // reuse fix
@@ -70,7 +74,7 @@ static void setsocketopts(int fd)
 #ifdef SO_REUSEPORT
 	setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
 #endif
-	setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes);
+	set_nonblocking(fd, yes);
 
 	setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &wfifo_size , sizeof(rfifo_size ));
 	setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size ));

+ 1 - 0
src/common/socket.h

@@ -91,6 +91,7 @@ int do_parsepacket(void);
 void do_socket(void);
 
 extern void flush_fifos();
+extern void set_nonblocking(int fd, int yes);
 
 int start_console(void);
 

+ 15 - 0
src/map/chrif.c

@@ -939,6 +939,21 @@ int chrif_char_offline(struct map_session_data *sd)
 	return 0;
 }
 
+/*=========================================
+ * Tell char-server to reset all chars offline [Wizputer]
+ *-----------------------------------------
+ */
+int chrif_flush_fifo(void) {
+	if (char_fd < 1)
+		return -1;
+
+	set_nonblocking(char_fd, 0);
+	flush_fifos();
+	set_nonblocking(char_fd, 1);
+
+	return 0;
+}
+
 /*=========================================
  * Tell char-server to reset all chars offline [Wizputer]
  *-----------------------------------------

+ 2 - 0
src/map/chrif.h

@@ -33,4 +33,6 @@ int check_connect_char_server(int tid, unsigned int tick, int id, int data);
 
 int do_init_chrif(void);
 
+int chrif_flush_fifo(void);
+
 #endif

+ 5 - 1
src/map/map.c

@@ -2489,7 +2489,7 @@ static int cleanup_sub(struct block_list *bl, va_list ap) {
 
         switch(bl->type) {
         case BL_PC:
-            map_delblock(bl); // There is something better...
+            map_quit((struct map_session_data *) bl);
             break;
         case BL_NPC:
             npc_delete((struct npc_data *)bl);
@@ -2522,9 +2522,13 @@ void do_final(void) {
 	if(map[map_id].m)
 		map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, 0, 0);
     }
+
 #ifndef TXT_ONLY
     chrif_char_reset_offline();
 #endif
+
+    chrif_flush_fifo();
+
     for (i = 0; i < fd_max; i++)
         delete_session(i);
 

+ 13 - 18
src/map/pc.c

@@ -183,7 +183,6 @@ int pc_delinvincibletimer(struct map_session_data *sd) {
 
 static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data) {
 	struct map_session_data *sd;
-	int i;
 
 	if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
 		return 1;
@@ -193,22 +192,24 @@ static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data) {
 			printf("spirit_timer %d != %d\n",sd->spirit_timer[0],tid);
 		return 0;
 	}
-	sd->spirit_timer[0]=-1;
-	for(i=1;i<sd->spiritball;i++) {
-		sd->spirit_timer[i-1] = sd->spirit_timer[i];
-		sd->spirit_timer[i] = -1;
+
+	if(sd->spiritball <= 0) {
+		if(battle_config.error_log)
+			printf("Spiritballs are already 0 when pc_spiritball_timer gets called");
+		sd->spiritball = 0;
+		return 0;
 	}
+
 	sd->spiritball--;
-	if(sd->spiritball < 0)
-		sd->spiritball = 0;
+	memcpy( &sd->spirit_timer[0], &sd->spirit_timer[1], sizeof(sd->spirit_timer[0]) * sd->spiritball );
+	sd->spirit_timer[sd->spiritball]=-1;
+
 	clif_spiritball(sd);
 
 	return 0;
 }
 
 int pc_addspiritball(struct map_session_data *sd,int interval,int max) {
-	int i;
-
 	nullpo_retr(0, sd);
 
 	if(max > MAX_SKILL_LEVEL)
@@ -217,16 +218,10 @@ int pc_addspiritball(struct map_session_data *sd,int interval,int max) {
 		sd->spiritball = 0;
 
 	if(sd->spiritball >= max) {
-		if(sd->spirit_timer[0] != -1) {
+		if(sd->spirit_timer[0] != -1) 
 			delete_timer(sd->spirit_timer[0],pc_spiritball_timer);
-			sd->spirit_timer[0] = -1;
-		}
-		for(i=1;i<max;i++) {
-			sd->spirit_timer[i-1] = sd->spirit_timer[i];
-			sd->spirit_timer[i] = -1;
-		}
-	}
-	else
+		memcpy( &sd->spirit_timer[0], &sd->spirit_timer[1], sizeof(sd->spirit_timer[0]) * (sd->spiritball - 1));
+	} else
 		sd->spiritball++;
 
 	sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0);