garry s mod lua обучение

Garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

What can Lua do on Gmod? Lua can help you create add-ons like the ones in the workshop. You can use it to control objects in-game, create an admin system, or anything you want, as long as you know how to do it.

If you would like some help with Lua, or any other programming language, come join my server on Guilded, a fellow programmer, or I will help you as much as possible. Do not private message me on Guilded, ask your questions on the programming group, if you do I will ignore it.

Or if your running a server, you can put it in there.

Now you need to enable the console on Garry’s Mod if you already haven’t.

1.) Start Garry’s Mod.
2.) Go to Options.
3.) Go to the Keyboard Tab.
4.) Click the Advanced button.
5.) Check Enabled developer console, then click Okay.
6.) Click Okay again. Now your console will open when you press «

Now, start a game, after that open the console, and you can put lua_openscript fileName.lua to start it server side, to start it client side put lua_openscript_cl fileName.lua in the console. It should run unless you have errors, the errors will appear if that file does not exist, or theres a problem in your lua file.

These will not work if your on someon else’s server, it can be only on your own, unless you have some kind of special access to their server.

What printing does is that it prints to a developer console to post a message, this is basically used to print out errors in the console so developers can fix the issues. But it can also be used for anything. The cool thing is that print(); can take in any variable, bellow i will show you examples.

Printing normal text

Adding variables along with text

Today we will be learning about Variables, now the first thing I need to show you is different Variable Types. Below is an example of all them.

Firstly to make a Variable itself just make a name without spaces, or any special characters, but to replace spaces, use «_» ( Underscore ). Then make an equals sign after that, and make it equal anything that is specified up-top in the Variable Types.

String Variable Rules

In string variables, when you make it equal text, make sure you put quotations around the text, otherwise it doesn’t work. The reason for this is so that the interpreter [en.wikipedia.org] knows it’s not code, but just normal text.

Boolean Variable Rules

In boolean variables they can only equal true, or false. They do not require quotations because they are not normal text.

Number Variable Rules

Now this works for all Number Variable Types, they do not also require quotations because they are not normal text, and they are to be only numbers!

When using variables all you have to do to use them is reference the name, but make sure they are exactly the same! In programming it is «Caps Sensetive», meaning it has to have capitals if the variable has capital letters in it. Same with everything else which we will be learning! When referencing variables it does not need Quotations, otherwise it thinks your writing normal text, but really your trying to use a variable in code.

To add to a variable?

In this we will be learning how to use the If then Statement for making checks in your programs. First of all what is an If Then Else statement? Well they are pieces of code used to check numbers, booleans, and text to do certain things, below is an example of how it works!

Okay so one thing we need to talk about are Semi-Colons, usually you need semi-colons to end a line of code, but if it’s a grouping such as the if then else statement, or methods, etc. then they are not required. Another thing to talk about is how to end groupings ( if then else statement, or methods, etc. ), always when your using groupings you need to end it with «end» otherwise the code will not work properly, and could most likely output errors.

Now in this we will learn how to use else, which is used to do something else if it doesn’t equal.

Now what this does is that if Health does not equal 0 then it puts him as alive. You can also do else if, although the else if is part of the if then up-top it still need another end because its another grouping. below is an example.

Alright so basically what a function is, is it’s a group of code that can be started as many times as you like without re-writing the code multiple times, very suggested that you use this! By the way a method, and a function is the same thing just that in Object-Orientated Programming a method is contained in a class.

Okay so remember how I said that functions are also groupings? Well if you remember, groupings have to have endings just like If Then Statements! What is the parameters in the parentheses? Well in there is what you want to pass, so that the function can use that value. All it really is, is that it’s a variable in those parentheses. An example of how it works should help you!

Why did I reference a function in print? Well the reason I did that is because when you make a function return something shown up-top, it acts like a variable, this is very useful! Go ahead and try this for yourself, it will help give you a better understanding of how it works! Here is another example by the way.

-Output: Hello World!

You don’t need to return anything, this is your choice to do.

Arrays are variables with lists, arrays can be 1-D, 2-D, or 3-D. 1-D Arrays mean they only have 1 list, 2-D Arrays have more than 2 lists, 3-D Arrays are just cluster ♥♥♥♥♥, quite literally most people get stuck at this point because it’s hard to think about. Anyways just think of a 3-D graph as for a 3-D Array. Heres how it’s setup.

Really confusing huh? I know how you felt when I first started. Anyways to get the values, you need to label the index for example.

Okay so heres something important you need to know, try to lessen the use of while loops, they can be a problem! Usualy while loops are to loop unless an arguement returns the opposite in the arguemnts, I’ll show you an example!

Now this while loop will loop forever because true is true. Here will be another example of toggling loops.

This will loop constantly until Tof is false.

For loops are the most common used loop. Mostly they are used to get every individual index in an Array, which you will learn how later. Here is example of how it works.

Okay so here is how it works, i = 1 is the starting value, 10 is the max number it will go to, 1 is how many it will add or subtract to the i variable. Now here is an example how to work it with arrays in 2 different ways.

-Output:
1: Aaron
2: Denis
3: Dave
4: Cherell

Here is another way.

-Output:
1: Aaron
2: Denis
3: Dave
4: Cherell

Источник

Garry s mod lua обучение

garry s mod lua обучение

На протяжении около одного года я занимался реализацией проекта гейммода для GMod, однако в связи с техническими проблемами обработки 3D моделей движком Source (я использовал неоригинальные для Source модели, а конвертированные из Gamebryo), он не был завершён. Когда я начинал эту деятельность, я не был осведомлён ни о том, как Source обрабатывает 3D модели, ни о том, что такое движок или гейммод вообще. В связи с тем что разработка гейммода закончилась ничем, я бы хотел поделиться полученными мной в процессе разработки знаниями с теми, кто был бы заинтересован в создании аддонов и гейммодов.

Данный курс позволит с нуля освоить программирование на Lua в целом и на GLua в частности, теорию функционирования Source и Garry’s Mod, что позволит создавать любые аддоны и гейммоды в рамках возможностей движка по желанию прошедшего курс.

Лекции будут публиковать по мере написания не реже одного раза в неделю за исключением лекций 8 и 9. Каждая лекция состоит из общей теории, теории применения в Lua и GLua, примеров, заданий. Вы можете задать в комментариях любые вопросы относительно контента лекции.

То, что я сделал с помощью GLua, вы можете увидеть по ссылке: https://www.youtube.com/watch?v=NxVDBptT2to.

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

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

garry s mod lua обучение

Все 3D классы в Соурс наследуются, то есть копируют свойства, или от класса Brush Entity или от класса Point Entity. Разница между ними заключается в первую очередь в том, что Brush Entity используют примитивную геометрию, создаваемую напрямую в Hammer, а Point Entities используют сложную модель, создаваемую в 3D редакторе типа 3ds Max или Blender.

Все написанное выше имеет отношение к исходному коду на C++, однако также актуально и для скриптов Lua. Важно уточнить, что с помощью скрипта Lua нельзя получить доступ к любому классу, но при этом все классы существуют в GMod и действуют в соответствие со своими свойствами. Классы C++ представлены в Lua типом данных UserData.

Получение доступа к классу C++ в скрипте Lua:
Локальной переменной присваивается значение, возвращаемое функцией FindMetaTable, которой в качестве первого аргумента передаётся имя класса в формате строки.

Если открыть Valve Developer Community, то выяснится, что классов, как Brush Entity, так и Point Entity, десятки, а то и сотни. Однако, как я уже сказал, изменить каждый с помощью скрипта Lua нельзя. Получить доступ можно к следующим классам: Entity, Player, Weapon, NPC, Vehicle, CSEnt, NextBot. Рассмотрим каждый из них подробнее.

Создание объекта:
Локальной переменной PropPhysics присваивается значение, возвращаемое функцией ents.Create, которой в качестве первого аргумента передаётся имя класса в формате строки. Объект создан, однако он ещё не находится в игре. Он не помещается туда автоматически, чтобы программа могла предварительно настроить его. В данном случае для настройки используется функция SetModel, применяемая к созданному объекту, где в качестве первого аргумента передаётся путь до модели в формате строки. Можно применять любые другие функции, доступные для объекта, чтобы настроить его перед добавлением в игру. Однако, известно, что prop_physics удалит сам себя, если будет добавлен в игру без модели. Так что выставив модель, можно добавить объект класса prop_physics в игру, применив к нему функцию Spawn.

Удаление объекта:
К переменной, где сохранена ссылка на объект, применяется функция Remove, после которой объект удаляется, как из игры, так и из поток вообще. Получить к нему доступ никаким способом больше нельзя: его не существует.

Создать объект легко, однако что если нужно изменить свойства или удалить объект, который был создан в другом месте, и локальной переменной, содержащей ссылку на него, нет? Как вообще отличить один объект от другого? Конечно, можно сравнить все свойства всех объектов, но такой способ сложно назвать оптимальным. На этот случай все объекты имеют уникальные индексы.

Получение индекса объекта:
Имея переменную с ссылкой на объект, к ней применяется функция EntIndex, которая возвращает индекс объекта в формате номер.

Получение объекта по индексу:
Имея переменную с индексом объекта, она передаётся в качестве первого аргумента в функцию ents.GetByIndex, которая возвращает по первому аргументу ссылку на объект.

Важно уточнить, что создавать объекты стоит или по именам, определённым на C++, или по именам, определённым на Lua в процессе создания новых классов энтити. То есть, создать объекта класса Entity невозможно.

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

В первом случае нам необходимо получить объект GM. Если мы создаём гейммод, то он будет по умолчанию доступен в файлах init.lua, shared.lua и cl_init.lua. Нам достаточно просто в одном из них (в зависимости от контекста ивента) переопределить его функцию. Например:

Мы переопределяем функцию PlayerDisconnected в классе GM, добавляя туда то, что нам нужно, и автоматически удаляя всё, что там было до этого.

Во втором случае объект GM не требуется, но и мы не сможем полностью переопределить ивент (за исключением случаев, когда это было задумано создателем ивента через возвращение значения), только добавить к нему свои действия. Функция, добавляемая к ивенту, называется хук, а для её добавления используется библиотека hook. Например:

Мы также можем и сами создать новый ивент с помощью библиотеки hook. Это делается так:

В первом разделе мы выяснили, как получить доступ к классу. Получим доступ к классу Entity, который является родительским по отношению ко всем последующим, то есть все они содержат те же свойства, что и Entity. Изменения, внесённые в любые переменные или функции в классе Entity, коснутся всех объектов класса Entity и дочерних классов, если в дочерних классах не содержатся изменения тех же переменных и функций.

Источник

Garry s mod lua обучение

garry s mod lua обучение

Набор условных операторов и циклов довольно типичен:
Код на Lua:
— условные операторы (ветки else может не быть)
if a == 0 then
print(«a is zero»)
else
print(«a is not zero»)
end

— сокращенная форма if/elseif/end (вместо switch/case)
if a == 0 then
print(«zero»)
elseif a == 1 then
print(«one»)
elseif a == 2 then
print(«two»)
else
print(«other»)
end

— цикл со счетчиком
for i = 1, 10 do
print(i)
end

— цикл с постусловием
repeat
b = b + 1
until b >= 5

В выражениях можно использовать такие вот операторы над переменными:

