Runed Flavolite

This commit is contained in:
Aleksey 2020-10-19 17:29:05 +03:00
parent ad1c9d7d7a
commit 904b896da3
24 changed files with 331 additions and 750 deletions

View 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));
}
}

View file

@ -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();

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}