Статья 1. Jass. Основы синтаксиса для начинающих кодеров.
|
|
-
Caturn | Дата: Понедельник, 14-11-2011, 21:24:59 | Сообщение # 1 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Jass. Вступление. 1. Вначале разберём, что такое jass, и зачем он нужен?
Jass - и есть язык программирования для кустом карт Warcraft3, созданный лично близзами для упрощения составления сценария игры в целом, не более. Изначально, когда только-только вышла игра War3 ROH, ГУИ триггеры были намного сложнее чем в TFT, а всевозможные сайты-помощники напрочь отсутствовали, и приходилось делать всё вслепую, методами проб и отсеивания. Да, сейчас всё это намного проще, ведь есть этот сайт, XMG, и хайвокшоп, и многие другие сайты где есть хотя-бы 1 кодер-жассер для статуса сайта, как сайт МАПМЕЙКЕРОВ и прочих.
2. Отличия Jass'a от GUI.
GUI - сгенерированные функции близами для удобства составления сценариев игры. По суди, это тот же самый Jass, но более в утечной(утечки я разберу чуть попозже) форме. Он и начал началу осваивания новых простор редактора в целом, я не буду вдаваться в историю, дабы что-либо не напутать, ибо я всё напрочь забыл. Отличия GUI от JASS: большая часть ГУИ функций имеет 1 поток, поток окончания BJ(..._bj; bj_...). Это значить что все функции такого рода вызывают другую функцию, которая в конечном итоге вызывает констант функцию или натив функцию, что естественно затрагивает время, и часто при работы с большими проектами происходят непонятные вещи в гемплеи игры. Это связанно из-за этих потоков, которые когда-нибудь могут быть вызванными одновременно, в точь в точь. Так же есть и другое отличие, в интерфейсе ГУИ нет локальных переменных, только глобальные, вы наверное отличие между ними знаете, что локальная действует в пределах той функции где она была вызвана и вызывается каждый раз по новой, не изменяя значения предыдущий переменной в этой функции, глобальная - во всём коде карты, может быстро поменять значение, если ошиблись в коде.
3.Утечки.
Истинного Понятия "Утечки", за долгое существования игры war3 так и ни у кого и не сложилось, все думают по своему. Чуть менее чем на половину хороших кодеров знают суть этого понятия в целом, и умеют с ними бороться, но факт остаётся фактом... Избавится от 100% утечек не возможно, по многим причинам, в частности из-за самой структуры кода. Максимальная боеспособность к обнаружению утечек и их устроению даются не многих, и лишь 90% утечек возможно устранить, остальные 10%, 7% - незначительная часть информации в таблицах, она удаляется спустя некое время, если сильно поднатужится то она исчезнет через минуту другую, 3% - та часть информации которая будет хранится в памяти игры до завершение карты. Утечки - память игры, ОП. Каждая функция или другая задача поставленная сценарием игры требует память, незначительную конечно, но если учесть то что в секунду игра обрабатывает более ста тысяч команд то мнение у вас должно поменяться, кардинально. Все юниты, декорации хранятся в таблицах, каждая функция попадает в оптимизатор и обрабатывается, после чего идёт запись в таблицу, и с такой же лёгкостью она удаляется, Но есть та часть кода именуемая переменными, которая просто так из таблицы не сотрётся. В частности это локальные переменные, номера строк хеш-таблиц, точки, группы, спецэффекты, области, группы. Триггеры, и таймеры, если они были вызваны временно, и дальнейший значимой функции они не несут. Удаляются они достаточно просто. Учтите ещё 1 факт, что переменные родительного рода не обнуляются, а именно это: текстаги, реальные, целые числа, булевые переменные. Что бы удалить точку используем эту функцию:
Code call RemoveLocation(<location>) там где локация в скобках ставиться наша переменная типа точки. после чего само значение приравнивать к нулю не надо, впрочем это бессмысленно с любой стороны. Code call DestroyGroup(<group>) удаление группы, информации о группе и о юнитов в группе, так же как и с переменной типа точки приравнивать к нулю саму переменную не надо. В ГУИ часто встречается альтернатива функции Code set bj_wantDestroyGroup = true удаление предыдущий группы, ставиться Перед началом цикла. Code call DestroyEffect(effect) удаление из таблицы информацию о эффекте. Лучший способ убить 2 зайцев - создать эффект в аргументе функции удаления спецэффекта, если учесть то, что эффект типа удара грома, т.е. проводя эту манипуляцию, в игре спецэффект появится. Так же как и с предыдущими значениями приравнивать к нулю саму переменную не надо, если вы её не вызвали) Code call RemoveRegion(Region) удаление региона, не путать с локацией(точка). Code call FlushChildHashtable(table, номер таблицы) там где табл, имя глобальной(лок.) переменной, после чего в след. аргументе может стоять функция рода "GetHandleId(trigger или timer)". Code call DestroyTrigger(trigger) удаление триггера из таблицы. Code call DestroyTimer(timer) удаление таймера, как и запущенного, так и "ожидающего" активации.
Всё остальное, не поддающемуся сверху, есть иное действие, волшебное. set (имя переменной) = null. Удаляем(обнуляем данные) информацию из памяти игры.
4. Функция, что из себя она представляет Функция - и есть строительный блок кода карты, в котором выполняются различные задачи. При помощи функций можно разделить ваш код на многочисленные фрагменты, с которыми удобно работать.
Функции объявляются так: function [имя] takes [аргументы] returns [возвращаемое значение] endfunction. Пример: Code function func01 takes nothing returns nothing .. endfunction 1) Ключевое слово function (ключевое слово - это команда для программы, которая заставляет ее выполнить какое либо действие) означает что в той строке где оно написано начинается объявление функции.
2) func01 - это ее имя. Существуют несколько правил при написании имени функции:
1. Оно должно начинаться с буквы а не цифры, иначе при компиляции будет ошибка. Вот такой способ будет правильным - Func0001, а такой нет 1Func0001. 2. При выборе имени функции нельзя использовать названия ключевых слов, таких как - unit, return, function, trigger, takes и.т. д. 3. Нельзя создавать несколько функций с одинаковыми именами
3) Ключевое слово takes означает начало списка аргументов. В нашем случае, функция не имеет аргументов, об этом свидетельствует оператор nothing (он означает нулевое значение).
4) Ключевое слово returns (не путать с return) означает что функция может вернуть одно значение
5) ... - это блок кода функции. Здесь вы должны писать свой код.
6) И последнее, это кл. слово endfunction, которое означает окончание функции.
Важно помнить, что вызываемая функция должна находится выше функции от куда она была вызвана. Все функции объявляются таким образом. где скобки означают количество аргументов, в данном случаи они пусты, значить аргументов нет. Или таким образом: Code call ExecuteFunc ("имя функции") в этой статье я не буду рассказывать а том, чем лучше пользоваться. Но факт остаётся фактом.
Code function func01 takes unit u returns nothing ... endfunction В этой функции я указал аргументы, это те же самые переменные которые передаёт первая(вызванная функция) функция для выполнения другой. В данном случаи я передал функции значение переменной юнита. Сделал это так: Code call func01(udg_unit) В качестве аргументов можно применить любой тип переменной, и количество аргументов может быть больше 1. Но важно знать, что переданные аргументы должны следовать по порядку, т.е. как мы их записали. Правильный пример: Code function func01 takes unit u, integer i returns nothing Code call func01(unit01,integer01) Неправильный пример: Code function func01 takes unit u, integer i returns nothing Code call func01(integer01,unit01)
Теперь попробуем разобрать, чтож за блок кода returns, как им пользоваться. Также как и у параметров, тип возвращаемого значения может быть любым. Но тут есть одно условие - функция может вернуть только одно значение. Помимо этого, данной функцией можно проверять быстро условия заданных значений. Для начало легкое, как её пользоваться. Code function Func01 takes nothing returns integer ... endfunction Для того чтобы функция вернула значение в ее блоке кода необходимо прописать кл. слово return. Когда во время выполнения функции, она встречает слово return, ее работа тут же прекращается и происходит возврат значения. Если тип возвращаемого значения не указан, то при написании слова return в ней, она просто завершит свою работу, без возврата.
Code function Func01 takes integer i1, integer i2 returns integer return i1 - i2 endfunction После ее выполнения, она вернет получившееся число, которое можно как-либо использовать, к примеру для аргументов функций. Если рассматривать в более углублённой форме синтаксиса jass, то можно многое узнать об этом свойстве.
Немного прерву рассказ, ибо прошёл час, с момента того как я сел за монитор и начал писать статью, пойду покурю, да и вам советую. Чем дальше, тем интересней.
5. Переменные
Переменная - ячейка или набор ячеек в памяти компьютера, в которой (которых) может храниться какого то рода информация.
Переменные делятся на группы: Глобальные, объявляются в триггере кода карты после старта игры. Локальные, объявляются в начале функции, действуют в пределе этой функции Константы, объявляются в функции только 1 раз, после придания им значений изменяться не могу, действуют в пределах всего кода, до конца игры. Я бы отнёс ещё к этому списку и тип "Аргументы", тоже своего рода переменные.
У всех переменных есть свои плюсы и минусы, к примеру: глобальные переменные действуют везде, в отличии от локальных, но они могут изменять значения. Для того, что бы передать локальную переменную действию триггера(другому) нужно пользоваться хеш-таблицей, по суди удобно, но лишняя трата времени на писанину кода. Для жассеров "единственно" верное решение передачи данных действию триггера, где в хештаблице указывается ид триггера(в подробности вдаваться буду в другой статье, если конечна же добродушные модеры не сочтут это как за копипаста и не забянт меня, хотя это всё написано с руки, за исключением типов переменных, уж лень было мне вспоминать их).
Т.к. глобальные переменные мы не может объявлять в коде, попробуем объявить локальную. Большая просьба людям работающим с VJASS не писать такие вещи, что глобальные переменные можно объявить в коде с прогой JNGP, и упрекать меня то что я никто, если вы сомневаетесь в моей компетенции кодера, пишите свою статью про ваш VJASS, я буду не против. Code local integer integer01 ключевое слово local. Это значить что идёт объявление локальной переменной. Теперь попробуем предать ей значениеCode local integer integer01 set integer01=10 ключевое слово set. Это значить что идёт присваивания значение переменной, но можно улучшить этот код таки вот образомCode local integer integer01=10 Здесь за место 2 строки кода мы использовали одну. Т.е. мы улучшили код, объявляем > предаём значение. Другим словом мы инициализировали переменную - означает что она начинает ссылаться на данные. Ссылаться на данные можно 2-мя способами: используя литералы или основные типы данных. Литералы - это буквальные значения данных. Например, число 1 или строка "D" являются литералами. А использование основных типов данных - это присваивание значения одной переменной в качестве значения для другой. set integer02=integer01 - простой пример. Все рассмотренные нами переменные называются скалярными - способными хранить лишь один элемент информации. Но бывают случаи, кода нужно задействовать в функции более 10 переменных одного типа, и постоянно писать один и тот же код нудно, да и ошибиться шанс велик... Есть решение, объявление массивных переменных. Делается это такCode local integer array integer01 Важно знать что инициализация массива при объявлении не допустима, т.к. такого рода переменная содержит много элементов каждый из которых требует присваивать ему значение индивидуально. Делается это таким образом.Code set integer01[0]=1 set integer01[1]=2 ... set integer01[49]=50
Основные понятия на этом завершены, дабы не терзать ваш мозг наплывом информации. В следующей статье я ознакомлю вас с конструкцией условий, циклами, и другое, что может понадобится вам в дальнейшем. Автор: Caturn
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
wetalq | Дата: Понедельник, 14-11-2011, 21:32:53 | Сообщение # 2 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
| | |
-
Caturn | Дата: Понедельник, 14-11-2011, 21:38:51 | Сообщение # 3 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Написал за пару часов, дальше писать могу, но время десятый час, завтра на учебу, сейчас буду смотреть фильм. На хмг там писал не 1 человек, насколько мне известно, и не пару часов . Так планирую 3-4 статьи разместить, если конечно же не попросят ещё.
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
wetalq | Дата: Понедельник, 14-11-2011, 22:16:59 | Сообщение # 4 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
|
Caturn, мне интересно, так как только учусь кодить, даже написал свою функцию и сделал пару спелов (локалки + хеш) но на гуи с хешем так и не понял как пользоваться)
Покупка предметов через способность
|
| | |
-
Caturn | Дата: Понедельник, 14-11-2011, 22:33:02 | Сообщение # 5 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Лучше хешом пользоваться в коде карты, или в триггере написанным на jass. Там есть функция вычисления GetHandleId(trigger или timer), если это локальные триггеры "временные". А вот по счёт UnitId(unit) я не практиковался.
Альтернатива хешу в гуи - циклы с массивами. Одно и тоже, но чуть бажаней чем с хешом(через хеш можно тоже, но сложнее во много раз). Тебе покажется что ты делаешь всё правильно, но в игре МУИ триггер работать откажется, найдёт причину. Но таких отказов мало бывает, если сделаешь всё правильно. Могу скинуть работу знакомой(причём она тоже работает с WE) с циклами, там есть герои доты как Windrunner, Treant Protector, Bounty Hunter, Lifestealer, Silencer.
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
wetalq | Дата: Понедельник, 14-11-2011, 23:27:27 | Сообщение # 6 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
|
Quote (Caturn) Альтернатива хешу в гуи - циклы с массивами.
способ не тяжелый, но очень геморный в плене переменных, получаеться чуть ли не для каждого спела делать новый набор переменных.
Quote (Caturn) Могу скинуть работу знакомой(причём она тоже работает с WE) с циклами, там есть герои доты как Windrunner, Treant Protector, Bounty Hunter, Lifestealer, Silencer.
да я это могу тоже сделать, в способностях из доты, ну разве что с ультом гондора затруднения будут)
на джасе локалками такие вещи намного легче писать)
Покупка предметов через способность
|
| | |
-
Caturn | Дата: Понедельник, 14-11-2011, 23:46:46 | Сообщение # 7 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Отмечу сложные связи способностей в триггерах. Powershot, Shackleshot - Wr Nature's Guise - Rf Jinada, Wind Walk - Bh Glaives of Wisdom, Last Word - Silencer по счёт ульты не вижу особых сложностей
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
wetalq | Дата: Вторник, 15-11-2011, 00:05:23 | Сообщение # 8 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
|
Caturn, сложность в том что бы отследить уровень бафа)
вот у меня к тебе вопрос как написать в такой спел, пока его кастуешь например тебе каждую секунду каста дают по 10 монеток. я не шарю как такое на джасе писать, думал о том что бы сравнивать местоположения, но тогда команда держать позицыю не собьет спел)
сможешь написать такую функцию ?)
Покупка предметов через способность
|
| | |
-
Caturn | Дата: Вторник, 15-11-2011, 00:28:46 | Сообщение # 9 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
По счёт сложности. Вот 1 триггер: Основа: Волшебный огонь. Событие - A unit приводит способность в действие Условие - способность Track= да Дать юниту, GetSpellTargetUnit, способность "Ауру скорости бега" (аура выносливости), переделанная для врагов. Установить лвл даруемой способности, лвл как Track GetTriggerUnit
Каждые 0.4 секунды проверять юнитов на наличие бафа Баффа нет, удаляем способность. По счёт твоей способности, могу показать пример на ГУИ, после чего(завтра) сделаю на жассе, если я тебя правильно понял: Quote (wetalq) как написать в такой спел, пока его кастуешь например тебе каждую секунду каста дают по 10 монеток. я не шарю как такое на джасе писать, думал о том что бы сравнивать местоположения, но тогда команда держать позицыю не собьет спел) Т.е. способность по типу Illuminate, Keeper of the Light. каждую секунду каста увеличивается урон шара на 100, правильно понял?
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
wetalq | Дата: Вторник, 15-11-2011, 16:55:05 | Сообщение # 10 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
|
Caturn, ага, ну гуи я тоже могу, а хотелось бы узнать как такое на джасе написать)
мне ничего лишнего не надо просто сам каст отловить и его прекращения, и эти две функции соединить)
Покупка предметов через способность
|
| | |
-
DEMON_CHETS | Дата: Вторник, 15-11-2011, 19:19:14 | Сообщение # 11 |
Раб
загрузка наград ...
Группа: Пользователи
Сообщений: 15
Репутация: 0
Статус: Не на сайте
|
Очепятался
П.С. Я думал в основах ты расскажешь о boolean, integer, real, string, unit и прочих.
|
| | |
-
Caturn | Дата: Вторник, 15-11-2011, 19:28:31 | Сообщение # 12 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Вступление в jass, знакомство с общими понятиями, переменными. Вот в следующей статье я напишу о логических операторов, познакомлю с циклами, расскажу о свойствах переменных, и ещё-что-то. Чуть попозже допишу статью, пополню раздел этой статьи констант и аргументов, так же допишу концовку, приведу всем известные примеры про жизнь редактора.
Quote (DEMON_CHETS) П.С. Я думал в основах ты расскажешь о boolean, integer, real, string, unit и прочих. впрочем в крации рассказал о самих переменных, а вот какие значения данных они могут принимать - должен знать хороший ГУИшер, ибо статья рассчитана на их знания.
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
wetalq | Дата: Вторник, 15-11-2011, 19:34:32 | Сообщение # 13 |
Король Мёртвых
загрузка наград ...
Группа: V.I.P.
Сообщений: 1263
Репутация: 1572
Статус: Не на сайте
| | |
-
Caturn | Дата: Вторник, 15-11-2011, 19:39:58 | Сообщение # 14 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Константами нужно уметь пользоваться, к примеру им можно дать значение абсолютной величины, число Pi, или все возможные значения которые Постоянны, они могу понадобится для работы с координатами плоскости, для неких систем.
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
Nevermore | Дата: Среда, 23-11-2011, 15:05:03 | Сообщение # 15 |
GUI IMBA
загрузка наград ...
Группа: Проверенные
Сообщений: 210
Репутация: 338
Статус: Не на сайте
|
Caturn, хорошая статья много нового узнал,жду недождусь второй части
|
| | |
-
AncientPenguin | Дата: Понедельник, 12-12-2011, 00:04:15 | Сообщение # 16 |
загрузка наград ...
Группа: Избранные
Сообщений: 449
Репутация: 526
Статус: Не на сайте
|
Quote (Caturn) Учтите ещё 1 факт, что переменные родительного рода не обнуляются
А мне казалось что я шарю в жассе, но вот что значит эта фраза понять я не в силах.
Quote (Caturn) function func01 takes nothing returns nothing .. endfunction Quote (Caturn) 4) Ключевое слово returns (не путать с return) означает что функция может вернуть одно значение
Боюсь спросить какое, в данном случае)
Quote (Caturn) Т.к. глобальные переменные мы не может объявлять в коде, попробуем объявить локальную. Большая просьба людям работающим с VJASS не писать такие вещи, что глобальные переменные можно объявить в коде с прогой JNGP, и упрекать меня то что я никто, если вы сомневаетесь в моей компетенции кодера, пишите свою статью про ваш VJASS, я буду не против.
Фу нупь, вскрываешь архив карты, вытаскиваешь оттуда файл вар3мап.ж и там вставляешь любые глобальные переменные это была шутка, агрится не надо)
|
| | |
-
Caturn | Дата: Понедельник, 12-12-2011, 00:36:08 | Сообщение # 17 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
AncientPenguin, если вскрыть архив карты, и нахимичить в коде, велика вероятность потерять все данные для редактора, так что лучше вообще туда не суваться.
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
AncientPenguin | Дата: Понедельник, 12-12-2011, 00:46:59 | Сообщение # 18 |
загрузка наград ...
Группа: Избранные
Сообщений: 449
Репутация: 526
Статус: Не на сайте
|
Quote (Caturn) AncientPenguin, если вскрыть архив карты, и нахимичить в коде, велика вероятность потерять все данные для редактора, так что лучше вообще туда не суваться.
Quote (AncientPenguin) это была шутка, агрится не надо)
Лучше бы обратил внимание на то что написано выше, не уверен на 100% но думаю если мне непонятно что там написано то новичкам тем более.
|
| | |
-
Caturn | Дата: Понедельник, 12-12-2011, 01:34:46 | Сообщение # 19 |
Темный рыцарь
загрузка наград ...
Группа: Проверенные
Сообщений: 217
Репутация: 128
Статус: Не на сайте
|
Моя программа рассчитана не на 1 статью. В связи с этим, эта статья, скажем так, лишь знакомит будущего кодера с основами, и знать всё о возвращающих параметрах функции им пока рано, так как это мною предназначено на 1 целую статью, в следующей статье лишь в крации пробегусь о её свойствах. Я в целом, когда начинал работать в жассе, параметром return не пользовался, только когда я начал делать более сложные системы ощутил все удобства этим параметром, так что для начинающих кодеров на ближайшие пару тройку месяцев можно забыть о существовании такого параметра.
Мои статьи: 1. http://wc3-maps.ru/forum/78-1507-1 Школа тригеростроения, ГУИ. http://wc3-maps.ru/forum/99-1471-1
|
| | |
-
AncientPenguin | Дата: Понедельник, 12-12-2011, 02:22:41 | Сообщение # 20 |
загрузка наград ...
Группа: Избранные
Сообщений: 449
Репутация: 526
Статус: Не на сайте
|
Quote (Caturn) Я в целом, когда начинал работать в жассе, параметром return не пользовался, только когда я начал делать более сложные системы ощутил все удобства этим параметром, так что для начинающих кодеров на ближайшие пару тройку месяцев можно забыть о существовании такого параметра.
Это имхо не правильно, хотя это даже не имхо, во всех учебниках по программированию сначала идет описание синтаксиса (переменные, циклы, функции примерно в таком порядке). Ретурн не нужен пока пишешь код только в действиях и условиях триггеров, но при написании своих функций он нужен в 99% случаев (хотя чаще всего это буль ).
Кстати лучше будет не булева переменная, а логическая, по русски всяко приятнее.
Quote (Caturn) В частности это локальные переменные, номера строк хеш-таблиц, точки, группы, спецэффекты, области, группы.
повторчик
В общем если потребуется помощь со статейками (ну всякое бывает ) обращайся.
|
| | |