• 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

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

48 минут назад, Keks сказал:

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

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

Спойлер

if(newkeys == 16)
{
    for(new j; j < sizeof(fur_info); j++) 
    {
        if(!IsPlayerInRangeOfPoint(playerid, 1.5, fur_info[i][m_x], fur_info[i][m_y], fur_info[i][m_z]) || GetPlayerInterior(playerid) != fur_info[i][m_int] || GetPlayerVirtualWorld(playerid) != fur_info[i][m_virtual])) continue; 
        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}Закрыть");
        break;
    }
}

И тогда эти строки можно удалить: 

23 часа назад, Keks сказал:

if(fur_info[m_model] == 19916) GetDynamicObjectPos(fur_info[m_id], f_x_x, f_x_y, f_x_z); //1             if(fur_info[m_model] == 2332) GetDynamicObjectPos(fur_info[m_id], f_s_x, f_s_y, f_s_z); //2

 

23 часа назад, Keks сказал:

    if(fur_info[m_model] == 19916) GetDynamicObjectPos(i, f_x_x, f_x_y, f_x_z); //1     if(fur_info[m_model] == 2332) GetDynamicObjectPos(i, f_s_x, f_s_y, f_s_z); //1

 

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

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

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


Ссылка на сообщение
  • 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]?

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

 

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

Спойлер

public OnPlayerSelectDynamicObject(playerid, objectid, modelid, Float:x, Float:y, Float:z)
{
    SetPVarInt(playerid,"ModelID", modelid);
    SetPVarInt(playerid, "Model", objectid);
    static fmt_str[] = "SELECT * FROM `furniture` WHERE `mID` = '%d'";
    new string[sizeof(fmt_str)-2+6];
    mysql_format(connect_mysql, string, sizeof(string), fmt_str,  objectid);
    return mysql_function_query(connect_mysql, string, true, "CheckFurniture", "d", playerid);
}

 

 

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

Спойлер

 


publics CheckFurniture(playerid)
{
    new rows, fields;
    cache_get_data(rows, fields);
    if(rows) 
    {
        CancelEdit(playerid);
        SPD(playerid,96,2,"{FFFFFF}Управление мебелью",
        "\
            Изменить позицию\n\
            Удалить","{FFFFFF}Выбрать","{FFFFFF}Закрыть\
        ");
    }
    else
    {
        DeletePVar(playerid, "Model");
        DeletePVar(playerid,"ModelID");
        SelectObject(playerid);
    }
    return true;
}

//========================

case 96:
        {
            if(response)
            {
                switch(listitem)
                {
                    case 0:
                    {
                        static fmt_str[] = "DELETE FROM `furniture` WHERE `mID` = '%d'";
                        new string[sizeof(fmt_str)-2+6];
                        mysql_format(connect_mysql, string, sizeof(string), fmt_str,
                            GetPVarInt(playerid, "Model"));
                        mysql_function_query(connect_mysql, string, false, "", "");
                        fur_info[GetPVarInt(playerid, "Model")][m_x] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_y] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_z] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_rootx] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_rooty] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_rootz] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_virtual] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_int] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_model] = EOS;
                        EditDynamicObject(playerid, GetPVarInt(playerid, "Model"));
                    }
                    case 1:
                    {
                        static fmt_str[] = "DELETE FROM `furniture` WHERE `mID` = '%d'";
                        new string[sizeof(fmt_str)-2+6];
                        mysql_format(connect_mysql, string, sizeof(string), fmt_str,
                            GetPVarInt(playerid, "Model"));
                        mysql_function_query(connect_mysql, string, false, "", "");
                        DestroyDynamicObject(GetPVarInt(playerid, "Model"));
                        fur_info[GetPVarInt(playerid, "Model")][m_x] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_y] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_z] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_rootx] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_rooty] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_rootz] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_virtual] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_int] = EOS;
                        fur_info[GetPVarInt(playerid, "Model")][m_model] = EOS;
                        DeletePVar(playerid, "Model");
                        DeletePVar(playerid,"ModelID");
                        SelectObject(playerid);
                    }
                }
            }
            else
            {
                DeletePVar(playerid, "Model");
                DeletePVar(playerid,"ModelID");
                SelectObject(playerid);
            }

        }

 

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

Спойлер

