diff --git a/src/main/java/ru/betterend/blocks/CharcoalBlock.java b/src/main/java/ru/betterend/blocks/CharcoalBlock.java new file mode 100644 index 00000000..7097a6e0 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/CharcoalBlock.java @@ -0,0 +1,13 @@ +package ru.betterend.blocks; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.block.Blocks; +import ru.betterend.blocks.basis.BlockBase; + +public class CharcoalBlock extends BlockBase { + public CharcoalBlock() { + super(FabricBlockSettings.copyOf(Blocks.COAL_BLOCK)); + FuelRegistry.INSTANCE.add(this, 6000); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java new file mode 100644 index 00000000..c75e50dd --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -0,0 +1,65 @@ +package ru.betterend.blocks.basis; + +import java.io.Reader; +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.Block; +import net.minecraft.block.FurnaceBlock; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.stat.Stats; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import ru.betterend.blocks.entities.EFurnaceBlockEntity; +import ru.betterend.patterns.BlockPatterned; +import ru.betterend.patterns.Patterns; + +public class EndFurnaceBlock extends FurnaceBlock implements BlockPatterned { + public EndFurnaceBlock(Block source) { + super(FabricBlockSettings.copyOf(source)); + } + + @Override + public BlockEntity createBlockEntity(BlockView world) { + return new EFurnaceBlockEntity(); + } + + @Override + protected void openScreen(World world, BlockPos pos, PlayerEntity player) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity instanceof EFurnaceBlockEntity) { + player.openHandledScreen((NamedScreenHandlerFactory) blockEntity); + player.incrementStat(Stats.INTERACT_WITH_FURNACE); + } + } + + @Override + public String getStatesPattern(Reader data) { + Identifier blockId = Registry.BLOCK.getId(this); + return Patterns.createJson(data, blockId.getPath(), blockId.getPath()); + } + + @Override + public String getModelPattern(String block) { + String add = block.contains("_on") ? "_on" : ""; + Identifier blockId = Registry.BLOCK.getId(this); + Map map = Maps.newHashMap(); + map.put("%top%", blockId.getPath() + "_top"); + map.put("%front%", blockId.getPath() + "_front" + add); + map.put("%side%", blockId.getPath() + "_side"); + map.put("%bottom%", blockId.getPath() + "_bottom"); + return Patterns.createJson(Patterns.BLOCK_FURNACE, map); + } + + @Override + public Identifier statePatternId() { + return Patterns.STATE_FURNACE; + } +} diff --git a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java index d4b4cefe..b98fcd97 100644 --- a/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/StoneMaterial.java @@ -8,6 +8,7 @@ import net.minecraft.tag.BlockTags; import net.minecraft.tag.ItemTags; import ru.betterend.blocks.EndPedestal; import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndPillarBlock; import ru.betterend.blocks.basis.EndSlabBlock; import ru.betterend.blocks.basis.EndStairsBlock; @@ -40,6 +41,7 @@ public class StoneMaterial { public final Block brick_stairs; public final Block brick_slab; public final Block brick_wall; + public final Block furnace; public StoneMaterial(String name, MaterialColor color) { FabricBlockSettings material = FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color); @@ -60,6 +62,7 @@ public class StoneMaterial { brick_stairs = EndBlocks.registerBlock(name + "_bricks_stairs", new EndStairsBlock(bricks)); brick_slab = EndBlocks.registerBlock(name + "_bricks_slab", new EndSlabBlock(bricks)); brick_wall = EndBlocks.registerBlock(name + "_bricks_wall", new EndWallBlock(bricks)); + furnace = EndBlocks.registerBlock(name + "_furnace", new EndFurnaceBlock(bricks)); // Recipes // GridRecipe.make(name + "_bricks", bricks).setOutputCount(4).setShape("##", "##").addMaterial('#', stone).setGroup("end_bricks").build(); @@ -78,6 +81,7 @@ public class StoneMaterial { GridRecipe.make(name + "_button", button).setList("#").addMaterial('#', stone).setGroup("end_stone_buttons").build(); GridRecipe.make(name + "_pressure_plate", pressure_plate).setShape("##").addMaterial('#', stone).setGroup("end_stone_plates").build(); GridRecipe.make(name + "_lantern", lantern).setShape("S", "#", "S").addMaterial('#', EndItems.CRYSTAL_SHARDS).addMaterial('S', slab, brick_slab).setGroup("end_stone_lanterns").build(); + GridRecipe.make(name + "_furnace", furnace).setShape("###", "# #", "###").addMaterial('#', stone).setGroup("end_stone_furnaces").build(); CraftingRecipes.registerPedestal(name + "_pedestal", pedestal, slab, pillar); diff --git a/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java new file mode 100644 index 00000000..8537ae9d --- /dev/null +++ b/src/main/java/ru/betterend/blocks/entities/EFurnaceBlockEntity.java @@ -0,0 +1,24 @@ +package ru.betterend.blocks.entities; + +import net.minecraft.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.recipe.RecipeType; +import net.minecraft.screen.FurnaceScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableText; +import ru.betterend.registry.EndBlockEntities; + +public class EFurnaceBlockEntity extends AbstractFurnaceBlockEntity { + public EFurnaceBlockEntity() { + super(EndBlockEntities.FURNACE, RecipeType.SMELTING); + } + + protected Text getContainerName() { + return new TranslatableText("container.furnace"); + } + + protected ScreenHandler createScreenHandler(int syncId, PlayerInventory playerInventory) { + return new FurnaceScreenHandler(syncId, playerInventory, this, this.propertyDelegate); + } +} diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 05020b72..19c6c0ee 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -9,6 +9,7 @@ import com.google.common.collect.Maps; import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.fabricmc.fabric.api.registry.FuelRegistry; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.entity.LockableContainerBlockEntity; @@ -398,7 +399,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp return 0; } Item item = fuel.getItem(); - return AVAILABLE_FUELS.getOrDefault(item, 0); + return AVAILABLE_FUELS.getOrDefault(item, getFabricFuel(fuel)); } @Override @@ -442,7 +443,7 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp } public static boolean canUseAsFuel(ItemStack stack) { - return AVAILABLE_FUELS.containsKey(stack.getItem()); + return AVAILABLE_FUELS.containsKey(stack.getItem()) || getFabricFuel(stack) > 2000; } public static void registerFuel(ItemConvertible fuel, int time) { @@ -452,4 +453,9 @@ public class EndStoneSmelterBlockEntity extends LockableContainerBlockEntity imp public static Map availableFuels() { return AVAILABLE_FUELS; } + + private static int getFabricFuel(ItemStack stack) { + Integer ticks = FuelRegistry.INSTANCE.get(stack.getItem()); + return ticks == null ? 0 : ticks; + } } diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index daf238d2..6c4cfbcb 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -43,6 +43,7 @@ public class Patterns { public final static Identifier STATE_ANVIL = BetterEnd.makeID("patterns/blockstate/anvil.json"); public final static Identifier STATE_CHAIN = BetterEnd.makeID("patterns/blockstate/chain.json"); public final static Identifier STATE_CHANDELIER = BetterEnd.makeID("patterns/blockstate/chandelier.json"); + public final static Identifier STATE_FURNACE = BetterEnd.makeID("patterns/blockstate/furnace.json"); //Models Block public final static Identifier BLOCK_EMPTY = BetterEnd.makeID("patterns/block/empty.json"); @@ -96,6 +97,7 @@ public class Patterns { public final static Identifier BLOCK_CHANDELIER_FLOOR = BetterEnd.makeID("patterns/block/chandelier_floor.json"); public final static Identifier BLOCK_CHANDELIER_WALL = BetterEnd.makeID("patterns/block/chandelier_wall.json"); public final static Identifier BLOCK_CHANDELIER_CEIL = BetterEnd.makeID("patterns/block/chandelier_ceil.json"); + public final static Identifier BLOCK_FURNACE = BetterEnd.makeID("patterns/block/furnace.json"); //Models Item public final static Identifier ITEM_WALL = BetterEnd.makeID("patterns/item/pattern_wall.json"); diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 96e91f06..3b927dd2 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -164,25 +164,28 @@ public class CraftingRecipes { GridRecipe.make("fiber_string", Items.STRING).setOutputCount(6).setShape("#", "#", "#").addMaterial('#', EndItems.SILK_FIBER).build(); GridRecipe.make("ender_eye_amber", Items.ENDER_EYE) - .setShape("SAS", "APA", "SAS") - .addMaterial('S', EndItems.CRYSTAL_SHARDS) - .addMaterial('A', EndItems.AMBER_GEM) - .addMaterial('P', Items.ENDER_PEARL) - .build(); + .setShape("SAS", "APA", "SAS") + .addMaterial('S', EndItems.CRYSTAL_SHARDS) + .addMaterial('A', EndItems.AMBER_GEM) + .addMaterial('P', Items.ENDER_PEARL) + .build(); GridRecipe.make("iron_chandelier", EndBlocks.IRON_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.IRON_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); GridRecipe.make("gold_chandelier", EndBlocks.GOLD_CHANDELIER).setShape("I#I", " # ").addMaterial('#', Items.GOLD_INGOT).addMaterial('I', EndItems.LUMECORN_ROD).setGroup("end_metal_chandelier").build(); GridRecipe.make("missing_tile", EndBlocks.MISSING_TILE) - .setOutputCount(4) - .setShape("#P", "P#") - .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) - .addMaterial('P', Blocks.PURPUR_BLOCK) - .build(); + .setOutputCount(4) + .setShape("#P", "P#") + .addMaterial('#', EndBlocks.VIOLECITE.stone, EndBlocks.VIOLECITE.bricks, EndBlocks.VIOLECITE.tiles) + .addMaterial('P', Blocks.PURPUR_BLOCK) + .build(); registerHammer("iron", Items.IRON_INGOT, EndItems.IRON_HAMMER); registerHammer("golden", Items.GOLD_INGOT, EndItems.GOLDEN_HAMMER); registerHammer("diamond", Items.DIAMOND, EndItems.DIAMOND_HAMMER); + + GridRecipe.make("charcoal_block", EndBlocks.CHARCOAL_BLOCK).setShape("###", "###", "###").addMaterial('#', Items.CHARCOAL).build(); + GridRecipe.make("end_stone_furnace", EndBlocks.END_STONE_FURNACE).setShape("###", "# #", "###").addMaterial('#', Blocks.END_STONE).build(); } private static void registerLantern(String name, Block lantern, Block slab) { @@ -205,9 +208,9 @@ public class CraftingRecipes { private static void registerHammer(String name, Item material, Item result) { GridRecipe.make(name + "_hammer", result) - .setShape("I I", "I#I", " # ") - .addMaterial('I', material) - .addMaterial('#', Items.STICK) - .build(); + .setShape("I I", "I#I", " # ") + .addMaterial('I', material) + .addMaterial('#', Items.STICK) + .build(); } } diff --git a/src/main/java/ru/betterend/registry/EndBlockEntities.java b/src/main/java/ru/betterend/registry/EndBlockEntities.java index c3e6d87b..6b74d82c 100644 --- a/src/main/java/ru/betterend/registry/EndBlockEntities.java +++ b/src/main/java/ru/betterend/registry/EndBlockEntities.java @@ -15,11 +15,13 @@ import ru.betterend.blocks.EternalPedestal; import ru.betterend.blocks.InfusionPedestal; import ru.betterend.blocks.basis.EndBarrelBlock; import ru.betterend.blocks.basis.EndChestBlock; +import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndSignBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.entities.BlockEntityHydrothermalVent; import ru.betterend.blocks.entities.EBarrelBlockEntity; import ru.betterend.blocks.entities.EChestBlockEntity; +import ru.betterend.blocks.entities.EFurnaceBlockEntity; import ru.betterend.blocks.entities.ESignBlockEntity; import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.blocks.entities.EternalPedestalEntity; @@ -43,6 +45,8 @@ public class EndBlockEntities { BlockEntityType.Builder.create(ESignBlockEntity::new, getSigns())); public final static BlockEntityType HYDROTHERMAL_VENT = registerBlockEntity("hydrother_malvent", BlockEntityType.Builder.create(BlockEntityHydrothermalVent::new, EndBlocks.HYDROTHERMAL_VENT)); + public static final BlockEntityType FURNACE = registerBlockEntity("furnace", + BlockEntityType.Builder.create(EFurnaceBlockEntity::new, getFurnaces())); public static BlockEntityType registerBlockEntity(String id, BlockEntityType.Builder builder) { return Registry.register(Registry.BLOCK_ENTITY_TYPE, BetterEnd.makeID(id), builder.build(null)); @@ -103,4 +107,17 @@ public class EndBlockEntities { }); return result.toArray(new Block[] {}); } + + static Block[] getFurnaces() { + List result = Lists.newArrayList(); + EndItems.getModBlocks().forEach((item) -> { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof EndFurnaceBlock) { + result.add(block); + } + } + }); + return result.toArray(new Block[] {}); + } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 9fa2a9e2..58dbc930 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -21,6 +21,7 @@ import ru.betterend.blocks.BulbVineLanternBlock; import ru.betterend.blocks.BulbVineLanternColoredBlock; import ru.betterend.blocks.BulbVineSeedBlock; import ru.betterend.blocks.ChandelierBlock; +import ru.betterend.blocks.CharcoalBlock; import ru.betterend.blocks.CharniaBlock; import ru.betterend.blocks.ChorusGrassBlock; import ru.betterend.blocks.DenseEmeraldIceBlock; @@ -89,6 +90,7 @@ import ru.betterend.blocks.UmbrellaTreeMembraneBlock; import ru.betterend.blocks.UmbrellaTreeSaplingBlock; import ru.betterend.blocks.VentBubbleColumnBlock; import ru.betterend.blocks.basis.EndCropBlock; +import ru.betterend.blocks.basis.EndFurnaceBlock; import ru.betterend.blocks.basis.EndLeavesBlock; import ru.betterend.blocks.basis.EndOreBlock; import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; @@ -292,6 +294,7 @@ public class EndBlocks { public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal("thallasium", MaterialColor.BLUE, EndToolMaterial.THALLASIUM, EndArmorMaterial.TERMINITE); public static final MetalMaterial TERMINITE = MetalMaterial.makeOreless("terminite", MaterialColor.field_25708, 7F, 9F, EndToolMaterial.TERMINITE, EndArmorMaterial.TERMINITE); public static final Block AETERNIUM_BLOCK = registerBlock("aeternium_block", new AeterniumBlock()); + public static final Block CHARCOAL_BLOCK = registerBlock("charcoal_block", new CharcoalBlock()); public static final Block ENDER_BLOCK = registerBlock("ender_block", new EnderBlock()); public static final Block AURORA_CRYSTAL = registerBlock("aurora_crystal", new AuroraCrystalBlock()); @@ -315,6 +318,7 @@ public class EndBlocks { public static final Block GOLD_CHANDELIER = EndBlocks.registerBlock("gold_chandelier", new ChandelierBlock(Blocks.GOLD_BLOCK)); // Blocks With Entity // + public static final Block END_STONE_FURNACE = registerBlock("end_stone_furnace", new EndFurnaceBlock(Blocks.END_STONE)); public static final Block END_STONE_SMELTER = registerBlock("end_stone_smelter", new EndStoneSmelter()); public static final Block ETERNAL_PEDESTAL = registerBlock("eternal_pedestal", new EternalPedestal()); public static final Block INFUSION_PEDESTAL = registerBlock("infusion_pedestal", new InfusionPedestal()); diff --git a/src/main/resources/assets/betterend/lang/en_us.json b/src/main/resources/assets/betterend/lang/en_us.json index 955bd1ba..b03141fb 100644 --- a/src/main/resources/assets/betterend/lang/en_us.json +++ b/src/main/resources/assets/betterend/lang/en_us.json @@ -657,5 +657,6 @@ "item.betterend.thallasium_hammer": "Thallasium Hammer", "item.betterend.thallasium_helmet": "Thallasium Helmet", "item.betterend.thallasium_leggings": "Thallasium Leggings", - "block.betterend.missing_tile": "Missing Tile" + "block.betterend.missing_tile": "Missing Tile", + "block.betterend.charcoal_block": "Charcoal Block" } diff --git a/src/main/resources/assets/betterend/lang/ru_ru.json b/src/main/resources/assets/betterend/lang/ru_ru.json index 8b988c95..f7fd144f 100644 --- a/src/main/resources/assets/betterend/lang/ru_ru.json +++ b/src/main/resources/assets/betterend/lang/ru_ru.json @@ -677,5 +677,6 @@ "item.betterend.thallasium_hammer": "Талласиевый молот", "item.betterend.thallasium_helmet": "Талласиевый шлем", "item.betterend.thallasium_leggings": "Талласиевые поножи", - "block.betterend.missing_tile": "Отсутствующая плитка" + "block.betterend.missing_tile": "Отсутствующая плитка", + "block.betterend.charcoal_block": "Блок древесного угля" } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/patterns/block/furnace.json b/src/main/resources/assets/betterend/patterns/block/furnace.json new file mode 100644 index 00000000..3824c3a0 --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/block/furnace.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "top": "minecraft:block/%top%", + "front": "minecraft:block/%front%", + "side": "minecraft:block/%side%" + "bottom": "minecraft:block/%bottom%" + } +} diff --git a/src/main/resources/assets/betterend/patterns/blockstate/furnace.json b/src/main/resources/assets/betterend/patterns/blockstate/furnace.json new file mode 100644 index 00000000..84d508df --- /dev/null +++ b/src/main/resources/assets/betterend/patterns/blockstate/furnace.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 90 + }, + "facing=east,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 90 + }, + "facing=north,lit=false": { + "model": "betterend:pattern/%block%/%block%" + }, + "facing=north,lit=true": { + "model": "betterend:pattern/%block%/%block%_on" + }, + "facing=south,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 180 + }, + "facing=south,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 180 + }, + "facing=west,lit=false": { + "model": "betterend:pattern/%block%/%block%", + "y": 270 + }, + "facing=west,lit=true": { + "model": "betterend:pattern/%block%/%block%_on", + "y": 270 + } + } +} diff --git a/src/main/resources/assets/betterend/textures/block/charcoal_block.png b/src/main/resources/assets/betterend/textures/block/charcoal_block.png new file mode 100644 index 00000000..b86c8eae Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/charcoal_block.png differ