fix some kz button restarting things & add track param to Shavit_MarkKZMap() & Shavit_IsKZMap()

This commit is contained in:
rtldg 2021-12-05 01:52:04 +00:00
parent f02ac94bbf
commit 86b23b33a2
4 changed files with 46 additions and 20 deletions

View File

@ -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.

View File

@ -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<bool>(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)

View File

@ -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);
}

View File

@ -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<float>({0.0, 0.0, 0.0}));
return;