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()); }