Как сделать флудилку луа

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

-- Cortex Command Lua Scripting Tutorial --
___________________________________________

Автор - Ken "CaveCricket48" Do
Переводчик - Программист/ximximik

Владельцем всех прав на перевод является ximximik, поэтому любое копирование, распространение и изменение перевода без согласия владельца (ximximik) запрещено.

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

1.0 - Начало
-> 1.1 Создание Lua файла
-> 1.2 Прикрепление скрипта к объекту

2.0 - Основы Lua
-> 2.1 Комментарии
-> 2.2 Типы данных
-> 2.3 Переменные
-> 2.4 Операторы
-> 2.5 Таблицы
-> 2.6 Оператор "For"

3.0 - Cortex Command Lua stuff
-> 3.1 Этапы скрипта
-> 3.2 Функции
-> 3.3 Указатели

4.0 - Функции и свойства в Вики

5.0 - Пример скрипта
-> 5.1 Мина

----- 1.0 - Начало -----
________________________

В Cortex Command, Lua позволяет объектам делать то, что они обычно не были бы в состоянии сделать или создать особенные эффекты.

- 1.1 Создание Lua файла-

Принцип работы скриптов Lua в Cortex Command состоит в том, что скрипты присоединены к объектам, созданным с помощью ini. Чтобы сделать файл Lua в простом блокноте в Windows, просто создайте новый текстовый файл, перейдити в меню "Файл", "Сохранить Как. ", измените "Тип файла:" на "Все файлы" , и измените ".txt" в имени файла на ".lua". Если нет никакого расширения, просто добавьте ".lua" в конце имени файла. Потом нажмите "Сохранить". Вы создали файл Lua.

Совет от переводчика: Используйте Notepad++ вместо стандартного блокнота, так как в нем показывается весь синтаксис Lua, и вообще в нем легче работать.

- 1.2 Прикрепление скрипта к объекту -

Чтобы прикрепить Lua скрипт к объекту, созданному в ini файле, просто поместите "ScriptPath = " в блоке кода объекта с соответствующим табулированием.

----- 2.0 - Основы программирования Lua -----
________________________

--- 2.1 Комментарии ---

Комментарии в скрипте Lua - строки текста, которые не читаются игрой/программой, и в основном используются, чтобы аннотировать скрипт. Чтобы аннотировать, сделайте 2 дефиса, и что-нибудь после них на той же самой строке - комментарий.

--- 2.2 Типы данных ---

Типы данных - типы данных, которые используются для переменных и свойств. В CC есть 5 основных типов данных: числа, текст, boolean (логическая переменная), вектор, и ноль (nil). Первые 2 - понятно из названия то это. boolean - логическая переменная, т.е. её значения это истина (true) или ложь (false). Вектор в CC - координаты (X, Y). Числовые данные используются, печатая только числа. Текст используется при наличии пары кавычек ("") с текстом между ними. Вектор используется, следуя за словом "Vector " 2 числами разделенными запятой в двух круглых скобках. Ноль - обозначается как "nil" (чтобы не быть перепутанным с числом ноль).

--Логическая переменная
true
false

--Векторы
Vector(1,1)
Vector(5,2)
Vector(-7,6)

--- 2.3 Переменные ---

Переменные - это то в Lua, чему Вы можете дать значение. Они используются для того, чтобы хранить информацию, чтобы Вы могли снова вызвать это позже. Переменная состоит из своего имени, одного знака " bbCodeBlock">

Чтобы изменить переменную, просто напечатайте ту же самую переменную снова с новым значением:

Вы можете также заставить переменную иметь то же самое значение что и другая переменная, устанавливая ее значение как имя другой переменной:

В результате X будет равен 5.

Есть 2 типа переменных в CC: глобальная переменная и локальная. Глобальные переменные могут быть изменены скриптом любого объекта, вновь меняющие значение, и только одна переменная с таким именем может существовать. Глобальные переменные похожи на те выше в примерах.

Локальные переменные - переменные, у которых могут быть множественные копии, каждая из них привязана к объекту со скриптом, который создал их. Чтобы создать локальную переменную, напечатайте "local" перед именем переменной, разделив их пробелом. Установка значения локальной переменной равного значению другой локальной переменной работает подобным способом как и у глобальных переменных.

Это действие сделало переменную "varB" равной 5. Заметьте, что слово "local" не использовалось, когда мы выбирали переменную "varA".

Другое полезное свойство переменных - то, что Вы можете использовать переменные, чтобы установить определенное свойство в объект, и хранить объект в переменной. Храня объект в переменной, с ним легче взаимодействовать и легче вызывать указателем. Чтобы использовать переменные, для изменения свойства объекта, Вы нуждаетесь в переменной, которая является определенным указателем на объект (мы разберем это позже), сопровождающаяся точкой, названием свойства, знаком " bbCodeBlock">

"thing" это указатель на объект, "GetsHitByMOs" это свойство объекта в ini, и "false" это значение.

Обычно используют указатель, который уже определен как "self". Указатель всегда обращается к объекту, к которому присоединен скрипт.

--- 2.4 Операторы ---

Принцип работы Lua (и программирования вообще), это проверка операторов, чтобы увидеть, являются ли их значение истинным (true) и делающим что-либо если это так (или если не так). Давайте посмотрим на код ниже.

Этот код проверяет, если переменная "X" равна "1", то совершает "содержимое" (" " не фактическое действие, только указатель места заполнения для других команд, до которых мы доберемся позже), если оператор будет истиной. Обратите внимание на "end" внизу блока кода, который говорит, что " ", часть этого оператора, закончено. Если Вы не напечатаете "end" после оператора (конец оператора после тоже), то Вы получите ошибку. Также заметьте, что есть 2 знака "=" в "строке "if". "==" нужно для того, чтобы проверить равенство, и " bbCodeBlock">

Внутри операторов "if", могут находится операторы "else". Эти операторы проверяют, выполняется ли условие оператора "if", и если оно не истинно (не выполняется), то
тогда совершаются действия в их содержимом.

Условие "Elseif" похоже на второй "if" оператор и работает также:

В операторе могут быть много условий "elseif", но только одно "else".

Списки (также называемые как таблицы и массивы) похожи на переменные, у которых могут быть множество значений. Чтобы создать список, напечатайте название списка сопровождаемое знаком " bbCodeBlock">

Добавление значения к списку подобно присвоению/изменению значения переменной. Вы должны напечатать имя списка, сопровождаемое парой квадратных скобок с заданным номером в списке, знаком " bbCodeBlock">

Числовой символ с именем списка перед этим, говорит число элементов в списке.

Тот же самый список как в вышеупомянутых примерах, имеет значение переменной "numbercheck" равное 2.

Чтобы очистить все значения списка, напечатайте имя списка, знак " bbCodeBlock">

-- Очистка всего списка
thelist = <>

-- Очистка одного значения
thelist[1] = nil

Списки могут быть глобальными и локальными, как переменные.

--- 2.6 Оператор For ---

Поскольку операторы используются, чтобы сделать множество повторяющихся действий в одном коротком участке памяти скрипта. Формат написания оператора "For" ниже.

Пример использования оператора "for".

Давайте рассмотрим каждую часть подробно:

for
- Стартовое ключевое слово

i = 1
- "i" - временная переменная, которая используется оператором "for", для сохранения, сколько раз он совершил действия (включая 1). "i" может быть изменен на любое имя как переменная. "1" это начальное значение для отсчета.

5
- Кол-во повторений " ".

Чтобы прервать оператор "for", включите "break" в оператор "if", который проверяет значение оператора "for" для соблюдения условия.

----- 3.0 - Cortex Command Lua stuff -----
________________________

--- 3.1 Этапы скрипта ---

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

-- в промежутке между "function Create(self)" и "end" будет работать, только когда объект будет создан. (происходит только один раз)
function Create(self)

end

-- в промежутке между "function Update(self) и "end" будет работать, только когда этот объект существует.
function Update(self)

end

-- в промежутке между "function Destroy(self) и "end" будет работать, только когда этот объект уничтожается. (происходит только один раз)
function Destroy(self)

end

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

Информация о функции из Википедии Cortex Command Lua:

AddImpulseForce
Adds impulse force (or instant momentum) to this MovableObject for the next time Update() is called.

- An Vector with the impulse force vector that will directly be added to this MovableObject's momentum next Update(). In kg * m/s.
- A Vector with the offset, in METERS, of where the impulse is being applied relative to the center of this MovableObject.

