diff --git a/sql/characters.sql b/sql/characters.sql index ee289d2d0..27e381585 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -21,7 +21,7 @@ DROP TABLE IF EXISTS `character_db_version`; CREATE TABLE `character_db_version` ( - `required_8409_01_characters_guild` bit(1) default NULL + `required_8433_01_characters_character_account_data` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- @@ -247,6 +247,28 @@ LOCK TABLES `characters` WRITE; /*!40000 ALTER TABLE `characters` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `character_account_data` +-- + +DROP TABLE IF EXISTS `character_account_data`; +CREATE TABLE `character_account_data` ( + `guid` int(11) unsigned NOT NULL default '0', + `type` int(11) unsigned NOT NULL default '0', + `time` bigint(11) unsigned NOT NULL default '0', + `data` longtext NOT NULL, + PRIMARY KEY (`guid`,`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `character_account_data` +-- + +LOCK TABLES `character_account_data` WRITE; +/*!40000 ALTER TABLE `character_account_data` DISABLE KEYS */; +/*!40000 ALTER TABLE `character_account_data` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `character_achievement` -- diff --git a/sql/updates/8433_01_characters_character_account_data.sql b/sql/updates/8433_01_characters_character_account_data.sql new file mode 100644 index 000000000..88402b294 --- /dev/null +++ b/sql/updates/8433_01_characters_character_account_data.sql @@ -0,0 +1,16 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_8409_01_characters_guild required_8433_01_characters_character_account_data bit; + +DROP TABLE IF EXISTS `character_account_data`; +CREATE TABLE `character_account_data` ( + `guid` int(11) unsigned NOT NULL default '0', + `type` int(11) unsigned NOT NULL default '0', + `time` bigint(11) unsigned NOT NULL default '0', + `data` longtext NOT NULL, + PRIMARY KEY (`guid`,`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO character_account_data +SELECT c.guid as guid, a.type as type, a.time as time, a.data as data +FROM characters c LEFT JOIN account_data a ON c.account = a.account WHERE a.type IN (1, 3, 5, 6, 7); + +DELETE FROM account_data WHERE type IN (1, 3, 5, 6, 7); \ No newline at end of file diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index d6e7b108f..a287b2962 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -95,6 +95,7 @@ pkgdata_DATA = \ 8409_01_characters_guild.sql \ 8412_01_mangos_mangos_string.sql \ 8416_01_mangos_spell_learn_spell.sql \ + 8433_01_characters_character_account_data.sql \ README ## Additional files to include when running 'make dist' @@ -170,4 +171,5 @@ EXTRA_DIST = \ 8409_01_characters_guild.sql \ 8412_01_mangos_mangos_string.sql \ 8416_01_mangos_spell_learn_spell.sql \ + 8433_01_characters_character_account_data.sql \ README diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 4ec092edb..0a911e072 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -83,6 +83,7 @@ bool LoginQueryHolder::Initialize() res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS,"SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = '%u'", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid)); res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADBGDATA, "SELECT instance_id, team, join_x, join_y, join_z, join_o, join_map, taxi_start, taxi_end, mount_spell FROM character_battleground_data WHERE guid = '%u'", GUID_LOPART(m_guid)); + res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACCOUNTDATA, "SELECT type, time, data FROM character_account_data WHERE guid='%u'", GUID_LOPART(m_guid)); return res; } @@ -580,12 +581,9 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) data << pCurrChar->GetOrientation(); SendPacket(&data); - data.Initialize( SMSG_ACCOUNT_DATA_TIMES, 4+1+8*4 ); // changed in WotLK - data << uint32(time(NULL)); // unix time of something - data << uint8(1); - for(int i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i) - data << uint32(GetAccountData(i)->Time); // also unix time - SendPacket(&data); + // load player specific part before send times + LoadAccountData(holder->GetResult(PLAYER_LOGIN_QUERY_LOADACCOUNTDATA),PER_CHARACTER_CACHE_MASK); + SendAccountDataTimes(); data.Initialize(SMSG_FEATURE_SYSTEM_STATUS, 2); // added in 2.2.0 data << uint8(2); // unknown value diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index e8f907f90..ada33fca6 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -866,7 +866,7 @@ void WorldSession::HandleUpdateAccountData(WorldPacket &recv_data) if(decompressedSize == 0) // erase { - SetAccountData(type, 0, ""); + SetAccountData(AccountDataType(type), 0, ""); WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4); data << uint32(type); @@ -899,7 +899,7 @@ void WorldSession::HandleUpdateAccountData(WorldPacket &recv_data) std::string adata; dest >> adata; - SetAccountData(type, timestamp, adata); + SetAccountData(AccountDataType(type), timestamp, adata); WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4); data << uint32(type); @@ -919,7 +919,7 @@ void WorldSession::HandleRequestAccountData(WorldPacket& recv_data) if(type > NUM_ACCOUNT_DATA_TYPES) return; - AccountData *adata = GetAccountData(type); + AccountData *adata = GetAccountData(AccountDataType(type)); uint32 size = adata->Data.size(); diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index b19c5fea5..8ba1de0de 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -310,7 +310,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x119*/ { "CMSG_IGNORE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleIgnoreTradeOpcode }, /*0x11A*/ { "CMSG_ACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleAcceptTradeOpcode }, /*0x11B*/ { "CMSG_UNACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleUnacceptTradeOpcode }, - /*0x11C*/ { "CMSG_CANCEL_TRADE", STATUS_AUTHED, &WorldSession::HandleCancelTradeOpcode }, + /*0x11C*/ { "CMSG_CANCEL_TRADE", STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, &WorldSession::HandleCancelTradeOpcode}, /*0x11D*/ { "CMSG_SET_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeItemOpcode }, /*0x11E*/ { "CMSG_CLEAR_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleClearTradeItemOpcode }, /*0x11F*/ { "CMSG_SET_TRADE_GOLD", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeGoldOpcode }, @@ -549,7 +549,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x208*/ { "SMSG_GMTICKET_UPDATETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x209*/ { "SMSG_ACCOUNT_DATA_TIMES", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x20A*/ { "CMSG_REQUEST_ACCOUNT_DATA", STATUS_LOGGEDIN, &WorldSession::HandleRequestAccountData }, - /*0x20B*/ { "CMSG_UPDATE_ACCOUNT_DATA", STATUS_AUTHED, &WorldSession::HandleUpdateAccountData }, + /*0x20B*/ { "CMSG_UPDATE_ACCOUNT_DATA", STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, &WorldSession::HandleUpdateAccountData}, /*0x20C*/ { "SMSG_UPDATE_ACCOUNT_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x20D*/ { "SMSG_CLEAR_FAR_SIGHT_IMMEDIATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x20E*/ { "SMSG_POWERGAINLOG_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, @@ -1005,7 +1005,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x3D0*/ { "CMSG_TARGET_CAST", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x3D1*/ { "CMSG_TARGET_SCRIPT_CAST", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x3D2*/ { "CMSG_CHANNEL_DISPLAY_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelDisplayListQuery }, - /*0x3D3*/ { "CMSG_SET_ACTIVE_VOICE_CHANNEL", STATUS_AUTHED, &WorldSession::HandleSetActiveVoiceChannel }, + /*0x3D3*/ { "CMSG_SET_ACTIVE_VOICE_CHANNEL", STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, &WorldSession::HandleSetActiveVoiceChannel }, /*0x3D4*/ { "CMSG_GET_CHANNEL_MEMBER_COUNT", STATUS_LOGGEDIN, &WorldSession::HandleGetChannelMemberCount }, /*0x3D5*/ { "SMSG_CHANNEL_MEMBER_COUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x3D6*/ { "CMSG_CHANNEL_VOICE_ON", STATUS_LOGGEDIN, &WorldSession::HandleChannelVoiceOnOpcode }, diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index df6a88fa9..7e5f9707c 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -1269,9 +1269,10 @@ enum Opcodes /// Player state enum SessionStatus { - STATUS_AUTHED = 0, ///< Player authenticated - STATUS_LOGGEDIN, ///< Player in game - STATUS_TRANSFER, ///< Player transferring to another map + STATUS_AUTHED = 0, ///< Player authenticated (_player==NULL, m_playerRecentlyLogout = false or will be reset before handler call, m_GUID have garbage) + STATUS_LOGGEDIN, ///< Player in game (_player!=NULL, m_GUID == _player->GetGUID(), inWorld()) + STATUS_TRANSFER, ///< Player transferring to another map (_player!=NULL, m_GUID == _player->GetGUID(), !inWorld()) + STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, ///< _player!= NULL or _player==NULL && m_playerRecentlyLogout, m_GUID store last _player guid) STATUS_NEVER ///< Opcode not accepted from client (deprecated or server side only) }; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 5e52b87d9..963bf4608 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -3976,6 +3976,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC } CharacterDatabase.PExecute("DELETE FROM characters WHERE guid = '%u'",guid); + CharacterDatabase.PExecute("DELETE FROM character_account_data WHERE guid = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_action WHERE guid = '%u'",guid); CharacterDatabase.PExecute("DELETE FROM character_aura WHERE guid = '%u'",guid); diff --git a/src/game/Player.h b/src/game/Player.h index f314fd36f..b1c0cbd6e 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -867,7 +867,8 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 19, PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS = 20, PLAYER_LOGIN_QUERY_LOADBGDATA = 21, - MAX_PLAYER_LOGIN_QUERY = 22 + PLAYER_LOGIN_QUERY_LOADACCOUNTDATA = 22, + MAX_PLAYER_LOGIN_QUERY = 23 }; enum PlayerDelayedOperations diff --git a/src/game/TradeHandler.cpp b/src/game/TradeHandler.cpp index b86ab2e6f..c7948f523 100644 --- a/src/game/TradeHandler.cpp +++ b/src/game/TradeHandler.cpp @@ -451,7 +451,7 @@ void WorldSession::SendCancelTrade() void WorldSession::HandleCancelTradeOpcode(WorldPacket& /*recvPacket*/) { // sended also after LOGOUT COMPLETE - if(_player) // needed because STATUS_AUTHED + if(_player) // needed because STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT _player->TradeCancel(true); } diff --git a/src/game/World.cpp b/src/game/World.cpp index 17dd78af7..7cce531d5 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -249,7 +249,7 @@ World::AddSession_ (WorldSession* s) // Updates the population if (pLimit > 0) { - float popu = GetActiveSessionCount (); //updated number of users on the server + float popu = GetActiveSessionCount (); // updated number of users on the server popu /= pLimit; popu *= 2; loginDatabase.PExecute ("UPDATE realmlist SET population = '%f' WHERE id = '%d'", popu, realmID); @@ -2159,4 +2159,4 @@ void World::LoadDBVersion() if(m_CreatureEventAIVersion.empty()) m_CreatureEventAIVersion = "Unknown creature EventAI."; -} +} \ No newline at end of file diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 2367c01a8..534cdef1e 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -201,6 +201,19 @@ bool WorldSession::Update(uint32 /*diff*/) } // lag can cause STATUS_LOGGEDIN opcodes to arrive after the player started a transfer break; + case STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT: + if(!_player && !m_playerRecentlyLogout) + { + LogUnexpectedOpcode(packet, "the player has not logged in yet and not recently logout"); + } + else + { + // not expected _player or must checked in packet hanlder + (this->*opHandle.handler)(*packet); + if (sLog.IsOutDebug() && packet->rpos() < packet->wpos()) + LogUnprocessedTail(packet); + } + break; case STATUS_TRANSFER: if(!_player) LogUnexpectedOpcode(packet, "the player has not logged in yet"); @@ -422,7 +435,7 @@ void WorldSession::LogoutPlayer(bool Save) // calls to GetMap in this case may cause crashes Map* _map = _player->GetMap(); _map->Remove(_player, true); - _player = NULL; // deleted in Remove call + SetPlayer(NULL); // deleted in Remove call ///- Send the 'logout complete' packet to the client WorldPacket data( SMSG_LOGOUT_COMPLETE, 0 ); @@ -558,15 +571,19 @@ void WorldSession::SendAuthWaitQue(uint32 position) } } -void WorldSession::LoadAccountData() +void WorldSession::LoadGlobalAccountData() +{ + LoadAccountData( + CharacterDatabase.PQuery("SELECT type, time, data FROM account_data WHERE account='%u'", GetAccountId()), + GLOBAL_CACHE_MASK + ); +} + +void WorldSession::LoadAccountData(QueryResult* result, uint32 mask) { for (uint32 i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i) - { - AccountData data; - m_accountData[i] = data; - } - - QueryResult *result = CharacterDatabase.PQuery("SELECT type, time, data FROM account_data WHERE account='%u'", GetAccountId()); + if(mask & (1 < i)) + m_accountData[i] = AccountData(); if(!result) return; @@ -576,28 +593,65 @@ void WorldSession::LoadAccountData() Field *fields = result->Fetch(); uint32 type = fields[0].GetUInt32(); - if(type < NUM_ACCOUNT_DATA_TYPES) + if (type >= NUM_ACCOUNT_DATA_TYPES) { - m_accountData[type].Time = fields[1].GetUInt32(); - m_accountData[type].Data = fields[2].GetCppString(); + sLog.outError("Table `%s` have invalid account data type (%u), ignore.", + mask == GLOBAL_CACHE_MASK ? "account_data" : "character_account_data"); + continue; } + + if ((mask & (1 << type))==0) + { + sLog.outError("Table `%s` have non appropriate for table account data type (%u), ignore.", + mask == GLOBAL_CACHE_MASK ? "account_data" : "character_account_data"); + continue; + } + + m_accountData[type].Time = fields[1].GetUInt32(); + m_accountData[type].Data = fields[2].GetCppString(); + } while (result->NextRow()); delete result; } -void WorldSession::SetAccountData(uint32 type, time_t time_, std::string data) +void WorldSession::SetAccountData(AccountDataType type, time_t time_, std::string data) { + if ((1 << type) & GLOBAL_CACHE_MASK) + { + uint32 acc = GetAccountId(); + + CharacterDatabase.BeginTransaction (); + CharacterDatabase.PExecute("DELETE FROM account_data WHERE account='%u' AND type='%u'", acc, type); + CharacterDatabase.escape_string(data); + CharacterDatabase.PExecute("INSERT INTO account_data VALUES ('%u','%u','%u','%s')", acc, type, (uint32)time_, data.c_str()); + CharacterDatabase.CommitTransaction (); + } + else + { + // _player can be NULL and packet received after logout but m_GUID still store correct guid + if(!m_GUIDLow) + return; + + CharacterDatabase.BeginTransaction (); + CharacterDatabase.PExecute("DELETE FROM character_account_data WHERE guid='%u' AND type='%u'", m_GUIDLow, type); + CharacterDatabase.escape_string(data); + CharacterDatabase.PExecute("INSERT INTO character_account_data VALUES ('%u','%u','%u','%s')", m_GUIDLow, type, (uint32)time_, data.c_str()); + CharacterDatabase.CommitTransaction (); + } + m_accountData[type].Time = time_; m_accountData[type].Data = data; +} - uint32 acc = GetAccountId(); - - CharacterDatabase.BeginTransaction (); - CharacterDatabase.PExecute("DELETE FROM account_data WHERE account='%u' AND type='%u'", acc, type); - CharacterDatabase.escape_string(data); - CharacterDatabase.PExecute("INSERT INTO account_data VALUES ('%u','%u','%u','%s')", acc, type, (uint32)time_, data.c_str()); - CharacterDatabase.CommitTransaction (); +void WorldSession::SendAccountDataTimes() +{ + WorldPacket data( SMSG_ACCOUNT_DATA_TIMES, 4+1+8*4 ); // changed in WotLK + data << uint32(time(NULL)); // unix time of something + data << uint8(1); + for(int i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i) + data << uint32(m_accountData[i].Time); // also unix time + SendPacket(&data); } void WorldSession::LoadTutorialsData() @@ -824,3 +878,12 @@ void WorldSession::SendAddonsInfo() SendPacket(&data); } + +void WorldSession::SetPlayer( Player *plr ) +{ + _player = plr; + + // set m_GUID that can be used while player loggined and later until m_playerRecentlyLogout not reset + if(_player) + m_GUIDLow = _player->GetGUIDLow(); +} \ No newline at end of file diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 6b0adfd68..58f97a6ce 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -44,7 +44,22 @@ class QueryResult; class LoginQueryHolder; class CharacterHandler; -#define NUM_ACCOUNT_DATA_TYPES 8 +enum AccountDataType +{ + GLOBAL_CONFIG_CACHE = 0, // 0x01 g + PER_CHARACTER_CONFIG_CACHE = 1, // 0x02 p + GLOBAL_BINDINGS_CACHE = 2, // 0x04 g + PER_CHARACTER_BINDINGS_CACHE = 3, // 0x08 p + GLOBAL_MACROS_CACHE = 4, // 0x10 g + PER_CHARACTER_MACROS_CACHE = 5, // 0x20 p + PER_CHARACTER_LAYOUT_CACHE = 6, // 0x40 p + PER_CHARACTER_CHAT_CACHE = 7, // 0x80 p +}; + +#define NUM_ACCOUNT_DATA_TYPES 8 + +#define GLOBAL_CACHE_MASK 0x15 +#define PER_CHARACTER_CACHE_MASK 0xEA struct AccountData { @@ -125,7 +140,7 @@ class MANGOS_DLL_SPEC WorldSession char const* GetPlayerName() const; void SetSecurity(AccountTypes security) { _security = security; } std::string const& GetRemoteAddress() { return m_Address; } - void SetPlayer(Player *plr) { _player = plr; } + void SetPlayer(Player *plr); uint8 Expansion() const { return m_expansion; } /// Session in auth.queue currently @@ -184,9 +199,11 @@ class MANGOS_DLL_SPEC WorldSession void SendPetNameQuery(uint64 guid, uint32 petnumber); // Account Data - AccountData *GetAccountData(uint32 type) { return &m_accountData[type]; } - void SetAccountData(uint32 type, time_t time_, std::string data); - void LoadAccountData(); + AccountData *GetAccountData(AccountDataType type) { return &m_accountData[type]; } + void SetAccountData(AccountDataType type, time_t time_, std::string data); + void SendAccountDataTimes(); + void LoadGlobalAccountData(); + void LoadAccountData(QueryResult* result, uint32 mask); void LoadTutorialsData(); void SendTutorialsData(); void SaveTutorialsData(); @@ -719,6 +736,7 @@ class MANGOS_DLL_SPEC WorldSession void LogUnexpectedOpcode(WorldPacket *packet, const char * reason); void LogUnprocessedTail(WorldPacket *packet); + uint32 m_GUIDLow; // set loggined or recently logout player (while m_playerRecentlyLogout set) Player *_player; WorldSocket *m_Socket; std::string m_Address; diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index 560da60e1..83f927831 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -981,7 +981,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) m_Crypt.Init(&K); - m_Session->LoadAccountData(); + m_Session->LoadGlobalAccountData(); m_Session->LoadTutorialsData(); m_Session->ReadAddonsInfo(recvPacket); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3428b512e..3f145e25c 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8432" + #define REVISION_NR "8433" #endif // __REVISION_NR_H__