bool PlayerLogger::SaveToDB(PlayerLogMask mask, bool removeSaved, bool insideTransaction) { bool written = false; uint64 serverStart = uint64(sWorld.GetStartTime()); for (uint8 i = 0; i < MAX_PLAYER_LOG_ENTITIES; ++i) { if ((mask & CalcLogMask(PlayerLogEntity(i))) == 0 || data[i] == NULL) continue; if (!insideTransaction) CharacterDatabase.BeginTransaction(); written = true; for (uint8 id = 0; id < data[i]->size(); ++id) { switch (PlayerLogEntity(i)) { case PLAYER_LOG_DAMAGE_GET: { PlayerLogDamage info = *(PlayerLogDamage*)(&data[i]->at(id)); static SqlStatementID dmgGetStmt; SqlStatement stmt = CharacterDatabase.CreateStatement(dmgGetStmt, "INSERT INTO playerlog_damage_get SET guid = ?, `time` = ?, aggressor = ?, isPlayer = ?, damage = ?, spell = ?"); stmt.addUInt32(playerGuid); stmt.addUInt64(info.timestamp + serverStart); stmt.addUInt32(info.GetId()); stmt.addBool(info.IsPlayer()); stmt.addInt32(info.damage); stmt.addUInt16(info.spell); stmt.Execute(); } break; case PLAYER_LOG_DAMAGE_DONE: { PlayerLogDamage info = *(PlayerLogDamage*)(&data[i]->at(id)); static SqlStatementID dmgDoneStmt; SqlStatement stmt = CharacterDatabase.CreateStatement(dmgDoneStmt, "INSERT INTO playerlog_damage_done SET guid = ?, `time` = ?, victim = ?, isPlayer = ?, damage = ?, spell = ?"); stmt.addUInt32(playerGuid); stmt.addUInt64(info.timestamp + serverStart); stmt.addUInt32(info.GetId()); stmt.addBool(info.IsPlayer()); stmt.addInt32(info.damage); stmt.addUInt16(info.spell); stmt.Execute(); } break; case PLAYER_LOG_LOOTING: { PlayerLogLooting info = *(PlayerLogLooting*)(&data[i]->at(id)); static SqlStatementID lootStmt; SqlStatement stmt = CharacterDatabase.CreateStatement(lootStmt, "INSERT INTO playerlog_looting SET guid = ?, `time`= ?, item = ?, sourceType = ?, sourceEntry = ?"); stmt.addUInt32(playerGuid); stmt.addUInt64(info.timestamp + serverStart); stmt.addUInt32(info.GetItemEntry()); stmt.addUInt8(uint8(info.GetLootSourceType())); stmt.addUInt32(info.droppedBy); stmt.Execute(); } break; case PLAYER_LOG_TRADE: { PlayerLogTrading info = *(PlayerLogTrading*)(&data[i]->at(id)); static SqlStatementID tradeStmt; SqlStatement stmt = CharacterDatabase.CreateStatement(tradeStmt, "INSERT INTO playerlog_trading SET guid = ?, `time`= ?, itemEntry = ?, itemGuid = ?, aquired = ?, partner = ?"); stmt.addUInt32(playerGuid); stmt.addUInt64(info.timestamp + serverStart); stmt.addUInt32(info.GetItemEntry()); stmt.addUInt32(info.itemGuid); stmt.addBool(info.IsItemAquired()); stmt.addUInt16(info.partner); stmt.Execute(); } break; case PLAYER_LOG_KILL: { PlayerLogKilling info = *(PlayerLogKilling*)(&data[i]->at(id)); static SqlStatementID killStmt; SqlStatement stmt = CharacterDatabase.CreateStatement(killStmt, "INSERT INTO playerlog_killing SET guid = ?, `time`= ?, iskill = ?, entry = ?, victimGuid = ?"); stmt.addUInt32(playerGuid); stmt.addUInt64(info.timestamp + serverStart); stmt.addBool(info.IsKill()); stmt.addUInt32(info.GetUnitEntry()); stmt.addUInt32(info.unitGuid); stmt.Execute(); } break; case PLAYER_LOG_POSITION: { PlayerLogPosition info = *(PlayerLogPosition*)(&data[i]->at(id)); static SqlStatementID posStmt; SqlStatement stmt = CharacterDatabase.CreateStatement(posStmt, "INSERT INTO playerlog_position SET guid = ?, `time`= ?, map = ?, posx = ?, posy = ?, posz = ?"); stmt.addUInt32(playerGuid); stmt.addUInt64(info.timestamp + serverStart); stmt.addUInt16(info.map); stmt.addFloat(info.x); stmt.addFloat(info.y); stmt.addFloat(info.z); stmt.Execute(); } break; case PLAYER_LOG_PROGRESS: { PlayerLogProgress info = *(PlayerLogProgress*)(&data[i]->at(id)); static SqlStatementID progStmt; SqlStatement stmt = CharacterDatabase.CreateStatement(progStmt, "INSERT INTO playerlog_progress SET guid = ?, `time` = ?, type = ?, level = ?, data = ?, map = ?, posx = ?, posy = ?, posz = ?"); stmt.addUInt32(playerGuid); stmt.addUInt64(info.timestamp + serverStart); stmt.addUInt8(info.progressType); stmt.addUInt8(info.level); stmt.addUInt16(info.data); stmt.addUInt16(info.map); stmt.addFloat(info.x); stmt.addFloat(info.y); stmt.addFloat(info.z); stmt.Execute(); } } } Stop(PlayerLogEntity(i)); if (removeSaved) data[i]->clear(); } if (written && !insideTransaction) CharacterDatabase.CommitTransaction(); return written; }