Смена скайбокса на картах по времени.

I3asara

UwU
Сообщения
782
Реакции
918
Есть ли у кого есть возможность протестировать плагин для смены скайбокса по часам на картах?
О результатах просьба написать сюда, чтобы можно было сразу исправить ошибки и выложить этот плагин в ресурсы.

C++:
"skybox"
{
    "awp_lego_2" // на какой карте использовать
    {
        "numtimes"    "2" // количество временных рамок
        "1"
        {
            "starttime"    "12" // со скольки часов
            "endtime"    "16" // до скольки часов
            "skyboxx"    "skybox_name1" // название 1 скайбокса
        }
        "2"
        {
            "starttime"    "16" // со скольки часов
            "endtime"    "20" // до скольки часов
            "skyboxx"    "skybox_name2" // название 2 скайбокса
        }
    }
}
 

Вложения

  • skyboxes_time.ini
    554 байт · Просмотры: 5
  • skybox_time.sp
    1.7 КБ · Просмотры: 13

Grey83

Ленивая и невнимательная жопа
Сообщения
5,268
Реакции
3,142
@I3asara, 1) за #pragma tabsize 0 прибить мало
2) замени в отступах табуляцию на пробелы или наоборот, не нужно совмещать (нормальные редакторы умеют или отображать пробелы и табуляцию, или даже править код, чтобы он был в одном стиле)
3) убери вызов функции MapCycle() из OnPluginStart() (событие OnMapStart() срабатывает при запуске плагина)
4) чтение файла конфига в OnPluginStart() (и получение имени карты из MapCycle()) лучше перенести в OnMapStart()
Сообщения автоматически склеены:

И вообще можно скопировать ветку, относящуюся к карте, с помощью KvCopySubkeys(Handle origin, Handle dest) (если проверка if(!g_kConfig.JumpToKey(buffer, false)) вернуло true), а потом дёргать значения уже оттуда.
Сообщения автоматически склеены:

Кроме того я не понимаю какой смысл в ключе "numtimes", можно же использовать while(), а не for()
Сообщения автоматически склеены:

И ещё у тебя проблема с временным промежутком около полуночи: если скайбокс должен смениться в это время (скайбокс должна начать использоваться до полуночи, а закончить после), то у тебя никогда не сработает проверка if(time >= iStartTime && time <= iEndTime)
 
Последнее редактирование:

Tomiks

У меня есть новый RPG, кхм...
Сообщения
381
Реакции
249
за #pragma tabsize 0 прибить мало
А что в этом плохого?
И ещё у тебя проблема с временным промежутком около полуночи: если скайбокс должен смениться в это время (скайбокс должна начать использоваться до полуночи, а закончить после), то у тебя никогда не сработает проверка if(time >= iStartTime && time <= iEndTime)
Как здесь правильнее условие составить?
 

Grey83

Ленивая и невнимательная жопа
Сообщения
5,268
Реакции
3,142
А что в этом плохого?
это значит, что с отступами всё плохо и/или на это положен болт, как минимум
Как здесь правильнее условие составить?
нужно сравнивать сначало время начала со временем окончания, а потом уже сравнивать эти значения с текущим временем
 

Сергей68

soon🤷‍♂️🤔
Меценат
Сообщения
212
Реакции
158
А что в этом плохого
Директива препроцессора #pragma tabsize позволяет переназначить для интерпретатора размер отступа, нетабулированный код это ад, сложнее читать самому и создает когнитивный диссонанс у человека который решил прочитать код, а следовательно при возникновении необходимости внести изменения, создает дополнительные проблемы в понимании алгоритма работы.
 

Tomiks

У меня есть новый RPG, кхм...
Сообщения
381
Реакции
249
Про сами отступы я понимаю, просто иногда само как-то получается так, что случайный пробел 1 и т.п., поэтому и ставлю #pragma tabsize 0
 

Сергей68

soon🤷‍♂️🤔
Меценат
Сообщения
212
Реакции
158
@Tomiks, Это от лукавого, абсолютно не нужно, компилятор даст вам информации в каком месте кода была нарушена табуляция, если пользуетесь VSCode, то там он автоматом исправит ее.
 

