[SourcePawn] Уроки (Содержание)

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Это не проблема, как таковая.
if (ShowHud_smokeGrenadeCount[client] != INVALID_HANDLE){ // вот этот головняк. Если таймер запущен KillTimer(ShowHud_smokeGrenadeCount[client]); // убиваю его ShowHud_smokeGrenadeCount[client] = INVALID_HANDLE; // очищаю данные }
Зацикленный таймер убивать не требуется вовсе, как и сбрасывать его Handle. Короче, тебе вообще эти строки не нужны, а только сбросить Handle, если игрок не валиден или не соблюдены другие условия для повтора таймера. Оффтоп
 

tonline_kms65

Участник
Сообщения
65
Реакции
13
Я прошу прощения, в начале немного неправильно написал. Таймер не повторяющийся, таймер как раз одноразовый.
Этим таймером я просто зацикливаю функцию. Т.е. функция как бы вызывает сама себя через определенное время.
Повторюсь - таймер одноразовый.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #24
Может, я чего-то не понимаю, но смысл тогда хранить Handle одноразового таймера?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Старый, новый, работает - работает. И так головняка хватает помимо sourcepawnа. Да честно сказать я даже и не знаю где там новый где старый. Мне как то по барабану:biggrin:. Я даже и не знал что там есть где то новый а где-то старый. Для меня все едино. Ну вооооообще.
@tonline_kms65, раз без разницы, то добавь в заголовке файла #pragma newdecls required и компилятор будет ругаться на ту часть кода, которая оформлена согласно старому синтаксису.

И ещё, когда вставляешь код используй теги
HTML:
[PHP]тут код[/PHP]
И твой код будет выглядеть так (ничего не исправлял, только расставил в начале строк отступы):
PHP:
LoopShowHudCountSM_Grenade(client, ent)

{
    int iCount = sm_count[ent];   // это кол-во гранат этого типа (дымовые). Глобал. данные изменяются при создании гранат++ и их уничтожении--.
    if (iCount > 0)
    {
        if (camera[client] == true)        // в HUD  один раз
        {
            SetHudTextParamsEx(0.85, 0.85, 3.0, {0,147,3,255}, {181,255,84,255}, 2, 0.1, 0.1, 0.1);
            ShowHudText(client, -1, "Smoke %i", iCount);
        }
        if (ShowHud_smokeGrenadeCount[client]  != INVALID_HANDLE)        // вот этот головняк. Если таймер запущен
        {
            KillTimer(ShowHud_smokeGrenadeCount[client]);                //  убиваю его
            ShowHud_smokeGrenadeCount[client]  = INVALID_HANDLE;        // очищаю данные
        }
     
        new Handle:Pack3;
        ShowHud_smokeGrenadeCount[client] = CreateDataTimer(3.0, timer_LoopShowHudCountSM_Grenade, Pack3, TIMER_FLAG_NO_MAPCHANGE|TIMER_DATA_HNDL_CLOSE);
        WritePackCell(Pack3, GetClientUserId(client));        // Пакуем обновленные данные в таймер
        WritePackCell(Pack3, ent);
    }
    return;
}
...
public Action:timer_LoopShowHudCountSM_Grenade(Handle:timer, any:Pack3)
{
    ResetPack(Pack3);
    int iClient     = ReadPackCell(Pack3);
    int iEnt        = ReadPackCell(Pack3);
    iClient        = GetClientOfUserId(iClient);
    LoopShowHudCountSM_Grenade(iClient, iEnt);
}
И вот тебе ещё ссыль на то как нужно делать таймеры с датапаками: Timers (Data Packs)
 
Последнее редактирование:

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #26
Как насчет логирования? Урок как сделать логирование правильно.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@Rabb1t, что ты подразумеваешь под словом "правильно"?
То как делают стандартные плагины или ещё как-то?

В принципе, лог - это любые сообщения, которые записываются в текстовый файл.
А что туда писать решаешь сам. Мало ли какую информацию тебе требуется записать.
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #28
@Grey83, ну допустим есть плагин, который показывает твою информацию (ник, стим ид...), И как это все в лог заделать по пути addons/sourcemod/logs/myplugin/myplugin.log ?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
В старом синтаксисе я делал так:
PHP:
decl String:logfile[PLATFORM_MAX_PATH];
BuildPath(Path_SM, logfile, sizeof(logfile), "logs/%s/%s.log", sSomeString1, sSomeString2); // Можно сделать даже отдельные папки и файлы для различных случаев
LogToFileEx(logfile, "%s", sInfo);
Если же в папку логов игры, а не в папку логов SM, то так:
PHP:
LogToFileEx("logs/myplugin/myplugin.log", "%s", sInfo);
LogToFileEx для того, чтобы в логе не писало название файла плагина после даты и времени
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@Rabb1t, в новом просто иначе объявляется строковая переменная
PHP:
char logfile[PLATFORM_MAX_PATH];
BuildPath(Path_SM, logfile, sizeof(logfile), "logs/myplugin/myplugin.log");
LogToFileEx(logfile, "%s", sInfo);
Больше отличий нет
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #32
@Grey83, т.е. мне если что только путь менять?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #33
Стоит упомянуть, что лучше один раз "сбилдить" путь до лога в глобальной переменной, и просто впоследствии указывать глобал переменную в кач-ве пути к логу. Так меньше операций при записи в лог.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #35
@Rabb1t, на примере покажу.
PHP:
#include <sourcemod>

char g_sLogFile[PLATFORM_MAX_PATH];

public void OnPluginStart() {
    BuildPath(Path_SM, g_sLogFile, sizeof(g_sLogFile), "logs/myplugin.log");
    RegServerCmd("sm_logfile", LogFile_Example);
}

public Action LogFile_Example(int args) {
    LogToFileEx(logfile, "Текст для записи в лог.");
    return Plugin_Handled;
}
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #36
Круто, спасибо)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #37
@Rabb1t, либо просто:
PHP:
char g_sLogFile[] = "addons/sourcemod/logs/myplugin.log";
// либо так:
static const char g_sLogFile[] = "addons/sourcemod/logs/myplugin.log";
 

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #38
@R1KO, это вместо всего что сказал @CrazyHackGUT ?
Если не трудно, покажи пожалуйста напримере.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
@Rabb1t, просто 2 варианта записи в заголовке плагина: 1) в виде переменной; 2) в виде константы (лучше, чем использовать #define)
Плюс в варианте Rico отпадает необходимость устанавливать значение переменной в блоке OnPluginStart:
PHP:
static const char g_sLogFile[] = "addons/sourcemod/logs/myplugin.log"; // в плагине больше нельзя изменить значение

public void OnPluginStart() {
//  BuildPath(Path_SM, g_sLogFile, sizeof(g_sLogFile), "logs/myplugin.log"); // больше не требуется, т.к. этот же путь уже прописан в самом начале файла
    RegServerCmd("sm_logfile", LogFile_Example);
}

public Action LogFile_Example(int args) {
    LogToFileEx(logfile, "Текст для записи в лог.");
    return Plugin_Handled;
}
Но если нужно чтобы путь менялся в зависимости от каких/либо условий то лучше использовать переменную, а не константу
PHP:
char g_sLogFile[] = "addons/sourcemod/logs/myplugin.log"; //можно в любой момент менять значение

public void OnPluginStart() {
//  BuildPath(Path_SM, g_sLogFile, sizeof(g_sLogFile), "logs/myplugin.log"); // больше не требуется, т.к. этот же путь уже прописан в самом начале файла
    RegServerCmd("sm_logfile", LogFile_Example);
}

public Action LogFile_Example(int args) {
    LogToFileEx(logfile, "Текст для записи в лог.");
    return Plugin_Handled;
}
 
Последнее редактирование:

Rabb1t

Амбассадор
Сообщения
2,968
Реакции
1,429
  • Команда форума
  • #40
@Grey83, мне просто нужен пример, я как бы понимаю как это сделать, но ведь могу ошибаться, поэтому и хочу посмотреть на примере, если не трудно вам.
 
Сверху Снизу