updates
git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@793 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
parent
6c05d48117
commit
f922478b19
@ -1,5 +1,26 @@
|
|||||||
Date Added
|
Date Added
|
||||||
12/26
|
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]
|
* Disabled import charcommand_conf.txt by default [celest]
|
||||||
* Added Bitmap File system from jA 1086 - automatically generates a cache
|
* 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
|
from maps in the GRF to speed up loading. You can enable/disable it with
|
||||||
|
@ -3338,7 +3338,7 @@ int do_init(int argc, char **argv){
|
|||||||
#undef mysql_query
|
#undef mysql_query
|
||||||
|
|
||||||
int debug_mysql_query(char *file, int line, void *mysql, const char *q) {
|
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);
|
return mysql_query((MYSQL *) mysql, q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1235,12 +1235,14 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
|
|||||||
{
|
{
|
||||||
// Could speed up by manipulating only guild_member
|
// Could speed up by manipulating only guild_member
|
||||||
struct guild * g= inter_guild_fromsql(guild_id);
|
struct guild * g= inter_guild_fromsql(guild_id);
|
||||||
int i,alv,c;
|
int i,alv,c, idx;
|
||||||
|
|
||||||
if(g==NULL||g->guild_id<=0)
|
if(g==NULL||g->guild_id<=0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
g->connect_member=0;
|
g->connect_member=0;
|
||||||
|
|
||||||
|
idx = -1;
|
||||||
|
|
||||||
for(i=0,alv=0,c=0;i<g->max_member;i++){
|
for(i=0,alv=0,c=0;i<g->max_member;i++){
|
||||||
if( g->member[i].account_id==account_id &&
|
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].lv=lv;
|
||||||
g->member[i].class=class;
|
g->member[i].class=class;
|
||||||
mapif_guild_memberinfoshort(g,i);
|
mapif_guild_memberinfoshort(g,i);
|
||||||
|
idx = i;
|
||||||
}
|
}
|
||||||
if( g->member[i].account_id>0 ){
|
if( g->member[i].account_id>0 ){
|
||||||
alv+=g->member[i].lv;
|
alv+=g->member[i].lv;
|
||||||
@ -1260,8 +1263,14 @@ int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id,
|
|||||||
}
|
}
|
||||||
// •½‹ÏƒŒƒxƒ‹
|
// •½‹ÏƒŒƒxƒ‹
|
||||||
g->average_lv=alv/c;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1385,21 +1394,34 @@ int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int cha
|
|||||||
}
|
}
|
||||||
switch(type){
|
switch(type){
|
||||||
case GMI_POSITION: // –ð<E28093>E
|
case GMI_POSITION: // –ð<E28093>E
|
||||||
g->member[i].position=*((int *)data);
|
{
|
||||||
break;
|
g->member[i].position=*((int *)data);
|
||||||
case GMI_EXP: { // EXP
|
mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
|
||||||
int exp,oldexp=g->member[i].exp;
|
inter_guild_tosql(g,3); // Change guild & guild_member
|
||||||
exp=g->member[i].exp=*((unsigned int *)data);
|
break;
|
||||||
g->exp+=(exp-oldexp);
|
}
|
||||||
guild_calcinfo(g); // LvƒAƒbƒv”»’f
|
case GMI_EXP:
|
||||||
mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4);
|
{ // EXP
|
||||||
}break;
|
int exp,oldexp=g->member[i].exp;
|
||||||
|
exp=g->member[i].exp=*((unsigned int *)data);
|
||||||
|
g->exp+=(exp-oldexp);
|
||||||
|
guild_calcinfo(g); // LvƒAƒbƒv”»’f
|
||||||
|
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:
|
default:
|
||||||
printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
|
printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len);
|
|
||||||
inter_guild_tosql(g,3); // Change guild & guild_member
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +62,10 @@ void set_defaultparse(int (*defaultparse)(int))
|
|||||||
default_func_parse = defaultparse;
|
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)
|
static void setsocketopts(int fd)
|
||||||
{
|
{
|
||||||
int yes = 1; // reuse fix
|
int yes = 1; // reuse fix
|
||||||
@ -70,7 +74,7 @@ static void setsocketopts(int fd)
|
|||||||
#ifdef SO_REUSEPORT
|
#ifdef SO_REUSEPORT
|
||||||
setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
|
setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes);
|
||||||
#endif
|
#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_SNDBUF, (char *) &wfifo_size , sizeof(rfifo_size ));
|
||||||
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size ));
|
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &rfifo_size , sizeof(rfifo_size ));
|
||||||
|
@ -91,6 +91,7 @@ int do_parsepacket(void);
|
|||||||
void do_socket(void);
|
void do_socket(void);
|
||||||
|
|
||||||
extern void flush_fifos();
|
extern void flush_fifos();
|
||||||
|
extern void set_nonblocking(int fd, int yes);
|
||||||
|
|
||||||
int start_console(void);
|
int start_console(void);
|
||||||
|
|
||||||
|
@ -939,6 +939,21 @@ int chrif_char_offline(struct map_session_data *sd)
|
|||||||
return 0;
|
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]
|
* Tell char-server to reset all chars offline [Wizputer]
|
||||||
*-----------------------------------------
|
*-----------------------------------------
|
||||||
|
@ -33,4 +33,6 @@ int check_connect_char_server(int tid, unsigned int tick, int id, int data);
|
|||||||
|
|
||||||
int do_init_chrif(void);
|
int do_init_chrif(void);
|
||||||
|
|
||||||
|
int chrif_flush_fifo(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2489,7 +2489,7 @@ static int cleanup_sub(struct block_list *bl, va_list ap) {
|
|||||||
|
|
||||||
switch(bl->type) {
|
switch(bl->type) {
|
||||||
case BL_PC:
|
case BL_PC:
|
||||||
map_delblock(bl); // There is something better...
|
map_quit((struct map_session_data *) bl);
|
||||||
break;
|
break;
|
||||||
case BL_NPC:
|
case BL_NPC:
|
||||||
npc_delete((struct npc_data *)bl);
|
npc_delete((struct npc_data *)bl);
|
||||||
@ -2522,9 +2522,13 @@ void do_final(void) {
|
|||||||
if(map[map_id].m)
|
if(map[map_id].m)
|
||||||
map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, 0, 0);
|
map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef TXT_ONLY
|
#ifndef TXT_ONLY
|
||||||
chrif_char_reset_offline();
|
chrif_char_reset_offline();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
chrif_flush_fifo();
|
||||||
|
|
||||||
for (i = 0; i < fd_max; i++)
|
for (i = 0; i < fd_max; i++)
|
||||||
delete_session(i);
|
delete_session(i);
|
||||||
|
|
||||||
|
33
src/map/pc.c
33
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) {
|
static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data) {
|
||||||
struct map_session_data *sd;
|
struct map_session_data *sd;
|
||||||
int i;
|
|
||||||
|
|
||||||
if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
|
if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC )
|
||||||
return 1;
|
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);
|
printf("spirit_timer %d != %d\n",sd->spirit_timer[0],tid);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
sd->spirit_timer[0]=-1;
|
|
||||||
for(i=1;i<sd->spiritball;i++) {
|
if(sd->spiritball <= 0) {
|
||||||
sd->spirit_timer[i-1] = sd->spirit_timer[i];
|
if(battle_config.error_log)
|
||||||
sd->spirit_timer[i] = -1;
|
printf("Spiritballs are already 0 when pc_spiritball_timer gets called");
|
||||||
}
|
|
||||||
sd->spiritball--;
|
|
||||||
if(sd->spiritball < 0)
|
|
||||||
sd->spiritball = 0;
|
sd->spiritball = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
sd->spiritball--;
|
||||||
|
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);
|
clif_spiritball(sd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pc_addspiritball(struct map_session_data *sd,int interval,int max) {
|
int pc_addspiritball(struct map_session_data *sd,int interval,int max) {
|
||||||
int i;
|
|
||||||
|
|
||||||
nullpo_retr(0, sd);
|
nullpo_retr(0, sd);
|
||||||
|
|
||||||
if(max > MAX_SKILL_LEVEL)
|
if(max > MAX_SKILL_LEVEL)
|
||||||
@ -217,16 +218,10 @@ int pc_addspiritball(struct map_session_data *sd,int interval,int max) {
|
|||||||
sd->spiritball = 0;
|
sd->spiritball = 0;
|
||||||
|
|
||||||
if(sd->spiritball >= max) {
|
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);
|
delete_timer(sd->spirit_timer[0],pc_spiritball_timer);
|
||||||
sd->spirit_timer[0] = -1;
|
memcpy( &sd->spirit_timer[0], &sd->spirit_timer[1], sizeof(sd->spirit_timer[0]) * (sd->spiritball - 1));
|
||||||
}
|
} else
|
||||||
for(i=1;i<max;i++) {
|
|
||||||
sd->spirit_timer[i-1] = sd->spirit_timer[i];
|
|
||||||
sd->spirit_timer[i] = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sd->spiritball++;
|
sd->spiritball++;
|
||||||
|
|
||||||
sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0);
|
sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user