Как сделать отступ lua

Обновлено: 07.07.2024

Библиотека предоставляет основные функции для работы со строками, такие как поиск и выделение подстрок, а также поиск по шаблону. Строки в Lua индексируются с 1 (а не 0, как в C). Индексы могут быть отрицательными и интерпретируются как индекс с конца строки. Т.е. последний символ имеет позицию -1, и т.д.

Библиотека работы со строками предоставляет все функции в таблице string. Она также устанавливает поле __index метатаблицы строк на таблицу string. Также, Вы можете использовать строковые функции в объектно-ориентированном стиле. Например, string.byte(s, i) может быть записано как s:byte(i).

string.byte (s [, i [, j]])

Возвращает числовые коды символов s[i], s[i+1], ···, s[j]. По умолчанию значение для i равно 1; по умолчанию значение для j равно i.

Напоминаем, что числовые коды символов не одинаковы на разных платформах.

Принимает 0 или более целых чисел. Возвращает строку, длина которой равна количеству параметров, и каждый элемент строки установлен равным соответствующему параметру.

Напоминаем, что числовые коды символов не одинаковы на разных платформах.

string.dump (function)

Возвращает строку, содержащую двоичное представление данной функции function, так, что если после этого вызвать функциюloadstring на эту строку, мы получим копию функции. function должна быть Lua функцией без внешних локальных переменных (upvalues).

string.find (s, pattern [, init [, plain]])

Если шаблон содержит захваты (captures) и поиск успешен, то захваченные значения также возвращаются, сразу после двух индексов.

string.format (formatstring, ···)

Возвращает параметры, передаваемые в функцию, отформатированные в соответствии первым параметром (который должен быть строкой). Строка формата должна строиться по тем же правилам, что и строка формата для семейства C функций printf. Отличие только в том, что опции/модификаторы *, l, L, n, p и h не поддерживаются, а также не поддерживается опция q. Опция q позволяет вернуть строку в формате, безопасно воспринимаемом Lua интерпретатором: строка выводится в двойных кавычках, а все двойные кавычки, перевод строки, символы с кодом 0 и обратный слеш внутри строки перекодируются (escaped). Например, вызов

будет возвращать строку:

"a string with \"quotes\" and \

Опции c, d, E, e, f, g, G, i, o, u, X и x должны использоваться только для числовых параметров, а q и s - строковых.

Эта функция не принимает строковые параметры, содержащие символы с кодом 0, кроме параметров для формата, имеющего опцию q.

string.gmatch (s, pattern)

Возвращает итератор, который, при каждом вызове, возвращает следующее захваченное значение. Если шаблон pattern не содержит захватов (captures), то простое сравнение будет выполнено при каждом вызове.

s = "hello world from Lua"

for w in string.gmatch ( s , "%a+" ) do

будет проходить по всем словам в строке s, печатая их по одному в строке. Следующий пример собирает все парные ключи (pairs key)=value из указанной строки в таблицу:

s = "from=world, to=Lua"

for k , v in string.gmatch ( s , "(%w+)=(%w+)" ) do

Для данной функции, символ '^' в начале шаблона не работает как признак поиска с начала строки, поскольку это помешает итерации.

string.gsub (s, pattern, repl [, n])

Возвращает копию s в которой все вхождения pattern заменяются на repl, который может быть строкой, таблицей или функцией. gsub также возвращает как второе значение – общеее количество проведенных подстановок.

Если repl строка, то используется ее значение для замены. Символ % работает как символ со специальным назначением: любая последовательность в repl в виде %n, где n от 1 до 9, заменяется на n-ную захваченную подстроку (см. ниже). Последовательность %0 заменяется на найденную подстроку. Последовательность %% считается как одиночный символ %.

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

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

Если значение, возвращаемое таблицей или функцией является строкой или числом, то это значение используется для замены; в противном случае, если значение равно false или nil, то замена не производится (т.е. найденное значение остается без замены).

Необязательный последний параметр n ограничивает максимальное количество замен. Например, если n равно 1, то будет выполнено не более одной замены.

x = string.gsub ( "hello world" , "(%w+)" , "%1 %1" )
--> x="hello hello world world"

x = string.gsub ( "hello world" , "%w+" , "%0 %0" , 1 )
--> x="hello hello world"

x = string.gsub ( "hello world from Lua" , "(%w+)%s*(%w+)" , "%2 %1" )
--> x="world hello Lua from"

