Приветствую Вас Гость | RSSГлавная | Программирование на Lua для чайников - Форум | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Статьи » Учебник по Lua » Программирование на Lua для чайников (Перевод: Программист/ximximik)
Программирование на Lua для чайников
ПрограммистДата: Среда, 31.03.2010, 21:14 | Сообщение # 1
Рейстлин Маджере
Группа: Проверенные
Сообщений: 276
Награды: 24  +
Репутация:  ±
Замечания:  ±
Статус: Offline
___________________________________________

-- 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 = <путь к файлу Lua>" в блоке кода объекта с соответствующим табулированием.

________________________

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

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

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

Code

-- Это коменнтарий


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

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

Code

--Числа
1234

--Текст
"text"

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

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

--Ноль (ничто)
nil


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

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

Code

X = 5


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

Code

X = 2


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

Code

A = 5
X = A


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

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

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

Code

local varA = 5
local varB = varA


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

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

Code

thing.GetsHitByMOs = false


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

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

Code

self.GetsHitByMOs = false


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

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

Code

if X == 1 then
<содержимое>
end


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

Code

-- равно
==

-- неравно
~=

-- меньше
<

-- больше
>

-- меньше или равно
<=

-- больше или равно
>=


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

Code

if X == 1 then
<содержимое>
else
<содержимое>
end


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

Code

if X == 1 then
<содержимое>
elseif X == 2 then
<содержимое>
end


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

--- 2.5 Таблицы ---

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

Code

thelist = {}


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

Code

thelist[1] = 1234
thelist[2] = 37065


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

Code

numbercheck = #thelist


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

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

Code

-- Очистка всего списка
thelist = {}

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


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

Code

thelist = {}
local thesecondlist = {}


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

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

for <переменная> = <начальное число>, <число как много раз совершать действия> do

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

Code

for i = 1, 5 do
<содержимое>
end


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

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

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

5
- Кол-во повторений "<содержимого>".

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

Code

for i = 1, 5 do
         if i == 3 then
          break
         end
end


________________________

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

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

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

Code

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

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

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


--- 3.2 Функции ---

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

Code

anactor:AddImpulseForce(Vector(0,-10),Vector(0,0))


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

Code

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

Arguments:       

       - 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.

Return value:       

None.       


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

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

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

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

Code

function Update(self)

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

end


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

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

Code

-- Указатель устройств
for item in MovableMan.Items do
end


Code

-- Указатель частиц
for particle in MovableMan.Particles do
end


________________________

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

Это - ссылка на раздел Cortex Command wiki, который содержит документацию для многих функций и свойств.
http://wiki.datarealms.com/wiki/index.php/LuaDocs/Index

________________________

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

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

Code

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

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

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

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

-- GibThis() - это функция, которая делает целенаправленную разрушение объекта.
             self:GibThis()

-- Остановка оператора
             break

-- Конец оператора "if".
            end

-- Конец оператора "for".
         end

-- Конец "function Update(self)".
end


Я мертв :)

Сообщение отредактировал Программист - Среда, 19.05.2010, 12:50
 
USSДата: Четверг, 15.04.2010, 19:27 | Сообщение # 2
Тень в ночи
Группа: Проверенные
Сообщений: 46
Награды: 6  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Я не нашел какойлибо faq темы по луа и по скриптингу, по сему пишу сюда, ибо в луа чайник пока что.

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

Так вот, какиб образом будут взаимодействовать прикрепленные гибы? Просто болтаться?

 
Mad_AlexДата: Четверг, 15.04.2010, 19:45 | Сообщение # 3
Печальный Скнюссик
Группа: Главный Администратор
Сообщений: 2004
Награды: 38  +
Репутация:  ±
Замечания:  ±
Статус: Offline
USS, а теперь конкретнее про функции. Название функции в первую очередь и ссылку на источник.

С вопросами, в том числе касающимися моддинга, пишите мне в личные сообщения. Они должны дойти до меня, даже если я не часто захожу на сам сайт.
А вообще можете связаться со мной через VK: https://vk.com/dizzybat
Там я, возможно, отвечу чуть быстрее.
 
USSДата: Четверг, 15.04.2010, 19:59 | Сообщение # 4
Тень в ночи
Группа: Проверенные
Сообщений: 46
Награды: 6  +
Репутация:  ±
Замечания:  ±
Статус: Offline
хм, да, я ступил. Ф-ций для аттача нет, только для детача, тоесть для отделения.
А куда можно задать вопросы о структуре объектов вообще, о том, каким образом определяется движение, и какие части двигаются в опр. момент? В общем, где можно поспрашать о создании фигур.
 
ПрограммистДата: Четверг, 15.04.2010, 21:01 | Сообщение # 5
Рейстлин Маджере
Группа: Проверенные
Сообщений: 276
Награды: 24  +
Репутация:  ±
Замечания:  ±
Статус: Offline
USS, Создай тему в Помощь новичкам от ветеранов, с нужным вопросом. И не забудь дать нормальное название.

Я мертв :)
 
RICARDOДата: Пятница, 16.04.2010, 20:52 | Сообщение # 6
Lt.Ricardo
Группа: Проверенные
Сообщений: 577
Награды: 31  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Темка понравилась. Ням-ням happy


Lt.Ricardo's Blog
 
repeatДата: Суббота, 17.04.2010, 08:20 | Сообщение # 7
Краб
Группа: Проверенные
Сообщений: 24
Награды: 4  +
Репутация:  ±
Замечания:  ±
Статус: Offline
помимо темы не плохо было бы вам висеть на IRC канале, для оперативной беседы wink

моё - http://pereulok.net.ru/
 
ПрограммистДата: Среда, 19.05.2010, 12:51 | Сообщение # 8
Рейстлин Маджере
Группа: Проверенные
Сообщений: 276
Награды: 24  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Добавил эту статью в Вики

Я мертв :)
 
Mad_AlexДата: Среда, 19.05.2010, 12:53 | Сообщение # 9
Печальный Скнюссик
Группа: Главный Администратор
Сообщений: 2004
Награды: 38  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Программист, смысл вообще в этой твоей вики? Может лучше будем статьи писать?

С вопросами, в том числе касающимися моддинга, пишите мне в личные сообщения. Они должны дойти до меня, даже если я не часто захожу на сам сайт.
А вообще можете связаться со мной через VK: https://vk.com/dizzybat
Там я, возможно, отвечу чуть быстрее.
 
ПрограммистДата: Среда, 19.05.2010, 12:58 | Сообщение # 10
Рейстлин Маджере
Группа: Проверенные
Сообщений: 276
Награды: 24  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Смысл в более удобном пользовании и в катологозировании команд луа. Там несколько туториалов уже есть. И я хочу перенести остальные статьи, которые не планируется переписывать, туда. Там интерфейс больше возможностей для оформления имеет

Я мертв :)
 
ALFAДата: Понедельник, 18.07.2011, 14:58 | Сообщение # 11
Краб
Группа: Проверенные
Сообщений: 55
Награды: 3  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Каким кодом можно присоединить пуху к актору(что бы вместо рук пуха).



Сообщение отредактировал ALFA - Вторник, 26.07.2011, 00:08
 
zoidbergДата: Понедельник, 18.07.2011, 15:13 | Сообщение # 12
Манекен
Группа: Проверенные
Сообщений: 256
Награды: 2  +
Репутация:  ±
Замечания:  ±
Статус: Offline
пуха к актору добавляется через инвентарь, а двигатель к крабу через джетпак

hey, i've just killed someone with the rock!
 
TosenДата: Суббота, 01.10.2011, 07:29 | Сообщение # 13
Краб
Группа: Проверенные
Сообщений: 5
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Программист, Я нечего не понял в Cortex Command Lua Scripting Tutorial помоги плиззз.
cry


⎲⎷⎛⎝⎝⏠⏝⏠⎠⎷⎛⎝⎲
 
WormctorДата: Воскресенье, 29.07.2012, 09:55 | Сообщение # 14
Краб
Группа: Проверенные
Сообщений: 7
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Простите если не туда пишу, но нужна помощь. Я создал актора и прикрепил к его плечу тупель через луа, но она находиться на заднем плане(за туловищем), а мне надо что бы была на переднем. Какой командой можно перенести ее на передний?
 
Deden009Дата: Суббота, 26.01.2013, 23:23 | Сообщение # 15
Краб
Группа: Проверенные
Сообщений: 1
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
WORMCTOR, для того., чтобы изображение было поверх другого, надо в коде поставить его поверх другого при распаковке. ВОТ ПРИМЕР КОДА

gun=Image.load("gun.png")

telo=Image.load("telo.png")
 
PhoenixДата: Четверг, 13.06.2013, 01:13 | Сообщение # 16
Краб
Группа: Пользователи
Сообщений: 2
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
А как в lua организовать двойное условие? К примеру, в игре, что бы открыть дверь, необходимо два условия: например иметь в инвентаре redgem и что бы глобальная переменная была равна 1 . Я пробовал так:
if player:contains (redgem) and x = 1 then
print "бла-бла-бла"
else
print "бла-бла-бла"
end
Что я делаю не так? И как сделать правильно? Заранее благодарен.


Сообщение отредактировал Phoenix - Четверг, 13.06.2013, 01:28
 
Mad_AlexДата: Четверг, 13.06.2013, 13:44 | Сообщение # 17
Печальный Скнюссик
Группа: Главный Администратор
Сообщений: 2004
Награды: 38  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Все правильно (предполагая, что функция contains() существует). Ошибки интерпретатор не выдает?

С вопросами, в том числе касающимися моддинга, пишите мне в личные сообщения. Они должны дойти до меня, даже если я не часто захожу на сам сайт.
А вообще можете связаться со мной через VK: https://vk.com/dizzybat
Там я, возможно, отвечу чуть быстрее.
 
PhoenixДата: Четверг, 13.06.2013, 14:32 | Сообщение # 18
Краб
Группа: Пользователи
Сообщений: 2
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
В том то и дело, ошибка возникает при добавлении and x = 1 (то есть при условии if player:contains() then программа работает)  
Вот текст ошибки:
`then' expected near `='

Добавлено (13.06.2013, 14:32)
---------------------------------------------
Теперь понял в чём была проблема: в lua для обозначения "равно" используются два символа =. 
То есть:
if player:contains () and x == 1 then 
Вот так вроде правильно.

 
Mad_AlexДата: Четверг, 13.06.2013, 17:04 | Сообщение # 19
Печальный Скнюссик
Группа: Главный Администратор
Сообщений: 2004
Награды: 38  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Да, "=" — оператор присваивания, "==" — оператор сравнения. Сначала не обратил на это внимания.

С вопросами, в том числе касающимися моддинга, пишите мне в личные сообщения. Они должны дойти до меня, даже если я не часто захожу на сам сайт.
А вообще можете связаться со мной через VK: https://vk.com/dizzybat
Там я, возможно, отвечу чуть быстрее.
 
Oxotni14Дата: Воскресенье, 06.04.2014, 21:19 | Сообщение # 20
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Mad_Alex, можешь мне подправить грамматику в луа , я в нем не силен.
Цитата
function Create(self)
self.killdist = 50;
end

function Update(self)
if math.random() <= .03 then
local part = CreateMOPixel("Spark Green");
part.Pos = self.Pos + Vector(math.random(-5,5), math.random(-15,5));
MovableMan:AddParticle(part);
for actor in MovableMan.Actors do//все последующие строчки до local curdist;
if actor.PresetName == "Browncoat Light" then
if actor.PresetName == "Browncoat Heavy" then
if actor.PresetName == "Skeleton" then
if actor.PresetName == "Thin Culled Clone" then
if actor.PresetName == "Zombie Thin Walk Path" then
if actor.PresetName == "Fat Culled Clone" then
if actor.PresetName == "Jumper" then
if actor.PresetName == "Green Clone" then
if actor.PresetName == "Blue Clone" then
if actor.PresetName == "Brain Case" then
if actor.PresetName == "Brain Robot" then
if actor.PresetName == "Soldier Light" then
if actor.PresetName == "Soldier Heavy" then
local curdist;
curdist = math.sqrt(math.pow(self.Pos.X - actor.Pos.X,2) + math.pow(self.Pos.Y - actor.Pos.Y,2))
if curdist <= self.killdist and actor:IsInGroup("Tiberium") == false then
if actor.ClassName ~= "ACraft" then
actor.Health = actor.Health - 20
else
actor.Health = actor.Health - 2
end
local i = 0;
while i <= 2 do
local part = CreateMOPixel("Spark Green");
part.Pos = actor.Pos + Vector(math.random(-15,15), math.random(-15,15));
MovableMan:AddParticle(part);
i = i + 1;
end
local part = CreateMOPixel("Spark Green Glow");
part.Pos = actor.Pos + Vector(math.random(-15,15), math.random(-15,15));
MovableMan:AddParticle(part);
end
if actor.Health <= 30 and actor.Health > 0 and curdist <= self.killdist then
actor.Health = -10;
local part = CreateMOSRotating("Tiberium Debris Mini");
part.Pos = actor.Pos + Vector(math.random(-35,35), math.random(-10,0));
part.Vel = Vector(0,-15);
MovableMan:AddParticle(part);
end
end
end
end



Сама лень с вами.

Сообщение отредактировал Oxotni14 - Воскресенье, 06.04.2014, 21:22
 
BlumpДата: Воскресенье, 06.04.2014, 21:29 | Сообщение # 21
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, я конечно не Мэд, но оказался тут по воле случая. Знаешь, что такое "ИЛИ"? Нельзя подряд писать "if...then". Просто объедени в одно. Типо. "if...or...then".
Хм, это ведь всё можно было одной фразой заменить
Код
actor.ClassName == "AHuman"


Что ты хочешь изменить в коде тиберия?


Моддинг - это сезонное. По крайней мере, у меня...

Сообщение отредактировал Blump - Воскресенье, 06.04.2014, 21:48
 
Oxotni14Дата: Понедельник, 07.04.2014, 07:26 | Сообщение # 22
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Blump, Мне просто нужно чтоб урон наносился только людям как в оригинале, а не всем в подряд.

Сама лень с вами.

Сообщение отредактировал Oxotni14 - Понедельник, 07.04.2014, 07:26
 
BlumpДата: Понедельник, 07.04.2014, 15:03 | Сообщение # 23
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, вмысле, только органическим АХьюманам (двуногим)?
Тогда, тебе нужно использовать то, что я предложил в предыдущем сообщении.
И, ещё кое-что. Изучай разные коды. Смотри, как они устроены.
Если скрипт не пойдёт, не спеши закрывать игру. Открой консольку и почитай, что он написал. КК обычно пишет, в чём ошибка


Моддинг - это сезонное. По крайней мере, у меня...

Сообщение отредактировал Blump - Понедельник, 07.04.2014, 15:34
 
puksusДата: Понедельник, 07.04.2014, 15:35 | Сообщение # 24
Пукс
Группа: Модераторы
Сообщений: 931
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
здесь пахнет массивом.
Цитата
if actor.PresetName == "Zombie Thin Walk Path" then

чиво?


Сообщение отредактировал puksus - Понедельник, 07.04.2014, 15:39
 
BlumpДата: Понедельник, 07.04.2014, 15:41 | Сообщение # 25
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
puksus, я тоже заметил). Похоже, он скопировал это в попыхах.