Tomiks

У меня есть новый RPG, кхм...
Сообщения
381
Реакции
249
@Tomiks, Это от лукавого, абсолютно не нужно, компилятор даст вам информации в каком месте кода была нарушена табуляция, если пользуетесь VSCode, то там он автоматом исправит ее.
У меня VSCode бракованный походу :D
Несамостоятельный. Может он исправит отступы в начале строки, но в плане вот, случайно после создания переменной 1 пробел поставил - варнинг, (может только у меня но)отступы для оформления объявления переменных столбиком друг под другом - варнинг
 

Сергей68

soon🤷‍♂️🤔
Меценат
Сообщения
212
Реакции
158
@Tomiks, Мне сложно понять о чем идет речь, покажите кодом в чем у вас возникает проблема с табуляцией.
 

Grey83

Ленивая и невнимательная жопа
Сообщения
5,268
Реакции
3,142
@Tomiks, слабак: я в блокноте код пишу и как-то с табуляцией справляюсь. 🤷‍♂️
 

Grey83

Ленивая и невнимательная жопа
Сообщения
5,268
Реакции
3,142
@I3asara, вот почищенный и оптимизированный код:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

KeyValues
    kvCfg;

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    delete kvCfg;

    static char path[PLATFORM_MAX_PATH];
    if(!path[0]) BuildPath(Path_SM, path, sizeof(path), "configs/skyboxes_time.ini");

    KeyValues kv = new KeyValues("skybox");
    if(!kv.ImportFromFile(path))    // файл настроек не найден
    {
        LogError("Unable to find configuration file '%s'!", path);
        delete kv;
        return;
    }

    char map[64];
    GetCurrentMap(map, sizeof(map));
    GetMapDisplayName(map, map, sizeof(map));
    if(!kv.JumpToKey(map, false))    // настроки для карты отсутствуют
    {
        delete kv;
        return;
    }

    KvCopySubkeys(kv, kvCfg);    // копируем настройки для карты
    delete kv;

    MapCycle();
}

public Action Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    MapCycle();
}

static void MapCycle()
{
    if(!kvCfg) return;    // настроек для карты нет

    kvCfg.Rewind();

    char buffer[4];
    FormatTime(buffer, sizeof(buffer), "%H", GetTime());// получаем часы
    int time = StringToInt(buffer);                        // записываем в переменную time который час

    int start, end;
    char name[128];
    do
    {
        if((start = kvCfg.GetNum("starttime", -1)) > -1 && start < 25    // время указано и значение корректно
        && (end = kvCfg.GetNum("endtime", -1)) > -1 && end < 25            // время указано и значение корректно
        && (start > end && (start <= time || time <= end)    // начало до полуночи, конец - после
        || start < end && start <= time && time <= end        // начало и конец в границах календарных суток
        || start == end && time == start))                    // длительность скайбокса один час
        {
            kvCfg.GetString("skyboxx", name, sizeof(name));
            ServerCommand("sv_skyname \"%s\"", name);
            break;
        }
        kvCfg.GoBack();
    } while(kvCfg.GotoNextKey());
}
Даже местами откомментировал код =)
 

Вложения

  • skybox_time.sp
    1.9 КБ · Просмотры: 8

Ksenaksis

Участник
Сообщения
64
Реакции
9
L 10/12/2021 - 02:32:09: SourceMod error session started
L 10/12/2021 - 02:32:09: Info (map "zm_cube_v7") (file "/home/server1737/game/csgo/addons/sourcemod/logs/errors_20211012.log")
L 10/12/2021 - 02:32:09: [SM] Exception reported: Invalid key value handle 0 (error 4)
L 10/12/2021 - 02:32:09: [SM] Blaming: skybox_time.smx
L 10/12/2021 - 02:32:09: [SM] Call stack trace:
L 10/12/2021 - 02:32:09: [SM] [0] KvCopySubkeys
L 10/12/2021 - 02:32:09: [SM] [1] Line 36, C:\Users\Kvopa\OneDrive\Рабочий стол\scripting\skybox_time.sp::OnMapStart
 
Сверху