Скриптовать можно и маинкрафт :-) Спасибо тебе, WorldEdit.
Хотя есть возможность писать плагины и под «голый» сервер, например bukkit, и в них фантазию автора практически ничего не ограничивает, но порог вхождения в разработку плагинов довольно высок. Намного проще разрабатывать скрипты. Кстати они перечитываются при каждом запуске, что позволяет отлаживать их по ходу игры.
- WorldEdit.jar помещается в каталог plugins
- из архива Rhino необходимо извлечь js.jar в plugins/WorldEdit/
- размещаем свои скрипты в plugins/WorldEdit/craftscripts/
WorldEdit предоставляет Api для разработки скриптов на JavaScript, который содержит, например, «божественный» объект contex, из которого можно получить все остальные :-)
Выглядит это примерно так:
1 2 |
var blocks = context.remember(); var player = context.getPlayer(); |
Добавление блоков выглядит тоже вполне ожидаемо:
1 2 3 4 5 6 7 |
var vec = new Vector( player.getBlockOn().x+dx*c, player.getBlockOn().y+c, player.getBlockOn().z+dy*c ); blocks.setBlock(vec, context.getBlock('109:'+m)); |
Скрипт построения лестницы из ступенек в направлении, в котором смотрит игрок:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
importPackage(Packages.java.io); importPackage(Packages.java.awt); importPackage(Packages.com.sk89q.worldedit); importPackage(Packages.com.sk89q.worldedit.blocks); var blocks = context.remember(); var player = context.getPlayer(); //get ladder height context.checkArgs(1, 1, ""); var count = parseInt(argv[1]); var direction = ''+player.getCardinalDirection(); //XXX: convert to string var dx = 1; var dy = 1; var m = 0; switch (direction) { case "NORTH": case "NORTH_WEST": case "NORTH_EAST": dx = 0; dy = -1; m = 3; break; case "SOUTH": case "SOUTH_WEST": case "SOUTH_EAST": dx = 0; dy = 1; m = 2; break; case "WEST": dx = -1; dy = 0; m = 1; break; case "EAST": dx = 1; dy = 0; m = 0; break; default: context.error("Something is wrong!"); } for (var c = 1; c <= count; c++) { var vec = new Vector( player.getBlockOn().x+dx*c, player.getBlockOn().y+c, player.getBlockOn().z+dy*c ); blocks.setBlock(vec, context.getBlock('109:'+m)); } |