Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±

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

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

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


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

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1) Всё зависит от того, как код подключается в мод. Если перехватами - да, влияет (если, конечно, сам код зависим от того, в каком порядке будет вызываться). Если в "модуле" просто создаются функции, которые уже вызываются в коллбэках мода - нет, не влияет

    2) Ну так показывай как формируешь диалог со списком домов и как удаляешь
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    PawnoNoob (20.06.2018)
  4. #3
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    1) Всё зависит от того, как код подключается в мод. Если перехватами - да, влияет (если, конечно, сам код зависим от того, в каком порядке будет вызываться). Если в "модуле" просто создаются функции, которые уже вызываются в коллбэках мода - нет, не влияет

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

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


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

  5. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Если просто уберёшь коллбэки в инклуды, то нет, не будет влияния.

    Ну так а как тебе помочь с удалением, если его ещё нет? Что ты хочешь услышать-то?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. Пользователь сказал cпасибо:
    PawnoNoob (20.06.2018)
  7. #5
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Если просто уберёшь коллбэки в инклуды, то нет, не будет влияния.

    Ну так а как тебе помочь с удалением, если его ещё нет? Что ты хочешь услышать-то?
    Вся соль в том, что если я выберу 10 номер дома в диалоговом окне (напомню, дома с 9 номером нет в базе данных), то система, судя по информации, выведенной в диалог (в сообщении выше), удалит дом с номером 0, которого, естественно, нет, номера домов начинаются с 1.
    Последний раз редактировалось PawnoNoob; 20.06.2018 в 18:05.

  8. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Ну так проблема в коде удаления домов, которого у тебя, как ты говоришь, ещё нет. Ничего, кроме сочувствия, тебе никто оказать не сможет с таким раскладом.

    Чтоб проще всего было работать с домами, работай не с AUTO_INCREMENT полем, а создай рядом ещё одно поле, присвой ему индекс UNIQUE и уже контролируй ID домов самостоятельно.
      Открыть/закрыть
    phpMyAdmin может начать ругаться, если попытаешься присвоить UNIQUE-индекс для создаваемого столбца, если в таблице уже будут находится какие-либо записи. Чтоб этого избежать, сначала создай обычный столбец, потом сделай запрос на заполнение этого столбца уникальными значениями, по типу:
    PHP код:
    UPDATE house SET h_id id-1// "Переймём" значение столбца "id", отняв единицу, дабы ID домов начинались с нуля 
    и уже потом через редактирование столбца присвой ему индекс "UNIQUE"


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

    Загрузка будет выглядеть так:
    PHP код:
    for(new iidrow_counti++)
    {
        
    cache_get_value_name_int(i"имя_поля_с_ID_дома"id);
        if(!(
    <= 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 делай
      Открыть/закрыть
    Я, в своё время, делал подобный велосипед:
    PHP код:
    //Тут вычленяется ID игрока из строки, которая оформлена так: "[ID: число]"
    new id_buff[4];
    id_buff[0] = strfind(inputtext"[ID: ")+5;// Находим начало нашего "маячка" и пропускаем 5 символов, так как strfind вернёт порядковый номер символа "["
    id_buff[1] = strfind(inputtext"]"falseid_buff[0]);// Находим закрывающуюся скобку
    strmid(id_buffinputtextid_buff[0], id_buff[1], 4);// "Вычленяем" ID из строки, используя найденные "координаты"
    new giveplayerid strval(id_buff);// Преобразуем строку в число 
    Ты можешь сделать так же, если оформишь диалог так, что ID дома будут окружать уникальные и заранее известные символы, по которым можно будет найти "координаты" через strfind

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

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. Пользователь сказал cпасибо:
    PawnoNoob (21.06.2018)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •