LUA ОШИБКА попытка выполнить арифметику c над логическим значением - PullRequest
1 голос
/ 07 мая 2020
  ```  local xpNeed = 100; -- E.g. 100 * lvl = XP you need to rank up!
    addEvent("onPlayerLevelUp", true);

    function addPlayerXp(player, xp)
        local acc = getPlayerAccount(player);
        local oldexp = getAccountData(acc, "exp") or 0;
        local oldlvl = getAccountData(acc, "lvl") or 1;
        local newlevel = oldlvl + 1;
        local newexp = oldexp + xp;
        lvl = getAccountData(acc, "lvl") or 0;
        if getElementData(player,'lvl') > 9 then return end
        setAccountData(acc, "exp", newexp);
        setElementData(player, "exp", newexp); 
        --if getAccountData(acc,'lvl') > 9 then return end
            if (newexp >= (oldlvl * xpNeed)) then
            local expleft = newexp - (oldlvl * xpNeed); -- added calculation for the exp that may remains after level up.
            outputChatBox("[Level-Up] Congratulations! New level "..newlevel.."!", player, 66, 134, 244);
            setAccountData(acc, "lvl", newlevel);
            setAccountData(acc, "exp", expleft);
            setElementData(player, "exp", expleft);
            setElementData(player, "lvl", newlevel);
            triggerEvent("onPlayerLevelUp", player, newlevel, oldlvl, oldexp, newexp);
        end
    end
    addEventHandler("onPlayerLogin", root, function()
        local acc = getPlayerAccount(source);
        if acc then
            setElementData(source, "lvl", getAccountData(acc, "lvl") or 0);
            setElementData(source, "exp", getAccountData(acc, "exp") or 0);
        end
    end);

    addEventHandler("onZombieGetsKilled", root, function(killer)
        if killer and getElementType(killer) == "player" then
            addPlayerXp(killer, 50);
        end
    end);

    addEventHandler("kilLDayZPlayer", root, function(killer)
        if (killer and killer ~= source and getElementType(killer) == "player") then
            addPlayerXp(killer, 50);
        end
    end);

    --[[
    addEventHandler("onPlayerSpawn", root, function(newlvl)
        if newlvl then
        if (lvl) >= 1 then
                setElementData(player, "MP5A5", 1)
            elseif lvl >= 2 then
                setElementData(player, "Tent", 1)
            elseif lvl >= 3 then
                setElementData(player, "Milk", 1)
            elseif lvl >= 4 then
                setElementData(player, "Medic Kit", 1)
            elseif lvl >= 5 then
                setElementData(player, "Shovel", 1)
            end
        end
    end);

    ]]

    table = {"Milk","MP5A5","M4A1-S","AK-47","Soda Bottle","Pizza","AS50","Tent","Medium Tent","ACR","AR-15","M107","Pasta Can","Beans Can","Golf Club"}

    addEventHandler("onPlayerSpawn", root, function(lvl)
        if not lvl then lvl = getElementData(player, "lvl") or 0; end
        if lvl >= 1 then
            for i = 1, lvl do
                setElementData(player, table[i], getElementData(player, table[i]) + 1);
            end
        end
    end);
```

Здравствуйте, это мой первый пост, поэтому я хотел бы поздороваться. Итак, как начинающий программист, я пытаюсь реализовать систему уровней для своего mta-сервера, но я столкнулся с препятствием, как указано в заголовке. Где это логическое значение? Как мне заставить его работать? Прошу прощения, если этот вопрос кажется тривиальным (а он, безусловно, так и есть), но я действительно хочу двигаться вперед. Любая помощь будет принята с благодарностью. Заранее спасибо!

ошибка в setElementData (player, table [i], getElementData (player, table [i]) + 1); что я могу сделать, чтобы заставить его работать, любая помощь будет принята с благодарностью

ERROR LINE 70 попытка выполнить арифметику c на логическом значении И ПРЕДУПРЕЖДЕНИЕ ЖЕ СТРОКА

Неверный аргумент @ getElementData [Ожидаемый элемент в аргумент 1, получил ноль]

Ответы [ 3 ]

0 голосов
/ 07 мая 2020

Итак, я использую ваши функции, и мой код выглядит так

   table = {"Milk","MP5A5","M4A1-S","AK-47","Soda Bottle","Pizza","AS50","Tent","Medium Tent","ACR","AR-15","M107","Pasta Can","Beans Can","Golf Club"} 

addEventHandler("onPlayerSpawn", root, function(lvl)
local player = source 
    if not lvl then lvl = getElementData(player, "lvl") or 0; end
    if lvl >= 1 then
        for i = 1, lvl do
            setElementData(player, "lvl", table[i], (getElementData(player,"lvl", table[i]) or 0) + 1);
        end
    end
end);

Я добавляю "lvl" bcs prnt.sc/sc9hk1, я получил, но все еще не работает, и теперь у меня эта ошибка: https://prnt.sc/scajbc

0 голосов
/ 09 июня 2020

Во-первых, пожалуйста, не используйте table в качестве имени переменной. Я не писал для Multi Theft Auto, но предполагаю, что у него есть встроенная библиотека таблиц Lua, которую вы будете перезаписывать.

getElementData возвращает false, если данные для этого элемента не существуют , поэтому вам нужно проверить, чтобы убедиться, что это так.

То, что делает ваш код, заключается в том, что при каждом появлении игрока количество этого элемента увеличивается на единицу, я предполагаю, что вы действительно хотите сделать, просто дать игроку один из этих предметов?

В любом случае, что-то вроде этого:

 addEventHandler("onPlayerSpawn", root, function(lvl)
        if not lvl then lvl = getElementData(player, "lvl") or 0; end
        if lvl >= 1 then
            for i = 1, lvl do
                local itemCount = getElementData(player, table[i]) or 0
                setElementData(player, table[i], itemCount + 1);
            end
        end
    end);

Если вы просто пытаетесь добавить один предмет на каждое возрождение, а не увеличивать его на 1 , затем сделайте это setElementData(player, table[i], 1);

0 голосов
/ 07 мая 2020

getElementData может вернуть false, если запрошенный вами элемент не существует. Я предполагаю, что вы хотите, чтобы это трактовалось как 0, поэтому замените getElementData(player, table[i]) + 1 на (getElementData(player, table[i]) or 0) + 1.

Кроме того, похоже, что у вас нет переменной player, поэтому он использует глобальный nil , так что вы всегда получите ноль. Чтобы исправить это, введите local player = source в начале обработчика onPlayerSpawn.

...