From 35878fc81d66027f3c51b6a6fadc9ea367d1510d Mon Sep 17 00:00:00 2001 From: Herman Simensen Date: Sun, 4 Oct 2020 15:54:48 +0200 Subject: [PATCH] Fix offset bug and add GetStageZone native (#948) * fix bug and add GetStageZone native * Update Native Now preloads stage zone data on map start. --- addons/sourcemod/scripting/include/shavit.inc | 10 ++++++ addons/sourcemod/scripting/shavit-core.sp | 10 ++---- addons/sourcemod/scripting/shavit-zones.sp | 36 ++++++++++++++++++- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/addons/sourcemod/scripting/include/shavit.inc b/addons/sourcemod/scripting/include/shavit.inc index dcf1db33..e4402a4d 100644 --- a/addons/sourcemod/scripting/include/shavit.inc +++ b/addons/sourcemod/scripting/include/shavit.inc @@ -1034,6 +1034,15 @@ native int Shavit_GetBhopStyle(int client); */ native TimerStatus Shavit_GetTimerStatus(int client); +/** + * Retrieve the zone ID for a given stage number. + * Will return exception if stagenumber doesn't have a zone. + * + * @param client Stage number. + * @return Zone ID of stage. + */ +native int Shavit_GetStageZone(int stage); + /** * Retrieve the amount of strafes done since the timer started. * Will return 0 if timer isn't running. @@ -1920,6 +1929,7 @@ public void __pl_shavit_SetNTVOptional() MarkNativeAsOptional("Shavit_GetReplayName"); MarkNativeAsOptional("Shavit_GetReplayStatus"); MarkNativeAsOptional("Shavit_GetReplayTime"); + MarkNativeAsOptional("Shavit_GetStageZone"); MarkNativeAsOptional("Shavit_GetStrafeCount"); MarkNativeAsOptional("Shavit_GetStyleCount"); MarkNativeAsOptional("Shavit_GetStyleSettings"); diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index f44727fe..d504a668 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -111,6 +111,7 @@ float gF_PauseVelocity[MAXPLAYERS+1][3]; // used for offsets float gF_SmallestDist[MAXPLAYERS + 1]; float gF_Origin[MAXPLAYERS + 1][2][3]; +float gF_Fraction[MAXPLAYERS + 1]; // cookies Handle gH_StyleCookie = null; @@ -3013,13 +3014,7 @@ void CalculateTickIntervalOffset(int client, int zonetype) TR_EnumerateEntitiesHull(gF_Origin[client][0], localOrigin, mins, maxs, PARTITION_TRIGGER_EDICTS, TREnumTrigger, client); } - float speed = GetVectorLength(vel); - float offset = 0.0; - if(speed != 0.0) - { - offset = gF_SmallestDist[client] / speed; - } - + float offset = gF_Fraction[client] * GetTickInterval(); gA_Timers[client].fTimeOffset[zonetype] = offset; gA_Timers[client].fDistanceOffset[zonetype] = gF_SmallestDist[client]; @@ -3056,6 +3051,7 @@ bool TREnumTrigger(int entity, int client) { float distance = GetVectorDistance(start, end); gF_SmallestDist[client] = distance; + gF_Fraction[client] = TR_GetFraction(); return false; } diff --git a/addons/sourcemod/scripting/shavit-zones.sp b/addons/sourcemod/scripting/shavit-zones.sp index 6e8217d5..3f3717bc 100644 --- a/addons/sourcemod/scripting/shavit-zones.sp +++ b/addons/sourcemod/scripting/shavit-zones.sp @@ -124,6 +124,7 @@ float gV_MapZones[MAX_ZONES][2][3]; float gV_MapZones_Visual[MAX_ZONES][8][3]; float gV_Destinations[MAX_ZONES][3]; float gV_ZoneCenter[MAX_ZONES][3]; +int gI_StageZoneID[MAX_ZONES]; int gI_EntityZone[4096]; bool gB_ZonesCreated = false; @@ -181,6 +182,7 @@ public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max // zone natives CreateNative("Shavit_GetZoneData", Native_GetZoneData); CreateNative("Shavit_GetZoneFlags", Native_GetZoneFlags); + CreateNative("Shavit_GetStageZone", Native_GetStageZone); CreateNative("Shavit_InsideZone", Native_InsideZone); CreateNative("Shavit_InsideZoneGetID", Native_InsideZoneGetID); CreateNative("Shavit_IsClientCreatingZone", Native_IsClientCreatingZone); @@ -487,6 +489,13 @@ public int Native_InsideZoneGetID(Handle handler, int numParams) return false; } +public int Native_GetStageZone(Handle handler, int numParams) +{ + int iStageNumber = GetNativeCell(1); + + return gI_StageZoneID[iStageNumber]; +} + public int Native_Zones_DeleteMap(Handle handler, int numParams) { char sMap[160]; @@ -662,7 +671,8 @@ public void OnMapStart() ReloadPrebuiltZones(); UnloadZones(0); RefreshZones(); - + LoadStageZones(); + LoadZoneSettings(); if(gEV_Type == Engine_TF2) @@ -688,6 +698,30 @@ public void OnMapStart() } } +public void LoadStageZones() +{ + char sQuery[256]; + FormatEx(sQuery, 256, "SELECT id, data FROM mapzones WHERE type = %i and map = '%s'", Zone_Stage, gS_Map); + PrintToChatAll("%s", sQuery); + gH_SQL.Query(SQL_GetStageZone_Callback, sQuery,0, DBPrio_High); +} + +public void SQL_GetStageZone_Callback(Database db, DBResultSet results, const char[] error, any data) +{ + if(results == null) + { + LogError("Timer (zones GetStageZone) SQL query failed. Reason: %s", error); + return; + } + + while(results.FetchRow()) + { + int iZoneID = results.FetchInt(0); + int iStageNumber = results.FetchInt(1); + gI_StageZoneID[iStageNumber] = iZoneID; + } +} + public void OnMapEnd() { delete gH_DrawEverything;