"anactor" - указатель на актора, "AddImpulseForce" - название функции, и содержимое круглой скобки - данные, необходимые для работы функции. В блоке информации о функции, "Return value", - это то, что выводит функция, когда она выполняется.
Большинство функций в Cortex Command может быть найдено в wiki, так что убедитесь проверив это.

--- 3.3 Указатели ---

Хорошо, мы наконец добрались до указателей!
В Cortex Command указатели - переменные, которые "хранят" объект в себе. Или Вы можете представить это, как гигантскую стрелку, указывающую на объект. независимо от того, что свойства Вы устанавливаете на указатель или используете функцию на нем, это произведет эффект на тот объект, на который он "казывает.

Есть несколько способов создать указатели. Обычно используют специальный оператор "for", который проверяет все объекты определенного типа и является оператором, который проверяет, является ли объект тем, который вам нужен. Кусок кода скрипта ниже присоединен к объекту, который ищет актора, с именем "Dummy" и затем устанавливает на него указатель, названный "local pointer".

for actor in MovableMan.Actors do
if actor.PresetName == "Dummy" then
local pointer = actor
break
end
end

Что делает вышеупомянутый кусок - проверяет всех акторов в игре, пока он не находит агента с "PresetName" как "Dummy". Тогда это устанавливает указатель на этого актора как "local pointer" и останавливает оператор "for" с "break". Термин "актор" является указателем на актора, и передан "local pointer" для более простой справочной информации.

Здесь 2 других строки "for", которые получают указатели на устройствах и частицах.

----- 4.0 - Функции и свойства в Cortex Command Wiki -----
________________________

----- 5.0 - Пример скрипта -----
________________________

--- 5.1 Mine ---
Этот скрипт для простой мины, которая взрывается, когда акторы находятся в пределах определенного расстояния объекта со скриптом.

-- Пока объект существует
function Update(self)

-- Проверка всех акторов
for actor in MovableMan.Actors do

-- Использует функцию и свойство вектора, чтобы сохранить расстояние между актором и объект со скриптом в переменной.
local distcheck = SceneMan:shortestDistance(self.Pos,actor.Pos,true).Magnitude

-- Оператор, проверяющий, если проверяемое расстояние (переменная "local distcheck") меньше чем 10. Если так, совершите действие.
if distcheck
Я мертв :)

Кто может Из этой луа-шки оставить только Ватемарку и Клантег?

lil_tady

lil_tady

derjawin

ᴋɪʟʟ (ꜱꜱ) ᴍᴇ -

derjawin

lil_tady

lil_tady

похуй что как почему где . мнё нужно от этого только Ватемарка и клан тег можешь отдельно скинуть пжлст?

derjawin

ᴋɪʟʟ (ꜱꜱ) ᴍᴇ -

derjawin

K1Z4RU

K1Z4RU

lil_tady

lil_tady

Агент sugo

Похожие темы

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

Откуда инфа, интересно.

Не открываются.
Реализация всех хуков и методов все равно на С++ писана.
Возможности абсолютно те же, только преподнесены иначе и в урезанном виде.
С тем же успехом можно было бы и SAI расширить разница была бы только в читаемости кода (ну еще скорости, да).

Проект Eluna Engine, конечно, интересен, но не более того.

Arcanum Core © Dev.
Для запросов на выдачу наград/снятие замечаний есть темы в Работе Портала. Не пишите по этому поводу в личку.

Разбираюсь в компиляции, и установке серверов с ядрами СMaNGoS и Trinity.
Учусь модкрафтить (DBC-Edit, Локации в Noggit, Конвертирование/редактирование моделей в 3D-Max + Blender).
Интересуюсь технологиями, информатикой, физикой, и многим другим.
Warlocks 'Evil Empire'

Разбираюсь в компиляции, и установке серверов с ядрами СMaNGoS и Trinity.
Учусь модкрафтить (DBC-Edit, Локации в Noggit, Конвертирование/редактирование моделей в 3D-Max + Blender).
Интересуюсь технологиями, информатикой, физикой, и многим другим.
Warlocks 'Evil Empire'

Написать на чем?

LUA интерпретированный язык, ему, как бы это странно не звучало, нужен интерпретатор.
В данном случае им является все то же ядро trinity, и реализация этого интерпретирования в нем написана на С++ (компилируемом языке).
Так вот, если в ядре не будет реализации интерпретации для нужного метода или хука, то и в LUA скриптах вы его не сможете применить.
Вывод: на луа, в данном случае, НЕЛЬЗЯ написать то, что нельзя написать на С++.

