Skip to content

Latest commit

 

History

History
1299 lines (996 loc) · 77.4 KB

File metadata and controls

1299 lines (996 loc) · 77.4 KB

Персональный самоучитель студента по программированию в Minecraft

Содержание

Введение

Minecraft это 3D игра типа "песочница". В ней вы можете построить и смастерить все что вам хочется. Minecraft может быть доработана через создание 'Mods' (Модов) (сокращение от 'modifications') - дополнительные куски кода для Игры. ScriptCraft это один такой Mod - он позволяет вам программировать на Javacript прямо в игре, с JS возможно ...

  • Строить с использованием простых javascript команд.
  • Добавлять в игру новые интересные вещи - добавлять новые Элементы, изменять поведение игры и создавать мульти-игры.

В Minecraft можно играть в одиночном режиме и сетевом (с друзьями). Большинство людей играют в Minecraft в сетевом режиме, где игроки подключаются к серверу Minecraft через internet или локальную сеть (когда сервер запущен на одном из компьютеров игроков).

Cottages created using ScriptCraft in MineCraft

Установка

Перед установкой ScriptCraft нужно запустить SpigotMC со специальной версией сервера Minecraft, которая позволяет легко менять игру.

Установка и запуск SpigotMC

Нужно проделать следующие шаги по скачиванию и установке SpigotMC.

  1. Скачать Spigot's [BuildTools.jar][spigotdl]
  2. Записать файл BuildTools.jar в новую директорию с названием spigotmc.
  3. Открыть терминал (Mac и Linux) или командную строку (windows) и набрать java -jar BuildTools.jar. Осуществиться запуск большого количества команд для "build" (сборки) SpigotMC.
  4. Когда сборка закончиться, в каталоге spigotmc вы увидите новый файл с названием spigot и расширением .jar. Запустите этот файл командой java -jar spigot-1.10.2.jar (имя файла может отличаться - посмотрите список файлов в директории командой dir (Windows) или ls (Mac and Linux).
  5. Сервер запуститься в течении 1-2 минут и остановиться. После чего появиться файл eula.txt, в котором надо внести изменения - поменяйте eula=false на eula=true и сохраните файл.
  6. Снова запуститье java -jar spigot-1.10.2.jar из командной строки - в этот раз сервер запуститься. Для остановки сервера наберите stop в командной строке.

Установка ScriptCraft

Сделайте следующие шаги для скачивания и установки ScriptCraft.

  1. Скачайте плугин [scriptcraft.jar][dl] и запишите его в директорию plugins и перезапустите сервер командой java -jar spigot-1.10.2.jar.
  2. Для теста в командной строке наберите js 1 + 1. Ответ 2 должен вернуть сервре.

Поздравляем! - Вы успешно установили и запустили свой собственный сервер Minecraft и теперь готовы к созданию своего собственного Мода (mod)!

Конфигурация вашего сервера (желательно)

После установки SpigotMC, нужно сделать настройки, Мы советуем изменить некоторые строки в файле server.properties (который находиться в директории spigotmc):

# completely flat worlds are best for building from scratch
# bukkit/spigotmc
level-type=FLAT
generate-structures=false

# creative mode
gamemode=1
pvp=false

# turns off authentication (for classroom environments)
online-mode=false
spawn-npcs=false
spawn-monsters=false

Изучение Javascript

Для создание новых отличных вещей в Minecraft вместе с ScriptCraft, не нужны глубокие знания JavaScript. ScriptCraft уже имет множество отличных функций для создания зданий любого размера. Эксперементируйте во время вашей игры. Со временем, после изучения Javascript возможно создать многжество очень интересных вещей в Minecraft - не только здания, можно добавлять в игру новые правила и вещи - делать свои собственные мини-игры для себя и
своих друзей. Если вам захотелось изучить JavaScript, посмотрите эту ссылку fun Javascript Tutorial. Если вы хотите правильно начать изучать ScriptCraft, прочтите ссылку...

Первые шаги

Если вы не писали на Javascript до этого момента, не волнуйтесь, вы в процессе чтения этого руководства начнете программировать на Javascript. Надеюсь, вы запустили уже сервер и готовы подключиться к нем ...

  1. Запустите Minecraft.

  2. Выберите 'Сетевая'

  3. Кликнете на 'Добавить сервер'

  4. Наберите любое хороше имя в поле для имени и затем наберите localhost в поле сетевого адреса. localhost это специальный интернет адресс который указывает на ваш собственный компьютер.

  5. Кликнете 'Подключиться' для подключения к серверу. Если версия Minecraft несовместима с версией сервера, у вас не будет возможности подключиться. Для исправления нужно откорректировать профиль вашего клиента Minecraft. В профиле можно выбрать любую версию клиента Minecraft, что бы клиент и сервер были совместимые.

  6. Если вы подключились к игре, нажмите клавишу / расположенную снизу справа на клавиатуре. Возникнет командная строка Minecraft. Наберите следующую команду: js 1 + 1, затем нажмите ввод. Число 2 должно отобразится в командной строке.

... Сделано! Мы протестировали, что можем запускать код Javascript с консоли Minecraft.

Переменные

Переменные это имена для памяти чего-либо внутри компьютера (а Вы теперь программист). Создавать новые имена на Javascript можно используя слово var ...

/js var location = 'Blackrock Castle'

... создать новую переменную с названием location и сохранить в ней текст Blackrock Castle. Теперь компьютер запомнил новый предмет с
названием location. Используют это имя так...

/js echo( location )

... и на экране появиться …

Blackrock Castle

…Может быть необычно что кавычки одинарные '. Они подсказывают компьютеру сохранить текст, нужно добавить символ ' (одинарная ковычка) в начале и в конце текста. Компьютер не сохраняет кавычки, компьютер сохраняет только текст между кавычками. Переменные сохраняются в памяти до тех пор пока серврер Minecraft работает. Для повторения крайней команды надо нажать клавишу / затем клавишу стрелка вверх (UP) на клавиатуре, затем клавишу Ввод. Можно повторить несколько раз одну и ту же команду и всякий раз компьютер покажет то же самое значение. Изменять переменную можно так...

/js location = 'Mahon Point'

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

/js echo( self, location ) 

…и на экране...

Mahon Point

Переменные очень просто создаются и меняются в Javascript. С помощью переменных можно содавать программы и команды внутри игры, например есть зараенее созданные переменные. Из не нужно создавать самому в ScriptCraft. Первая переменная self, она содержит информацию о вашем аватаре (вашем образе в игре)…

/js echo ( self, self.name )

... покажет на экране ваше имя, например...

walterh

... каждый игрок имеет свой собственный ник-нейм в Игре.

Функции

В ScriptCraft есть несколько дополнительных функций, которых нет в обычной версии Javascript. Эти функции предназначены для создания дополнительных структур и зданий. Без этих функций в ручную то же самое можно сделать за несколько часов. Перед тем как познакомиться с этими специальными функциями, посмнотрите на функцию echo().

echo() - по названию видно (Эхо) - функция повторяет то что ей передали. Например, наберите ...

/js echo( self, 'Hello')

... и дисплей в игре покажет...

Hello

... наберите ...

/js echo( self, 5 + 7 )

... на экране будет выведено...

12    

... Таким способом можно исполльзовать Minecraft для домашней работы по математике - Но мы этого не рекомнедовали. Домашня работа это совершенно отдельная от Minecraft, не перепутайте! Функция echo() покажет все что вы ей сказали - Текст, Числа и другие типы данных...

/js echo( self, new Date() )

... напечатает дату. Конструкция выше выглядит сложно - но не волнуйтесь - new Date() создает новый объект - Мы поговорим об объектах позже ...

Tue Jan 08 2013 20:53:37 GMT-0000 (GMT)

Today's Date

echo() очень полезная функция, но не стандартная для языка Javascript. Она есть только в Minecraft. Так же все другие функции из Javascript есть в Minecraft. Например...

/js Math.max( 6, 11 )

... показывает максимальный из 2 чисел, которые вы ввели (max сокращение от maximum). Далее...

/js Math.min( 6, 11 )

... возвращает наименьше из 2 чисел. Еще одна полезная вещь - функция может return (вернуть) что нибудь. Можно сохранить результат выполнения функции (который возвращается) в переменной таким способом...

/js var biggest = Math.max( 6, 11 )

... Попробуйте набрать...

/js biggest

... Не все функции Javascript возвращают данные, но большинство. Точно так же, как Javascript и ScriptCraft, можно самом создать свою собственную функцию...

/js function whatTimeIsIt () { return new Date() }

... Мы создали новую функцию function с названием whatTimeIsIt и попросили функцию вернуть новый объект дата Date каждый раз, когда мы ее вызываем. Предупреждаем, конструкция выше (наша новая функция) нечего не выводит на экран после своего ввода. Это правильно. Функция начинает работу, только после вызова. Мы еще не вызвали функцию. Для вызова функции введите...

/js whatTimeIsIt()

... Она покажет время на данный момен. Поздравляем! Вы написали и выполнили свою собственную первую функцию на Javascript - вы по праву уже стали Minecraft Modder (Человек который делает програмы для Майнкрафта). Есть много функций для работы с Текстом, числами и датой в Javascript...

/js Math.random()

... функция выводит случайный номер, каждый раз при вызове. Попробуйте вызовите ее сейчас! Для этого нажмите клавишу / и стрелку вверх для повтора крайней команды из вашей встроенной игровой консоли. Заметно, каждый раз эта функция выводит различные номера на экран. Считайте что Math.random() это игральный кубик с огромным количеством граней. Поэтому, дважды он не выпадает на одну и ту же грань.

Строительство в Minecraft

Сейчас мы займеся интересным - созданием структур и домов в Minecraft. Строительство вручную это интересно но трудозатратно для огромных

  • Башен, Пирамид и Замков. Это то для чего появился ScriptCraft. ScriptCraft содержит набор javascript функций которые можно комбинировать при постройке интересных вещей. Давайте начнем с маленькой вещи чтобы почувствовать как ScriptCraft's работает. Самая популярная функция при
    строительстве это box() - это говорящее имя - эта функция для создания куба или параллепипеда из кубов. Куб это трехмерное тело, все стороны которого имеют один и тот же размер. Параллепипд имеет различную ширину, высоту и длинну.

3D Shapes

Оба тела и параллепипед и куб создаются в ScriptCraft функцией box(). Нужно указать функции какой материал требуется для создания формы. Например, в игре, наведите курсор указателя на место перед собой на земле, и наберите …

/js box( blocks.oak )

... Команда изменит указанный блок на блок из дерева. Это случилось, потому что функция box() создала новый деревянный блок. blocks это еще одна изменяемая переменная которая иметься в ScriptCraft, для того чтоб увидеть подсказку наберите ...

/js blocks.

... затем нажмите клавишу TAB. Повторное нажатие этой клавиши TAB последовательно выведет вам все возможные материалы для блока. Другой способ, чтоб увидеть все возможные материалы в Minecraft - сходить на сайт Minecraft Data Values.

Основные материальные блоки

При программировании Minecraft, для материальных блоков не используются имена, а используются номера (иногда 2 номера) для указания на материал, который нужно использовать. Например номер 2 это земля, 1 один это булыжник и т.д., 5 это дерево (oak). Есть различные типы дерева. Ввод '5:1' обозначает Spruce, '5:2' значит Береза и '5:3' значит Тропическое дерево (красное). При множестве различных материалов в Мире Minecraft, надо запомнить основные материалы для строительства:

  • '4' - Булыжник или blocks.cobblestone
  • '5' - Деревянные доски blocks.oak
  • '5:2' - Березовые достки (легкое дерево) или blocks.birch
  • '98' - Каменный бллок или blocks.brick.stone
  • '45' - Красный кирпичь или blocks.brick.red
  • '68' - Вывеска или blocks.sign
  • '102' - Стеклянная панель (для окон) или blocks.glass_pane

Чтоб зоздать отдельный деревянный блок используйте номер или переменную blocks. Например ...

/js box( '5' )

... и ...

/js box( blocks.oak ) 

... обе команды идентичные, но я, лично, препдочитаю /js box( blocks.oak ) так как мне это легче запомнить. Для справки, эта таблица всех материальных блоков (но не всех вещей) в Minecraft Мире...

Minecraft Data Values

Размерность

box() может сделать гораздо больше, чем просто один блок - можно создать кубы и параллепипеды любого размера. Посмотрите на картинку ниже. На ней показано как расположены измерения в пространстве с трехмерной размерностью. Есть 3 измерения (или размера) конструкций.

  1. Ширина
  2. Высота
  3. Глубина (или длинна) - что бы запомнить представте себе угольную шахту или пещеру, как глубоко она простирается под землей. Представъте что глубина (или длинна) это как далеко от
    вас что то простирается.

Width, Height and Depth

Больше форм

  • box0( block, width, height, depth ) - создает пустотелый блок (с воздухом внутри - очень удобный для стротительства. box0 без пола и потолка.
  • cylinder( block, radius, height ) - создает цилиндр, отлично для Chimneys.
  • cylinder0( block, radius, height ) - пустотелый цилиндр - идеально для Башни. У cylinder0 пол и потолок отсутствуют.
  • prism( block, width, depth ) - создает призму - удобно в качестве крыши.
  • prism0( block, width, depth ) - создает пустотелую призму.

Дрон

ScriptCraft это Мод Minecraft Mod который позволяет использовать код Javascript в игре. Можно написать свой Mod на Javacript. Один такой мод уже написан и есть в комплекте ScriptCraft. Он называется Drone (или Робот). Робот Drone это (невидимый) объект. Этого робота вы автоматически создаете при использовании каждой функции. Когда вы даете команду на выполнение...

/js box(5,3,2,4)

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

Передвижение

  • up( количество_блоков ) - Поднять Робот Drone Вверх. Пример: up() переместит Робота Drone на один блок вверх. Можно указать на какое количество блоков переместиться, если надо передвинуться больше чем на 1 блок.
  • down( количество_блоков ) - переместить Робота Drone Вниз.
  • left( количество_блоков ) - передвинуть Робота Drone Влево.
  • right( количество_блоков ) - передвинуть Робота Drone Вправо.
  • fwd( количество_блоков ) - переместить Робота Drone Вперед (по направлению вашего взгляда - взгляда вашего аватара).
  • back( количество_блоков ) - передвинуть Робота Drone Назад (в сторону где у вашего аватара находиться спина)
  • turn( количество_блоков ) - повернуть Робота Drone по часовой стрелке (направо). Пример: turn() повернет РОбота Drone в право на 90 градусов. turn(2) выполнить двукратный поворот РОбота Drone, аналогично военной команде кругом. То есть Робот будет смотреть в противоположную сторону от начального (до поворота) направления.

Цепочки - комбинация строительства и передвижения

Можно заставить Робота передвигаться по строительной площадке до установки блоков и после. daisy-chaining это комбинация функций строительства и передвижения. В игре, выберите с помощью указателя место на земле и введите…

/js up(1).box( blocks.oak ).fwd(3).box( blocks.oak )

Вы установили 2 блока друг за другом с промежутком в 3 блока.

Two Boxes 3 blocks apart

Упражнение - Строим простую конструкцию

Хорошо. Вы узнали достаточно о функциях Робота Drone и теперь мы можем построить простую конструкцию. Конструкцией будет простой домик с покатой крышей. Не волнуйтесь об окнах. Стены сделаем из булыжника ('4') а крышу сделаем из дерева ('5'). Используйте функции Робота Drone для постройки в 7 блоков ширной, 3 блока высотой и 6 блоков глубиной с крышей в виде призмы. Попробуйте сами используя вот эти 3 функции построить маленький домик.

  • up()
  • box0()
  • prism0()

У вас должно получиться следующая конструкция...

Exercise Dwelling

Запомним где мы начали

Когда вы строите что нибудь грандиозное, то требуется множество команд для Робота Drone, и не возможно запомнить как вернуть робота в точку старта. Но каждый созданный Робот имет сам по себе указатель на точку старта 'start' поэтому можно вернуться в начало с помощью одной команды move('start') ...

/js box('5').up(3).left(4).box('1').turn(3).fwd(5).right().box('1').move('start')

... Да же гений не сможет запомнить как вернуться в этом случае в самое начало. К счастью, нам не нужно все запоминать - функция move('start') доставит нашего Робота Drone в самую начальную позицию.

  • chkpt( breadCrumb ) - Создать метку где ваш Робот Drone's нахоиться в данный момент, чтоб вернуться сюда позже. Представте что вы даете имя месту где находиться ваш Робот Drone. chkpt это сокрашение от Check-Point - так называется место, где в игре сохраняются достижения.

  • move( breadCrumb ) - Переместить робота в заданную ранее точку. Как вы помните точка запоминается функцией chkpt() . Команда телепортирует робота в место которому вы дали название.

Обе функции chkpt() и mark() используются для строительства сложных объектов, когда нужно очень много перемещать Робота Drone ( например, Замок, mansions, дворец, и т.д.).

Сохраним нашу работу

В командной строке в игре можно сделать много хороших вещей с помощью команды /js. Но рано или поздно, вероятно, вы захотите построить что то действительно сложное и сохранить ваши команды для повторного выполнения после того как вы вышли из игры и зашли снова.

Notepad++ Это специальный редактор для текста (Похожий на Нотепад который есть на каждом компьютере с ОС Виндоус) и этот редактор хорошо подходит для написания кода. Если у вас его еще нет, установите install Notepad++ here. Мы рекомендуем NotePad++, он лучше чем старый Notepad, потому что понимает Javascript. Если у вас есть компьютер Macintosh, тогда TextWrangler подходит, он то же понимет код Javascript.

Ваш первый Minecraft Мод

Итак, мы изучили немного Javascript а так же знаем про объект Робот Drone(), давайте используем наши знания для создания Мода под Minecraft!

Если вы установили Notepad++, запустите его, создайте новый файл и наберите следующее...

exports.greet = function( player ) {
    echo( player, 'Hi ' + player.name);
}

... затем сохраните этот файл в новой диерктории scriptcraft/plugins/{ваш_никнейм} (замените {ваш_никнейм} на ваш никнейм) и назовите файл greet.js (проверте, что вбран тип файлов '. All Files' когда сохраняете файл, чтобы NotePad++ не добавил расширение '.txt' к названию. Вернитесь в игру Minecraft и наберите...

/js refresh()

... для перезагрузки всех серверных плугинов. Ваш новый Мод подгрузится в числе остальных модов. Теперь попробуйте ввести команду...

/js greet(self)

... на экране должно появиться ...

Hi {тут_ваш_никнейм}

... где {тут_ваш_никнейм} будет заменен на ваше собственное имя пользователя в minecraft. Поздравляем! - Вы сейчас написали свой собственный первый Мод для Minecraft! Если установлен ScriptCraft, написание Модов Minecraft так же просто как написать свой собственный код на javascript и сохранить его в файле в каталоге scriptcraft/plugins. Все функции из этого каталога будут доступны каждый раз, когда вы запустили сервер minecraft. Это был очень простой мод minecraft, но принципы создание сложных модов точно такие же.

Переменная exports это зарезервированное слово для передачи функций или объектов или переменных для использования в других Модах. Если вам надо передать результат работы вашего кода для других программистов, вы должны экспортировать export результат через специальную переменную exports. Одно и то же слово с точкой exports можно использовать для предачи не одного, но многих объектов, функций и переменных. Например ...

thrower.js

exports.boo = function(player){
  echo( player, 'Boo!');
}
exports.yo = function(player){
  echo( player, 'Yo!');
}

... этот пример передает (экстпортирует) 2 функции javascript с названиями boo() и yo(). Их можно вызвать из командной строки в игре через ввод

/js boo(self) или /js yo(self).

Параметры

Для того чтоб функция greet() выводила на экран различные фразы, а не только 'Hi ', нужно изменить код функции greet(), или лучше использовать параметры Parameters. Параметры это переменные передаваемые функции. Эти параметры меняют поведение функции (настраивают функцию) каждый раз, при ее вызове.

greeting

Поменяйте функцию greet() на следующую …

exports.greet = function ( greeting , player) {
    echo( player, greeting + player.name );
}

... Сохраните файл greet.js и вызовите команду /js refresh() в minecraft. После чего, введите команду в Minecraft...

greet('Hello ',self);

... А затем ...

greet('Dia Dhuit ',self);

... в окне чата или консоли игры вы увидите...

Hello {ваш_никнейм}
Dia Dhuit {ваш_никнейм}

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

true или false

Попробуйте ввести сделующие выражения и посмотреть что ответит minecraft...

/js 1 < 2

/js 1 > 2

... ответ для первого выражения ( 1 < 2 ) должен быть true, потому что 1 меньше чем 2. Где символ < - обычно находиться внизу справа на клавиатуре - обозначает проверку кагого нибудь числа что оно меньше чем другое число. Вот 1 < 2 это как спросить комьютер " 1 меньше чем 2 ?". Это простой пример. Мы знаем что 1 меньше чем 2, но если вопрос с использованием переменных, то точно сказать до выполнения выражения сложно. Результат второго выражения (1 > 2) должен быть false. Потому что 1 НЕ БОЛЬШЕ чем 2. Попробуйте...

/js 1 = 2

... Результат сложно предсказать. Вы увидите Error message

  • и это правильно. Вот что случилось. Мы хотели проверить 1 это аналогично 2. Но мы допустили ошибку начинающих программистов. Присвоение значения и проверка это две различные операции в компьютере. Для проверки надо использовать == это и есть операция проверки эквивалентности. Попробуем снова...

    /js 1 == 2

... получим ответ false. Потому что 1 не эквивалентно по значению 2. Бывают и другие операторы operators для сравнения вещей ...

  • < меньше чем ?
  • > больше чем ?
  • == эквивалентно (равно) ?
  • <= меньше или равно ?
  • >= больше или равно ?
  • != не равно ?

... попробуй сделать самостоятельно сравнения с другими числами - например, возраст твоих друзей со своим возрастом.

Еще true или false

Чтоб понять можно ли летать в minecraft наберите команду ...

/js self.allowFlight

... результат будет true (правда) или false (лож) в зависимости есть ли у вас эти способности в игре или нет. Можно самостоятельно переключить свои способности к полету Установите переменную allowFlight в true или false. Попробуйте ...

/js self.allowFlight = true; 

... Теперь можно летать! Два раза нажмите пробел и летите. Для отключения возможности полета введите ...

/js self.allowFlight = false;

... и вы тут же упадете на землю. Это пример использования логической переменной со значением true (правда) и false (лож) в ScriptCraft – они называютя boolean (булевы) переменные – Названы в честь George Boole, в 19th веке профессор Математики из университета College Cork. Есть и другие примеры использования логических переменных в Minecraft. Можно проверить есть ли дождь (raining) в Мире minecraft набрав следующую команду ...

/js self.world.hasStorm()

... Результат будет false (если нет дождя) или true (если дождливо). Можно остановить дождь так:

/js self.world.setStorm(false)

... ИЛи, начать дождь так:

/js self.world.setStorm( true )

Логика и JavaBeans

Множество логических переменных boolean используется для включения и выключения обычного поведения игры. Например, поведние thundering регулируеться переменной Мира thundering. Подробнее об объектах, переменных и методах-функциях Мира в documented on the SpigotMC JavaDocs World page. Доступны страницы SpigotMC JavaDoc, где все методы с названиями начинающимися с is, такие как, isThundering() и соответствующие setThundering(), такие методы называются JavaBean - переменная thundering это переменная JavaBean и есть 2 пути как это использовать в Javascript. Можно get (взять) и set (установить) переменную через использование метода в Java. Чтобы взять get переменную thundering надо вызвать метод-функцию JavaBean:

/js self.world.isThundering()

... или таким способом:

/js self.world.thundering

Для установки set переменной thundering, вызывается следующий метод-функция JavaBean:

/js self.world.setThundering( true )

... или установить так:

/js self.world.thundering = true

Не важно какой способ использован, результат будет один и тот же.

Записи

В игре Minecraft можно поменять многое - практически все что хотите. Все изменения делаются через вызов API - это вызовы функций и методов в Minecraft - дополнительно об этом почитайте тут SpigotMC API Reference.

…и Снова, и Снова, и Снова,…

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

Считаем до 100

В иге в командной строке наберите (подсказка: нажмите вначале 't') команду и затем нажмите Enter...

/js for (var i = 1 ; i <= 100 ; i = i + 1) { echo( i ); }

... Этот код будет считать от 1 до 100. Первое что вы заметите при запуске - как быстро считает компьютер до 100. Возможно вас удивит длительность счета до 1000. Попробуйте сами. Измените кода так, чтоб вместо 100 там было 1000 (допишите один нолик в конце). Если вы чувствуете интригу, посчитайте компьютором до 10000 (десять тысяч), до ста тысяч и до миллиона.

Конструкция for используется для повторения. Состоит из 4 частей...

  1. Инициализатор: var i = 1 - что должно быть вначале цикла.
  2. Проверки: i <= 100 - что за проверка должна быть на каждом круге цикла. Если проверка выдаст результат false, то цикл остановиться.
  3. Инкремента: i = i + 1 - выполняется по завершению каждого круга цикла. Если не задать это значение, цикл не когда не закончиться. i = i + 1 часто сокращают как i++ - что значит то же самое.
  4. Тело - все что выполняется между { и } (открывающая и закрывающая фигурные скобки).

for цикл очень полезен вместе с Массивом - запомните, Массив это просто список вещей, пример - игроков на сервере (нажмите ТАБ чтоб увидеть список игроков), различных миров на сервере.

Скажи "Привет!" каждому игроку

В командной строке игры наберите следующие выражения и затем нажмите Enter...

/js var utils = require('utils');
/js var players = utils.players();
/js for (var i = 0;i < players.length; i++){ echo(players[i], 'Hi!'); }

... Посмотрим повнимательнее на эти выражения. В игре мы ввели в одну строку, но можно набрать их и таким способом...

var utils = require('utils');
var players = utils.players();
for (var i = 0;i < players.length; i++) { 
  echo(players[i], 'Hi!'); 
}

... На второй линии новой созданной переменной players присвоено значение utils.players(). На следующей линии задан цикл со счетчиком i установленным в 0 (zero - Массив в javascript начинается с 0 не с 1) и каждый раз в цикле есть проверка - меньше ли он количества игроков в данный момент онлайн. В конце цикла переменная i увеличивается (increased by 1) для того чтоб следующий игрок получил сообщение. Внутри тела цикла (все между фигурными скобками открывающей { и закрывающей }) выражение players[i] это ссылка на игрока в массиве (списке) игроков на позиции[i]. Вообразите что только 4 игрока на сервере minecraft, тогда массив игроков players такой might look like this...

  • players[0] = 'CrafterJohn'
  • players[1] = 'MinerPaul'
  • players[2] = 'ExplorerRingo'
  • players[3] = 'TraderGeorge'

... и players.length равно 4 (потому что всего 4 игрока online), for-цикл повторится 4 раза. Начиная с 0 и пробегая все значения, включая 3, посылая сообщения каждому игроку из массива. Настало время для новой scriptcraft функции. Откройте файл hi.js созданный ранее (в NotePad++ , TextWrangler или любом редакторе текста) и допишите вот такой код в конце файла: the bottom of the file...

var utils = require('utils');
exports.hiAll = function () {
  var players = utils.players();
    player,
    i;
  for ( i = 0; i < players.length; i++) {
    player = players[i];
    echo( player, 'Hi!' );
  }
}

... сохраните файл, и в игре в командной строке наберите /js refresh() и затем наберите /js hiAll(). Код пошлет сообщение Hi! всем игрокам на сервере. Вы это сделали при помощи for цикла и массива. Массив и for цикл используют во всех программах.

While цикл

Другой способ сделать повторения это while цикл. Вот такой while цикл считает до 100...

var i = 1;
while ( i <= 100 ) {
    console.log( i );
    i = i + 1;
} 

Цикл while повторяется пока условие false - условие то же самое, как в примере выше i <= 100 пока i меньше чем или равно 100 будет выполняться код из блока while (весь код между фигурными скобками: стартовой { и финальной }). Важно, надо менять тестируемую переменную в цикле, в противном случае, цикл не когда не кончиться. Попробуйте запустить код ...

/js var i = 1; while (i <= 100){ echo( i ); }

Код просто выводит 1 без остановки, пока не закончится время (или пока не будет выключен компьютер). Это потому что переменная i не изменяется (запомни - incrementing это просто добавление 1), поэтому всегда 1, без изменения, это значит, цикл бесконечный. Опытные программисты допускают такие ошибки.

Так же как и цикл for, цикл while используется для работы с массивом. Пример цикла печатающего имена всех игроков…

var utils = require('utils');
var players = utils.players();
var i = 0;
while ( i < players.length ) {
    console.log( players[i] );
    i = i + 1;
}

... что выбрать цикл for или цикл while это зависит от вашего вкуса, цикл for больше используют для Массивов, но пример выше показывает, как использовать цикл while для Массивов.

utils.foreach() - другой способ сделать массив

Обе структуры for и while стандартны для javascript циклов. ScriptCraft имеет специальную фцнкцию для циклов - utils.foreach(). utils.foreach() необязательная функция, не используйте ее если вам нравиться синтаксис javascript циклов for и while. utils.foreach() берет 2 параметра...

  1. Массив
  2. Функцию, которая вызывается каждый раз для каждого элемента Массива.

…все правильно, можно передавать функцию как параметр в javascript! Посмотрите как это работает, код в примере это console.log() (print) распечатывает имя каждого игрока на сервере в окне чата…

var utils = require('utils');
var players = utils.players;
utils.foreach( players, console.log );

... как и в примерах выше, имена игроков выводятся по одному разу каждое в консоли. Обратите внимание console.log, а не console.log(). Круглые скобки () используются для вызова функиции. Если нужно передать функцию, как параметр, я просто использую название функции без скобок. В примере выше, используется название существующей функции ( console.log ), но можно сделать свою функцию "на лету" и передать ее в функционал utils.foreach() ...

/*
  give every player the ability to fly.
*/
var utils = require('utils');
var players = utils.players();
utils.foreach( players, function( player ) { 
  player.capabilities.flying = true;
  player.updateCapabilities();
} );

... Другой пример, промяукать для каждого игрока...

/*
  Play a Cat's Meow sound for each player.
*/
var utils = require('utils');
var players = utils.players();
var sounds = require('sounds');
utils.foreach( players, function( player ) { 
  sounds.entityCatAmbient( player ); // spigot 1.9
  /* canarymod only
    sounds.catMeow( player ); 
  */
} );

Упражнение

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

/js var sounds = require('sounds');

... затем наберите /js sounds. и нажмите клавишу TAB чтоб увидеть все возможные звуки.

Циклы важнейшая и ключевая часть для понимания программирования на любом языке. Javascript обеспчивает конструкции for и while для циклов и многие javascript библиотеки содержат свои специальный функции для циклов. Выберите то, что вам удобнее.

Используем цикл for - Строим Небоскреб

Циклы можно использовать для построения впечатляющих структур. Следующее упражнение - мы используем цикл для построения небоскреба. Этот небоскреб сделан из Стекла (Glass) и Стали (Steel) (как и большинство небоскребов в реальной жизни). Певрое - надо сделать пол для небоскреба. Разместите блок (любого типа) где хотите построить небоскреб. Затем совместите указатель с этим блоком и напечатайте в командной строке:

/js var drone = box(blocks.iron,20,1,20).up().box0(blocks.glass_pane,20,3,20).up(3)

... получиться большой (20x20) железный пол и 3 блока в высоту стеклянных панелей вокруг.

skyscraper-floor.png

... Небоскреб в один этаж не сильно похож на небоскреб ... дальше мы должны повторить снова и снова. Вот для чего нужен цикл for. Откройте ваш любимый редактор файлов и создайте новый файл в каталоге scriptcraft/plugins/{ваш_никнейм}. Назовите файл myskyscraper.js, и поместите следующий код в файл и сохраните файл:

function myskyscraper( floors ) {
  var i ;
  if ( typeof floors == 'undefined' ) {
    floors = 10;
  }
  // bookmark the drone's position so it can return there later
  this.chkpt('myskyscraper'); 
  for ( i = 0; i < floors; i++ ) {
    this
      .box(blocks.iron,20,1,20)
      .up()
      .box0(blocks.glass_pane,20,3,20)
      .up(3);
  }
  // return the drone to where it started
  this.move('myskyscraper'); 
};
var Drone = require('drone'); 
Drone.extend( myskyscraper );

Сейчас немного пояснений. Вначале я создал новую функцию с названием myskyscraper которая принимает один парметр floors и вызывается как myskyscraper(). Можно передать в функцию сколько этажей необходимо построить. Первое выражение в функции if (typeof floors == 'undefined'){ floors = 10; } установить 10 этажей в качестве параметра, если значение не передано. Следующая конструкция this.chkpt('myskyscraper') сохраняет позицию Робота Drone что бы можно было вернуться к месту старта, когда будет закончено строительство (я не хочу чтоб Робот оставался на самом верху небоскреба, когда он закончит работу). Затем начинается цикл for. Я начинаю с 0 этажа до floors и каждый раз Робот строит новый этаж. Когда цикл заканчивается мы возвращаем робота drone в место откуда мы начали. Последние 2 линии загружают модуль Дрон (можно загрузить и в начале) и последняя линия добавляет новые возможности для объекта Робота 'Drone'. Теперь робот может строить небоскребы на ряду с другими своими умениями.
После того как вы набрали код и сохранили, наберите команду /js refresh() в вашей встроенной в игру командной сторке, затем наберите:

 /js myskyscraper(2);

Это дувхэтажный небоскреб. Можно задать 10 этажей. Или 20 этажей небоскреба! Minecraft установлен предел (256 блоков от плохих камней) под которыми нельзя строить. И если пробовать выше 256 то так же не получится. Строительство просто остановиться около отметки 256.

skyscraper

В качестве упражнения сделайте квартал из 5 небоскребов в 1 цикле. Следующий шаг - город из кварталов. Ясно, Minecraft не зависит от условий, которые есть в реальном мире. Например не зависит размер города от количества жителей. Дайте свободу своему воображению. Вообразите какие бы вы возвели города на других планетах. В новых версиях игры можно построить ракету и улететь на новую планету.

Решаем

Все наши программы до этого момента были очень предсказуемы - начинались и заканчивались одинаково. Обычные программы другие. На практике, компьютер дожен делать проверки и принимать решения. Конструкция javascript для принятия решения это if. Стоя на земле наберите следующее выражение:

/js if ( self.onGround ) { echo('You are not flying!'); }

будет выведено сообщение:

You are not flying!

Сделайте двойное нажатие клавиши space для начала полета в игре (нажмите быстро 2 раза клавишу пробел), затем нажмите и удерживайте пробел пока не взлетите достаточно высоко. И снова вызовите команду (Если не хотите набирать снова, до достаточно нажать клавишу / затем стрелку вверх UP на вашей клавиатуре, при нажатии клавиши Ввод команда повториться.

/js if ( self.onGround ) { echo('You are not flying!'); }

В этот раз не будет сообщения на экране.

Конструкиция if проверяет какую либо переменную на значение true или false. И if true тогда выполняется блок кода между фигурными скобками ( { и } ) - но только если условие верно. Условие из примера можно обратить - !self.onGround (self не на земле) покажет true если вы летите или false если не в полете.

Как сделать чтоб было сообщение если условие нарушается? Пример выводит сообщение если игрок НЕ на земле:

/js if ( !self.onGround ) { echo ('You are flying!'); }

Отличие только в восклицательном знаке ! (метка отрицания) перед self.onGround. Символ ! отрицания (возвращает противоположное).

Что делать если нужны сообщения в любом случае - если вы в полете или если не летите? Это делается конструкцией if - else. Откройте редактор файлов и напишите код в новый файл в той же директории scriptcraft/plugins ...

exports.flightStatus = function( player ) {
  if ( player.onGround ) { 
    echo(player, 'You are not flying!' );
  } else {
    echo(player, 'Hey, You are flying!' );
  }
}

... наберите /js refresh() и в игре так же наберите /js flightStatus(self) и сообщение будет в зависимости от выполнения условия полета. Наберите /js flightStatus() когда вы на земле и когда вы в полете. Выводимые сообщения будут различными.

Событийное програмирование

До сих пор код исполнялся только когда мы вводили команду /js . Что если - например - нам нужно специальная реакция программы в в момент когда игрок заходит в игру? Что если, вы хотите выводить специальное приветствие различное для каждого игрока (или чтоб MotD - message-of-the-day сообщение на каждый день, которое настроено в вашем файле server.properties) ? Это и есть Событийный стиль програмирования Event-Driven Programming . Событийное программирование это смешной термин чтоб сказать 'Сделай это когда это случиться'. 'Сделай это' как раз функция которую надо выполнить, а 'когда это' подходящий момент для выполнения. В игре minecraft есть сотни событий...

  • Когда кто то из игроков подключается к серверу - это событие!
  • Когда кто то слоамал блок - это событие!
  • Если кто то выстрелил из лука - это событие! и т.д. …

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

function myBlockBreakHook( event ){
  var breaker = event.player;
  echo( breaker, 'You broke a block');
}
events.blockBreak( myBlockBreakHook );

Функция events.blockBreak() одна из многих событийных функций Функции events используются для регистрации register и вызываются когда заданное событие наступит. В приведенном примере функция blockBreak принимает в качестве параметра другую функцию. Эта функция из параметра должна выполняться при наступлении события. Переданная в качестве параметра функция так же имеет 1 свой параметр. Параметр объект event содержит в себе всю информацию о событии, которое случилось. Можно получить информацию о том, кто сломал блок и послать сообщение этому игроку. Важной вещью является то, что функция myBlockBreakHook будет исполнена только тогда, когда игрок сломает блок. Попробуйте - запишите код из примера в новый файл в директорию scriptcraft/plugins, затем наберите /js refresh() для перезагрузки scriptcraft. И попробуйте сломать блок в игре, должно появиться сообщение 'You broke a block' (Вы сломали блок).

Очень много событийных типов функций в Minecraft. Можно просмотреть all possible event registration functions в Справочнике API.

Для специфических событий (которых нет в списке дерева событий org.bukkit.event) необходимо указать полное название класса следующим образом. ...

events.on ( net.yourdomain.events.YourEvent, function( event ) {
    ...
});

Остановимся чтоб послушать.

Если вам надо выполнить событийную функцию только один раз, то сделайте следущее …

function myBlockBreakHook( evt ) { 
  var breaker = evt.player;
  echo( breaker, 'You broke a block');
  this.unregister();
} 
events.blockBreak( myBlockBreakHook );

Конструкция this.unregister(); удаляет функцию из списка прослушиваемых событийных функций. Ключевое слово this внутри событийной функции является указателем на обработчик объекта Listener определенного в ScriptCraft, и имеет единственный метод unregister(), который и используется для остановки событийной функции.

Таким способом разрегистрируется событийная фцнкция снаружи outside исполняемой фукнции. Как видим надо указать полное имя функции а не местоимение ...

function myBlockBreakHook( evt ){
  var breaker = evt.player;
  echo( breaker, 'You broke a block');
}
var myBlockBreakListener = events.blockBreak( myBlockBreakHook );
...
myBlockBreakListener.unregister();

Сохранение результатов - Заполнение таблицы в Javascript

В параграфе Событийное программирование Event-Driven Programming, Мы определили функцию, которая выводит сообщение каждый раз, когда игрок ломает блок. Предположим, мы хотим запоминать сколько блоков было сломано игроком? Это тот случай, когда объект Литерал Javascript's (Objecct literals) может пригодиться. Объект Литерал (literal) в javascript это самый простой путь создание нового объекта в вашем коде прямо "на лету". Посмотрите пример...

var myNewObject = { name: 'walter', country: 'Ireland' };

... Мы создаем новый объект с двумя переменными 'name' и 'country'. Формат файла для создания такого объекта называется JSON (сокращение от JavaScript Object Notation). Если нужно найти страну параметр 'country' для новой переменной myNewObject, то есть несколько способов для этого...

var playerCountry = myNewObject.country;

... или ...

var playerCountry = myNewObject['country']

... JavaScript разрешает доступ к любой части объекта через точку ( object.property ) или через индекс ( object['property']). Результат в обоих случаях одинаковый - playerCountry будет 'Ireland'. Если обращаться к объекту через индекс, то параметр может может быть даже простой строкой - переменная, как в примере ниже...

var propertyName = 'country';
var propertyValue = myNewObject[propertyName];

... в примере выше, переменная propertyName используется при индексирование. Это значит, что каждый объект в JavaScript может представлен в виде таблици (хеша). Что это за таблица? Это таблица для запоминания. Например это таблица имен и результатов...

Name            Score
--------        -----
walter          5
tom             6
jane            8
bart            7

... Если надо найти результат Jane's, Мы просматриваем весь список имен в колонке имен, пока не найдем 'jane' затем в найденной строке находим результат. В Javascript, объект сохраняющий результат в таблице выглядит так …

var scoreboard = {
  walter: 5,
  tom:    6,
  jane:   8,
  bart:   7
};

... и если нужно написать функцию которая принимает имя в качестве параметра и возвращает результа, мы делаем так…

function getScore(player){
  return scoreboard[ player ];
}

... Мы вызываем эту функцию таким способом...

var janesScore = getScore('jane'); // returns 8

... соберем все примеры в одном тексте программы, предположим в модуле scoreboard.js который выглядит так...

var utils = require('utils');
var scores = {};

exports.initialise = function(names){
  scores = {};
  utils.foreach(names, function(name){ 
    scores[name] = 0;
  });
};

/* 
  changes score by diff e.g. to add 6 to the player's current score
  updateScore('walter',6); // walter's new score = 5 + 6 = 11.
*/
exports.updateScore = function(name, diff){
  scores[name] += diff; 
};

exports.getScore = function(name){
  return scores[name];
};

Посчитаем количество сломанных блоков для каждого игрока

Можно использовать таблицу-словарь (объект в Javascript) для сохранения информации о количестве сломанных блоков каждого игрока ...

block-break-counter.js

var breaks = {};

/*
  every time a player joins the game reset their block-break-count to 0
*/
function initializeBreakCount( event ){
  breaks[event.player.name] = 0;	 
}
events.playerJoin( initializeBreakCount );

/* 
  every time a player breaks a block increase their block-break-count
*/
function incrementBreakCount( event ){
  breaks[event.player.name] += 1; // add 1
  var breakCount = breaks[event.player.name];
  echo( event.player, 'You broke ' + breakCount + ' blocks');
}
events.blockBreak( incrementBreakCount );

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

Следующие шаги

Это руководство дает достаточно информации для первой ступени программирования и создания модов в Minecraft с использованием языка программирования Javascript. Javascript очень мощный и широко известный язык и есть еще много особенностей языка, которые не описаны в этом руководстве. Если вы хотите глубже изучить программирование и создание модов под minecraft, Мы рекомендуем следующие ссылки ScriptCraft API reference которая описывает все функции ScriptCraft, объекты и методы. Так же мы рекомендуем к изучению исходные коды различных плугинов scriptcraft, которые уже есть в ваших каталогах, почитайте руководство Anatomy of a ScriptCraft Plug-in, которое мы используем на второй ступени.
И справочник из интернета SpigotMC API Reference содержит большое количество информации по различными типам объектов и методов, которые доступны для использования в ScriptCraft.