Множественные сообщения и проблемы при поиске в таблицах Lua - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь создать скрипт Lua для интернет-сообщества, частью которого я являюсь, у меня возникла проблема при попытке поиска в массиве таблиц, в который я верю.Это не определяет результаты, которые я хочу.

Способ, который должен работать, заключается в том, что, когда кто-то набирает /gps [streetname], он будет искать в таблице вверху, обнаруживать соответствующее название улицы и координаты, а затем устанавливать путевую точку на эту соответствующую позицию.

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

Любая помощь будет оценена.

waypoint = {
  {404.08, -920.23, 'sinnerstreet', 'Sinner Street'},
  {360.85, -956.46, 'atleestreet', 'Atlee Street'},
  {500.48, -956.80, 'littlebighornavenue', 'Little Bighorn Avenue'},
}

RegisterCommand('gps', function(source, args, rawCommand)
  for k,v in pairs(waypoint) do
    x, y, streetname, displayname = table.unpack(v)
    results = ""

    if args[1] == nil then
      if IsWaypointActive() then
        SetWaypointOff()
        TriggerEvent('chatMessage', '^1^*GPS Navigation: ^r^7Your GPS system has been reset.')
      return end
    elseif args[2] == nil and args[3] == nil then
      results = args[1]
    elseif args[2] ~= nil and args[3] == nil then
      results = args[1] .. args[2]
    else
      results = args[1] .. args[2] .. args[3]
    end

    results = string.lower(results) -- This convertes the args into lower case
  end

  -- This locates the streetname and sets a waypoint to it for the player
  if string.find(streetname, results) then
    SetNewWaypoint(x, y)
    TriggerEvent('chatMessage', '^1^*GPS Navigation: ^r^7Your waypoint to ^1' .. displayname .. '^r^7 has been set.')
  else
    TriggerEvent('chatMessage', '^1^*GPS Navigation: ^r^7There has been an error with your street name, please try again.')
  end
end)

TriggerEvent('chat:addSuggestion', '/gps', 'This creates a waypoint to your designated street. ^*USE: /gps [streetname]')

1 Ответ

0 голосов
/ 25 сентября 2018

Если честно, ваш код мало что значит, и, возможно, потому, что вы не используете все то хорошее, что может предложить Lua.

{404.08, -920.23, 'sinnerstreet', 'Sinner Street'},

Там вы храните избыточные данные.Третье значение на самом деле просто четвертое с удаленными пробелами и строчными буквами.

'sinnerstreet' == ('Sinner Street'):gsub("[^%l]", ""):lower()

На английском языке: принять "Sinner Street", g lobally (имеется в виду во всей строке) sub Укажите все, что не является строчной (%l) буквой, и ничего (""), а затем создайте результат из этой строчной буквы.То, что вы получаете, - это «sinnerstreet».

x, y, streetname, displayname = table.unpack(v)

Использование глобалов там не очень хорошо.Глобалы - это дьявол.Не используйте их.

Затем, несколько строчек ниже:

SetNewWaypoint(x, y)

Подумайте об этом на мгновение.Вы устанавливаете x и y в каждой итерации цикла for.После завершения цикла они всегда содержат координаты последней путевой точки, по которой вы итерировали.Я сомневаюсь, что это то, что вы хотите.Используйте local;это заставляет вас думать, какой должна быть область действия ваших переменных, что поможет вам определить проблему такого рода.

elseif args[2] ~= nil and args[3] == nil then
  results = args[1] .. args[2]

Если вы специально не хотите ограничить ее тремя аргументами, в чем я сомневаюсь,Вы также можете использовать table.concat для объединения всех значений в последовательности (читай: массив)

results = string.lower( table.concat(args) )

Меня удивляет то, что вы делаете это в цикле.Для каждой путевой точки вы устанавливаете result в одно и то же значение, которое объединяет все аргументы и преобразует их в нижний регистр.

что теперь?Вы проверяете, содержит ли result (то, что искал пользователь) streetname, который, как мы уже выяснили, содержит имя последней путевой точки в списке.

Использование таблиц для поиска

У Lua есть таблицы, одна из, если не самая мощная, структура данных общего назначения в программировании.

local map = {}
for _,waypoint in ipairs(waypoints) do
  map[waypoint[3]:lower()] = waypoint
end

Это даст вам примерно следующее:

local map = {
  sinnerstreet = {404.08, -920.23, 'sinnerstreet', 'Sinner Street'},
  atleestreet = {360.85, -956.46, 'atleestreet', 'Atlee Street'},
  littlebighornavenue ={500.48, -956.80, 'littlebighornavenue', 'Little Bighorn Avenue'},
}

и если вы хотите узнать, существует ли улица, вы можете просто сделать следующее:

if map['atleestreet'] then
  print(map.atleestreet[4])
end
  1. if рассматривает все, что не является false или nil как правдивое,так что вы можете просто написать `map ['atleestreet'] в условии
  2. my_table['text'] можно записать как my_table.text
  3. Поиск строковых индексов в таблице довольно быстро из-за того, какэто реализовано.

Заключение

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

Затем установите переменные на local, где это возможно (читай: везде), выясните, что нужнобыть внутри и снаружи цикла и попытаться снова.

Замечания

Вместо if something == nil вы можете просто написать if not something, а if something ~= nil просто if something

Извинения

Извините за длинную стену текста и использование пробелов в скобках, но я хотел, чтобы все было особенно легко понять.

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