Arcanum Core © Dev.
Для запросов на выдачу наград/снятие замечаний есть темы в Работе Портала. Не пишите по этому поводу в личку.

Dimitro, Не каждому человеку хватит сил выучить С++, а Lua на много проще. Поэтому новеньким, которые не хотят учить С++, проще реализовать свою идею на Lua. Тем более я уже пишу гайды, по разработке аддонов для WoW.


Прикрутить можно куда угодно. Вопрос будет стоять по другому: "Сколько времени придется потратить и сколько строчек кода нужно будет переписать".

Если бы в оф. репо тринити была бы поддержка lua я бы слова не сказал по поводу раздутия такой важности этой темы (статья на главной).
На данный момент ее там нет и в ближайшем будущем не будет.

Зачем выносить на главную гайды по левой модификации, которую еще нужно и перетащить в текущее ядро, для чего знания с++ могут и понадобиться и новичок это не осилит точно?
Про допиливание этой модификации я вообще молчу (ну да, надо с++ знать).

По этой логике, можно по любому кастом патчу или всему, что удастся связать с вовом размещать никому не нужные статьи на главной.
То есть если я, к примеру, реализую в ядре возможность писать скрипты на Brainfuck'e мне тоже статью на главную запилить по эзотерическим языкам программирования?

Даже если опустить предыдущие тезисы, смысл гайда на данный момент такой - "я скриптую сервера вов на луа, вот ссылка на сайт разработчиков мода, дальше разбирайтесь как хотите, гайды я начал делать с середины, недостатки системы объяснять не буду, как ее перетащить на ядро тоже не буду объяснять, зато я гайд по скриптингу для НОВИЧКОВ сделал".
Как новичкам дойти до стадии, когда можно будет так скриптовать, зачем это им нужно, какие преимущества и недостатки - не ясно.

Arcanum Core © Dev.
Для запросов на выдачу наград/снятие замечаний есть темы в Работе Портала. Не пишите по этому поводу в личку.

Если бы в оф. репо тринити была бы поддержка lua я бы слова не сказал по поводу раздутия такой важности этой темы (статья на главной).
На данный момент ее там нет и в ближайшем будущем не будет.

Зачем выносить на главную гайды по левой модификации, которую еще нужно и перетащить в текущее ядро, для чего знания с++ могут и понадобиться и новичок это не осилит точно?
Про допиливание этой модификации я вообще молчу (ну да, надо с++ знать).

По этой логике, можно по любому кастом патчу или всему, что удастся связать с вовом размещать никому не нужные статьи на главной.
То есть если я, к примеру, реализую в ядре возможность писать скрипты на Brainfuck'e мне тоже статью на главную запилить по эзотерическим языкам программирования?

Я не собирался раздувать "важность" данной темы. Я лично не знаю С++, но это мне не мешает работать на UWoW и писать при этом боссов.
Насчет реализации "сторонних" языков в ядре Trinity или любых других ядрах. Lua - один из самых легких и гибких языков. Тем самым его интеграция в ядро будет более уместной чем Brainfuck".
Да и вести спор насчет "Что легче и правильней?" в данной теме будет как минимум глупо. Данная тема - не призыв к использованию Elun'ы везде, а лишь небольшой гайд, показывающий новые возможности в реализации своих идей.

Инфа из снифера 100%

На wow-cool весь ДД на луа.
И еще 4 инста, ~ 120КВ.
Правда пришлось усовершенствовать саму Eluny

Как новичкам дойти до стадии, когда можно будет так скриптовать, зачем это им нужно, какие преимущества и недостатки - не ясно.


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

Даже если опустить предыдущие тезисы, смысл гайда на данный момент такой - "я скриптую сервера вов на луа, вот ссылка на сайт разработчиков мода, дальше разбирайтесь как хотите, гайды я начал делать с середины, недостатки системы объяснять не буду, как ее перетащить на ядро тоже не буду объяснять, зато я гайд по скриптингу для НОВИЧКОВ сделал".
Как новичкам дойти до стадии, когда можно будет так скриптовать, зачем это им нужно, какие преимущества и недостатки - не ясно.

