Делаем тарелку

Делаем тарелку

Анимация предмета
Всем привет, сегодня мы будем создавать анимацию для предмета на примере тарелки из SlePE Furniture.


Для начала, как всегда, создадим блок с рендером:

IDRegistry.genBlockID("plate");
Block.createBlock("plate", [{
    name: "Plate",
    texture: [
        ["qurtz_block", 0]
    ],
    inCreative: true
}]);
Translation.addTranslation("Plate", {
    ru: "Тарелка"
})
Recipes.addShaped(
    {id: BlockID.plate, count: 1, data: 0}, 
    ["vvv", "qvq", "vqv"], 
    ["q",406,0]
);
Block.setShape(BlockID.plate,1/8,0,1/8,7/8,1/8,7/8);

Мы создали блок с именем «Plate», установили ему текстуру кварцевого блока, добавили перевод, рецепт из кусочков кварца и видимый рендер тарелки.
Теперь я постараюсь объяснить, как работает анимация. Создаётся анимация по координатам указанным в аргументах:

animation = new Animation.Item(x, y, z);

Это мы будем использовать для установки предмета анимации и её загрузке

animation.describeItem({
    id: id,//Айди анимириумего предмета, не должно быть равно 0
    count: count,//Количество предметов
    data: data,//Дата анимируемого предмета
    size: 1,//Размер анимируемого предмета (в блоках)
});
animation.load();//загружает анимацию

Эта функция проверяет, загружена ли анимация

animation.isLoaded//true если загружена, false если нет

А это, разрушает анимацию.

animation.destroy();

Создадим тарелке Tile Entity с функциями init – выполняется при инициализации Tile Entity, tick – 1 раз в тик, click – при клике по тарелке, defaultValues – стандартные значения для Tile Entity и animationSet – свою функцию, в которой мы будем устанавливать рендер.
В defaultValues создадим переменные id и дата, в которых будет хранится предмет, который лежит в тарелке:

defaultValues: {
    id:0,
    data:0
},

Теперь самое интересное – создать функцию для установки рендера.

animationSet:function(){
    this.animation = this.animation||new Animation.Item(this.x+.5, this.y+2.5/16, this.z+.5);//создать анимацию, если она ещё не создана.
    if(this.data.id>0){//если предмет не воздух
        this.animation.describeItem({
              id: this.data.id,
              count: 1,
              data: this.data.data,
              size: .5,
        });//установить анимацию для предмета хранящегося в переменных tile entity
        if(!this.animation.isLoaded){//если анимация не загружена, загрузить её.
              this.animation.load();
        }
     }else{
          if(this.animation.isLoaded)this.animation.destroy();//если предмет воздух и анимация загружена, то уничтожить её.
     }
},

При ломании тарелки удаляем анимацию, но перед этим, проверяем предмет внутри неё и если она заполнена, дропнуть предмет:

destroy:function(){
     if(this.animation.isLoaded)this.animation.destroy();//если анимация загружена, уничтожить её
     if(this.data.id!=0)World.drop(this.x+.5, this.y+0.25, this.z+.5, this.data.id, 1, this.data.data);//если есть предмет дропнуть его
	},

При инициализации Tile Entity создадим анимацию, присвоим её переменной и установим рендер своей функцией.

init:function(){
    this.animation = new Animation.Item(this.x+.5, this.y+2.5/16, this.z+.5);
    this.animationSet();
},

При клике мы дропнем предмет, если он содержится в тарелке, если у игрока рука не пустая, установим рендерупредмет и загрузим его, если рука пуста, установим переменные содержащие айди и дату предмета равными 0 и удалим рендер, если он существует.

click:function(){
    if(this.data.id!=0){//если предмет в тарелке есть, дропнуть его
        World.drop(this.x+.5, this.y+0.25, this.z+.5, this.data.id, 1, this.data.data);
    }
    this.data.id=Player.getCarriedItem().id;//установить переменные с айди и датой предмета
    this.data.data=Player.getCarriedItem().data;
    Player.decreaseCarriedItem(1);//отнять 1 предмети
    Game.prevent();//отменить стандартное действие, на случай если в руках у игрока блок
    this.animationSet();//установить анимацию.
}

Вот и всё, весь код ниже.

IDRegistry.genBlockID("plate");
Block.createBlock("plate", [{
    name: "Plate",
    texture: [
        ["qurtz_block", 0]
    ],
    inCreative: true
}]);
Translation.addTranslation("Plate", {
    ru: "Тарелка"
})
Recipes.addShaped({
        id: BlockID.plate,
        count: 1,
        data: 0
    },
    ["vvv", "qvq", "vqv"],
    ["q", 406, 0]);
Block.setShape(BlockID.plate, 1 / 8, 0, 1 / 8, 7 / 8, 1 / 8, 7 / 8);
 
var render = new ICRender.Model();
BlockRenderer.setStaticICRender(BlockID.plate, 0, render);
var model = BlockRenderer.createModel();
model.addBox(2 / 8, 0, 2 / 8, 6 / 8, 1 / 16, 6 / 8, 155, 0);
model.addBox(1 / 8, 1 / 16, 1 / 8, 2 / 8, 1 / 8, 7 / 8, 155, 0);
model.addBox(2 / 8, 1 / 16, 1 / 8, 6 / 8, 1 / 8, 2 / 8, 155, 0);
model.addBox(6 / 8, 1 / 16, 1 / 8, 7 / 8, 1 / 8, 7 / 8, 155, 0);
model.addBox(2 / 8, 1 / 16, 6 / 8, 6 / 8, 1 / 8, 7 / 8, 155, 0);
 
render.addEntry(model);
TileEntity.registerPrototype(BlockID.plate, {
    defaultValues: {
        id: 0,
        data: 0
    },
    destroy: function() {
        if (this.animation.isLoaded) this.animation.destroy();
        if (this.data.id != 0) World.drop(this.x + .5, this.y + 0.25, this.z + .5, this.data.id, 1, this.data.data);
    },
    init: function() {
        this.animation = new Animation.Item(this.x + .5, this.y + 2.5 / 16, this.z + .5);
        this.animationSet();
    },
    animationSet: function() {
        this.animation = this.animation || new Animation.Item(this.x + .5, this.y + 2.5 / 16, this.z + .5);
        if (this.data.id > 0) {
            this.animation.describeItem({
                id: this.data.id,
                count: 1,
                data: this.data.data,
                size: .5,
            });
            this.animation.setPos(this.x + .57, this.y + 0.20, this.z + .43);
            if (!this.animation.isLoaded) {
                this.animation.load();
            }
        } else {
            if (this.animation.isLoaded) this.animation.destroy();
        }
    },
    click: function() {
        if (this.data.id != 0) {
            World.drop(this.x + .5, this.y + 0.25, this.z + .5, this.data.id, 1, this.data.data);
        }
        this.data.id = Player.getCarriedItem().id;
        this.data.data = Player.getCarriedItem().data;
        Player.decreaseCarriedItem(1);
        Game.prevent();
        this.animationSet();
    } else {
        this.data.id = 0;
        this.data.data = 0;
        if (this.animation.isLoaded) this.animation.destroy();
    }
});
Запись опубликована в рубрике InnerCore. Добавьте в закладки постоянную ссылку.

Comments

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

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