public OnPlayerEditDynamicObject(playerid, objectid, response, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
    if(!IsValidDynamicObject(objectid)) return true;
     MoveDynamicObject(objectid,x, y, z, 10, rx, ry, rz);
    if(response == EDIT_RESPONSE_FINAL)
    {
        new Modeles = GetPVarInt(playerid, "Model");
        DestroyDynamicObject(Modeles);
        fur_info[Modeles][m_x] = x;
        fur_info[Modeles][m_y] = y;
        fur_info[Modeles][m_z] = z;
        fur_info[Modeles][m_rootx] = rx;
        fur_info[Modeles][m_rooty] = ry;
        fur_info[Modeles][m_rootz] = rz;
        fur_info[Modeles][m_virtual] = GetPlayerVirtualWorld(playerid);
        fur_info[Modeles][m_int] = GetPlayerInterior(playerid);
        fur_info[Modeles][m_model] = GetPVarInt(playerid,"ModelID");
        Furniture_Mysql(Modeles);
        DeletePVar(playerid, "ModelID");
        DeletePVar(playerid, "Model");
        return CancelEdit(playerid);
    }
    if(response == EDIT_RESPONSE_CANCEL)
    {
        new Modeles = GetPVarInt(playerid, "Model");
        DestroyDynamicObject(Modeles);
        Modeles -= 1;
        DeletePVar(playerid, "ModelID");
        DeletePVar(playerid, "Model");
        return CancelEdit(playerid);
    }
    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, "", "");
    i = 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]);
      return true;
}

 

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

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

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

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

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

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

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


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

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

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


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

@DEST 

Спойлер

----------
Loaded log file: "server_log.txt".
----------

SA-MP Dedicated Server
----------------------
v0.3.7-R2, (C)2005-2015 SA-MP Team

[11:44:05] filterscripts = ""  (string)
[11:44:05] 
[11:44:05] Server Plugins
[11:44:05] --------------
[11:44:05]  Loading plugin: crashdetect.so
[11:44:05]   CrashDetect v4.15.1 is OK.
[11:44:05]   Loaded.
[11:44:05]  Loading plugin: dc_cmd.so
[11:44:05]   Daniel's CMD plugin v2.8
[11:44:05]     (c) 2014 Daniel_Cortez
[11:44:05]     www.pro-pawn.ru
[11:44:05]   Loaded.
[11:44:05]  Loading plugin: sscanf.so
[11:44:05] 

[11:44:05]  ===============================

[11:44:05]       sscanf plugin loaded.     

[11:44:05]          Version:  2.8.1        

[11:44:05]    (c) 2012 Alex "Y_Less" Cole  

[11:44:05]  ===============================

[11:44:05]   Loaded.
[11:44:05]  Loading plugin: streamer.so
[11:44:05] 

*** Streamer Plugin v2.7.8 by Incognito loaded ***

[11:44:05]   Loaded.
[11:44:05]  Loading plugin: mysql.so
[11:44:06]  >> plugin.mysql: R39-2 successfully loaded.
[11:44:06]   Loaded.
[11:44:06]  Loaded 5 plugins.

[11:44:06] 
[11:44:06] Filterscripts
[11:44:06] ---------------
[11:44:06]   Loaded 0 filterscripts.

[11:44:06] Number of vehicle models: 90
[11:44:06] - Успешно загружена мебель. Всего мебели 9
[11:44:32] [connection] incoming connection: 88.200.137.154:56785 id: 0
[11:44:56] 3043 //значение PVar

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

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

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


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

@Keks 

В 04.08.2018 в 20:06, Keks сказал:

fur_info[Modeles][m_x] = x;

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

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

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


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

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

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

    • Узбек
      От Узбек
      Всем добрый вечер ребят! 
      Я начинающий, сегодня я вам сливаю команду 2(шт) на технические работы
      Ловите 
       
    • nazpol9
      От nazpol9
      Привет всем.

      У меня имеется мод для самп сервера и VPS с Ubuntu, на котором я пытаюсь его запустить.

      В чем суть проблемы: при запуске samp03svr, сервер запускается, но на версии 0.3.DL R-1. Когда я пытаюсь запустить этот же мод локально на Windows, сервер работает на версии 0.3.7 и я могу зайти на него без клиента 0.3.DL.

      Для решения этой проблемы я уже пробовал заменять инклуды и исполнительные файлы теми, что есть в архивах на официальном сайте сампа, перекомпилировал мод, и ничего не изменилось.
       
      #include <a_samp> #include <a_mysql> #include <foreach> #include <Pawn.RakNet> #include <streamer> #include <sscanf2> #include <float2> #include <crashdetect> #include <fmt> #include <a_http> #include <Pawn.CMD> #include <Pawn.Regex> #include <requests> #include <callbacks> #include <MD5> #include <mxdate> #include <TOTP> #include <gvar> #include <md-sort> #include <nex-ac> #include <weapon-config> #include <discord-connector> #include <3DTryg> #include <textdraw-streamer>  
      plugins crashdetect.so streamer.so textdraw-streamer.so sscanf.so pawnraknet.so pawncmd.so mysql.so requests.so profiler.so pawnregex.so TOTP.so gvar.so discord-connector.so

      Если у кого-то будут какие-либо догадки, прошу ими поделиться, если понадобится больше информации - я постараюсь её предоставить.