Моддинг - это сезонное. По крайней мере, у меня...
 
Oxotni14Дата: Вторник, 08.04.2014, 18:53 | Сообщение # 26
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
А, что если хуманов разделить в луа коде на роботов и органику, а потом на легких, средних, тяжелых. (создав еще 5 "одинаковых" файлов с луа)

Сама лень с вами.

Сообщение отредактировал Oxotni14 - Вторник, 08.04.2014, 18:54
 
BlumpДата: Вторник, 08.04.2014, 20:09 | Сообщение # 27
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, зачем лишние файлы. Тем более, к одному объекту нельзя несколько скриптов прикреплять. Попрактикуешься, поймёшь, что можно просто соединять коды.
Вот, очень полезная строка.
Код
if ( (string.find(actor.PresetName,"Ronin") ~= nil) or (string.find(actor.PresetName,"Soldier") ~= nil) ... ) ... then
Эта строчка проверяет наличие данных слов в названии актора. Например, если актор будет ронином или каким-нибудь soldier'ом, то действие далее будет выполняться. Многоточия не копируй, я отметил места для последующей записи аргументов, если она требуется. Пользуйся на здоровье!)
Вопросы?


Моддинг - это сезонное. По крайней мере, у меня...
 
Oxotni14Дата: Вторник, 08.04.2014, 20:16 | Сообщение # 28
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
 
Цитата
зачем лишние файлы. Тем более, к одному объекту нельзя несколько скриптов прикреплять.
Я пробовал варианты решения, но сделал только стелса для других акторов т.к. они видят только замеченых акторов или про писаных в их луа. а чтобы споров в скриптах не было я их названия у акторов по заменял.


Сама лень с вами.

Сообщение отредактировал Oxotni14 - Вторник, 08.04.2014, 20:17
 
BlumpДата: Вторник, 08.04.2014, 20:19 | Сообщение # 29
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, можно было просто в ини поставить HitsMos и GetHitByMos - 0. Тогда бы они вообще для всех были бы невидимы + пулепроницаемы и вообще всё, кроме земли, проницаемы.
Ппоробуй, то что я тебе предложил.


Моддинг - это сезонное. По крайней мере, у меня...
 
Oxotni14Дата: Вторник, 08.04.2014, 20:25 | Сообщение # 30
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Все теперь разобрался в чем проблема.

Сама лень с вами.
 
BlumpДата: Вторник, 08.04.2014, 20:57 | Сообщение # 31
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, чегоо? Как равны нулю? Ты про ~= nil?

Моддинг - это сезонное. По крайней мере, у меня...
 
Oxotni14Дата: Вторник, 08.04.2014, 21:02 | Сообщение # 32
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
HitsMos и GetHitByMos - 0 про эти

Сама лень с вами.
 
BlumpДата: Вторник, 08.04.2014, 21:04 | Сообщение # 33
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, чувак, не смеши. Даже у частей акторов? Ты пролазил в ини файлы каждого актора и всё там изменил?)

Моддинг - это сезонное. По крайней мере, у меня...
 
Oxotni14Дата: Вторник, 08.04.2014, 21:08 | Сообщение # 34
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Blump, соритам 50 на 50 было я штуки 2-3 в подряд увидел потом промотал и также аж удивился

Сама лень с вами.
 
Oxotni14Дата: Вторник, 08.04.2014, 21:11 | Сообщение # 35
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Ну все пора с луа завязывать,а то теперь тиберий вообще не убивает ни кого.

Сама лень с вами.
 
BlumpДата: Вторник, 08.04.2014, 21:15 | Сообщение # 36
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Цитата
Ну все пора с луа завязывать

Так быстро сдался?)


Моддинг - это сезонное. По крайней мере, у меня...
 
Oxotni14Дата: Вторник, 08.04.2014, 21:17 | Сообщение # 37
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Я в луа скриптах тиберия прописал наемников, но прикол в том что умирать перестали все, а не только они.

