diff options
| author | navewindre <nw@moneybot.cc> | 2023-12-04 18:06:10 +0100 |
|---|---|---|
| committer | navewindre <nw@moneybot.cc> | 2023-12-04 18:06:10 +0100 |
| commit | aef0d1c1268ab7d4bc18996c9c6b4da16a40aadc (patch) | |
| tree | 43e766b51704f4ab8b383583bdc1871eeeb9c698 /sourcemod/scripting/gokz-localranks/db/process_new_time.sp | |
| parent | 38f1140c11724da05a23a10385061200b907cf6e (diff) | |
bbbbbbbbwaaaaaaaaaaa
Diffstat (limited to 'sourcemod/scripting/gokz-localranks/db/process_new_time.sp')
| -rw-r--r-- | sourcemod/scripting/gokz-localranks/db/process_new_time.sp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/sourcemod/scripting/gokz-localranks/db/process_new_time.sp b/sourcemod/scripting/gokz-localranks/db/process_new_time.sp new file mode 100644 index 0000000..f9aaf73 --- /dev/null +++ b/sourcemod/scripting/gokz-localranks/db/process_new_time.sp @@ -0,0 +1,157 @@ +/* + Processes a newly submitted time, determining if the player beat their + personal best and if they beat the map course and mode's record time. +*/ + + + +void DB_ProcessNewTime(int client, int steamID, int mapID, int course, int mode, int style, int runTimeMS, int teleportsUsed) +{ + char query[1024]; + + DataPack data = new DataPack(); + data.WriteCell(GetClientUserId(client)); + data.WriteCell(steamID); + data.WriteCell(mapID); + data.WriteCell(course); + data.WriteCell(mode); + data.WriteCell(style); + data.WriteCell(runTimeMS); + data.WriteCell(teleportsUsed); + + Transaction txn = SQL_CreateTransaction(); + + // Get Top 2 PBs + FormatEx(query, sizeof(query), sql_getpb, steamID, mapID, course, mode, 2); + txn.AddQuery(query); + // Get Rank + FormatEx(query, sizeof(query), sql_getmaprank, mapID, course, mode, steamID, mapID, course, mode); + txn.AddQuery(query); + // Get Number of Players with Times + FormatEx(query, sizeof(query), sql_getlowestmaprank, mapID, course, mode); + txn.AddQuery(query); + + if (teleportsUsed == 0) + { + // Get Top 2 PRO PBs + FormatEx(query, sizeof(query), sql_getpbpro, steamID, mapID, course, mode, 2); + txn.AddQuery(query); + // Get PRO Rank + FormatEx(query, sizeof(query), sql_getmaprankpro, mapID, course, mode, steamID, mapID, course, mode); + txn.AddQuery(query); + // Get Number of Players with PRO Times + FormatEx(query, sizeof(query), sql_getlowestmaprankpro, mapID, course, mode); + txn.AddQuery(query); + } + + SQL_ExecuteTransaction(gH_DB, txn, DB_TxnSuccess_ProcessTimerEnd, DB_TxnFailure_Generic_DataPack, data, DBPrio_Normal); +} + +public void DB_TxnSuccess_ProcessTimerEnd(Handle db, DataPack data, int numQueries, Handle[] results, any[] queryData) +{ + data.Reset(); + int client = GetClientOfUserId(data.ReadCell()); + int steamID = data.ReadCell(); + int mapID = data.ReadCell(); + int course = data.ReadCell(); + int mode = data.ReadCell(); + int style = data.ReadCell(); + int runTimeMS = data.ReadCell(); + int teleportsUsed = data.ReadCell(); + delete data; + + if (!IsValidClient(client)) + { + return; + } + + bool firstTime = SQL_GetRowCount(results[0]) == 1; + int pbDiff = 0; + int rank = -1; + int maxRank = -1; + if (!firstTime) + { + SQL_FetchRow(results[0]); + int pb = SQL_FetchInt(results[0], 0); + if (runTimeMS == pb) // New time is new PB + { + SQL_FetchRow(results[0]); + int oldPB = SQL_FetchInt(results[0], 0); + pbDiff = runTimeMS - oldPB; + } + else // Didn't beat PB + { + pbDiff = runTimeMS - pb; + } + } + // Get NUB Rank + SQL_FetchRow(results[1]); + rank = SQL_FetchInt(results[1], 0); + SQL_FetchRow(results[2]); + maxRank = SQL_FetchInt(results[2], 0); + + // Repeat for PRO Runs + bool firstTimePro = false; + int pbDiffPro = 0; + int rankPro = -1; + int maxRankPro = -1; + if (teleportsUsed == 0) + { + firstTimePro = SQL_GetRowCount(results[3]) == 1; + if (!firstTimePro) + { + SQL_FetchRow(results[3]); + int pb = SQL_FetchInt(results[3], 0); + if (runTimeMS == pb) // New time is new PB + { + SQL_FetchRow(results[3]); + int oldPB = SQL_FetchInt(results[3], 0); + pbDiffPro = runTimeMS - oldPB; + } + else // Didn't beat PB + { + pbDiffPro = runTimeMS - pb; + } + } + // Get PRO Rank + SQL_FetchRow(results[4]); + rankPro = SQL_FetchInt(results[4], 0); + SQL_FetchRow(results[5]); + maxRankPro = SQL_FetchInt(results[5], 0); + } + + // Call OnTimeProcessed forward + Call_OnTimeProcessed( + client, + steamID, + mapID, + course, + mode, + style, + GOKZ_DB_TimeIntToFloat(runTimeMS), + teleportsUsed, + firstTime, + GOKZ_DB_TimeIntToFloat(pbDiff), + rank, + maxRank, + firstTimePro, + GOKZ_DB_TimeIntToFloat(pbDiffPro), + rankPro, + maxRankPro); + + // Call OnNewRecord forward + bool newWR = (firstTime || pbDiff < 0) && rank == 1; + bool newWRPro = (firstTimePro || pbDiffPro < 0) && rankPro == 1; + if (newWR && newWRPro) + { + Call_OnNewRecord(client, steamID, mapID, course, mode, style, RecordType_NubAndPro, GOKZ_DB_TimeIntToFloat(pbDiffPro), teleportsUsed); + } + else if (newWR) + { + Call_OnNewRecord(client, steamID, mapID, course, mode, style, RecordType_Nub, GOKZ_DB_TimeIntToFloat(pbDiff), teleportsUsed); + } + else if (newWRPro) + { + Call_OnNewRecord(client, steamID, mapID, course, mode, style, RecordType_Pro, GOKZ_DB_TimeIntToFloat(pbDiffPro), teleportsUsed); + } +}
\ No newline at end of file |
