Вторник, 14.05.2024, 13:23
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Wiremod » Помощь в Expression » Туториал по Е2 (Не знаете Е2? Тогда вам сюда)
Туториал по Е2
МАХДата: Четверг, 25.03.2010, 22:01 | Сообщение # 1
Рядовой
Группа: Модераторы
Сообщений: 14
Награды: 5
Репутация: 7
Статус: Offline
Всем привет я новый администратор сервера, меня приняли недавно. Для тех кто со мной еще не знаком - Меня зовут Максим, мой ник на сервере date4o .
Итак приступим. В начале я хочу сказать, что это туториал для начинающих, так что писать я буду как можно проще и понятнее. Итак приступим
В Expression 2 chip (далее Е2) часто используются математические действия я перечислю их:

A/B -Деление А на В
A*B -Умножение А на В
A+B -Сложение А с В
A-B -Вычитание А-В
A%B -Остаток от делания А на В
A^B -Возведение А в степень В

С этими действия ми можно проводить любые манипуляции: заключать их в скобки, применять разные действия в одной строке, например:

Code
А = 20 - 10
В = А - 5                       
#B = 5

Все равно что:

Code
В = 20 - (10 + 5)
#B = 5

Также в Е2 используются специальные символы, такие как:

& - И.

Пример:

Code
if(A==1 & B==1) {C=1}

Этот код читается так:
Если А и В равны 1 то С равно 1 ([tt]Примечание: это не какое не условие я просто задал С значение 1 вы можете там написать любое число, если вы не можете разобрать пример опуститесь ниже и прочитайте про "if" конструкцию [/tt] smile [tt])[/tt]

| - Или

Пример:

Code
if(A==1 | B==1) {C=1}

Этот код читается так:
Если А или В равны 1 то С равно 1

<,> и= - Знаки больше,меньше и равно

Пример:

Code
if(А>1) {B=1}
if(A<=1) {B=0}

Этот код читается так:

  • 1 Если А больше 1 В равно 1
  • 2 Если А меньше или равно 1 В равно 0

[tt]Примечание*: Ну я думаю не надо писать пример использования каждого из этих знаков, разберетесь сами happy [/tt]

== - Приравнивается, равняется

Ну я думаю пример тут не нужен я уже много раз в предыдущих примерах использовал этот символ.

!= - не равняется

Я думаю тут пример тоже не нужен, этот символ противоположность предыдущему.

Структура Е2

Итак мы изучили основные символы, и действия Е2 теперь давайте изучим его структуру и первые строки
Е2 похож на другие языки программирования, не каких особенностей его синтаксиса я сказать не могу... sad
([tt]Примечание*: просто незнаю какие тут особенности... может потом допишу[/tt] happy )

Итак первые строки...
@name - имя, здесь вы латиницей указываете имя Е2, (оно отображаетсся когда вы наводите на него прицел), если там не чего не указать то будет показыватся generic.
@inputs входы, здесь вы указываете входы, чем хорош Е2 вы сами можете придумать и назвать как хотите любые переменные, единственное что ВСЕ переменные нужно писать с Большой буквы.
@outputs выходы, аналогично с входами с той лишь разницей, что здесь вы указываете выходы shock .
@persist переменные, здесь вы указываете переменные не относящиеся ни ко входам ни к выходам, обычные внутрикодовые переменные.
@trigger Каюсь... Я не знаю что делает эта строчка... С английского переводится как выключатель, в некоторых местах я видел как сюда вписывали all - все... Возможно Здесь можно сделать условие на включение чипа..

Дальше - б0льше:

if конструкция

Итак сейчас мы изучим if конструкцию, она считается одной из самых часто используемых в Е2.
Что же такое if конструкция? Это некое условие... Что было понятно давайте разберем "условный" пример:
if(тут пишится условие) {тут пишится следствие условия} else{это новая графа до этого я ее вам не показывал...Здесь пишится следствие невыполнения условия}
Итак это был некий условный пример, теперь давайте рассмотрим настоящий пример использования if:

Code
if(A==1) {B=1} else{B=0}

