// Save account_reg into sql (type=2) int mapif_parse_Registry(int fd) { int account_id = RFIFOL(fd, 4), char_id = RFIFOL(fd, 8), count = RFIFOW(fd, 12); if( count ) { int cursor = 14, i; bool isLoginActive = session_isActive(login_fd); if( isLoginActive ) chlogif_upd_global_accreg(account_id,char_id); for(i = 0; i < count; i++) { size_t lenkey = RFIFOB( fd, cursor ); const char* src_key= RFIFOCP(fd, cursor + 1); std::string key( src_key, lenkey ); cursor += lenkey + 1; unsigned int index = RFIFOL(fd, cursor); cursor += 4; switch (RFIFOB(fd, cursor++)) { // int case 0: { intptr_t lVal = RFIFOL( fd, cursor ); inter_savereg( account_id, char_id, key.c_str(), index, lVal, false ); cursor += 4; break; } case 1: inter_savereg(account_id,char_id,key.c_str(),index,0,false); break; // str case 2: { size_t len_val = RFIFOB( fd, cursor ); const char* src_val= RFIFOCP(fd, cursor + 1); std::string sval( src_val, len_val ); cursor += len_val + 1; inter_savereg( account_id, char_id, key.c_str(), index, (intptr_t)sval.c_str(), true ); break; } case 3: inter_savereg(account_id,char_id,key.c_str(),index,0,true); break; default: ShowError("mapif_parse_Registry: unknown type %d\n",RFIFOB(fd, cursor - 1)); return 1; } } if (isLoginActive) chlogif_prepsend_global_accreg(); } return 0; }
void chlogif_send_global_accreg(const char *key, unsigned int index, intptr_t val, bool is_string) { int nlen = WFIFOW(login_fd, 2); size_t len; if (!chlogif_isconnected()) return; len = strlen(key)+1; WFIFOB(login_fd, nlen) = (unsigned char)len; // won't be higher; the column size is 32 nlen += 1; safestrncpy(WFIFOCP(login_fd,nlen), key, len); nlen += len; WFIFOL(login_fd, nlen) = index; nlen += 4; if( is_string ) { WFIFOB(login_fd, nlen) = val ? 2 : 3; nlen += 1; if( val ) { char *sval = (char*)val; len = strlen(sval)+1; WFIFOB(login_fd, nlen) = (unsigned char)len; // won't be higher; the column size is 254 nlen += 1; safestrncpy(WFIFOCP(login_fd,nlen), sval, len); nlen += len; } } else { WFIFOB(login_fd, nlen) = val ? 0 : 1; nlen += 1; if( val ) { WFIFOL(login_fd, nlen) = (int)val; nlen += 4; } } WFIFOW(login_fd,12) += 1; WFIFOW(login_fd, 2) = nlen; if( WFIFOW(login_fd, 2) > 60000 ) { int account_id = WFIFOL(login_fd,4), char_id = WFIFOL(login_fd,8); chlogif_prepsend_global_accreg(); chlogif_upd_global_accreg(account_id, char_id); // prepare next } }