В интернете есть очень много гайдов на тему "Как поставить Eluna на Trinity". Даже скачав Eluna с офф репо и скомпилировав её - мы получим последнюю ревизию Trinity уже со встроенной Eluna. Сложностей в этом не возникнет ни у кого.
Недостатки? Они есть везде. На мой взгляд недостаток - дефицит некоторых функций. Но это уже решается дописыванием функционала со стороны С++. Этим уже будут заниматься другие люди, разрабатывающие Eluna.
Преимуществ, даже на первый взгляд, намного больше, чем недостатков. Тот факт, что можно писать скрипт, без перезагрузки/рекомпиляции сервера - перевешивает любые негативные восклицания.
Изменив скрипт в С++ мы ждем от 1-40 минут, пока проект не соберется и еще пару минут на запуск сервера/заход в игру.
На Lua мы лишь сохранили файл, прописали в консоль пару слов и уже может проверять его работоспособность.
Вносить правки в режиме онлайн - это огромный шаг в плане разработки и построении модели любого скрипта.

Еще

Написанный на Lua скрипт не имеет какой-либо специальной функции, с которой начиналось бы его выполнение. Скрипт можно рассматривать просто как набор команд (инструкций), который выполняется, начиная с первой инструкции.

Скрипт может быть как очень простым, состоящим всего из одной команды, так и весьма сложным, содержащим десятки, сотни и даже тысячи инструкций. Следующие друг за другом инструкции могут разделяться точкой с запятой (;). Однако это требование не является обязательным, поэтому весь приведённый ниже код является корректным с точки зрения синтаксиса:

Работа с переменными в Lua

Переменные используются для хранения значений в процессе выполнения скрипта.

Имена переменных в Lua

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

Язык Lua различает регистр символов, поэтому abc, Abc, ABC являются различными именами.

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

and break do else elseif

end false for function if

in local nil not or

repeat return then true until

Кроме того, все имена, начинающиеся с символа подчеркивания, за которым идут заглавные буквы (например, _VERSION) также являются зарезервированными.

Какие переменные бывают в Lua?

Переменные в Lua могут быть глобальными и локальными. Если переменная не объявлена явно как локальная, она считается глобальной.

Глобальные переменные Lua

Глобальная переменная появляется в момент присваивания ей первого значения. До присваивания первого значения обращение к глобальной переменной даёт nil.

MsgBox(tostring (g)) --> nil

MsgBox(tostring (g)) --> 1

Глобальная переменная существует до тех пор, пока существует среда исполнения скрипта и доступна любому Lua-коду, выполняемому в этой среде.

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

g = 1 — создаем глобальную переменную g со значением 1

g = nil — удаляем глобальную переменную g

MsgBox(tostring (g)) --> nil

Все глобальные переменные являются полями обычной таблицы, называемой глобальным окружением. Эта таблица доступна через глобальную переменную _G. Поскольку полями глобального окружения являются все глобальные переменные (включая саму _G), то _G._G == _G.

Локальные переменные Lua

Любые локальные переменные должны быть объявлены явно с использованием ключевого слова local. Объявить локальную переменную можно в любом месте скрипта. Объявление может включать в себя присваивание переменной начального значения. Если значение не присвоено, переменная содержит nil.

local a — объявляем локальную переменную a

local b = 1 — объявляем локальную переменную b, присваиваем ей значение 1

local c, d = 2, 3 — объявляем локальные переменные c и d, присваиваем им значения 2 и 3

Область видимости локальной переменной начинается после объявления и продолжается до конца блока.

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

Под блоком понимается:

тело управляющей конструкции (if-then, else, for, while, repeat);

фрагмент кода, заключённый в ключевые слова do. end.

Если локальная переменная определена вне какого-либо блока, её область видимости распространяется до конца скрипта.

a = 5 — глобальная переменная a

local i = 1 — переменная i локальна в пределах скрипта

while i 1, 4, 9, 16, 25

MsgBox(a) --> 5 (здесь обращение к глобальной a)

local a — переменная а локальна внутри then

MsgBox(a) --> 5 (здесь обращение к глобальной a)

local a = 20 — переменная а локальна внутри do-end

MsgBox(a) --> 5 (здесь обращение к глобальной a)

Типы данных Lua

Какие типы данных поддерживает язык Lua?

Lua поддерживает следующие типы данных:

1. Nil (ничего). Соответствует отсутствию у переменной значения. Этот тип представлен единственным значением — nil.