Итак давайте разберем этот код: если(А равняется 1) {В ровно 1} иначе{В равно}
Так все таки вы не поняли что такое if конструкция? Ладно обьясню еще раз: первый тег if он не как не меняется и пишется всегда с маленькой буквы он обозначает : если. после тега if идут круглые скобки, они обязательны, в этих скобках вы пишите условие например в нашем примере условием было А==1 по чему нельзя написать просто А=1?Да по тому что знак приравнивается и равняется это разные знаки! Знаком приравнивается (==) как раз таки проверяется условие, он обозначает что то вроде : действительно ли А равняется 1? А знак равняется (=) : он не чего не сравнивает, он записывает значение по этому если мы запишем его первых скобках то это будет неправильно что нам выдаст проверка Е2. Ведь вы действительно не можете написать в условии вот так: если(А равно 0) равно и равняется разные вещи, равно это задает значение то есть если я напишу в любом месте в коде А=1 то А станет 1 а приравнивается (==) просто знак проверки равняется ли или нет.
Итак пришлось раздуть про знаки = и == иначе я думаю были бы непонятки... дальше идут фигурные скобки {} в них вы пишите что будет если А==1, в них я использовал как раз таки символ =. Я задал В значение 1.. Далее идет тег else он тоже не меняется и обозначает если. Далее идут опить фигурные скобки в них вы записываете что будет если А!=1 (если А не равняется 1) я указал В=0 по тому что иначе В всегда бы было равно 1 так как у нас нету больше упоминаний о В
Ну теперь то я думаю понятно?

interval()

Достаточно интересный тег, используется часто.Он зацикливает код.
В скобках вы указываете время в миллисекундах через которое код будет повторятся, то есть, если вы укажите в начале кода interval(1000) то код будет прокручиваться заново раз в секунду... Это подходит для каких нибудь таймеров и так далее...

Все устал ушел играть буду через час допишу...



Еще не записал мысль или она уже давно устарела


Сообщение отредактировал МАХ - Пятница, 26.03.2010, 10:49
 
tripledesuДата: Четверг, 25.03.2010, 23:09 | Сообщение # 2
Лейтенант
Группа: Супер Администраторы
Сообщений: 55
Награды: 22
Репутация: 14
Статус: Offline
Для не ламеров подойдет, вышло у тебя что-то вроде мини FAQ. Ставлю 4-ку biggrin
Но геймеро-задрот не поймет почти не слова из этого, хотя он наверное и e2 учить не станет.
Хотелось бы заметить то что задроты-ламеры в гаррис моде называются минжами.


Еще не записал мысль или она уже давно устарела
 
КаРаТеЛьДата: Пятница, 26.03.2010, 04:50 | Сообщение # 3
Анальный каратель.
Группа: Пользователи
Сообщений: 18
Награды: 3
Репутация: 2
Статус: Offline
Хорошо, только вот запятая разве не основной символ? Ведь новичок не знает что
Code
if(A==1 & B==1) {C=1 & D=0}
не есть хорошо.
P.S. Но все же я бы всем советовал учиться по туториалам с wiremod.com.


if (I==''syltan'') {WIFE_COUNT=3}

Сообщение отредактировал КаРаТеЛь - Пятница, 26.03.2010, 04:52
 
МАХДата: Пятница, 26.03.2010, 09:54 | Сообщение # 4
Рядовой
Группа: Модераторы
Сообщений: 14
Награды: 5
Репутация: 7
Статус: Offline
КаРаТеЛь, ага, допишу, это еще не дописано, еще стринг значения,векторы, егп, еще мож чето со временем...
Я сам там учился, хотя английский на уровне 8 класса (по тому что я и есть в 8 классе biggrin ) но все-же понимал, перечитывал по два раза строчки и доходил смысл...
Но как написал zzver это туториал для ламмеров, а они будут читать английские туторы? Сомневаюсь....
UPD: еще забыл про коментарий - "#" в смысле...


Еще не записал мысль или она уже давно устарела


Сообщение отредактировал МАХ - Пятница, 26.03.2010, 10:00
 
tripledesuДата: Пятница, 26.03.2010, 12:23 | Сообщение # 5
Лейтенант
Группа: Супер Администраторы
Сообщений: 55
Награды: 22
Репутация: 14
Статус: Offline
Допиши, упорядочи тутор и будет нормально.


Еще не записал мысль или она уже давно устарела
 
КаРаТеЛьДата: Пятница, 26.03.2010, 14:41 | Сообщение # 6
Анальный каратель.
Группа: Пользователи
Сообщений: 18
Награды: 3
Репутация: 2
Статус: Offline
Quote (МАХ)
Но как написал zzver это туториал для ламмеров, а они будут читать английские туторы?

Они не знают англиский и будут учить E2? Сомневаюсь...


if (I==''syltan'') {WIFE_COUNT=3}
 