x = string.gsub ( "home = $HOME, user = $USER" , "%$(%w+)" , os.getenv )
--> x="home = /home/roberto, user = roberto"

x = string.gsub ( "4+5 = $return 4+5$" , "%$(.-)%$" , function ( s )
return loadstring ( s )()
end )
--> x="4+5 = 9"

string.len (s)

Возвращает длину строки, переданной в качестве параметра. Пустая строка "" имеет длину 0. Вложенные символы с кодом 0 также считаются как символ, т.е. "a\000bc\000" имеет длину 5.

string.lower (s)

string.match (s, pattern [, init])

Поиск первого вхождения шаблона pattern в строку s. В случае обнаружения, match возвращает захваченные значения (captures); в противном случае возвращает nil. Если pattern не содержит захватов, то производится простое сравнение. Третий, необязательный числовой параметр init указывает с какого символа строки необходимо начинать поиск; по умолчанию этот параметр равен 1. Также он может быть отрицательным.

string.rep (s, n)

Возвращает строку, в которой содержится n копий строки s.

string.reverse (s)

Возвращает строку, в которой символы строки s расположены в обратном порядке.

string.sub (s, i [, j])

Возвращает подстроку строки s, которая начинается с символа с индексом i и продолжается до символа с индексом j; i и j могут быть отрицательными. Если j не указан, то считается, что он равен -1 (то же самое, что длина строки). В частности, вызов string.sub(s,1,j) возвращает начальную часть строки с длиной j, а string.sub(s, -i) возвращает конец строки s длиной i.

string.upper (s)

Я использую emacs 23.1.1 на Ubuntu с emacs стартовым комплектом . Я в основном работаю в режиме lua (установлен с package-install lua-mode ).

Мне нужно настроить, как работает отступ, чтобы он соответствовал моим рекомендациям по кодированию.

Руководящие принципы таковы:

  • tabs-to-spaces;
  • два пробела на отступ;
  • Максимум 80 символов в строке, без пробелов trail.

Что я получу с emacs, если не буду пытаться бороться с его автоматическим отступом:

Обновление:

(Это относится к комментарию, но поскольку он нуждается в дополнительном форматировании, я должен поместить его здесь.)

Если я попробую решение Томаса, то получу вот это:

Обратите внимание, что end имеет отступ с табуляцией и четырьмя пробелами. Не совсем получается.

Обновление 2:

Эта штука тоже получает отступ не в ту сторону:

Так и должно быть:

Обновление 3:

Третий случай неправильного отступа:

Обновление 4:

Вот что я получаю с текущей версией от Томаса:

За исключением тех случаев, когда это было явно отмечено, я ничего не делал для отступа, только набирал код и нажимал RETURN в конце каждой строки. На самом деле я не печатал никаких комментариев.

Это должно выглядеть следующим образом:

Обновление 5:

Еще один неправильный случай отступа:

Обновление 6:

Для полноты картины, вот что я получаю с текущим Git HEAD из lua-mode, без настройки конфигурации Томаса:

Чтобы соответствовать моим рекомендациям по кодированию, он должен выглядеть следующим образом:

В emacs cperl-режиме тернарные операторы не обрабатываются специально. Если вы разбиваете их на несколько строк, cperl-mode просто отступает от каждой строки так же, как он отступает от любого продолжающегося оператора, например: $result = ($foo == $bar) ? 'result1' : ($foo == $baz) ? 'result2' .

ruby-режим от svn, выглядит равным версии 1.1 вот emacs отступ hash User.all( < :joins =>:account, :conditions => nil> >) вот то же самое в vim User.all( < :joins =>:account, :conditions => nil> >) Как сделать отступ emacs похожим на vim в.

Ладно, давай попробуем еще раз. После просмотра исходного кода lua-mode я пришел к следующему подходу.

Причиной, по общему признанию, странного отступа по умолчанию является функция под названием "lua-calculate-indentation", которая вычисляет столбец, к которому следует добавить отступ текущей строки. К сожалению, возвращаемые им значения не соответствуют вашей желаемой спецификации.

Например, если вы введете одну строку в новый файл .lua, подобный этому:

и нажмите enter, чтобы переместить точку во вторую строку, вы можете вызвать вышеуказанную функцию, набрав M-: (lua-calculate-indentation) . Результат равен 15, что означает, что lua-mode сделает отступ во втором столбце 15. Это причина неортодоксального отступа, который вы описали и проиллюстрировали в своем первоначальном вопросе.

