void Player::SaveToDB()
{
// delay auto save at any saves (manual, in code, or autosave)
m_nextSave = sWorld.getConfig(CONFIG_INTERVAL_SAVE);
// Must saved before enter into BattleGround
if(InBattleGround())
return;
int is_save_resting = HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) ? 1 : 0;
//save, far from tavern/city
//save, but in tavern/city
sLog.outDebug("The value of player %s at save: ", m_name.c_str());
outDebugValues();
// save state (after auras removing), if aura remove some flags then it must set it back by self)
uint32 tmp_bytes = GetUInt32Value(UNIT_FIELD_BYTES_1);
uint32 tmp_flags = GetUInt32Value(UNIT_FIELD_FLAGS);
uint32 tmp_pflags = GetUInt32Value(PLAYER_FLAGS);
uint32 tmp_displayid = GetUInt32Value(UNIT_FIELD_DISPLAYID);
uint32 PlayerID = GetGUIDLow();
// Set player sit state to standing on save, also stealth and shifted form
RemoveFlag(UNIT_FIELD_BYTES_1,PLAYER_STATE_SIT | PLAYER_STATE_FORM_ALL | PLAYER_STATE_FLAG_CREEP);
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
SetUInt32Value(UNIT_FIELD_DISPLAYID,GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID));
bool inworld = IsInWorld();
CharacterDatabase.BeginTransaction();
CharacterDatabase.PExecute("DELETE FROM characters WHERE guid = '%u'",GetGUIDLow());
std::ostringstream ss;
ss << "INSERT INTO characters (guid,account,name,race,class,"
"map,position_x,position_y,position_z,orientation,data,"
"taximask,online,cinematic,"
"totaltime,leveltime,rest_bonus,logout_time,is_logout_resting,resettalents_cost,resettalents_time,"
"trans_x, trans_y, trans_z, trans_o, transguid, gmstate, stable_slots,at_login,zone,"
"pending_honor, last_honor_date, last_kill_date,taxi_path) VALUES ("
<< GetGUIDLow() << ", "
<< GetSession()->GetAccountId() << ", '"
<< m_name << "', "
<< m_race << ", "
<< m_class << ", "
<< GetMapId() << ", "
<< GetPositionX() << ", "
<< GetPositionY() << ", "
<< GetPositionZ() << ", "
<< GetOrientation() << ", '";
uint16 i;
for( i = 0; i < m_valuesCount; i++ )
{
ss << GetUInt32Value(i) << " ";
}
ss << "', '";
for( i = 0; i < 8; i++ )
ss << m_taximask[i] << " ";
ss << "', ";
ss << (inworld ? 1 : 0);
ss << ", ";
ss << m_cinematic;
ss << ", ";
ss << m_Played_time[0];
ss << ", ";
ss << m_Played_time[1];
ss << ", ";
ss << m_rest_bonus;
ss << ", ";
ss << time(NULL);
ss << ", ";
ss << is_save_resting;
ss << ", ";
ss << m_resetTalentsCost;
ss << ", ";
ss << (uint64)m_resetTalentsTime;
ss << ", ";
ss << m_movementInfo.t_x;
ss << ", ";
ss << m_movementInfo.t_y;
ss << ", ";
ss << m_movementInfo.t_z;
ss << ", ";
ss << m_movementInfo.t_o;
ss << ", ";
if (m_transport)
ss << m_transport->GetGUIDLow();
else
ss << "0";
ss << ", ";
ss << (isGameMaster()? 1 : 0);
ss << ", ";
ss << uint32(m_stableSlots); // to prevent save uint8 as char
ss << ", ";
ss << uint32(m_atLoginFlags);
ss << ", ";
ss << GetZoneId();
ss << ", ";
ss << m_honorPending;
ss << ", ";
ss << m_lastHonorDate;
ss << ", ";
ss << m_lastKillDate;
ss << ", '";
ss << SaveTaxiDestinationsToString();
ss << "' )";
CharacterDatabase.Execute( ss.str().c_str() );
if(m_mailsUpdated) //save mails only when needed
_SaveMail();
_SaveInventory();
_SaveQuestStatus();
_SaveDailyQuestStatus();
_SaveTutorials();
_SaveSpells();
_SaveSpellCooldowns();
_SaveActions();
_SaveAuras();
_SaveReputation();
_SaveBoundInstances();
_SaveHonor();
CharacterDatabase.CommitTransaction();
// restore state (before aura apply, if aura remove flag then aura must set it ack by self)
SetUInt32Value(UNIT_FIELD_DISPLAYID, tmp_displayid);
SetUInt32Value(UNIT_FIELD_BYTES_1, tmp_bytes);
SetUInt32Value(UNIT_FIELD_FLAGS, tmp_flags);
SetUInt32Value(PLAYER_FLAGS, tmp_pflags);
// save pet (hunter pet level and experience and all type pets health/mana).
if(Pet* pet = GetPet())
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
}
// fast save function for item/money cheating preventing - save only inventory and money state
void Player::SaveInventoryAndGoldToDB()
{
_SaveInventory();
SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,GetMoney(),GetGUID());
}