• 0
Keks

Загрузка/создание объектов.

Вопросы

Здравствуйте, у меня возник вопрос на счёт создания и загрузки отдельных моделей объектов. Например я создаю объект 2332, и таких объектов штук 5, и к каждому мне надо что бы в радиусе 5 метров открывалось диалоговое окно. Моя проблема в том, что это работает только на последнем объекте который загружен был из этих 5, помогите пожалуйста с ответом. Код:

//Загрузка
publics LoadFurniture()
{
    new rows, fields, id = 0;
    cache_get_data(rows, fields);
    if(rows)
    {
        for(new i; i < rows; i++)
        {
            fur_info[i][m_id] = cache_get_field_content_int(i, "mID", connect_mysql);
            fur_info[i][m_model] = cache_get_field_content_int(i, "mmodel", connect_mysql);
            fur_info[i][m_x] = cache_get_field_content_float(i, "mx", connect_mysql);
            fur_info[i][m_y] = cache_get_field_content_float(i, "my", connect_mysql);
            fur_info[i][m_z] = cache_get_field_content_float(i, "mz", connect_mysql);
            fur_info[i][m_rootx] = cache_get_field_content_float(i, "mrootx", connect_mysql);
            fur_info[i][m_rooty] = cache_get_field_content_float(i, "mrooty", connect_mysql);
            fur_info[i][m_rootz] = cache_get_field_content_float(i, "mrootz", connect_mysql);
            fur_info[i][m_virtual] = cache_get_field_content_int(i, "mvirtualWorld", connect_mysql);
            fur_info[i][m_int] = cache_get_field_content_int(i, "mint", connect_mysql);
            fur_info[i][m_id] = CreateDynamicObject(fur_info[i][m_model],\
            fur_info[i][m_x], fur_info[i][m_y], fur_info[i][m_z], fur_info[i][m_rootx],\
            fur_info[i][m_rooty], fur_info[i][m_rootz],fur_info[i][m_virtual], fur_info[i][m_int]);
            if(fur_info[i][m_model] == 19916) GetDynamicObjectPos(fur_info[i][m_id], f_x_x, f_x_y, f_x_z); //1
            if(fur_info[i][m_model] == 2332) GetDynamicObjectPos(fur_info[i][m_id], f_s_x, f_s_y, f_s_z); //2
            id++;
        }
        printf("- Успешно загружена мебель. Всего мебели %d", id);
    }
    return true;
}

//создание из игры с сохранением
stock Furniture_Mysql(i)
{
    static fmt_str[] =
    "\
        INSERT INTO `furniture`\
        (`mID`, `mmodel`, `mx`, `my`, `mz`, `mrootx`, `mrooty`, `mrootz`, `mvirtualWorld`, `mint`)\
         VALUES ('%i', '%i', '%f', '%f', '%f', '%f', '%f', '%f', '%i', '%i')\
    ";
    new string[sizeof(fmt_str)-2+6-2+6-2+10-2+10-2+10-2+10-2+10-2+10-2+4-2+4];
    mysql_format(connect_mysql, string, sizeof(string), fmt_str,
    i,\
    fur_info[i][m_model],\
    fur_info[i][m_x],\
    fur_info[i][m_y],\
    fur_info[i][m_z],\
    fur_info[i][m_rootx],\
    fur_info[i][m_rooty],\
    fur_info[i][m_rootz],\
    fur_info[i][m_virtual],\
    fur_info[i][m_int]);
    mysql_function_query(connect_mysql, string, false, "", "");
    if(fur_info[i][m_model] == 19916) GetDynamicObjectPos(i, f_x_x, f_x_y, f_x_z); //1
    if(fur_info[i][m_model] == 2332) GetDynamicObjectPos(i, f_s_x, f_s_y, f_s_z); //1
      return true;
}

