Добавьте имя в массив, проверьте массив, чтобы увидеть, существует ли имя, запустите код - PullRequest
2 голосов
/ 27 сентября 2019

Совершенно новый для lua несколько часов назад, у меня есть небольшой опыт в C ++ и Java, но ничего удивительного.

Я пытаюсь работать над дополнением для игры, которая проверяет игроков вокругменя, и если так (в пределах 10 ярдов) приветствует их.

Это прекрасно работает, за исключением того, что я ТОЛЬКО хочу, чтобы он запускался один раз для каждого игрока, так как это было бы спамом и раздражало постоянно приветствовать людей.

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

     function Wave()
        local totalObjects = GetObjectCount()
        local shouldMessage = false
        local player = GetActivePlayer()
        arrayNames = {}
        for i = 1, totalObjects do
            local object = GetObjectWithIndex(i)
            if object ~= player and UnitIsPlayer(object) == true and UnitIsDead(object) == false then
                local yards = GetDistanceBetweenObjects(player, object)
                 local name = ObjectName(object)

                  ----------------- The beginning of my issue ----------------

                if yards < 10 and arrayNames[i] ~= name then -- if name isnt in array already?
                    arrayNames[i] = name -- trying to add the name to array
                    print(arrayNames[i])

                    break
                end
            end         


    end
    if storeName then   
    end
end

1 Ответ

1 голос
/ 27 сентября 2019

Проблема в том, что ваша таблица очищается после каждого вызова Wave.Это потому, что вы делаете arrayNames = {} внутри своей функции, поэтому каждый раз, когда она запускается, таблица устанавливается на новую пустую таблицу.Вы можете определить arrayNames вне вашей функции Wave или изменить его на arrayNames = arrayNames or {} Второй параметр установит arrayNames равным arrayNames, когда он определен, или новой таблице, если она не определена.


Дополнительно

Ваш код проверяет, существует ли name в массиве по определенному индексу, а не проверяет весь массив.Если индекс игрока может измениться, то вы, скорее всего, будете приветствовать его снова, используя этот метод.

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

Вместо использования массива я предлагаю использовать набор:

if yards < 10 and not arrayNames[name] then -- if name isnt in set already?
    arrayNames[name] = true -- trying to add the name to set
    print(name)

    break
end

просто добавьте в таблицу, используяname в качестве ключа и установка значения true. Это обеспечит производительность O (1) для вашего чека.

Вот дополнительная информация о наборах: https://en.wikipedia.org/wiki/Set_(abstract_data_type)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...