PDA

Просмотр полной версии : [Вопрос] Влияет ли порядок подключения модулей на работоспособность? Перебор в foreach



PawnoNoob
20.06.2018, 12:12
первый вопрос кроется в названии темы, а второй:

Столкнулся ещё с одной проблемой, связанной с выбором определённого дома в диалоговом окне.

Вывожу примерно так:
foreach(new h: House)
{
// здесь информация о каждом доме (класс, номер, стоимость);
}
return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_LIST, ....

При выборе определённого пункта через формат вывожу его номер.
В чём заключается проблема: допустим, если я удалил дом с номером 9 из базы, то в диалоговом окне, при выборе 10 пункта, будет выводить 0 номер дома, а при выборе 11 - 10. И так далее. Нарушается порядок :pardon:
new string[3];
format(string, sizeof(string), "%i", HouseInfo[listitem][hNumber);
return SendClientMessage(playerid, -1, string);

DeimoS
20.06.2018, 12:18
1) Всё зависит от того, как код подключается в мод. Если перехватами - да, влияет (если, конечно, сам код зависим от того, в каком порядке будет вызываться). Если в "модуле" просто создаются функции, которые уже вызываются в коллбэках мода - нет, не влияет

2) Ну так показывай как формируешь диалог со списком домов и как удаляешь

PawnoNoob
20.06.2018, 16:36
1) Всё зависит от того, как код подключается в мод. Если перехватами - да, влияет (если, конечно, сам код зависим от того, в каком порядке будет вызываться). Если в "модуле" просто создаются функции, которые уже вызываются в коллбэках мода - нет, не влияет

2) Ну так показывай как формируешь диалог со списком домов и как удаляешь

Ну, смотрите, я не хочу делать огромное количество модулей (например, как в Open-GTO), просто всё как бы "отсортировать".
Допустим, в первом модуле (например, server.pwn) будут такие паблики (функции... или как их там) как OnGameModeInit, OnGameModeExit и тому подобные. Во втором - OnDialogResponse. В третьем - stock и так далее. Чисто сортировка. Повлияет ли это на работоспособность?

Формирование диалога примерно такое:

new string[30], all_string[100]; // примерные значения, потом уже буду увеличивать;
strcat(all_string, "Номер дома (id)\tСтоимость\tКласс\n");
foreach(new h: House)
{
format(string, sizeof(string), "%i\t%i\t%i", HouseInfo[h][hNumber], HouseInfo[h][hCost], HouseInfo[h][hClass]); // hClass показывает числом, но это не так важно;
strcat(all_string, string);
}
return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_TABLIST_HEADERS, !"удаление дома", all_string, !"Удалить", !"Назад");

Самого удаления пока нет, но ради интереса я хотел вывести чисто id (номер дома, записанный в HouseInfo[h][hNumber]) и столкнулся с проблемой, которую описал выше.

DeimoS
20.06.2018, 17:34
Если просто уберёшь коллбэки в инклуды, то нет, не будет влияния.

Ну так а как тебе помочь с удалением, если его ещё нет? Что ты хочешь услышать-то?

PawnoNoob
20.06.2018, 18:03
Если просто уберёшь коллбэки в инклуды, то нет, не будет влияния.

Ну так а как тебе помочь с удалением, если его ещё нет? Что ты хочешь услышать-то?

Вся соль в том, что если я выберу 10 номер дома в диалоговом окне (напомню, дома с 9 номером нет в базе данных), то система, судя по информации, выведенной в диалог (в сообщении выше), удалит дом с номером 0, которого, естественно, нет, номера домов начинаются с 1.

DeimoS
20.06.2018, 19:35
Ну так проблема в коде удаления домов, которого у тебя, как ты говоришь, ещё нет. Ничего, кроме сочувствия, тебе никто оказать не сможет с таким раскладом.

Чтоб проще всего было работать с домами, работай не с AUTO_INCREMENT полем, а создай рядом ещё одно поле, присвой ему индекс UNIQUE и уже контролируй ID домов самостоятельно.
phpMyAdmin может начать ругаться, если попытаешься присвоить UNIQUE-индекс для создаваемого столбца, если в таблице уже будут находится какие-либо записи. Чтоб этого избежать, сначала создай обычный столбец, потом сделай запрос на заполнение этого столбца уникальными значениями, по типу:

UPDATE house SET h_id = id-1// "Переймём" значение столбца "id", отняв единицу, дабы ID домов начинались с нуля
и уже потом через редактирование столбца присвой ему индекс "UNIQUE"

Точнее, просто создай итератор на MAX_HOUSES ячеек и записывай в него ID всех занятых домов. Соответственно, ID ячейки и будет ID дома в таблице, благодаря чему тебе не нужно дополнительно хранить значение поля AUTO_INCREMENT для каждого дома, дабы обновлять его информацию. Только ID делай нулевым.

Загрузка будет выглядеть так:

for(new i, id; i < row_count; i++)
{
cache_get_value_name_int(i, "имя_поля_с_ID_дома", id);
if(!(0 <= id < sizeof(hInfo))
{
//Предупреждение о том, что ID дома невалиден
continue;
}
cache_get_value_name_int(i, "цена_дома", hInfo[id][hPrice]);
cache_get_value_name_int(i, "интерьер_дома", hInfo[id][hInt]);
// И т.п. То бишь, сначала получаешь значение столбца с ID дома, а потом используешь его для выгрузки данных
}

А удаление дома уже либо через "вычлинение" ID из inputtext делай
Я, в своё время, делал подобный велосипед:

//Тут вычленяется ID игрока из строки, которая оформлена так: "[ID: число]"
new id_buff[4];
id_buff[0] = strfind(inputtext, "[ID: ")+5;// Находим начало нашего "маячка" и пропускаем 5 символов, так как strfind вернёт порядковый номер символа "["
id_buff[1] = strfind(inputtext, "]", false, id_buff[0]);// Находим закрывающуюся скобку
strmid(id_buff, inputtext, id_buff[0], id_buff[1], 4);// "Вычленяем" ID из строки, используя найденные "координаты"
new giveplayerid = strval(id_buff);// Преобразуем строку в число

Ты можешь сделать так же, если оформишь диалог так, что ID дома будут окружать уникальные и заранее известные символы, по которым можно будет найти "координаты" через strfind
Либо можно работать напрямую с foreach, вычленяя ID путём повторного прогона цикла (то бишь, если ты, например, показываешь дома с 30 по 40-ой, а listitem имеет значение, равное "4", то ты просто пропускаешь 33 итерации цикла и 34-ая будет равна твоему дому. Ну это для тех случаев, когда дома идут не по порядку. Если по порядку, то можно обойтись без цикла, просто запоминая "30" и прибавляя значение listitem)