Делаем бочку для InnerCore своими руками
Делаем бочку для InnerCore своими руками
Всем привет, сегодня мы будем создавать бочку. Начнём собственно с самого простого – создания блока. В первую очередь нам понадобятся свои текстуры, после того, как вы их нарисовали можно приступать
.
Создание блока
Здесь мы создадим блок, настроим его дроп, время ломание, взрывоустойчивость и т.п.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | BLOCK_TYPE_LOG = Block.createSpecialType({ base: 17 }); IDRegistry.genBlockID("barrel"); Block.createBlock("barrel", [{ name: "Wooden barrel", texture: [ ["barrel_top", 0], ["barrel_top", 0], ["barrel_side", 0], ["barrel_side", 0], ["barrel_side", 0], ["barrel_side", 0] ], inCreative: true }, BLOCK_TYPE_LOG ]); |
Создаём блок с айди barrel и названием Wooden barrel, а также устанавливаемые блок, свойства которого будет копировать бочка (бревно). Теперь нам нужно добавить перевод этого названия на другие языки:
1 | Translation.addTranslation("Wooden barrel", {ru: "Деревянная бочка"}); |
Вот мы и перевели название на русский язык, также можно переводить и на другие языки, например sp – испанский, ch- китайский и т.д.
Теперь займёмся настройкой материала, времени ломания и необходимого инструмента:
1 | ToolAPI.registerBlockMaterial(BlockID.rubberTreeLog, "wood"); |
Вот так мы всё сделали одной строчкой, и ToolAPI дальше сам разберётся, что к чему!
Создам рецепты, сразу два т.к. у брёвен айди 17 и 162:
1 2 3 4 5 6 7 8 9 10 | Recipes.addShaped({ id: BlockID.barrel, count: 1, data: 0 }, ["pap", "gug", "pgp"], ["g", 5, -1, "p", 265, -1, "a", 17, -1, "u", 102, -1]); Recipes.addShaped({ id: BlockID.barrel, count: 1, data: 0 }, ["pap", "gug", "pgp"], ["g", 5, -1, "p", 265, -1, "a", 162, -1, "u", 102, -1]); |
Создание TileEntity и интерфейса
Теперь приступает к самому сложному (и интересному). Для начала создадим интерфейс:
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 | var barrelGui = new UI.StandartWindow({ standart: { header: { text: { text: "Бочка" }, }, minHeight: 700, inventory: { standart: true }, background: { standart: true } }, drawing: [ {type: "bitmap", x: 850, y: 120, bitmap: "bar", scale: 4} ], elements: { "woodbarrelslot1": {type: "slot", x: 400, y: 100, size: 160}, "woodbarrelslot2": {type: "slot", x: 400, y: 300, size: 160}, "woodbarrelScale": {type: "scale", x: 850, y: 120, direction: 1, scale: 4, value:1, bitmap: "bar", overlay: "bars", overlay_scale: 4}, "FillText": {type: "text", x: 400, y:470 , text: "Вёдер 0/16", height: 60 , width:400, font:{color:android.graphics.Color.rgb(255, 255, 255), size:30, shadow:0.5}}, "FillText2": {type: "text", x: 400, y:40 , text: "мB 0/16000", height: 60,width:400, font:{color:android.graphics.Color.rgb(255, 255, 255), size:30, shadow:0.5}} } }); |
Да, выглядит всё наверное не очень понятно, но я объясню. Для начала мы создаём переменную под названием barrelGui, в которой хранится интерфейс, в той же строчке мы и присваеваем той переменной интерфейс. В standart всё как обычно, за исключением двух вещей: названия (Бочка) и minHeight. Что это такое? Это очень полезная штука, которая устанавливает полосу прокрутки, если в высоту разрешение планшета меньше 700 юнитов. Обычно оно равно ~562. Далее в drawing мы отрисовываем фон для шкалы с водой. В elements создаём 2 слота для предметов, и шкалу отрисовки жидкостей (прямо над той, что рисовали в drawing), а также создаём два текста, один из которых показывает количество жидкости в бочке в ведрах, а другой в милибакетах (1/1000 ведра).
Теперь можно приступать к TileEntity, создадим основу:
1 2 3 4 5 6 7 8 9 10 | TileEntity.registerPrototype(BlockID.barrel, { defaultValues: { type:"water" }, tick: function(){ }, getGuiScreen: function(){ return barrelGui; } }); |
Устанавливаем значение переменной type при создании бочки равное «water» — тип жидкости. При нажатии возвращаем ГПИ (Графический Пользовательский Интерфейс) бочки. Сейчас и дальше код в tick. Для начала создадим и обозначим несколько переменных и полезных действий:
1 2 3 4 5 6 7 8 9 | var content = this.container.getGuiContent(); this.liquidStorage.updateUiScale("woodbarrelScale", this.data.type); this.container.validateAll(); var id1 = this.container.getSlot("woodbarrelslot1").id; var data1 = this.container.getSlot("woodbarrelslot1").data; var count1 = this.container.getSlot("woodbarrelslot1").count; var id2 = this.container.getSlot("woodbarrelslot2").id; var data2 = this.container.getSlot("woodbarrelslot2").data; var count2 = this.container.getSlot("woodbarrelslot2").count; |
Здесь мы присваеваем переменным с короткими названиями айди, дату и количество предметов в плотах, устанавливаемые значение для шкалы с типом жидкости, указанном в переменной type, валидируем слоты (чтобы при количестве равном 0, айди также был равен 0), получаем переменную content, которая при открытом интерфейсе даст нам доступ к элементам бочки.
Теперь немного разъяснений про методы Liquid, чтобы весь дальнейший код был вам понятен (надеюсь про методы работы со слотами вы уже знаете). Все эти методы привязаны к внутреннему хранилище жидкости TileEntity.
- updateUiScale («имя элемента UI», «строковый ID», контейнер) — устанавливает для данного контейнера шкалу с данным именем, как шкалу жидкости с данным строковым ID, изменяя текстуру на текстуру жидкости и значение на ее объем относительно лимита. Если параметр контейнер не передан, а хранилище привязано к Tile Entity, то будет использован контейнер этого Tile Entity.
- hasDataFor («строковый ID») — проверяет, есть ли в нем данные для данной жидкость.
- setLimit («строковый ID», лимит в ведрах) — устанавливает конкретной жидкости лимит количества в ведрах, если вместо строкового ID передан null, устанавливает данный лимит для всех жидкостей.
- getLimit («строковый ID») — возвращает лимит данной жидкости в ведрах.
- setAmount («строковый ID», объем в ведрах) – устанавливает объем данной жидкости в ведрах, без проверки лимита.
- getAmount («строковый ID») — возвращает кол-во данной жидкости в ведрах.
- getRelativeAmount («строковый ID») — возвращает кол-во данной жидкости, деленное на лимит для данной жидкости (используется для шкал интерфейса).
- getLiquidStored («строковый ID») — возвращает строковый ID первой жидкости, которая содержится в данном хранилище и кол-во которой больше 0, подходит для работы с хранилищем, в котором хранится 1 тип жидкости, а также сочетается с методом getLiquid ().
- isFull («строковый ID») — возвращает true, если кол-во данной жидкости равно ее лимиту (заполнена ли она до предела), если аргумент не передан, проверяет, заполнены ли все жидкости в хранилище до предела.
- isEmpty («строковый ID») — возвращает true, если кол-во данной жидкости равно 0, пустоте. Если аргумент не передан, проверяет, все ли жидкости в хранилище равны 0.
- addLiquid («строковый ID», объем в ведрах) — добавляет данный объем данной жидкости в хранилище, возвращает объем лишней жидкости, которая не уместилась в лимит.
- getLiquid («строковый ID», объем в ведрах) — забирает данный объем данной жидкости из хранилища, возвращает объем, который удалось забрать (если жидкости меньше требуемого кол-ва, то отдает не переданный объем, а меньше). Если жидкости в хранилище не хватает и хранилище привязано к Tile Entity будет вызвано событие requireMoreLiquid в Tile Entity.
- LiquidRegistry.getEmptyItem(id, data) — принимает на вход ID и Data полного предмета, возвращает объект формата {id: ID пустого предмета, data: Data пустого предмета, liquid: строковый ID жидкости, которая содержалась в полном предмете}, если это не предмет, заполненный какой-то жидкостью, возвращает null.
- LiquidRegistry.getItemLiquid(id, data) — принимает на вход ID и дату полного предмета, возвращает строковый ID жидкости, которая в нем содержится, если это не предмет, заполненный какой-то жидкостью, возвращает null.
- LiquidRegistry.getFullItem(id, data, «строковый ID») — принимает на вход пустой предмет и строковый ID жидкости, возвращает объект формата {id: ID полного предмета, data: Data полного предмета}, если предмет не является предметом, который может содержать жидкость, или такая жидкость не существует, вернет null.
Сейчас мы проверим, что что в бочке содержится та же жидксть, что и в предмете, которым её туда зальют, в предмете есть жидкость, а в бочке есть место для неё, что слот 2, свободен для пустой версии предмета (как пустое ведро из ведра лавы). В таком случае мы устаналиваем тип жидкости бочке тот, что был в предмете, прибавляем одно ведро жикдкости в бочку, а также устанавливаемые лимит в 16 вёдер. Отнимаем один предмет заполненный и устанавливаемые его пустую версию в слот 2, и если открыт интерфейс, обновляем текст для указания количества жидкости в бочке.
Теперь вторая часть того кода. Здесь мы проверяем, что бочка не пуста, и можно залить жидкость в предмет, что слот 2 подходит для заполненной версии этого предмета. И делаем тоже самое что и в первой части, за исключением того, что не устанавливаем тип жидкости и лимит, и жидкость не прибавляем, а отнимаем. Код ниже:
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 | if (this.liquidStorage.getAmount(LiquidRegistry.getItemLiquid( this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data)) 0 || this.liquidStorage.isEmpty() == true) { if (this.container.getSlot("woodbarrelslot2").id == LiquidRegistry.getEmptyItem( this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data).id || this.container.getSlot("woodbarrelslot2").id == 0) { this.data.type = LiquidRegistry.getItemLiquid(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data); this.liquidStorage.setLimit(LiquidRegistry.getItemLiquid(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data), 16); this.liquidStorage.addLiquid(LiquidRegistry.getItemLiquid(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data), 1); this.container.getSlot("woodbarrelslot2").id = LiquidRegistry.getEmptyItem(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data).id; this.container.getSlot("woodbarrelslot2").data = LiquidRegistry.getEmptyItem(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data).data; this.container.getSlot("woodbarrelslot2").count++; this.container.getSlot("woodbarrelslot1").count--; if (content) { this.container.setText("FillText1", "mB " + (this.liquidStorage.getAmount(this.liquidStorage.getLiquidStored()) * 1000 + "/" + this.liquidStorage.getLimit(this.data.type) * 1000)); this.container.setText("FillText2", "Bucket " + this.liquidStorage.getAmount(this.liquidStorage.getLiquidStored()) + "/" + this.liquidStorage.getLimit(this.data.type)); } } } } if (LiquidRegistry.getFullItem(id1, data1, this.data.type) != null && this.liquidStorage.getAmount(this.data.type) > 0) { if (this.container.getSlot("woodbarrelslot2").id == LiquidRegistry.getFullItem(id1, data1, this.data.type).id && this.container.getSlot("woodbarrelslot2").data == LiquidRegistry.getFullItem(id1, data1, this.data.type).data || id2 == 0) { this.container.getSlot("woodbarrelslot2").id = LiquidRegistry.getFullItem(id1, data1, this.data.type).id; this.container.getSlot("woodbarrelslot2").data = LiquidRegistry.getFullItem(id1, data1, this.data.type).data; this.container.getSlot("woodbarrelslot2").count++; this.container.getSlot("woodbarrelslot1").count--; this.liquidStorage.getLiquid(this.data.type, 1); if (content) { this.container.setText("FillText1", "mB " + (this.liquidStorage.getAmount(this.liquidStorage.getLiquidStored()) * 1000 + "/" + this.liquidStorage.getLimit(this.data.type) * 1000)); this.container.setText("FillText2", "Bucket " + this.liquidStorage.getAmount(this.liquidStorage.getLiquidStored()) + "/" + this.liquidStorage.getLimit(this.data.type)); } } } |
Вот и всё, бочка готова, можно проверять. Для ленивых, ВЕСЬ код ниже:
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | IDRegistry.genBlockID("barrel"); Block.createBlock("barrel", [{ name: "Wooden barrel", texture: [ ["barrel_top", 0], ["barrel_top", 0], ["barrel_side", 0], ["barrel_side", 0], ["barrel_side", 0], ["barrel_side", 0] ], inCreative: false }]); Translation.addTranslation("Wooden barrel", { ru: "Деревянная бочка" }); var barrelGui = new UI.StandartWindow({ standart: { header: { text: { text: "Бочка" }, }, minHeight: 700, inventory: { standart: true }, background: { standart: true } }, drawing: [{ type: "bitmap", x: 850, y: 120, bitmap: "bar", scale: 4 }], elements: { "woodbarrelslot1": { type: "slot", x: 400, y: 100, size: 160 }, "woodbarrelslot2": { type: "slot", x: 400, y: 300, size: 160 }, "woodbarrelScale": { type: "scale", x: 850, y: 120, direction: 1, scale: 4, value: 1, bitmap: "bar", overlay: "bars", overlay_scale: 4 }, "FillText": { type: "text", x: 400, y: 470, text: "Вёдер 0/16", height: 60, width: 400, font: { color: android.graphics.Color.rgb(255, 255, 255), size: 30, shadow: 0.5 } }, "FillText2": { type: "text", x: 400, y: 40, text: "мB 0/16000", height: 60, width: 400, font: { color: android.graphics.Color.rgb(255, 255, 255), size: 30, shadow: 0.5 } } } }); TileEntity.registerPrototype(BlockID.barrel, { defaultValues: { type: "water" }, tick: function() { var content = this.container.getGuiContent(); this.liquidStorage.updateUiScale("woodbarrelScale", this.data.type); this.container.validateAll(); var id1 = this.container.getSlot("woodbarrelslot1").id; var data1 = this.container.getSlot("woodbarrelslot1").data; var count1 = this.container.getSlot("woodbarrelslot1").count; var id2 = this.container.getSlot("woodbarrelslot2").id; var data2 = this.container.getSlot("woodbarrelslot2").data; var count2 = this.container.getSlot("woodbarrelslot2").count; if (this.liquidStorage.getAmount(LiquidRegistry.getItemLiquid(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data)) 0 || this.liquidStorage.isEmpty() == true) { if (this.container.getSlot("woodbarrelslot2").id == LiquidRegistry.getEmptyItem(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data).id || this.container.getSlot("woodbarrelslot2").id == 0) { this.data.type = LiquidRegistry.getItemLiquid(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data); this.liquidStorage.setLimit(LiquidRegistry.getItemLiquid(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data), 16); this.liquidStorage.addLiquid(LiquidRegistry.getItemLiquid(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data), 1); this.container.getSlot("woodbarrelslot2").id = LiquidRegistry.getEmptyItem(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data).id; this.container.getSlot("woodbarrelslot2").data = LiquidRegistry.getEmptyItem(this.container.getSlot("woodbarrelslot1").id, this.container.getSlot("woodbarrelslot1").data).data; this.container.getSlot("woodbarrelslot2").count++; this.container.getSlot("woodbarrelslot1").count--; if (content) { this.container.setText("FillText1", "mB " + (this.liquidStorage.getAmount(this.liquidStorage.getLiquidStored()) * 1000 + "/" + this.liquidStorage.getLimit(this.data.type) * 1000)); this.container.setText("FillText2", "Bucket " + this.liquidStorage.getAmount(this.liquidStorage.getLiquidStored()) + "/" + this.liquidStorage.getLimit(this.data.type)); } } } } if (LiquidRegistry.getFullItem(id1, data1, this.data.type) != null && this.liquidStorage.getAmount(this.data.type) > 0) { if (this.container.getSlot("woodbarrelslot2").id == LiquidRegistry.getFullItem(id1, data1, this.data.type).id && this.container.getSlot("woodbarrelslot2").data == LiquidRegistry.getFullItem(id1, data1, this.data.type).data || id2 == 0) { this.container.getSlot("woodbarrelslot2").id = LiquidRegistry.getFullItem(id1, data1, this.data.type).id; this.container.getSlot("woodbarrelslot2").data = LiquidRegistry.getFullItem(id1, data1, this.data.type).data; this.container.getSlot("woodbarrelslot2").count++; this.container.getSlot("woodbarrelslot1").count--; this.liquidStorage.getLiquid(this.data.type, 1); if (content) { this.container.setText("FillText1", "mB " + (this.liquidStorage.getAmount(this.liquidStorage.getLiquidStored()) * 1000 + "/" + this.liquidStorage.getLimit(this.data.type) * 1000)); this.container.setText("FillText2", "Bucket " + this.liquidStorage.getAmount(this.liquidStorage.getLiquidStored()) + "/" + this.liquidStorage.getLimit(this.data.type)); } } } }, click: function(id, count, data, coords) { }, getGuiScreen: function() { return barrelGui; } }); Recipes.addShaped({ id: BlockID.barrel, count: 1, data: 0 }, ["pap", "gug", "pgp"], ["g", 5, -1, "p", 265, -1, "a", 17, -1, "u", 102, -1]); Recipes.addShaped({ id: BlockID.barrel, count: 1, data: 0 }, ["pap", "gug", "pgp"], ["g", 5, -1, "p", 265, -1, "a", 162, -1, "u", 102, -1]); |
Comments