diff options
Diffstat (limited to 'src/game/WorldSession.cpp')
-rw-r--r-- | src/game/WorldSession.cpp | 68 |
1 files changed, 65 insertions, 3 deletions
diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 1721e3ff295..7c6da00b409 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -46,7 +46,8 @@ WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8 LookingForGroup_auto_join(false), LookingForGroup_auto_add(false), m_muteTime(mute_time), _player(NULL), m_Socket(sock),_security(sec), _accountId(id), m_expansion(expansion), m_sessionDbcLocale(sWorld.GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(objmgr.GetIndexForLocale(locale)), -_logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_latency(0) +_logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), +m_latency(0), m_TutorialsChanged(false) { if (sock) { @@ -569,6 +570,65 @@ void WorldSession::SetAccountData(uint32 type, time_t time_, std::string data) CharacterDatabase.CommitTransaction (); } +void WorldSession::LoadTutorialsData() +{ + for ( int aX = 0 ; aX < 8 ; ++aX ) + m_Tutorials[ aX ] = 0; + + QueryResult *result = CharacterDatabase.PQuery("SELECT tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7 FROM character_tutorial WHERE account = '%u'", GetAccountId()); + + if(result) + { + do + { + Field *fields = result->Fetch(); + + for (int iI = 0; iI < 8; ++iI) + m_Tutorials[iI] = fields[iI].GetUInt32(); + } + while( result->NextRow() ); + + delete result; + } + + m_TutorialsChanged = false; +} + +void WorldSession::SendTutorialsData() +{ + WorldPacket data(SMSG_TUTORIAL_FLAGS, 4*8); + for(uint32 i = 0; i < 8; ++i) + data << m_Tutorials[i]; + SendPacket(&data); +} + +void WorldSession::SaveTutorialsData() +{ + if(!m_TutorialsChanged) + return; + + uint32 Rows=0; + // it's better than rebuilding indexes multiple times + QueryResult *result = CharacterDatabase.PQuery("SELECT count(*) AS r FROM character_tutorial WHERE account = '%u'", GetAccountId()); + if(result) + { + Rows = result->Fetch()[0].GetUInt32(); + delete result; + } + + if (Rows) + { + CharacterDatabase.PExecute("UPDATE character_tutorial SET tut0='%u', tut1='%u', tut2='%u', tut3='%u', tut4='%u', tut5='%u', tut6='%u', tut7='%u' WHERE account = '%u'", + m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7], GetAccountId()); + } + else + { + CharacterDatabase.PExecute("INSERT INTO character_tutorial (account,tut0,tut1,tut2,tut3,tut4,tut5,tut6,tut7) VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u', '%u')", GetAccountId(), m_Tutorials[0], m_Tutorials[1], m_Tutorials[2], m_Tutorials[3], m_Tutorials[4], m_Tutorials[5], m_Tutorials[6], m_Tutorials[7]); + } + + m_TutorialsChanged = false; +} + void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi) { CHECK_PACKET_SIZE(data, data.rpos()+4+2+4+4+4+4+4); @@ -582,8 +642,10 @@ void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi) if(mi->flags & MOVEMENTFLAG_ONTRANSPORT) { - CHECK_PACKET_SIZE(data, data.rpos()+8+4+4+4+4+4+1); - data >> mi->t_guid; + if(!data.readPackGUID(mi->t_guid)) + return; + + CHECK_PACKET_SIZE(data, data.rpos()+4+4+4+4+4+1); data >> mi->t_x; data >> mi->t_y; data >> mi->t_z; |