347 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			347 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
#include <sourcemod>
 | 
						|
#include <SteamWorks>
 | 
						|
#include <json>
 | 
						|
#include <ccc>
 | 
						|
#include <cstrike>
 | 
						|
 | 
						|
public Plugin myinfo =
 | 
						|
{
 | 
						|
	name			= "Racetimer Rank",
 | 
						|
	author			= "jenz",
 | 
						|
	description		= "Give racetimer points as a level clan tag to players, also for chat tag",
 | 
						|
	version			= "1.1",
 | 
						|
	url				= ""
 | 
						|
};
 | 
						|
 | 
						|
bool g_b_ignoring_tags[MAXPLAYERS + 1];
 | 
						|
Database g_hDatabase;
 | 
						|
 | 
						|
public void OnPluginStart()
 | 
						|
{
 | 
						|
    RegConsoleCmd("sm_lvl", Command_LvTag, "Turns the Lv. tag feature on or off");
 | 
						|
    if (!g_hDatabase)
 | 
						|
    {
 | 
						|
        Database.Connect(SQL_OnDatabaseConnect, "racetimercss");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    for(int client = 1; client <= MaxClients; client++)
 | 
						|
    {
 | 
						|
        if(IsClientInGame(client))
 | 
						|
        {
 | 
						|
            OnClientPostAdminFilter(client);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public void OnMapStart()
 | 
						|
{
 | 
						|
    if (!g_hDatabase)
 | 
						|
    {
 | 
						|
        Database.Connect(SQL_OnDatabaseConnect, "racetimercss");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public void SQL_OnDatabaseConnect(Database db, const char[] error, any data)
 | 
						|
{
 | 
						|
    if(!db || strlen(error))
 | 
						|
    {
 | 
						|
        LogError("Database error: %s", error);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    g_hDatabase = db;
 | 
						|
 | 
						|
    for(int client = 1; client <= MaxClients; client++)
 | 
						|
    {
 | 
						|
        if(IsClientInGame(client))
 | 
						|
        {
 | 
						|
            OnClientPostAdminFilter(client);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public Action Command_LvTag(int client, int args)
 | 
						|
{
 | 
						|
    if (!g_hDatabase)
 | 
						|
    {
 | 
						|
        return Plugin_Handled;
 | 
						|
    }
 | 
						|
    //i am only adding this shit because lighty wanted it to be turn-off able, after half a year probably only 7 people will have made use of it.
 | 
						|
    //kinda hate wasting time on pointless stuff like this.
 | 
						|
    char sSID[64];
 | 
						|
    char sQuery[512];
 | 
						|
    if (g_b_ignoring_tags[client])
 | 
						|
    {
 | 
						|
        g_b_ignoring_tags[client] = false;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        g_b_ignoring_tags[client] = true;
 | 
						|
    }
 | 
						|
    GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | 
						|
    Format(sQuery, sizeof(sQuery), "insert into zetimer_table_ignore_tag (`steam_auth`, `is_ignoring`) values ('%s', '%i') ON DUPLICATE KEY UPDATE `is_ignoring` = '%i'", sSID, g_b_ignoring_tags[client], g_b_ignoring_tags[client]);
 | 
						|
    g_hDatabase.Query(SQL_FinishedQuery, sQuery, GetClientSerial(client), DBPrio_Low);
 | 
						|
    return Plugin_Handled;
 | 
						|
}
 | 
						|
 | 
						|
public void SQL_FinishedQuery(Database db, DBResultSet results, const char[] error, int iSerial)
 | 
						|
{
 | 
						|
    if (!db || strlen(error))
 | 
						|
    {
 | 
						|
        LogError("Query error 3: %s", error);
 | 
						|
    }
 | 
						|
 | 
						|
    int client;
 | 
						|
    if ((client = GetClientFromSerial(iSerial)) == 0)
 | 
						|
    {
 | 
						|
        delete results;
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    delete results;
 | 
						|
 | 
						|
    if (g_b_ignoring_tags[client])
 | 
						|
    {
 | 
						|
        PrintToChat(client, "Now hiding LVL tag.");
 | 
						|
        CS_SetClientClanTag(client, "");
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        PrintToChat(client, "Now displaying LVL tag again.");
 | 
						|
        OnClientPostAdminFilter(client);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public void OnClientDisconnect(int client)
 | 
						|
{
 | 
						|
    g_b_ignoring_tags[client] = false;
 | 
						|
}
 | 
						|
 | 
						|
public void OnClientPostAdminFilter(int client)
 | 
						|
{
 | 
						|
    if(!IsClientAuthorized(client) || IsClientSourceTV(client))
 | 
						|
        return;
 | 
						|
    
 | 
						|
    if (IsFakeClient(client))
 | 
						|
    {
 | 
						|
        char tag[64];
 | 
						|
        Format(tag, sizeof(tag), "[LVL 1]");
 | 
						|
        CS_SetClientClanTag(client, tag);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    g_b_ignoring_tags[client] = false;
 | 
						|
    check_ignoring_tags(client);
 | 
						|
}
 | 
						|
 | 
						|
public bool HasClanTag(int client)
 | 
						|
{
 | 
						|
    char sClanID[32];
 | 
						|
    GetClientInfo(client, "cl_clanid", sClanID, sizeof(sClanID));
 | 
						|
    return strlen(sClanID) > 1; //without a tag the len is 1.
 | 
						|
}
 | 
						|
 | 
						|
public void check_ignoring_tags(int client)
 | 
						|
{
 | 
						|
    char sQuery[512];
 | 
						|
    char sSID[64];
 | 
						|
 | 
						|
    GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | 
						|
    Format(sQuery, sizeof(sQuery), "select is_ignoring from zetimer_table_ignore_tag where steam_auth = '%s'", sSID);
 | 
						|
    g_hDatabase.Query(SQL_OnQueryCompletedIgnoreTag, sQuery, GetClientSerial(client), DBPrio_Low);
 | 
						|
}
 | 
						|
 | 
						|
public void SQL_OnQueryCompletedIgnoreTag(Database db, DBResultSet results, const char[] error, int iSerial)
 | 
						|
{
 | 
						|
    if (!db || strlen(error))
 | 
						|
    {
 | 
						|
        delete results;
 | 
						|
        LogError("Query error 3: %s", error);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    int client;
 | 
						|
    if ((client = GetClientFromSerial(iSerial)) == 0)
 | 
						|
    {
 | 
						|
        delete results;
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    int val = 0;
 | 
						|
    if (results.RowCount && results.FetchRow())
 | 
						|
    {
 | 
						|
        val = results.FetchInt(0);
 | 
						|
    }
 | 
						|
 | 
						|
    delete results;
 | 
						|
    if (val == 1)
 | 
						|
    {
 | 
						|
        g_b_ignoring_tags[client] = true;
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        check_client_racetimer_rank(client);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public void check_client_racetimer_rank(int client)
 | 
						|
{
 | 
						|
    char sSID[64];
 | 
						|
    char sRequest[256];
 | 
						|
    GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID));
 | 
						|
    FormatEx(sRequest, sizeof(sRequest), "https://racebackend.unloze.com/racetimer_endpoints-1.0/api/timers/player/%s", sSID);
 | 
						|
    
 | 
						|
    Handle hRequest = SteamWorks_CreateHTTPRequest(k_EHTTPMethodGET, sRequest);
 | 
						|
    if (!hRequest ||
 | 
						|
        !SteamWorks_SetHTTPCallbacks(hRequest, OnTransferComplete) ||
 | 
						|
        !SteamWorks_SetHTTPRequestContextValue(hRequest, GetClientSerial(client)) ||
 | 
						|
        !SteamWorks_SendHTTPRequest(hRequest))
 | 
						|
    {
 | 
						|
        delete hRequest;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public int OnTransferComplete(Handle hRequest, bool bFailure, bool bSuccessful, EHTTPStatusCode eStatusCode, int iSerial)
 | 
						|
{
 | 
						|
    int client = GetClientFromSerial(iSerial);
 | 
						|
    if (!client) //Player disconnected.
 | 
						|
    {
 | 
						|
        delete hRequest;
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
 | 
						|
    if (bFailure || !bSuccessful || eStatusCode != k_EHTTPStatusCode200OK)
 | 
						|
    {
 | 
						|
        delete hRequest;
 | 
						|
        LogError("Request-Error: %d", eStatusCode);
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
 | 
						|
    SteamWorks_GetHTTPResponseBodyCallback(hRequest, OnTransferResponse, iSerial);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
public int OnTransferResponse(char[] sData, int iSerial)
 | 
						|
{
 | 
						|
    int client = GetClientFromSerial(iSerial);
 | 
						|
    if (!client) //Player disconnected.
 | 
						|
    {
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
 | 
						|
    JSON_Object obj = json_decode(sData); //https://github.com/clugg/sm-json
 | 
						|
    
 | 
						|
    int I_player_points = obj.GetInt("PlayerPoints") //if no endpoint for steamID default value is -1
 | 
						|
    if (I_player_points < 1000)
 | 
						|
    {
 | 
						|
        I_player_points = 1000; //setting level 1
 | 
						|
    }
 | 
						|
 | 
						|
    if (!HasClanTag(client))
 | 
						|
    {
 | 
						|
        char tag[64];
 | 
						|
        Format(tag, sizeof(tag), "[LVL %i]", I_player_points/1000);
 | 
						|
        CS_SetClientClanTag(client, tag);
 | 
						|
    }
 | 
						|
 | 
						|
    int I_rank = obj.GetInt("Rank") //if no endpoint for steamID default value is -1
 | 
						|
    if (0 < I_rank < 1000) //only give chat tag to top 1000
 | 
						|
    {
 | 
						|
        if (player_has_no_chattag(client))
 | 
						|
        {
 | 
						|
            set_level_tag(client, I_player_points/1000, I_rank);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    json_cleanup_and_delete(obj);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
public bool player_has_no_chattag(int client)
 | 
						|
{
 | 
						|
    char tag[256];
 | 
						|
    CCC_GetTag(client, tag, sizeof(tag));
 | 
						|
    return strlen(tag) < 2;
 | 
						|
}
 | 
						|
 | 
						|
public void set_level_tag(int client, int lvl, int I_rank)
 | 
						|
{
 | 
						|
    char hexadecimals[16];
 | 
						|
    char hexadecimals2[16];
 | 
						|
    char hexadecimals3[16];
 | 
						|
    int red = (lvl * 17) % 256;
 | 
						|
    int green = ((lvl + 50) * 13) % 256;
 | 
						|
    int blue = ((lvl + 100) * 19) % 256;
 | 
						|
    Format(hexadecimals, sizeof(hexadecimals), "%02X%02X%02X", red, green, blue);
 | 
						|
    if (I_rank > 250)
 | 
						|
    {
 | 
						|
        char tag[64];
 | 
						|
        Format(tag, sizeof(tag), "[LVL %i] ", lvl);
 | 
						|
        CCC_SetTag(client, tag);
 | 
						|
        CCC_SetColor(client, CCC_TagColor, StringToInt(hexadecimals, 16), false);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    if (I_rank > 50)
 | 
						|
    {
 | 
						|
        red = (lvl * 27) % 256;
 | 
						|
        green = ((lvl + 50) * 23) % 256;
 | 
						|
        blue = ((lvl + 100) * 29) % 256;
 | 
						|
        Format(hexadecimals2, sizeof(hexadecimals2), "%02X%02X%02X", red, green, blue);
 | 
						|
 | 
						|
        red = (lvl * 37) % 256;
 | 
						|
        green = ((lvl + 50) * 33) % 256;
 | 
						|
        blue = ((lvl + 100) * 39) % 256;
 | 
						|
        Format(hexadecimals3, sizeof(hexadecimals3), "%02X%02X%02X", red, green, blue);
 | 
						|
 | 
						|
        char tag[128];
 | 
						|
        char charlvl[32];
 | 
						|
        IntToString(lvl, charlvl, sizeof(charlvl));
 | 
						|
 | 
						|
        char coloured_numbers[64];
 | 
						|
        for (int i = 0; i < strlen(charlvl); i++)
 | 
						|
        {
 | 
						|
            int i2 = i + 2;
 | 
						|
            i2 = i * i;
 | 
						|
            char number_hexa[32];
 | 
						|
            red = (lvl * (i2 * 37)) % 256;
 | 
						|
            green = ((lvl + (i2 * 50)) * 33) % 256;
 | 
						|
            blue = ((lvl + (i2 * 100)) * 39) % 256;
 | 
						|
            Format(number_hexa, sizeof(number_hexa), "%02X%02X%02X", red, green, blue);
 | 
						|
            Format(coloured_numbers, sizeof(coloured_numbers), "%s\x07%s%c", coloured_numbers, number_hexa, charlvl[i]);
 | 
						|
        }
 | 
						|
        Format(tag, sizeof(tag), "\x07%s[L\x07%sV\x07%sL %s] ", hexadecimals, hexadecimals2, hexadecimals3, coloured_numbers);
 | 
						|
        CCC_SetTag(client, tag);
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    red = (GetRandomInt(0, 255)) % 256;
 | 
						|
    green = (GetRandomInt(0, 255)) % 256;
 | 
						|
    blue = (GetRandomInt(0, 255)) % 256;
 | 
						|
    Format(hexadecimals, sizeof(hexadecimals), "%02X%02X%02X", red, green, blue);
 | 
						|
 | 
						|
    red = (GetRandomInt(0, 255)) % 256;
 | 
						|
    green = (GetRandomInt(0, 255)) % 256;
 | 
						|
    blue = (GetRandomInt(0, 255)) % 256;
 | 
						|
    Format(hexadecimals2, sizeof(hexadecimals2), "%02X%02X%02X", red, green, blue);
 | 
						|
 | 
						|
    red = (GetRandomInt(0, 255)) % 256;
 | 
						|
    green = (GetRandomInt(0, 255)) % 256;
 | 
						|
    blue = (GetRandomInt(0, 255)) % 256;
 | 
						|
    Format(hexadecimals3, sizeof(hexadecimals3), "%02X%02X%02X", red, green, blue);
 | 
						|
 | 
						|
    char tag[128];
 | 
						|
    char charlvl[32];
 | 
						|
    IntToString(lvl, charlvl, sizeof(charlvl));
 | 
						|
 | 
						|
    char coloured_numbers[64];
 | 
						|
    for (int i = 0; i < strlen(charlvl); i++)
 | 
						|
    {
 | 
						|
        char number_hexa[32];
 | 
						|
        red = (GetRandomInt(0, 255)) % 256;
 | 
						|
        green = (GetRandomInt(0, 255)) % 256;
 | 
						|
        blue = (GetRandomInt(0, 255)) % 256;
 | 
						|
        Format(number_hexa, sizeof(number_hexa), "%02X%02X%02X", red, green, blue);
 | 
						|
        Format(coloured_numbers, sizeof(coloured_numbers), "%s\x07%s%c", coloured_numbers, number_hexa, charlvl[i]);
 | 
						|
    }
 | 
						|
    Format(tag, sizeof(tag), "\x07%s[L\x07%sV\x07%sL %s] ", hexadecimals, hexadecimals2, hexadecimals3, coloured_numbers);
 | 
						|
    CCC_SetTag(client, tag);
 | 
						|
}
 |