Статья Lua обучение | Community Guide

  • Ich Schlange
  • 🤣Какой еблан уморительно поставил?
  • 275
  • 11
  • 56
by .lua

Урок не принадлежит мне и никогда не принадлежал. Я просто хочу распространить данную информацию.
Прошу не писать сообщения по типу - «Украл», «Не твоё» и т.п!
Данную информацию я взял на форуме который никак не связан с кодингом. И многие точно не видели эту информацию.
Это первый урок и на первом уроке мы просто узнаем, что же такое «Lua».

Lua — это процедурный динамически типизированный модульный язык с автоматическим управлением памятью. Включает базовые элементы для поддержки функционального и объектного стилей программирования. Таким образом, Lua можно называть мультипарадигменным языком. Говоря кратко, это штука, на которой мы будем писать скрипты для Garry's Mod. В историю капать не вижу смысла, нам не это интересно, а важно то, как скачать lua. Вы можете писать программы с помощью текстового документа, но вам следует потом придать тип файла ".lua".
На этом всё, теперь вы знаете о lua, если не знали до этого и имеете возможность писать скрипты на lua. Ожидайте следующих уроков!

1643214233391.png

Урок не принадлежит мне и никогда не принадлежал. Я просто хочу распространить данную информацию.
Прошу не писать сообщения по типу - «Украл», «Не твоё» и т.п!
Данную информацию я взял на форуме который никак не связан с кодингом. И многие точно не видели эту информацию.
Это четвертый урок, сегодня мы узнаем что такое "Условные операторы".


Гугл говорит, что Условные операторы – это специальные конструкции, благодаря которым в программе происходит ветвление в зависимости от условий. Программа принимает логическое решение, выбор, в зависимости от которого выполняет те или иные действия: если так, то идём сюда, если иначе, то сюда. И верно говорит. Скажу так, мы создаём условие, от истинности которого зависит исход действий программы. Сейчас познакомимся с такими командами: if (если); then (тогда); else (иначе); and (и); or (или); end (конец).

Ещё вам надо знать знаки условных операторов:

> больше
>= больше или равно
< меньше
<= меньше или равно
== строго равно
~= не равно

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

a=5
b=6

if a>b then
print(a..'>'..b)
elseif a<b then
print(a..'<'..b)
elseif a=b then
print(a..'='..b)
end
--Вывод: 5<6

Что это за говно? Чел, ты что делаешь со мной, дурачок? Успокойся, дай поясню. Сверху я написал команды и их переводы, но давай напишем более на понятном языке, ок?

a=5
b=6

Если a>b тогда
Печатай(a..'>'..b)
Иначе если a<b тогда
Печатай(a..'<'..b)
Иначе если a=b тогда
Печатай(a..'='..b)
Конец


Так легче? Фишка в том, что если условие, что мы записали после if ложное, то случится то, что будет после команды elseif, но если и там условие будет ложное, то случится то, что в следующем elseif, но если и там не будет, то случится точно то, что в просто else. Вот пример:

a=1

if a>2 then
print(a)
elseif a>3 then
print(a)
else
print('a=1')
end
--Вывод: a=1

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

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

a=2
b=1
if ((a+b)>0) then
c=a+b
elseif ((a+b)<0) then
c=0
end
print(c)
--Вывод: 3

Если в сумма a+b будет больше 0, то значение переменной "c" будет равно 3, но если меньше, то "с" будет равно 0. Всё просто, верно? Верно ведь... гы. Если пошли затупы, сделайте паузу, при желании потом снова прочитайте и попробуйте написать что-то своё. На этом с условными операторами мы заканчиваем. Следующий раздел будет о циклах, но пока я пойду отдохну, позже продолжу писать.

Урок не принадлежит мне и никогда не принадлежал. Я просто хочу распространить данную информацию.
Прошу не писать сообщения по типу - «Украл», «Не твоё» и т.п!
Данную информацию я взял на форуме который никак не связан с кодингом. И многие точно не видели эту информацию.
Это пятый урок, сегодня мы изучим «Циклы»

Цикл со счётчиком — цикл, в котором некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз. Говоря иначе, это штука со счётчиком, что повторяет какое-то действие до того, пока не настанет нужное число в счётчике или не случится какое-то условие, указанное вами. Эту штуку придумали, чтобы мы с вами не писали одно и тоже по сто раз, зачем нам писать одну и ту же хрень, когда есть циклы, верно? Говоря кстати о циклах, их есть три типа: FOR, WHILE, REPEAT-UNTIL. Разберём каждый по порядку.


