Написание плагинов

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Может кто возьмется... ))

Сделать постоянный HUD (PrintHintText) после смерти (IsPlayerAlive), чтобы отображало:

Есть ли у игрока VAC бан

и

Сколько часов отыграл игрок на сервере.

Считывание базы можно брать с этого плагина:

PHP:
Handle adt_trie;

public void OnPluginStart()
{
    char error[512];
    Database db = SQL_Connect("storage-local", true, error, sizeof(error));

    if(db == INVALID_HANDLE) SetFailState(error);

    char ident[10];
    SQL_ReadDriver(db, ident, sizeof(ident));

    if(!StrEqual(ident, "sqlite")) SetFailState("Support only SQLite");

    char query[512];
    Format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS store_players_time ( steamid VARCHAR(20) NOT NULL , time FLOAT NOT NULL , PRIMARY KEY (steamid), UNIQUE (steamid) ON CONFLICT IGNORE);");

    if(!SQL_FastQuery(db, query))
    {
        SQL_GetError(db, error, sizeof(error));
        CloseHandle(db);

        SetFailState(error);
    }

    CloseHandle(db);

    adt_trie = CreateTrie();

    HookEventEx("player_disconnect", player_disconnect);
    RegConsoleCmd("sm_playtime", sm_playtime, "Display the time played in the server.");
    RegServerCmd("sm_playtime_empty_table", sm_playtime_empty_table, "Clear players times from database");
}

public Action sm_playtime_empty_table(int args)
{
    char error[512];
    Database db = SQL_Connect("storage-local", false, error, sizeof(error));

    if(db == INVALID_HANDLE)
    {
        return;
    }

    SQL_FastQuery(db, "DELETE FROM store_players_time");
    SQL_FastQuery(db, "VACUUM");
    CloseHandle(db);
    ClearTrie(adt_trie);
}

Transaction txn;
bool IsConnecting;

public Action sm_playtime(client, args)
{
    if(client == 0 || !IsClientInGame(client)) return Plugin_Handled;

    char auth[20];

    if(!GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth))) return Plugin_Handled;

    float time;

    if(!GetTrieValue(adt_trie, auth, time))
    {
        char error[512];
        Database db = SQL_Connect("storage-local", false, error, sizeof(error));

        if(db == INVALID_HANDLE)
        {
            ReplyToCommand(client, "Couldn't connect database");
            return Plugin_Handled;
        }

        char query[512];
        Format(query, sizeof(query), "SELECT time FROM store_players_time WHERE steamid = '%s'", auth);

        DBResultSet results = SQL_Query(db, query);

        if(results != INVALID_HANDLE)
        {
            if(SQL_HasResultSet(results) && SQL_FetchRow(results))
            {
                time = SQL_FetchFloat(results, 0);
            }
            CloseHandle(results);
        }
        CloseHandle(db);

        SetTrieValue(adt_trie, auth, time);
    }


    time += GetClientTime(client);

    char buffer[50];
    int itime = RoundToFloor(time);

    Format(buffer, sizeof(buffer), "\x04%i\x01 часа(ов), \x04%i \x01минут(ы)", itime/3600, (itime/60)%60);

    PrintToChatAll("\x01\x07%N\x01 отыграл на сервере - %s", client, buffer);
    return Plugin_Handled;
}

public void player_disconnect(Handle event, const char[] name, bool dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(IsFakeClient(client)) return;

    char auth[20];
    float time;

    if(!GetClientAuthId(client, AuthId_Engine, auth, sizeof(auth))) return;

    time = GetClientTime(client);

    if(!IsConnecting)
    {
        //PrintToServer("connect");
        IsConnecting = true;
        SQL_TConnect(tconnect, "storage-local");
    }


    if(txn == INVALID_HANDLE) txn = SQL_CreateTransaction();

    char query[512];
    Format(query, sizeof(query), "UPDATE store_players_time SET time=time+%0.2f WHERE steamid = '%s';", time, auth);
    SQL_AddQuery(txn, query);
    //PrintToServer(query);
    Format(query, sizeof(query), "INSERT INTO store_players_time (steamid, time) VALUES ('%s', '%0.2f');", auth, time);
    SQL_AddQuery(txn, query);
    //PrintToServer(query);
    RemoveFromTrie(adt_trie, auth);
   
}

public void tconnect(Handle owner, Handle hndl, const char[] error, any data)
{
    if(hndl == INVALID_HANDLE) SetFailState(error);

    SQL_ExecuteTransaction(hndl, txn, OnSuccess, OnError, _, DBPrio_Low);
    txn = INVALID_HANDLE;
    CloseHandle(hndl);
    IsConnecting = false;
}

public void OnSuccess(Database db, any data, int numQueries, Handle[] results, any[] queryData)
{
    //PrintToServer("success");
}


public void OnError(Database db, any data, int numQueries, const char[] error, int failIndex, any[] queryData)
{
    //PrintToServer(error);
}
 

MaEStro71

Участник
Сообщения
163
Реакции
21
Люди добрые! Кому не сложно дописать квар, чтобы при определенном кол-ве игроков включались заражающие плевки.
Poison Thrower v1.8
 

Lookas

Участник
Сообщения
117
Реакции
9
самым варварским методом можешь сделать сам, закомментируй (//) строки, которые начинаются на Print (замена в нотепаде PrintTo на //PrintTo), убирается весь текст в принципе, другое дело, если хочешь убрать только по центру закомментируй PrintTextCenter аналогичным способом
PrintTo есть, а вот PrintTextCenter нету, а если я сделаю все PrintTo на //PrintTo, то сообщение по центру уберётся ? Я искал PrintTextCenter, его нет ...
 

Lookas

Участник
Сообщения
117
Реакции
9
Как в плагине Levels Ranks убрать весь спам Оффтоп через квар не работает, плагин просто наглухо выключается и приходиться переустанавливать.
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
Как в плагине Levels Ranks убрать весь спам Оффтоп через квар не работает, плагин просто наглухо выключается и приходиться переустанавливать.
чисто интуитивно, скачиваешь ядро, идешь в папку переводов, открываешь файл, находишь фразы, которые тебе не нужны, копируешь и ищешь это в плагине и //
например
"fraza"
{
"ru" "перевод фразы"
}
- 'перевод фразы' не нужен, копируешь 'fraza' и ищешь
 

Kruzi

Участник
Сообщения
153
Реакции
20
Ребята, помогите, не знаю как правильно сделать. Нужен код, который меняет квар mp_timelimit на 1, код из Advanced commands не подходит, так как там прибавляет время к timelimit, а мне нужно наоборот сделать его меньшим.
 

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
@Kruzi,
PHP:
public OnPluginStart()
{
    mp_timelimit = FindConVar("mp_timelimit");
    HookConVarChange(mp_timelimit, ConVarChanged);
}

public ConVarChanged(Handle:convar, const String:oldValue[], const String:newValue[])
{
    timelimit == 1
}
Я не уверен,но вдруг как-то поможет или натолкнет на мысль :)
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
@Kruzi,
PHP:
public OnPluginStart()
{
    mp_timelimit = FindConVar("mp_timelimit");
    HookConVarChange(mp_timelimit, ConVarChanged);
}

public ConVarChanged(Handle:convar, const String:oldValue[], const String:newValue[])
{
    timelimit == 1
}
Я не уверен,но вдруг как-то поможет или натолкнет на мысль :)
toje ne to
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
код, который меняет квар mp_timelimit на 1
PHP:
new Handle:Cvar_TimeLimit;

public OnPluginStart()
{
	Cvar_TimeLimit = FindConVar("mp_timelimit");
	RegConsoleCmd("sm_timelim",	SetTimeLimit, "Установить переменной mp_timelimit значение 1.");
}

public Action:SetTimeLimit(client, args)
{
	SetConVarInt(Cvar_TimeLimit, 1);
	return Plugin_Handled;
}
 

Napas

Участник
Сообщения
832
Реакции
667
Добрый вечер, нужен плагин, суть такова. В error логах есть ошибка, возьмем к примеру "Exception reported: Plugin not runnable", нужно сделать так, чтобы записать в конфиг и далее эта ошибка не писалась в error лог. Возможно ли данное чудо реализовать ?
 

Kruzi

Участник
Сообщения
153
Реакции
20
1. Antireconnect рабочий в CS:GO
2. Не даёт людям перезаходить на сервер в течении 120 секунд, после того как они ливнули.
--- Добавлено позже ---
PHP:
new Handle:Cvar_TimeLimit;

public OnPluginStart()
{
    Cvar_TimeLimit = FindConVar("mp_timelimit");
    RegConsoleCmd("sm_timelim",    SetTimeLimit, "Установить переменной mp_timelimit значение 1.");
}

public Action:SetTimeLimit(client, args)
{
    SetConVarInt(Cvar_TimeLimit, 1);
    return Plugin_Handled;
}
При компиляции в
PHP:
public SetTimeLimit()
{
    SetConVarInt(Cvar_TimeLimit, 1);
    return Plugin_Handled;//тут
}
Ошибка tag mistmatch.
В код вставил
PHP:
SetTimeLimit();
И как сделать, чтобы не писало: Server: cvar mp_timelimit set to "1"
 
Последнее редактирование:

Lookas

Участник
Сообщения
117
Реакции
9
чисто интуитивно, скачиваешь ядро, идешь в папку переводов, открываешь файл, находишь фразы, которые тебе не нужны, копируешь и ищешь это в плагине и //
например
"fraza"
{
"ru" "перевод фразы"
}
- 'перевод фразы' не нужен, копируешь 'fraza' и ищешь
А если попробовать в Hooks вместо PrintToChat сделать //PrintToChat ?
Хотя при компилирование много ошибок выскакивает ...
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
966
это же стандартная переменная
А разве стандартной переменной нельзя убрать ее?))
Ну или хукай ProtoBuf сигнал(или как его там называют), "SayText" или "SayText2"... Я не помню
--- Добавлено позже ---
Щас посмотрю вообще в функциях
--- Добавлено позже ---
SetConVarFlags(FindConVar("mp_timelimit"), _) // Убрать все флаги
 
Сверху Снизу