МАХДата: Пятница, 26.03.2010, 18:28 | Сообщение # 7
Рядовой
Группа: Модераторы
Сообщений: 14
Награды: 5
Репутация: 7
Статус: Offline
КаРаТеЛь, будут пытаться и доставать меня тупыми вопросами, а ты как хотел? biggrin


Еще не записал мысль или она уже давно устарела
 
snooperДата: Суббота, 21.08.2010, 11:59 | Сообщение # 8
Рядовой
Группа: Пользователи
Сообщений: 1
Награды: 0
Репутация: 0
Статус: Offline
ааааааааааа как урок алгебры понл немного а так нихера аааа нана видеокурс и всё обьяснять все значения слов в вайре хорошо рублю а экспрешен неочеь 93 7 54
лана так и быть вот вам мои знания
Туториал по Expression 2
(Туториал переведён с английского языка и слегка изменён,оригинал смотреть тут)

В данном туториале цель - показать основы Е2,причём показать это как можно нагляднее.

Введение

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

Code
@name
@inputs
@outputs
@persist
@trigger All

"@name" - имя экспрешина,которое будет видно при
наведении на него взгляда. Необязательно,если оставить пустым то при
наведении взгляда заместо имени будет "generic".

"@inputs" - строка для входов, т.е. что экспрешин будет обрабатывать

"@outputs" - строка для выходов, т.е. результат вычислений экспрешина

«@persist» - строка для переменных,сюда надо добавлять переменные в случае если этого просит чип (например,использование в конструкции if-then-else или дельта)

Для примера разберём несложный код:

Code
@name Add Expression
@inputs A B
@outputs Out
@persist
@trigger All

Out = A + B

Этот код складывает значения A и B и выводит на выход Out

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

Out = A – B
Out = A / B
Out = A * B
Out = A ^ B (возведение A в степень В)

If-then-else конструкция.

Функция if — самая элементарная и частоиспользуемая. Она работает на принципе клапана — если (if) условие верно,то (then) сделать действие1,иначе (else) сделать действие2.Схема такая:

Code
if (A) {Out = B} else {Out = C}

То есть если A — верно (больше нуля) то приравнять Out к В,иначе приравнять к С.

Ну и пример на практике:

Code
@name Control
@inputs Button
@outputs Out
@persist
@trigger All
if(Button) {Out = 30} else {Out = 5}

Думаю,тут понятно.

Кроме того можно писать и без else:

Code
if (Button) {Out = 30}

В этом случае значение не сбрасывается и после нажатия на нашу кнопку Out продолжит быть 30 пока мы не сделаем условие чтобы оно принимало нужное нам значение (например, if(Button2) {Out = 5} )

Теперь ещё один пример:

Code
@name Speed
@inputs Speedometer Button
@outputs Out
@persist
@trigger All

if(Button) {Out = Speedometer}

То есть когда мы нажимаем на кнопку выход Out принимает значение спидометра,но тут проблема — когда мы выключаем кнопку Out остался как в последний момент перед выключением? Чтоже делать?
Мы забыли сделать возврат к нулю (else),и правильный код будет:

Code
@name Speed
@inputs Speedometer Button
@outputs Out
@persist
@trigger All

if(Button) {Out = Speedometer} else {Out = 0}

Теперь изучем проверки. Они бывают такими:

«==» - равно
«<» - больше
«<=» - больше либо равно
«>» - меньше
«>=» - меньше либо равно
«!=» - не равно

пример:

Code
@name Bell
@inputs Timer
@outputs Sound
@persist
@trigger all

if (Timer >= 10) {Sound = 1} else {Sound = 0}

В нашем случае это код будильника.Когда таймер (время) больше либо равно 10 то подаём звук, иначе — молчим (просьба не спрашивать меня как делать для этого таймер и как выводить звук,это просто пример — прим.авт)
Так же можно вставлять несколько условий,например:

Code
@name Test
@inputs Button1 Button2
@outputs Out
@persist
@trigger All
if (Button1 | Button2) {Out = 5} else {Out = 0}

Если нажата либо одна либо друга кнопка,то подать на выход 5.Так же кроме «A | B» (или) есть «A & B» (то есть если и А и В больше нуля).Можно делать и более сложные комбинации:

Code
@name Test
@inputs Button1 Button2
@outputs Out
@persist
@trigger All
if (Button1 >= 0 & Button2 == 54) {Out = 5} else {Out = 0}

То есть если кнопка 1 больше либо равна нулю И кнопка 2 равна 54 то подать на выход 5.

Интервал

Теперь ознакомимся с функцией interval(),которая задаёт частоту прогона кода, т.е. время через которое код будет заново перезапускаться,в милисекундах.Сделаем простой таймер:

Code
@name Timer
@inputs
@outputs Explode
@persist Time
@trigger All
interval(1000)
Time = Time + 1
if(Time == 10) {Explode = 1, Timer = 0} else {Explode = 0}

Разберём по строкам (минуя первые четыре,их я описал в начале туториала):

«@persist Time» - отмечаем переменную для времени т.к. она используется в конструкции if

«interval(1000)» - делаем так чтобы код перезапускался каждые 1000 мс или каждую секунду

«Time = Time + 1» - при запуске кода прибавляем к времени 1 единицу,а поскольку у нас код прогоняется каждую секунду получается,что каждую секунду мы прибавляем к времени единицу.Так же може записыватся как «Time += 1» или «Time++» (последняя команда означает поднятие на единицу;если бы мы поднимали значение не на единицу то использовать её нельзя было бы)

«if(Time == 10) {Explode = 1, Timer = 0} else {Explode = 0}» - условие, что если время будет равно 10 то на выход «бабах» будет подано 1 а таймер сбросится,а если время меньше его — то на «взрыв» подаём 0

Ну и наконец напишем ещё более сложный код:

Code
@name Timer
@inputs Button
@outputs Explode
@persist Time
@trigger All
interval(1000)
if(Button) {
Time = Time + 1
if(Time == 10) {Explode = 1} else {Explode = 0}
} else {Time = 0}

То есть если включена кнопка то:
Прибавляется время
Если время больше 10 то подать на Explode 1,иначе 0
,а если кнопка выключена то время сбрасывается на ноль.

Векторы

Векторы - одно из нововведений в Е2 в отличии от первого,здесь является небольшим массивом вида X,Y,Z.Зачем же он вообще нужен? В основном для определения местоположения чего-либо и передвижения (см. ниже),так же вектором удобнее задавать какую-то определённую точку.Вектор и простые числа - это разные типы входов,выходов и переменных.Пример:

Code
vec(300,200,300) + 8

Тут вас чип остановит и скажет,что недопустимая операция,т.к. мы попытались сложить 2 разных типа переменных. А правильный код должен выглядеть так:

Code
vec(300,200,300) + vec(8,8,8) = vec(308,208,308)

Естественно что не обязательно чтобы у второго слогаемого были одинаковые XYZ

Code
vec(300,200,300) + vec(23,432,43) = vec(323,632,343)

Чтобы экспрешин различал типы переменных к векторным входам\выходам надо добавлять постфикс :vector

Code
@name GPS
@inputs GPS:vector Button
@outputs Out:vector
@persist
@trigger All

if(Button) {Out = GPS} else {Out = vec()}

Где vec() - нулевой вектор,можно также записать как vec(0,0,0).
Векторам можно отдельно задавать каждый параметр:

