[Include] foreach от ****** или как оно работает
#1

Я не сторонник чужих скриптов.
Но так сложилось что как только я какой то [Include] пытаюсь применить для своего серва, то случаются какие то непредвиденные ситуации.
Первым печальным моим опытом было использование mxINI. Там из-за того что параметры с одинаковым началом воспринимались как одинаковые. В итоге слетело куча аккаунтов и мы перешли на базу данных. Спасибо автору, иначе я бы не решился с ini переходить на MySQL.
Кстати плагин mysql единственное из сторонних разработок, что стоит у меня на сервере и работает корректно.
Дальше мы пытались перевести всё цыклы на foreach. Особенно было актуально это для стрим тачек, т.е. создание динамического массива стрим тачек для каждого игрока. В общем сервер при каждом рестарте вис так, что пинг показывало в клиенте, но сама игра зависала. При этом ни одна ркон команда в удалённой консоли не пахала. Приходилось просто ФС крашить сервер.
Потом я поставил плагин от инкогнито и отключил все свои скриптовые стримеры. В итоге по началу было вроде нормально. Но потом когда я пикапы и ЗД тексты перевёл тоже на этот стример, то всё начало жутко лагать, подгрузки были очень заметны. Я вывел счётчики на экран в диалоге и увидел ужас. Так каждому игроку грузилось по несколько тысяч объектов. В итоге я подумал, что где то в стримере идёт не корректное удаление объектов из динамических массивов.
Теперь я решил снова разобрать динамические массивы от ******.

Маленький Мануал по созданию динамических массивов,
может кому пригодиться и это чудо у него будет корректно работать
Для этого создаём
pawn Код:
#define MAX_STREAMEDCARS 100 // Максимальное количество тачек, которое может находится рядом возле игрока.
//допустим что на сервере не создастся ситуации при которой кол-во стрим-тачек выйдет за 100
new StreamedVehicle[MAX_PLAYERS][MAX_STREAMEDCARS];//массив хранения ИД тачек по каждому игроку
new StreamVehCount[MAX_PLAYERS];//глобальный счётчик
Потом в public OnGameModeInit() инициализируем массив
pawn Код:
public OnGameModeInit()
{
...
Itter_InitInternal(StreamedVehicle, MAX_PLAYERS, MAX_STREAMEDCARS);
return 1;
}
pawn Код:
stock Itter_InitInternal(arr[][], s0, s1)
{
    for(new i = 0; i != s0; ++i)
    {
        for(new j = 0; j != s1; ++j)
        {
            arr[i][j] = -1;
        }
    }
}
Потом создаём заполнение массива в public OnVehicleStreamIn(vehicleid, forplayerid)
pawn Код:
public OnVehicleStreamIn(vehicleid, forplayerid)
{
...
new start;
Itter_AddInternal(start, StreamVehCount[forplayerid], StreamedVehicle[forplayerid], vehicleid);
return 1;
}
pawn Код:
stock Itter_AddInternal(&start, &count, array[], value)
{  
    if(array[value] != -1)
    {  
        return 0;
    }
    count++;
    if(start == -1)
    {
        start = value;
    }
    else if(start > value)
    {
        array[value] = start;
        start = value;
    }
    else
    {
        new cur = start, last;
        do
        {
            last = cur;
            cur = array[cur];
            if(cur > value)
            {
                array[value] = cur;
                array[last] = value;
printf("1. count: %d, array[value:%d]: %d, array[last:%d]: %d", count, value, array[value], last, array[last]);
                return 1;
            }
        }
        while(cur != -1);
        array[last] = value;
printf("2. count: %d, array[value:%d]: %d, array[last:%d]: %d", count, value, array[value], last, array[last]);
    }
    return 1;
}
Потом удаление в public OnVehicleStreamOut(vehicleid, forplayerid)
pawn Код:
public OnVehicleStreamOut(vehicleid, forplayerid)
{
...
new start;
Itter_RemoveInternal(start, StreamVehCount[forplayerid], StreamedVehicle[forplayerid], vehicleid);
return 1;
}
pawn Код:
stock Itter_RemoveInternal(&start, &count, array[], value)
{
    if(start == -1)
    {
        return 0;
    }
    if(start == value)
    {
        start = array[value];
    }
    else
    {
        new cur = start;
        while(array[cur] != value)
        {
            cur = array[cur];
            if(cur == -1)
            {
                return 0;
            }
        }
        array[cur] = array[value];
printf("3. count: %d, array[cur:%d]: %d, array[value:%d]: %d", count, cur, array[cur], value, array[value]);

    }
    array[value] = -1;
    --count;
printf("4. count: %d, array[cur:%d]: %d, array[value:%d]: %d", count, cur, array[cur], value, array[value]);

    return 1;
}
и на всякий случай очистку массива в public OnPlayerDisconnect(playerid, reason)

pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
...
new start;
Itter_ClearInternal(start, StreamVehCount[playerid], StreamedVehicle[playerid]);
return 1;
}
pawn Код:
stock Itter_ClearInternal(&start, &count, array[])
{
    if (start != -1)
    {
        new cur = start, next = array[cur];
        start = -1; count = 0;
        while (next != -1)
        {
            array[cur] = -1;
            cur = next;
            next = array[cur];
        }
    }
}
В итоге тачки добавлялись в массив, но не совсем корректно удалялись. Через некоторое время из-за переполнения сервер зависал. Это видимо проблема всех скриптов при попытке создания динамических массивов.
Теперь вопрос: "Что я сделал не так?"

P.S. Я то докопаюсь до истины, просто интересно, кто-нибудь использует эти сторонние ресурсы на серверах сампа под Windows? Не ужели у всех сразу всё глатко работает?
Может кто ещё сталкивался с проблемами в чужих серьёзных сторонних разработках (отбросив всякую чушь что пишет разная школота)?
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 2 Guest(s)