summaryrefslogtreecommitdiff
path: root/sourcemod/scripting/css-kztimer.sp
diff options
context:
space:
mode:
Diffstat (limited to 'sourcemod/scripting/css-kztimer.sp')
-rw-r--r--sourcemod/scripting/css-kztimer.sp984
1 files changed, 0 insertions, 984 deletions
diff --git a/sourcemod/scripting/css-kztimer.sp b/sourcemod/scripting/css-kztimer.sp
deleted file mode 100644
index 5070985..0000000
--- a/sourcemod/scripting/css-kztimer.sp
+++ /dev/null
@@ -1,984 +0,0 @@
-#include <morecolors>
-#include <sourcemod>
-#include <smlib>
-#include <sdkhooks>
-#include <clientprefs>
-
-#define MAX_TIMES 8192
-
-public Plugin myinfo = {
- name = "KZTimer",
- author = "networkheaven.net",
- description = "KZTimer",
- version = "420.69",
- url = "networkheaven.net"
-};
-
-enum MapZoneType {
- ZONE_NONE,
- ZONE_BUTTON,
- ZONE_TRIGGER,
-};
-
-enum struct PlayerData {
- bool bIsInRun;
- bool bIsInZone;
-
- float fStartTime;
- float fEndTime;
- float fPausedTime;
-
- int nJumps;
- int nTeleports;
-
- bool bShowingMenu;
- bool bShowViewmodel;
-
- float vStartPoint[3];
- float vStartAngle[3];
-
- float vPausedAngle[3];
- float vLastAngle[3];
-
- float vSavedPoint[3];
- float vSavedAngles[3];
- bool bSavedDuck;
- bool bSavedPoint;
- bool bPausedRun;
-
- int nDuckTicks;
-}
-
-enum struct TimeData {
- float fFinalTime;
- int nJumps;
- int nTeleports;
- char sName[64];
- char sSteamid[32];
- char sMapName[32];
- int nTimestamp;
- int nPosition;
-}
-
-public bool g_isKZ;
-public PlayerData g_playerData[MAXPLAYERS + 1];
-public Handle g_DB = INVALID_HANDLE;
-
-public int g_topTime = 0;
-public TimeData g_times[MAX_TIMES];
-public Cookie g_hideWeaponCookie;
-
-public ConVar g_nhWarmup = null;
-
-public void OnPluginStart() {
- HookEntityOutput( "func_button", "OnPressed", OnButtonUsed );
-
- RegConsoleCmd( "sm_savepoint", Command_SavePoint, "Save your current position." );
- RegConsoleCmd( "sm_loadpoint", Command_LoadPoint, "Load your saved position." );
- RegConsoleCmd( "sm_tpmenu", Command_CheckpointPanel, "Show the checkpoint menu." );
- RegConsoleCmd( "sm_tp", Command_CheckpointPanel, "Show the checkpoint menu." );
- RegConsoleCmd( "sm_pause", Command_PauseRun, "Pause/resume your run." );
- RegConsoleCmd( "sm_restart", Command_Restart, "Restart your run." );
- RegConsoleCmd( "sm_maptop", Command_Maptop, "Show the top 50 times." );
- RegConsoleCmd( "sm_m", Command_Maptop, "Show the top 50 times." );
- RegConsoleCmd( "sm_mrank", Command_MyRank, "Show your rank on the current map." );
- RegConsoleCmd( "sm_viewmodel", Command_HideViewmodel, "Toggle viewmodel." );
- RegConsoleCmd( "sm_vm", Command_HideViewmodel, "Toggle viewmodel." );
- RegConsoleCmd( "sm_hideweapon", Command_HideViewmodel, "Toggle viewmodel." );
- RegConsoleCmd( "sm_noclip", Command_Noclip, "Toggle noclip." );
-
- HookEvent( "player_spawn", Event_PlayerSpawn, EventHookMode_Post );
- HookEvent( "player_jump", Event_PlayerJump, EventHookMode_Post );
-
- g_hideWeaponCookie = RegClientCookie( "kztimer_hideweapon", "kztimer_hideweapon", CookieAccess_Public );
-}
-
-public void OnPluginEnd() {
-}
-
-public void OnAllPluginsLoaded() {
-
-}
-
-public void ClearPlayerData( int i ) {
- g_playerData[i].bIsInRun = false;
- g_playerData[i].bIsInZone = false;
- g_playerData[i].fStartTime = 0.0;
- g_playerData[i].fEndTime = 0.0;
- g_playerData[i].fPausedTime = 0.0;
- g_playerData[i].nJumps = 0;
- g_playerData[i].nTeleports = 0;
- g_playerData[i].bSavedPoint = false;
- g_playerData[i].bPausedRun = false;
- g_playerData[i].bShowingMenu = false;
- g_playerData[i].nDuckTicks = 0;
- g_playerData[i].bShowViewmodel = true;
-}
-
-public void ClearAllPlayers() {
- for( int i = 0; i < MAXPLAYERS; i++ ) {
- ClearPlayerData( i );
- }
-}
-
-public void OnClientPutInServer( int client ) {
- ClearPlayerData( client );
-
- SDKHook( client, SDKHook_OnTakeDamage, OnTakeDamage );
-}
-
-public void CreateDatabaseCallback( Handle owner, DBResultSet hndl, const char[] error, any pack ) {
- if( hndl == INVALID_HANDLE ) {
- LogError( "Failed to create database: %s", error );
- return;
- }
-
- char mapName[256];
- GetCurrentMap( mapName, sizeof(mapName) );
-
- LoadDatabase();
-}
-
-public void CreateDatabase() {
- if( g_DB != INVALID_HANDLE ) {
- CloseHandle( g_DB );
- }
-
- char error[256];
- g_DB = SQL_Connect( "kztimer", true, error, sizeof(error) );
-
- if( g_DB == INVALID_HANDLE ) {
- LogError( "Failed to connect to database: %s", error );
- return;
- }
-
- SQL_TQuery( g_DB, CreateDatabaseCallback, "CREATE TABLE IF NOT EXISTS times ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, steamid VARCHAR(32) NOT NULL , name VARCHAR(64) NOT NULL , map VARCHAR(32) NOT NULL , time FLOAT NOT NULL , jumps INT NOT NULL , teleports INT NOT NULL , date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP )" );
-}
-
-public void LoadDatabaseCallback( Handle owner, DBResultSet hndl, const char[] error, any pack ) {
- if( hndl == INVALID_HANDLE ) {
- LogError( "Failed to load database: %s", error );
- return;
- }
-
- g_topTime = SQL_GetRowCount( hndl );
- LogMessage( "Loaded %d times", g_topTime );
- for( int i = 0; i < g_topTime; i++ ) {
- SQL_FetchRow( hndl );
- TimeData data;
-
- data.fFinalTime = SQL_FetchFloatByName( hndl, "time" );
- data.nJumps = SQL_FetchIntByName( hndl, "jumps" );
- data.nTeleports = SQL_FetchIntByName( hndl, "teleports" );
- data.nTimestamp = SQL_FetchIntByName( hndl, "date" );
- SQL_FetchStringByName( hndl, "name", data.sName, sizeof(data.sName) );
- SQL_FetchStringByName( hndl, "steamid", data.sSteamid, sizeof(data.sSteamid) );
- SQL_FetchStringByName( hndl, "map", data.sMapName, sizeof(data.sMapName) );
-
- data.nPosition = i;
-
- g_times[i] = data;
- }
-}
-
-public void LoadDatabase() {
- char mapName[256];
- GetCurrentMap( mapName, sizeof(mapName) );
-
- char query[1024];
- Format( query, sizeof(query), "SELECT * FROM times WHERE map = '%s' ORDER BY time ASC", mapName );
- SQL_TQuery( g_DB, LoadDatabaseCallback, query );
-}
-
-public UpdateTimeCallback( Handle owner, DBResultSet hndl, const char[] error, TimeData pack ) {
- if( hndl == INVALID_HANDLE ) {
- LogError( "Failed to update time: %s", error );
- return;
- }
-
- SaveTime( pack );
-}
-
-public UpdateTime( TimeData data ) {
- char query[1024];
- Format( query, sizeof(query), "DELETE FROM times WHERE steamid = '%s' AND map = '%s'", data.sSteamid, data.sMapName );
- DBResultSet hndl = SQL_Query( g_DB, query );
-
- if( hndl == INVALID_HANDLE ) {
- char err[255];
- SQL_GetError( g_DB, err, sizeof(err) );
- LogError( "Failed to update time: %s", err );
- return;
- }
-
- SaveTime( data );
-}
-
-public void SaveTimeCallback( Handle owner, DBResultSet hndl, const char[] error, any pack ) {
- if( hndl == INVALID_HANDLE ) {
- LogError( "Failed to save time: %s", error );
- return;
- }
-
- LoadDatabase();
-}
-
-public void SaveTime( TimeData data ) {
- float time = data.fFinalTime;
- int jumps = data.nJumps;
- int teleports = data.nTeleports;
-
- char query[1024];
- Format( query, sizeof(query), "INSERT INTO times ( steamid, name, map, time, jumps, teleports ) VALUES ( '%s', '%s', '%s', '%f', '%d', '%d' )", data.sSteamid, data.sName, data.sMapName, time, jumps, teleports );
- SQL_TQuery( g_DB, SaveTimeCallback, query );
-}
-
-public void ClearRecords() {
- for( int i = 0; i < MAX_TIMES; i++ ) {
- g_times[i].fFinalTime = 0.0;
- g_times[i].nJumps = 0;
- g_times[i].nTeleports = 0;
- g_times[i].nTimestamp = 0;
- g_times[i].nPosition = 0;
- g_times[i].sName[0] = '\0';
- g_times[i].sSteamid[0] = '\0';
- g_times[i].sMapName[0] = '\0';
- }
-}
-
-public Action CommandTimer( Handle timer, any unused ) {
- ServerCommand( "bot_kick; bot_quota 0; nh_warmup 0; sv_airaccelerate 12; mp_falldamage 0; sv_enablebunnyhopping 1; mp_ignore_round_win_conditions 1" );
- if( !g_nhWarmup )
- g_nhWarmup = FindConVar( "nh_warmup" );
- else
- SetConVarInt( g_nhWarmup, 0 );
-
- return Plugin_Handled;
-}
-
-public void OnMapStart() {
- ClearRecords();
- char mapName[32];
- GetCurrentMap(mapName, sizeof(mapName));
-
- if( !strncmp( mapName, "kz_", 3, false )
- || !strncmp( mapName, "xc_", 3, false )
- || !strncmp( mapName, "bhop_", 5, false )
- || !strncmp( mapName, "bkz_", 4, false ) ) {
- g_isKZ = true;
- } else {
- g_isKZ = false;
- }
-
- ClearAllPlayers();
-
- if( g_isKZ ) {
- CreateTimer( 2.0, CommandTimer, 0, TIMER_FLAG_NO_MAPCHANGE );
- CreateDatabase();
- }
-
- PrecacheSound( "quake/standard/wickedsick.wav" );
-}
-
-public void OnMapEnd() {
- g_isKZ = false;
-}
-
-public void StartRun( int client ) {
- MoveType mv = GetEntityMoveType( client );
- if( mv == MOVETYPE_NOCLIP ) {
- EmitSoundToClient( client, "buttons/button10.wav" );
- CPrintToChat( client, "[{green}kz{default}] {red}You cannot use noclip during a run." );
-
- return;
- }
-
- EmitSoundToClient( client, "buttons/button17.wav" );
- CPrintToChat( client, "[{green}kz{default}] {white}run started." );
- g_playerData[client].bIsInRun = true;
- g_playerData[client].fStartTime = GetGameTime();
-
- g_playerData[client].nJumps = 0;
- g_playerData[client].nTeleports = 0;
-
- float origin[3];
- GetClientAbsOrigin( client, origin );
- Array_Copy( origin, g_playerData[client].vStartPoint, 3 );
-
- float angles[3];
- GetClientAbsAngles( client, angles );
- Array_Copy( angles, g_playerData[client].vStartAngle, 3 );
-
- g_playerData[client].bSavedPoint = false;
- g_playerData[client].bPausedRun = false;
-
- if( g_playerData[client].bShowingMenu ) {
- ShowCheckpointMenu( client, true );
- }
-}
-
-public void EndRun( int client ) {
- if( !g_playerData[client].bIsInRun )
- return;
-
- EmitSoundToClient( client, "buttons/button9.wav" );
- g_playerData[client].bIsInRun = false;
- g_playerData[client].fEndTime = GetGameTime();
-
- float time = GetGameTime() - g_playerData[client].fStartTime;
- int hours = RoundToFloor( time ) / 3600;
- int minutes = RoundToFloor( time ) / 60;
- int seconds = RoundToFloor( time ) - hours * 3600 - minutes * 60;
- int milliseconds = RoundToFloor( (time - RoundToFloor( time )) * 1000 );
-
- char name[64];
- GetClientName( client, name, sizeof(name) );
-
- char color[16];
- strcopy( color, sizeof(color), g_playerData[client].nTeleports > 0 ? "{unique}" : "{cyan}" );
-
- char chatStr[256];
- Format( chatStr, sizeof(chatStr), "[{green}kz{default}] {violet}%s {white}finished the map", name );
-
- float prevRunTime = -1.0;
- int runPos = -1;
- char clientSteamId[32];
- GetClientAuthId( client, AuthId_Engine, clientSteamId, sizeof(clientSteamId) );
- for( int i = 0; i < g_topTime; i++ ) {
- if( prevRunTime < 0 && !strcmp( clientSteamId, g_times[i].sSteamid ) ) {
- prevRunTime = g_times[i].fFinalTime;
- }
-
- if( runPos == -1 && time < g_times[i].fFinalTime ) {
- runPos = i;
- }
-
- if( runPos >= 0 && prevRunTime > 0 )
- break;
- }
-
- if( prevRunTime < 0.0 )
- Format( chatStr, sizeof(chatStr), "%s for the first time", chatStr );
- Format( chatStr, sizeof(chatStr), "%s in %s", chatStr, color );
-
- if( hours > 0 ) {
- Format( chatStr, sizeof(chatStr), "%s%d:%02d:%02d.%03d", chatStr, hours, minutes, seconds, milliseconds );
- } else {
- Format( chatStr, sizeof(chatStr), "%s%d:%02d.%03d", chatStr, minutes, seconds, milliseconds );
- }
-
- if( prevRunTime > 0.0 ) {
- float diff = prevRunTime - time;
- float absDiff = FloatAbs( diff );
- int diffHours = RoundToFloor( absDiff / 3600.0 );
- int diffMinutes = RoundToFloor( absDiff / 60.0 ) ;
- int diffSeconds = RoundToFloor( absDiff - ( diffMinutes * 60.0 ) ) ;
- int diffMilliseconds = RoundToFloor( ( absDiff - RoundToFloor( absDiff ) ) * 1000.0 );
-
- if( diffHours > 0 ) {
- Format( chatStr, sizeof(chatStr), "%s {white}[%s%s%d:%02d:%02d.%03d{white}]", chatStr, diff < 0 ? "{red}" : "{green}", diff < 0 ? "+" : "-", diffHours, diffMinutes, diffSeconds, diffMilliseconds );
- } else {
- Format( chatStr, sizeof(chatStr), "%s {white}[%s%s%d:%02d.%03d{white}]", chatStr, diff < 0 ? "{red}" : "{green}", diff < 0 ? "+" : "-", diffMinutes, diffSeconds, diffMilliseconds );
- }
- }
-
- if( runPos >= 0 ) {
- Format( chatStr, sizeof(chatStr), "%s {white}(#%d/%d).", chatStr, runPos + 1, g_topTime );
- } else {
- Format( chatStr, sizeof(chatStr),
- "%s {white}(#%d/%d).",
- chatStr,
- g_topTime + 1,
- prevRunTime > 0.0 ? g_topTime : g_topTime + 1
- );
- }
-
- CPrintToChatAll( chatStr );
-
- if( prevRunTime < 0.0 || time < prevRunTime ) {
- TimeData data;
- data.fFinalTime = time;
- data.nJumps = g_playerData[client].nJumps;
- data.nTeleports = g_playerData[client].nTeleports;
- data.nTimestamp = 0;
- data.nPosition = 0;
- strcopy( data.sName, sizeof(data.sName), name );
- strcopy( data.sSteamid, sizeof(data.sSteamid), clientSteamId );
- GetCurrentMap( data.sMapName, sizeof(data.sMapName) );
-
- UpdateTime( data );
-
- if( runPos == 0 || g_topTime == 0 ) {
- CPrintToChatAll( "[{green}kz{default}] {violet}%s {white}set a new map record!", name );
- EmitSoundToAll( "quake/standard/wickedsick.wav" );
- }
- }
-
- g_playerData[client].fStartTime = 0.0;
- if( g_playerData[client].bShowingMenu )
- ShowCheckpointMenu( client, true );
-}
-
-public void OnButtonUsed( const char[] output, int caller, int activator, float delay ) {
- if( !g_isKZ ) return;
-
- char entityName[64];
- GetEntPropString( caller, Prop_Data, "m_iName", entityName, sizeof(entityName) );
-
- if( activator && !strcmp( entityName, "climb_startbutton" ) ) {
- StartRun( activator );
- }
- else if( activator && !strcmp( entityName, "climb_endbutton" ) ) {
- EndRun( activator );
- }
-}
-
-public bool AreAllPlayersOnOneTeam() {
- int ctCount = 0;
- int tCount = 0;
- for( int i = 1; i < MaxClients; ++i ) {
- if( !IsClientConnected( i ) || !IsClientInGame( i ) )
- continue;
-
- int team = GetClientTeam( i );
- if( team == 2 ) {
- if( ctCount > 0 )
- return false;
- ++tCount;
- } else if( team == 3 ) {
- if( tCount > 0 )
- return false;
- ++ctCount;
- }
- }
-
- return true;
-}
-
-public bool CanUseTPMenu() {
- if( g_isKZ )
- return true;
-
- if( g_nhWarmup == null )
- g_nhWarmup = FindConVar( "nh_warmup" );
-
- if( g_nhWarmup != INVALID_HANDLE && GetConVarInt( g_nhWarmup ) != 0 )
- return true;
-
- if( AreAllPlayersOnOneTeam() )
- return true;
-
- return false;
-}
-
-public void ShowCheckpointMenu( int client, bool kz ) {
- Menu menu = CreateMenu( CheckpointMenuHandler, MenuAction_Start );
- AddMenuItem( menu, "save position", "save checkpoint" );
- char buf[64];
- if( g_playerData[client].bIsInRun )
- Format( buf, sizeof(buf), "load checkpoint (%d)", g_playerData[client].nTeleports );
- else
- Format( buf, sizeof(buf), "load checkpoint" );
-
- AddMenuItem( menu, "load position", buf, g_playerData[client].bSavedPoint ? 0 : ITEMDRAW_DISABLED );
-
- if( kz ) {
- if( !g_playerData[client].bPausedRun )
- AddMenuItem( menu, "pause timer", "pause", g_playerData[client].bIsInRun ? 0 : ITEMDRAW_DISABLED );
- else
- AddMenuItem( menu, "resume timer", "resume", g_playerData[client].bIsInRun ? 0 : ITEMDRAW_DISABLED );
-
- AddMenuItem( menu, "respawn", "restart" );
- }
-
- DisplayMenu( menu, client, MENU_TIME_FOREVER );
- g_playerData[client].bShowingMenu = true;
-}
-
-public int CheckpointMenuHandler( Menu menu, MenuAction ma, int client, int nItem ) {
- if( client <= 0 || client > MAXPLAYERS ) return 0;
-
- if( ma == MenuAction_Select ) {
- switch( nItem ) {
- case 0: { Command_SavePoint( client, 0 ); }
- case 1: { Command_LoadPoint( client, 0 ); }
- case 2: { Command_PauseRun( client, 0 ); }
- case 3: { Command_Restart( client, 0 ); }
- }
-
- ShowCheckpointMenu( client, g_isKZ );
- return 0;
- }
- else if( ma == MenuAction_Cancel && nItem == -3 ) {
- g_playerData[client].bShowingMenu = false;
- return 0;
- }
- else if( ma == MenuAction_End ) {
- delete menu;
- }
-
- return 0;
-}
-
-public Action Command_SavePoint( int client, int nargs ) {
- if( !IsPlayerAlive( client ) ) {
- CPrintToChat( client, "[{green}kz{default}] {red}You must be alive to use this command." );
- return Plugin_Handled;
- }
-
- if( g_nhWarmup == null ) {
- g_nhWarmup = FindConVar( "nh_warmup" );
- }
-
- if( !CanUseTPMenu() ) {
- CPrintToChat( client, "[{green}kz{default}] {red}This command can only be used on KZ maps or during warmup." );
- return Plugin_Handled;
- }
-
- int flags = GetEntProp( client, Prop_Send, "m_fFlags" );
- if( !( flags & FL_ONGROUND) ) {
- CPrintToChat( client, "[{green}kz{default}] {red}Cannot set a checkpoint mid-air." );
- EmitSoundToClient( client, "buttons/button10.wav" );
- return Plugin_Handled;
- }
-
- float origin[3];
- GetClientAbsOrigin( client, origin );
- Array_Copy( origin, g_playerData[client].vSavedPoint, 3 );
- Array_Copy( g_playerData[client].vLastAngle, g_playerData[client].vSavedAngles, 3 );
-
- g_playerData[client].bSavedDuck = !!GetEntProp( client, Prop_Send, "m_bDucked" );
- g_playerData[client].bSavedPoint = true;
-
- return Plugin_Handled;
-}
-
-public Action Command_LoadPoint( int client, int nargs ) {
- if( !IsPlayerAlive( client ) ) {
- CPrintToChat( client, "[{green}kz{default}] {red}You must be alive to use this command." );
- return Plugin_Handled;
- }
-
- if( !g_playerData[client].bSavedPoint ) {
- CPrintToChat( client, "[{green}kz{default}] {red}You must save your position first." );
- return Plugin_Handled;
- }
-
- if( g_playerData[client].bPausedRun ) {
- CPrintToChat( client, "[{green}kz{default}] {red}Cannot load position while the run is paused." );
- EmitSoundToClient( client, "buttons/button10.wav" );
- return Plugin_Handled;
- }
-
- if( !CanUseTPMenu() ) {
- CPrintToChat( client, "[{green}kz{default}] {red}This command can only be used on KZ maps or during warmup." );
- return Plugin_Handled;
- }
-
- float vDiff[3], dist;
- if( !g_isKZ ) {
- for( int i = 1; i < MaxClients; ++i ) {
- if( i == client )
- continue;
- if( !IsClientConnected( i ) || !IsClientInGame( i ) || !IsPlayerAlive( i ) )
- continue;
-
- float origin[3];
- GetClientAbsOrigin( i, origin );
-
- vDiff[0] = origin[0] - g_playerData[client].vSavedPoint[0];
- vDiff[1] = origin[1] - g_playerData[client].vSavedPoint[1];
-
- dist = SquareRoot( vDiff[0] * vDiff[0] + vDiff[1] * vDiff[1] );
- if( FloatAbs( g_playerData[client].vSavedPoint[2] - origin[2] ) < 64.0 && dist < 64.0 ) {
- CPrintToChat( client, "[{green}kz{default}] {red}Cannot load your position because another player is standing there." );
- return Plugin_Handled;
- }
- }
- }
-
- float origin[3];
- Array_Copy( g_playerData[client].vSavedPoint, origin, 3 );
-
- float angles[3];
- Array_Copy( g_playerData[client].vSavedAngles, angles, 3 );
-
- float velocity[3];
- velocity[0] = 0.0;
- velocity[1] = 0.0;
- velocity[2] = -1.0;
-
- TeleportEntity( client, origin, angles, velocity );
- if( g_playerData[client].bSavedDuck ) {
- SetEntProp( client, Prop_Send, "m_bDucked", 1 );
- g_playerData[client].nDuckTicks = 5;
- } else {
- SetEntProp( client, Prop_Send, "m_bDucked", 0 );
- }
-
- if( g_playerData[client].bIsInRun ) {
- g_playerData[client].nTeleports++;
- }
- return Plugin_Handled;
-}
-
-public Action Command_PauseRun( int client, int nargs ) {
- if( !g_isKZ ) return Plugin_Handled;
-
- if( !g_playerData[client].bIsInRun ) {
- CPrintToChat( client, "[{green}kz{default}] {red}You must be in a run to use this command." );
- return Plugin_Handled;
- }
-
- if( !IsPlayerAlive( client ) ) {
- CPrintToChat( client, "[{green}kz{default}] {red}You must be alive to use this command." );
- return Plugin_Handled;
- }
-
- int flags = GetEntProp( client, Prop_Send, "m_fFlags" );
- if( !( flags & FL_ONGROUND) ) {
- CPrintToChat( client, "[{green}kz{default}] {red}Cannot pause mid-air." );
- EmitSoundToClient( client, "buttons/button10.wav" );
-
- return Plugin_Handled;
- }
-
- if( !g_playerData[client].bPausedRun ) {
- float runTime = GetGameTime() - g_playerData[client].fStartTime;
- g_playerData[client].fPausedTime = runTime;
-
- Array_Copy( g_playerData[client].vLastAngle, g_playerData[client].vPausedAngle, 3 );
-
- g_playerData[client].bPausedRun = true;
- CPrintToChat( client, "[{green}kz{default}] {white}run paused." );
- } else {
- g_playerData[client].fStartTime = GetGameTime() - g_playerData[client].fPausedTime;
- g_playerData[client].bPausedRun = false;
-
- SetEntityFlags( client, GetEntityFlags( client ) & ~FL_FROZEN );
-
- CPrintToChat( client, "[{green}kz{default}] {white}run resumed." );
- }
-
- return Plugin_Handled;
-}
-
-public Action Command_CheckpointPanel( int client, int nargs ) {
- if( !IsPlayerAlive( client ) ) {
- CPrintToChat( client, "[{green}kz{default}] {red}You must be alive to use this command." );
- return Plugin_Handled;
- }
-
-
- if( !CanUseTPMenu() ) {
- CPrintToChat( client, "[{green}kz{default}] {red}This command can only be used on KZ maps or during warmup." );
- return Plugin_Handled;
- }
-
- ShowCheckpointMenu( client, g_isKZ );
-
- return Plugin_Handled;
-}
-
-public Action Command_Restart( int client, int args ) {
- float origin[3];
- Array_Copy( g_playerData[client].vStartPoint, origin, 3 );
-
- float angle[3];
- Array_Copy( g_playerData[client].vStartAngle, angle, 3 );
-
- float velocity[3];
- velocity[0] = 0.0;
- velocity[1] = 0.0;
- velocity[2] = -1.0;
-
- TeleportEntity( client, origin, angle, velocity );
- return Plugin_Handled;
-}
-
-public void GetTimeString( int client, char[] buffer, int size ) {
- float time = 0.0;
- if( g_playerData[client].bPausedRun ) {
- time = g_playerData[client].fPausedTime;
- } else {
- time = GetGameTime() - g_playerData[client].fStartTime;
- }
-
- int hours = RoundToFloor( time ) / 3600;
- int minutes = RoundToFloor( time ) / 60;
- int seconds = RoundToFloor( time ) - hours * 3600 - minutes * 60;
- int milliseconds = RoundToFloor( (time - RoundToFloor( time )) * 1000 );
-
- Format( buffer, size, "time: " );
-
- if( hours > 0 ) {
- Format( buffer, size, "%s%d:%02d:%02d.%03d", buffer, hours, minutes, seconds, milliseconds );
- } else {
- Format( buffer, size, "%s%d:%02d.%03d", buffer, minutes, seconds, milliseconds );
- }
-
- Format( buffer, size, "%s\njumps: %d\nteleports: %d", buffer, g_playerData[client].nJumps, g_playerData[client].nTeleports );
- if( g_playerData[client].bPausedRun ) {
- Format( buffer, size, "%s\n[PAUSED]", buffer );
- }
-}
-
-public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3], float angles[3], int& weapon, int& subtype, int& cmdnum, int& tickcount, int& seed, int mouse[2]) {
- Array_Copy( angles, g_playerData[client].vLastAngle, 3 );
- if( !g_isKZ ) return Plugin_Continue;
-
- if( !IsPlayerAlive( client ) ) {
- g_playerData[client].bIsInRun = false;
- return Plugin_Continue;
- }
-
- if( g_playerData[client].nDuckTicks > 0 ) {
- buttons |= IN_DUCK;
- g_playerData[client].nDuckTicks--;
- }
-
- SetEntityRenderMode( client, RENDER_TRANSCOLOR );
- SetEntityRenderColor( client, 255, 255, 255, 100 );
-
- if( GetEntityMoveType( client ) == MOVETYPE_NOCLIP && g_playerData[client].bIsInRun ) {
- g_playerData[client].bIsInRun = false;
- CPrintToChat( client, "[{green}kz{default}] {red}You cannot use noclip during a run." );
- EmitSoundToClient( client, "buttons/button10.wav" );
- return Plugin_Continue;
- }
-
- if( g_playerData[client].bIsInRun ) {
- char timeString[256];
- GetTimeString( client, timeString, sizeof(timeString) );
- PrintHintText( client, timeString );
-
- if( g_playerData[client].bPausedRun ) {
- SetEntityFlags( client, GetEntityFlags( client ) | FL_FROZEN );
- TeleportEntity( client, NULL_VECTOR, g_playerData[client].vPausedAngle, NULL_VECTOR );
- return Plugin_Handled;
- }
- }
-
- return Plugin_Continue;
-}
-
-public Action Event_PlayerJump( Event e, const char[] name, bool dontBroadcast ) {
- int client = GetClientOfUserId( e.GetInt( "userid" ) );
- if( !g_isKZ ) return Plugin_Continue;
- if( !client )
- return Plugin_Continue;
-
- if( !g_playerData[client].bIsInRun ) return Plugin_Continue;
-
- g_playerData[client].nJumps++;
- return Plugin_Continue;
-}
-
-public Action OnTakeDamage( int client, int& attacker, int& inflictor, float& damage, int& damagetype ) {
- if( !g_isKZ ) return Plugin_Continue;
-
- if( damagetype & DMG_FALL || damagetype & DMG_BULLET )
- return Plugin_Handled;
-
- if( attacker > 0 && attacker < MaxClients ) {
- damage = 0.0;
- }
-
- return Plugin_Continue;
-}
-
-public Action Event_PlayerSpawn( Event e, const char[] name, bool dontBroadcast ) {
- int client = GetClientOfUserId( e.GetInt( "userid" ) );
- if( !g_isKZ ) return Plugin_Continue;
-
- if( !client )
- return Plugin_Continue;
-
- float origin[3];
- GetClientAbsOrigin( client, origin );
-
- float angle[3];
- GetClientAbsAngles( client, angle );
-
- Array_Copy( origin, g_playerData[client].vStartPoint, 3 );
- Array_Copy( angle, g_playerData[client].vStartAngle, 3 );
-
- if( g_isKZ ) {
- SetEntProp( client, Prop_Send, "m_CollisionGroup", 2 );
- ShowCheckpointMenu( client, true );
-
- char cookie[32];
- g_hideWeaponCookie.Get( client, cookie, sizeof(cookie) );
-
- bool draw = !StringToInt( cookie );
- g_playerData[client].bShowViewmodel = draw;
- SetEntProp( client, Prop_Send, "m_bDrawViewmodel", draw );
- }
-
- return Plugin_Continue;
-}
-
-public int TopTimesMenuHandler( Menu menu, MenuAction ma, int client, int nItem ) {
- if( ma == MenuAction_Cancel ) {
- if( g_playerData[client].bShowingMenu ) {
- ShowCheckpointMenu( client, g_isKZ );
- }
- }
- else if( ma == MenuAction_End ) {
- delete menu;
- }
-
- return 0;
-}
-
-public void ShowTopNubTimes( int client ) {
- Menu menu = CreateMenu( TopTimesMenuHandler, MenuAction_Start );
- int max = g_topTime > 50 ? 50 : g_topTime;
- for( int i = 0; i < max; i++ ) {
- float time = g_times[i].fFinalTime;
- int hours = RoundToFloor( time ) / 3600;
- int minutes = RoundToFloor( time ) / 60;
- int seconds = RoundToFloor( time ) - hours * 3600 - minutes * 60;
- int milliseconds = RoundToFloor( (time - RoundToFloor( time )) * 1000 );
-
- char buf[256];
- Format( buf, sizeof(buf), "%d. %s - ", i + 1, g_times[i].sName );
- if( hours > 0 )
- Format( buf, sizeof(buf), "%s%d:%02d:%02d.%03d", buf, hours, minutes, seconds, milliseconds );
- else
- Format( buf, sizeof(buf), "%s%d:%02d.%03d", buf, minutes, seconds, milliseconds );
-
- Format( buf, sizeof(buf), "%s (%d TP, %d jumps)", buf, g_times[i].nTeleports, g_times[i].nJumps );
- menu.AddItem( "button", buf, ITEMDRAW_DISABLED );
- }
-
- DisplayMenu( menu, client, MENU_TIME_FOREVER );
-}
-
-public void ShowTopProTimes( int client ) {
- Menu menu = CreateMenu( TopTimesMenuHandler, MenuAction_Start );
- int it = 0;
- int max = g_topTime > 50 ? 50 : g_topTime;
- for( int i = 0; i < max; i++ ) {
- if( g_times[i].nTeleports > 0 )
- continue;
-
- float time = g_times[i].fFinalTime;
- int hours = RoundToFloor( time ) / 3600;
- int minutes = RoundToFloor( time ) / 60;
- int seconds = RoundToFloor( time ) - hours * 3600 - minutes * 60;
- int milliseconds = RoundToFloor( (time - RoundToFloor( time )) * 1000 );
-
- char buf[256];
- Format( buf, sizeof(buf), "%d. %s - ", it + 1, g_times[i].sName );
- if( hours > 0 )
- Format( buf, sizeof(buf), "%s%d:%02d:%02d.%03d", buf, hours, minutes, seconds, milliseconds );
- else
- Format( buf, sizeof(buf), "%s%d:%02d.%03d", buf, minutes, seconds, milliseconds );
- Format( buf, sizeof(buf), "%s (%d TP, %d jumps)", buf, g_times[i].nTeleports, g_times[i].nJumps );
-
- menu.AddItem( "button", buf, ITEMDRAW_DISABLED );
-
- ++it;
- }
-
- DisplayMenu( menu, client, MENU_TIME_FOREVER );
-}
-
-public int MaptopMenuHandler( Menu menu, MenuAction ma, int client, int nItem ) {
- if( ma == MenuAction_Select ) {
- switch( nItem ) {
- case 0: { ShowTopProTimes( client ); }
- case 1: { ShowTopNubTimes( client ); }
- }
- } else if( ma == MenuAction_Cancel ) {
- if( g_playerData[client].bShowingMenu )
- ShowCheckpointMenu( client, g_isKZ );
- }
- else if( ma == MenuAction_End ) {
- delete menu;
- }
-
- return 0;
-}
-
-public Action Command_Maptop( int client, int args ) {
- if( !g_isKZ ) return Plugin_Handled;
-
- Menu menu = CreateMenu( MaptopMenuHandler, MenuAction_Start );
- AddMenuItem( menu, "button", "top 50 PRO" );
- AddMenuItem( menu, "button", "top 50 NUB" );
- DisplayMenu( menu, client, MENU_TIME_FOREVER );
-
- return Plugin_Handled;
-}
-
-public Action Command_MyRank( int client, int args ) {
- if( !g_isKZ ) return Plugin_Handled;
-
- char clientSteamId[32];
- GetClientAuthId( client, AuthId_Engine, clientSteamId, sizeof(clientSteamId) );
-
- char name[64];
- GetClientName( client, name, sizeof(name) );
-
- int rank = -1;
- for( int i = 0; i < g_topTime; i++ ) {
- if( !strcmp( clientSteamId, g_times[i].sSteamid ) ) {
- rank = i + 1;
- break;
- }
- }
-
- if( rank == -1 ) {
- CPrintToChatAll( "[{green}kz{default}] {violet}%s {white}has no time on this map." );
- return Plugin_Handled;
- }
-
- float time = g_times[rank - 1].fFinalTime;
- int hours = RoundToFloor( time ) / 3600;
- int minutes = RoundToFloor( time ) / 60;
- int seconds = RoundToFloor( time ) - hours * 3600 - minutes * 60;
- int milliseconds = RoundToFloor( (time - RoundToFloor( time )) * 1000 );
-
- char buf[256];
- Format( buf, sizeof(buf), "[{green}kz{default}] {violet}%s {white}is ranked {cyan}#%d/%d{white} with a time of ", name, rank, g_topTime );
- if( hours > 0 )
- Format( buf, sizeof(buf), "%s%d:%02d:%02d.%03d", buf, hours, minutes, seconds, milliseconds );
- else
- Format( buf, sizeof(buf), "%s%d:%02d.%03d", buf, minutes, seconds, milliseconds );
-
- CPrintToChatAll( buf );
- return Plugin_Handled;
-}
-
-public Action Command_HideViewmodel( int client, int args ) {
- if( !g_isKZ ) return Plugin_Handled;
-
- bool draw = !!GetEntProp( client, Prop_Send, "m_bDrawViewmodel" );
- SetEntProp( client, Prop_Send, "m_bDrawViewmodel", !draw );
-
- char cookieStr[32];
- IntToString( draw, cookieStr, sizeof(cookieStr) );
- g_hideWeaponCookie.Set( client, cookieStr );
-
- g_playerData[client].bShowViewmodel = !draw;
-
- CPrintToChat( client, "[{green}kz{default}] viewmodel is now %s", !draw ? "shown" : "hidden" );
- return Plugin_Handled;
-}
-
-public Action Command_Noclip( int client, int args ) {
- if( !g_isKZ ) return Plugin_Handled;
-
- MoveType mv = GetEntityMoveType( client );
- if( mv != MOVETYPE_NOCLIP ) {
- SetEntityMoveType( client, MOVETYPE_NOCLIP );
- CPrintToChat( client, "[{green}kz{default}] noclip enabled." );
- } else {
- SetEntityMoveType( client, MOVETYPE_WALK );
- CPrintToChat( client, "[{green}kz{default}] noclip disabled." );
- }
-
- return Plugin_Handled;
-} \ No newline at end of file