Jump to content

Гайд: Macro Keybind: Скриптинг


Lego_Chubzik
 Share

Recommended Posts

Вступление

 

Всем привет. Этот гайд я пишу в дополнение к теме Гайд: Macro KeyBind от @nagibqwe, т.к. мне показалось, что в ней плохо раскрыта тема скриптинга. Перед чтением этой темы настоятельно рекомендую ознакомится с гайдом выше. Для удобства я разделю эту тему по основным главам. Гайд будет дополнятся по мере моего познания этой темы).

 

Глава 1. Структура программы

 

1.1 Общие сведения. Основы основ.

 

Для начала нужно знать, что любой скрипт в Macro Keybind mod должен быть заключен в такую конструкцию: $${//Ваш скрипт }$$. Эта конструкция указывает, что введенные в нее строки должны не выводится в чат, а обрабатываться компилятором. Скрипт может быть написан в поле редактирования макроса( в одну строку),или в текстовый файл. Вариант расположения скрипта в текстовом файле предпочтителен для длинных и/или сложных программ, где легко запутаться в синтаксисе и допустить ошибку. 

 

Тут скрипт написан в одну строку для клавиши <DOWN>. О содержимом скрипта мы обязательно узнаем.

image.png.0fb3863e05c8c1f823d3d91bc4920e79.png

 

А тут скрипт написан в текстовом файле.

image.png.19bc16fe8adb65e069a9a884ee939a0c.png

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

 

Важным моментом является то, что если писать несколько команд (функций)  в одну строку, то между ними обязательно ставить точку с запятой ";", в противном случае скрипт будет работать некорректно. Однако если поставить точку с запятой после единственной команды в строке, то ничего страшного не случится и скрипт будет работать, это даже будет являться хорошей практикой.

 

Пример записей команд(функций) в текстовом файле:

Цитата

Можно:

$${
log("Hello"); log("World")
log("Its My first program")
}$$

Как мы видим - после первой функции log() есть точка с запятой, а после второго log() - нет. Все будет работать т.к точка запятой обязана находится между командами (функциями), но это не запрещает ей находится и после второго log()

 

Можно:

$${
log("Hello") 
log("World")
log("Its My first program")
}$$

Тут все просто, каждая команда(функция) находится в отдельной строке, поэтому точка с запятой не обязательна

 

Можно:

$${
log("Hello"); 
log("World");
log("Its My first program");
}$$

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

 

Можно:

$${
log("Hello"); log("World"); log("Its My first program")
}$$

Тут записаны 3 команды в 1 строку и между всеми командами стоят точки с запятой, поэтому все будет работать

 

Нельзя :

$${
log("Hello") log("World")
log("Its My first program")
}$$

Записывать скрипт таким образом - грубая ошибка, т.к между первым и вторым log() нет точки с запятой

 

Макрос не обязательно должен являться скриптом. Если все, что нам надо от макроса сводится к вводу команд/сообщений в чат, прим: бинд клавиши /home на кнопку, то можно обойтись без написания скрипта с конструкцией $${//код}$$. После нажатия на забинженую клавишу, или после активации события, все, что вы написали в поле редактирования макроса напишется от вашего имени в чат.  

 

Если написать такой макрос в качестве бинда на клавишу:

image.png.dfa96ebefc1904f537f81ad0b29ba8f8.png

То при нажатии на клавишу в чат будет выведено сообщение от вашего имени: image.png.d160013d6124f9637028d09bec386149.png

 

Если вы хотите отправить более одного сообщения/игровой команды в чат и не хотите их оформлять это как скрипт, то вам нужно разделить эти сообщения символом | 

image.png.9dd2656e94d757645d75072f5b89e20a.png

На картинке выше представлен бинд клавиши COMMA, который при нажатии на клавишу, телепортирует игрока домой и пишет в локальный чат от его имени: "Привет дом!"

 

Скрипт из текстового файла также можно забиндить на клавишу или на событие. Для этого в поле нужно ввести: $$<Название.txt> в поле редактирования макроса

image.png.01142e4a352878abb2f02e030ed44e55.png

 

Написанные скрипты и прочие текстовые файлы будут хранится по следующему адресу с форматом .txt: 
%AppData%\Roaming\.simplemc\Ваш сервер\liteconfig\common\macros

 

Также можно обратить внимание и на другие файлы, находящиеся в этой же папки, для общего развития )

Например файл .globalvars.xml хранит в себе глобальные переменные (это переменные доступные для любого скрипта), подробнее о них рассказывается в главе 2. 

Файл .gui.xml хранит в себе информацию о настройке внутриигрового интерфейса.

Файл .vars.xml по моим наблюдениям является неким хранилищем локальных переменных. Для каждого скрипта этот файл хранит отдельные локальные переменные, подробнее о них в главе 2. 

Папка logs хранит в себе текстовые файлы, создающиеся в ходе использования команды logto().

 

1.2 Регистрозависимость

 

В этом языке в некоторых случаях регистр имеет значение, а в некоторых случаях не имеет. Поэтому, лучше всего, на мой взгляд - называть свои переменные и т.п. маленькими буквами, при вызове также использовать их имя в нижнем регистре. Функции можно вызывать в любом регистре. Между log() и LOG() нет никакой разницы.

 

1.3 Комментарии

 

Важной частью программного кода являются комментарии. Они не являются частью программы, при компиляции они игнорируются. Тем не менее комментарии делают код программы более понятным, помогая понять те или иные его части. В данном языке существует только 1 тип комментариев: Однострочный.

Однострочный комментарий размещается на одной строке после двойного слеша //

 

Пример комментария:

image.png.891a677a40f2bb31c607f983e52a7d79.png

Между командой и комментарием также требуется точка с запятой ";". Если писать комментарий в отдельной строке, то он будет выделятся зеленым цветом. Следует обратить внимание на то, что внутренний редактор файлов не поддерживает Отображение русского языка, но если передавать русский текст в качестве параметра в функцию, прим: log("Привет мир"), то это будет работать.

 

1.4 Встроенные параметры 

 

Для лучшего понимание того, что будет написано дальше лучше будет сначала прочитать главу 2.

 

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

 

Список встроенных параметров: 

 

$$? Запрашивает у пользователя ввод текста (строки). Возвращает значение типа &string - где &string это введенный нами текст (строка). О том, что такое значение типа &string и др. написано в главе 2.

image.png.f2bb2a3148f9b1434b11f8f72aec70a5.png

 

$$[name] Запрашивает у пользователя ввод строки с названием name, название строки должно быть на английском языке. В данном случае name это STROKA. Возвращает значение типа &string - где &string это введенный нами текст (строка)

image.png.af3908abbf023958ec9bfe2c76e706f2.png

 

$$i или $$i:d Запрашивает у пользователя ввести название любого предмета. При этом открывается окошко с их списком. Осторожно, на серверах с модами может вызывать краши клиента. Команды возвращают значения типа &string. Различия в том, что первая команда возвращает только название предмета, а вторая возвращает название предмета и через двоеточие его урон.

image.png.cfd7459199fa645974bccc7b7ce0189e.png

 

$$u Запрашивает у пользователя ввести никнейм любого игрока или выбрать его в списке. Список отображает всех игроков онлайн, кроме тех, кто использует /v. Возвращает значение типа &string - где &string это никнейм выбранного игрока

image.png.22e03e0f2c49fc9834ff860f2efa7266.png

 

$$f Запрашивает у пользователи ввести никнейм друга или выбрать его в списке. Список можно редактировать и добавлять в него друзей внутри игры. Возвращает значение типа &string - где &string это никнейм выбранного игрока

image.png.b89712ac84c32d33607fe9198fb9cf13.png

 

$$t, $$h, $$w. Запрашивают у пользователя ввести название города, дома, варпа соответственно, или выбрать его в списке. Список аналогичный с $$f, его можно также редактировать. Параметры возвращают значения типа &string, где &string - название города, дома, варпа

 

$$p Запрашивает у пользователя выбор местоположения (Метки) из списка. Список можно редактировать и добавлять в него местоположения внутри игры. У каждого местоположения есть 3 координаты: X Y Z. Возвращает значение типа &string, где $string - строка, содержащая координаты X, Y, Z через запятую.

image.png.0b02983f5c4791384cd991613071f486.png

 

$$px, $$py, $$pz Параметры запрашивают у пользователя выбор местоположения (Метки) из списка. Список тот же, что и при вызове $$p. Единственное, что меняется - тип возвращаемого значения. $$px, $$py,  $$pz возвращают значения типа #int - где #int это числовое представление координаты: X для $$px, Y для $$py, Z для $$pz.

 

$$pn Параметр запрашивает пользователя выбрать в списке местоположение (Метку). Список тот же, что и при вызове $$p. Возвращает значение типа &string - где &string это название метки

 

$$0 - $$9 Эти параметры отображают страницы со строками текста, которые мы вводим сами. Эти строки можно редактировать, удалять и добавлять. Строки на страницах $$1 , $$2 , $$3 и т.д. отличаются, что даёт доступ к хранению большого количества разнообразного текста. Однако есть большое НО: текст можно хранить только на английском языке. Параметры возвращают значения типа &string - где &string это выбранная игроком строка текста.

image.png.a2c415c855ce920d2b2730a4ed5039ee.png

 

$$<filename.txt> Этот параметр ничего не запрашивает у игрока. Он скорее запрашивает информацию у текстового файла, расположенного в папке с макросами. Этот параметр считывает только первую строку текстового файла. Возвращает значение типа &string, где $string - строка, которая была считана с первой строки файла.

//Если испугались этого кода - прочитайте сначала главу 2, а потом вернитесь к этому месту
$${
  &a = $$<texts.txt>
  log(%&a%)
  }$$

Содержимое файла texts.txt:
Hello World
Text1
Text2

Результат:

Hello World

 

$$m Запрашивает у пользователя выбор файла. Этот параметр можно много где применить. И то, что он будет делать зависит от того, как его вызывать. 

image.png.07c59d9016e5a26744df42f91872eed6.png

Пример использования:

Скрытый текст

image.png.157d6039377c4358521e39b55f5a6117.png

Если ввести этот параметр в поле редактирования макроса. То при его вызове (событием или клавишей) у пользователя будет перед глазами список, где он сможет выбрать скрипт, который будет исполняться.

 

$$! Параметр для дампа, останавливает компиляцию кода в том моменте, где был вызван и выгружает содержимое последнего сообщения в чат, чтобы вы могли его редактировать

 

Пример работы:

$${
  &b = "Hello World"
  #a = 2
  $$!
  log(%&a%)
}$$

В результате работы данного кода произойдёт следующее: 

В поле чата будет введен текст "#a = 2", а из-за того, что компиляция кода остановлена, то последующие команды, после $$! будут просто писаться в чат

 

Edited by Lego_Chubzik
  • Нравится 1
Link to comment
Share on other sites

 Глава 2. Переменные и типы данных

 

2.1 О переменных

 

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

 

Имя переменной может содержать любые цифры, буквы и символ подчеркивания, при этом первый символ в имени должен быть буквой или символом подчеркивания.

В имени не должно быть знаков пунктуации и пробелов. 

 

2.2 Типы данных

 

В Macro Keybind mod существует только 3 типа данных: 

int - хранит целое число от -2137483648 до 2137483647. Обозначается как: #имя_переменной

string - текстовый тип данных. Переменная этого типа может хранить в себе некоторую строку. Обозначается как: &имя_переменной

bool - логический тип данных. Переменная этого типа может принимать в себя только 2 значения: True или False (да или нет)

 

Macro Keybind mod не имеет типа данных для вещественных (дробных) чисел. т.е число 3.1415 он хранить не может  Зато массивы он хранить умеет, но сейчас их трогать еще очень рано

 

Ниже я показываю, как работают переменные, с моими комментариями (Рекомендую посмотреть)

Цитата
$${
// Ниже я создаю (объявляю) целочисленную переменную и присваиваю ей значение (инициализирую ее).
#a = 10
// аналогично объявляю переменную логического типа bool и инициализирую ее значением true. true и false обязательно писать с маленькой буквы
b = true
// точно также объявляю переменную типа string (строка) и инициализирую ее определенным текстом
// лучше всего любой текст писать в кавычках, чтобы не было путаницы. Текст в кавычках называется Строковым Литералом
&c = "Hello World"
// На данном этапе мы имеем в памяти 3 переменные. #a , b, &c
// Чтобы сказать компилятору, что мы обращаемся именно ко значению переменной, а не к ее имени - нужно окружить переменную знаками %, при этом нужно не забывать указывать тип данных (& - строка(string) # - число(int) Без указания - Логическое значение(bool))
//Ниже я выведу в чат значения переменных с помощью функции log()
log("Число: %#a% Логическое значение: %b% Строка: %&c%")
// Конструкция %#a% при выводе превратится в 10, %b% в True, %&c% в "Hello World"
}$$

Результат работы программы (отобразится в чате): 

Число: 10 Логическое значение: True Строка: Hello World

 

2.3  Преобразование и взаимодействие типов данных

 

Взаимодействие между типом данных bool и #int

Скрытый текст

Как мы уже знаем - Логический тип данных может принимать значения true или false. Однако переменную логического типа можно превратить в число незамысловатым образом: true - это число 1, а false - это число 0.

$${
c = true
//#x1 = c = true -> 1
#x1 = c
log(%#x1%)

// d = #x1 = 1 -> true
d = #x1
log(%d%)
}$$

Результат:

1

True

 

Преобразование типов #int и bool в &string

Скрытый текст

Переменная типа &string может принимать только текст, чтобы присвоить ей значение какой-то другой переменной, нужно обратиться конкретно к значению, присваиваемой переменной через знаки процента %переменная%. 

$${
#x = 4
&a = "Number %#x%" 
log(%&a%)
g = false
&a = %g%
log(%&a%)
}$$

Результат:

Number 4

False

 

Преобразование типа &string в #int

Для преобразования типа &string в тип #int существует функция SET(). SET(переменная, значение) Устанавливает для цели указанное значение или TRUE, если значение не указано)

 

Пример использования функции:

$${
&c = -10
set(#x, %&c%)
log(%#x%)
}$$

Результат: 

-10

 

2.4 Встроенные переменные

 

Macro Keybind mod имеет в распоряжении множество встроенных переменных, каждая из которых предоставляет определенную информацию в игре. В эти переменные нельзя передавать значения, они сами меняются в зависимости от определенных действий по ходу игры. Для того, чтобы обратится ко встроенной переменной достаточно просто написать ее имя большими буквами. Если записывать в &string переменную встроенную переменную, то ее имя необходимо окружить знаками процента %ИМЯ%

Скрытый текст
$${
// Переменная XPOS выдаёт местоположение игрока: координату X
#c = XPOS
log(%#c%)
//Переменная DIMENSION выдаёт текущее измерение игрока: NETHER, SURFACE, END, UNKNOWN
&a = %DIMENSION%
log(%&a%)
}$$

Результат:

1367

SURFACE

 

Список встроенных переменных:

Скрытый текст

Игра:

KEYID, KEYNAME — номер и название клавиши, вызвавшей скрипт

STACKSIZE — размер стека

CTRL, ALT, SHIFT, KEY_<название> — дают истину, если нажаты

Список клавиш KEY_<название>:

Скрытый текст

KEY_0     
KEY_1     
KEY_2     
KEY_3    

KEY_4     
KEY_5     
KEY_6     
KEY_7     
KEY_8     
KEY_9     
KEY_A     
KEY_ADD     
KEY_APOSTROPHE     
KEY_APPS     
KEY_AT     
KEY_AX     
KEY_B     
KEY_BACK     
KEY_BACKSLASH     
KEY_C     
KEY_CAPITAL     
KEY_CIRCUMFLEX     
KEY_CLEAR     
KEY_COLON     
KEY_COMMA     
KEY_CONVERT     
KEY_D     
KEY_DECIMAL     
KEY_DELETE     
KEY_DIVIDE     
KEY_DOWN     
KEY_E     
KEY_END     
KEY_EQUALS     
KEY_ESCAPE     
KEY_F     
KEY_F1     
KEY_F10     
KEY_F11     
KEY_F12     
KEY_F13     
KEY_F14     
KEY_F15     
KEY_F16     
KEY_F17     
KEY_F18     
KEY_F19     
KEY_F2     
KEY_F3     
KEY_F4     
KEY_F5     
KEY_F6     
KEY_F7     
KEY_F8     
KEY_F9     
KEY_FUNCTION     
KEY_G     
KEY_GRAVE     
KEY_H     
KEY_HOME     
KEY_I     
KEY_INSERT     
KEY_J     
KEY_K     
KEY_KANA     
KEY_KANJI     
KEY_L     
KEY_LBRACKET     
KEY_LCONTROL     
KEY_LEFT     
KEY_LMENU     
KEY_LMETA     
KEY_LSHIFT     
KEY_M     
KEY_MINUS     
KEY_MOUSE3     
KEY_MOUSE4     
KEY_MULTIPLY     
KEY_N     
KEY_NEXT     
KEY_NOCONVERT     
KEY_NONE     
KEY_NUMLOCK     
KEY_NUMPAD0     
KEY_NUMPAD1     
KEY_NUMPAD2     
KEY_NUMPAD3     
KEY_NUMPAD4     
KEY_NUMPAD5     
KEY_NUMPAD6     
KEY_NUMPAD7     
KEY_NUMPAD8     
KEY_NUMPAD9     
KEY_NUMPADCOMMA     
KEY_NUMPADENTER     
KEY_NUMPADEQUALS     
KEY_O     
KEY_P     
KEY_PAUSE     
KEY_PERIOD     
KEY_POWER     
KEY_PRIOR     
KEY_Q     
KEY_R     
KEY_RBRACKET     
KEY_RCONTROL     
KEY_RETURN     
KEY_RIGHT     
KEY_RMENU     
KEY_RMETA     
KEY_RSHIFT     
KEY_S     
KEY_SCROLL     
KEY_SECTION     
KEY_SEMICOLON     
KEY_SLASH     
KEY_SLEEP     
KEY_SPACE     
KEY_STOP     
KEY_SUBTRACT     
KEY_SYSRQ     
KEY_T     
KEY_TAB     
KEY_U     
KEY_UNDERLINE     
KEY_UNLABELED     
KEY_UP     
KEY_V     
KEY_W     
KEY_X     
KEY_Y     
KEY_YEN     
KEY_Z

CONFIG — текущая конфигурация

Мир:

ONLINEPLAYERS, MAXPLAYERS — число игроков в сети и максимум

DAYTIME, DAY, TICKS, DAYTICKS, TOTALTICKS — игровое время, тики (в творческом можно задать: /time set <число>)

RAIN — сила дождя (0–100)

SERVER, SERVERNAME, SERVERMOTD — сервер: адрес, название, описание

SEED — семя (ключ для генератора)

Игрок: 

PLAYER — имя игрока

XPOS, YPOS, ZPOS — координаты: x – широта, y – высота, z – долгота

BIOME — название биома, в котором находится игрок (например, Plains)

HEALTH, ARMOUR — здоровье (0–20), броня (0–20)

HUNGER — голод игрока (0–20)

OXYGEN — кислород игрока (0-300)

LEVEL — уровень

XP, TOTALXP — опыт: Сколько единиц опыта на текущем уровне. Сколько единиц опыта всего

MODE — Возвращает число, соответствующее режиму игры: 0 – SURVIVAL, 1 – CREATIVE, 2 – ADVENTURE, 3 – SPECTATOR

INVSLOT — выбранный слот (1–9) на хотбаре

LIGHT — освещённость (0–15)

DIMENSION — измерение: NETHER, SURFACE, END, UNKNOWN

ITEM, ITEMCODE, ITEMNAME, ITEMDAMAGE, ITEMIDDMG — Информация о предмете: Текстовой id, Код предмета, Имя предмета, Максимальная прочность предмета, id предмета + урон

DURABILITY — Текущая прочность предмета

FPS — кадров в секунду

SATURATION — насыщенность

HELMID, HELMNAME, HELMDAMAGE, HELMDURABILITY - айди шлема, его название, максимальная прочность, текущая прочность

CHESTPLATEID, CHESTPLATENAME, CHESTPLATEDAMAGE, CHESTPLATEDURABILITY - айди нагрудника, его название, максимальная прочность, текущая прочность

LEGGINGSID, LEGGINGSNAME, LEGGINGSDAMAGE, LEGGINGSDURABILITY - айди штанов, их название, максимальная прочность, текущая прочность

BOOTSID, BOOTSNAME, BOOTSDAMAGE, BOOTSDURABILITY - айди ботинок, их название, максимальная прочность, текущая прочность

CONTAINERSLOTS — число слотов в сундуке, что бы это ни значило )

CHUNKUPDATES — обновления чанка

VEHICLE, VEHICLEHEALTH — транспортное средство: название, здоровье

CANFLY, FLYING — полёт: возможность полёта(true или false), состояние полёта (true или false)

 

2.4 Глобальные переменные

 

Помимо типа данных, переменная может быть локальной (она будет доступна только в том скрипте, где была создана) и глобальной (после ее создания она будет записана в файл .globalvars.xml и станет доступна для любого другого скрипта). Для того, чтобы объявить глобальную переменную нужно перед ее типом поставить знак @. Например при компиляции следующей строки "@#a = 10" будет инициализирована глобальная переменная a со значением 10. Чтобы обратится к этой переменной (например через log()) нужно писать %@#a%.

 

Пример объявления и вызова глобальной переменной описан ниже:

Скрытый текст

Скрипт 1:

$${
@&str = "Это глобальная строка"
}$$

 

Скрипт 2:

$${
log("Глобальная строка: %@&str%");
}$$

Теперь если мы активируем первый скрипт, а потом второй скрипт, то второй скрипт выведет в чат: "Глобальная строка: Это глобальная строка". Однако нужно быть внимательным. Если запустить второй скрипт, ни разу перед этим не вызывая первый скрипт, то он ничего не выведет. Т.к. переменная @&str нигде не была инициализирована. Если первый скрипт уже был хоть раз вызван, то эта глобальная переменная останется в памяти мода даже после перезахода в игру.

 

Значение глобальной переменной может изменить любой скрипт. Пример:

 

Скрипт 1:

$${
@&str = "Это глобальная строка"
}$$

 

Скрипт 2:

$${
@&str = "Это измененная глобальная строка"
}$$

 

Скрипт 3:

$${
log("Глобальная строка: %@&str%")
}$$

Если вызвать по очереди Скрипт 1,2,3. То в итоге значение @&str останется "Это измененная глобальная строка", если после этого вызвать опять первый скрипт, то значение глобальной изменится и станет "Это глобальная строка"

 

2.5 Управляющие последовательности

 

Если испугались названия, то можете пропустить эту подглаву, а тем кто хочет знать "всё" предлагаю ознакомится с управляющими последовательностями. На самом деле в них ничего сложного нет. Управляющая последовательность представляет символ, перед которым ставится обратный слеш. И данная последовательность интерпретируется определенным образом. Наиболее часто используемые последовательности:

 

\n - перевод строки - символ перехода на новую строку

\t - табуляция - символ табуляции (примерно 5 пробелов  )

\ - обратный слеш - служит для того, чтобы в Строковый литерал возможно было добавить определенные символы, например: / " * 

 

Пример использования управляющих последовательностей:

Скрытый текст
$${
// Слеш служит для того, чтобы в строку можно было записать символ наподобие кавычки ". 
// Для того, чтобы в строковый литерал добавить слеш необходимо, как это ни странно, поставить перед ним еще 1 слеш
log("\"Hello\\World\"")
}$$

Результат работы скрипта:

"Hello\World"

 

2.6 Арифметические операции

 

В Macro Keybind mod используется большинство операций, которые применяются и в других языках программирования. Операции представляют определенные действия над операндами - участниками операции. В качестве операнда может выступать переменной или какое-либо значение (например, число). Операции бывают унарными (выполняются над одним операндом), бинарными - над двумя операндами и тернарными - выполняются над тремя операндами. Рассмотрим все виды операций.

 

Бинарные арифметические операции:

 

Операция + Я думаю, всем, кто дочитал до этого момента, очевидно, что делает плюс  

Скрытый текст
$${
#x = 10+2
#y = #x+2
#z = #x+#y
log("X: %#x% Y:%#y% Z:%#z%")
}$$

Результат:

X: 12 Y:14 Z:26

 

Операция -

Скрытый текст
$${
#x = 10-2
#y = #x-2
#z = #x-#y
log("X: %#x% Y:%#y% Z:%#z%")
}$$

Результат:

X: -12 Y: -14 Z: 2

 

Операция Умножения *

Скрытый текст
$${
#x = 10*2
#y = #x*2
#z = #x*#y
log("X: %#x% Y:%#y% Z:%#z%")
}$$

Результат:

X: 20 Y: 40 Z: 800

 

Операция Деления / Тут есть 1 нюанс. Если вы были внимательны и хорошо прочитали подглаву 2.2, то уже знаете, что в Macro Keybind mod нет вещественных чисел.

Результат деления будет 

Скрытый текст
$${
// 10/2 = 5
#x = 10/2
// 5/2 = 2.5 -> 2
#y = #x/2
// 5/2 = 2.5 -> 2
#z = #x*#y
log("X: %#x% Y:%#y% Z:%#z%")
}$$

Результат:

X:5 Y:2 Z:2

 

Унарные арифметические операции:

 

Операция (Инкремента) выполнена через функцию INC(#var). Инкремент - очень простая операция, она увеличивает переменную на 1

Скрытый текст
$${
#z = 4
INC(#z)
log("Z:%#z%");
}$$

Результат:

Z: 5

 

Операция (Декремента) выполнена через функцию DEC(#var). Декремент обратен инкременту и уменьшает переменную на 1

Скрытый текст
$${
#z = 4
DEC(#z)
log("Z:%#z%");
}$$

Результат:

Z: 3

 

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

1) Умножение, деление

2) Сложение, вычитание

Скрытый текст
$${
#z = 4
// x = 4 + 4 = 8
#x = #z+4
// y = 8 + 2 * 2 = 8 + 4 = 12
#y = #x+2*2
DEC(#z)
log("Z:%#z% X: %#x% Y:%#y%");
}$$

Результат:

Z:3 X:8 Y:12

 

2.7 Ассоциативность операторов

 

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

#x = 10 / 5 * 2

 

Стоит нам трактовать это выражение как (10 / 5) * 2 или как 10 / (5 * 2)? Ведь в зависимости от трактовки мы получим разные результаты. Все операторы в Macro Keybind правоассоциативные, то есть выполняются справа на лево, по крайней мере должны

Результат вычислений 10/5*2 будет 1, т.к 2*5/10  = 1. Чтобы это исправить, нужно руками поставить скобки, получится выражение (10 / 5) * 2, результат этих вычислений будет 4.

 

 

Edited by Lego_Chubzik
Link to comment
Share on other sites

 Глава 3. Условные выражения и логические операции

 

3.1 О условных выражениях

 

Отдельный набор операций представляют условные выражения. Такие операции возвращают логическое значение, то есть значение типа bool: true, если выражение истинно, и false, если выражение ложно. К подобным операциям относятся операции сравнения и логические операции.

 

3.2 Операции сравнения

 

В операциях сравнения сравниваются два операнда и возвращается значение типа bool - true, если выражение верно, и false, если выражение неверно.

 

Операция ==

Сравнивает два операнда на равенство. Если они равны, то операция возвращает true, если не равны, то возвращается false:

Скрытый текст
$${
#a = 10
#b = 4;
// Идёт проверка, равны ли #a и #b. В данном случае #a=10 не равно #b=4
// c - переменная-флаг, принимающая только True или False. В данном случае в нее записывается результат операции
c =   #a == #b
log(%c%)
}$$

Результат:

False

 

!=

Сравнивает два операнда и возвращает true, если операнды не равны, и false, если они равны.

Скрытый текст
$${
#a = 10
#b = 4;
// Идёт проверка, не равны ли #a и #b. В данном случае #a=10 не равно #b=4, поэтому результат будет true
// c - переменная-флаг, принимающая только True или False. В данном случае в нее записывается результат операции
c =   #a != #b 
log(%c%)
}$$

Результат:

True

 

<

Операция "меньше чем". Возвращает true, если первый операнд меньше второго, и false, если первый операнд больше второго:

Скрытый текст
$${
#a = 10
#b = 4;
// Идёт проверка, меньше ли #a, чем #b. В данном случае #a=10 больше #b=4, поэтому результат будет false
// c - переменная-флаг, принимающая только True или False. В данном случае в нее записывается результат операции
c =   #a < #b 
log(%c%)
}$$

Результат:

False

 

>

Операция "больше чем". Сравнивает два операнда и возвращает true, если первый операнд больше второго, иначе возвращает false:

 

Скрытый текст
$${
#a = 10
#b = 4;
// Идёт проверка, больше ли #a, чем #b. В данном случае #a=10 больше #b=4, поэтому результат будет true
// c - переменная-флаг, принимающая только True или False. В данном случае в нее записывается результат операции
c =   #a > #b 
log(%c%)
}$$

Результат:

True

 

<=

Операция "меньше или равно". Сравнивает два операнда и возвращает true, если первый операнд меньше или равен второму. Иначе возвращает false.

 

Скрытый текст
$${
#a = 8;
#b = 10;
// Идёт проверка, меньше ли #a, чем #b или равны #a и #b. В данном случае #a=8 меньше, чем #b=10, поэтому результат будет true
// c - переменная-флаг, принимающая только True или False. В данном случае в нее записывается результат операции
c =   #a <= #b 
log(%c%)
}$$

Результат:

True

 

>=

Операция "больше или равно". Сравнивает два операнда и возвращает true, если первый операнд больше или равен второму, иначе возвращается false:

Скрытый текст
$${
#a = 8;
#b = 10;
// Идёт проверка, больше ли #a, чем #b или равны #a и #b. В данном случае #a=8 меньше, чем #b=10, поэтому результат будет false
// c - переменная-флаг, принимающая только True или False. В данном случае в нее записывается результат операции
c =   #a >= #b 
log(%c%)
}$$

Результат:

False

Операции <, > <=, >= имеют больший приоритет, чем == и !=.

 

3.3 Логические операции

 

Также в Macro Keybind mod определены логические операторы, которые также возвращают значение типа bool(true или false). В качестве операндов они принимают значения типа bool. Как правило, применяются к отношениям и объединяют несколько операций сравнения.

 

Операция Или ||

Операция логического сложения или логическое ИЛИ. Возвращает true, если хотя бы один из операндов возвращает true.

Скрытый текст

Таблица истинности для оператора логического сложения:

unnamed.jpg.bdbd9297d81d5907ef89568d5a30bbf8.jpg

$${
// 5 > 6 - false, 4 < 6 - true, поэтому возвращается true. Т.к и из операторов дал true
x1 = (5 > 6) || (4 < 6)
// 5 > 6 - false, 4 > 6 - false, поэтому возвращается false. Т.к ни один из операторов не дал true
x2 = (5 > 6) || (4 > 6)
log("x1 = %x1% x2 = %x2%")
}$$

Результат:

True

False

 

Операция И &&

Операция логического умножения. Возвращает true, если оба операнда одновременно равны true.

Скрытый текст

Таблица истинности для оператора логического умножения:

unnamed.jpg.88f7f1306cddea9e71db4c21b0f0ee92.jpg

$${
// 5 > 6 - false, 4 < 6 - true, поэтому возвращается false. Т.к оба оператора не вернули true, то будет false
x1 = (5 > 6) && (4 < 6)
// 5 < 6 - true, 4 < 6 - true, поэтому возвращается true. Т.к оба оператора вернули true
x2 = (5 < 6) && (4 < 6)
log("x1 = %x1% x2 = %x2%")
}$$

Результат:

False

True

 

Операция НЕ !

Операция логического отрицания. Производится над одним операндом и возвращает true, если операнд равен false. Если операнд равен true, то операция возвращает false.

Скрытый текст
$${
//Вернет false т.к 6>5 вернет true, а !true = false
x1 = !(6>5)
//Вернет true т.к !false = true
x2 = !false

log("x1 = %x1% x2 = %x2%")
}$$

Результат:

False

True

 

Edited by Lego_Chubzik
Link to comment
Share on other sites

 Глава 4. Условные конструкции

 

4.1 О логических конструкциях

 

Условные конструкции - один из базовых компонентов программирования, которые направляют работу программы по одному из путей в зависимости от определенных условий. В языке Macro Keybind mod используются следующие условные конструкции: if..elseif..else..endif. В конце каждой конструкции if должно стоять endif

 

Конструкция if проверяет истинность некоторого условия и в зависимости от результатов проверки выполняет определенный код. После ключевого слова if ставится условие. И если это условие выполняется, то срабатывает код, который помещен далее в блоке if. В качестве условий выступают ранее рассмотренные операции сравнения.

Скрытый текст
$${
#x1 = 8
#x2 = 6
// В данном случае if будет выполнять все команды, стоящие до endif, т.к. #x1(8) > #x2(6)
if(#x1 > #x2)
    log("Число %#x1% больше числа %#x2%")
endif
}$$

Результат:

Число 8 больше числа 6

 

В данном случае у нас первое число больше второго, поэтому выражение #x1> #x2 истинно и возвращает true, следовательно, управление переходит к строке log("Число %#x1% больше числа %#x2%")

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

Скрытый текст
$${
#x1 = 5
#x2 = 8
if(#x1 > #x2)
	log("Число %#x1% больше числа %#x2%")
else
	log("Число %#x1% не больше числа %#x2%")
endif
}$$

Результат:

Число 5 не больше числа 8

 

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

Скрытый текст
$${
#x1 = 8
#x2 = 8
if(#x1 > #x2)
	log("Число %#x1% больше числа %#x2%")
elseif(#x1 < #x2)
	log("Число %#x1% меньше числа %#x2%")
else
	log("Число %#x1% равно числу %#x2%")
endif
}$$

Результат:

Число 8 равно числу 8

 

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

Скрытый текст

$${
#x1 = 8
#x2 = 6
// Условие: Если x1 больше, чем x2 И x1 равен 8
if(#x1 > #x2 && #x1 == 8)
    log("Число равно восьми и оно больше числа %#x2%")
endif
}$$

Результат:

Число равно восьми и оно больше числа 6

 

Edited by Lego_Chubzik
Link to comment
Share on other sites

 Глава 5. Циклы

 

5.1 О циклах

 

Циклы являются управляющими конструкциями, позволяя в зависимости от определенных условий выполнять некоторое действие множество раз. Каждое выполнение действий внутри цикла называется итерацией. В этом разделе мы познакомимся со следующими командами, организующими циклы:

Скрытый текст

FOR(#счетчик,начало,конец) Начинает цикл FOR-> NEXT, используя указанную переменную в качестве счетчика цикла, внутри цикла можно использовать #var.

NEXT Заканчивает итерацию цикла FOR-> NEXT и проверяет, не достигла ли переменная-счетчик конечного числа, если достигла - завершает выполнение цикла.

 

DO(Количество) Начинает цикл с указанным количеством итераций (повторений).

LOOP Завершает итерацию цикла DO->LOOP

WHILE(Условное выражение) Завершает итерацию цикла, начатого с DO и прекращает выполнение цикла, если условное выражение возвращает false

UNTIL(Условное выражение) Завершает итерацию цикла, начатого с DO и прекращает выполнение цикла, если условное выражение возвращает true 

 

BREAK Прерывает выполнение цикла.

UNSAFE() Начинает небезопасный блок.

 

ENDUNSAFE Завершает активный блок UNSAFE

 

5.2 Цикл FOR-> NEXT

 

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

Вот так выглядит синтаксис цикла FOR-> NEXT:

$${
for(#имя_переменной,начало_счёта,конец_счёта)
//..
//Тело цикла(код)
//..
next
}$$

 

Цикл ниже объявляет внутри себя переменную счетчик #i. Работать она будет в указанном нами диапазоне от 0 до 5, включая оба числа. Это значит, что цикл сработает ровно 6 раз: нулевой, первый, второй, третий, четвертый, пятый.

Команда next не только завершает итерацию, проверяя условие, но еще и изменяет переменную-счетчик на 1. В данном случае - увеличивает. Выходит, что в первую итерацию значение счетчика #i будет 0, во вторую - 1, в третьею - 2 и т.д. 

$${
for(#i,0,5)
 log(%#i%)
next
}$$

Результат выполнения такого цикла:

0 1 2 3 4 5
 

Цикл FOR-> NEXT не обязательно должен работать в заданном нами диапазоне по возрастанию. Вот пример того, как начальное значение больше конечного. В этом случае команда next уменьшает значение переменной-счетчика на 1 каждую итерацию, пока оно не будет равно нулю.

$${
for(#i,5,0)
 log(%#i%)
next
}$$

Результат выполнения такого цикла:

5 4 3 2 1 0

 

Задавать значение диапазона можно и с помощью переменных, пример:

$${
#low = -2
#hight = 2
for(#i,%#low%,%#hight%)
 log(%#i%)
next
}$$

Результат выполнения такого цикла:

-2 -1 0 1 2

 

Внутри цикла так-же могут присутствовать условие конструкции(кликабельно). В данном примере цикл будет работать в диапазоне от 1 до 5. Условные выражения будут проверять больше ли переменна-счетчик, чем 2 или нет

$${
for(#i,1,5)
  if(#i < 2)
   log("Число %#i% меньше чем 2")
 else
   log("Число %#i% больше чем 2")
  endif
next
}$$


Еще примеры использования цикла for с объяснением:

Скрытый текст

Цикл FOR-> NEXT способен также способен работать и с диапазонами отрицательных чисел. При этом нужно не забывать, что чем больше число со знаком минус, тем оно меньше (-10 < -5)

$${
for(#i,-10,-5)
log(%#i%)
next
}$$

Результат выполнения такого цикла:

-10 -9 -8 -7 -6 -5

 

Сумма чисел на заданном диапазоне с помощью цикла FOR-> NEXT. Ниже представлен код, считающий сумму чисел от 1, включая, до 10, включая. Получается, что математически это выглядит вот так: 1+2+3+4+5+6+7+8+9+10 (=55). Таким же образом можно считать и факториал числа.

$${
#summa
for(#i,1,10)
#summa = #summa + #i
next
log(%#summa%)
}$$

Результат выполнения такого цикла:

55

 

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

 

5.3 Цикл DO-> LOOP

 

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

$${
do(Количество выполнений)
//...
//Тело цикла(код)
//...
}$$

 

Данный цикл не проверяет никаких условий и не создает переменных-счетчиков. Но это не мешает нам создать свою переменную счетчик. Вот пример создания переменной счетчика в цикле DO->LOOP:

$${
#i = 0
do(5)
 log("%#i%")
 inc(#i,2)
loop
}$$

Тут создан цикл DO->LOOP с пятью повторениями (итерациями). Каждую итерацию переменная #i увеличивается на 2 функцией inc().

Результат:

0 2 4 6 8

 

Задать количество выполнений цикла можно и с помощью переменной, пример:

 

$${
#i = 0
#count = 5
do(%#count%)
 log("%#i%")
 inc(#i)
loop
}$$

Результат:

0 1 2 3 4

 

Цикл DO->LOOP можно сделать бесконечным. Т.е он будет выполнятся до момента его ручного отключения. Чтобы в ручную отключить его - нужно нажать клавишу ~ и затем нажать на красный крестик исполняющегося скрипта 

image.png.66f927120fbf8aab0039d866e92892fd.png

 

Вот пример бесконечного цикла:

$${
do()
 log("Hello")
loop
}$$

Данный скрипт будет бесконечно писать в чат строку "Hello", т.к в do() не указано количество выполнений

 

5.4 Цикл DO-> WHILE

 

Цикл DO-> WHILE будет выполнятся до тех пор пока выполняется условие внутри while(). Синтаксиc цикла выглядит вот так:

$${
do() 
//...
//Тело цикла(код)
//...
while(Условное выражение)
}$$

 

Пример использования:

$${
#i = 0
  do()
  log("%#i%")
  inc(#i)
  while(#i < 5)
}$$

В скрипте выше я создаю переменную-счетчик #i. В while я указываю условие, что цикл должен выполняться до тех пор, пока #i меньше пяти. В самом цикле я инкриминирую(увеличиваю на 1) значение переменной-счетчика.

Результат:

0 1 2 3 4

 

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

$${
#i = 5
#d = 10
  do()
  log("%#i%")
  inc(#i)
  while(#i < #d)
}$$

Тут цикл будет выполняться до тех пор, пока #i < #d. Если #i никогда не станет > #d, то цикл никогда не завершиться и отключать такой скрипт придётся в ручную.

Результат:

5 6 7 8 9

 

5.5 Цикл DO-> UNTIL

 

Цикл DO-> UNTIL Является противоположностью цикла DO-> WHILE и на самом деле не особо-то и нужен за имением вышеупомянутого цикла. Данный цикл будет выполнятся до тех пор пока не выполняется условие внутри until(). Синтаксиc цикла выглядит вот так:

$${
do() 
//...
//Тело цикла(код)
//...
until(Условное выражение)
}$$

 

Пример использования:

$${
#i = 0
  do()
  log("%#i%")
  inc(#i)
  until(#i > 5)
}$$

В скрипте выше я создаю переменную-счетчик #i. В until я указываю условие, что цикл должен выполняться до тех пор, пока #i не больше пяти. В теле цикла я инкриминирую значение переменной-счетчика.

Результат:

0 1 2 3 4 5

 

5.6 Оператор BREAK

 

Иногда возникает ситуация, когда требуется выйти из цикла, не дожидаясь его завершения. В этом случае мы можем воспользоваться оператором break.

 

Пример: 

$${
#i = 0
do()
 if(#i == 5)
  break
 endif
 log(%#i%)
 inc(#i)
loop
}$$

Хотя в условии цикла сказано, что цикл будет выполняться бесконечно, в реальности цикл сработает 5 раз. Так как при достижении переменной #i значения 5, сработает оператор break, и цикл завершится.

 

5.7 Конструкция unsafe() endunsafe

 

В Macro Keybind у всех циклов есть особенность - после каждого выполнения кода внутри себя(итерации) они делают небольшую паузу, примерно равную одному тику. Для того, чтобы это обойти нужно использовать конструкцию unsafe()...endunsafe. После заключения цикла в эту конструкцию он будет выполняться максимально быстро. Для того, чтобы ей воспользоваться нужно до начала цикла прописать unsafe(), а после цикла прописать endunsafe.

 

Пример записи конструкции unsafe()...endunsafe для цикла:

$${
#i = 0
unsafe()
 do(20)
  log("%#i%")
  inc(#i,2)
 loop
endunsafe
}$$

 

Наглядный пример работы данной конструкции:

Скрытый текст

Вот так цикл выполняется без конструкции unsafe()...endunsafe:

desktop-20210109-01122701_lgUYxcnD_USzM-_online-video-cutter.com_.gif.a3e1622574e70385da9d80d28f6f2718.gif

 

А вот тот же цикл, только с данной конструкцией(Выполняется мгновенно):

desktop-20210109-01122701_Y5UzCACm_fDcM-_online-video-cutter.com_.gif.d89cc0bb504960fdb3797fc7e9fe6a28.gif

 


Однако нужно быть очень осторожным с unsafe, т.к он может вызывать серьезные лаги, особенно если цикл бесконечный

Edited by Lego_Chubzik
Link to comment
Share on other sites

Глава 6. Массивы

 

6.1 О массивах

 

Тема массивов очень обширная и очень нужная. Для начала нужно разобраться что это такое. Массив представляет набор однотипных данных, которые объединены одним именем. Массив может быть любого типа: #int (целочисленный), &string (строковый), bool (логический). Объявление массива похоже на объявление переменной за тем исключением, что после указания типа ставятся квадратные скобки. Для лучшего понимания устройства массива я приложу рисунок:

javascript-array.png.3cba614073fb141e603776b32acbf136.png

 

Выше представлен целочисленный #int массив, состоящий из пяти элементом. Каждый элемент имеет свой номер (индекс), по которому к нему можно обратиться. Обратите внимание, что нумерация массива начинается с 0. Т.е. первый элемент имеет номер(индекс) 0, а последний имеет индекс 4. 

 

6.2 Создание массивов 

 

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


&arr[0] = "text1"
&arr[1] = "hello"

 

Если такой массив &arr[] представить графически, то получится:

image.png.da3d3ca62a41308efa02f666bbadee47.png

Этот массив имеет тип &string т.е. хранит в себе элементы аналогичного типа.


Второй способ создать массив - использовать функцию push(массив, значение). Она добавляет переменную в конец массива, если он не пустой, или создаёт массив, присваивая первому элементу массива и указанное в параметрах функции значение . В параметрах функции необходимо указать имя массива, а после запятой указать значение, которое следую добавить в конец массива.

Ниже я создам точно такой же массив, как и выше, а после пропишу функцию push()

 

&arr[0] = "text1"
&arr[1] = "hello"

push (&arr[], "World")

 

Вместо команды push можно прописать &arr[2] = "World". Однако, чтобы это сделать нужно знать индекс элемента, идущего после последнего. Вот так этот массив будет выглядеть графически:

image.png.87f0fa4efe3e2f3f2074854206bfe2b3.png

 

Аналогично можно все присваивания заменить функцией push(). Эта функция умеет автоматически создавать массив, если он не создан до этого.

push (&arr[], "text1")

push (&arr[], "hello")

push (&arr[], "World")

 

Однако. Нужно понимать, что функция push() записывает значение в конец массива. Если запустить такую программу 1 раз,

$${
push(&arr[],"text1")
}$$

то после завершения работы скрипта мод создаст в файле .vars, находящемся в папке с макросами, запись. Эта запись описывает созданный массив. Вот запись:

<array key="arr" type="string">
 <element pos="0">text1</element>
</array>

Тут указано, что массив &arr содержит 1 элемент string. Из этого мы должны понять, что после завершения работы скрипта массив никуда не пропадает, а остаётся в памяти.

 

Если запустить этот же скрипт еще раз, то функция push(&arr[],"text1") уже не будет создавать массив &arr, а возьмет его из файла .vars и прибавит к его концу элемент "text1". Массив будет иметь уже 2 элемента, а запись будет выглядеть вот так:

<array key="arr3" type="string">
 <element pos="0">text1</element>
 <element pos="1">text1</element>
</array>

Это нужно понимать, чтобы не было удивлений на подобие "откуда в моей программе взялся полный массив?". 

 

Но, это можно обойти. Для этого нужно очищать память массива перед окончанием работы скрипта. По этому поводу нам следует познакомиться с функцией UNSET(переменная), которая удаляет из памяти указанную переменную/массив. С этой командой всё максимально просто:

$${
push(&arr[],"text1")
//...
//Действия с массивом и др.
//...
unset(&arr[])
}$$

В скрипте выше мы вызываем функцию push(), которая создаёт массив &arr[] и добавляет в его конец(начало) значение "text1". После этого мы можем осуществлять любые нужные нам действия с этим массивом, однако в конце следует прописать unset(&arr[]). Эта функция удалит из файла .vars вышеупомянутый массив. При следующем запуске программа опять создаст массив, т.к в файле его нет, присвоит ему значение "text1", проделает те же самые действия, а по окончанию опять удалит его из памяти. 

 

Также создать массив можно с помощью функции SPLIT(). Для начала нужно познакомиться с ней:

SPLIT(разделитель, источник, вывод[]) Позволяет разделить текстовую строку, используя разделитель, при этом разделенные элементы превращает в массив.

 

Например у нас есть текстовая строка: "red, orange, yellow, green". Нам нужно создать массив, каждый элемент которого будет определенным цветом. Эти слова разделяются запятыми, ее мы и будем передавать в качестве параметра в функцию.

Вот как будет выглядеть код

&str = "red, orange, yellow, green"
split(", ",%&str%,&arr[])

В результате мы получим массив arr[] из четырёх элементов, вот его графическое представление:

image.png.5e24f57f55b3e4b8dd65e3a9707be9a0.png

 

У функции split() есть полная противоположность - функция JOIN(соединитель, массив, &вывод). Эта функция принимает массив и превращает его в строку, слепленную из элементов массива. Между этими элементами в строке будет стоять "соединитель". Вот пример работы:

$${
&str = "red, orange, yellow, green"
split(", ",%&str%,&arr[])
join(":",&arr[],&colors)
log(%&colors%)
unset(&arr[])
}$$

Тут сначала создаётся массив &arr[] из строки, а потом из этого массива создаётся строка &colors.

Результат работы кода: red:orange:yellow:green

 

6.3 Чтение массивов

 

На этом моменте мы умеем создавать массивы. Но как же вывести в чат или как вообще обратиться к его элементам. Сделать это не сложно, достаточно обратиться к элементу по его индексу. Допустим у нас есть такой массив &arr[]:

image.png.5e24f57f55b3e4b8dd65e3a9707be9a0.png

Чтобы вывести в чат третий элемент массива в чат - нужно прописать log(%&arr[2]%)

 

Обратиться к элементу массива можно и с помощью переменной:

$${
&str = "red, orange, yellow, green"
split(", ",%&str%,&arr[])
#number = 2
log(%&arr[%#number%]%)
unset(&arr[])
}$$

Результат: yellow

 

Также для чтения массива существует интересная функция POP(). Кратко говоря - это функция, обратная функции PUSH(). Разница в том, что PUSH() добавляет элемент в конец массива, а функция POP() заносит значение последнего элемента массива в переменную и удаляет ее с массива. Вот синтаксис и краткое пояснение функции POP:

POP(массив[], переменная) Удаляет последнюю запись из хвоста массива и сохраняет ее в outvar

Пример использования:

$${
&str = "red, orange, yellow, green"
split(", ",%&str%,&arr[])
pop(&arr[],&last)
log(%&last%)
unset(&arr[])
}$$

Результат: greenМассив: &arr[0] = "red", &arr[1] = "orange", &arr[2] = "yellow"

 

6.3 Перебор массивов

 

Автоматический перебор элементов массива осуществляется циклом. Для этого может подойти любой цикл, но я предпочитаю использовать цикл for->next либо цикл foreach(), о нем поговорим далее.

 

6.4 Цикл foreach()

 

С циклом foreach() в этом гайде мы знакомимся впервые, хоть глава с циклами уже была. Я разместил его в этом разделе, т.к без знания темы массивов этот цикл понятен не будет. 

Цикл foreach предназначен для перебора элементов в массивах. Перебор массива в таком цикле осуществляется с помощью переменной-итератора. Каждую итерацию этого цикла переменной-итератору будет присваиваться следующее значение массива. Формальное объявление цикла foreach():

$${
foreach(имя_массива[],имя_итератора)
//...
// Действия
//...
next
}$$

 

Вот пример использования цикла foreach():

$${
&str = "red, orange, yellow, green"
split(", ",%&str%,&arr[])
foreach(&arr[],&a)
log("it: %&a%")
next
UNSET(&arr[])
}$$

Тут я создаю строковый массив &arr[] из строки &str. Далее я создаю цикл foreach(), куда в параметры передаю имя массива и переменную-итератор. В данном случае этой переменной является &a. Массив &arr[] состоит из четырёх элементов - это значит, что у цикла foreach будет 4 итерации, на первой итерации переменная &a будет равна "red", на второй - "orange" и т.д. Итератор &a может использоваться только для чтения информации.

Результат: red orange yellow green

 

Плюсы foreach():

1) Не требуется самому определять конечный индекс массива

2) Простота использования

3) Не требуется переменная-счетчик

Минусы foreach():

1) Переменная-итератор доступна только для чтения. Изменять массив через foreach неудобно и не особо-то и возможно.

2) Отсутствие переменной счетчика

 

6.4 Встроенные массивы и итераторы

 

В macro keybind присутствует такая вещь, как встроенные массивы. Вот их список:

Цитата

players Этот массив хранит в себе список игроков, находящихся на сервере

Доступные итераторы: 

PLAYERNAME - Ник игрока

 

effects Этот массив хранит в себе список эффектов, висящих на игроке

Доступные итераторы:

EFFECTID - id эффекта

EFFECT - Название эффекта капсом

EFFECTNAME - Название эффекта в нормальном регистре с указанием уровня эффекта

EFFECTPOWER - Сила эффекта

EFFECTTIME - Время эффекта

 

enchantments Этот массив хранит в себе список зачарований, висящих на предмете, который игрок держит в руках

Доступные итераторы:

 

ENCHANTMENTNAME - Название зачарования

ENCHANTMENTPOWER - Сила зачарования

ENCHANTMENT - Названия зачарования + Сила зачарования

 

env Этот массив хранит в себе список существующих встроенных переменных.

Доступные итераторы:

VARNAME - Имя встроенной переменной

 

Доступ ко встроенным массивам и итераторам осуществляется только через цикл foreach(). Вот пример:

$${
foreach(players)
 log(%PLAYERNAME%)
next
}$$

Данный скрипт выведет никнеймы всех игроков на сервере. Цикл будет перебирать элементы массива players, который содержит в себе никнеймы всех игроков онлайн. Итератор тут создавать не требуется, т.к для массива players уже встроен итератор PLAYERNAME.

 

Вот еще пример использования цикла foreach() для доступа ко встроенным массивам:

$${
foreach(enchantments)
 log("%ENCHANTMENT%")
next
}$$

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

image.png.10e9bf70389ac0c8f5b5997e8abd0644.png

 

6.5 Цикл FOR->NEXT для перебора элементов массива

 

Как мы уже знаем, foreach() сам определяет конец массива, в этом его удобство. Цикл FOR->NEXT работает по диапазону чисел. Нижний предел диапазона мы знаем - это 0 - первый индекс любого массива. А как узнать последнее число диапазона (индекс последнего элемента массива)? Для этого существует команда ARRAYSIZE(массив,#переменная). Она сохраняет размер указанного массива в переменную, переданную в параметры. Единственный нюанс - размер массива не равен последнему числу диапазона (индексу последнего элемента), т.к. нумерация индексов начинается с нуля. 

 

Вот простой простой пример перебора массива с помощью цикла FOR->NEXT:

$${
&str = "red, orange, yellow, green"
split(", ",%&str%,&arr[])
  
arraysize(&arr[],#max)
dec(#max)
  
for(#i,0,%#max%)
 log("%&arr[%#i%]%")
next
  
UNSET(&arr[])
}$$

Тут всё должно быть ясно. Скрипт создаёт массив из строки. С помощью функции создаёт переменную целочисленного типа #max, которая принимает значение размера массива, затем она уменьшается на 1, чтобы ее значение превратилось в значение последнего индекса массива. Затем запускается цикл в диапазоне от 0, до последнего индекса массива (3). В цикле будет 4 итерации, Результат выполнения: red, orange, yellow, green

 

В отличие от цикла foreach в цикле FOR->NEXT мы можем изменять значения элементов массива, т.к обращаемся к ним через индекс, а не через переменную-итератор

 

Вот например я создам массив с помощью цикла FOR->NEXT из пяти элементов. Значение каждого элемента массива будут равны своему индексу, умноженному на 2:

$${
for(#i,0,5)
 #arr[%#i%] = #i * 2
 log("%#arr[%#i%]%")
next
  
UNSET(&arr[])
}$$

Сразу же после создания элемента в массиве я вывожу его через log(). Результат работы: 0 2 4 6 8 10

 

6.6 Поиск в массиве с функцией INDEXOF

 

Данная функция принимает в себя массив и значение для поиска. На выходе она выдаёт индекс элемента массива, содержащего указанное значение в параметрах функции.

Пример использования:

$${
&str = "red, orange, yellow, green"
split(", ",%&str%,&arr[])

INDEXOF(&arr[],#index,"yellow")
log("index of yellow element is %#index%")

UNSET(&arr[])
}$$

Результат: 2

Edited by Lego_Chubzik
  • Нравится 1
Link to comment
Share on other sites

Глава 7. Модули

 

7.1 О модулях

 

 

И так - гайд по программированию позади. Теперь нас ждёт "подарок" 🙂 . Это тема модулей. Кратко говоря - модули это пользовательские аддоны для мода, которые каждый пользователь может установить себе. Модуль может расширять функциональность мода, добавляя новый функционал, команды, события, встроенные переменные и т.д.

 

Модули хранятся в папке:

%AppData%\Roaming\.simplemc\[Ваш сервер]\liteconfig\common\macros\modules

Для работы модуля сюда нужно закинуть его файлы и перезапустить игру

 

7.2 Модуль SUtils 

 

Данный модуль был сделан специально под проект SMC и предоставляет большое количество дополнительных возможностей, включая радар игроков, автореконнект и т.д. подробнее о модуле в официальном Discord Канале: https://discord.gg/hw2M2tfNhE

 

Скрытый текст

Дизайн главного окна модуля SUtils на момент 04.07.2021

 

image.png.c0d67af01de38cac05bf8ac128f868ac.png

 

 

 

7.3 Модуль SignText (описание с офф. источника)

 

Источник: MinecraftForum

 

Скрытый текст

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

 

GETHITSIGNTEXT ([& outarray])

GETSIGNTEXT (<# x>, <# y>, <# z>, [& outarray])

SETSIGNTEXT (<# x>, <# y>, <# z>, <& line1>, <& line2>, <& line3>, <& line4>)


Если на GET был знак, необязательный массив & outarray будет перезаписан 4 строками текста знака; если не было знака, & outarray не изменится. Если вы UNSET и outarray, вы можете проверить, удалось ли это, проверив, изменилась ли длина массива с помощью ARRAYSIZE.

Функции GET также поддерживают массив и возвращаемые скалярные значения; если вы укажете массив с помощью [], в него будут помещены четыре строки:

& returnarray [] = GETHITSIGNTEXT ();

но если вы укажете скаляр, будет возвращена только первая строка текста знака:

& returnline = GETHITSIGNTEXT ();



SETSIGNTEXT работает только в одиночной игре, поскольку клиент-серверная архитектура Minecraft имеет несколько проверок безопасности, которые предотвращают изменение знаков по прихоти. Тем не менее, я думаю, что это может быть полезно для некоторых людей в одиночной игре.

Вот пример использования GETHITSIGNTEXT:

 

// Знак пост = 63 и настенный знак = 68 IF ((HITID == "знак_стояния") || (HITID == "знак_стены")); ОТКЛЮЧИТЬ (& знаковый текст []); // & signtext [] имеет размер 0 GETHITSIGNTEXT (& знаковый текст); ARRAYSIZE (& signtext, # length); ЕСЛИ (# длина> 0); // делаем что-то с & signtext [0], & signtext [1], & signtext [2], & signtext [3] ENDIF; ENDIF;

Наблюдатель может заметить, что GETHITSIGNTEXT является избыточным, поскольку его возможности могут быть воспроизведены с помощью GETSIGNTEXT. Кроме того, в сочетании с предыдущим модулем FarHit можно моделировать функцию GETFARHITSIGNTEXT.

 

допишу потом 🙂 

Edited by Lego_Chubzik
  • Нравится 1
Link to comment
Share on other sites

Глава 8. Эмуляция методов

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

Когда дойду до этой темы - напишу.

Edited by Lego_Chubzik
Link to comment
Share on other sites

  • 5 months later...

Добрый день! Пытался создать макрос для оповещения(Желательно звукового)которое будет проверять чат на появление определенного текста, но не получается. немного не понимаю как взять сообщение из чата и сделать оповещение. При обычном условии для события OnChat если появляется сообщение " привет" то уведомляет меня, так не получается. Может вы подскажете как правильно написать?

Link to comment
Share on other sites

  • 3 months later...
4 минуты назад, DarWin80 сказал:

У меня вопрос. можно ли как-нибудь сделать ожидание ( wait() ) в миллисекундах?

 

$${
  log("1")
  // Some Code
  
  wait(228ms)
  
  //Some Code
  log("2")
}$$

 

Link to comment
Share on other sites

  • 7 months later...

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...