-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
0924b1f
commit 42da126
Showing
3 changed files
with
76 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
## {anchor} Что такое рейкаст и как им пользоваться? | ||
Рейкаст - это луч, который выпускается в определённом направлении (чаще всего по направлению взгляда игрока), который позволяет вычислять, на какой блок или сущность смотрит игрок, запускать разные команды по пути луча и по его столкновению с сущностью/блоком. Этот луч проходит мгновенно (меньше чем за тик), поэтому если вам нужно узнать, как сделать постепенный луч, то смотрите факьюшку `?слоукаст` (она ещё не написана). | ||
|
||
### Устройство рейкаста | ||
Рейкаст работает в первую очередь за счёт рекурсивной функции в датапаке (функции, которая запускает саму себя), и с каждым запуском себя расположение запуска функции передвигается немного вперёд. В этой факьюшке рассмотрим базовый пример рейкаста, где можно настроить максимальную длину луча, столкновение с сущностью и блоком, и запуск команд по пути луча. | ||
1. Для начала создадим скорборд для рейкаста: | ||
{mcf_load}`load.mcf`: | ||
```ansi | ||
[35mscoreboard [34mobjectives add [0mraycast dummy | ||
``` | ||
2. Функция запуска рейкаста (запускаем эту функцию от лица сущности, от которой должен идти рейкаст): | ||
{mcf}`raycast/launch.mcf`: | ||
```ansi | ||
[30m# Выдаём сущности временный тег raycaster, чтоб рейкаст не мог столкнуться с тем, кто его запустил | ||
[35mtag [36m@s [34madd [0mraycaster | ||
[30m# Выставляем количество шагов рейкаста. В этом примере сделаем максимальную длину рейкаста - 100 блоков, а каждый шаг рейкаста будет длиной в 0.1 блок, поэтому 100/0.1=1000 | ||
[35mscoreboard [34mplayers set [36m@s [0mraycast [32m1000 | ||
[30m# Выставляем позицию запуска рейкаста на глазах сущности и запускаем основную функцию рейкаста | ||
[35mexecute [34mat [36m@s [34manchored eyes positioned [32m^ ^ ^ [34mrun [35mfunction [33mnamespace:raycast/ray | ||
[30m# Убираем временный тег | ||
[35mtag [36m@s [34mremove [0mraycaster | ||
``` | ||
---separator--- | ||
3. Основная функция рейкаста. В этом примере сделаем максимальную длину рейкаста - 100 блоков, а каждый шаг рейкаста будет длиной в 0.1 блок | ||
{mcf}`raycast/ray.mcf`: | ||
```ansi | ||
[30m# Убираем единицу из скорборда шагов рейкаста. Когда число достигнет нуля, рейкаст перестанет идти дальше. | ||
[35mscoreboard [34mplayers remove [36m@s [0mraycast [32m1 | ||
[30m# Если блок на текущем расположении не является тем, что в теге (группе) namespace:raycast_ignore, то тогда запускается функция столкновения с блоком. | ||
[35mexecute [34munless block [32m~ ~ ~ [33mnamespace:raycast_ignore [34mrun [35mfunction [33mnamespace:raycast/hit_block | ||
[30m# Если текущее расположение находится внутри хитбокса любой сущности из тега (группы) namespace:raycast_entities (кроме самого запускателя рейкаста), то запустить функцию столкновения с сущностью. | ||
[35mexecute [34mas [36m@e[33m[[37mtype[34m=[33mnamespace:raycast_entities[34m,[37mdx[34m=[32m0[34m,[37mlimit[34m=[32m1[33m] [34mpositioned [32m~-0.99 ~-0.99 ~-0.99 [34mif entity [36m@s[33m[[37mdx[34m=[32m0[33m] [34mrun [35mfunction [33mnamespace:raycast/hit_entity | ||
[30m# Здесь можно писать ещё команды, которые будут запускаться на каждом шагу луча. Для примера заспавним партикл: | ||
[35mparticle [0mcomposter [32m~ ~ ~ 0 0 0 0 1 | ||
[30m# Если скорборд шагов рейкаста равен 1 или больше, то передвинуться немного вперёд и запустить эту же функцию снова. | ||
[35mexecute [34mif score [36m@s [0mraycast [34mmatches [32m1[35m.. [34mpositioned [32m^ ^ ^0.1 [34mrun [35mfunction [33mnamespace:raycast/ray | ||
``` | ||
4. В функциях `raycast/hit_block` и `raycast/hit_entity` обязательно нужно написать команду обнуления скорборда шагов рейкаста, а дальше можно писать команды, которые будут запускаться при столкновении с блоком и сущностью соответственно: | ||
{mcf}`raycast/hit_block.mcf`: | ||
```ansi | ||
[35mscoreboard [34mplayers set [36m@a[33m[[37mtag[34m=[32mraycaster[33m] [0mraycast [32m0 | ||
[30m# Дальше свои команды... Например спавн молнии: | ||
[35msummon [0mlightning_bolt [32m~ ~ ~ | ||
``` | ||
{mcf}`raycast/hit_entity.mcf`: | ||
```ansi | ||
[35mscoreboard [34mplayers set [36m@a[33m[[37mtag[34m=[32mraycaster[33m] [0mraycast [32m0 | ||
[30m# Дальше свои команды... Например нанесение урона: | ||
[35mdamage [36m@s [32m5 | ||
``` | ||
---separator--- | ||
5. Создадим те самые теги (группы) блоков, через которые рейкаст может проходить спокойно, и сущностей, с которыми рейкаст будет сталкиваться. | ||
{tags_file}`tags/block/raycast_ignore.json`: | ||
```json | ||
{ | ||
"values": [ | ||
"#air", | ||
"structure_void", | ||
"light" | ||
] | ||
} | ||
``` | ||
{tags_file}`tags/entity_type/raycast_entities.json`: | ||
```json | ||
{ | ||
"values": [ | ||
"player", | ||
"pig", | ||
"husk" | ||
] | ||
} | ||
``` | ||
6. Не забывайте, что вы можете упрощать этот пример под вас! Если вам не надо две разные функции для столкновения с блоком и сущностью, создайте одну, например `hit.mcf`, если вам вообще не надо запускать команды при столкновении с блоком/сущностью, то вообще не создавайте те функции а просто обнуляйте скорборд шагов рейкаста, если вам не надо чекать какие то определённые группы сущностей, можете не создавать теги из 4 пункта, и т. д. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters