Делаем бочку для 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]);
Запись опубликована в рубрике InnerCore. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *