aboutsummaryrefslogtreecommitdiff
path: root/src/game/WorldSession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/WorldSession.cpp')
-rw-r--r--src/game/WorldSession.cpp68
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;