2. Boolean (логический). К данному типу относятся значения false (ложь) и true (истина).

При выполнении логических операций значение nil рассматривается как false. Все остальные значения, включая число 0 и пустую строку, рассматриваются как true.

3. Number (числовой). Служит для представления числовых значений.

Примеры допустимых числовых констант: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

4. String (строковый). Служит для представления строк.

Строковые значения задаются в виде последовательности символов, заключённой в одинарные или двойные кавычки:

b = 'это вторая строка'

\n (перевод строки),

\r (возврат каретки);

\t (горизонтальная табуляция),

Символ в строке также может быть представлен своим кодом с помощью escape-последовательности:

где ddd — последовательность из не более чем трёх цифр.

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

Определение строки с помощью двойных квадратных скобок позволяет игнорировать все escape-последовательности, т. е. строка создаётся полностью так, как описана:

local a = [[string

При определении строки с помощью двойных квадратных скобок учитываются символы табуляции и переноса.

local a = [=[определение строки [[string]] в Lua]=]

5. Function (функция). Функции в Lua могут быть записаны в переменные, переданы как параметры в другие функции ивозвращены как результат выполнения функций.

7. Userdata (пользовательские данные). Является особым типом данных. Значения этого типа не могут быть созданы или изменены непосредственно в Lua-скрипте.

банки данных (класс Bank);

базы данных (класс Base);

записи (класс Record) и т. п.

8. Thread (поток). Соответствует потоку выполнения. Эти потоки никаким образом не связаны с операционной системой и поддерживаются исключительно средствами самого Lua.

Как в Lua задать тип переменной?

Lua не предусматривает явного задания типа переменной. Тип переменной устанавливается в момент присвоения переменной значения. Любой переменной может быть присвоено значение любого типа (вне зависимости от того, значение какого типа она содержала ранее).

a = 123 — переменная a имеет тип number

a = true — теперь переменная a имеет тип boolean

a = <> — теперь переменная a имеет тип table

Переменные типа table, function, thread и userdata не содержат самих данных, а хранят ссылки на соответствующие объекты. При присваивании, передачи в функцию в качестве аргумента и возвращении из функции в качестве результата копирования объектов не происходит, копируются только ссылки на них.

a = <> — создаем таблицу. В переменную a помещается ссылка на таблицу

b = a — переменная b ссылается на ту же таблицу, что и a

a[1] = 10 — элементу таблицы с индексом 1 присвоено значение 10

Остальные данные являются непосредственными значениями.

Как в Lua получить тип переменной?

Как в Lua преобразовать тип переменной?

Lua при необходимости автоматически преобразует числа в строки и наоборот. Например, если строковое значение является операндом в арифметической операции, оно преобразуется в число. Аналогично числовое значение, встретившееся в том месте, где ожидается строковое, будет преобразовано в строку.

Значение любого типа можно явным образом преобразовать в строку с помощью стандартной функции tostring.

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

Для явного преобразования значения в число можно использовать стандартную функцию tonumber. Если значение является строкой, которую можно преобразовать в число (или уже является числом), функция возвращает результат преобразования, в противном случае возвращает nil.

Расстановка комментариев в Lua

local a = 1 — однострочный комментарий

local a = 1 — [[ многострочный

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

local a = [=[определение некоторой строки [[string]] в языке Lua]=] --[==[

local a = [=[определение некоторой строки [[string]] в языке Lua]=]

Операции, применяемые в Lua

В выражениях, написанных на Lua, могут применяться следующие виды операций:

1. Арифметические операции.

Lua поддерживает следующие арифметические операции:

^ (возведение в степень);

% (остаток от деления).

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

2. Операции сравнения.

В Lua допустимы следующие операции сравнения величин:

= (больше или равно).

Операции сравнения всегда возвращают логическое значение true или false.

3. Логические операции.

К логическим операциям относятся:

and (логическое И).

Операция and возвращает свой первый операнд, если он имеет значение false или nil. В противном случае, операция возвращает второй операнд (причём этот операнд может быть произвольного типа).

a = (nil and 5) — a равно nil

a == (false and 5) — a равно false

a == (4 and 5) — a равно 5

or (логическое ИЛИ).

Операция or возвращает первый операнд, если он не false и не nil, иначе он возвращает второй операнд.

a == (4 or 5) — a равно 4

a == (false or 5) — a равно 5

Логические операции and и or могут возвращать значения любых типов.

Логические операции and и or вычисляют значение второго операнда только в том случае, если его нужно вернуть. Если этого не требуется, второй операнд не вычисляется. Например:

a == (4 or f()) — вызова функции f() не произойдет

not (логическое НЕ).

Операция not всегда возвращает true или false.

4. Операция конкатенации.

Для конкатенации (объединения) строк служит операция… (две точки).

Если один или оба операнда являются числами, выполняется их преобразование в строки.

5. Операция получения длины.

Приоритет операций в Lua

В языке Lua выполнение операций осуществляется в соответствии со следующим приоритетом (в порядке убывания):

Вызов скриптов из форм

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

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

Необходимо отметить, что скрипт формы, хотя и не содержит вызова функции module, фактически является модулем. Это означает, что переменные, объявленные в скрипте формы без ключевого слова local, не выносятся в глобальное окружение и доступны только внутри этого скрипта. Если необходимо сделать какое-либо значение доступным для скриптов других форм, его следует явным образом определить в глобальной таблице _G:

Другой скрипт форм сможет прочитать это значение следующим образом:

Блоки операторов (инструкций)

К основным операторам Lua относятся:

операторы для организации циклов.

Группа операторов может быть объединена в блок (составной оператор) при помощи конструкции do… end.

do — начало блока

end — конец блока

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

a = 5 — глобальная переменная a

local a = 20 — внутри do-end определяется локальная переменная а

MsgBox(a) --> 5 (здесь обращение уже к глобальной a)

Оператор присваивания в Lua

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

a = 1 — переменной a присвоено значение 1

a = b + c — переменной a присвоена сумма значений переменных b и с

a = f(x) — переменной a присвоено значение, возвращённое функцией f(x)

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

a, b = 1, 5*c — a равно 1; b равно 5*c

a, b, c = 1, 2 — a равно 1; b равно 2; c равно nil

a, b = 1, 2, 3 — a равно 1; b равно 2; значение 3 не использовано

Множественное присваивание можно использовать для обмена значениями между переменными:

a = 10; b = 20 — a равно 10, b равно 20

a, b = b, a — теперь a равно 20, b равно 10

Условный оператор (if) в Lua

Оператор if проверяет истинность заданного условия. Если условие является истинным, выполняется часть кода, следующая за ключевым словом then (секция then). В противном случае, выполняется код, следующий за ключевым словом else (секция else).

return a — если a больше b, вернуть a

return b — в противном случае — вернуть b

Секция else является необязательной.

Перед каждой итерацией цикла проверяется условие :

если условие ложно, цикл завершается и управление передаётся первому оператору, следующему за оператором while;

если условие истинно, выполняется тело цикла, после чего все действия повторяются.

while i > 0 do — цикл от 10 до 1

Для выхода из цикла до его завершения можно использовать оператор break.

while i > 0 do — ищем в массиве отрицательное значение

Цикл с постусловием (repeat) в Lua

Оператор repeat предназначен для организации циклов с постусловием и имеет следующий вид:

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

— суммируем значения массива a, пока сумма не превысит 10

Для выхода из цикла до его завершения можно использовать оператор break.

Циклы с оператором for в Lua

Оператор for предназначен для организации циклов и допускает две формы записи:

простую (числовой for);

расширенную (универсальный for).

Простая форма оператора for

Простая форма оператора for имеет следующий вид:

for var = exp1, exp2, exp3 do

Тело цикла выполняется для каждого значения переменной цикла (счётчика) var в интервале от exp1 до exp2, с шагом exp3.

Шаг может не задаваться. В этом случае он принимается равным 1.

for i = 1, 10 do — цикл от 1 до 10 с шагом 1

for i = 10, 1, -1 do — цикл от 10 до 1 с шагом -1

Выражения exp1, exp2 и exp3 вычисляются всего один раз, перед началом цикла. Так, в примере ниже, функция f(x) будет вызвана для вычисления верхнего предела цикла только один раз:

for i = 1, f(x) do — цикл от 1 до значения, возвращенного функцией f()

Переменная цикла является локальной для оператора цикла и по его окончании не определена.

for i = 1, 10 do — цикл от 1 до значения, возвращенного функцией f()

Значение переменной цикла нельзя изменять внутри цикла: последствия такого изменения непредсказуемы.

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