Этот код устанавливает уровень отступа на два пробела (вместо 3), изменяет регулярное выражение, которое определяет, растягивается ли оператор на несколько строк, и, наконец, переопределяет функцию отступа с помощью вспомогательного.

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

Способ, которым мы это делаем, немного избит: мы устанавливаем функцию обратного вызова, которая вызывается каждый раз, когда буфер меняет свой основной режим на lua-режим. Затем он проверяет, определена ли вспомогательная функция, упомянутая ранее, - если нет, он загружает "my-lua.el". Это немного хрупко, но пока вы не играете с исходным кодом lua, вы должны быть в порядке.

Добавьте следующие строки в файл ~/emacs.d/agladysh.el (при условии, что "agladysh"-это ваше имя пользователя):

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

Я надеюсь, что на этот раз это сработает для вас, если нет, дайте мне знать.

Вы знаете, что в режиме SGML (PSGML)Emacs может автоматически сделать отступ в буфере XML. C-x-h ;; Select all M-C-\ ;; Indent Но весь отступ составлял 2 пробела. Как я могу настроить автоматический отступ до 4 пробелов? Я попробовал (setq-default sgml-indent-step 4) , но это не работает. Текущий.

Как я могу настроить режим cperl в Emacs так, чтобы отступ после скобок, например has 'name' => ( is => 'rw', isa => 'Str', required => 1, ); (отступ по умолчанию) становится более похожим на то, что видно, например, в руководстве по лосю , например has 'password' => ( is =>.

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

Тем не менее, последняя версия на GitHub работает очень хорошо, не заметил никаких странностей с отступами. Все, что вам нужно сделать, чтобы соответствовать руководству по стилю Lua, - это установить indent-tabs-mode в nil и lua-indent-level в 2 .

Если вы введете следующий код в файл .emacs в своем домашнем каталоге, он заставит lua-mode (и только lua-mode) вести себя следующим образом:

  • Если вы нажмете ENTER, будет вставлена новая строка, и по умолчанию следующая строка будет иметь отступ, как и предыдущая строка.
  • Всякий раз, когда вы нажимаете TAB для отступа строки, точка либо переходит к первому символу строки, отличному от whitespace, либо, если строка пуста, точка уже находится на этом символе, вставляются два пробела.

Особенно последнее может быть не тем, что вы хотите, но, возможно, это первое приближение.

Перезапустите Emacs, чтобы эти изменения вступили в силу.

Я являюсь сопровождающим (но не автором) lua-mode.el. Поскольку я гораздо менее свободно владею Emacs Lisp, чем другие участники этой темы, я приветствую патчи. Я просто хотел бы отметить, что в правилах по умолчанию нет ничего странного или неправильного: идея, насколько я понимаю, заключается в том, что, когда вы находитесь в анонимной функции, отступ должен принимать ключевое слово функции в качестве левого поля. Это имеет смысл, если вы рассматриваете возможность использования выражений функций в других местах, например, в качестве параметров функций.

Итак, один простой обходной путь-не писать

локальная функция f =.

локальная функция f.

Если только вы не работаете с версией Lua, которая предшествует синтаксису "local function".

Сказав это, я понимаю, почему вы, возможно, захотите сделать отступ по-другому. В этом случае мне кажется разумным иметь переменную конфигурации lua-indent-function-from-function-keyword (лучшее имя, кто-нибудь?), И я был бы рад принять патч, который ее реализовал.

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

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

Вы можете заставить его делать все, что вы можете себе представить, что было бы гораздо предпочтительнее, чем просто делать все, что вы себе представляете.

Похожие вопросы:

Я использую emacs 24.5 в cygwin. Мне нужно сделать отступ до 4 пробелов в текстовом режиме, и когда я нажимаю enter, новая строка должна совпадать с отступом предыдущей строки. Я попробовал.

В Emacs строка получает отступ только после нажатия return (в cc-режиме). Это нормально? Можно ли изменить его на отступ автоматически, когда он попадает в новую строку? Как я смотрю на переменные.

Я следую условию кода Дугласа Крокфорда , но не могу получить правильную идентификацию в режиме JS в режиме Emacs. Я попытался настроить параметры отступа режима, попробовал другие режимы, такие как.

В emacs cperl-режиме тернарные операторы не обрабатываются специально. Если вы разбиваете их на несколько строк, cperl-mode просто отступает от каждой строки так же, как он отступает от любого.

ruby-режим от svn, выглядит равным версии 1.1 вот emacs отступ hash User.all( < :joins =>:account, :conditions => nil> >) вот то же самое в vim User.all(< :joins =>.

Вы знаете, что в режиме SGML (PSGML)Emacs может автоматически сделать отступ в буфере XML. C-x-h ;; Select all M-C-\ ;; Indent Но весь отступ составлял 2 пробела. Как я могу настроить автоматический.

Как я могу настроить режим cperl в Emacs так, чтобы отступ после скобок, например has 'name' => ( is => 'rw', isa => 'Str', required => 1, ); (отступ по умолчанию) становится более.

Пожалуйста, помогите мне настроить правильный отступ в режиме Emacs haskell Когда я пытаюсь ввести что-то вроде ADT или записи, я попадаю в неправильный столбец после нажатия , а.

Это похожий вопрос, как изменить отступ в php-режиме на 2 пробела в Emacs? но для javascript-mode я попробовал то же самое (setq c-basic-offset 2) но это не работает.

Когда я использую Emacs, я включаю любой автоматический отступ и использую пользовательскую схему отступа (сохраняю отступ предыдущей строки, используя только пробелы). В c-режиме я просто.

Луа (Lua) — мощный, быстрый, лёгкий, расширяемый и встраиваемый скриптовый язык программирования. Луа удобно использовать для написания бизнес-логики приложений.

Отдельные части логики приложения часто бывает удобно описывать в декларативном стиле. Декларативный стиль программирования отличается от более привычного многим императивного тем, что описывается, в первую очередь, каково нечто а не как именно оно создаётся. Написание кода в декларативном стиле часто позволяет скрыть лишние детали реализации.

Луа — мультипарадигменный язык программирования. Одна из сильных сторон Луа — хорошая поддержка декларативного стиля. В этой статье я кратко опишу базовые декларативные средства, предоставлямые языком Луа.

Пример

function build_message_box ( gui_builder )

local my_dialog = gui_builder:dialog ( )

my_dialog:set_title ( "Message Box" )

local my_label = gui_builder:label ( )

my_label:set_text ( "Hello, world!" )

local my_button = gui_builder:button ( )

В декларативном стиле этот код мог бы выглядеть так:

build_message_box = gui:dialog "Message Box"

Гораздо нагляднее. Но как сделать, чтобы это работало?

Основы

Чтобы разобраться в чём дело, нужно знать о некоторых особенностях языка Луа. Я поверхностно расскажу о самых важных для понимания данной статьи. Более подробную информацию можно получить по ссылкам ниже.

Динамическая типизация

Важно помнить, что Луа — язык с динамической типизацией. Это значит, что тип в языке связан не с переменной, а с её значением. Одна и та же переменная может принимать значения разных типов:

a = "the meaning of life" --> была строка,

Таблицы

Таблицы (table) — основное средство композиции данных в Луа. Таблица — это и record и array и dictionary и set и object.

Для программирования на Луа очень важно хорошо знать этот тип данных. Я кратко остановлюсь лишь на самых важных для понимания деталях.

Создадим пустую таблицу t:

Содержимое таблицы можно указать при её создании:

Таблица в Луа может содержать ключи и значения всех типов (кроме nil). Но чаще всего в качестве ключей используются целые положительные числа (array) или строки (record / dictionary). Для работы с этими типами ключей язык предоставляет особые средства. Я остановлюсь только на синтаксисе.

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

Следующие две формы записи эквивалентны:

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

При создании таблицы следующие две формы записи эквивалентны:

Аналогично для индексации при записи…

Функции

Функции в Луа — значения первого класса. Это значит, что функцию можно использовать во всех случаях, что и, например, строку: присваивать переменной, хранить в таблице в качестве ключа или значения, передавать в качестве аргумента или возвращаемого значения другой функции.

Функции в Луа можно создавать динамически в любом месте кода. При этом внутри функции доступны не только её аргументы и глобальные переменные, но и локальные переменные из внешних областей видимости. Функции в Луа, на самом деле, это замыкания (closures).

function make_multiplier ( coeff )

return function ( value )

return value * coeff

local x5 = make_multiplier ( 5 )

print ( x5 ( 10 ) ) --> 50

Следующие два способа создания функции эквивалентны. Создаётся новая функция и присваивается глобальной переменной mul.

Вызов функции без круглых скобок

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

print ( "Use the force," , name )

my_name_is "Luke" --> Use the force, Luke

print ( "Shopping list:" )

for name, qty in pairs ( items ) do

print ( "*" , qty, "x" , name )

Цепочки вызовов

Как я уже упоминал, функция в Луа может вернуть другую функцию (или даже саму себя). Возвращённую функцию можно вызвать сразу же:

chain_print ( 1 ) ( "alpha" ) ( 2 ) ( "beta" ) ( 3 ) ( "gamma" )

В примере выше можно опустить скобки вокруг строковых литералов:

local tmp1 = chain_print ( 1 )

local tmp2 = tmp1 ( "alpha" )

local tmp3 = tmp2 ( 2 )

local tmp4 = tmp3 ( "beta" )

local tmp5 = tmp4 ( 3 )

Методы

Объекты в Луа — чаще всего реализуются при помощи таблиц.

За методами, обычно, скрываются значения-функции, получаемые индексированием таблицы по строковому ключу-идентификатору.

Луа предоставляет специальный синтаксический сахар для объявления и вызова методов — двоеточие. Двоеточие скрывает первый аргумент метода — self, сам объект.

Следующие три формы записи эквивалентны. Создаётся глобальная переменная myobj, в которую записывается таблица-объект с единственным методом foo.

function myobj:foo ( b )

print ( self.a_ + b )

function myobj.foo ( self, b )

print ( self.a_ + b )

myobj.foo ( myobj, 37 ) --> 42

Совсем без сахара:

myobj [ "foo" ] = function ( self, b )

print ( self [ "a_" ] + b )

myobj [ "foo" ] ( myobj, 37 ) --> 42

Примечание: Как можно заметить, при вызове метода без использования двоеточия, myobj упоминается два раза. Следующие два примера, очевидно, не эквивалентны в случае, когда get_myobj() выполняется с побочными эффектами.

Чтобы код был эквивалентен варианту с двоеточием, нужна временная переменная:

local tmp = get_myobj ( )

При вызове методов через двоеточие также можно опускать круглые скобки, если методу передаётся единственный явный аргумент — строковый литерал или конструктор таблицы:

Реализация

Теперь мы знаем почти всё, что нужно для того, чтобы наш декларативный код заработал. Напомню как он выглядит:

build_message_box = gui:dialog "Message Box"

Что же там написано?

local tmp_1 = gui : label ( "Hello, world!" )

local tmp_2 = gui : button ( "OK" )

local button = tmp_2 ( < >)

local tmp_3 = gui : dialog ( "Message Box" )

Интерфейс объекта gui

Опишем их в псевдокоде:

Декларативный метод

В интерфейсе объекта gui чётко виден шаблон — метод, принимающий часть аргументов и возвращающий функцию, принимающую остальные аргументы и возвращающую окончательный результат.

Для простоты, будем считать, что мы надстраиваем декларативную модель поверх существующего API gui_builder, упомянутого в императивном примере в начале статьи. Напомню код примера:

function build_message_box ( gui_builder )

local my_dialog = gui_builder:dialog ( )

my_dialog:set_title ( "Message Box" )

local my_label = gui_builder:label ( )

my_label:set_text ( "Hello, world!" )

local my_button = gui_builder:button ( )

Попробуем представить себе, как мог бы выглядеть метод gui:dialog():

return function ( element_list )

return function ( gui_builder )

local my_dialog = gui_builder:dialog ( )

element_list [ i ] ( gui_builder )

Ситуация с [gui_element] прояснилась. Это — функция-конструктор, создающая соответствующий элемент диалога.

Функция build_message_box() создаёт диалог, вызывает функции-конструкторы для дочерних элементов, после чего добавляет эти элементы к диалогу. Функции-конструкторы для элементов диалога явно очень похожи по устройству на build_message_box(). Генерирующие их методы объекта gui тоже будут похожи.

Напрашивается как минимум такое обобщение:

function declarative_method ( method )

return function ( self, name )

return function ( data )

return method ( self, name, data )

Теперь gui:dialog() можно записать нагляднее:

gui.dialog = declarative_method ( function ( self, title, element_list )

return function ( gui_builder )

local my_dialog = gui_builder:dialog ( )

element_list [ i ] ( gui_builder )

Реализация методов gui:label() и gui:button() стала очевидна:

gui.label = declarative_method ( function ( self, text, parameters )

return function ( gui_builder )

local my_label = gui_builder:label ( )

if parameters.font_size then

gui.button = declarative_method ( function ( self, title, parameters )

return function ( gui_builder )

local my_button = gui_builder:button ( )

-- Так сложилось, что у нашей кнопки нет параметров.

Что же у нас получилось?

Проблема улучшения читаемости нашего наивного императивного примера успешно решена.

Благодаря особенностям Луа реализация получилась дешёвой и достаточно гибкой и мощной.

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

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

HasAura() проверяет есть ли на вас эта аура.
RemoveAura() снимает эту ауру.

Так же я добавил player:SendBroadcastMessage объяснять что это делает я не буду. Так как это понятно наглядно.

Конечно, вы все равно должны добавить end для "if" и "function".

Итак, теперь у нас есть два intids, давайте посмотрим на нашу функцию сейчас, и добавить последнюю.

function exampleGossipOnSelect(Unit, Event, player, id, intid, code, pMisc)
if (intid == 1) then
player:Teleport(1, -9101.980469, 1612.902832, 21)
player:GossipComplete()
end
if (intid == 2) then
if (player:HasAura(15007) == true) then
player:SendBroadcastMessage("Болезнь после воскрешения была удалена. Будьте осторожны в следующий раз!")
player:RemoveAura(15007)
player:GossipComplete()
else
player:SendBroadcastMessage("У вас нет болезни после воскрешения!")
player:GossipComplete()
end
end
if (intid == 3) then
player:GossipComplete()
end
end

Мы просто добавили в intid 3: GossipComplete(), потому что опция стоит, чтобы закрыть окно.

Теперь посмотрим что у нас получилось.

--[[
Мой первый сценарий!
]]
-- Variables
local NPC_ID = ид нпс

-- On Triggers
function exampleGossipOnTalk(Unit, Event, player)
Unit:GossipCreateMenu(100, player, 0)
Unit:GossipMenuAddItem(0, "Телепорт меня в столицу.", 1, 0)
Unit:GossipMenuAddItem(0, "Удалить болезнь после воскрешения.", 2, 0)
Unit:GossipMenuAddItem(0, "Выход.", 3, 0)
Unit:GossipSendMenu(player)
end
function exampleGossipOnSelect(Unit, Event, player, id, intid, code, pMisc)
if (intid == 1) then
player:Teleport(1, -9101.980469, 1612.902832, 21)
player:GossipComplete()
end
if (intid == 2) then
if (player:HasAura(15007) == true) then
player:SendBroadcastMessage("Болезнь после воскрешения была удалена. Будьте осторожны в следующий раз!")
player:RemoveAura(15007)
player:GossipComplete()
else
player:SendBroadcastMessage("У вас нет болезни после воскрешения!")
player:GossipComplete()
end
end
if (intid == 3) then
player:GossipComplete()
end
end
RegisterUnitGossipEvent(NPC_ID, 1, "exampleGossipOnTalk")
RegisterUnitGossipEvent(NPC_ID, 2, exampleGossipOnSelect)

Молодцы! Вы создали свой первый сценарий функционирования. Или, по крайней мере, с помощью этого учебника. Сохраните его как TeleporterNPC.lua и поместить его в папку scripts. Поставьте нпс и перезагрузите сервер, и наслаждайтесь вашим первым сценарием!

Таким образом, вы знаете, как использовать If и elseif но, используя следующее довольно сложно читать ну и как то однообразно;

if (var == true) then
Weee()
end
if (var == false) then
Awww()
end
if (var == nil) then
WTFITSHOULDNTBENIL()
end

Вместо этого, вы можете заменить 2й и 3й if на elseIf, в зависимости от ситуации. elseIf в основном удаляет последующие if и заканчивается так, что они легко читаются. Вот наглядным пример.

if (var == true) then
Wee()
elseif (var == false) then
Awww()
elseif (var == nil) then
WTFITSHOULDNTBENIL()
end

Как вы можете видеть, это гораздо легче читать, чем предыдущие.

Ну что же. Вот и конец этого учебника. Вторая часть будет более позже.

Так же если вы будете использовать lua скрипты с русскими символами не забываем ставить кодировку UTF-8

Всем удачного изучения этого языка.

Если у вас есть какие то либо вопросы то не стесняйтесь задавайте их.



There is nothing better than .LUA

Читайте также: