From 86b23b33a2da35f7527c4f27d07987255de5af09 Mon Sep 17 00:00:00 2001 From: rtldg <55846624+rtldg@users.noreply.github.com> Date: Sun, 5 Dec 2021 01:52:04 +0000 Subject: [PATCH] fix some kz button restarting things & add track param to Shavit_MarkKZMap() & Shavit_IsKZMap() --- .../scripting/include/shavit/core.inc | 8 ++--- addons/sourcemod/scripting/shavit-core.sp | 31 ++++++++++++------- addons/sourcemod/scripting/shavit-misc.sp | 2 +- addons/sourcemod/scripting/shavit-zones.sp | 25 +++++++++++++-- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/addons/sourcemod/scripting/include/shavit/core.inc b/addons/sourcemod/scripting/include/shavit/core.inc index b33e306f..89a11192 100644 --- a/addons/sourcemod/scripting/include/shavit/core.inc +++ b/addons/sourcemod/scripting/include/shavit/core.inc @@ -1164,20 +1164,20 @@ native void Shavit_LoadSnapshot(int client, any[] snapshot, int size = sizeof(ti native void Shavit_StopChatSound(); /** - * Marks a map as if it has built-in zones/buttons. + * Marks a map track as if it has built-in zones/buttons. * * @noreturn */ -native void Shavit_MarkKZMap(); +native void Shavit_MarkKZMap(int track); /** - * Lets us know if the map was marked as a KZ map. + * Lets us know if the map track was marked as a KZ map. * KZ map: a map with built-in zones/buttons. * Does not necessarily mean that the map was designed for KZ gameplay. * * @return Boolean value. */ -native bool Shavit_IsKZMap(); +native bool Shavit_IsKZMap(int track); /** * Retrieves style access for a player. diff --git a/addons/sourcemod/scripting/shavit-core.sp b/addons/sourcemod/scripting/shavit-core.sp index e15006ea..f5492f1f 100644 --- a/addons/sourcemod/scripting/shavit-core.sp +++ b/addons/sourcemod/scripting/shavit-core.sp @@ -154,7 +154,7 @@ float gF_ZoneAiraccelerate[MAXPLAYERS+1]; float gF_ZoneSpeedLimit[MAXPLAYERS+1]; // kz support -bool gB_KZMap = false; +bool gB_KZMap[TRACKS_SIZE]; public Plugin myinfo = { @@ -560,7 +560,8 @@ public void OnConfigsExecuted() public void OnMapEnd() { - gB_KZMap = false; + bool empty[TRACKS_SIZE]; + gB_KZMap = empty; } public Action Command_StartTimer(int client, int args) @@ -624,7 +625,7 @@ public Action Command_StartTimer(int client, int args) } } - if (gB_Zones && (Shavit_ZoneExists(Zone_Start, track) || gB_KZMap)) + if (gB_Zones && (Shavit_ZoneExists(Zone_Start, track) || gB_KZMap[track])) { if(!Shavit_StopTimer(client, false)) { @@ -635,11 +636,6 @@ public Action Command_StartTimer(int client, int args) Call_PushCell(client); Call_PushCell(track); Call_Finish(); - - if (!gB_Zones) - { - StartTimer(client, track); - } } else { @@ -704,7 +700,7 @@ public Action Command_TeleportEnd(int client, int args) } } - if(gB_Zones && (Shavit_ZoneExists(Zone_End, track) || gB_KZMap)) + if(gB_Zones && (Shavit_ZoneExists(Zone_End, track) || gB_KZMap[track])) { if(Shavit_StopTimer(client, false)) { @@ -1292,7 +1288,7 @@ void ChangeClientStyle(int client, int style, bool manual) CallOnStyleChanged(client, gA_Timers[client].bsStyle, style, manual); - if (gB_Zones && (Shavit_ZoneExists(Zone_Start, gA_Timers[client].iTimerTrack) || gB_KZMap)) + if (gB_Zones && (Shavit_ZoneExists(Zone_Start, gA_Timers[client].iTimerTrack) || gB_KZMap[gA_Timers[client].iTimerTrack])) { Shavit_StopTimer(client, true); Call_StartForward(gH_Forwards_OnRestart); @@ -1461,7 +1457,12 @@ public int Native_GetTimerStatus(Handle handler, int numParams) public int Native_IsKZMap(Handle handler, int numParams) { - return view_as(gB_KZMap); + if (numParams < 1) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Missing track parameter."); + } + + return gB_KZMap[GetNativeCell(1)]; } public int Native_StartTimer(Handle handler, int numParams) @@ -1984,7 +1985,13 @@ public int Native_LogMessage(Handle plugin, int numParams) public int Native_MarkKZMap(Handle handler, int numParams) { - gB_KZMap = true; + if (numParams < 1) + { + return ThrowNativeError(SP_ERROR_NATIVE, "Missing track parameter."); + } + + gB_KZMap[GetNativeCell(1)] = true; + return 0; } public int Native_GetClientTimescale(Handle handler, int numParams) diff --git a/addons/sourcemod/scripting/shavit-misc.sp b/addons/sourcemod/scripting/shavit-misc.sp index 43e5676a..c7e3ca08 100644 --- a/addons/sourcemod/scripting/shavit-misc.sp +++ b/addons/sourcemod/scripting/shavit-misc.sp @@ -2108,7 +2108,7 @@ public Action Respawn(Handle timer, any data) void RestartTimer(int client, int track) { - if((gB_Zones && Shavit_ZoneExists(Zone_Start, track)) || Shavit_IsKZMap()) + if ((gB_Zones && Shavit_ZoneExists(Zone_Start, track)) || Shavit_IsKZMap(track)) { Shavit_RestartTimer(client, track); } diff --git a/addons/sourcemod/scripting/shavit-zones.sp b/addons/sourcemod/scripting/shavit-zones.sp index 952f24a0..8e39435b 100644 --- a/addons/sourcemod/scripting/shavit-zones.sp +++ b/addons/sourcemod/scripting/shavit-zones.sp @@ -969,7 +969,7 @@ public void Frame_HookButton(any data) if(zone != -1) { gI_KZButtons[track][zone] = entity; - Shavit_MarkKZMap(); + Shavit_MarkKZMap(track); SDKHook(entity, SDKHook_UsePost, UsePost); } @@ -1118,7 +1118,7 @@ public void Frame_HookTrigger(any data) if (zone == Zone_Start || zone == Zone_End) { gI_KZButtons[track][zone] = entity; - Shavit_MarkKZMap(); + Shavit_MarkKZMap(track); } int iZoneIndex = gI_MapZones; @@ -1824,6 +1824,18 @@ void ReloadPrebuiltZones() Frame_HookTrigger(EntIndexToEntRef(iEntity)); } } + + iEntity = INVALID_ENT_REFERENCE; + + while ((iEntity = FindEntityByClassname(iEntity, "func_button")) != INVALID_ENT_REFERENCE) + { + GetEntPropString(iEntity, Prop_Data, "m_iName", sTargetname, sizeof(sTargetname)); + + if (StrContains(sTargetname, "climb_") != -1) + { + Frame_HookButton(EntIndexToEntRef(iEntity)); + } + } } public Action Command_TpToZone(int client, int args) @@ -3628,8 +3640,15 @@ public void Shavit_OnRestart(int client, int track) } // kz buttons - else if(Shavit_IsKZMap() && !EmptyVector(gF_ClimbButtonCache[client][track][0]) && !EmptyVector(gF_ClimbButtonCache[client][track][1])) + else if (Shavit_IsKZMap(track)) { + Shavit_StopTimer(client); + + if (EmptyVector(gF_ClimbButtonCache[client][track][0]) || EmptyVector(gF_ClimbButtonCache[client][track][1])) + { + return; + } + TeleportEntity(client, gF_ClimbButtonCache[client][track][0], gF_ClimbButtonCache[client][track][1], view_as({0.0, 0.0, 0.0})); return;