diff --git a/src/main/java/ru/betterend/blocks/BlockStone.java b/src/main/java/ru/betterend/blocks/BlockStone.java new file mode 100644 index 00000000..305cf219 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/BlockStone.java @@ -0,0 +1,14 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Blocks; +import net.minecraft.block.MaterialColor; +import net.minecraft.sound.BlockSoundGroup; +import ru.betterend.blocks.basis.BlockBase; + +public class BlockStone extends BlockBase { + + public BlockStone(MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sounds(BlockSoundGroup.STONE)); + } +} diff --git a/src/main/java/ru/betterend/blocks/model/BaseBlockModel.java b/src/main/java/ru/betterend/blocks/model/BaseBlockModel.java new file mode 100644 index 00000000..65be7d3d --- /dev/null +++ b/src/main/java/ru/betterend/blocks/model/BaseBlockModel.java @@ -0,0 +1,230 @@ +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 textureGetter, + ModelBakeSettings rotationContainer, Identifier modelId) { + for(int i = 0; i < sprites.length; i++) { + this.sprites[i] = textureGetter.apply(spritesIDs[i]); + } + + JsonUnbakedModel defaultBlockModel = (JsonUnbakedModel) loader.getOrLoadModel(DEFAULT_BLOCK_MODEL); + this.transformation = defaultBlockModel.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[1], MutableQuadView.BAKE_LOCK_UV); + break; + } + default: { + emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); + } + } + } + case 3: { + switch (direction) { + case DOWN: + case UP: { + emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); + break; + } + case NORTH: + case SOUTH: { + emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV); + break; + } + default: { + emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); + } + } + } + case 4: { + switch (direction) { + case DOWN: + case UP: { + emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); + break; + } + case NORTH: { + emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV); + break; + } + case SOUTH: { + emitter.spriteBake(0, sprites[3], MutableQuadView.BAKE_LOCK_UV); + break; + } + default: { + emitter.spriteBake(0, sprites[0], MutableQuadView.BAKE_LOCK_UV); + } + } + } + case 5: { + switch (direction) { + case DOWN: { + emitter.spriteBake(0, sprites[1], MutableQuadView.BAKE_LOCK_UV); + break; + } + case UP: { + emitter.spriteBake(0, sprites[2], MutableQuadView.BAKE_LOCK_UV); + break; + } + case NORTH: { + emitter.spriteBake(0, sprites[3], MutableQuadView.BAKE_LOCK_UV); + } + case SOUTH: { + emitter.spriteBake(0, sprites[4], MutableQuadView.BAKE_LOCK_UV); + break; + } + default: { + emitter.spriteBake(0, sprites[0], 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 randomSupplier, RenderContext context) { + context.meshConsumer().accept(mesh); + } + + @Override + public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { + context.meshConsumer().accept(mesh); + } + + @Override + public List 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 getModelDependencies() { + return Arrays.asList(DEFAULT_BLOCK_MODEL); + } + + @Override + public Collection getTextureDependencies(Function unbakedModelGetter, + Set> unresolvedTextureReferences) { + return Arrays.asList(spritesIDs); + } +} diff --git a/src/main/java/ru/betterend/blocks/model/EndModelProvider.java b/src/main/java/ru/betterend/blocks/model/EndModelProvider.java new file mode 100644 index 00000000..a630726d --- /dev/null +++ b/src/main/java/ru/betterend/blocks/model/EndModelProvider.java @@ -0,0 +1,42 @@ +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 MODELS; + + public static final UnbakedModel BASE_BLOCK_MODEL = new BaseBlockModel("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("block/flavolite", BASE_BLOCK_MODEL); + registerModel("item/flavolite", BASE_BLOCK_MODEL); + } +} diff --git a/src/main/java/ru/betterend/client/BetterEndClient.java b/src/main/java/ru/betterend/client/BetterEndClient.java index c7c4dfdf..a990c465 100644 --- a/src/main/java/ru/betterend/client/BetterEndClient.java +++ b/src/main/java/ru/betterend/client/BetterEndClient.java @@ -2,8 +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; @@ -17,6 +19,8 @@ public class BetterEndClient implements ClientModInitializer { ScreensRegistry.register(); ParticleRegistry.register(); EntityRenderRegistry.register(); + + ModelLoadingRegistry.INSTANCE.registerResourceProvider(resorceManager -> new EndModelProvider()); } private void registerRenderLayers() { diff --git a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java index 266d6ed6..0f2a0eee 100644 --- a/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndermanEntityMixin.java @@ -6,6 +6,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.entity.player.PlayerEntity; @@ -18,7 +19,7 @@ public abstract class EndermanEntityMixin { @Inject(method = "isPlayerStaring", at = @At("HEAD"), cancellable = true) private void isPlayerStaring(PlayerEntity player, CallbackInfoReturnable info) { if (player.isCreative() || player.hasStatusEffect(EndStatusEffects.END_VEIL) || - EnchantmentHelper.getEquipmentLevel(EndEnchantments.END_VEIL, player) > 0) { + EnchantmentHelper.getLevel(EndEnchantments.END_VEIL, player.getEquippedStack(EquipmentSlot.HEAD)) > 0) { info.setReturnValue(false); info.cancel(); } diff --git a/src/main/java/ru/betterend/registry/BlockRegistry.java b/src/main/java/ru/betterend/registry/BlockRegistry.java index 4910b8c0..9c1b1273 100644 --- a/src/main/java/ru/betterend/registry/BlockRegistry.java +++ b/src/main/java/ru/betterend/registry/BlockRegistry.java @@ -18,6 +18,7 @@ import ru.betterend.blocks.BlockMossyGlowshroomHymenophore; import ru.betterend.blocks.BlockMossyGlowshroomSapling; import ru.betterend.blocks.BlockOre; import ru.betterend.blocks.BlockPath; +import ru.betterend.blocks.BlockStone; import ru.betterend.blocks.BlockTerrain; import ru.betterend.blocks.BlockUmbrellaMoss; import ru.betterend.blocks.BlockUmbrellaMossTall; @@ -34,6 +35,7 @@ public class BlockRegistry { public static final Block ENDSTONE_DUST = registerBlock("endstone_dust", new BlockEndstoneDust()); public static final Block END_MYCELIUM = registerBlock("end_mycelium", new BlockTerrain(MaterialColor.LIGHT_BLUE)); public static final Block END_MOSS = registerBlock("end_moss", new BlockTerrain(MaterialColor.CYAN)); + public static final Block FLAVOLITE = registerBlock("flavolite", new BlockStone(MaterialColor.SAND)); // Roads // public static final Block END_MYCELIUM_PATH = registerBlock("end_mycelium_path", new BlockPath(END_MYCELIUM)); diff --git a/src/main/resources/assets/betterend/blockstates/flavolite.json b/src/main/resources/assets/betterend/blockstates/flavolite.json new file mode 100644 index 00000000..5cde9964 --- /dev/null +++ b/src/main/resources/assets/betterend/blockstates/flavolite.json @@ -0,0 +1,78 @@ +{ + "variants": { + "": [ + { + "model": "betterend:block/flavolite" + }, + { + "model": "betterend:block/flavolite", + "x": 90 + }, + { + "model": "betterend:block/flavolite", + "x": 180 + }, + { + "model": "betterend:block/flavolite", + "x": 270 + }, + { + "model": "betterend:block/flavolite", + "y": 90 + }, + { + "model": "betterend:block/flavolite", + "y": 90, + "x": 90 + }, + { + "model": "betterend:block/flavolite", + "y": 90, + "x": 180 + }, + { + "model": "betterend:block/flavolite", + "y": 90, + "x": 270 + }, + { + "model": "betterend:block/flavolite", + "y": 180 + }, + { + "model": "betterend:block/flavolite", + "y": 180, + "x": 90 + }, + { + "model": "betterend:block/flavolite", + "y": 180, + "x": 180 + }, + { + "model": "betterend:block/flavolite", + "y": 180, + "x": 270 + }, + { + "model": "betterend:block/flavolite", + "y": 270 + }, + { + "model": "betterend:block/flavolite", + "y": 270, + "x": 90 + }, + { + "model": "betterend:block/flavolite", + "y": 270, + "x": 180 + }, + { + "model": "betterend:block/flavolite", + "y": 270, + "x": 270 + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 293a7c7d..9482f5c3 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -12,6 +12,7 @@ "block.betterend.end_mycelium": "End Mycelium", "block.betterend.end_moss": "End Moss", "block.betterend.endstone_dust": "End Stone Dust", + "block.betterend.flavolite": "Flavolite", "block.betterend.end_mycelium_path": "End Mycelium Path", "block.betterend.end_moss_path": "End Moss Path", @@ -53,7 +54,7 @@ "effect.betterend.end_veil": "End Veil", "enchantment.betterend.end_veil": "End Veil", "item.minecraft.potion.effect.end_veil": "Potion of End Veil", - "item.minecraft.potion.effect.long_end_veil": "Long potion of End Veil", + "item.minecraft.potion.effect.long_end_veil": "Potion of End Veil", "item.minecraft.splash_potion.effect.end_veil": "Splash potion of End Veil", "item.minecraft.splash_potion.effect.long_end_veil": "Splash potion of End Veil", "item.minecraft.lingering_potion.effect.end_veil": "Lingering potion of End Veil", diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 32224bf3..64ebb153 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -12,6 +12,7 @@ "block.betterend.end_mycelium": "Мицелий края", "block.betterend.end_moss": "Мох края", "block.betterend.endstone_dust": "Эндерняковая пыль", + "block.betterend.flavolite": "Флаволит", "block.betterend.end_mycelium_path": "Дорога из мицелия края", "block.betterend.end_moss_path": "Дорога из мха края", @@ -53,7 +54,7 @@ "effect.betterend.end_veil": "Вуаль Края", "enchantment.betterend.end_veil": "Вуаль Края", "item.minecraft.potion.effect.end_veil": "Зелье Вуали Края", - "item.minecraft.potion.effect.long_end_veil": "Долгое зелье Вуали Края", + "item.minecraft.potion.effect.long_end_veil": "Зелье Вуали Края", "item.minecraft.splash_potion.effect.end_veil": "Взрывное зелье Вуали Края", "item.minecraft.splash_potion.effect.long_end_veil": "Взрывное зелье Вуали Края", "item.minecraft.lingering_potion.effect.end_veil": "Оседающее зелье Вуали Края", diff --git a/src/main/resources/assets/betterend/models/block/flavolite_1.json b/src/main/resources/assets/betterend/models/block/flavolite_1.json new file mode 100644 index 00000000..e1a01c82 --- /dev/null +++ b/src/main/resources/assets/betterend/models/block/flavolite_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "betterend:block/flavolite" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/models/item/flavolite_1.json b/src/main/resources/assets/betterend/models/item/flavolite_1.json new file mode 100644 index 00000000..8a88cbe0 --- /dev/null +++ b/src/main/resources/assets/betterend/models/item/flavolite_1.json @@ -0,0 +1,3 @@ +{ + "parent": "betterend:block/flavolite" +} \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/flavolite.png b/src/main/resources/assets/betterend/textures/block/flavolite.png new file mode 100644 index 00000000..bdc9ad84 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/flavolite.png differ