summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
authorultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-11-13 21:06:21 +0000
committerultramage <ultramage@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-11-13 21:06:21 +0000
commit8bb31688f71af76a143220c41079d3e01be85c1a (patch)
treeb3836c0c43f62110781fdec5e9dfc7863b2f740c /src/map
parentdc4f74eb17589524084cd08118f6fb60cfdcbf02 (diff)
downloadhercules-8bb31688f71af76a143220c41079d3e01be85c1a.tar.gz
hercules-8bb31688f71af76a143220c41079d3e01be85c1a.tar.bz2
hercules-8bb31688f71af76a143220c41079d3e01be85c1a.tar.xz
hercules-8bb31688f71af76a143220c41079d3e01be85c1a.zip
Resolved a client hang in the scenario where the client sent loadendack before the server finished loading all data (bugreport:3700).
Improved the performance of pc_autosave() to stop scanning players after it has already found the player it wanted to save (bugreport:3717). The 'overweight' status changes (SC_WEIGHT50/SC_WEIGHT90) will now be cleared on logout, to avoid saving them into the database (they get derived from player weight during login anyway). Improved lock.c on windows to use C's access(0) function instead of doing fopen/fclose when testing for existence of files. Re-added the 'static' attribute to mapindex_getmapname_ext's buffer; returning the address of a non-static local variable is undefined behavior (see r13901). git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@14144 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map')
-rw-r--r--src/map/clif.c22
-rw-r--r--src/map/map.c4
-rw-r--r--src/map/pc.c3
3 files changed, 20 insertions, 9 deletions
diff --git a/src/map/clif.c b/src/map/clif.c
index ed9f12c72..2eb614780 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -13416,15 +13416,21 @@ int clif_parse(int fd)
if ((int)RFIFOREST(fd) < packet_len)
return 0; // not enough data received to form the packet
- if (packet_db[packet_ver][cmd].func) {
- if (sd && sd->bl.prev == NULL && packet_db[packet_ver][cmd].func != clif_parse_LoadEndAck)
- ; //Only valid packet when player is not on a map is the finish-loading packet.
+ if( packet_db[packet_ver][cmd].func == clif_parse_debug )
+ packet_db[packet_ver][cmd].func(fd, sd);
+ else
+ if( packet_db[packet_ver][cmd].func != NULL )
+ {
+ if( !sd && packet_db[packet_ver][cmd].func != clif_parse_WantToConnection )
+ ; //Only valid packet when there is no session
+ else
+ if( sd && sd->bl.prev == NULL && packet_db[packet_ver][cmd].func != clif_parse_LoadEndAck )
+ ; //Only valid packet when player is not on a map
+ else
+ if( sd && session[sd->fd]->flag.eof )
+ ; //No more packets accepted
else
- if ((sd && sd->state.active)
- || packet_db[packet_ver][cmd].func == clif_parse_WantToConnection
- || packet_db[packet_ver][cmd].func == clif_parse_debug
- ) //Only execute the function when there's an active sd (except for debug/wanttoconnect packets)
- packet_db[packet_ver][cmd].func(fd, sd);
+ packet_db[packet_ver][cmd].func(fd, sd);
}
#if DUMP_UNKNOWN_PACKET
else if (battle_config.error_log)
diff --git a/src/map/map.c b/src/map/map.c
index 8a845c4be..7488a5a15 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1600,6 +1600,10 @@ int map_quit(struct map_session_data *sd)
status_change_end(&sd->bl,SC_GUILDAURA,-1);
if(sd->sc.data[SC_ENDURE] && sd->sc.data[SC_ENDURE]->val4)
status_change_end(&sd->bl,SC_ENDURE,-1); //No need to save infinite endure.
+ if(sd->sc.data[SC_WEIGHT50])
+ status_change_end(&sd->bl,SC_WEIGHT50,-1);
+ if(sd->sc.data[SC_WEIGHT90])
+ status_change_end(&sd->bl,SC_WEIGHT90,-1);
if (battle_config.debuff_on_logout&1) {
if(sd->sc.data[SC_ORCISH])
status_change_end(&sd->bl,SC_ORCISH,-1);
diff --git a/src/map/pc.c b/src/map/pc.c
index 72663a5b0..5d94a1942 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -1086,7 +1086,7 @@ int pc_reg_received(struct map_session_data *sd)
intif_request_questlog(sd);
#endif
- if (!sd->state.connect_new && sd->fd)
+ if (sd->state.connect_new == 0 && sd->fd)
{ //Character already loaded map! Gotta trigger LoadEndAck manually.
sd->state.connect_new = 1;
clif_parse_LoadEndAck(sd->fd, sd);
@@ -7467,6 +7467,7 @@ int pc_autosave(int tid, unsigned int tick, int id, intptr data)
save_flag = 2;
chrif_save(sd,0);
+ break;
}
mapit_free(iter);