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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±

    Загрузка инвентаря.

    В теории я написал рабочий код, но на практике загрузка инвентаря останавливается на первом слоте (по крайней мере в диалоге инвентаря 1 слот, тогда как в бд их два).

    1. @_LoadInvent(playerid);
    2. @_LoadInvent(playerid)
    3. {
    4. new
    5. rows,
    6. fields;
    7. cache_get_data(rows, fields);
    8. if(rows)
    9. {
    10. new
    11. i = cache_get_field_content_int(0, "slotid");
    12. inv[playerid][i][i_item] = cache_get_field_content_int(0, "itemid");
    13. inv[playerid][i][i_amount] = cache_get_field_content_int(0, "amountid");
    14. inv_slots{playerid}++;
    15. static
    16. fmt_str[] = "SELECT * FROM `inventory` WHERE `ownertableid` = '%d' AND `slotid` = '%d' LIMIT 1";
    17. new
    18. string[sizeof(fmt_str)-4+4+2+1];
    19. format(string, sizeof(string), fmt_str, player[playerid][p_tableid], i+1);
    20. mysql_function_query(connect_mysql, string, true, "@_LoadInvent", "d", playerid);
    21. return true;
    22. }
    23. else return false;
    24. }


    1. stock DialogInvent(playerid)
    2. {
    3. new
    4. string[128+1];
    5. format(string, sizeof(string), "{00C0FF}%s [%d]", invent_items[inv[playerid][0][i_item]], inv[playerid][0][i_amount]);
    6. if(inv_slots{playerid} >= 1)
    7. {
    8. for(new i = 1; i < inv_slots{playerid}; i++)
    9. {
    10. if(inv[playerid][i][i_item] != 0 && inv[playerid][i][i_amount] != 0)
    11. {
    12. new
    13. str[17-4+16+5+1];
    14. format(str, sizeof(str), "\n{00C0FF}%s [%d]", invent_items[inv[playerid][i][i_item]], inv[playerid][i][i_amount]);
    15. strcat(string, str);
    16. }
    17. }
    18. }
    19. SPD(playerid, DLG_ID_INVENT_SELECT_SLOT, DSL, !"{00C0FF}Инвентарь", string, !"{00C0FF}Выбрать", !"{00C0FF}Отмена");
    20. return true;
    21. }


    1. stock LoadInvent(playerid)
    2. {
    3. static
    4. fmt_str[] = "SELECT * FROM `inventory` WHERE `ownertableid` = '%d' AND `slotid` = '0' LIMIT 1";
    5. new
    6. string[sizeof(fmt_str)-2+4+1];
    7. format(string, sizeof(string), fmt_str, player[playerid][p_tableid]);
    8. mysql_function_query(connect_mysql, string, true, "@_LoadInvent", "d", playerid);
    9. return true;
    10. }


    1. new
    2. inv_slots[MAX_PLAYERS char],
    3. select_slot[MAX_PLAYERS char];


    1. new
    2. invent_items[22][16+1] =
    3. {
    4. "Пусто", "Бургер", "Пепси-Кола", "Desert Eagle", "Shotgun", "M4A1", "AK-47", "Baseball Bat", "Colt 45", "Spas-12", "Silenced Colt 45", "Golf Club",
    5. "Nitestick", "Knife", "Chainsaw", "Grenade", "Molotov", "Tec 9", "Uzi", "Mp5", "Rifle", "Sniper rifle"
    6. };


    1. enum e_INVENTORY_DATA
    2. {
    3. i_item, i_amount
    4. }
    5. new
    6. inv[MAX_PLAYERS][MAX_INVENT_SLOTS][e_INVENTORY_DATA];


    1. enum
    2. {
    3. INVENT_ITEM_NONE = 0, INVENT_ITEM_BURGER = 1, INVENT_ITEM_PEPSI = 2, INVENT_WEAPON_DEAGLE, INVENT_WEAPON_SHOTGUN, INVENT_WEAPON_M4A1, INVENT_WEAPON_AK47,
    4. INVENT_WEAPON_BAT, INVENT_WEAPON_COLT45, INVENT_WEAPON_SPAS12, INVENT_WEAPON_SILENCED_COLT45, INVENT_WEAPON_GOLFCLUB, INVENT_WEAPON_NITESTICK,
    5. INVENT_WEAPON_KNIFE, INVENT_WEAPON_CHAINSAW, INVENT_WEAPON_FLOWER, INVENT_WEAPON_CANE, INVENT_WEAPON_GRENADE, INVENT_WEAPON_MOLOTOV, INVENT_WEAPON_TEC9,
    6. INVENT_WEAPON_UZI, INVENT_WEAPON_MP5, INVENT_WEAPON_RIFLE, INVENT_WEAPON_SNIPER
    7. };


    1. #define MAX_INVENT_SLOTS 7


    При авторизации и загрузке данных аккаунта:

    1. LoadInvent(playerid);
    Последний раз редактировалось SteveStage; 28.04.2020 в 10:52.

  2. #2
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Проблема оказалась не в коде, а в том, что при подключении inv_slots{playerid} равно -1 (приравнивается в стоке Clear), а должно быть равно 0.

  3. #3
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от SteveStage Посмотреть сообщение
    1. @_LoadInvent(playerid);
    2. @_LoadInvent(playerid)
    3. {
    4. new
    5. rows,
    6. fields;
    7. cache_get_data(rows, fields);
    8. if(rows)
    9. {
    10. new
    11. i = cache_get_field_content_int(0, "slotid");
    12. inv[playerid][i][i_item] = cache_get_field_content_int(0, "itemid");
    13. inv[playerid][i][i_amount] = cache_get_field_content_int(0, "amountid");
    14. inv_slots{playerid}++;
    15. static
    16. fmt_str[] = "SELECT * FROM `inventory` WHERE `ownertableid` = '%d' AND `slotid` = '%d' LIMIT 1";
    17. new
    18. string[sizeof(fmt_str)-4+4+2+1];
    19. format(string, sizeof(string), fmt_str, player[playerid][p_tableid], i+1);
    20. mysql_function_query(connect_mysql, string, true, "@_LoadInvent", "d", playerid);
    21. return true;
    22. }
    23. else return false;
    24. }
    1. stock LoadInvent(playerid)
    2. {
    3. static
    4. fmt_str[] = "SELECT * FROM `inventory` WHERE `ownertableid` = '%d'";
    5. new
    6. string[sizeof(fmt_str)-2+4+1];
    7. format(string, sizeof(string), fmt_str, player[playerid][p_tableid]);
    8. mysql_function_query(connect_mysql, string, true, "@_LoadInvent", "d", playerid);
    9. }
    10.  
    11. @_LoadInvent(playerid);
    12. @_LoadInvent(playerid)
    13. {
    14. new
    15. rows,
    16. fields;
    17. cache_get_data(rows, fields);
    18.  
    19. for (new i = 0, slotid = 0; i < rows; ++i)
    20. {
    21. if (i >= MAX_INVENT_SLOTS)
    22. {
    23. return 0;
    24. }
    25.  
    26. slotid = cache_get_field_content_int(i, "slotid");
    27.  
    28. inv[playerid][slotid][i_item] = cache_get_field_content_int(i, "itemid");
    29. inv[playerid][slotid][i_amount] = cache_get_field_content_int(i, "amountid");
    30.  
    31. inv_slots{playerid}++;
    32. }
    33.  
    34. return 1;
    35. }

  4. #4
    Аватар для red.inc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.07.2019
    Адрес
    Беларусь, Витебск
    Сообщений
    23
    Репутация:
    0 ±
    Я извиняюсь за грубость. Но зачем ты используешь char в переменных с ид игроком?

    В одном месте ты не используешь char, в другом используешь.

    Я может чего-то не понимаю?

  5. #5
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от red.inc Посмотреть сообщение
    Я извиняюсь за грубость. Но зачем ты используешь char в переменных с ид игроком?

    В одном месте ты не используешь char, в другом используешь.

    Я может чего-то не понимаю?
    1) Я так не делаю.
    2) Char поддерживает максимальное число 255. А слотов уж точно столько не будет, поэтому номер выбранного слота и количество загруженных слотов можно использовать char.
    3) Где ты видишь, чтобы я в переменной использовал char? Только в массивах.

    Оператор char надо использовать с умом, и тогда он будет приносить пользу.

    Кстати, а зачем ты спрашиваешь?)
    Последний раз редактировалось SteveStage; 06.05.2020 в 01:59.

  6. #6
    Аватар для red.inc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.07.2019
    Адрес
    Беларусь, Витебск
    Сообщений
    23
    Репутация:
    0 ±
    В одной переменной у тебя используется char, в другой нет. Но они совместимы в работе

  7. #7
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от red.inc Посмотреть сообщение
    В одной переменной у тебя используется char, в другой нет. Но они совместимы в работе
    Да где ты видишь, чтобы в переменной использовался char? Ткни пальцем, может я слепой.

  8. #8
    Аватар для red.inc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.07.2019
    Адрес
    Беларусь, Витебск
    Сообщений
    23
    Репутация:
    0 ±
    inv[playerid][i][i_item] = cache_get_field_content_int(0, "itemid");
    inv[playerid][i][i_amount] = cache_get_field_content_int(0, "amountid");
    inv_slots{playerid}++;

  9. #9
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от red.inc Посмотреть сообщение
    inv[playerid][i][i_item] = cache_get_field_content_int(0, "itemid");
    inv[playerid][i][i_amount] = cache_get_field_content_int(0, "amountid");
    inv_slots{playerid}++;
    Ну так я хз как в трехмерных массивах использовать char. Да и amount будет иметь максимальное значение 50'000, а char - 255.

 

 

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

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

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

Ваши права

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