Сама лень с вами.
 
BlumpДата: Вторник, 08.04.2014, 21:23 | Сообщение # 38
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, ты не сломаешь игру, если не будешь копаться в ини файлах в Base.rte (если ты собрался что-то менять, и у тебя это не получится).
А язык луа на самом деле очень крутой. Ну, в некоторых ситуациях.


Моддинг - это сезонное. По крайней мере, у меня...
 
Mad_AlexДата: Вторник, 08.04.2014, 21:58 | Сообщение # 39
Печальный Скнюссик
Группа: Главный Администратор
Сообщений: 2004
Награды: 38  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, за последующий мультипостинг буду карать. Используй кнопку "редактировать".

С вопросами, в том числе касающимися моддинга, пишите мне в личные сообщения. Они должны дойти до меня, даже если я не часто захожу на сам сайт.
А вообще можете связаться со мной через VK: https://vk.com/dizzybat
Там я, возможно, отвечу чуть быстрее.
 
Oxotni14Дата: Вторник, 08.04.2014, 22:10 | Сообщение # 40
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Mad_Alex,  Жаль что нет кнопки "удалить коментарий". Более такое не повторится.

Сама лень с вами.

Сообщение отредактировал Oxotni14 - Вторник, 08.04.2014, 22:11
 
Oxotni14Дата: Вторник, 08.04.2014, 22:23 | Сообщение # 41
Краб
Группа: Проверенные
Сообщений: 42
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Blump, не нашел. омг тупанул)

Сама лень с вами.

Сообщение отредактировал Oxotni14 - Вторник, 08.04.2014, 22:24
 
BlumpДата: Вторник, 08.04.2014, 22:26 | Сообщение # 42
Коалиция
Группа: Проверенные
Сообщений: 767
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Oxotni14, теперь, удаляем всё...

Моддинг - это сезонное. По крайней мере, у меня...
 
puksusДата: Четверг, 10.04.2014, 15:38 | Сообщение # 43
Пукс
Группа: Модераторы
Сообщений: 931
Награды: 0  +
Репутация:  ±
Замечания:  ±
Статус: Offline
Цитата Oxotni14 ()
Жаль что нет кнопки "удалить коментарий"

есть
 
Форум » Статьи » Учебник по Lua » Программирование на Lua для чайников (Перевод: Программист/ximximik)
Страница 1 из 11
Поиск:
Статистика Форума
Последние темы Читаемые темы Последние зарегистрированные пользователи
Компания ронинов Escape - v.1.2.3 {B32} [Xterian]

AK 47 | Redline [Xterian]

Imperial Lost [Xterian]

Комиксы по моду Imperial Lost [Xterian]

Выход 24 билда. [Xterian]

23 Билд [Xterian]

Coalition Heavy Mount Turret [Xterian]

BAW [Xterian]

Подразделение Анти Зомби [Xterian]

Happy New Year [Xterian]

[1]>Флудильня! [5131]

[2]>Свалка арта. [879]

[3]>Фан-арт по Cortex Command [386]

[4]>игра обломи предыдущего [330]

[5]>Black Ravens v.0.8.8 {B27} [284]

[6]>Выход 24 билда. [281]

[7]>[UNITED TERRAN FORCES] [274]

[8]>Улучшения форума [270]

[9]>Песенки или музыка. [269]

[10]>Russian Combat Small Arms {B24-B27} [263]

lorderplay [06.09.2017|15:21]

gergeswael855 [01.09.2017|19:40]

leva_soot [25.08.2017|11:46]

Sanidze [20.08.2017|11:14]

kapustyansahsa [24.07.2017|16:08]

tema4ka123 [24.07.2017|15:49]

troller [21.07.2017|12:30]

watttt311 [17.07.2017|21:06]

popsalida [13.07.2017|18:12]

mihaildmitriev2016 [12.07.2017|05:58]


Вверх
Русский Фан Сайт Cortex Command © 2017.