Цикл FOR:


Пожалуй напишу типичный пример цикла:

a=0

for i = 0, 9, 1 do
a=a+1
end;
print(a)
--Вывод: 10

Для того, чтобы создать цикл, мы написали for, после мы пишем название любой переменной, которая станет нашим счётчиком. Мы присваиваем переменной 3-три значения, 0 и 9, это диапазон, а 1 это число, что будет после каждого конца действий цикла, действия цикла кстати начинаются после команды "do" (рус. перевод Делать) и кончаются после "end", прибавляться к переменной i, тем самым, вот что будет происходить:

Мы указали диапазон от 0 до 9, также указали, что после всех действий, что начинаются с "do", а кончаются на "end" к переменной, что равна 0, будет прибавляться +1. Это всё будет до того, пока действия не повторятся 10 раз. Почему 10, если у нас от 0 до 9? Потому вот как работает:

0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10

C цифры 0 уже i равняется 1, а там пошло поехало, на 9тке сумма будет уже i = 10.
Вы можете с помощью программы выше это понять, ибо переменная a, тоже в самом условии, что и счётчик i, a тоже = 0, тоже к a прибавляется единичка каждый ход цикла, а на выходе имеет a=10, ибо каждый ход цикла к a, что =0+1, а там пошло и поехало. Некоторым это может сейчас сложно, но дальше я покажу ещё способы применения цикла for, надеюсь дальше всё будет понятней.

Вы можете не указывать 3-ее число, а написать просто так:

a=0

for i = 0, 9, do
a=a+1
end;
print(a)
--Вывод: 10

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

a=0

for i = 0, 9, 2 do
a=a+1
end;
print(a)
--Вывод: 5

Сейчас каждый ход цикла к i прибавляется не 1, а двойка. Поэтому в отличии от другой программы, у нас с 0 до 9 в 2 раза быстрее дойдёт i, поэтому из-за меньших количеств ходов, а тем самым и меньшим в два раза количеств действий с a, вы имеем не 10, а 5.

Это можно изобразить ещё вот так:

a=0

for i= 0, 9, 1+1 do
a=a+1
end;
print(a)
--Вывод: 5

1+1 = 2, поэтому к i также будет прибавляться 2, поэтому это копия программы, что выше, просто имеет чуть другой вид.

Счётчик i не всегда равен 0, вы можете дать ему значение 1, 2, 3, короче до дохуя, но если 1 число будет больше второго, то цикл сделает 0 действий, ибо не может i никак стать меньше второго числа, ибо каждый ход цикла +1. Но как не может, в примерах, что выше не может, а вот сейчас я покажу вам как сможет:

a=0

for i = 9, 0, -1 do
a=a+1
end;
print(a)
--Вывод: 10

Дело в том, что в этой программе у нас i = 9, а в итоге должно быть 0, в обычном случае, цикл бы выполнил 0 действий, но мы дали значение 3-ему числу "-1", тем самым, каждых ход цикла i, что равно 9, будет уменьшаться на -1, тем самым, в итоге дойдёт до значения 0, а пока она доходит до этого значения, к a=0, будет прибавляться +1 каждый ход цикла, тем самым мы получим то, что указано в выводе.


Цикл WHILE:


Цикл while выглядит так:

a=10

while a>0 do
print(a..'-1=')
a=a-1
print(a)
end;


--Вывод:
10-1=
9
9-1=
8
8-1=
7
7-1=
6
6-1=
5
5-1=
4
4-1=
3
3-1=
2
2-1=
1
1-1=
0




Данный цикл будет продолжаться до того момента, пока a>0. Как именно a станет равно или меньше 0, решать вам, вы должны это записать после команды do. Если не запишите - цикл будет бесконечным и вас ждёт приколюшка от Garry's Mod, всем советую, стильно, модно, молодёжно. Ну, я думаю смысл цикла понятен, он будет повторять ваши действия до того момента, пока у вас условие, что записано после while и до do, не будет выполнено по итогу.


Цикл REPEAT-UNTIL;


Пример цикла:

a=10

repeat

print(a..'-1=')
a=a-1
print(a)

until a<0


--Вывод:
10-1=
9
9-1=
8
8-1=
7
7-1=
6
6-1=
5
5-1=
4
4-1=
3
3-1=
2
2-1=
1
1-1=
0
0-1=
-1


В чём соль? Цикл будет выполнять сразу первое действие, без всяких условий, но чтобы закончится, ему нужно выполнение условия, что записано в until. Если условие until не будет соблюдаться - то будет бесконечный цикл, а как итог, приколюшка от Garry's Mod. Кто не пробовал - попробуйте, это четко. Я кстати люблю этот цикл, мне нравится его суть, очень удобен в решении многих сложных заданий, которые обычно решаются через массивы (о них позже).

Команда для досрочного окончания цикла: break. Пример:


a=-1
for i = 0, 9 do
if a<0 then break;
end;
end;
print(a)
--Вывод: -1

Я засунул в цикл for условный оператор, при выполнение которого активируется команда break, что выключает цикл. Таким образом, из-за того, что цикл не выполнил никакого действия, мы получаем значение a, что и указали до цикла.

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


Урок не принадлежит мне и никогда не принадлежал. Я просто хочу распространить данную информацию.
Прошу не писать сообщения по типу - «Украл», «Не твоё» и т.п!
Данную информацию я взял на форуме который никак не связан с кодингом. И многие точно не видели эту информацию.
Это шестой урок, сегодня мы изучим «Массивы»

По классике жанра, гуглим понятие. Массивы -это переменные, в которых можно хранить несколько значений, как в контейнере. Таблицы предоставляют вам возможность сопоставлять значения с определенными ключами, например, как словарь сопоставляет определения (значения) с определенными словами (ключами). Знаете, я наверное нарисую картинку в пейнте, чтобы было легче:
tablet.png


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

mass = {'Admin', 'St Admin', 'Gl Admin'}
print(mass[1]) --Вывод: Admin

Чтобы создать массив, надо присвоить переменной данные, что начинаются c "{", а кончаются с "}". В данном случае и запихали в наш массив 3 переменных текстового типа, что вызываются с помощью своего уникального идекса. Индексы в массиве начинаются с [1], как номер первой коробки, и кончаются [N], номер которой последней переменной по индексу в массиве. Чтобы использовать ту или иную коробку в массиве, надо написать название переменной и через [ ] пишем сам номер индекса нужной коробки.

Давайте попробуем теперь с цифрами:

mass = {12, 15, 15, 42, 100}
print(mass[4]) --Вывод: 42

Потому что 4 по индексу идёт число 42. Мы можем сделать кое-что ещё:

mass = {12, 15, 15, 42, 100}
print(mass[1]+mass[2]) --Вывод: 27

Потому что mass[1] = 12, mass[2] = 15, а 12+15 = 27. Всё просто. Только не забывайте, индекса [0 нету], индекс массива начинается всегда с [1]. Такие дела.

Мы можем в самом массиве напрямую создавать цифровую порядочность индексам. Вот так:

mass = {[1]=1, [3]=2, [4]=3}
print(mass[2]) --Вывод: nil

Потому что нету у нас в массиве коробки с номером [2], мы не добавили, создавая свою цифровую порядочность. А вот если так:

mass = {[1]=1, [2]=2, [3]=3}
print(mass[2]) --Вывод: 2

То всё окей, ящик с индексом [2] существует и равен он 2.


Есть такая функция массива "#". Если её применить, то мы можем узнать длину того или иного массива. Сейчас покажу пример:

mass = {'Lox', 'Pidor', 'Hentai', 'Xui'}
a = #mass
print(a) --Вывод: 4

Ответ 4, потому что всего в массиве 4 коробки, индекс данного массива: [1]; [2]; [3]; [4], а используя "#", мы лишь узнали длину массива.

Эту функцию можно использовать так:

