Форум PentaCraft

[Macro/Keybind] Программирование, макросы. Скрипт по исследованию мира

Всем доброго времени суток уважаемые игроки проекта Pentacraft. Перед началом изложения прошу ознакомиться:

Внимание номер 1 – Результат ниже изложенной информации (то есть скрипт) не согласовывалась на использование с администрацией проекта pentacraft. Данный пост изложил для образовательных целей, надеюсь ).
И напоминаю - в правилах вроде как есть пункт, который может коснуться действий ниже описанного скрипта:

3.1. Запрещены любые виды читов/программ, скрытие и использование любых багов, с помощью которых вы получаете отличительные от присутствующих на сервере стандартных игровых возможностей и методов получений предметов. О любом баге Вы должны сообщить сотруднику

Но кто знает, как интерпретировать результат действия скрипта, который я накалякал в свободное от работы время.
Товарищи администраторы, пожалуйста разъясните собственно, можно или нельзя, спасибо )

Внимание номер 2 – Ниже описанный скрипт будет работать только у игроков со статусом Premium и выше! Но, для общего развития и понимания элементарного программирования будет полезно взглянуть на эту инфу всем заинтересованным.

И так. Лень – двигатель прогресса и стимулятор обучаться новому. При поиске хорошего местечка и биома для застройки, я понял, что летать по миру открывая карту безумно скучно и затратно по времени. Поэтому я решил это дело автоматизировать, а точнее написал скрипт, который перемещает меня по миру с помощью команды </tppos x y z>. Потому кстати данный скрипт подходит только для игроков со статусом Premium и выше.

Идея заключается в том, что нужно телепортировать игрока по миру от нулевых или текущих координат на расстояние 9 чанков в нужном направлении, и далее опять на 9 чанков и т.д. Также перемещение по 9 чанков должно происходить по спирали, чтобы карта открывалась равномерно от места запуска скрипта или от нулевых координат. Вот и вся задачка.

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

Открываем меню макросов (у меня это кнопка «-», можете настроить как вам удобно).


Выбираем, куда будем привязывать (биндить) скрипт, к кнопке на клавиатуре/мыши или на отдельный интерфейс (гайды по этой теме вроде как есть на форуме).
2020-11-17_14-58-02
Допустим мы выбрали привязку к физической кнопке на клавиатуре, пусть будет «U», у меня она не занята потому и отображается серым цветом (красным цветом отображаются занятые кнопки из настроек майнкрафта, желтым цветом занятые макросами)

Нажимаем мышкой на кнопку 2020-11-17_15-15-12 Далее необходимо написать команду, по которой будет вызываться и исполняться файл со скриптом, который мы пока еще не написали.
Здесь я думаю необходимо немного разъяснить.

В поле для ввода внизу экрана можно вписать команды такие как - /home, /spawn и т.д., команды которые показаны на скрине - $$?, $$h и т.д., но нам нужно запустить скрипт, который как известно состоит не из одной строчки (хотя можно и в одну строчку, но я таким не балуюсь).

Как написано в подсказке на скрине, чтобы запустить скрипт необходимо вписать его в эту конструкцию $${ и }$$ (более правильно было бы написать $${ скрипт }$$). Опять же, скрипт это не одна строчка и писать его в это поле неудобно, поэтому мы вызовем скрипт из файла воспользовавшись командой $$<file.txt>. Эта команда просто вставляет вместо себя содержимое файла, то есть достаточно вставить $$<file.txt> в конструкцию $${скрипт}$$, получится вот это $${$$<file.txt>}$$. Название файла можно выбрать любым, мы его всё равно еще не создали. Далее нажимаем на кнопку «Запись», чтобы забиндить на кнопку «U» команду $${$$<file.txt>}$$.

Дело почти сделано, осталось всего то написать скрипт ) приступим.

На экране с изображением клавиатуры и уже желтой кнопкой «U» нажимаем на кнопку «Текстовый редактор».
2020-11-17_15-31-05
В пустом поле пишем название файла с нашим будущим скриптом. Название я оставлю таким же как писал в командах выше – file.txt


Жмём «Создать» и оказываемся в текстовом редакторе. Здесь мы и будем писать нашу программу.

Начнем, пожалуй, с логирования, то есть вывода нужной нам информации в окно чата, которая будет видна только нам. Эта возможность может очень сильно нам помочь в поиске ошибок в коде.
За логи отвечает функция LOG(), можно и не заглавными буквами - log(), но мне так наглядней.
2020-11-17_15-49-26
Этот скрипт выводит в чат сообщение «Some text» голубым цветом. Это сообщение будете видеть только вы.

Пойдём дальше, давайте покажем ваши текущие координаты.
Для этого существуют заранее определенные глобальные переменные, в которых записаны различные данные игрока и окружения. Нас интересуют переменные XPOS, YPOS и ZPOS. Вернитесь к вашему файлу file.txt, и замените текст внутри скобок функции LOG. Должен получится такой скрипт – LOG(%XPOS% %YPOS% %ZPOS%). Зачем мы «оборачиваем» наши переменные в символ %, если мы этого не сделаем, то скрипт просто выведет на экран сообщение «XPOS YPOS ZPOS». Символ % вокруг переменной означает, что мы обращаемся к переменной, к её значению, а не просто написали какой-то текст. Сохраняем, закрываем, жмём «U» (или на что вы забиндили наш скрипт) и видим в чате наши координаты. Выглядит не очень красиво, так что подправим немного наш код - LOG(x=%XPOS% y=%YPOS% z=%ZPOS%);
Теперь наше сообщение выглядит нагляднее.

Для продолжения нам желательно остановиться на переменных.

В данном языке программирования (громко звучит))) существуют несколько типов переменных и обозначаются они соответственно по разном.
Переменные для целых положительных и отрицательных числе объявляются так:
#var = 5;
#x = 100;
#y = YPOS;
#z = ZPOS;

Целочисленные переменные объявляются через решетку «#», далее пишем нужное нам имя переменной, после знак «=» и само значение переменной. Например «#x = 100;», здесь я объявил переменную #x и присвоил её значение «100». В переменную «y#» я сразу присвоил значение текущей координаты Y. В данном случае оборачивать в символ % глобальную переменную YPOS нет необходимости, но, если вы всё же написали так «#y = %YPOS%;» работать всё равно будет, но лучше так не делайте, возможно где-то это может оказаться критичным.
Строковые переменные объявляются через амперсанд «&». Например:
&name = Vasya;
&x = XPOS;
&z = %ZPOS%;

В переменной «&name» содержится строка «Vasya», это вроде очевидно. Но, в переменной «&x» на это раз содержится не координата X, а строка «XPOS». Но, если обнести «XPOS» в символ %, как например в переменной «&z = %ZPOS%», то из глобальной переменной выдернется само значение (в данном случае координата Z), и это значение станет строкой. Что это всё означает, постараюсь пояснить. Есть две переменные:
#y_int = %YPOS%;
&y_str = %YPOS%;

При выводе их с помощью функции LOG(%#y_int %), LOG(%&y_str %), принципиальной разницы в результате вы не увидите, в любом случае в чате увидите вашу текущую Y координату. Но переменная «#y_int» будет целочисленной и с ней в дальнейшем при необходимости можно будет совершать математические операции. Со строковой переменной &y_str мат. операции уже не совершить, только присоединение (конкатенация) других строк, то есть к концу одной строки прибавить другую строку. Парочка примеров с переменными:
(в данный момент моя координата Y равна 110)

Пример 1:
#x = YPOS;
#x1 = #x + 16;
LOG(%#x1%);
Вывод в чат:
126

Пример 2:
&y_str = %YPOS%;
&y_str1 = &y_str + 16;
&y_str2 = %&y_str% + 16;
LOG(%&y_str1%);
LOG(%&y_str1%);
Вывод в чат:
&y_str + 16
110 + 16

Пример 3:
&y_str = %YPOS%;
&y_str1 = %&y_str% is my Y coord;
LOG(%&y_str1%);
Вывод в чат:
110 is my Y coord

Надеюсь стало немного понятней.

Есть еще логический тип переменных или булевый (Boolean), которые могут содержать только два значение 0 или 1 (false или true). Такие переменные объявляются без дополнительных символов, то есть пишем просто имя переменной. В моём основном скрипте Boolean переменные я не использую, но остановиться на этом стоит. Объявляется переменная таким образом:
x = true;
y = 1;
z = 123456;
x1 = false;
y1 = 0;
z1 = qwerty;
LOG(%x% %y% %z%);
LOG(%x1% %y1% %z1%);
Вывод в чат:
True True True
False False False

Переменная принимает значение True в случае если она равна: «true», любое целое положительное или целое отрицательно число кроме нуля.
Переменная принимает значение False в случае если она равна: «false» или любая другая строка, цифра «0».

Для чего эти булевы переменные нужны? Конкретно в макросах для майнкрафта, применение данного типа переменной мне пока не понадобилось. В других языках программирования использую довольно часто…

Вернёмся к написанию основной программы.

Подробнее опишем задачу: телепортировать (далее прыжки) себя по просчитанным координатам через каждые 9 чанков, от текущих или нулевых (или заданных заранее в скрипте) координат. Причём прыжки должны совершаться по спирали, чтобы равномерно открывалась карта. Также прыжки должны происходить с задержкой около 6-7 секунд, иначе команда на телепортацию может не сработать, из-за частого применения. Время задержки можно увеличить для игроков, у которых скорость интернета более низкая, чтобы чанки успели прогрузиться на локальный компьютер, иначе карта будет с дырами.

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

Перед началом написания скрипта нужно продумать алгоритм действий.

  • Первая телепортация происходит на юг на 9 чанков.
  • Далее идет смена направления и следующая телепортация уже направлена на восток, прыжок на 9 чанков.
  • Повторяем смену направление, и совершаем телепортацию на север, причем дважды на север по 9 чанков.

Сокращать и прыгать сразу на 18 чанков естественно нельзя, иначе мы пропусти один квадрат 9х9 чанков, и он останется на карте не открытым. Наш шаг телепортации ровно 9 чанков.

Нам понадобится переменная для обозначения направлений. Назовём её #di и присвоим ей значение 1, пусть единица обозначает первое наше направление, юг. Обозначать направления для себя будем таким образом: 1=юг, 2=восток, 3=север, 4=запад.

Также нам понадобится переменная, которая будет обозначать количество смен направления. То есть сколько раз за работу скрипта будет совершен полный проход в одном направлении (на схеме обозначен красной стрелкой). Объявим для этого переменную #c1 и присвоим ей пока небольшое значений #c1=2. В уже законченной версии скрипта этот параметр можно увеличить, то есть задать количество полных проходов, например 100.

Следующая переменная будет считать сколько мы должны сделать прыжков в заданном направлении. Для первых двух направлений (юг и далее восток) всего по одному прыжку. Далее, при следующей смене направления, прыжков становится на один больше, то есть 2 прыжка. И это будет работать на два направления, текущее и следующее, север и запад. Объявим переменную #c2 и присвоим ей значение #c2=0.

Я уже, наверное, надоел вам со своей теорией, но без этого никуда. Осталось немного, надеюсь )

Объявим еще три переменные, которые мы уже использовали выше:
#x=%XPOS%;
#z=%ZPOS%;
#y=249;

Переменная #y будет указывать координату Y, то есть высоту игрока при телепортировании. Естественно игрок должен находится в /fly режиме и желательно /god, мало ли что на высоте 249 может произойти.

Сейчас наша программа выглядит вот так:
#x=%XPOS%;
#z=%ZPOS%;
#y=249;
#c1=2;
#c2=0;
#di=1;

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

Количество выполнений (итераций) цикла мы уже определили, это количество полных проходов (обозначено красными стрелками на схеме). Первое, что мы сделаем в теле цикла, это посчитаем сколько нам необходимо сделать прыжков на текущем направлении. Как вы могли заметить по моему корявому алгоритму выше, каждые две смены направлений количество прыжков увеличивается на единицу. Распишу подробнее:
1-й проход = Юг, 1 прыжок
2-й проход = Восток, 1прыжок
3-й проход = Север, 2 прыжка
4-й проход = Запад, 2 прыжка
5-й проход = Юг, 3 прыжка
6-й проход = Восток, 3 прыжка
и т.д.


Здесь мы воспользовались новым, условным оператором. Конструкция выглядит так:
image
Работает это так, если <уловие> истинно, то выполняется <тело условного оператора>.
Пример:
image
Условие таково если переменная #chsv больше переменной #intellect, то условие является истинным, и программа выполнит тело условия и напишет в чат сообщение «I’m a Mega Programmer!!!». Иначе, если условие не истинно, то есть ложно, то тело не выполняется, и программа пропускает эту часть кода.

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

Наконец рассчитаем координаты прыжка. Телепортируемся мы на 9 чанков, тоесть на 144 блока, значит к значениям #x и #z будем прибавлять именно количество блоков. Напомню, телепортировать себя мы будем командой «/tppos x y z». Эта команда принимает координаты в масштабе блоков. Также не будем забывать, что у нас существуют направления, в которых мы прыгаем. Проще всего это сделать добавив четыре условных оператора для каждого направления, и в этих условиях уже рассчитывать новые координаты. Так как мы совершаем прыжок строго в одном направлении, то и координату менять для прыжка необходимо всего одну. Вот так:


Так как направление в один момент может быть только одно, то и срабатывать будет только одно из четырёх условий, и производить всю магию только с одной из двух координат в нужном направлении.
Собственно, программа уже почти закончена, осталось только заставить программу писать в чат нужную команду и научить менять направления.
Для вызова команды для телепортации будем использовать функцию ECHO(<текст>). Данная функция в отличии от LOG() пишет в чат как будто бы вы это сделали сами. Например такой код:


скорее всего отправит вас в бан, так как в глобальный чат напишется именно тот текст который написан выше в скобках. В общем, всё что написано в скобках фунцкии ECHO() будет выведено в чат, в том числе и команды, наподобии /home, /rtp, /spawn, /tppos, что нам и нужно.
И так, добавим нашу главную команду в код программы, а также добавим функцию для остановки скрипта на 7 секунд:


Почти всё, осталось только научить программу менять направления. Менять направления необходимо в конце главного цикла, тоесть в конце каждого полного прохода (красная стрелка):

Вот как бы и вся программа. Оставив запущенный скрипт на часок другой, можно открыть довольно большой кусок карты вокруг себя…
Больше размусоливал конечно, но я и не хотел просто вывалить скрипт и сказать – вот типо клёвая прога, нате. Хотелось бы хоть немного научить элементарному программированию, заинтересовать, возможно кому то это зайдёт и он не остановится на простеньких скриптах в майнкрафте а пойдет дальше и возможно станет новым гением-программистом. Во как загнул. Спасибо за то, что дочитали до конца. Полный код скрипта ниже (добавил пару еще пару строк, как бы нафиг я LOG() разбирал вначале))).
(и еще, не забываем увеличить число полных проходов в переменной #c2, например #c2=100, иначе вы откроете всего два кавдрата по 9х9 чанков)

Ссылочка на pastebin.com

6 Симпатий

спс

всегда пожалуйста

2 Симпатий

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