Работа прогеру с минимальными знаниями lua (похож на python)

Флудилка.

Модераторы: R1ke, pups

Оплата от 20.000 форумного золота за решение проблемы.
Язык: lua
Что из себя представляет: функция, которая должна сохранять инвентарь в файл
Код: выделить все
Base/Inventory/"..name..".txt
для дальнейшей уже загрузки. Загрузка инвентаря работает успешно. Не работает сохранение. Раньше работало, но щас перестало, я хз почему, раньше был неизменно первый вариант.

Ещё вам может помочь

Якобы рабочий вариант функции.
Код: выделить все
function BE_Save_Inventory(playerid,params)
local name = GetPlayerName(playerid);
   for i = 0, 500 do
      GetPlayerItem(playerid,i);
   end
end

Проблема этого варианта: он тупо не сохраняет предметы. Ну, это из кода видно, просто пусть тут будет, мало ли.

Вот мой нерабочий вариант #1
Код: выделить все
function BE_Save_Inventory(playerid,params)
   local name = Player[playerid].real_name;
   Player[playerid].save = true;
   io.open("Base/Inventory/"..name..".txt","r+");
   if file then
      for i = 0, 500
      do
      io.open("Base/Inventory/"..name..".txt","+l");
      local tmp = file:read("*l");
         if tmp then
         local result, item, amount = sscanf(tmp,"sd");
         GetPlayerItem(playerid,item,amount);
         file = io.write();
         file:close();
         end
      end
   else
   file = io.open("Base/Inventory/"..name..".txt", "w+");
   file:write();
   file:close();
      for i = 0, 500 do
      io.open("Base/Inventory/"..name..".txt","+l");
      local tmp = file:read("*l");
         if tmp then
            local result, item, amount = sscanf(tmp,"sd");
            GetPlayerItem(playerid,item,amount);
            file = io.write();
            file:close();
         end
      end
   end
   file:close();
end

Скриншоты ошибки:
Изображение
Изображение




Вот мой нерабочий вариант #2
Код: выделить все
function BE_Save_Inventory(playerid)
local name = Player[playerid].real_name;
file = io.open("Base/Inventory/"..name..".txt", "w");
   if file then
      for i = 0, 500 do
         local c,d = GetPlayerItem(playerid,i);
         local it = string.format("%s %s %d,",c, " " ,d);
         file:write(it);
      end
   file:close();
   end
end


Как вы могли заметить тут всё упирается в GetPlayerItem(playerid,i), вот справка из вики по этому калбэку:


Get item from player's inventory.
Код: выделить все
GetPlayerItem(playerid, slot)

playerid The ID of player.
slot Slot from player's inventory to get item.
Returns This function doesn't return a specific value, but when player will send item with amount of from given slot called is callback OnPlayerResponseItem.

Пример:
Код: выделить все
function OnPlayerCommandText(playerid, cmdtext)
 
    if cmdtext == "/eq" then
 
        --checking player's inventory for 6 slots
 
        for i = 0, 5 do --(0,1,2,3,4,5) (together 6 slots)
            GetPlayerItem(playerid,i);
        end
    end
end
 
function OnPlayerResponseItem(playerid, slot, item_instance, amount, equipped)
 
    local message;
    if item_instance == "NULL" then
        message = string.format("%s %d %s","Item in",slot,"slot does not exist. More items I do not have :(");
        SendPlayerMessage(playerid,255,0,0,message);
    else
        message = string.format("%s %d %s %s %s %d","slot:",slot,"item_instance:",item_instance,"amount:",amount);
        SendPlayerMessage(playerid,0,255,0,message);
 
        if equipped == 1 then
           SendPlayerMessage(playerid,255,255,0,"That item is equipped :)");
        end
    end
end

Output:
slot: 0 item_instance: ItMi_Skull amount: 52
slot: 1 item_instance: ITMI_JOINT amount: 7
slot: 2 item_instance: ITAR_DIEGO amount: 1 That item is equipped :)
slot: 3 item_instance: ITMW_2H_PAL_SWORD amount: 1 That item is equipped :)
Item in 4 slot does not exist. More items I do not have :(
Item in 5 slot does not exist. More items I do not have :(
Последний раз редактировалось Soul982 24 янв 2017, 20:02, всего редактировалось 4 раз(а).
Статус в M&B:
Не в игре
Заслуженная репутация: 113

GetPlayerItem(playerid,i)
А оно знает в какой структуре искать playerid?
Может там должно быть что-то вроде Player[playerid].getid
С этим языком не знаком, но мне кажется он просто не знает с каким Player'ом работает.
Статус в M&B:
Не в игре

Lair писал(а): local c,d = GetPlayerItem(Player[playerid],i);

Там ожидается номер, а не таблица. Пока что из ошибки у себя нашёл не обозначенную переменную "name", но это не решает.

Добавлено спустя 42 секунды:
Re: Работа прогеру с минимальными знаниями lua (похож на python)
Lair писал(а):playerid

Функция вызывается с получением переменной playerid, поэтому она точно знает, с кем работает.
Статус в M&B:
Не в игре
Заслуженная репутация: 113

Соул, а если общедоступным языком объяснить, что за проблему вы тут решаете?
Статус в M&B:
Не в игре
Заслуженная репутация: 27

Ещё ошибку нашёл - for a, а в переменной слота указано i.

Добавлено спустя 1 минуту 16 секунд:
Re: Работа прогеру с минимальными знаниями lua (похож на python)
Kenny_Metal_Heavy писал(а): общедоступным языком объяснить

У меня есть почти готовый простенький сервер для одной игры (позже о ней) и я застрял на ключевом моменте - предметы персонажей игроков не сохраняются (вот взял ты меч, вышел из игры, зашёл - а меча нет), и я пытаюсь понять, как это исправить. Обращаться к людям из моей стязи не вариант - они не то, что помочь, они даже за деньги не хотят делиться "сокровенными знаниями".
Статус в M&B:
Не в игре
Заслуженная репутация: 113

Invalid file open mode. Line 98
Что в 98 строке?
Статус в M&B:
Не в игре

Lair писал(а):Line 98

Там пусто. Табом прожал разделение между двумя функциями (закрытыми) :)
Статус в M&B:
Не в игре
Заслуженная репутация: 113

А теперь ошибка есть? И если есть то какая?
Статус в M&B:
Не в игре

Lair писал(а): И если есть то какая?

По первому варианту ошибка та же (крашается сервер)
По второму варианту Error runtime: line 1292: bad argument #2 to 'format' (string expected, got nil)
Вот эта строка: local it = string.format("%s%s%d,",c," ",d);
Статус в M&B:
Не в игре
Заслуженная репутация: 113

аргумент 2 пустой, хз с синтаксисом в этом языке Напиши так
local it = string.format("%s %d,",c,d);
То бишь пробел обозначь не через %s а в прям между %s и %d
Статус в M&B:
Не в игре

След.



Вернуться в Отдыхаем

Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 9