//И при нажатии F что должно происходить
if(newkeys == 16)
{
    if(IsPlayerInRangeOfPoint(playerid, 1.5, f_x_x, f_x_y, f_x_z))
    {
        new i = GetPVarInt(playerid, "PlayerHouse");
        static const fmt_str[] =
        "\
            Предмет\tШтук\n\
            текст\t%d/1\
        ";
        new string[sizeof(fmt_str)-2+1];
        format(string, sizeof(string), fmt_str,
        house_info[i][hprod][0]);
        SPD(playerid,298,5,"{FFFFFF}Тест",string,"{FFFFFF}Выбрать","{FFFFFF}Закрыть");
    }

}

Поделиться сообщением


Ссылка на сообщение

10 ответов на этот вопрос

  • 0

@Keks если переменной присваивать новое значение, то оно перезапишет старое. Поэтому, вам необходимо f_s_x, f_s_y, f_s_z создать массивами. 

Поделиться сообщением


Ссылка на сообщение
  • 0

@DEST Я просто не очень в этом, а какой объём для массива брать и как перезаписывать? Если через цикл, то на сколько объектов, я просто не могу понять немного.

Поделиться сообщением


Ссылка на сообщение
  • 0

@Keks в PAWN нет возможности выделять массив динамически, поэтому нужно сразу указать максимально допустимое число объектов. 

И все-таки объясните концепцию работы Вашей системы, быть может мы найдем более элегантное решение. 

Поделиться сообщением


Ссылка на сообщение
  • 0

Получил разъяснение концепции и часть кода в Л/С от автора. Если вкратце, то вот: 

  В 8/2/2018 в 13:27, Keks сказал:

так, что бы для каждой модели которую я выделяю сохранились координаты для работы системы которая работает при нажатии F...

Читать далее...  

@Keks В любом случае здесь нужен будет цикл. Поэтому, я думаю, что вы можете сделать примерно так: 

  Код (открыть спойлер)

Это одна из реализаций нативным методом, т.е. не прибегая к сторонним библиотекам. 

Здесь же вы могли бы воспользоваться динамическими зонами, если интересно, можете прочитать, по-моему даже на форуме где-то мануал был. 

Поделиться сообщением


Ссылка на сообщение
  • 0

@DEST Огромное спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
  • 0

@Keks А, и я еще забыл, что если хотите, чтобы этот код работал только на определенные типы объектов, то добавьте проверку в цикл, туда же, где и проверка на координаты инт и вирт. мир: 

fur_info[i][m_model] != id_объекта

 

Поделиться сообщением


Ссылка на сообщение
  • 0

Привет, я опять на счёт этой системы. Я как бы переставляю объекты, эти созданные, и под id объекта присваиваю новые координаты ему fur_info[m_x],fur_info[m_y],fur_info[m_z] и т.д., и и на новом месте работает функционал например холодильника, и на старом от куда убрал. Как обнулить старую  fur_info[m_x],fur_info[m_y],fur_info[m_z]?

Не могу понять.

 

В общем, сначало я проверяю на наличия такого объекта через базу данных

  OnPlayerSelectDynamicObject (открыть спойлер)

 

Далее если такой объект есть, даю выбор удалить или редактировать объект, при выборе редактирования, должно обнуляться переменные и даваться новые на позицию объекта при сохранении, но почему-то фукнционал дальше работает и на новой позиции и на старой, хотя она должна быть обнулена. И иногда не удаляеться объект при редактировании и после рестарта сервера и на новой и старой позиции этот объект.

  Код (открыть спойлер)

 

И само сохранение новой позиции, самого объекта.

  Создание объекта (открыть спойлер)

Заметка от Cawfee , создано

Объединил сообщения. Но обратите внимание на пункт правил 3.6.

Заметка от Cawfee , создано

Если выкладываемый Вами код слишком большой (как в данном случае), используйте тег "Код" совместно с тегом "Спойлер", чтобы сообщение выглядело эстетично. Как это сделать?

Заметка от Cawfee , создано

При выкладывании кода, пожалуйста, указывайте синтаксис в правом нижнем углу окна вставки кода. Соответственно, если выкладываете код pawn, то указывайте синтаксис языков Си (поскольку pawn - си-подобный язык).

Поделиться сообщением


Ссылка на сообщение
  • 0

@Keks Выведите в консоль в любом месте вашей системы значение пвара Model и после скиньте логи сервера. 