mass = {1, 2, 3}
a = mass[#mass]
mass[#mass] = nil
mass[#mass+1] = a
print(a) --Вывод: 3

Мы придали значение переменной a длинны mass, после мы удалили значение длины mass, а после создали новое значение длины, прибавил +1 ящик к последнему и придав значение a, что равнялось 3, а как итог, нечего не изменилось.

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

mass = {'lua', 'urbanichka', 'curator', 'admin'}
n=0
c=0

for i = 0, 3 do
n=n+1
c=mass[n]

if (c== mass[1]) then
print('lua is creator')
elseif (c== mass[2]) then
print('urbanichka is god like')
elseif (c== mass[3]) then
print('curator is Top')
elseif (c== mass[4]) then
print('admin is Top')
end
end

--Вывод:
lua is creator
urbanichka is god like
curator is Top
admin is Top


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

Урок не принадлежит мне и никогда не принадлежал. Я просто хочу распространить данную информацию.
Прошу не писать сообщения по типу - «Украл», «Не твоё» и т.п!
Данную информацию я взял на форуме который никак не связан с кодингом. И многие точно не видели эту информацию.
Это седьмой урок, сегодня мы изучим «Фукнции»

Функция — это группа операторов, которые вместе выполняют задачу. Вы можете разделить ваш код на отдельные функции. Как вы делите свой код между различными функциями, зависит от вас, но логически разделение обычно уникально, поэтому каждая функция выполняет определенную задачу. Скажем так, с помощью функций вы сможете себе ещё максимально облегчить работу. Вы пишите какие-либо действия в функцию, а после сможете написать просто название функции и всё. Всё то, что вы в неё засунули будет запускаться. Для функции надо использовать команду "function (название функции) (типы данных или просто можно оставить пустыми эти скобки)". Вот пример:

local function Yapezdat() --Добавил local впереди, чтобы эта функция не мешала работе других lua файлов
local a = 'I is best male'
if (a=='I is best male') then
print(a)
else
print('I is loser')
end
end

Yapezdat()
--Без написания названия функции после её создания, в консоли вы ничего не получите.

Вывод: I is best male


Урок не принадлежит мне и никогда не принадлежал. Я просто хочу распространить данную информацию.
Прошу не писать сообщения по типу - «Украл», «Не твоё» и т.п!
Данную информацию я взял на форуме который никак не связан с кодингом. И многие точно не видели эту информацию.
Теперь мы переходим к началу работы


Начало работы. Папки.
Обычно мы закидывали все свои lua работы в GarrysMod\garrysmod\lua, но для дальнейших творений, а именно аддонов, надо создавать отдельную папку в GarrysMod\garrysmod\addons . Создайте папку с любым английским названием и погнали.

Обычно в папочке вашего аддона должны лежать ещё различные папочки, к примеру такие:

1) lua -- файлы lua
2) materials -- различные материалы
3) models -- модельки
4) settings -- настройки
5) sound -- аудио
6) weapons -- оружие
7) derma -- о derma позже


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


В папке lua должны лежать 3 папки:

1) autorun
2) client
3) server

В этих папках должны быть такие lua файлы (необязательно всё именно так, не стоит следовать слепо данному шаблону, просто мне так удобнее, вы можете потом по своему попробовать пилить):

1) autorun --> startup.lua
2) client --> clientik.lua
3) server --> serverik.lua


В папке client лежат lua файлы, что по клиенской части, в server лежат lua файлы, что по серверной части. Почему так и в чём их разница? Понимаете, есть понятие "ключки"... а знаете, не, потом отвечу более детально на этот вопрос, на некст теме. А сейчас речь пойдёт о autorun. Что это? Эта залупа загружает на сервер и на клинскую часть игры ваши творчества.

Вот два варианта кода, один из которых должен быть написан в statup.lua:



1 вариант:

if SERVER then --Если у нас игра на сервере, срабатывает то, что ниже
include('server/serverik.lua') --Включает нашу хуйню, что указана по адресу, после запуска сервера
AddCSLuaFile('clientik.lua') --Добавляет на загрузку после захода клиенские примочки, что указаны по адресу
end


if CLIENT then
--Если у нас игра на клиенте (в одиночке тип), то срабатывает

то, что ниже
include('client/clientik.lua') --Включает нашу хуйню, что по адресу.

end

2 вариант (варик для того, чтобы прога скачивала все файлы, а мы не ломали мозги себе, записывал через строчку новые файлы):

Кста, при указании пути, когда мы добавляем после / "*" звезду эту, значит мы всё, что после той папки указываем.

if SERVER then

local files = file.Find( 'serverik/*.lua', ' LUA' ) -- file.Find добавляет файлы нашего пути в переменную files
table.foreach(files, function( key, gui ) -- table.foreach создаёт таблицу, в которой

данные нашего пути переменной files будут
обрабатываться и с помощью function будет
производиться процесс include() включающий нашу залупу
на сервере данного пути.

include( 'server/' .. gui )
end)


local files = file.Find( 'clientik/*.lua', ' LUA' ) -- Тоже самое, но уже будут скачиваться все
клиенские примочки, что мы указали
AddCSLuaFile(files, function( key, gui )
include( 'client/' .. gui )
end)

end

if CLIENT then


local files = file.Find( 'client/*.lua', ' LUA' ) -- Тоже самое, что мы пилили с сервером,
только это уже чисто для клиента.
table.foreach(files, function( key, gui )
include( 'client/' .. gui )
end)

end



