Делаем тарелку
Делаем тарелку
Анимация предмета
Всем привет, сегодня мы будем создавать анимацию для предмета на примере тарелки из 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(); } }); |
Comments