Поделиться сообщением


Ссылка на сообщение
  • 0

@DEST 

  server_log (открыть спойлер)

Вывело id объекта в базе данных который я редактировал, так и должно же было быть? Это было редактирование.

Отредактировано пользователем Keks

Поделиться сообщением


Ссылка на сообщение
  • 0

@Keks 

  В 8/4/2018 в 17:06, Keks сказал:

fur_info[Modeles][m_x] = x;

Читать далее...  

В обращении к массиву в первых квадратных скобочках должен быть номер строки, к которой обращаемся, а не ID объекта.

Взгляните на свою загрузку объектов и поймете о чем я. 

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Michov Andr
      От Michov Andr
      Re:samp RP — проект в разработке
      Re:samp RP — это SA-MP в стиле RP-проект, который в данный момент находится в активной разработке. Мы создаём сервер с бонусной системой, где механики будут, и игроки смогут развивать свои персонажи, зарабатывать деньги и взаимодействовать с окружающим миром. Однако, главное — это ролевой процесс. Вы сами выбираете, хотите ли вы заниматься бизнесом и фармом или погружаться в глубокую ролевую игру. Всё зависит от того, какой путь вы хотите пройти.
      Мы стремимся к тому, чтобы на сервере не было скучного фарма и бесконечных рутинных задач. Всё будет сбалансировано так, чтобы каждый игрок мог выбрать свой стиль игры и наслаждаться процессом, будь то отыгрыш роли, развитие персонажа или участие в экономике.
      Что касается доната — на сервере будет доступна возможность покупки привилегий, включая покупку админки. Мы не планируем делать донат обязательным для прогресса, и он не будет влиять на геймплей, но те, кто хотят ускорить процесс или получить дополнительные возможности, смогут воспользоваться такими предложениями. Всё сделано так, чтобы не нарушать баланс и не превращать сервер в платный путь к успеху.
      Re:samp RP — это сервер, где каждый игрок может найти для себя интересное занятие и, главное, где всегда будет место для качественной ролевой игры. Мы не навязываем никаких обязательных механик, и все решения остаются за вами. Стартовый бонус, донат, админки — это всё дополнительные возможности, но не основа игры. 
      Discrod:https://discord.gg/ernRMjyEJy
       
             
      на логотип не смотрим да признаюсь взял с самп рп() но уж больно он норм)
    • djxxx
      От djxxx
      приветствую всех.
       
      Задался таким вопросом при добавлении одной системы на DIALOG_STYLE_TABLIST_HEADERS.
       
      Суть проблемы в том, что диалог не выравнивается под нужные показатели, а просто как будто находиться по середине, в диалоге используется \t, но они особо не помогают в решении, также не ровно.
       
      а если попытаться выравнивать большим количеством \t, оно компилируется но в игре происходят вылеты
       
      Код такой:
      DialogAdmShop ( playerid, DIALOG_EPOINTSHOP, DIALOG_STYLE_TABLIST_HEADERS, fmt_str, ""BR"номер\t"BR"наименование\t"BR"доступное действие\n"\ "{EB4C42}#1\t{FFFFFF}Виртуальная валюта\t{888888}нажмите для взаимодействия\n"\ "{EB4C42}#2\t{FFFFFF}Донат валюта\t{888888}нажмите для взаимодействия\n"\ "{EB4C42}#3\t{FFFFFF}Вип статусы\t{888888}нажмите для взаимодействия\n"\ "{EB4C42}#4\t{FFFFFF}Кейсы\t{888888}нажмите для взаимодействия\n"\ "{EB4C42}#5\t{FFFFFF}Уникальные аксессуары\t{888888}нажмите для взаимодействия", "Выбрать", "Закрыть" ); }  
      сток dialogadmshop:
      stock DialogAdmShop(playerid, dialogid, style, title[], text[], button[], button2[]) {   if(style == 5)   {      ShowPlayerDialog(playerid, 0, DIALOG_STYLE_LIST, "...", "...", "...", "");    }   ShowPlayerDialog(playerid, dialogid, style, title, text, button, button2);   return 1; }