Сложно? Думаю для тех, кто впервые подобное изучает для себя и + благодаря тому, что я такой себе новичок-гайдер, будет сложно понять то, что я высрал сверху. Попробую более понятно объяснить своё говно, что сверху. Я создал в autorun файл startup.lua. В нём написал код, что позволяет при заход на сервер или клиент загружать мои luaшки, что лежат либо в server/serverik.lua, либо в client/clientik.lua. Вам я указал 2 варианта такого кода, в котором указаны действия проги, которые происходят после той или иной неизвестной до этой пары строчки. 1 вариант заставляет нас писать по кд одно и тоже, при создании новых lua файлов, 2 вариант сам скачивает всё то, что идёт после указанного нами адреса папки, включая те luaшки, что мы создали ещё в папках. Думаю уже стало чуть легче после моей писанины. Идём дальше. Некст тема ждёт.

Урок не принадлежит мне и никогда не принадлежал. Я просто хочу распространить данную информацию.
Прошу не писать сообщения по типу - «Украл», «Не твоё» и т.п!
Данную информацию я взял на форуме который никак не связан с кодингом. И многие точно не видели эту информацию.

Начало работы. Ключки.
Ключки, ключки, что же это есть такое? В первую очередь, это команды, что входят в библиотеку gmod, введя которые, будут происходить определённые вещи при том или ином условии. Мы используем для кодинга уже созданную игру, в которой уже созданы все необходимые вещи, что нам с вами нужны. Нам не надо встраивать в игру какие-то возможности, создавать для вызова и будущего использования тех или иных возможностей, мы просто используем ключи, что отвечают за возможности в игре. Кхм, а норм вроде сказано, но замудренно. Давайте для начала я укажу вам два сайта, которые вы будете юзать по кд для кодинга, в которых есть все нужным нам ключи:

1) Garry's Mod Wiki - на этом сайте в общем вся инфа, для того чтобы кодить, не только ключки. Здесь есть гайды, готовые примеры для нас, да вообще, можно чисто по нему научится всему в плане кодинга на lua, но если у вас проблема с инглишь, то это будет сложновато, тем более учитывая факт, что вся инфа тут смешена и сложно начинающим понять, за что хвататься, а если и схватили что-то, то материалы сложно изучать, без n знаний, которые вам тоже надо будет там искать, а найдя нужную n базу знаний, там ещё надо будет что-то искать, чтобы понять материал. В общем, при желании всё найдёте, но будет сложно.

2) maurits - это старый сайт, ключи которые не надо использовать, многие уже неактуальны. Для чего же я указал тогда этот сайт? Здесь очень красиво оформлены ключки по разделам, что позволяет нам легко искать нужные ключки, а после вводить их в поисковик на сайте Garry's Mod Wiki и там уже искать инструкцию по тому или иному ключку.

Если вы внимательно посмотрите содержимое сайта maurits, а именно по той ссылке, что я указал, увидите 3 колонки: Server, Shared, Client. Ключки Server работают только на сервере. Ключки Shared робят как на сервере, так и на клиенте. Ключки Client созданы для клиента. Понимаете разницу теперь между Server и Client? Соль в разных ключах. Вообще, на сервере работают Client данные, ибо это визуальная часть, а вот Serverные ключки на клиенте говорят нам: fack you. Вот так вот.

Давайте попробуем что-нибудь сделать с тем или иным ключом.

Пример #1.

Я нашёл на сайте ключик - OnPlayerChat
Безымянный1.png

Скопировал его название и вставил в поисковик сайта Garry's Mod Wiki:
Безымянный2.png

Ниже был пример кода с данным ключиком, поэтому я его скопировал и вставил в свой файл clientik.lua.
После я ввёл в игре в консоль: lua_openscript_cl client/clientik,loa, чтобы мой клиенсткий скрипт начал работать. Ввёл в чат /hello и получил в консоле "Hello World!":
20210613014047_1.jpg

Данный код позволяет нам при вводе команды /hello, получить сообщение в консоль 'Hello World!'. Весь принцип расписан на самом сайте, а мы идём дальше.​
 
  • 12
  • 1
  • 0
Контакты для связи отсутствуют.
Луа классная штука, но для гмодеров, которые кроме копипаста ничего не умеют - тема бесполезна
 
  • 154
  • 21
  • 59
Обучение говно кодингу с малых лет :blobsahegao:
даже в вики не рекомендуют использовать table.foreach, ну вообще осуждаю local a={"ya","gay","exec"}for b=1,#a do print(a)end в раза 3 быстрее будет чем table.foreach({"ya","gay","exec"},function(a,b)print(b)end)
 
Активность
Пока что здесь никого нет
Сверху Снизу