diff --git a/src/map/clif.c b/src/map/clif.c
index 5110ca76be9d2e9eb5706c0ff01e96aa30698ef4..448d1454c3cdb55901787262480ed95ad634d0a4 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -17481,8 +17481,7 @@ void clif_cart_additem_ack(struct map_session_data *sd, int flag) {
/* */
unsigned short clif_decrypt_cmd( int cmd, struct map_session_data *sd ) {
if( sd ) {
- sd->cryptKey = (( sd->cryptKey * clif->cryptKey[1] ) + clif->cryptKey[2]) & 0xFFFFFFFF;
- return (cmd ^ ((sd->cryptKey >> 16) & 0x7FFF));
+ return (cmd ^ (((( sd->cryptKey * clif->cryptKey[1] ) + clif->cryptKey[2]) >> 16) & 0x7FFF));
}
return (cmd ^ (((( clif->cryptKey[0] * clif->cryptKey[1] ) + clif->cryptKey[2]) >> 16) & 0x7FFF));
}
@@ -17502,7 +17501,6 @@ unsigned short clif_parse_cmd_optional ( int fd, struct map_session_data *sd ) {
cmd = clif->decrypt_cmd( cmd, sd );
if( cmd > MAX_PACKET_DB || packet_db[cmd].len == 0 )
return 0;
- RFIFOW(fd, 0) = cmd;
}
return cmd;
@@ -17516,11 +17514,8 @@ unsigned short clif_parse_cmd_decrypt ( int fd, struct map_session_data *sd ) {
if (cmd > MAX_PACKET_DB || packet_db[cmd].len == 0 )
return 0;
- RFIFOW(fd, 0) = cmd;
-
return cmd;
}
-
/*==========================================
* Main client packet processing function
*------------------------------------------*/
@@ -17589,10 +17584,15 @@ int clif_parse(int fd) {
return 0;
}
}
-
+
if ((int)RFIFOREST(fd) < packet_len)
return 0; // not enough data received to form the packet
+ if( cmd != RFIFOW(fd, 0) ) {
+ RFIFOW(fd, 0) = cmd;
+ sd->cryptKey = (( sd->cryptKey * clif->cryptKey[1] ) + clif->cryptKey[2]) & 0xFFFFFFFF;
+ }
+
if( packet_db[cmd].func == clif->pDebug )
packet_db[cmd].func(fd, sd);
else if( packet_db[cmd].func != NULL ) {