• 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 пользователей онлайн

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

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

    • Владислав2
      От Владислав2
      Здравствуйте, при компиляции появляется ошибка,

      Ошибка:
      error 017: undefined symbol "REP_KUZIA_TD"

      Строки:
       
          REP_KUZIA_TD[0] = TextDrawCreate(7.499990, 314.444396, "REP: 1");
          TextDrawLetterSize(REP_KUZIA_TD[0], 0.400000, 1.600000);
          TextDrawAlignment(REP_KUZIA_TD[0], 1);
          TextDrawColor(REP_KUZIA_TD[0], -1);
          TextDrawSetShadow(REP_KUZIA_TD[0], 0);
          TextDrawSetOutline(REP_KUZIA_TD[0], 1);
          TextDrawBackgroundColor(REP_KUZIA_TD[0], 255);
          TextDrawFont(REP_KUZIA_TD[0], 1);
          TextDrawSetProportional(REP_KUZIA_TD[0], 1);
          TextDrawSetShadow(REP_KUZIA_TD[0], 0);
          REP_KUZIA_TD[1] = TextDrawCreate(6.249957, 330.518493, "ASK: 0");
          TextDrawLetterSize(REP_KUZIA_TD[1], 0.400000, 1.600000);
          TextDrawAlignment(REP_KUZIA_TD[1], 1);
          TextDrawColor(REP_KUZIA_TD[1], -1);
          TextDrawSetShadow(REP_KUZIA_TD[1], 0);
          TextDrawSetOutline(REP_KUZIA_TD[1], 1);
          TextDrawBackgroundColor(REP_KUZIA_TD[1], 255);
          TextDrawFont(REP_KUZIA_TD[1], 1);
          TextDrawSetProportional(REP_KUZIA_TD[1], 1);
          TextDrawSetShadow(REP_KUZIA_TD[1], 0);
          return 1;
      }

      Буду рад если кто-то поможет