plugin for jump king
This commit is contained in:
		
							parent
							
								
									e2e0a0829b
								
							
						
					
					
						commit
						b18d551cf1
					
				
							
								
								
									
										679
									
								
								ze_jump_king/jump_king_plus.sp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										679
									
								
								ze_jump_king/jump_king_plus.sp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,679 @@ | ||||
| #pragma semicolon 1 | ||||
| #pragma newdecls required | ||||
| 
 | ||||
| #include <sdkhooks> | ||||
| #include <clientprefs> | ||||
| #include <multicolors> | ||||
| #include <sdktools> | ||||
| 
 | ||||
| #define DATA_CONFIG_PATH "addons/sourcemod/configs/jump_king_records.cfg" | ||||
| #define SKIN_FOR_TOP "models/microrost/player_solaire1.mdl" | ||||
| #define CROWN "models/microrost/jumpking/star.mdl" | ||||
| 
 | ||||
| #define Entity_GetTargetName(%1,%2,%3) GetEntPropString(%1, Prop_Data, "m_iName", %2, %3) | ||||
| 
 | ||||
| #define RECORD_LIMIT 20 | ||||
| #define MAX_TOP_PLAYERS 4 | ||||
| #define MAX_DISPLAY 4 | ||||
| 
 | ||||
| public Plugin myinfo = | ||||
| { | ||||
| 	name = "[MAP] Jump King Plus", | ||||
| 	author = "Kotya", | ||||
| 	version = "0.1.0" | ||||
| }; | ||||
| 
 | ||||
| char g_szString[256]; | ||||
| 
 | ||||
| float g_fRoundStart; | ||||
| 
 | ||||
| enum struct class_record | ||||
| { | ||||
| 	char szName[128]; | ||||
| 	char szSteam[32]; | ||||
| 
 | ||||
| 	float fTime; | ||||
| } | ||||
| 
 | ||||
| enum struct class_cookie | ||||
| { | ||||
| 	Cookie PassMain; | ||||
| } | ||||
| 
 | ||||
| enum struct class_player | ||||
| { | ||||
| 	int iDisplayID; | ||||
| 	bool bPassMain; | ||||
| 	bool bTop; | ||||
| } | ||||
| 
 | ||||
| class_cookie g_Cookie; | ||||
| class_player g_PlayerData[MAXPLAYERS+1]; | ||||
| 
 | ||||
| ArrayList g_alRecords; | ||||
| ArrayList g_alSteamAcces; | ||||
| 
 | ||||
| class_record g_rLastRun; | ||||
| 
 | ||||
| Handle g_hTimerSkin; | ||||
| 
 | ||||
| float g_fRecord; | ||||
| 
 | ||||
| bool g_bAddRecord; | ||||
| 
 | ||||
| bool g_bDisplay; | ||||
| bool g_bRecord; | ||||
| bool g_bEnding; | ||||
| 
 | ||||
| public void OnPluginStart() | ||||
| { | ||||
| 	g_hTimerSkin = INVALID_HANDLE; | ||||
| 	g_alSteamAcces = new ArrayList(ByteCountToCells(32)); | ||||
| 	g_alRecords = new ArrayList(sizeof(class_record)); | ||||
| 
 | ||||
| 	// Cookie | ||||
| 	g_Cookie.PassMain = RegClientCookie("jump_king_plus_passmain", "Jump King beat map", CookieAccess_Private); | ||||
| 
 | ||||
| 	// Commands | ||||
| 	RegAdminCmd("sm_af_remove", Command_Remove, ADMFLAG_BAN); | ||||
| 
 | ||||
| 	// Hooks | ||||
| 	HookEvent("round_freeze_end", Event_FreezeEnd); | ||||
| 	HookEvent("round_end", Event_RoundEnd); | ||||
| 	HookEvent("round_start", Event_RoundStart); | ||||
| 
 | ||||
| 	for (int iClient = 1; iClient <= MaxClients; iClient++) | ||||
| 	{ | ||||
| 		if (AreClientCookiesCached(iClient)) | ||||
| 		{ | ||||
| 			OnClientCookiesCached(iClient); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			OnClientDisconnect(iClient); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public void OnClientCookiesCached(int iClient) | ||||
| { | ||||
| 	if (IsFakeClient(iClient)) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	GetClientCookie(iClient, g_Cookie.PassMain, g_szString, sizeof(g_szString)); | ||||
| 	g_PlayerData[iClient].bPassMain = false; | ||||
| 	if (g_szString[0] != '\0') | ||||
| 	{ | ||||
| 		g_PlayerData[iClient].bPassMain = view_as<bool>(StringToInt(g_szString)); | ||||
| 	} | ||||
| 
 | ||||
| 	g_PlayerData[iClient].bTop = false; | ||||
| 	if (g_alSteamAcces.Length > 0) | ||||
| 	{ | ||||
| 		GetClientAuthId(iClient, AuthId_Steam2, g_szString, sizeof(g_szString)); | ||||
| 
 | ||||
| 		int ID = g_alSteamAcces.FindString(g_szString); | ||||
| 		if (ID != -1) | ||||
| 		{ | ||||
| 			g_PlayerData[iClient].bTop = true; | ||||
| 
 | ||||
| 			g_alSteamAcces.Erase(ID); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public void OnClientDisconnect(int iClient) | ||||
| { | ||||
| 	g_PlayerData[iClient].iDisplayID = 0; | ||||
| 	g_PlayerData[iClient].bPassMain = false; | ||||
| 	g_PlayerData[iClient].bTop = false; | ||||
| } | ||||
| 
 | ||||
| public void Event_FreezeEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast) | ||||
| { | ||||
| 	if (g_alRecords.Length > 0) | ||||
| 	{ | ||||
| 		class_record Record; | ||||
| 		g_alRecords.GetArray(0, Record, sizeof(Record)); | ||||
| 		g_fRecord = Record.fTime; | ||||
| 
 | ||||
| 		int iM = RoundToFloor(g_fRecord / 60); | ||||
| 		int iS = RoundToFloor(g_fRecord - (iM * 60)); | ||||
| 		char szD[4]; | ||||
| 
 | ||||
| 		FormatEx(g_szString, sizeof(g_szString), "%.3f", (g_fRecord - RoundToFloor(g_fRecord))); | ||||
| 		strcopy(szD, sizeof(szD), g_szString[2]); | ||||
| 
 | ||||
| 		CPrintToChatAll(" {default}[{red}MAP{default}] {green}%s{default} {{purple}%s{default}} map record: {orange}%i:%i:%s", Record.szName, Record.szSteam, iM, iS, szD); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast) | ||||
| { | ||||
| 	if (g_bEnding) | ||||
| 	{ | ||||
| 		for (int iClient = 1; iClient <= MaxClients; iClient++) | ||||
| 		{ | ||||
| 			if (!IsClientInGame(iClient) || | ||||
| 			IsFakeClient(iClient) || | ||||
| 			!IsPlayerAlive(iClient) || | ||||
| 			GetClientTeam(iClient) != 3) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
| 
 | ||||
| 			g_PlayerData[iClient].bPassMain = true; | ||||
| 			SetClientCookie(iClient, g_Cookie.PassMain, "1"); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	Reset(); | ||||
| } | ||||
| 
 | ||||
| public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast) | ||||
| { | ||||
| 	if (g_bAddRecord) | ||||
| 	{ | ||||
| 		TryInsert(g_rLastRun); | ||||
| 		g_bAddRecord = false; | ||||
| 	} | ||||
| 
 | ||||
| 	if (g_alRecords.Length > 0) | ||||
| 	{ | ||||
| 		g_alSteamAcces.Clear(); | ||||
| 
 | ||||
| 		class_record Record; | ||||
| 		for (int i = 0; i < g_alRecords.Length; i++) | ||||
| 		{ | ||||
| 			if (i >= MAX_TOP_PLAYERS) | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 			g_alRecords.GetArray(i, Record, sizeof(Record)); | ||||
| 			g_alSteamAcces.PushString(Record.szSteam); | ||||
| 		} | ||||
| 
 | ||||
| 		for (int iClient = 1, ID; iClient <= MaxClients; iClient++) | ||||
| 		{ | ||||
| 			if (!IsClientInGame(iClient) || | ||||
| 			IsFakeClient(iClient)) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
| 			g_PlayerData[iClient].iDisplayID = 0; | ||||
| 			g_PlayerData[iClient].bTop = false; | ||||
| 
 | ||||
| 			if (g_alSteamAcces.Length > 0) | ||||
| 			{ | ||||
| 				GetClientAuthId(iClient, AuthId_Steam2, g_szString, sizeof(g_szString)); | ||||
| 
 | ||||
| 				ID = g_alSteamAcces.FindString(g_szString); | ||||
| 				if (ID != -1) | ||||
| 				{ | ||||
| 					g_PlayerData[iClient].bTop = true; | ||||
| 
 | ||||
| 					g_alSteamAcces.Erase(ID); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (g_hTimerSkin != INVALID_HANDLE) | ||||
| 		{ | ||||
| 			KillTimer(g_hTimerSkin); | ||||
| 		} | ||||
| 		g_hTimerSkin = CreateTimer(34.0, Timer_SetSkin); | ||||
| 	} | ||||
| 
 | ||||
| 	Reset(); | ||||
| } | ||||
| 
 | ||||
| public Action Timer_SetSkin(Handle hTimer) | ||||
| { | ||||
| 	g_hTimerSkin = INVALID_HANDLE; | ||||
| 
 | ||||
| 	for (int iClient = 1; iClient <= MaxClients; iClient++) | ||||
| 	{ | ||||
| 		if (!IsClientInGame(iClient) || | ||||
| 		IsFakeClient(iClient) || | ||||
| 		!IsPlayerAlive(iClient) || | ||||
| 		GetClientTeam(iClient) != 3) | ||||
| 		{ | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		if (g_PlayerData[iClient].bTop) | ||||
| 		{ | ||||
| 			SetEntityModel(iClient, SKIN_FOR_TOP); | ||||
| 		} | ||||
| 
 | ||||
| 		if (g_PlayerData[iClient].bPassMain) | ||||
| 		{ | ||||
| 			SetCrown(iClient); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return Plugin_Handled; | ||||
| } | ||||
| 
 | ||||
| public void SetCrown(int iClient) | ||||
| { | ||||
| 	float vecPos[3]; | ||||
| 	int iEntity = CreateEntityByName("prop_dynamic"); | ||||
| 	if (iEntity) | ||||
| 	{ | ||||
| 		DispatchKeyValue(iEntity, "model", CROWN); | ||||
| 		// DispatchKeyValue(iEntity, "rendermode", "1"); | ||||
| 		// DispatchKeyValue(iEntity, "renderamt", "192"); | ||||
| 		DispatchKeyValue(iEntity, "disableshadows", "1"); | ||||
| 		DispatchKeyValue(iEntity, "disableflashlight", "1"); | ||||
| 		if (DispatchSpawn(iEntity)) | ||||
| 		{ | ||||
| 
 | ||||
| 			GetClientAbsOrigin(iClient, vecPos); | ||||
| 			vecPos[2] += 73.0; | ||||
| 
 | ||||
| 			TeleportEntity(iEntity, vecPos); | ||||
| 
 | ||||
| 
 | ||||
| 			SetVariantString("!activator"); | ||||
| 			AcceptEntityInput(iEntity, "SetParent", iClient, iEntity, 0); | ||||
| 		} | ||||
| 	} | ||||
| 	int iEntity1 = CreateEntityByName("env_spritetrail"); | ||||
| 	if (iEntity1) | ||||
| 	{ | ||||
| 		DispatchKeyValue(iEntity1, "rendermode", "5"); | ||||
| 		DispatchKeyValue(iEntity1, "spritename", "sprites/physbeam.vmt"); | ||||
| 		DispatchKeyValue(iEntity1, "startwidth", "16"); | ||||
| 		DispatchKeyValue(iEntity1, "rendercolor", "255 223 0"); | ||||
| 		DispatchKeyValue(iEntity1, "lifetime", "40"); | ||||
| 		if (DispatchSpawn(iEntity1)) | ||||
| 		{ | ||||
| 			GetClientAbsOrigin(iClient, vecPos); | ||||
| 			vecPos[2] += 24.0; | ||||
| 
 | ||||
| 			TeleportEntity(iEntity1, vecPos); | ||||
| 
 | ||||
| 			SetVariantString("!activator"); | ||||
| 			AcceptEntityInput(iEntity1, "SetParent", iClient, iEntity1, 0); | ||||
| 
 | ||||
| 			SetVariantString("OnUser1 !self,SetScale,1.0,2.0,1"); | ||||
| 			AcceptEntityInput(iEntity1, "AddOutPut"); | ||||
| 			AcceptEntityInput(iEntity1, "FireUser1"); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public void Reset() | ||||
| { | ||||
| 	g_bDisplay = false; | ||||
| 	g_bEnding = false; | ||||
| } | ||||
| 
 | ||||
| public void OnMapEnd() | ||||
| { | ||||
| 	Save_Config(); | ||||
| 
 | ||||
| 	if (g_hTimerSkin != INVALID_HANDLE) | ||||
| 	{ | ||||
| 		KillTimer(g_hTimerSkin); | ||||
| 	} | ||||
| 	g_hTimerSkin = INVALID_HANDLE; | ||||
| } | ||||
| 
 | ||||
| public void OnMapStart() | ||||
| { | ||||
| 	GetCurrentMap(g_szString, sizeof(g_szString)); | ||||
| 	if (StrContains(g_szString, "ze_jump_king") == -1) | ||||
| 	{ | ||||
| 		GetPluginFilename(INVALID_HANDLE, g_szString, sizeof(g_szString)); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	g_alRecords.Clear(); | ||||
| 
 | ||||
| 	KeyValues kv = new KeyValues(""); | ||||
| 
 | ||||
| 	if (FileExists(DATA_CONFIG_PATH) && | ||||
| 	kv.ImportFromFile(DATA_CONFIG_PATH) && | ||||
| 	kv.GotoFirstSubKey()) // Has Config | ||||
| 	{ | ||||
| 		int iCount = 0; | ||||
| 		class_record Record; | ||||
| 
 | ||||
| 		do | ||||
| 		{ | ||||
| 			kv.GetString("name", Record.szName, sizeof(Record.szName)); | ||||
| 			kv.GetString("steam", Record.szSteam, sizeof(Record.szSteam)); | ||||
| 			Record.fTime = kv.GetFloat("time", 5000.000); | ||||
| 
 | ||||
| 			g_alRecords.PushArray(Record, sizeof(Record)); | ||||
| 			iCount++; | ||||
| 		} | ||||
| 		while (kv.GotoNextKey() && | ||||
| 		RECORD_LIMIT > iCount); | ||||
| 	} | ||||
| 
 | ||||
| 	delete kv; | ||||
| 
 | ||||
| 	PrecacheModel(SKIN_FOR_TOP); | ||||
| 	PrecacheModel(CROWN); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| public void TryInsert(class_record newRecord) | ||||
| { | ||||
| 	bool bSave = false; | ||||
| 	int Index = -1; | ||||
| 	class_record Record; | ||||
| 
 | ||||
| 	for (int i = 0; i < g_alRecords.Length; i++) | ||||
| 	{ | ||||
| 		g_alRecords.GetArray(i, Record, sizeof(Record)); | ||||
| 		if (!strcmp(newRecord.szSteam, Record.szSteam)) | ||||
| 		{ | ||||
| 			if (Record.fTime > newRecord.fTime) | ||||
| 			{ | ||||
| 				g_alRecords.Erase(i); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				return; | ||||
| 			} | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for (int i = 0; i < g_alRecords.Length; i++) | ||||
| 	{ | ||||
| 		g_alRecords.GetArray(i, Record, sizeof(Record)); | ||||
| 		if (Record.fTime > newRecord.fTime) | ||||
| 		{ | ||||
| 			Index = i; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (g_alRecords.Length < RECORD_LIMIT) | ||||
| 	{ | ||||
| 		bSave = true; | ||||
| 		g_alRecords.PushArray(newRecord, sizeof(newRecord)); | ||||
| 	} | ||||
| 
 | ||||
| 	if (Index != -1) | ||||
| 	{ | ||||
| 		for (int i = g_alRecords.Length - 2; i >= Index; i--) | ||||
| 		{ | ||||
| 			g_alRecords.GetArray(i, Record, sizeof(Record)); | ||||
| 			g_alRecords.SetArray(i + 1, Record, sizeof(Record)); | ||||
| 		} | ||||
| 		g_alRecords.SetArray(Index, newRecord, sizeof(newRecord)); | ||||
| 	} | ||||
| 
 | ||||
| 	if (bSave) | ||||
| 	{ | ||||
| 		Save_Config(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public void Save_Config() | ||||
| { | ||||
| 	KeyValues kv = new KeyValues("Data"); | ||||
| 	class_record Record; | ||||
| 
 | ||||
| 	for (int i = 0; i < g_alRecords.Length; i++) | ||||
| 	{ | ||||
| 		FormatEx(g_szString, sizeof(g_szString), "%i", i); | ||||
| 		kv.JumpToKey(g_szString, true); | ||||
| 
 | ||||
| 		g_alRecords.GetArray(i, Record, sizeof(Record)); | ||||
| 
 | ||||
| 		kv.SetString("name", Record.szName); | ||||
| 		kv.SetString("steam", Record.szSteam); | ||||
| 
 | ||||
| 		FormatEx(g_szString, sizeof(g_szString), "%.3f", Record.fTime); | ||||
| 		kv.SetString("time", g_szString); | ||||
| 
 | ||||
| 		kv.GoBack(); | ||||
| 	} | ||||
| 
 | ||||
| 	kv.ExportToFile(DATA_CONFIG_PATH); | ||||
| 	delete kv; | ||||
| } | ||||
| 
 | ||||
| public void OnGameFrame() | ||||
| { | ||||
| 	if (!g_bDisplay) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	float fTottal; | ||||
| 
 | ||||
| 	if (g_bEnding) | ||||
| 	{ | ||||
| 		fTottal = g_rLastRun.fTime; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		fTottal = GetGameTime() - g_fRoundStart; | ||||
| 	} | ||||
| 
 | ||||
| 	g_bRecord = (fTottal < g_fRecord); | ||||
| 
 | ||||
| 	int iM = RoundToFloor(fTottal / 60); | ||||
| 	int iS = RoundToFloor(fTottal - (iM * 60)); | ||||
| 
 | ||||
| 	char szD[4]; | ||||
| 	FormatEx(g_szString, sizeof(g_szString), "%.3f", (fTottal - RoundToFloor(fTottal))); | ||||
| 	strcopy(szD, sizeof(szD), g_szString[2]); | ||||
| 
 | ||||
| 
 | ||||
| 	int iColor[3] = {255, 255, 255}; | ||||
| 
 | ||||
| 	if (g_alRecords.Length > 0) | ||||
| 	{ | ||||
| 		if (g_bRecord) | ||||
| 		{ | ||||
| 			FormatEx(g_szString, sizeof(g_szString), "%i:%i:%s -%.3f", iM, iS, szD, (g_fRecord - fTottal)); | ||||
| 			iColor = {255, 215, 0}; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			FormatEx(g_szString, sizeof(g_szString), "%i:%i:%s +%.3f", iM, iS, szD, (fTottal - g_fRecord)); | ||||
| 
 | ||||
| 			if (fTottal - g_fRecord < 20.0) | ||||
| 			{ | ||||
| 				iColor = {0, 255, 0}; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				iColor = {255, 0, 0}; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		FormatEx(g_szString, sizeof(g_szString), "%i:%i:%s", iM, iS, szD); | ||||
| 		iColor = {255, 215, 0}; | ||||
| 	} | ||||
| 
 | ||||
| 	SetHudTextParams(-1.0, 0.15, 1.5, iColor[0], iColor[1], iColor[2], 0, 0, 0.25, 0.0, 0.0); | ||||
| 
 | ||||
| 	for (int iClient = 1; iClient <= MaxClients; iClient++) | ||||
| 	{ | ||||
| 		if (IsClientInGame(iClient)) | ||||
| 		{ | ||||
| 			ShowHudText(iClient, 1, g_szString); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public Action Command_Remove(int iClient, int iArgs) | ||||
| { | ||||
| 	// Hook_EndTimer("123", 0, iClient, 0.00); | ||||
| 
 | ||||
| 	// return Plugin_Handled; | ||||
| 	GetCmdArgString(g_szString, sizeof(g_szString)); | ||||
| 	class_record Record; | ||||
| 
 | ||||
| 	for (int i = 0; i < g_alRecords.Length; i++) | ||||
| 	{ | ||||
| 		g_alRecords.GetArray(i, Record, sizeof(Record)); | ||||
| 		if (!strcmp(Record.szSteam, g_szString)) | ||||
| 		{ | ||||
| 			g_alRecords.Erase(i); | ||||
| 			Save_Config(); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return Plugin_Handled; | ||||
| } | ||||
| 
 | ||||
| public void OnEntityCreated(int iEntity, const char[] szClassName) | ||||
| { | ||||
| 	if (!strcmp(szClassName, "trigger_once") || | ||||
| 	!strcmp(szClassName, "trigger_multiple") || | ||||
| 	!strcmp(szClassName, "logic_relay")) | ||||
| 	{ | ||||
| 		SDKHook(iEntity, SDKHook_SpawnPost, Hook_SpawnPost); | ||||
| 	} | ||||
| } | ||||
| public void Hook_SpawnPost(int iEntity) | ||||
| { | ||||
| 	SDKUnhook(iEntity, SDKHook_SpawnPost, Hook_SpawnPost); | ||||
| 
 | ||||
| 	if (!IsValidEntity(iEntity)) | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	Entity_GetTargetName(iEntity, g_szString, sizeof(g_szString)); | ||||
| 
 | ||||
| 	if (g_szString[0] == '\0') | ||||
| 	{ | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!strcmp(g_szString, "speedrun_timer_start")) | ||||
| 	{ | ||||
| 		HookSingleEntityOutput(iEntity, "OnStartTouch", Hook_StartTimer, true); | ||||
| 	} | ||||
| 	else if (!strcmp(g_szString, "speedrun_stop_timer")) | ||||
| 	{ | ||||
| 		HookSingleEntityOutput(iEntity, "OnTrigger", Hook_EndTimer, true); | ||||
| 	} | ||||
| 	else if (!strcmp(g_szString, "nigger")) | ||||
| 	{ | ||||
| 		HookSingleEntityOutput(iEntity, "OnStartTouch", Hook_ShowTop); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public void Hook_ShowTop(const char[] szOutput, int iCaller, int iClient, float fDelay) | ||||
| { | ||||
| 	SetHudTextParams(-1.0, 0.6, 4.0, 0, 255, 255, 0, 0, 0.25, 0.0, 0.0); | ||||
| 	if (g_alRecords.Length < 1) | ||||
| 	{ | ||||
| 		ShowHudText(iClient, 1, "No records"); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	class_record Record; | ||||
| 	char szString[512]; | ||||
| 
 | ||||
| 	int iM; | ||||
| 	int iS; | ||||
| 	char szD[4]; | ||||
| 
 | ||||
| 	int iStart = g_PlayerData[iClient].iDisplayID * MAX_DISPLAY; | ||||
| 	int iEnd = iStart + MAX_DISPLAY; | ||||
| 	if (iEnd > g_alRecords.Length) | ||||
| 	{ | ||||
| 		iEnd = g_alRecords.Length; | ||||
| 	} | ||||
| 
 | ||||
| 	bool bFind; | ||||
| 
 | ||||
| 	for (int i = iStart; i < iEnd; i++) | ||||
| 	{ | ||||
| 		g_alRecords.GetArray(i, Record, sizeof(Record)); | ||||
| 
 | ||||
| 		GetClientAuthId(iClient, AuthId_Steam2, g_szString, sizeof(g_szString)); | ||||
| 		bFind = (!strcmp(g_szString, Record.szSteam)); | ||||
| 
 | ||||
| 		iM = RoundToFloor(Record.fTime / 60); | ||||
| 		iS = RoundToFloor(Record.fTime - (iM * 60)); | ||||
| 		FormatEx(g_szString, sizeof(g_szString), "%.3f", (Record.fTime - RoundToFloor(Record.fTime))); | ||||
| 		strcopy(szD, sizeof(szD), g_szString[2]); | ||||
| 
 | ||||
| 		if (bFind) | ||||
| 		{ | ||||
| 			Format(szString, sizeof(szString), "%s>>> %i. %s {%s} - %im %is %sms <<<", szString, i+1, Record.szName, Record.szSteam[6], iM, iS, szD); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			Format(szString, sizeof(szString), "%s%i. %s {%s} - %im %is %sms", szString, i+1, Record.szName, Record.szSteam[6], iM, iS, szD); | ||||
| 		} | ||||
| 
 | ||||
| 		if (i + 1 < iEnd) | ||||
| 		{ | ||||
| 			StrCat(szString, sizeof(szString), "\n"); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	ShowHudText(iClient, 1, szString); | ||||
| 
 | ||||
| 	g_PlayerData[iClient].iDisplayID++; | ||||
| 	if (g_PlayerData[iClient].iDisplayID >= RoundToCeil(float(g_alRecords.Length) / MAX_TOP_PLAYERS)) | ||||
| 	{ | ||||
| 		g_PlayerData[iClient].iDisplayID = 0; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| public void Hook_StartTimer(const char[] szOutput, int iCaller, int iActivator, float fDelay) | ||||
| { | ||||
| 	g_fRoundStart = GetGameTime(); | ||||
| 	g_bDisplay = true; | ||||
| } | ||||
| 
 | ||||
| public void Hook_EndTimer(const char[] szOutput, int iCaller, int iClient, float fDelay) | ||||
| { | ||||
| 	g_bEnding = true; | ||||
| 	g_bAddRecord = true; | ||||
| 
 | ||||
| 	char szSteam[32]; | ||||
| 	GetClientAuthId(iClient, AuthId_Steam2, szSteam, sizeof(szSteam)); | ||||
| 
 | ||||
| 	FormatEx(g_rLastRun.szName, sizeof(g_rLastRun.szName), "%N", iClient); | ||||
| 	FormatEx(g_rLastRun.szSteam, sizeof(g_rLastRun.szSteam), szSteam); | ||||
| 	g_rLastRun.fTime = GetGameTime() - g_fRoundStart; | ||||
| 
 | ||||
| 	g_bRecord = (g_rLastRun.fTime < g_fRecord); | ||||
| 
 | ||||
| 	int iM = RoundToFloor(g_rLastRun.fTime / 60); | ||||
| 	int iS = RoundToFloor(g_rLastRun.fTime - (iM * 60)); | ||||
| 	char szD[4]; | ||||
| 	FormatEx(g_szString, sizeof(g_szString), "%.3f", (g_rLastRun.fTime - RoundToFloor(g_rLastRun.fTime))); | ||||
| 	strcopy(szD, sizeof(szD), g_szString[2]); | ||||
| 
 | ||||
| 	if (g_alRecords.Length > 0) | ||||
| 	{ | ||||
| 		if (g_bRecord) | ||||
| 		{ | ||||
| 			FormatEx(g_szString, sizeof(g_szString), " {default}[{red}MAP{default}] {green}%N{default} {{purple}%s{default}} new record map: {orange}%i:%i:%s {green}-%.3f", iClient, szSteam, iM, iS, szD, (g_fRecord - g_rLastRun.fTime)); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			FormatEx(g_szString, sizeof(g_szString), " {default}[{red}MAP{default}] {green}%N{default} {{purple}%s{default}} complete map: %i:%i:%s {red}+%.3f", iClient, szSteam, iM, iS, szD, (g_rLastRun.fTime - g_fRecord)); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		FormatEx(g_szString, sizeof(g_szString), " {default}[{red}MAP{default}] {green}%N{default} {{purple}%s{default}} new record map: {orange}%i:%i:%s", iClient, szSteam, iM, iS, szD); | ||||
| 	} | ||||
| 
 | ||||
| 	CPrintToChatAll(g_szString); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user