Runed Flavolite
BIN
psd/flavolite_runed.psd
Normal file
13
src/main/java/ru/betterend/blocks/RunedFlavolite.java
Normal file
|
@ -0,0 +1,13 @@
|
|||
package ru.betterend.blocks;
|
||||
|
||||
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
||||
|
||||
import ru.betterend.blocks.basis.BlockBase;
|
||||
import ru.betterend.registry.BlockRegistry;
|
||||
|
||||
public class RunedFlavolite extends BlockBase {
|
||||
|
||||
public RunedFlavolite() {
|
||||
super(FabricBlockSettings.copyOf(BlockRegistry.FLAVOLITE.polished).lightLevel(6));
|
||||
}
|
||||
}
|
|
@ -20,8 +20,8 @@ import ru.betterend.util.TagHelper;
|
|||
public class StoneMaterial {
|
||||
public final Block stone;
|
||||
|
||||
public final Block tile;
|
||||
public final Block small_tiles;
|
||||
public final Block polished;
|
||||
public final Block tiles;
|
||||
public final Block pillar;
|
||||
public final Block stairs;
|
||||
public final Block slab;
|
||||
|
@ -38,8 +38,8 @@ public class StoneMaterial {
|
|||
FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color);
|
||||
|
||||
stone = BlockRegistry.registerBlock(name, new BlockBase(material));
|
||||
tile = BlockRegistry.registerBlock(name + "_polished", new BlockBase(material));
|
||||
small_tiles = BlockRegistry.registerBlock(name + "_tiles", new BlockBase(material));
|
||||
polished = BlockRegistry.registerBlock(name + "_polished", new BlockBase(material));
|
||||
tiles = BlockRegistry.registerBlock(name + "_tiles", new BlockBase(material));
|
||||
pillar = BlockRegistry.registerBlock(name + "_pillar", new BlockPillar(material));
|
||||
stairs = BlockRegistry.registerBlock(name + "_stairs", new BlockStairs(stone));
|
||||
slab = BlockRegistry.registerBlock(name + "_slab", new BlockSlab(stone));
|
||||
|
@ -54,8 +54,8 @@ public class StoneMaterial {
|
|||
|
||||
// Recipes //
|
||||
RecipeBuilder.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build();
|
||||
RecipeBuilder.make(name + "_polished", tile).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build();
|
||||
RecipeBuilder.make(name + "_tiles", small_tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', tile).setGroup("end_small_tile").build();
|
||||
RecipeBuilder.make(name + "_polished", polished).setOutputCount(4).setShape("##", "##").addMaterial('#', bricks).setGroup("end_tile").build();
|
||||
RecipeBuilder.make(name + "_tiles", tiles).setOutputCount(4).setShape("##", "##").addMaterial('#', polished).setGroup("end_small_tile").build();
|
||||
RecipeBuilder.make(name + "_pillar", pillar).setShape("#", "#").addMaterial('#', slab).setGroup("end_pillar").build();
|
||||
|
||||
RecipeBuilder.make(name + "_stairs", stairs).setOutputCount(4).setShape("# ", "## ", "###").addMaterial('#', stone).setGroup("end_stone_stairs").build();
|
||||
|
|
|
@ -1,221 +0,0 @@
|
|||
package ru.betterend.blocks.model;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
|
||||
import net.fabricmc.fabric.api.renderer.v1.Renderer;
|
||||
import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
|
||||
import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
|
||||
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.render.model.BakedModel;
|
||||
import net.minecraft.client.render.model.BakedQuad;
|
||||
import net.minecraft.client.render.model.ModelBakeSettings;
|
||||
import net.minecraft.client.render.model.ModelLoader;
|
||||
import net.minecraft.client.render.model.UnbakedModel;
|
||||
import net.minecraft.client.render.model.json.JsonUnbakedModel;
|
||||
import net.minecraft.client.render.model.json.ModelOverrideList;
|
||||
import net.minecraft.client.render.model.json.ModelTransformation;
|
||||
import net.minecraft.client.texture.Sprite;
|
||||
import net.minecraft.client.texture.SpriteAtlasTexture;
|
||||
import net.minecraft.client.util.SpriteIdentifier;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.BlockRenderView;
|
||||
import ru.betterend.BetterEnd;
|
||||
|
||||
public class BaseBlockModel implements UnbakedModel, BakedModel, FabricBakedModel {
|
||||
|
||||
private static final Identifier DEFAULT_BLOCK_MODEL = new Identifier("minecraft:block/block");
|
||||
|
||||
private final SpriteIdentifier[] spritesIDs;
|
||||
private final Sprite[] sprites;
|
||||
private ModelTransformation transformation;
|
||||
private Mesh mesh;
|
||||
|
||||
public BaseBlockModel(String... textures) {
|
||||
this.spritesIDs = new SpriteIdentifier[textures.length];
|
||||
this.sprites = new Sprite[textures.length];
|
||||
for (int i = 0; i < textures.length; i++) {
|
||||
this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i]));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BakedModel bake(ModelLoader loader, Function<SpriteIdentifier, Sprite> textureGetter,
|
||||
ModelBakeSettings rotationContainer, Identifier modelId) {
|
||||
for(int i = 0; i < sprites.length; i++) {
|
||||
this.sprites[i] = textureGetter.apply(spritesIDs[i]);
|
||||
}
|
||||
|
||||
JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_BLOCK_MODEL);
|
||||
this.transformation = jsonBlockModel.getTransformations();
|
||||
|
||||
Renderer renderer = RendererAccess.INSTANCE.getRenderer();
|
||||
MeshBuilder builder = renderer.meshBuilder();
|
||||
QuadEmitter emitter = builder.getEmitter();
|
||||
|
||||
Direction[] directions = Direction.values();
|
||||
for (Direction direction : directions) {
|
||||
emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);
|
||||
switch (sprites.length) {
|
||||
case 1: {
|
||||
emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 3: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV);
|
||||
break;
|
||||
}
|
||||
case NORTH:
|
||||
case SOUTH: {
|
||||
emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 4: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV);
|
||||
break;
|
||||
}
|
||||
case NORTH: {
|
||||
emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV);
|
||||
break;
|
||||
}
|
||||
case SOUTH: {
|
||||
emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
emitter.spriteBake(0, sprites[3], MutableQuadView.BAKE_LOCK_UV);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 5: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP:
|
||||
case NORTH:
|
||||
case SOUTH: {
|
||||
emitter.spriteBake(0, sprites[direction.ordinal()], MutableQuadView.BAKE_LOCK_UV);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
emitter.spriteBake(0, sprites[4], MutableQuadView.BAKE_LOCK_UV);
|
||||
}
|
||||
}
|
||||
}
|
||||
default: {
|
||||
emitter.spriteBake(0, sprites[direction.ordinal()], MutableQuadView.BAKE_LOCK_UV);
|
||||
}
|
||||
}
|
||||
|
||||
emitter.spriteColor(0, -1, -1, -1, -1);
|
||||
emitter.emit();
|
||||
}
|
||||
this.mesh = builder.build();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVanillaAdapter() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos,
|
||||
Supplier<Random> randomSupplier, RenderContext context) {
|
||||
context.meshConsumer().accept(mesh);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void emitItemQuads(ItemStack stack, Supplier<Random> randomSupplier, RenderContext context) {
|
||||
context.meshConsumer().accept(mesh);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BakedQuad> getQuads(BlockState state, Direction face, Random random) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useAmbientOcclusion() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDepth() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSideLit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBuiltin() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Sprite getSprite() {
|
||||
return this.sprites[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModelTransformation getTransformation() {
|
||||
return this.transformation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModelOverrideList getOverrides() {
|
||||
return ModelOverrideList.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Identifier> getModelDependencies() {
|
||||
return Arrays.asList(DEFAULT_BLOCK_MODEL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<SpriteIdentifier> getTextureDependencies(Function<Identifier, UnbakedModel> unbakedModelGetter,
|
||||
Set<Pair<String, String>> unresolvedTextureReferences) {
|
||||
return Arrays.asList(spritesIDs);
|
||||
}
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
package ru.betterend.blocks.model;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import net.fabricmc.fabric.api.client.model.ModelProviderContext;
|
||||
import net.fabricmc.fabric.api.client.model.ModelProviderException;
|
||||
import net.fabricmc.fabric.api.client.model.ModelResourceProvider;
|
||||
import net.minecraft.client.render.model.UnbakedModel;
|
||||
import net.minecraft.util.Identifier;
|
||||
import ru.betterend.BetterEnd;
|
||||
|
||||
public class EndModelProvider implements ModelResourceProvider {
|
||||
|
||||
private static final Map<Identifier, UnbakedModel> MODELS;
|
||||
|
||||
public static final UnbakedModel FLAVOLITE_BLOCK = new BaseBlockModel("block/flavolite");
|
||||
public static final UnbakedModel FLAVOLITE_SLAB = new SlabModel("block/flavolite");
|
||||
|
||||
public static void registerModel(String path, UnbakedModel model) {
|
||||
MODELS.put(BetterEnd.makeID(path), model);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable UnbakedModel loadModelResource(Identifier resourceId, ModelProviderContext context) throws ModelProviderException {
|
||||
if (MODELS.containsKey(resourceId)) {
|
||||
return MODELS.get(resourceId);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static {
|
||||
MODELS = Maps.newHashMap();
|
||||
|
||||
registerModel("item/flavolite", FLAVOLITE_BLOCK);
|
||||
registerModel("block/flavolite", FLAVOLITE_BLOCK);
|
||||
registerModel("item/flavolite_slab", FLAVOLITE_SLAB);
|
||||
}
|
||||
}
|
|
@ -1,238 +0,0 @@
|
|||
package ru.betterend.blocks.model;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
|
||||
import net.fabricmc.fabric.api.renderer.v1.Renderer;
|
||||
import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
|
||||
import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
|
||||
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.render.model.BakedModel;
|
||||
import net.minecraft.client.render.model.BakedQuad;
|
||||
import net.minecraft.client.render.model.ModelBakeSettings;
|
||||
import net.minecraft.client.render.model.ModelLoader;
|
||||
import net.minecraft.client.render.model.UnbakedModel;
|
||||
import net.minecraft.client.render.model.json.JsonUnbakedModel;
|
||||
import net.minecraft.client.render.model.json.ModelOverrideList;
|
||||
import net.minecraft.client.render.model.json.ModelTransformation;
|
||||
import net.minecraft.client.texture.Sprite;
|
||||
import net.minecraft.client.texture.SpriteAtlasTexture;
|
||||
import net.minecraft.client.util.SpriteIdentifier;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.BlockRenderView;
|
||||
import ru.betterend.BetterEnd;
|
||||
|
||||
public class SlabModel implements UnbakedModel, BakedModel, FabricBakedModel {
|
||||
|
||||
private static final Identifier DEFAULT_SLAB_MODEL = new Identifier("minecraft:block/slab");
|
||||
|
||||
private final SpriteIdentifier[] spritesIDs;
|
||||
private final Sprite[] sprites;
|
||||
private ModelTransformation transformation;
|
||||
private Mesh mesh;
|
||||
|
||||
public SlabModel(String... textures) {
|
||||
this.spritesIDs = new SpriteIdentifier[textures.length];
|
||||
this.sprites = new Sprite[textures.length];
|
||||
for (int i = 0; i < textures.length; i++) {
|
||||
this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i]));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BakedModel bake(ModelLoader loader, Function<SpriteIdentifier, Sprite> textureGetter,
|
||||
ModelBakeSettings rotationContainer, Identifier modelId) {
|
||||
for(int i = 0; i < sprites.length; i++) {
|
||||
this.sprites[i] = textureGetter.apply(spritesIDs[i]);
|
||||
}
|
||||
|
||||
JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_SLAB_MODEL);
|
||||
this.transformation = jsonBlockModel.getTransformations();
|
||||
|
||||
Renderer renderer = RendererAccess.INSTANCE.getRenderer();
|
||||
MeshBuilder builder = renderer.meshBuilder();
|
||||
QuadEmitter emitter = builder.getEmitter();
|
||||
|
||||
for (Direction direction : Direction.values()) {
|
||||
switch (sprites.length) {
|
||||
case 1: {
|
||||
this.buildFace(emitter, direction, sprites[0]);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
this.buildFace(emitter, direction, sprites[0]);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.buildFace(emitter, direction, sprites[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 3: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
this.buildFace(emitter, direction, sprites[0]);
|
||||
break;
|
||||
}
|
||||
case NORTH:
|
||||
case SOUTH: {
|
||||
this.buildFace(emitter, direction, sprites[1]);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.buildFace(emitter, direction, sprites[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 4: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
this.buildFace(emitter, direction, sprites[0]);
|
||||
break;
|
||||
}
|
||||
case NORTH: {
|
||||
this.buildFace(emitter, direction, sprites[1]);
|
||||
break;
|
||||
}
|
||||
case SOUTH: {
|
||||
this.buildFace(emitter, direction, sprites[2]);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.buildFace(emitter, direction, sprites[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 5: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP:
|
||||
case NORTH:
|
||||
case SOUTH: {
|
||||
this.buildFace(emitter, direction, sprites[direction.ordinal()]);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.buildFace(emitter, direction, sprites[4]);
|
||||
}
|
||||
}
|
||||
}
|
||||
default: {
|
||||
this.buildFace(emitter, direction, sprites[direction.ordinal()]);
|
||||
}
|
||||
}
|
||||
|
||||
emitter.spriteColor(0, -1, -1, -1, -1);
|
||||
emitter.emit();
|
||||
}
|
||||
this.mesh = builder.build();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
private void buildFace(QuadEmitter emitter, Direction direction, Sprite sprite) {
|
||||
switch(direction) {
|
||||
case DOWN: {
|
||||
emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);
|
||||
emitter.cullFace(direction);
|
||||
break;
|
||||
}
|
||||
case UP: {
|
||||
emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
emitter.square(direction, 0.0f, 0.0f, 1.0f, 0.5f, 0.0f);
|
||||
emitter.cullFace(direction);
|
||||
}
|
||||
}
|
||||
emitter.spriteBake(0, sprite, MutableQuadView.BAKE_LOCK_UV);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVanillaAdapter() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos,
|
||||
Supplier<Random> randomSupplier, RenderContext context) {
|
||||
context.meshConsumer().accept(mesh);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void emitItemQuads(ItemStack stack, Supplier<Random> randomSupplier, RenderContext context) {
|
||||
context.meshConsumer().accept(mesh);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BakedQuad> getQuads(BlockState state, Direction face, Random random) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useAmbientOcclusion() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDepth() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSideLit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBuiltin() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Sprite getSprite() {
|
||||
return this.sprites[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModelTransformation getTransformation() {
|
||||
return this.transformation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModelOverrideList getOverrides() {
|
||||
return ModelOverrideList.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Identifier> getModelDependencies() {
|
||||
return Arrays.asList(DEFAULT_SLAB_MODEL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<SpriteIdentifier> getTextureDependencies(Function<Identifier, UnbakedModel> unbakedModelGetter,
|
||||
Set<Pair<String, String>> unresolvedTextureReferences) {
|
||||
return Arrays.asList(spritesIDs);
|
||||
}
|
||||
}
|
|
@ -1,239 +0,0 @@
|
|||
package ru.betterend.blocks.model;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
|
||||
import net.fabricmc.fabric.api.renderer.v1.Renderer;
|
||||
import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.MeshBuilder;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
|
||||
import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter;
|
||||
import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
|
||||
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.client.render.model.BakedModel;
|
||||
import net.minecraft.client.render.model.BakedQuad;
|
||||
import net.minecraft.client.render.model.ModelBakeSettings;
|
||||
import net.minecraft.client.render.model.ModelLoader;
|
||||
import net.minecraft.client.render.model.UnbakedModel;
|
||||
import net.minecraft.client.render.model.json.JsonUnbakedModel;
|
||||
import net.minecraft.client.render.model.json.ModelOverrideList;
|
||||
import net.minecraft.client.render.model.json.ModelTransformation;
|
||||
import net.minecraft.client.texture.Sprite;
|
||||
import net.minecraft.client.texture.SpriteAtlasTexture;
|
||||
import net.minecraft.client.util.SpriteIdentifier;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Direction;
|
||||
import net.minecraft.world.BlockRenderView;
|
||||
import ru.betterend.BetterEnd;
|
||||
|
||||
public class SlabTopModel implements UnbakedModel, BakedModel, FabricBakedModel {
|
||||
|
||||
private static final Identifier DEFAULT_MODEL = new Identifier("minecraft:block/slab_top");
|
||||
|
||||
private final SpriteIdentifier[] spritesIDs;
|
||||
private final Sprite[] sprites;
|
||||
private ModelTransformation transformation;
|
||||
private Mesh mesh;
|
||||
|
||||
public SlabTopModel(String... textures) {
|
||||
this.spritesIDs = new SpriteIdentifier[textures.length];
|
||||
this.sprites = new Sprite[textures.length];
|
||||
for (int i = 0; i < textures.length; i++) {
|
||||
this.spritesIDs[i] = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, BetterEnd.makeID(textures[i]));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BakedModel bake(ModelLoader loader, Function<SpriteIdentifier, Sprite> textureGetter,
|
||||
ModelBakeSettings rotationContainer, Identifier modelId) {
|
||||
for(int i = 0; i < sprites.length; i++) {
|
||||
this.sprites[i] = textureGetter.apply(spritesIDs[i]);
|
||||
}
|
||||
|
||||
JsonUnbakedModel jsonBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_MODEL);
|
||||
this.transformation = jsonBlockModel.getTransformations();
|
||||
|
||||
Renderer renderer = RendererAccess.INSTANCE.getRenderer();
|
||||
MeshBuilder builder = renderer.meshBuilder();
|
||||
QuadEmitter emitter = builder.getEmitter();
|
||||
|
||||
Direction[] directions = Direction.values();
|
||||
for (Direction direction : directions) {
|
||||
switch (sprites.length) {
|
||||
case 1: {
|
||||
this.buildModel(emitter, direction, sprites[0]);
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
this.buildModel(emitter, direction, sprites[0]);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.buildModel(emitter, direction, sprites[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 3: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
this.buildModel(emitter, direction, sprites[0]);
|
||||
break;
|
||||
}
|
||||
case NORTH:
|
||||
case SOUTH: {
|
||||
this.buildModel(emitter, direction, sprites[1]);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.buildModel(emitter, direction, sprites[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 4: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP: {
|
||||
this.buildModel(emitter, direction, sprites[0]);
|
||||
break;
|
||||
}
|
||||
case NORTH: {
|
||||
this.buildModel(emitter, direction, sprites[1]);
|
||||
break;
|
||||
}
|
||||
case SOUTH: {
|
||||
this.buildModel(emitter, direction, sprites[2]);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.buildModel(emitter, direction, sprites[3]);
|
||||
}
|
||||
}
|
||||
}
|
||||
case 5: {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
case UP:
|
||||
case NORTH:
|
||||
case SOUTH: {
|
||||
this.buildModel(emitter, direction, sprites[direction.ordinal()]);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.buildModel(emitter, direction, sprites[4]);
|
||||
}
|
||||
}
|
||||
}
|
||||
default: {
|
||||
this.buildModel(emitter, direction, sprites[direction.ordinal()]);
|
||||
}
|
||||
}
|
||||
|
||||
emitter.spriteColor(0, -1, -1, -1, -1);
|
||||
emitter.emit();
|
||||
}
|
||||
this.mesh = builder.build();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
private void buildModel(QuadEmitter emitter, Direction direction, Sprite sprite) {
|
||||
switch(direction) {
|
||||
case DOWN: {
|
||||
emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f);
|
||||
break;
|
||||
}
|
||||
case UP: {
|
||||
emitter.square(direction, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f);
|
||||
emitter.cullFace(direction);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
emitter.square(direction, 0.0f, 0.5f, 1.0f, 1.0f, 0.0f);
|
||||
emitter.cullFace(direction);
|
||||
}
|
||||
}
|
||||
emitter.spriteBake(0, sprite, MutableQuadView.BAKE_LOCK_UV);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVanillaAdapter() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void emitBlockQuads(BlockRenderView blockView, BlockState state, BlockPos pos,
|
||||
Supplier<Random> randomSupplier, RenderContext context) {
|
||||
context.meshConsumer().accept(mesh);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void emitItemQuads(ItemStack stack, Supplier<Random> randomSupplier, RenderContext context) {
|
||||
context.meshConsumer().accept(mesh);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BakedQuad> getQuads(BlockState state, Direction face, Random random) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useAmbientOcclusion() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasDepth() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSideLit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBuiltin() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Sprite getSprite() {
|
||||
return this.sprites[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModelTransformation getTransformation() {
|
||||
return this.transformation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModelOverrideList getOverrides() {
|
||||
return ModelOverrideList.EMPTY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Identifier> getModelDependencies() {
|
||||
return Arrays.asList(DEFAULT_MODEL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<SpriteIdentifier> getTextureDependencies(Function<Identifier, UnbakedModel> unbakedModelGetter,
|
||||
Set<Pair<String, String>> unresolvedTextureReferences) {
|
||||
return Arrays.asList(spritesIDs);
|
||||
}
|
||||
}
|
|
@ -2,10 +2,10 @@ package ru.betterend.client;
|
|||
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
|
||||
import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry;
|
||||
|
||||
import net.minecraft.client.render.RenderLayer;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
import ru.betterend.blocks.model.EndModelProvider;
|
||||
|
||||
import ru.betterend.registry.BlockEntityRenderRegistry;
|
||||
import ru.betterend.registry.EntityRenderRegistry;
|
||||
import ru.betterend.registry.ParticleRegistry;
|
||||
|
@ -19,8 +19,6 @@ public class BetterEndClient implements ClientModInitializer {
|
|||
ScreensRegistry.register();
|
||||
ParticleRegistry.register();
|
||||
EntityRenderRegistry.register();
|
||||
|
||||
ModelLoadingRegistry.INSTANCE.registerResourceProvider(resorceManager -> new EndModelProvider());
|
||||
}
|
||||
|
||||
private void registerRenderLayers() {
|
||||
|
|
|
@ -31,6 +31,11 @@ public class CraftingRecipes {
|
|||
.setShape(new String[] { "III", "III", "III" })
|
||||
.addMaterial('I', ItemRegistry.TERMINITE_INGOT)
|
||||
.build();
|
||||
RecipeBuilder.make(material + "_block_to_ingot", ItemRegistry.TERMINITE_INGOT)
|
||||
.addMaterial('#', BlockRegistry.TERMINITE_BLOCK)
|
||||
.setOutputCount(9)
|
||||
.setList("#")
|
||||
.build();
|
||||
|
||||
registerHelmet(material, ItemRegistry.TERMINITE_INGOT, ItemRegistry.TERMINITE_HELMET);
|
||||
registerChestplate(material, ItemRegistry.TERMINITE_INGOT, ItemRegistry.TERMINITE_CHESTPLATE);
|
||||
|
@ -48,6 +53,11 @@ public class CraftingRecipes {
|
|||
.setShape(new String[] { "III", "III", "III" })
|
||||
.addMaterial('I', ItemRegistry.AETERNIUM_INGOT)
|
||||
.build();
|
||||
RecipeBuilder.make(material + "_block_to_ingot", ItemRegistry.AETERNIUM_INGOT)
|
||||
.addMaterial('#', BlockRegistry.AETERNIUM_BLOCK)
|
||||
.setOutputCount(9)
|
||||
.setList("#")
|
||||
.build();
|
||||
|
||||
registerHelmet(material, ItemRegistry.AETERNIUM_INGOT, ItemRegistry.AETERNIUM_HELMET);
|
||||
registerChestplate(material, ItemRegistry.AETERNIUM_INGOT, ItemRegistry.AETERNIUM_CHESTPLATE);
|
||||
|
|
|
@ -5,6 +5,7 @@ import net.minecraft.block.MaterialColor;
|
|||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.blocks.AeterniumBlock;
|
||||
import ru.betterend.blocks.AuroraCrystalBlock;
|
||||
|
@ -28,6 +29,7 @@ import ru.betterend.blocks.BlockUmbrellaMoss;
|
|||
import ru.betterend.blocks.BlockUmbrellaMossTall;
|
||||
import ru.betterend.blocks.EndStoneSmelter;
|
||||
import ru.betterend.blocks.EnderBlock;
|
||||
import ru.betterend.blocks.RunedFlavolite;
|
||||
import ru.betterend.blocks.TerminiteBlock;
|
||||
import ru.betterend.blocks.basis.BlockGlowingFur;
|
||||
import ru.betterend.blocks.basis.BlockLeaves;
|
||||
|
@ -51,6 +53,7 @@ public class BlockRegistry {
|
|||
// Rocks //
|
||||
public static final StoneMaterial FLAVOLITE = new StoneMaterial("flavolite", MaterialColor.SAND);
|
||||
public static final StoneMaterial VIOLECITE = new StoneMaterial("violecite", MaterialColor.PURPLE);
|
||||
public static final Block FLAVOLITE_RUNED = registerBlock("flavolite_runed", new RunedFlavolite());
|
||||
|
||||
// Wooden Materials //
|
||||
public static final Block MOSSY_GLOWSHROOM_SAPLING = registerBlock("mossy_glowshroom_sapling", new BlockMossyGlowshroomSapling());
|
||||
|
|
|
@ -0,0 +1,225 @@
|
|||
{
|
||||
"variants": {
|
||||
"": [
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_1",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_2",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 90,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 180,
|
||||
"y": 270
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 90
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 180
|
||||
},
|
||||
{
|
||||
"model": "betterend:block/flavolite_runed_3",
|
||||
"uvlock": true,
|
||||
"x": 270,
|
||||
"y": 270
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"textures": {
|
||||
"particle": "betterend:block/flavolite_polished",
|
||||
"rune_1": "betterend:block/flavolite_runed_1",
|
||||
"rune_2": "betterend:block/flavolite_runed_2",
|
||||
"rune_3": "betterend:block/flavolite_runed_3"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [ 0, 0, 0 ],
|
||||
"to": [ 16, 16, 16 ],
|
||||
"faces": {
|
||||
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_1", "cullface": "down" },
|
||||
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_1", "cullface": "up" },
|
||||
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_2", "cullface": "north" },
|
||||
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_2", "cullface": "south" },
|
||||
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_3", "cullface": "west" },
|
||||
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_3", "cullface": "east" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"textures": {
|
||||
"particle": "betterend:block/flavolite_polished",
|
||||
"rune_1": "betterend:block/flavolite_runed_4",
|
||||
"rune_2": "betterend:block/flavolite_runed_5",
|
||||
"rune_3": "betterend:block/flavolite_runed_6"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [ 0, 0, 0 ],
|
||||
"to": [ 16, 16, 16 ],
|
||||
"faces": {
|
||||
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_1", "cullface": "down" },
|
||||
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_1", "cullface": "up" },
|
||||
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_2", "cullface": "north" },
|
||||
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_2", "cullface": "south" },
|
||||
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_3", "cullface": "west" },
|
||||
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_3", "cullface": "east" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"textures": {
|
||||
"particle": "betterend:block/flavolite_polished",
|
||||
"rune_1": "betterend:block/flavolite_runed_7",
|
||||
"rune_2": "betterend:block/flavolite_runed_8",
|
||||
"rune_3": "betterend:block/flavolite_runed_9"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [ 0, 0, 0 ],
|
||||
"to": [ 16, 16, 16 ],
|
||||
"faces": {
|
||||
"down": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_1", "cullface": "down" },
|
||||
"up": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_1", "cullface": "up" },
|
||||
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_2", "cullface": "north" },
|
||||
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_2", "cullface": "south" },
|
||||
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_3", "cullface": "west" },
|
||||
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#rune_3", "cullface": "east" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"parent": "betterend:block/flavolite_runed_1"
|
||||
}
|
After Width: | Height: | Size: 719 B |
After Width: | Height: | Size: 729 B |
After Width: | Height: | Size: 705 B |
After Width: | Height: | Size: 723 B |
After Width: | Height: | Size: 723 B |
After Width: | Height: | Size: 707 B |
After Width: | Height: | Size: 712 B |
After Width: | Height: | Size: 707 B |
After Width: | Height: | Size: 717 B |