From 792e81f4ca3444a00175da4d0d901f9b4867b664 Mon Sep 17 00:00:00 2001 From: Motschen Date: Sat, 23 Jan 2021 19:37:41 +0100 Subject: [PATCH] Fancy Furnace, better packet handling, config translations --- gradle.properties | 2 +- .../visualoverhaul/VisualOverhaul.java | 1 + .../visualoverhaul/VisualOverhaulClient.java | 24 ++- .../BrewingStandBlockEntityRenderer.java | 1 - .../renderer/FurnaceBlockEntityRenderer.java | 116 +++++++++++++ .../visualoverhaul/config/VOConfig.java | 5 +- .../MixinAbstractFurnaceBlockEntity.java | 53 ++++++ .../mixin/MixinBrewingStandBlockEntity.java | 19 +-- .../mixin/MixinJukeboxBlockEntity.java | 12 +- .../resources/assets/visualoverhaul/icon.png | Bin 5320 -> 12543 bytes .../assets/visualoverhaul/lang/en_us.json | 7 + src/main/resources/fabric.mod.json | 4 +- .../assets/minecraft/blockstates/furnace.json | 34 ++++ .../minecraft/materialmaps/block/furnace.json | 14 ++ .../minecraft/models/block/furnace.json | 148 +++++++++++++++++ .../minecraft/models/block/furnace_on.json | 156 ++++++++++++++++++ .../resourcepacks/fancyfurnace/pack.mcmeta | 6 + .../resourcepacks/fancyfurnace/pack.png | Bin 0 -> 3038 bytes .../textures/block/brewing_stand.png | Bin .../pack.mcmeta | 0 .../pack.png | Bin src/main/resources/visualoverhaul.mixins.json | 3 +- 22 files changed, 575 insertions(+), 30 deletions(-) create mode 100644 src/main/java/eu/midnightdust/visualoverhaul/block/renderer/FurnaceBlockEntityRenderer.java create mode 100644 src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinAbstractFurnaceBlockEntity.java create mode 100644 src/main/resources/assets/visualoverhaul/lang/en_us.json create mode 100644 src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/blockstates/furnace.json create mode 100644 src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/materialmaps/block/furnace.json create mode 100644 src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace.json create mode 100644 src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace_on.json create mode 100644 src/main/resources/resourcepacks/fancyfurnace/pack.mcmeta create mode 100644 src/main/resources/resourcepacks/fancyfurnace/pack.png rename src/main/resources/resourcepacks/{visualoverhaul => nobrewingbottles}/assets/minecraft/textures/block/brewing_stand.png (100%) rename src/main/resources/resourcepacks/{visualoverhaul => nobrewingbottles}/pack.mcmeta (100%) rename src/main/resources/resourcepacks/{visualoverhaul => nobrewingbottles}/pack.png (100%) diff --git a/gradle.properties b/gradle.properties index e1c9c56..6887970 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.11.1 # Mod Properties - mod_version = 1.1.0 + mod_version = 2.0.0 maven_group = eu.midnightdust archives_base_name = visualoverhaul diff --git a/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaul.java b/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaul.java index 3079472..c0649b3 100644 --- a/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaul.java +++ b/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaul.java @@ -5,4 +5,5 @@ import net.minecraft.util.Identifier; public class VisualOverhaul { public static final Identifier UPDATE_POTION_BOTTLES = new Identifier("visualoverhaul", "brewingstand"); public static final Identifier UPDATE_RECORD = new Identifier("visualoverhaul", "record"); + public static final Identifier UPDATE_FURNACE_ITEMS = new Identifier("visualoverhaul", "furnace"); } diff --git a/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaulClient.java b/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaulClient.java index d5eeb8b..d6708f1 100644 --- a/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaulClient.java +++ b/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaulClient.java @@ -2,6 +2,7 @@ package eu.midnightdust.visualoverhaul; import eu.midnightdust.visualoverhaul.block.JukeboxTop; import eu.midnightdust.visualoverhaul.block.renderer.BrewingStandBlockEntityRenderer; +import eu.midnightdust.visualoverhaul.block.renderer.FurnaceBlockEntityRenderer; import eu.midnightdust.visualoverhaul.block.renderer.JukeboxBlockEntityRenderer; import eu.midnightdust.visualoverhaul.config.VOConfig; import me.sargunvohra.mcmods.autoconfig1u.AutoConfig; @@ -17,6 +18,7 @@ import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.block.entity.BrewingStandBlockEntity; +import net.minecraft.block.entity.FurnaceBlockEntity; import net.minecraft.block.entity.JukeboxBlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.RenderLayer; @@ -27,8 +29,7 @@ import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.Registry; -import static eu.midnightdust.visualoverhaul.VisualOverhaul.UPDATE_POTION_BOTTLES; -import static eu.midnightdust.visualoverhaul.VisualOverhaul.UPDATE_RECORD; +import static eu.midnightdust.visualoverhaul.VisualOverhaul.*; public class VisualOverhaulClient implements ClientModInitializer { public static VOConfig VO_CONFIG; @@ -45,9 +46,11 @@ public class VisualOverhaulClient implements ClientModInitializer { BlockRenderLayerMapImpl.INSTANCE.putBlock(Blocks.JUKEBOX, RenderLayer.getCutout()); BlockRenderLayerMapImpl.INSTANCE.putBlock(JukeBoxTop, RenderLayer.getCutout()); + BlockRenderLayerMapImpl.INSTANCE.putBlock(Blocks.FURNACE, RenderLayer.getCutout()); BlockEntityRendererRegistry.INSTANCE.register(BlockEntityType.BREWING_STAND, BrewingStandBlockEntityRenderer::new); BlockEntityRendererRegistry.INSTANCE.register(BlockEntityType.JUKEBOX, JukeboxBlockEntityRenderer::new); + BlockEntityRendererRegistry.INSTANCE.register(BlockEntityType.FURNACE, FurnaceBlockEntityRenderer::new); Registry.ITEM.forEach((item) -> { if(item instanceof MusicDiscItem) { @@ -80,9 +83,24 @@ public class VisualOverhaulClient implements ClientModInitializer { blockEntity.setRecord(record); }); }); + ClientSidePacketRegistryImpl.INSTANCE.register(UPDATE_FURNACE_ITEMS, + (packetContext, attachedData) -> { + BlockPos pos = attachedData.readBlockPos(); + DefaultedList inv = DefaultedList.ofSize(3, ItemStack.EMPTY); + for (int i = 0; i < 2; i++) { + inv.set(i, attachedData.readItemStack()); + } + packetContext.getTaskQueue().execute(() -> { + FurnaceBlockEntity blockEntity = (FurnaceBlockEntity)MinecraftClient.getInstance().world.getBlockEntity(pos); + blockEntity.setStack(0,inv.get(0)); + blockEntity.setStack(1,inv.get(1)); + blockEntity.setStack(2,inv.get(2)); + }); + }); FabricLoader.getInstance().getModContainer("visualoverhaul").ifPresent(modContainer -> { - ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul:nobottles"), "resourcepacks/visualoverhaul", modContainer, true); + ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul:nobottles"), "resourcepacks/nobrewingbottles", modContainer, true); + ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul:fancyfurnace"), "resourcepacks/fancyfurnace", modContainer, true); }); } } diff --git a/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/BrewingStandBlockEntityRenderer.java b/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/BrewingStandBlockEntityRenderer.java index a441894..26fe784 100644 --- a/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/BrewingStandBlockEntityRenderer.java +++ b/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/BrewingStandBlockEntityRenderer.java @@ -1,6 +1,5 @@ package eu.midnightdust.visualoverhaul.block.renderer; -import eu.midnightdust.visualoverhaul.VisualOverhaul; import eu.midnightdust.visualoverhaul.VisualOverhaulClient; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; diff --git a/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/FurnaceBlockEntityRenderer.java b/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/FurnaceBlockEntityRenderer.java new file mode 100644 index 0000000..1053934 --- /dev/null +++ b/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/FurnaceBlockEntityRenderer.java @@ -0,0 +1,116 @@ +package eu.midnightdust.visualoverhaul.block.renderer; + +import eu.midnightdust.visualoverhaul.VisualOverhaulClient; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.block.*; +import net.minecraft.block.entity.FurnaceBlockEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.client.render.model.json.ModelTransformation; +import net.minecraft.client.texture.Sprite; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.item.ItemStack; +import net.minecraft.tag.ItemTags; +import net.minecraft.util.Identifier; + +@Environment(EnvType.CLIENT) +public class FurnaceBlockEntityRenderer extends BlockEntityRenderer { + private static final ModelPart bb_main; + private static final ModelPart cube_r1; + private static final ModelPart cube_r2; + private static final ModelPart cube_r3; + + static { + bb_main = new ModelPart(16, 16, 0, 0); + bb_main.setPivot(0.0F, 24.0F, 0.0F); + + cube_r1 = new ModelPart(16, 16, 0, 0); + cube_r1.setPivot(6.0F, 1.0F, -2.0F); + bb_main.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, -0.5672F, 0.0F); + cube_r1.setTextureOffset(0, 0).addCuboid(-10.0F, -3.0F, 0.0F, 10.0F, 1.0F, 1.0F, 0.0F, false); + + cube_r2 = new ModelPart(16, 16, 0, 0); + cube_r2.setPivot(5.0F, 0.0F, -5.0F); + bb_main.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, -0.1309F, 0.0F); + cube_r2.setTextureOffset(0, 0).addCuboid(-10.0F, -2.5F, 0.0F, 10.0F, 2.0F, 2.0F, 0.0F, false); + + cube_r3 = new ModelPart(16, 16, 0, 0); + cube_r3.setPivot(5.0F, -1.0F, -7.0F); + bb_main.addChild(cube_r3); + setRotationAngle(cube_r3, 0.0F, 0.2618F, 0.0F); + cube_r3.setTextureOffset(0, 0).addCuboid(-10.0F, -2.0F, 0.0F, 10.0F, 2.0F, 2.0F, 0.0F, false); + } + public static void setRotationAngle(ModelPart bone, float x, float y, float z) { + bone.pitch = x; + bone.yaw = y; + bone.roll = z; + } + + public FurnaceBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) { + super(blockEntityRenderDispatcher); + } + + @Override + public void render(FurnaceBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { + if (VisualOverhaulClient.VO_CONFIG.furnace) { + BlockState blockState = blockEntity.getCachedState(); + int lightAtBlock = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), blockEntity.getPos().offset(blockState.get(AbstractFurnaceBlock.FACING))); + ItemStack item1 = blockEntity.getStack(0); + ItemStack item2 = blockEntity.getStack(1); + float angle = (blockState.get(AbstractFurnaceBlock.FACING)).asRotation(); + + matrices.push(); + + matrices.translate(0.5f, 0.58f, 0.5f); + matrices.scale(1f, 1f, 1f); + matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180)); + matrices.translate(0.0f, 0.0f, -0.4f); + matrices.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90)); + MinecraftClient.getInstance().getItemRenderer().renderItem(item1, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers); + + + matrices.pop(); + if (!item2.getItem().isIn(ItemTags.LOGS_THAT_BURN) && !item2.getItem().isIn(ItemTags.PLANKS)) { + matrices.push(); + + matrices.translate(0.5f, 0.08f, 0.5f); + matrices.scale(1f, 1f, 1f); + matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180)); + matrices.translate(0.0f, 0.0f, -0.4f); + matrices.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90)); + MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers); + + matrices.pop(); + } + if (item2.getItem().isIn(ItemTags.LOGS_THAT_BURN) || item2.getItem().isIn(ItemTags.PLANKS)) { + matrices.push(); + BlockState state = Block.getBlockFromItem(item2.getItem()).getDefaultState(); + Sprite texture = MinecraftClient.getInstance().getBlockRenderManager().getModel(state).getSprite(); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutoutNoCull(spriteToTexture(texture))); + + matrices.translate(0.5f, -1.3f, 0.5f); + matrices.scale(1f, 1f, 1f); + + + matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180)); + bb_main.render(matrices, vertexConsumer, lightAtBlock, overlay); + matrices.pop(); + } + } + + } + public static Identifier spriteToTexture(Sprite sprite) { + String texture = sprite.getId().getPath(); + return new Identifier(sprite.getId().getNamespace(), "textures/" + texture + ".png"); + } +} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/visualoverhaul/config/VOConfig.java b/src/main/java/eu/midnightdust/visualoverhaul/config/VOConfig.java index d3fbc4e..0650b57 100644 --- a/src/main/java/eu/midnightdust/visualoverhaul/config/VOConfig.java +++ b/src/main/java/eu/midnightdust/visualoverhaul/config/VOConfig.java @@ -2,10 +2,6 @@ package eu.midnightdust.visualoverhaul.config; import me.sargunvohra.mcmods.autoconfig1u.ConfigData; import me.sargunvohra.mcmods.autoconfig1u.annotation.Config; -import me.sargunvohra.mcmods.autoconfig1u.shadowed.blue.endless.jankson.Comment; - -import java.util.ArrayList; -import java.util.List; @Config(name = "visualoverhaul") public class VOConfig implements ConfigData { @@ -13,4 +9,5 @@ public class VOConfig implements ConfigData { public boolean brewingstand = true; public boolean jukebox = true; public boolean jukebox_fake_block = true; + public boolean furnace = true; } diff --git a/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinAbstractFurnaceBlockEntity.java b/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinAbstractFurnaceBlockEntity.java new file mode 100644 index 0000000..5f0ebcb --- /dev/null +++ b/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinAbstractFurnaceBlockEntity.java @@ -0,0 +1,53 @@ +package eu.midnightdust.visualoverhaul.mixin; + +import eu.midnightdust.visualoverhaul.VisualOverhaul; +import io.netty.buffer.Unpooled; +import net.fabricmc.fabric.api.server.PlayerStream; +import net.fabricmc.fabric.impl.networking.ServerSidePacketRegistryImpl; +import net.minecraft.block.entity.*; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.collection.DefaultedList; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.stream.Stream; + +@Mixin(AbstractFurnaceBlockEntity.class) +public abstract class MixinAbstractFurnaceBlockEntity extends LockableContainerBlockEntity { + + @Shadow protected DefaultedList inventory; + Boolean invUpdate = true; + int playerUpdate = -1; + + private MixinAbstractFurnaceBlockEntity(BlockEntityType blockEntityType) { + super(blockEntityType); + } + + @Inject(at = @At("TAIL"), method = "tick") + public void tick(CallbackInfo ci) { + if (!this.world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) { + Stream watchingPlayers = PlayerStream.watching(world, getPos()); + PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); + passedData.writeBlockPos(pos); + passedData.writeItemStack(inventory.get(0)); + passedData.writeItemStack(inventory.get(1)); + passedData.writeItemStack(inventory.get(2)); + + passedData.writeString(String.valueOf(inventory)); + watchingPlayers.forEach(player -> ServerSidePacketRegistryImpl.INSTANCE.sendToPlayer(player, VisualOverhaul.UPDATE_FURNACE_ITEMS, passedData)); + invUpdate = false; + } + playerUpdate = world.getPlayers().size(); + } + + @Inject(at = @At("RETURN"), method = "getStack", cancellable = true) + public void getStack(int slot, CallbackInfoReturnable cir) { + this.invUpdate = true; + } +} diff --git a/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinBrewingStandBlockEntity.java b/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinBrewingStandBlockEntity.java index 47da926..37ba938 100644 --- a/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinBrewingStandBlockEntity.java +++ b/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinBrewingStandBlockEntity.java @@ -23,25 +23,17 @@ import java.util.stream.Stream; @Mixin(BrewingStandBlockEntity.class) public abstract class MixinBrewingStandBlockEntity extends LockableContainerBlockEntity { - @Shadow private DefaultedList inventory; - public ItemStack item1; - public ItemStack item2; - public ItemStack item3; - Boolean sendData = true; + Boolean invUpdate = true; + int playerUpdate = -1; private MixinBrewingStandBlockEntity(BlockEntityType blockEntityType) { super(blockEntityType); - } @Inject(at = @At("TAIL"), method = "tick") public void tick(CallbackInfo ci) { - item1 = inventory.get(0); - item2 = inventory.get(1); - item3 = inventory.get(2); - - if (!this.world.isClient) { + if (!this.world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) { Stream watchingPlayers = PlayerStream.watching(world, getPos()); PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); passedData.writeBlockPos(pos); @@ -53,12 +45,13 @@ public abstract class MixinBrewingStandBlockEntity extends LockableContainerBloc passedData.writeString(String.valueOf(inventory)); watchingPlayers.forEach(player -> ServerSidePacketRegistryImpl.INSTANCE.sendToPlayer(player, VisualOverhaul.UPDATE_POTION_BOTTLES, passedData)); - sendData = false; + invUpdate = false; } + playerUpdate = world.getPlayers().size(); } @Inject(at = @At("RETURN"), method = "getStack", cancellable = true) public void getStack(int slot, CallbackInfoReturnable cir) { - this.sendData = true; + this.invUpdate = true; } } diff --git a/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinJukeboxBlockEntity.java b/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinJukeboxBlockEntity.java index 0ce7e4b..122bee3 100644 --- a/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinJukeboxBlockEntity.java +++ b/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinJukeboxBlockEntity.java @@ -21,30 +21,30 @@ import java.util.stream.Stream; @Mixin(JukeboxBlockEntity.class) public abstract class MixinJukeboxBlockEntity extends BlockEntity implements Tickable { - @Shadow private ItemStack record; - Boolean sendData = true; + Boolean invUpdate = true; + int playerUpdate = -1; private MixinJukeboxBlockEntity(BlockEntityType blockEntityType) { super(blockEntityType); - } @Unique public void tick() { - if (!this.world.isClient) { + if (!this.world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) { Stream watchingPlayers = PlayerStream.watching(world, getPos()); PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); passedData.writeBlockPos(pos); passedData.writeItemStack(record); watchingPlayers.forEach(player -> ServerSidePacketRegistryImpl.INSTANCE.sendToPlayer(player, VisualOverhaul.UPDATE_RECORD, passedData)); - sendData = false; + invUpdate = false; } + playerUpdate = world.getPlayers().size(); } @Inject(at = @At("RETURN"), method = "getRecord", cancellable = true) public void getRecord(CallbackInfoReturnable cir) { - this.sendData = true; + this.invUpdate = true; } } diff --git a/src/main/resources/assets/visualoverhaul/icon.png b/src/main/resources/assets/visualoverhaul/icon.png index 6ef8e43fd8a7dee81497cca343858d45bc78ecfc..2f7f9045f60498c84319307d3694db927f9d1dcb 100644 GIT binary patch literal 12543 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 B4=0.28.4", + "autoconfig1u": "*", + "cloth-config2": "*" } } diff --git a/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/blockstates/furnace.json b/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/blockstates/furnace.json new file mode 100644 index 0000000..9c31d91 --- /dev/null +++ b/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/blockstates/furnace.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,lit=false": { + "model": "minecraft:block/furnace", + "y": 90 + }, + "facing=east,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 90 + }, + "facing=north,lit=false": { + "model": "minecraft:block/furnace" + }, + "facing=north,lit=true": { + "model": "minecraft:block/furnace_on" + }, + "facing=south,lit=false": { + "model": "minecraft:block/furnace", + "y": 180 + }, + "facing=south,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 180 + }, + "facing=west,lit=false": { + "model": "minecraft:block/furnace", + "y": 270 + }, + "facing=west,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/materialmaps/block/furnace.json b/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/materialmaps/block/furnace.json new file mode 100644 index 0000000..c0086e4 --- /dev/null +++ b/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/materialmaps/block/furnace.json @@ -0,0 +1,14 @@ +{ + "defaultMap": { + "spriteMap": [ + { + "sprite": "minecraft:block/furnace_front_on", + "material": "canvas:warm_glow" + }, + { + "sprite": "minecraft:block/campfire_fire", + "material": "canvas:warm_glow" + } + ] + } +} diff --git a/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace.json b/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace.json new file mode 100644 index 0000000..a210321 --- /dev/null +++ b/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace.json @@ -0,0 +1,148 @@ +{ + "credit": "made by Motschen", + "parent": "block/block", + "textures": { + "0": "block/furnace_front", + "1": "block/furnace_side", + "2": "block/furnace_top", + "3": "block/smooth_stone", + "4": "block/furnace_front", + "5": "block/campfire_fire", + "particle": "block/furnace_front" + }, + "elements": [ + { + "from": [0, 0, 6], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#4"}, + "east": {"uv": [0, 0, 10, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [6, 0, 16, 16], "texture": "#1"}, + "up": {"uv": [0, 6, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 10], "texture": "#3"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -2]}, + "faces": { + "north": {"uv": [0, 0, 3, 16], "texture": "#0"}, + "east": {"uv": [10, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 6, 16], "texture": "#1"}, + "up": {"uv": [13, 0, 16, 6], "texture": "#2"}, + "down": {"uv": [13, 10, 16, 16], "texture": "#3"} + } + }, + { + "from": [12, 11, 0], + "to": [13, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 8, -2]}, + "faces": { + "north": {"uv": [3, 0, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 9, 7, 14], "texture": "#1"}, + "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, + "down": {"uv": [12, 10, 13, 16], "texture": "#3"} + } + }, + { + "from": [3, 11, 0], + "to": [4, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [-4, 8, -2]}, + "faces": { + "north": {"uv": [3, 0, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 9, 7, 14], "texture": "#1"}, + "west": {"uv": [1, 8, 7, 13], "texture": "#1"}, + "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, + "down": {"uv": [3, 10, 4, 16], "texture": "#3"} + } + }, + { + "from": [4, 12, 0], + "to": [12, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, -2]}, + "faces": { + "north": {"uv": [4, 0, 12, 4], "texture": "#0"}, + "up": {"uv": [4, 0, 12, 6], "texture": "#2"}, + "down": {"uv": [4, 10, 12, 16], "texture": "#3"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [-5, 8, -2]}, + "faces": { + "north": {"uv": [13, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [10, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 6, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 3, 6], "texture": "#2"}, + "down": {"uv": [0, 10, 3, 16], "texture": "#3"} + } + }, + { + "from": [12, 3, 0], + "to": [13, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 8, -2]}, + "faces": { + "north": {"uv": [3, 7, 4, 13], "texture": "#0"}, + "west": {"uv": [1, 8, 7, 14], "texture": "#1"}, + "up": {"uv": [3, 0, 4, 6], "texture": "#2"}, + "down": {"uv": [3, 10, 4, 16], "texture": "#3"} + } + }, + { + "from": [3, 3, 0], + "to": [4, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [-4, 8, -2]}, + "faces": { + "north": {"uv": [12, 7, 13, 13], "texture": "#0"}, + "east": {"uv": [9, 8, 15, 14], "texture": "#1"}, + "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, + "down": {"uv": [12, 10, 13, 16], "texture": "#3"} + } + }, + { + "from": [11, 4, 0], + "to": [12, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 8, -2]}, + "faces": { + "north": {"uv": [4, 7, 5, 12], "texture": "#0"}, + "west": {"uv": [1, 9, 7, 14], "texture": "#1"}, + "up": {"uv": [4, 0, 5, 6], "texture": "#2"}, + "down": {"uv": [4, 10, 5, 16], "texture": "#3"} + } + }, + { + "from": [4, 4, 0], + "to": [5, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [-3, 8, -2]}, + "faces": { + "north": {"uv": [11, 7, 12, 12], "texture": "#0"}, + "east": {"uv": [10, 9, 16, 14], "texture": "#1"}, + "up": {"uv": [11, 0, 12, 6], "texture": "#2"}, + "down": {"uv": [11, 10, 12, 16], "texture": "#3"} + } + }, + { + "from": [5, 5, 0], + "to": [11, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, -2]}, + "faces": { + "north": {"uv": [5, 7, 11, 11], "texture": "#0"}, + "up": {"uv": [5, 0, 11, 6], "texture": "#2"}, + "down": {"uv": [5, 10, 11, 16], "texture": "#3"} + } + }, + { + "from": [3, 0, 0], + "to": [13, 1, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, -2]}, + "faces": { + "north": {"uv": [3, 15, 13, 16], "texture": "#0"}, + "up": {"uv": [3, 0, 13, 6], "texture": "#2"}, + "down": {"uv": [3, 10, 13, 16], "texture": "#3"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace_on.json b/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace_on.json new file mode 100644 index 0000000..b93bebe --- /dev/null +++ b/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace_on.json @@ -0,0 +1,156 @@ +{ + "credit": "made by Motschen", + "parent": "block/block", + "textures": { + "0": "block/furnace_front", + "1": "block/furnace_side", + "2": "block/furnace_top", + "3": "block/smooth_stone", + "4": "block/furnace_front_on", + "5": "block/campfire_fire", + "particle": "block/furnace_front" + }, + "elements": [ + { + "from": [0, 0, 6], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#4"}, + "east": {"uv": [0, 0, 10, 16], "texture": "#1"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [6, 0, 16, 16], "texture": "#1"}, + "up": {"uv": [0, 6, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 10], "texture": "#3"} + } + }, + { + "from": [13, 0, 0], + "to": [16, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -2]}, + "faces": { + "north": {"uv": [0, 0, 3, 16], "texture": "#0"}, + "east": {"uv": [10, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 6, 16], "texture": "#1"}, + "up": {"uv": [13, 0, 16, 6], "texture": "#2"}, + "down": {"uv": [13, 10, 16, 16], "texture": "#3"} + } + }, + { + "from": [12, 11, 0], + "to": [13, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 8, -2]}, + "faces": { + "north": {"uv": [3, 0, 4, 5], "texture": "#0"}, + "west": {"uv": [1, 9, 7, 14], "texture": "#1"}, + "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, + "down": {"uv": [12, 10, 13, 16], "texture": "#3"} + } + }, + { + "from": [3, 11, 0], + "to": [4, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [-4, 8, -2]}, + "faces": { + "north": {"uv": [3, 0, 4, 5], "texture": "#0"}, + "east": {"uv": [1, 9, 7, 14], "texture": "#1"}, + "west": {"uv": [1, 8, 7, 13], "texture": "#1"}, + "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, + "down": {"uv": [3, 10, 4, 16], "texture": "#3"} + } + }, + { + "from": [4, 12, 0], + "to": [12, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, -2]}, + "faces": { + "north": {"uv": [4, 0, 12, 4], "texture": "#0"}, + "up": {"uv": [4, 0, 12, 6], "texture": "#2"}, + "down": {"uv": [4, 10, 12, 16], "texture": "#3"} + } + }, + { + "from": [0, 0, 0], + "to": [3, 16, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [-5, 8, -2]}, + "faces": { + "north": {"uv": [13, 0, 16, 16], "texture": "#0"}, + "east": {"uv": [10, 0, 16, 16], "texture": "#1"}, + "west": {"uv": [0, 0, 6, 16], "texture": "#1"}, + "up": {"uv": [0, 0, 3, 6], "texture": "#2"}, + "down": {"uv": [0, 10, 3, 16], "texture": "#3"} + } + }, + { + "from": [12, 3, 0], + "to": [13, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 8, -2]}, + "faces": { + "north": {"uv": [3, 7, 4, 13], "texture": "#0"}, + "west": {"uv": [1, 8, 7, 14], "texture": "#1"}, + "up": {"uv": [3, 0, 4, 6], "texture": "#2"}, + "down": {"uv": [3, 10, 4, 16], "texture": "#3"} + } + }, + { + "from": [3, 3, 0], + "to": [4, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [-4, 8, -2]}, + "faces": { + "north": {"uv": [12, 7, 13, 13], "texture": "#0"}, + "east": {"uv": [9, 8, 15, 14], "texture": "#1"}, + "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, + "down": {"uv": [12, 10, 13, 16], "texture": "#3"} + } + }, + { + "from": [11, 4, 0], + "to": [12, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 8, -2]}, + "faces": { + "north": {"uv": [4, 7, 5, 12], "texture": "#0"}, + "west": {"uv": [1, 9, 7, 14], "texture": "#1"}, + "up": {"uv": [4, 0, 5, 6], "texture": "#2"}, + "down": {"uv": [4, 10, 5, 16], "texture": "#3"} + } + }, + { + "from": [4, 4, 0], + "to": [5, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [-3, 8, -2]}, + "faces": { + "north": {"uv": [11, 7, 12, 12], "texture": "#0"}, + "east": {"uv": [10, 9, 16, 14], "texture": "#1"}, + "up": {"uv": [11, 0, 12, 6], "texture": "#2"}, + "down": {"uv": [11, 10, 12, 16], "texture": "#3"} + } + }, + { + "from": [5, 5, 0], + "to": [11, 9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, -2]}, + "faces": { + "north": {"uv": [5, 7, 11, 11], "texture": "#0"}, + "up": {"uv": [5, 0, 11, 6], "texture": "#2"}, + "down": {"uv": [5, 10, 11, 16], "texture": "#3"} + } + }, + { + "from": [3, 0, 0], + "to": [13, 1, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, -2]}, + "faces": { + "north": {"uv": [3, 15, 13, 16], "texture": "#0"}, + "up": {"uv": [3, 0, 13, 6], "texture": "#2"}, + "down": {"uv": [3, 10, 13, 16], "texture": "#3"} + } + }, + { + "from": [4, 1, 2], + "to": [12, 3, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 9, 10]}, + "faces": { + "north": {"uv": [4, 0, 12, 2], "texture": "#5"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/resourcepacks/fancyfurnace/pack.mcmeta b/src/main/resources/resourcepacks/fancyfurnace/pack.mcmeta new file mode 100644 index 0000000..eb59a5e --- /dev/null +++ b/src/main/resources/resourcepacks/fancyfurnace/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "pack_format": 6, + "description": "ยง2Changes the model of the furnace to be 3D" + } +} diff --git a/src/main/resources/resourcepacks/fancyfurnace/pack.png b/src/main/resources/resourcepacks/fancyfurnace/pack.png new file mode 100644 index 0000000000000000000000000000000000000000..1343fb3ef3b9016c7c254492a9551caad2a9f60e GIT binary patch literal 3038 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