Code
V:setX(#)
V:setY(#)
V:setZ(#)

А если вам надо получить какое-то значение с вектора

Code
V:x()
V:y()
V:z()

Для примера узнаем высоту на которой мы находимся:

Code
@name Height
@inputs GPS:vector
@outputs Height
@persist
@trigger All

Height = GPS:z()

Так же к векторам можно отнести applyForce() но о нём расскажу после entity...

Entity

Дословно - объекты,то есть тип переменной,хранящей в себе информацию о пропе\нпц\игроке.из ентити можно узнать местоположение,имя,модель итд. В простом ваире альтернатива - Beacon Sensor,но всётаки у Е2 куда больше возможностей.
Предположим,мы хотим знать точно где расположен наш экспрешин. У экспрешина есть собственная Entity - entity(),из которого можно узнать вектор. Ну а из вектора можно "извлечь" координаты,вот пример:

Code
@name GPS
@outputs X Y Z
@persist Ent:entity Vec:vector
@trigger All
interval(10)
Ent = entity()
Vec = entity():pos()
X = entity():pos():x()
Y = entity():pos():y()
Z = entity():pos():z()

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

applyForce(V)
Теперь можно ознакомится с одной из самых интересных функций экспрешина - применением силы.Вектором задаётся тяга.

Code
@name Force Test
@persist
@trigger All
entity():applyForce( vec(0,0,1000) )

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

Code
@name MingeProp
@inputs Player:entity
@persist
interval(10)
LocalPos = Player:pos() - entity():pos()
entity():applyForce(LocalPos*10000000)

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

Strings

В Е2 стало появился новый тип данных - strings,"тексты". Они нужны для чат-ботов,Console Screen и Entity Discover (всё это будет ниже). Сами тексты записываются в виде "test" и отображаются серым цветом, в первых четырёх строках у них постфикс S:string .
Тексты можно складывать ("Te" + "st" = "Test"),сравнивать (if (S == "string") {...} ) и использовать команду += ( if (Button) {Text += "a"} )
Разберём простой пример:

Code

@name String Test
@inputs Button
@persist
@trigger All
if (Button) {
print("Hello world!")
}

И когда мы нажимаем на кнопку у нас в чате появляется Hello world!.
Для следующего примера мы залезем в докоментацию ( (я вам вообще советую при чтении этого туториала постоянно держать документацию в соседней вкладке\окне) и напишем код чтобы отслеживать статистику сервера.

Code

@name Server Info
@persist
@trigger All
interval(50) #интервал нужен для обновления последнего сообщения чата
if ( lastSaid() == "getinfo") {
print( hostname() )
print( "Map: " + map() )
print( "Players: " + toString(numPlayers()) + "/" + toString(maxPlayers()) )
}

Когда мы в чат пишем getinfo - получаем
Здесь я вобрал несколько наиболее часто используемых команд связаных с текстами
lastSaid() - команда возвращает (понятней - "означает","равняется") последнее сообщение чата

toString(#) - команда которая переводит цифры в текстовой формат ( toString(5) + " test" = "5 test")

А значение других команд найдите сами в документации (подсказка - ищите в Server Information,пункт 4.21),там же можно посмотреть другие команды strings,например,S:toNumber()

Array и Table

Я решил совместить массивы и таблицы потому что по сути это почти одно и то же. Массив - это группа нескольких значений (цифры,тексты,ентити),причём каждое значение имеет свой номер,а таблица - это несколько значений (те же типы) но каждое имеет своё название в форме текста (string). На первых четырёх строках постфиксы переменных R:array и T:table соответственно.
Разберёмся сначала с массивом.
Изменяется информацию в ячейках массива командами:
Code

R:setNumber(<номер ячейки>,<число>)
R:setString(<номер ячейки>,<текст>)
R:setEntity(<номер ячейки>,<объект>)

Получать же значения из ячеек мы будем с помощью команд:
Code

R:<тип>(<номер ячейки>) #где тип - number,string или entity

Пример для демонстрации:
Code

@name Array Test
@persist R:array
@trigger All
R:setString(1,"lolwut?")
R:setString(2,"omg")
R:setString(3,"NOOO")

Мы создали небольшой массив,его можно представить так:
Code

1 lolwut?
2 omg
3 NOOO

Теперь выведем это к нам в чат:

Code

@name Array Test
@persist R:array
@trigger All
R:setString(1,"lolwut?")
R:setString(2,"omg")
R:setString(3,"NOOO")
print( R:string(1) )
print( R:string(2) )
print( R:stirng(3) )

Таблицы - это те же самые массивы только заместо ячеек - названия,то есть код будет выглядеть весьма знакомо:

Code
@name Array Test
@persist R:array
@trigger All
R:setString("ololo1","lolwut?")
R:setString("ololo2","omg")
R:setString("ololo3","NOOO")
print( R:string("ololo1") )
print( R:string("ololo2") )
print( R:stirng("ololo3") )



Еще не записал мысль или она уже давно устарела


Сообщение отредактировал snooper - Суббота, 21.08.2010, 12:00
 
skittlesTRUДата: Воскресенье, 10.10.2010, 07:15 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 1
Награды: 0
Репутация: 0
Статус: Offline
awesome cool


Еще не записал мысль или она уже давно устарела
 
tuskanДата: Пятница, 10.12.2010, 18:53 | Сообщение # 10
Рядовой
Группа: Пользователи
Сообщений: 1
Награды: 0
Репутация: 0
Статус: Offline
46


Еще не записал мысль или она уже давно устарела
 
SanchouSДата: Четверг, 27.01.2011, 17:31 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 1
Награды: 0
Репутация: 0
Статус: Offline
awesome :D


Еще не записал мысль или она уже давно устарела
 
Форум » Wiremod » Помощь в Expression » Туториал по Е2 (Не знаете Е2? Тогда вам сюда)
  • Страница 1 из 1
  • 1
Поиск: