diff --git a/README.md b/README.md index 7c1cab79..a1a089e9 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ Rankings **(NEW!)** - [x] Recalculate points for every record on the current map when a ROOT admin changes the point value for it. (retroactive!) - [x] Add natives. `float Shavit_GetPoints(int client)` `int Shavit_GetRank(int client)` `void Shavit_GetMapValues(float &points, float &idealtime)` - [ ] Add native that checks the total amount of players with over 0 points. +- [ ] Remove deleted records from `playerpoints`. Web Interface -- diff --git a/scripting/include/shavit.inc b/scripting/include/shavit.inc index aeae0bc6..9c0808b1 100644 --- a/scripting/include/shavit.inc +++ b/scripting/include/shavit.inc @@ -374,6 +374,15 @@ forward void Shavit_OnFinish_Post(int client, BhopStyle style, float time, int j */ forward void Shavit_OnWorldRecord(int client, BhopStyle style, float time, int jumps); +/** + * Called when an admin deletes a WR. + * + * @param style Style the record was done on. + * @param id Record ID. -1 if mass deletion. + * @noreturn + */ +forward void Shavit_OnWRDeleted(BhopStyle style, int id); + /** * Called when a player's timer paused. * diff --git a/scripting/shavit-wr.sp b/scripting/shavit-wr.sp index 6f64317e..cb36dd96 100644 --- a/scripting/shavit-wr.sp +++ b/scripting/shavit-wr.sp @@ -39,6 +39,7 @@ bool gB_Rankings = false; // forwards Handle gH_OnWorldRecord = null; Handle gH_OnFinish_Post = null; +Handle gH_OnWRDeleted = null; // database handle Database gH_SQL = null; @@ -114,6 +115,7 @@ public void OnPluginStart() // forwards gH_OnWorldRecord = CreateGlobalForward("Shavit_OnWorldRecord", ET_Event, Param_Cell, Param_Cell, Param_Cell, Param_Cell); gH_OnFinish_Post = CreateGlobalForward("Shavit_OnFinish_Post", ET_Event, Param_Cell, Param_Cell, Param_Cell, Param_Cell); + gH_OnWRDeleted = CreateGlobalForward("Shavit_OnWRDeleted", ET_Event, Param_Cell, Param_Cell); // WR command RegConsoleCmd("sm_wr", Command_WorldRecord, "Usage: sm_wr [map]"); @@ -465,6 +467,22 @@ public int MenuHandler_DeleteAll(Menu m, MenuAction action, int param1, int para return 0; } + for(int i = 0; i < MAX_STYLES; i++) + { + if(gI_StyleProperties[i] & STYLE_UNRANKED) + { + continue; + } + + if(gF_WRTime[i] != 0.0) + { + Call_StartForward(gH_OnWRDeleted); + Call_PushCell(i); + Call_PushCell(-1); + Call_Finish(); + } + } + char[] sQuery = new char[256]; FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE map = '%s';", gS_MySQLPrefix, gS_Map); @@ -621,16 +639,33 @@ public int DeleteConfirm_Handler(Menu m, MenuAction action, int param1, int para { char[] info = new char[16]; m.GetItem(param2, info, 16); + int iRecordID = StringToInt(info); - if(StringToInt(info) == -1) + if(iRecordID == -1) { Shavit_PrintToChat(param1, "Aborted deletion."); return 0; } + for(int i = 0; i < MAX_STYLES; i++) + { + if(gI_StyleProperties[i] & STYLE_UNRANKED || gI_WRRecordID[i] != iRecordID) + { + continue; + } + + if(gF_WRTime[i] != 0.0) + { + Call_StartForward(gH_OnWRDeleted); + Call_PushCell(i); + Call_PushCell(iRecordID); + Call_Finish(); + } + } + char[] sQuery = new char[256]; - FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE id = '%s';", gS_MySQLPrefix, info); + FormatEx(sQuery, 256, "DELETE FROM %splayertimes WHERE id = %d;", gS_MySQLPrefix, iRecordID); gH_SQL.Query(DeleteConfirm_Callback, sQuery, GetClientSerial(param1), DBPrio_High); }