= (не-равно, да-да, вместо привычного «!=»)
* конкатенация строк (оператор «..»), напр.: s1=»hello»; s2=»world»; s3=s1..s2
* длина/размер (оператор #): s=»hello»; a = #s (‘a’ будет равно 5).
* получение элемента по индексу, напр.: s[2]

Битовых операций в языке долгое время не было, но в версии 5.2 появилась библиотека bit32, которая их реализует (как функции, не как операторы).

garry s mod lua обучение

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

* nil (ровным счетом ничего)
* булевы числа (true/false)
* числа (numbers) — без деления на целые/вещественные. Просто числа.
* строки — кстати, они очень похожи на строки в паскале
* функции — да, переменная может быть типа «функция»
* поток (thread)
* произвольные данные (userdata)
* таблица (table)

Если с первыми типами все понятно, то что же такое userdata? Вспомним о том, что Lua — язык встраиваемый, и обычно тесно работает с компонентами программ, написанными на других языках. Так вот, эти «чужие» компоненты могут создавать данные под свои нужды и хранить эти данные вместе с lua-объектами. Так вот, userdata — и есть подводная часть айсберга, которая с точки зрения языка lua не нужна, но и просто не обращать внимания на нее мы не можем.

А теперь самое важное в языке — таблицы.

garry s mod lua обучение

Я вам снова соврал, когда сказал, что у языка 8 типов данных. Можете считать что он один: всё — это таблицы (это, кстати, тоже неправда). Таблица — это очень изящная структура данных, она сочетает в себе свойства массива, хэш-таблицы («ключ»-«значение»), структуры, объекта.

Код на Lua:
— Итак, вот пример таблицы как массива:
a = <1, 2, 3>— массив из 3-х элементов
print(a[2]) — выведет «2», потому что индесы считаются с единицы
— А таблица в виде разреженного массива (у которого есть не все элементы)
a = <> — пустая таблица
a[1] = 1
a[3] = 5

ПОДУМАЙТЕ: чему равно a[2] в случае разреженного массива?

В примере выше таблица ведет себя как массив, но на самом деле — у нас ведь есть ключи (индексы) и значения (элементы массива). И при этом ключами могут быть какие угодно типы, не только числа:

Код на Lua:
a = <>
a[«hello»] = true
a[«world»] = false
a[true] = 1
— или так:
a = <
hello = 123,
world = 456
>
print(a[«hello»])
print(a.hello) — то же самое, что и a[«hello»], хотя выглядит как структура с полями

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

Код на Lua:
t = <
a = 3,
b = 4
>
for key, value in pairs(t) do
print(key, value) — выведет «a 3», потом «b 4»
end

А как же объекты? О них мы узнаем чуть позже, вначале — о функциях.

garry s mod lua обучение

Вот пример обычной функции.
Код на Lua:
function add(a, b)
return a + b
end

print(add(5, 3)) — напечатает «8»

Функции языка позволяют принимать несколько аргументов, и возвращать несколько аргументов. Так аргументы, значения которых не указаны явно, считаются равными nil.

ПОДУМАЙТЕ: зачем может понадобиться возвращать несколько аргументов?

Код на Lua:
function swap(a, b)
return b, a
end

Функции могут принимать переменное количество аргументов:
Код на Lua:
— в прототипе переменное число аргументов записывается как троеточие
function sum(. )
s = 0
for _, n in pairs(arg) do — в функции обращаются к ним, как к таблице «arg»
s = s + n
end
return a
end

sum(1, 2, 3) — вернет 6
sum(1, 2, 3, 4) — вернет 10

Поскольку функции — это полноценный тип данных, то можно создавать переменные-функции, а можно передавать функции как аргументы других функций
Код на Lua:
a = function(x) return x * 2 end — функция, умножающая на 2
b = function(x) return x + 1 end — функция, увеличивающая на 1

function apply(table, f)
result = <>
for k, v in pairs(table) do
result[k] = f(v) — заменяем элемент на какую-то функцию от этого элемента
end
end

— ПОДУМАЙТЕ: что вернут вызовы
t = <1, 3, 5>
apply(t, a)
apply(t, b)

garry s mod lua обучение

Объекты = функции + таблицы

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

Перейдем к примерам. Есть у нас объект, скажем, лампочка. Она умеет гореть и не гореть. Ну а действия с ней можно сделать два — включить и выключить:
Код на Lua:
lamp = <
on = false
>

function turn_on(l)
l.on = true
end

function turn_off(l)
l.on = false
end

— это просто функции для работы со структурой
turn_on(lamp)
turn_off(lamp)
А если лампочку сделать объектом, и функции turn_off и turn_on сделать полями объекта, то получится:

Код на Lua:
lamp = <
on = false
turn_on = function(l) l.on = true end
turn_off = function(l) l.on = false end
>
lamp.turn_on(lamp)
lamp.turn_off(lamp)
Мы вынуждены передавать сам объект лампочки в качестве первого аргумента, потому что иначе наша функция не узнает с какой именно лампочкой надо работать, чтобы сменить состояние on/off. Но чтобы не быть многословными, в Lua есть сокращенная запись, которую обычно и используют — lamp:turn_on(). Итого, мы уже знаем несколько таких упрощений синтаксиса:
Код на Lua:
lamp:turn_on() — самая общепринятая запись
lamp.turn_on(lamp) — то с точки зрения синтаксиса это тоже правильно
lamp[«turn_on»](lamp) — и это
Продолжая говорить о сокращениях, функции можно описывать не только явно, как поля структуры, но и в более удобной форме:

Код на Lua:
lamp = <
on = false
>

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *