├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── common ├── build.gradle └── src │ └── main │ ├── java │ └── eu │ │ └── midnightdust │ │ └── visualoverhaul │ │ ├── FakeBlocks.java │ │ ├── IconicButtons.java │ │ ├── VisualOverhaulClient.java │ │ ├── VisualOverhaulCommon.java │ │ ├── block │ │ ├── model │ │ │ └── FurnaceWoodenPlanksModel.java │ │ └── renderer │ │ │ ├── BrewingStandBlockEntityRenderer.java │ │ │ ├── FurnaceBlockEntityRenderer.java │ │ │ ├── JukeboxBlockEntityRenderer.java │ │ │ └── RoundDiscRenderer.java │ │ ├── config │ │ └── VOConfig.java │ │ ├── mixin │ │ ├── ItemRenderStateAccessor.java │ │ ├── MixinBlastFurnaceBlock.java │ │ ├── MixinConstantTintSource.java │ │ ├── MixinGrassTintSource.java │ │ ├── MixinJukeboxBlockEntity.java │ │ ├── MixinPotionTintSource.java │ │ ├── MixinPressableWidget.java │ │ ├── MixinSliderWidget.java │ │ ├── MixinSmokerBlock.java │ │ ├── MixinSoundSystem.java │ │ └── TextureManagerAccessor.java │ │ ├── packet │ │ ├── HelloPacket.java │ │ └── UpdateItemsPacket.java │ │ └── util │ │ ├── JukeboxPacketUpdate.java │ │ ├── ModIconUtil.java │ │ ├── SoundTest.java │ │ └── VOColorUtil.java │ └── resources │ ├── architectury.common.json │ ├── assets │ ├── iconic │ │ └── textures │ │ │ └── gui │ │ │ └── icons │ │ │ ├── addserver.add.properties │ │ │ ├── credits_and_attribution.button.attribution.properties │ │ │ ├── credits_and_attribution.button.credits.properties │ │ │ ├── credits_and_attribution.button.licenses.properties │ │ │ ├── fml.menu.mods.properties │ │ │ ├── gui.advancements.properties │ │ │ ├── gui.back.properties │ │ │ ├── gui.cancel.properties │ │ │ ├── gui.done.properties │ │ │ ├── gui.no.properties │ │ │ ├── gui.proceed.properties │ │ │ ├── gui.stats.properties │ │ │ ├── gui.yes.properties │ │ │ ├── menu.disconnect.properties │ │ │ ├── menu.multiplayer.properties │ │ │ ├── menu.online.properties │ │ │ ├── menu.options.properties │ │ │ ├── menu.playerreporting.properties │ │ │ ├── menu.quit.properties │ │ │ ├── menu.reportbugs.properties │ │ │ ├── menu.returntogame.properties │ │ │ ├── menu.returntomenu.properties │ │ │ ├── menu.sendfeedback.properties │ │ │ ├── menu.sharetolan.properties │ │ │ ├── menu.singleplayer.properties │ │ │ ├── midnightlib.midnightconfig.enum.configbutton.false.properties │ │ │ ├── midnightlib.midnightconfig.enum.configbutton.modmenu.png │ │ │ ├── midnightlib.midnightconfig.enum.configbutton.true.properties │ │ │ ├── modmenu.title.properties │ │ │ ├── options.accessibility.properties │ │ │ ├── options.chat.properties │ │ │ ├── options.controls.properties │ │ │ ├── options.credits_and_attribution.properties │ │ │ ├── options.fov.properties │ │ │ ├── options.language.properties │ │ │ ├── options.online.properties │ │ │ ├── options.resourcepack.properties │ │ │ ├── options.skincustomisation.properties │ │ │ ├── options.sounds.properties │ │ │ ├── options.telemetry.properties │ │ │ ├── options.video.properties │ │ │ ├── pack.openfolder.properties │ │ │ ├── physicsmod.menu.main.title.properties │ │ │ ├── selectserver.add.properties │ │ │ ├── selectserver.delete.properties │ │ │ ├── selectserver.direct.properties │ │ │ ├── selectserver.edit.properties │ │ │ ├── selectserver.refresh.properties │ │ │ ├── selectserver.select.properties │ │ │ ├── selectworld.create.properties │ │ │ ├── selectworld.delete.properties │ │ │ ├── selectworld.edit.properties │ │ │ ├── selectworld.edit.save.properties │ │ │ ├── selectworld.recreate.properties │ │ │ ├── selectworld.select.properties │ │ │ ├── text.cloth-config.boolean.value.false.properties │ │ │ └── text.cloth-config.boolean.value.true.properties │ └── visualoverhaul │ │ ├── icon.png │ │ ├── lang │ │ ├── de_de.json │ │ ├── en_us.json │ │ ├── es_mx.json │ │ ├── fr_fr.json │ │ └── zh_tw.json │ │ ├── models │ │ └── fakeblock │ │ │ ├── jukebox_top_playing.json │ │ │ ├── jukebox_top_stopped.json │ │ │ └── phonos │ │ │ ├── jukebox_top_playing_0.json │ │ │ ├── jukebox_top_playing_1.json │ │ │ ├── jukebox_top_playing_10.json │ │ │ ├── jukebox_top_playing_11.json │ │ │ ├── jukebox_top_playing_12.json │ │ │ ├── jukebox_top_playing_13.json │ │ │ ├── jukebox_top_playing_14.json │ │ │ ├── jukebox_top_playing_15.json │ │ │ ├── jukebox_top_playing_16.json │ │ │ ├── jukebox_top_playing_17.json │ │ │ ├── jukebox_top_playing_18.json │ │ │ ├── jukebox_top_playing_19.json │ │ │ ├── jukebox_top_playing_2.json │ │ │ ├── jukebox_top_playing_3.json │ │ │ ├── jukebox_top_playing_4.json │ │ │ ├── jukebox_top_playing_5.json │ │ │ ├── jukebox_top_playing_6.json │ │ │ ├── jukebox_top_playing_7.json │ │ │ ├── jukebox_top_playing_8.json │ │ │ ├── jukebox_top_playing_9.json │ │ │ ├── jukebox_top_stopped_0.json │ │ │ ├── jukebox_top_stopped_1.json │ │ │ ├── jukebox_top_stopped_10.json │ │ │ ├── jukebox_top_stopped_11.json │ │ │ ├── jukebox_top_stopped_12.json │ │ │ ├── jukebox_top_stopped_13.json │ │ │ ├── jukebox_top_stopped_14.json │ │ │ ├── jukebox_top_stopped_15.json │ │ │ ├── jukebox_top_stopped_16.json │ │ │ ├── jukebox_top_stopped_17.json │ │ │ ├── jukebox_top_stopped_18.json │ │ │ ├── jukebox_top_stopped_19.json │ │ │ ├── jukebox_top_stopped_2.json │ │ │ ├── jukebox_top_stopped_3.json │ │ │ ├── jukebox_top_stopped_4.json │ │ │ ├── jukebox_top_stopped_5.json │ │ │ ├── jukebox_top_stopped_6.json │ │ │ ├── jukebox_top_stopped_7.json │ │ │ ├── jukebox_top_stopped_8.json │ │ │ └── jukebox_top_stopped_9.json │ │ └── textures │ │ ├── block │ │ └── vo_jukebox_top.png │ │ └── item │ │ └── music_disc_missing.png │ ├── resourcepacks │ ├── coloredwaterbucket │ │ ├── assets │ │ │ └── minecraft │ │ │ │ ├── items │ │ │ │ ├── axolotl_bucket.json │ │ │ │ ├── cod_bucket.json │ │ │ │ ├── pufferfish_bucket.json │ │ │ │ ├── salmon_bucket.json │ │ │ │ ├── tropical_fish_bucket.json │ │ │ │ └── water_bucket.json │ │ │ │ ├── models │ │ │ │ └── item │ │ │ │ │ ├── axolotl_bucket.json │ │ │ │ │ ├── cod_bucket.json │ │ │ │ │ ├── pufferfish_bucket.json │ │ │ │ │ ├── salmon_bucket.json │ │ │ │ │ ├── tropical_fish_bucket.json │ │ │ │ │ └── water_bucket.json │ │ │ │ └── textures │ │ │ │ └── item │ │ │ │ ├── axolotl_bucket_overlay.png │ │ │ │ ├── fish_bucket_overlay.png │ │ │ │ ├── pufferfish_bucket_overlay.png │ │ │ │ ├── salmon_bucket_overlay.png │ │ │ │ ├── tropical_fish_bucket_overlay.png │ │ │ │ └── water_bucket_overlay.png │ │ ├── pack.mcmeta │ │ └── pack.png │ ├── fancyfurnace │ │ ├── assets │ │ │ └── minecraft │ │ │ │ ├── blockstates │ │ │ │ ├── blast_furnace.json │ │ │ │ ├── furnace.json │ │ │ │ └── smoker.json │ │ │ │ ├── materialmaps │ │ │ │ └── block │ │ │ │ │ └── furnace.json │ │ │ │ └── models │ │ │ │ └── block │ │ │ │ ├── blast_furnace.json │ │ │ │ ├── blast_furnace_on.json │ │ │ │ ├── furnace.json │ │ │ │ ├── furnace_on.json │ │ │ │ ├── smoker.json │ │ │ │ └── smoker_on.json │ │ ├── pack.mcmeta │ │ └── pack.png │ └── nobrewingbottles │ │ ├── assets │ │ └── minecraft │ │ │ ├── models │ │ │ └── block │ │ │ │ ├── brewing_stand_bottle0.json │ │ │ │ ├── brewing_stand_bottle1.json │ │ │ │ └── brewing_stand_bottle2.json │ │ │ └── textures │ │ │ └── block │ │ │ └── brewing_stand.png │ │ ├── pack.mcmeta │ │ └── pack.png │ └── visualoverhaul.mixins.json ├── fabric-like ├── build.gradle ├── localMaven │ └── phonos-0.3.0+1.19.2.jar └── src │ └── main │ └── java │ └── eu │ └── midnightdust │ └── visualoverhaul │ └── compat │ └── phonos │ ├── block │ ├── RadioJukeboxTop.java │ └── renderer │ │ └── RadioJukeboxBlockEntityRenderer.java │ └── init │ └── PhonosCompatInit.java ├── fabric ├── build.gradle └── src │ └── main │ ├── java │ └── eu │ │ └── midnightdust │ │ └── visualoverhaul │ │ ├── fabric │ │ ├── VisualOverhaulClientFabric.java │ │ ├── VisualOverhaulFabric.java │ │ └── mixin │ │ │ ├── MixinAbstractFurnaceBlockEntity.java │ │ │ ├── MixinBrewingStandBlockEntity.java │ │ │ └── MixinJukeboxBlock.java │ │ └── util │ │ └── fabric │ │ └── ModIconUtilImpl.java │ └── resources │ ├── fabric.mod.json │ └── visualoverhaul-fabric.mixins.json ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── neoforge ├── build.gradle ├── gradle.properties └── src │ └── main │ ├── java │ └── eu │ │ └── midnightdust │ │ └── visualoverhaul │ │ ├── neoforge │ │ ├── VisualOverhaulClientEvents.java │ │ ├── VisualOverhaulClientForge.java │ │ ├── VisualOverhaulClientGameEvents.java │ │ ├── VisualOverhaulEvents.java │ │ ├── VisualOverhaulForge.java │ │ ├── VisualOverhaulGameEvents.java │ │ ├── handler │ │ │ └── UpdateItemsPacketHandler.java │ │ └── mixin │ │ │ ├── MixinAbstractFurnaceBlockEntity.java │ │ │ ├── MixinBlockColors.java │ │ │ ├── MixinBrewingStandBlockEntity.java │ │ │ ├── MixinJukeboxBlock.java │ │ │ └── MixinResourcePackManager.java │ │ └── util │ │ └── neoforge │ │ └── ModIconUtilImpl.java │ └── resources │ ├── META-INF │ └── neoforge.mods.toml │ ├── icon.png │ └── visualoverhaul-neoforge.mixins.json ├── quilt ├── build.gradle ├── gradle.properties └── src │ └── main │ ├── java │ └── eu │ │ └── midnightdust │ │ └── visualoverhaul │ │ ├── quilt │ │ ├── VisualOverhaulClientQuilt.java │ │ └── mixin │ │ │ ├── MixinAbstractFurnaceBlockEntity.java │ │ │ ├── MixinBrewingStandBlockEntity.java │ │ │ └── MixinJukeboxBlock.java │ │ └── util │ │ └── fabric │ │ └── ModIconUtilImpl.java │ └── resources │ ├── quilt.mod.json │ └── visualoverhaul-quilt.mixins.json └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | *.ipr 3 | run/ 4 | *.iws 5 | out/ 6 | *.iml 7 | .gradle/ 8 | output/ 9 | bin/ 10 | libs/ 11 | .architectury-transformer/ 12 | 13 | .classpath 14 | .project 15 | .idea/ 16 | classes/ 17 | .metadata 18 | .vscode 19 | .settings 20 | *.launch -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 MidnightDust 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VisualOverhaul 2 | https://www.curseforge.com/minecraft/mc-mods/visual-overhaul 3 | 4 | Revamps the visual aspect of certain vanilla blocks. 5 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "architectury-plugin" version "3.4-SNAPSHOT" 3 | id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false 4 | id "me.shedaniel.unified-publishing" version "0.1.+" apply false 5 | id 'com.github.johnrengelman.shadow' version '8.1.1' apply false 6 | } 7 | 8 | architectury { 9 | minecraft = rootProject.minecraft_version 10 | } 11 | 12 | repositories { 13 | maven { 14 | url = "https://api.modrinth.com/maven" 15 | } 16 | } 17 | 18 | subprojects { 19 | apply plugin: 'dev.architectury.loom' 20 | apply plugin: 'architectury-plugin' 21 | 22 | dependencies { 23 | minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" 24 | // The following line declares the mojmap mappings, you may use other mappings as well 25 | //mappings loom.officialMojangMappings() 26 | // The following line declares the yarn mappings you may select this one as well. 27 | mappings loom.layered { 28 | it.mappings("net.fabricmc:yarn:$rootProject.yarn_mappings:v2") 29 | it.mappings("dev.architectury:yarn-mappings-patch-neoforge:$rootProject.yarn_mappings_patch_neoforge_version") 30 | } 31 | } 32 | } 33 | 34 | 35 | allprojects { 36 | apply plugin: "java" 37 | apply plugin: "architectury-plugin" 38 | apply plugin: "maven-publish" 39 | 40 | archivesBaseName = rootProject.archives_base_name 41 | version = rootProject.mod_version 42 | group = rootProject.maven_group 43 | 44 | repositories { 45 | // Add repositories to retrieve artifacts from in here. 46 | // You should only use this when depending on other mods because 47 | // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. 48 | // See https://docs.gradle.org/current/userguide/declaring_repositories.html 49 | // for more information about repositories. 50 | } 51 | 52 | tasks.withType(JavaCompile) { 53 | options.encoding = "UTF-8" 54 | options.release = 21 55 | } 56 | ext { 57 | releaseChangelog = { 58 | def changes = new StringBuilder() 59 | changes << "## VisualOverhaul v$project.version for $project.minecraft_version\n[View the changelog](https://www.github.com/TeamMidnightDust/VisualOverhaul/commits/)" 60 | def proc = "git log --max-count=1 --pretty=format:%s".execute() 61 | proc.in.eachLine { line -> 62 | def processedLine = line.toString() 63 | if (!processedLine.contains("New translations") && !processedLine.contains("Merge") && !processedLine.contains("branch")) { 64 | changes << "\n- ${processedLine.capitalize()}" 65 | } 66 | } 67 | proc.waitFor() 68 | return changes.toString() 69 | } 70 | } 71 | 72 | java { 73 | withSourcesJar() 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /common/build.gradle: -------------------------------------------------------------------------------- 1 | architectury { 2 | common(rootProject.enabled_platforms.split(",")) 3 | } 4 | 5 | loom { 6 | } 7 | repositories { 8 | maven { url "https://api.modrinth.com/maven" } 9 | } 10 | 11 | dependencies { 12 | // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies 13 | // Do NOT use other classes from fabric loader 14 | modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" 15 | modCompileOnlyApi "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric" 16 | 17 | // Remove the next line if you don't want to depend on the API 18 | //modApi "dev.architectury:architectury:${rootProject.architectury_version}" 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/FakeBlocks.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul; 2 | 3 | import eu.midnightdust.visualoverhaul.config.VOConfig; 4 | import net.minecraft.block.Blocks; 5 | import net.minecraft.client.MinecraftClient; 6 | import net.minecraft.client.model.ModelNameSupplier; 7 | import net.minecraft.client.model.SpriteGetter; 8 | import net.minecraft.client.render.OverlayTexture; 9 | import net.minecraft.client.render.VertexConsumer; 10 | import net.minecraft.client.render.block.BlockRenderManager; 11 | import net.minecraft.client.render.model.*; 12 | import net.minecraft.client.render.model.json.JsonUnbakedModel; 13 | import net.minecraft.client.texture.Sprite; 14 | import net.minecraft.client.util.SpriteIdentifier; 15 | import net.minecraft.client.util.math.MatrixStack; 16 | import net.minecraft.resource.ResourceManager; 17 | import net.minecraft.util.Identifier; 18 | import net.minecraft.util.math.BlockPos; 19 | import net.minecraft.util.math.random.Random; 20 | import net.minecraft.world.BlockRenderView; 21 | 22 | import java.io.IOException; 23 | import java.util.HashMap; 24 | import java.util.Map; 25 | 26 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.LOGGER; 27 | 28 | public class FakeBlocks { 29 | private static final Baker BAKER = new FakeBaker(); 30 | private static final Map FAKE_MODELS = new HashMap<>(); 31 | private static final BlockRenderManager renderManager = MinecraftClient.getInstance().getBlockRenderManager(); 32 | 33 | public static void reload(ResourceManager manager) { 34 | manager.findResources("models", path -> path.getPath().startsWith("models/fakeblock") && path.getPath().endsWith(".json")).forEach((id, resource) -> { 35 | try { 36 | JsonUnbakedModel unbaked = JsonUnbakedModel.deserialize(resource.getReader()); 37 | BakedModel baked = unbaked.bake(new ModelTextures.Builder().addFirst(unbaked.getTextures()).build(() -> "#fakeblock"), BAKER, 38 | new ModelBakeSettings(){}, Boolean.TRUE.equals(unbaked.getAmbientOcclusion()), unbaked.getGuiLight() != null && unbaked.getGuiLight().isSide(), unbaked.getTransformation()); 39 | Identifier fakeId = Identifier.of(id.getNamespace(), id.getPath().replace("models/fakeblock/", "").replace(".json", "")); 40 | FAKE_MODELS.put(fakeId, baked); 41 | if (VOConfig.debug) LOGGER.info("Successfully loaded fake block model: {}", fakeId); 42 | } catch (IOException e) { 43 | LOGGER.error("Error occurred while loading fake block model {}", id.toString(), e); 44 | } 45 | }); 46 | } 47 | public static void renderFakeBlock(Identifier id, BlockPos pos, BlockRenderView world, MatrixStack matrices, VertexConsumer vertexConsumer) { 48 | renderManager.getModelRenderer().render(world, FAKE_MODELS.get(id), Blocks.DIRT.getDefaultState(), // State is just needed for a few generic checks 49 | pos, matrices, vertexConsumer, false, Random.create(), 0, OverlayTexture.DEFAULT_UV); 50 | } 51 | 52 | public static class FakeBaker implements Baker { 53 | public BakedModel bake(Identifier id, ModelBakeSettings settings) { 54 | return null; // Not used in Json models, so we just leave ít like this and cross our fingers. 55 | } 56 | 57 | @Override 58 | public SpriteGetter getSpriteGetter() { 59 | return new SpriteGetter() { 60 | static final SpriteIdentifier MISSING = new SpriteIdentifier(Identifier.ofVanilla("textures/atlas/blocks.png"), Identifier.ofVanilla("missingno")); 61 | 62 | @Override public Sprite get(SpriteIdentifier spriteId) { return spriteId.getSprite(); } 63 | @Override public Sprite getMissing(String textureId) { return MISSING.getSprite(); } 64 | }; 65 | } 66 | 67 | public ModelNameSupplier getModelNameSupplier() { return () -> "#fakeblock"; } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaulClient.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul; 2 | 3 | import eu.midnightdust.visualoverhaul.config.VOConfig; 4 | 5 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.MOD_ID; 6 | 7 | public class VisualOverhaulClient { 8 | public static int waterColor = 4159204; 9 | public static int foliageColor = -8934609; 10 | public static int grassColor = -8934609; 11 | public static int potionColor = -13083194; 12 | 13 | public static void onInitializeClient() { 14 | VOConfig.init(MOD_ID, VOConfig.class); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/VisualOverhaulCommon.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul; 2 | 3 | import net.minecraft.item.ItemStack; 4 | import net.minecraft.util.Identifier; 5 | import net.minecraft.util.math.BlockPos; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | 9 | import java.util.List; 10 | import java.util.ArrayList; 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | import java.util.UUID; 14 | 15 | public class VisualOverhaulCommon { 16 | public static final String MOD_ID = "visualoverhaul"; 17 | public static final Logger LOGGER = LoggerFactory.getLogger("VisualOverhaul"); 18 | public static final List playersWithMod = new ArrayList<>(); 19 | public static final Map jukeboxItems = new HashMap<>(); 20 | 21 | public static final Identifier HELLO_PACKET = id("hello"); 22 | public static final Identifier UPDATE_ITEMS_PACKET = id("update_items"); 23 | 24 | public static final Identifier UPDATE_TYPE_POTION_BOTTLES = id("type_brewingstand"); 25 | public static final Identifier UPDATE_TYPE_RECORD = id("type_record"); 26 | public static final Identifier UPDATE_TYPE_FURNACE_ITEMS = id("type_furnace"); 27 | 28 | public static Identifier id(String path) { 29 | return Identifier.of(MOD_ID, path); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/block/model/FurnaceWoodenPlanksModel.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.block.model; 2 | 3 | import net.minecraft.client.model.*; 4 | import net.minecraft.client.render.RenderLayer; 5 | import net.minecraft.client.render.VertexConsumer; 6 | import net.minecraft.client.render.entity.model.EntityModelLayer; 7 | import net.minecraft.client.util.math.MatrixStack; 8 | 9 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.id; 10 | 11 | public class FurnaceWoodenPlanksModel extends Model { 12 | private static ModelPart bb_main; 13 | public static final EntityModelLayer WOODEN_PLANKS_MODEL_LAYER = new EntityModelLayer(id("wooden_planks"), "main"); 14 | 15 | public FurnaceWoodenPlanksModel(ModelPart root) { 16 | super(root, RenderLayer::getEntitySolid); 17 | bb_main = root; 18 | bb_main.setPivot(0.0F, 24.0F, 0.0F); 19 | } 20 | public ModelPart getPart() { 21 | return bb_main; 22 | } 23 | 24 | public static TexturedModelData getTexturedModelData() { 25 | return TexturedModelData.of(getModelData(), 16, 16); 26 | } 27 | 28 | public static ModelData getModelData(){ 29 | ModelData modelData = new ModelData(); 30 | ModelPartData modelPartData = modelData.getRoot(); 31 | modelPartData.addChild("cube_r1", ModelPartBuilder.create().uv(0, 0).cuboid(-10.0F, -3.0F, 0.0F, 10.0F, 1.0F, 1.0F), ModelTransform.of(6.0F, 1.0F, -2.0F,0.0F, -0.5672F, 0.0F)); 32 | modelPartData.addChild("cube_r2", ModelPartBuilder.create().uv(0, 0).cuboid(-10.0F, -2.5F, 0.0F, 10.0F, 2.0F, 2.0F), ModelTransform.of(5.0F, 0.0F, -5.0F,0.0F, -0.1309F, 0.0F)); 33 | modelPartData.addChild("cube_r3", ModelPartBuilder.create().uv(0, 0).cuboid(-10.0F, -2.0F, 0.0F, 10.0F, 2.0F, 2.0F), ModelTransform.of(5.0F, -1.0F, -7.0F,0.0F, 0.2618F, 0.0F)); 34 | return modelData; 35 | } 36 | 37 | // public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, int color) { 38 | // bb_main.render(matrices, vertices, light, overlay); 39 | // } 40 | } 41 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/BrewingStandBlockEntityRenderer.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.block.renderer; 2 | 3 | import eu.midnightdust.visualoverhaul.config.VOConfig; 4 | import net.fabricmc.api.EnvType; 5 | import net.fabricmc.api.Environment; 6 | import net.minecraft.block.entity.BrewingStandBlockEntity; 7 | import net.minecraft.client.MinecraftClient; 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.WorldRenderer; 10 | import net.minecraft.client.render.block.entity.BlockEntityRenderer; 11 | import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; 12 | import net.minecraft.client.util.math.MatrixStack; 13 | import net.minecraft.item.ItemStack; 14 | import net.minecraft.item.ModelTransformationMode; 15 | import org.joml.AxisAngle4f; 16 | import org.joml.Math; 17 | import org.joml.Quaternionf; 18 | 19 | import java.util.Objects; 20 | 21 | @Environment(EnvType.CLIENT) 22 | public class BrewingStandBlockEntityRenderer implements BlockEntityRenderer { 23 | private static final Quaternionf degrees45 = new Quaternionf(new AxisAngle4f(Math.toRadians(45), 0, 1, 0)); 24 | private static final Quaternionf degrees180 = new Quaternionf(new AxisAngle4f(Math.toRadians(180), 0, 1, 0)); 25 | private static final Quaternionf degrees315 = new Quaternionf(new AxisAngle4f(Math.toRadians(315), 0, 1, 0)); 26 | 27 | public BrewingStandBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) { 28 | } 29 | 30 | 31 | @Override 32 | public void render(BrewingStandBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { 33 | 34 | if (VOConfig.brewingstand) { 35 | int lightAtBlock = WorldRenderer.getLightmapCoordinates(Objects.requireNonNull(blockEntity.getWorld()), blockEntity.getPos()); 36 | ItemStack item1 = blockEntity.getStack(0); 37 | ItemStack item2 = blockEntity.getStack(1); 38 | ItemStack item3 = blockEntity.getStack(2); 39 | 40 | if (!item1.isEmpty()) { 41 | matrices.push(); 42 | 43 | matrices.translate(0.86f, 0.23f, 0.5f); 44 | matrices.scale(1.15f, 1.15f, 1.15f); 45 | matrices.multiply(degrees180); 46 | MinecraftClient.getInstance().getItemRenderer().renderItem(item1, ModelTransformationMode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0); 47 | 48 | matrices.pop(); 49 | } 50 | if (!item2.isEmpty()) { 51 | matrices.push(); 52 | 53 | matrices.multiply(degrees315); 54 | matrices.translate(0.32f, 0.23f, 0f); 55 | matrices.scale(1.15f, 1.15f, 1.15f); 56 | MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformationMode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0); 57 | 58 | matrices.pop(); 59 | } 60 | if (!item3.isEmpty()) { 61 | matrices.push(); 62 | 63 | matrices.multiply(degrees45); 64 | matrices.translate(-0.39f, 0.23f, 0.705f); 65 | matrices.scale(1.15f, 1.15f, 1.15f); 66 | MinecraftClient.getInstance().getItemRenderer().renderItem(item3, ModelTransformationMode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0); 67 | 68 | matrices.pop(); 69 | } 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/block/renderer/JukeboxBlockEntityRenderer.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.block.renderer; 2 | 3 | import eu.midnightdust.visualoverhaul.FakeBlocks; 4 | import eu.midnightdust.visualoverhaul.VisualOverhaulClient; 5 | import eu.midnightdust.visualoverhaul.config.VOConfig; 6 | import eu.midnightdust.visualoverhaul.util.SoundTest; 7 | import net.fabricmc.api.EnvType; 8 | import net.fabricmc.api.Environment; 9 | import net.minecraft.block.BlockState; 10 | import net.minecraft.block.SideShapeType; 11 | import net.minecraft.block.entity.JukeboxBlockEntity; 12 | import net.minecraft.client.MinecraftClient; 13 | import net.minecraft.client.render.*; 14 | import net.minecraft.client.render.block.BlockRenderManager; 15 | import net.minecraft.client.render.block.entity.BlockEntityRenderer; 16 | import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; 17 | import net.minecraft.client.util.math.MatrixStack; 18 | import net.minecraft.state.property.Properties; 19 | import net.minecraft.util.Identifier; 20 | import net.minecraft.util.Util; 21 | import net.minecraft.util.math.BlockPos; 22 | import net.minecraft.util.math.Direction; 23 | import net.minecraft.util.math.random.Random; 24 | import net.minecraft.world.BlockRenderView; 25 | import org.joml.AxisAngle4f; 26 | import org.joml.Math; 27 | import org.joml.Quaternionf; 28 | 29 | import java.util.Objects; 30 | 31 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.id; 32 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.jukeboxItems; 33 | 34 | @Environment(EnvType.CLIENT) 35 | public class JukeboxBlockEntityRenderer implements BlockEntityRenderer { 36 | 37 | public JukeboxBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {} 38 | 39 | @Override 40 | public void render(JukeboxBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { 41 | if (VOConfig.jukebox) { 42 | int lightAbove = WorldRenderer.getLightmapCoordinates(Objects.requireNonNull(blockEntity.getWorld()), blockEntity.getPos().up()); 43 | 44 | Identifier discModel = null; // If the sound is stopped or no sound is playing, no model is set // 45 | 46 | // Tries to get the disc using the serverside method 47 | if (jukeboxItems.containsKey(blockEntity.getPos()) && !jukeboxItems.get(blockEntity.getPos()).isEmpty()) { 48 | discModel = RoundDiscRenderer.getModelId(jukeboxItems.get(blockEntity.getPos())); 49 | } 50 | // Else gets the record sound played at the position of the jukebox // 51 | else if (SoundTest.getSound(blockEntity.getPos()) != null) { 52 | // Converts the Sound ID to the item ID of the appropriate disc (minecraft:music_disc.cat -> minecraft:music_disc_cat) // 53 | discModel = Identifier.of(String.valueOf(SoundTest.getSound(blockEntity.getPos())).replace(".", "_")); 54 | } 55 | 56 | if (discModel != null) { 57 | matrices.push(); 58 | 59 | matrices.translate(0.5f, 1.03f, 0.5f); 60 | matrices.scale(0.75f, 0.75f, 0.75f); 61 | matrices.multiply(new Quaternionf(new AxisAngle4f(Math.toRadians(Util.getMeasuringTimeMs() / 9.0f), 0, 1, 0))); 62 | 63 | RoundDiscRenderer.render(discModel, lightAbove, overlay, matrices, vertexConsumers); 64 | matrices.pop(); 65 | } 66 | if (VOConfig.jukebox_fake_block && !blockEntity.getWorld().getBlockState(blockEntity.getPos().up()).isSideSolid(blockEntity.getWorld(),blockEntity.getPos().up(), Direction.DOWN, SideShapeType.FULL)) { 67 | matrices.push(); 68 | matrices.translate(0f, 1f, 0f); 69 | Identifier blockId = discModel != null ? id("jukebox_top_playing") : id("jukebox_top_stopped"); 70 | FakeBlocks.renderFakeBlock(blockId, blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout())); 71 | matrices.pop(); 72 | } 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/config/VOConfig.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.config; 2 | 3 | import eu.midnightdust.lib.config.MidnightConfig; 4 | 5 | public class VOConfig extends MidnightConfig { 6 | public static final String blocks = "blocks"; 7 | public static final String colors = "colors"; 8 | public static final String gui = "gui"; 9 | @Client @Entry(category = blocks) public static boolean brewingstand = true; 10 | @Client @Entry(category = blocks) public static boolean jukebox = true; 11 | @Client @Entry(category = blocks) public static boolean jukebox_fake_block = true; 12 | @Client @Entry(category = blocks) public static boolean jukebox_clientside = true; 13 | @Client @Entry(category = blocks) public static boolean furnace = true; 14 | @Client @Entry(category = blocks) public static boolean smoker_particles = true; 15 | @Client @Entry(category = blocks) public static boolean blast_furnace_particles = true; 16 | @Client @Entry(category = colors) public static boolean coloredItems = true; 17 | @Client @Entry(category = colors) public static boolean coloredLilypad = true; 18 | @Client @Entry(category = gui) public static boolean buttonIcons = false; 19 | @Client @Entry(category = gui) public static IconPosition buttonIconPosition = IconPosition.LOCATION; 20 | @Client @Entry(category = gui) public static boolean zoomIconOnHover = true; 21 | @Client @Entry(category = gui, name = "Debug") public static boolean debug = false; 22 | @Client @Entry @Hidden public static boolean firstLaunch = true; 23 | public enum IconPosition {LOCATION, LEFT, RIGHT, BOTH} 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/ItemRenderStateAccessor.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import net.minecraft.client.render.item.ItemRenderState; 4 | import net.minecraft.item.ModelTransformationMode; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.gen.Accessor; 7 | 8 | @Mixin(ItemRenderState.class) 9 | public interface ItemRenderStateAccessor { 10 | @Accessor("modelTransformationMode") 11 | void setModelTransformationMode(ModelTransformationMode modelTransformationMode); 12 | } 13 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinBlastFurnaceBlock.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.config.VOConfig; 4 | import net.minecraft.block.AbstractFurnaceBlock; 5 | import net.minecraft.block.BlastFurnaceBlock; 6 | import net.minecraft.block.BlockState; 7 | import net.minecraft.particle.ParticleTypes; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.util.math.Direction; 10 | import net.minecraft.util.math.random.Random; 11 | import net.minecraft.world.World; 12 | import org.spongepowered.asm.mixin.Mixin; 13 | import org.spongepowered.asm.mixin.injection.At; 14 | import org.spongepowered.asm.mixin.injection.Inject; 15 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 16 | 17 | @Mixin(BlastFurnaceBlock.class) 18 | public abstract class MixinBlastFurnaceBlock extends AbstractFurnaceBlock { 19 | protected MixinBlastFurnaceBlock(Settings settings) { 20 | super(settings); 21 | } 22 | 23 | @Inject(at = @At("TAIL"), method = "randomDisplayTick") 24 | public void vo$randomDisplayTick(BlockState state, World world, BlockPos pos, Random random, CallbackInfo ci) { 25 | if (state.get(LIT) && VOConfig.blast_furnace_particles) { 26 | double d = (double)pos.getX() + 0.5D; 27 | double e = pos.getY(); 28 | double f = (double)pos.getZ() + 0.5D; 29 | 30 | Direction direction = state.get(FACING); 31 | Direction.Axis axis = direction.getAxis(); 32 | double h = random.nextDouble() * 0.6D - 0.3D; 33 | double i = axis == Direction.Axis.X ? (double)direction.getOffsetX() * 0.4D : h; 34 | double j = random.nextDouble() * 6.0D / 16.0D; 35 | double k = axis == Direction.Axis.Z ? (double)direction.getOffsetZ() * 0.4D : h; 36 | world.addParticle(ParticleTypes.FLAME, d + i, e + j, f + k, 0.0D, 0.0D, 0.0D); 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinConstantTintSource.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulClient; 4 | import eu.midnightdust.visualoverhaul.config.VOConfig; 5 | import net.minecraft.client.render.item.tint.ConstantTintSource; 6 | import net.minecraft.client.world.ClientWorld; 7 | import net.minecraft.entity.LivingEntity; 8 | import net.minecraft.item.ItemStack; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 13 | 14 | import java.util.Objects; 15 | 16 | @Mixin(ConstantTintSource.class) 17 | public abstract class MixinConstantTintSource { 18 | @Inject(at = @At("RETURN"), method = "getTint", cancellable = true) 19 | public void vo$modifyLeafTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable cir) { 20 | // Dynamic Leaf Item colors 21 | if (VOConfig.coloredItems && Objects.equals(-12012264, cir.getReturnValue())) { 22 | cir.setReturnValue(VisualOverhaulClient.foliageColor); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinGrassTintSource.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulClient; 4 | import eu.midnightdust.visualoverhaul.config.VOConfig; 5 | import net.minecraft.client.render.item.tint.GrassTintSource; 6 | import net.minecraft.client.world.ClientWorld; 7 | import net.minecraft.entity.LivingEntity; 8 | import net.minecraft.item.ItemStack; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 13 | 14 | @Mixin(GrassTintSource.class) 15 | public abstract class MixinGrassTintSource { 16 | @Inject(at = @At("RETURN"), method = "getTint", cancellable = true) 17 | public void vo$modifyGrassTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable cir) { 18 | // Dynamic Grass Item colors 19 | if (VOConfig.coloredItems) { 20 | cir.setReturnValue(VisualOverhaulClient.grassColor); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinJukeboxBlockEntity.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.util.JukeboxPacketUpdate; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.entity.*; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | 12 | @Mixin(JukeboxBlockEntity.class) 13 | public abstract class MixinJukeboxBlockEntity extends BlockEntity { 14 | 15 | public MixinJukeboxBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { 16 | super(type, pos, state); 17 | } 18 | 19 | @Inject(at = @At("TAIL"), method = "onRecordStackChanged") 20 | public void getRecord(CallbackInfo ci) { 21 | JukeboxPacketUpdate.invUpdate = true; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinPotionTintSource.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulClient; 4 | import eu.midnightdust.visualoverhaul.config.VOConfig; 5 | import net.minecraft.client.render.item.tint.PotionTintSource; 6 | import net.minecraft.client.world.ClientWorld; 7 | import net.minecraft.component.DataComponentTypes; 8 | import net.minecraft.entity.LivingEntity; 9 | import net.minecraft.item.ItemStack; 10 | import net.minecraft.potion.Potion; 11 | import net.minecraft.potion.Potions; 12 | import net.minecraft.registry.entry.RegistryEntry; 13 | import net.minecraft.util.math.ColorHelper; 14 | import org.spongepowered.asm.mixin.Mixin; 15 | import org.spongepowered.asm.mixin.Unique; 16 | import org.spongepowered.asm.mixin.injection.At; 17 | import org.spongepowered.asm.mixin.injection.Inject; 18 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 19 | 20 | import java.util.List; 21 | 22 | @Mixin(PotionTintSource.class) 23 | public class MixinPotionTintSource { 24 | @Unique private static final List> WATER_POTIONS = List.of(Potions.WATER, Potions.MUNDANE, Potions.THICK, Potions.AWKWARD); 25 | 26 | @Inject(at = @At("RETURN"), method = "getTint", cancellable = true) 27 | public void vo$modifyWaterTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable cir) { 28 | // Dynamic Potion Item colors 29 | if (VOConfig.coloredItems) { 30 | var contents = stack.getComponents().get(DataComponentTypes.POTION_CONTENTS); 31 | if (contents != null && contents.potion().isPresent()) { 32 | if (!WATER_POTIONS.contains(contents.potion().get())) 33 | return; // Skip all potions with effects 34 | } 35 | if (cir.getReturnValue() == -1) cir.setReturnValue(ColorHelper.fullAlpha(VisualOverhaulClient.potionColor)); 36 | else cir.setReturnValue(VisualOverhaulClient.potionColor); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinPressableWidget.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.IconicButtons; 4 | import net.minecraft.client.gui.DrawContext; 5 | import net.minecraft.client.gui.widget.ClickableWidget; 6 | import net.minecraft.client.gui.widget.PressableWidget; 7 | import net.minecraft.text.Text; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Unique; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | @Mixin(PressableWidget.class) 15 | public abstract class MixinPressableWidget extends ClickableWidget { 16 | @Unique IconicButtons visualoverhaul$iconicButtons; 17 | public MixinPressableWidget(int x, int y, int width, int height, Text message) { 18 | super(x, y, width, height, message); 19 | } 20 | @Inject(at = @At("TAIL"), method = "") 21 | private void iconic$onInitButton(int i, int j, int k, int l, Text text, CallbackInfo ci) { 22 | visualoverhaul$iconicButtons = new IconicButtons(); 23 | } 24 | 25 | @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/PressableWidget;drawMessage(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/font/TextRenderer;I)V", shift = At.Shift.BEFORE), method = "renderWidget") 26 | private void iconic$onRenderButton(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { 27 | visualoverhaul$iconicButtons.renderIcons(context, this, this.alpha); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinSliderWidget.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.IconicButtons; 4 | import net.minecraft.client.gui.DrawContext; 5 | import net.minecraft.client.gui.widget.ClickableWidget; 6 | import net.minecraft.client.gui.widget.SliderWidget; 7 | import net.minecraft.text.Text; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Unique; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | @Mixin(SliderWidget.class) 15 | public abstract class MixinSliderWidget extends ClickableWidget { 16 | @Unique IconicButtons visualoverhaul$iconicButtons; 17 | public MixinSliderWidget(int x, int y, int width, int height, Text message) { 18 | super(x, y, width, height, message); 19 | } 20 | @Inject(at = @At("TAIL"), method = "") 21 | private void iconic$onInitButton(int x, int y, int width, int height, Text text, double value, CallbackInfo ci) { 22 | visualoverhaul$iconicButtons = new IconicButtons(); 23 | } 24 | 25 | @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/SliderWidget;drawScrollableText(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/font/TextRenderer;II)V", shift = At.Shift.BEFORE), method = "renderWidget") 26 | private void iconic$onRenderButton(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { 27 | visualoverhaul$iconicButtons.renderIcons(context, this, this.alpha); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinSmokerBlock.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.config.VOConfig; 4 | import net.minecraft.block.AbstractFurnaceBlock; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.SmokerBlock; 7 | import net.minecraft.particle.ParticleTypes; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.util.math.Direction; 10 | import net.minecraft.util.math.random.Random; 11 | import net.minecraft.world.World; 12 | import org.spongepowered.asm.mixin.Mixin; 13 | import org.spongepowered.asm.mixin.injection.At; 14 | import org.spongepowered.asm.mixin.injection.Inject; 15 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 16 | 17 | @Mixin(SmokerBlock.class) 18 | public abstract class MixinSmokerBlock extends AbstractFurnaceBlock { 19 | protected MixinSmokerBlock(Settings settings) { 20 | super(settings); 21 | } 22 | 23 | @Inject(at = @At("TAIL"), method = "randomDisplayTick") 24 | public void vo$randomDisplayTick(BlockState state, World world, BlockPos pos, Random random, CallbackInfo ci) { 25 | if (state.get(LIT) && VOConfig.smoker_particles) { 26 | double d = (double)pos.getX() + 0.5D; 27 | double e = pos.getY(); 28 | double f = (double)pos.getZ() + 0.5D; 29 | 30 | Direction direction = state.get(FACING); 31 | Direction.Axis axis = direction.getAxis(); 32 | double h = random.nextDouble() * 0.6D - 0.3D; 33 | double i = axis == Direction.Axis.X ? (double)direction.getOffsetX() * 0.4D : h; 34 | double j = random.nextDouble() * 6.0D / 16.0D; 35 | double k = axis == Direction.Axis.Z ? (double)direction.getOffsetZ() * 0.4D : h; 36 | world.addParticle(ParticleTypes.FLAME, d + i, e + j, f + k, 0.0D, 0.0D, 0.0D); 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/MixinSoundSystem.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.util.SoundTest; 4 | import net.minecraft.client.sound.SoundInstance; 5 | import net.minecraft.client.sound.SoundSystem; 6 | import net.minecraft.sound.SoundCategory; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Shadow; 10 | import org.spongepowered.asm.mixin.Unique; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Inject; 13 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 14 | 15 | @Mixin(SoundSystem.class) 16 | public abstract class MixinSoundSystem { 17 | 18 | @Shadow private boolean started; 19 | 20 | @Unique 21 | private BlockPos visualoverhaul$jukeboxPos; 22 | 23 | @Inject(at = @At("TAIL"),method = "play(Lnet/minecraft/client/sound/SoundInstance;)V") 24 | public void vo$onPlayRecordSound(SoundInstance soundInstance, CallbackInfo ci) { 25 | if (soundInstance != null) { 26 | if (soundInstance.getCategory().equals(SoundCategory.RECORDS) && this.started) { 27 | visualoverhaul$jukeboxPos = BlockPos.ofFloored(Math.floor(soundInstance.getX()), Math.floor(soundInstance.getY()), Math.floor(soundInstance.getZ())); 28 | SoundTest.soundPos.put(visualoverhaul$jukeboxPos, soundInstance.getId()); 29 | } 30 | } 31 | } 32 | 33 | @Inject(at = @At("HEAD"),method = "stop(Lnet/minecraft/client/sound/SoundInstance;)V") 34 | public void vo$onStopRecordSound(SoundInstance soundInstance, CallbackInfo ci) { 35 | if (soundInstance != null) { 36 | if (soundInstance.getCategory().equals(SoundCategory.RECORDS)) { 37 | visualoverhaul$jukeboxPos = BlockPos.ofFloored(Math.floor(soundInstance.getX()), Math.floor(soundInstance.getY()), Math.floor(soundInstance.getZ())); 38 | if (SoundTest.soundPos.containsKey(visualoverhaul$jukeboxPos)) { 39 | SoundTest.soundPos.remove(visualoverhaul$jukeboxPos, soundInstance.getId()); 40 | } 41 | } 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/mixin/TextureManagerAccessor.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.mixin; 2 | 3 | import net.minecraft.client.texture.AbstractTexture; 4 | import net.minecraft.client.texture.TextureManager; 5 | import net.minecraft.resource.ResourceManager; 6 | import net.minecraft.util.Identifier; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.gen.Accessor; 9 | 10 | import java.util.Map; 11 | 12 | @Mixin(TextureManager.class) 13 | public interface TextureManagerAccessor { 14 | @Accessor 15 | ResourceManager getResourceContainer(); 16 | 17 | @Accessor 18 | Map getTextures(); 19 | } 20 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/packet/HelloPacket.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.packet; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import net.minecraft.network.PacketByteBuf; 5 | import net.minecraft.network.codec.PacketCodec; 6 | import net.minecraft.network.packet.CustomPayload; 7 | 8 | import java.util.UUID; 9 | 10 | public record HelloPacket(UUID uuid) implements CustomPayload { 11 | public static final CustomPayload.Id PACKET_ID = new CustomPayload.Id<>(VisualOverhaulCommon.HELLO_PACKET); 12 | public static final PacketCodec codec = PacketCodec.of(HelloPacket::write, HelloPacket::read); 13 | 14 | public static HelloPacket read(PacketByteBuf buf) { 15 | return new HelloPacket(buf.readUuid()); 16 | } 17 | 18 | public void write(PacketByteBuf buf) { 19 | buf.writeUuid(uuid); 20 | } 21 | 22 | @Override 23 | public Id getId() { 24 | return PACKET_ID; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/packet/UpdateItemsPacket.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.packet; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import net.minecraft.item.ItemStack; 5 | import net.minecraft.network.RegistryByteBuf; 6 | import net.minecraft.network.codec.PacketCodec; 7 | import net.minecraft.network.packet.CustomPayload; 8 | import net.minecraft.util.Identifier; 9 | import net.minecraft.util.collection.DefaultedList; 10 | import net.minecraft.util.math.BlockPos; 11 | 12 | public record UpdateItemsPacket(Identifier blockTypeID, BlockPos pos, DefaultedList inv) implements CustomPayload { 13 | public static final Id PACKET_ID = new Id<>(VisualOverhaulCommon.UPDATE_ITEMS_PACKET); 14 | public static final PacketCodec codec = PacketCodec.of(UpdateItemsPacket::write, UpdateItemsPacket::read); 15 | 16 | public static UpdateItemsPacket read(RegistryByteBuf buf) { 17 | return new UpdateItemsPacket(buf.readIdentifier(), buf.readBlockPos(), (DefaultedList) ItemStack.OPTIONAL_LIST_PACKET_CODEC.decode(buf)); 18 | } 19 | 20 | public void write(RegistryByteBuf buf) { 21 | buf.writeIdentifier(blockTypeID); 22 | buf.writeBlockPos(pos); 23 | ItemStack.OPTIONAL_LIST_PACKET_CODEC.encode(buf, this.inv); 24 | } 25 | 26 | @Override 27 | public Id getId() { 28 | return PACKET_ID; 29 | } 30 | } -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/util/JukeboxPacketUpdate.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.util; 2 | 3 | public class JukeboxPacketUpdate { 4 | public static boolean invUpdate = true; 5 | public static int playerUpdate = -1; 6 | } 7 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/util/ModIconUtil.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.util; 2 | 3 | import eu.midnightdust.visualoverhaul.config.VOConfig; 4 | import net.fabricmc.loader.api.FabricLoader; 5 | import dev.architectury.injectables.annotations.ExpectPlatform; 6 | import net.minecraft.client.texture.NativeImage; 7 | import net.minecraft.client.texture.NativeImageBackedTexture; 8 | import org.apache.commons.lang3.Validate; 9 | import org.spongepowered.asm.mixin.Unique; 10 | 11 | import java.io.InputStream; 12 | import java.nio.file.Files; 13 | import java.nio.file.Path; 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | import java.util.Objects; 17 | 18 | public class ModIconUtil { 19 | private static final Map modIconCache = new HashMap<>(); 20 | private final String modid; 21 | 22 | public ModIconUtil(String modid) { 23 | this.modid = modid; 24 | } 25 | @ExpectPlatform 26 | public static Path getPath(String modid) { 27 | throw new AssertionError(); 28 | } 29 | 30 | @Unique 31 | public NativeImageBackedTexture createModIcon() { 32 | try { 33 | Path path = getPath(modid); 34 | if (VOConfig.debug) System.out.println(path); 35 | NativeImageBackedTexture cachedIcon = getCachedModIcon(path); 36 | if (cachedIcon != null) { 37 | return cachedIcon; 38 | } 39 | cachedIcon = getCachedModIcon(path); 40 | if (cachedIcon != null) { 41 | return cachedIcon; 42 | } 43 | try (InputStream inputStream = Files.newInputStream(path)) { 44 | NativeImage image = NativeImage.read(Objects.requireNonNull(inputStream)); 45 | Validate.validState(image.getHeight() == image.getWidth(), "Must be square icon"); 46 | NativeImageBackedTexture tex = new NativeImageBackedTexture(image); 47 | cacheModIcon(path, tex); 48 | return tex; 49 | } 50 | 51 | } catch (Throwable t) { 52 | if (VOConfig.debug) System.out.println(t.getMessage()); 53 | return null; 54 | } 55 | } 56 | static NativeImageBackedTexture getCachedModIcon(Path path) { 57 | return modIconCache.get(path); 58 | } 59 | 60 | static void cacheModIcon(Path path, NativeImageBackedTexture tex) { 61 | modIconCache.put(path, tex); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/util/SoundTest.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.util; 2 | 3 | import com.google.common.collect.Maps; 4 | import eu.midnightdust.visualoverhaul.config.VOConfig; 5 | import net.minecraft.util.Identifier; 6 | import net.minecraft.util.math.BlockPos; 7 | 8 | import java.util.Map; 9 | 10 | public class SoundTest { 11 | 12 | public static Map soundPos = Maps.newHashMap(); 13 | 14 | /** 15 | * Returns the Sound provided in MixinSoundSystem 16 | * {@link eu.midnightdust.visualoverhaul.mixin.MixinSoundSystem} 17 | */ 18 | public static Identifier getSound(BlockPos pos) { 19 | if (VOConfig.jukebox_clientside && soundPos.containsKey(pos)) { 20 | return soundPos.get(pos); 21 | } 22 | return null; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /common/src/main/java/eu/midnightdust/visualoverhaul/util/VOColorUtil.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.util; 2 | 3 | import net.minecraft.util.math.ColorHelper; 4 | import net.minecraft.util.math.MathHelper; 5 | 6 | public class VOColorUtil { 7 | public static int convertRgbToArgb(int rgb, int alpha) { 8 | int red = 0xFF & (rgb >> 16); 9 | int green = 0xFF & (rgb >> 8); 10 | int blue = 0xFF & (rgb); 11 | 12 | return (alpha << 24) | (red << 16) | (green << 8) | blue; 13 | } 14 | public static int alphaAndBrightness(float alpha, float brightness) { 15 | return ColorHelper.getArgb(MathHelper.floor(alpha*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/src/main/resources/architectury.common.json: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/addserver.add.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/gui.done.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/credits_and_attribution.button.attribution.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/written_book.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/credits_and_attribution.button.credits.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/paper.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/credits_and_attribution.button.licenses.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/knowledge_book.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/fml.menu.mods.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/modmenu.title.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/gui.advancements.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/experience_bottle.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/gui.back.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/gui.cancel.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/gui.cancel.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/coal.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/gui.done.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/emerald.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/gui.no.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/block/redstone_lamp.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/gui.proceed.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/gui.done.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/gui.stats.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/paper.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/gui.yes.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/block/redstone_lamp_on.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.disconnect.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/menu.returntomenu.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.multiplayer.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/diamond_sword.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.online.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/netherite_hoe.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.options.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/command_block_minecart.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.playerreporting.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/mangrove_sign.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.quit.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/barrier.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.reportbugs.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/pufferfish.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.returntogame.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/emerald.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.returntomenu.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/blaze_powder.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.sendfeedback.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/echo_shard.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.sharetolan.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/recovery_compass_18.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/menu.singleplayer.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/iron_pickaxe.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/midnightlib.midnightconfig.enum.configbutton.false.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/gui.no.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/midnightlib.midnightconfig.enum.configbutton.modmenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/assets/iconic/textures/gui/icons/midnightlib.midnightconfig.enum.configbutton.modmenu.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/midnightlib.midnightconfig.enum.configbutton.true.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/gui.yes.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/modmenu.title.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/totem_of_undying.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.accessibility.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/axolotl_bucket.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.chat.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/birch_hanging_sign.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.controls.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/jungle_boat.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.credits_and_attribution.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/name_tag.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.fov.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/ender_eye.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.language.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/writable_book.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.online.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/comparator.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.resourcepack.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/painting.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.skincustomisation.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/armor_stand.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.sounds.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/music_disc_otherside.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.telemetry.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/nether_star.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/options.video.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/end_crystal.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/pack.openfolder.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/mojang_banner_pattern.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/physicsmod.menu.main.title.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/slime_ball.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectserver.add.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/selectworld.create.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectserver.delete.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/selectworld.delete.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectserver.direct.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/firework_rocket.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectserver.edit.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/selectworld.edit.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectserver.refresh.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/blaze_powder.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectserver.select.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/selectworld.select.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectworld.create.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/diamond.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectworld.delete.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/tnt_minecart.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectworld.edit.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/menu.options.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectworld.edit.save.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/gui.done.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectworld.recreate.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/furnace_minecart.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/selectworld.select.properties: -------------------------------------------------------------------------------- 1 | texture=minecraft:textures/item/trident.png 2 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/text.cloth-config.boolean.value.false.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/gui.no.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/iconic/textures/gui/icons/text.cloth-config.boolean.value.true.properties: -------------------------------------------------------------------------------- 1 | properties=iconic:textures/gui/icons/gui.yes.properties -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/assets/visualoverhaul/icon.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/lang/de_de.json: -------------------------------------------------------------------------------- 1 | { 2 | "visualoverhaul.midnightconfig.title":"Visual Overhaul Konfiguration", 3 | "visualoverhaul.midnightconfig.brewingstand":"Braustand-Verbesserungen", 4 | "visualoverhaul.midnightconfig.jukebox":"Jukebox-Verbesserungen", 5 | "visualoverhaul.midnightconfig.jukebox_fake_block":"Fake-Block auf der Jukebox", 6 | "visualoverhaul.midnightconfig.furnace":"Ofen-Verbesserungen", 7 | "visualoverhaul.midnightconfig.smoker_particles":"Räucherofen-Partikel", 8 | "visualoverhaul.midnightconfig.blast_furnace_particles":"Schmelzofen-Partikel", 9 | "visualoverhaul.midnightconfig.coloredItems":"Biom-basierte Item-Farben", 10 | "visualoverhaul.midnightconfig.coloredItems.tooltip":"§cNeustart benötigt!", 11 | "visualoverhaul.midnightconfig.coloredLilypad":"Biom-basierte Seerosenfarbe", 12 | "visualoverhaul.midnightconfig.coloredLilypad.tooltip":"§cNeustart benötigt!", 13 | "visualoverhaul.midnightconfig.buttonIcons": "Symbole auf Knöpfen", 14 | "visualoverhaul.midnightconfig.buttonIconPosition": "Knopfsymbolposition", 15 | "visualoverhaul.midnightconfig.enum.IconPosition.LOCATION": "Ortsbasiert", 16 | "visualoverhaul.midnightconfig.enum.IconPosition.LEFT": "Links", 17 | "visualoverhaul.midnightconfig.enum.IconPosition.RIGHT": "Rechts", 18 | "visualoverhaul.midnightconfig.enum.IconPosition.BOTH": "Links & Rechts", 19 | "visualoverhaul.midnightconfig.zoomIconOnHover": "Vergrößere Symbol beim Überfahren", 20 | "visualoverhaul.midnightconfig.category.gui": "GUI", 21 | "visualoverhaul.midnightconfig.category.blocks": "Blöcke", 22 | "visualoverhaul.midnightconfig.category.colors": "Farben" 23 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/lang/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "visualoverhaul.midnightconfig.title":"Visual Overhaul Config", 3 | "visualoverhaul.midnightconfig.brewingstand":"Brewing Stand Enhancements", 4 | "visualoverhaul.midnightconfig.jukebox":"Jukebox Enhancements", 5 | "visualoverhaul.midnightconfig.jukebox_fake_block":"Fake block on jukebox top", 6 | "visualoverhaul.midnightconfig.jukebox_clientside":"Client-side music disc detection", 7 | "visualoverhaul.midnightconfig.jukebox_clientside.tooltip":"Might not be 100% accurate with custom music discs.", 8 | "visualoverhaul.midnightconfig.furnace":"Furnace Enhancements", 9 | "visualoverhaul.midnightconfig.smoker_particles":"Smoker Particles", 10 | "visualoverhaul.midnightconfig.blast_furnace_particles":"Blast Furnace Particles", 11 | "visualoverhaul.midnightconfig.coloredItems":"Biome-based item colors", 12 | "visualoverhaul.midnightconfig.coloredItems.tooltip":"§cNeeds restart!", 13 | "visualoverhaul.midnightconfig.coloredLilypad":"Biome-based Lily Pad color", 14 | "visualoverhaul.midnightconfig.coloredLilypad.tooltip":"§cNeeds restart!", 15 | "visualoverhaul.midnightconfig.buttonIcons": "Button Icons", 16 | "visualoverhaul.midnightconfig.buttonIconPosition": "Button Icon Position", 17 | "visualoverhaul.midnightconfig.enum.IconPosition.LOCATION": "Location-dependant", 18 | "visualoverhaul.midnightconfig.enum.IconPosition.LEFT": "Left", 19 | "visualoverhaul.midnightconfig.enum.IconPosition.RIGHT": "Right", 20 | "visualoverhaul.midnightconfig.enum.IconPosition.BOTH": "Left & Right", 21 | "visualoverhaul.midnightconfig.zoomIconOnHover": "Zoom icon on hover", 22 | "visualoverhaul.midnightconfig.category.gui": "GUI", 23 | "visualoverhaul.midnightconfig.category.blocks": "Blocks", 24 | "visualoverhaul.midnightconfig.category.colors": "Colors" 25 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/lang/es_mx.json: -------------------------------------------------------------------------------- 1 | { 2 | "visualoverhaul.midnightconfig.title":"Configuración de Visual Overhaul", 3 | "visualoverhaul.midnightconfig.brewingstand":"Mejoras en el soporte de pociones", 4 | "visualoverhaul.midnightconfig.jukebox":"Mejoras en la caja de música", 5 | "visualoverhaul.midnightconfig.jukebox_fake_block":"Bloque falso en la parte superior de la caja de música", 6 | "visualoverhaul.midnightconfig.furnace":"Mejoras en el horno", 7 | "visualoverhaul.midnightconfig.smoker_particles":"Partículas de ahumador", 8 | "visualoverhaul.midnightconfig.blast_furnace_particles":"Partículas del alto horno", 9 | "visualoverhaul.midnightconfig.coloredItems":"Colores de objetos basados en el bioma", 10 | "visualoverhaul.midnightconfig.coloredItems.tooltip":"§c¡Necesita reiniciar!", 11 | "visualoverhaul.midnightconfig.coloredLilypad":"Color de nenúfar basado en el bioma", 12 | "visualoverhaul.midnightconfig.coloredLilypad.tooltip":"§c¡Necesita reiniciar!", 13 | "visualoverhaul.midnightconfig.buttonIcons": "Iconos de botones", 14 | "visualoverhaul.midnightconfig.buttonIconPosition": "Posición del icono del botón", 15 | "visualoverhaul.midnightconfig.enum.IconPosition.LOCATION": "Dependiente de la ubicación", 16 | "visualoverhaul.midnightconfig.enum.IconPosition.LEFT": "Izquierda", 17 | "visualoverhaul.midnightconfig.enum.IconPosition.RIGHT": "Derecha", 18 | "visualoverhaul.midnightconfig.enum.IconPosition.BOTH": "Izquierda y derecha", 19 | "visualoverhaul.midnightconfig.zoomIconOnHover": "Icono de zoom al pasar el cursor", 20 | "visualoverhaul.midnightconfig.category.gui": "GUI", 21 | "visualoverhaul.midnightconfig.category.blocks": "Bloques", 22 | "visualoverhaul.midnightconfig.category.colors": "Colores" 23 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/lang/fr_fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "visualoverhaul.midnightconfig.title":"Configuration de Visual Overhaul", 3 | "visualoverhaul.midnightconfig.brewingstand":"Améliorations de l'Alambic", 4 | "visualoverhaul.midnightconfig.jukebox":"Améliorations du Jukebox", 5 | "visualoverhaul.midnightconfig.jukebox_fake_block":"Faux bloc sur le dessus du Jukebox", 6 | "visualoverhaul.midnightconfig.furnace":"Améliorations du Four", 7 | "visualoverhaul.midnightconfig.smoker_particles":"Particles du Fumoir", 8 | "visualoverhaul.midnightconfig.blast_furnace_particles":"Particles du Haut Fourneau", 9 | "visualoverhaul.midnightconfig.coloredItems":"Couleurs des objets basées sur le biome", 10 | "visualoverhaul.midnightconfig.coloredItems.tooltip":"§cBesoin de redémarrer !", 11 | "visualoverhaul.midnightconfig.coloredLilypad":"Couleur de nénuphar basée sur le biome", 12 | "visualoverhaul.midnightconfig.coloredLilypad.tooltip":"§cBesoin de redémarrer !" 13 | } 14 | -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/lang/zh_tw.json: -------------------------------------------------------------------------------- 1 | { 2 | "visualoverhaul.midnightconfig.title": "《視覺增強》設定", 3 | "visualoverhaul.midnightconfig.brewingstand": "釀造台增強", 4 | "visualoverhaul.midnightconfig.jukebox": "唱片機增強", 5 | "visualoverhaul.midnightconfig.jukebox_fake_block": "唱片機頂部的偽裝方塊", 6 | "visualoverhaul.midnightconfig.jukebox_clientside": "用戶端音樂唱片偵測", 7 | "visualoverhaul.midnightconfig.jukebox_clientside.tooltip": "對於自訂音樂唱片,可能無法 100% 準確。", 8 | "visualoverhaul.midnightconfig.furnace": "熔爐增強", 9 | "visualoverhaul.midnightconfig.smoker_particles": "煙燻爐粒子", 10 | "visualoverhaul.midnightconfig.blast_furnace_particles": "高爐粒子", 11 | "visualoverhaul.midnightconfig.coloredItems": "基於生態域的物品顏色", 12 | "visualoverhaul.midnightconfig.coloredItems.tooltip": "§c需要重新啟動!", 13 | "visualoverhaul.midnightconfig.coloredLilypad": "基於生態域的睡蓮顏色", 14 | "visualoverhaul.midnightconfig.coloredLilypad.tooltip": "§c需要重新啟動!", 15 | "visualoverhaul.midnightconfig.buttonIcons": "按鈕圖示", 16 | "visualoverhaul.midnightconfig.buttonIconPosition": "按鈕圖示位置", 17 | "visualoverhaul.midnightconfig.enum.IconPosition.LOCATION": "取決於位置", 18 | "visualoverhaul.midnightconfig.enum.IconPosition.LEFT": "左", 19 | "visualoverhaul.midnightconfig.enum.IconPosition.RIGHT": "右", 20 | "visualoverhaul.midnightconfig.enum.IconPosition.BOTH": "左和右", 21 | "visualoverhaul.midnightconfig.zoomIconOnHover": "懸停時放大圖示", 22 | "visualoverhaul.midnightconfig.category.gui": "介面", 23 | "visualoverhaul.midnightconfig.category.blocks": "方塊", 24 | "visualoverhaul.midnightconfig.category.colors": "顏色" 25 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/jukebox_top_playing.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "made by Motschen", 3 | "textures": { 4 | "0": "block/glass", 5 | "1": "block/black_concrete", 6 | "2": "block/anvil", 7 | "3": "visualoverhaul:block/vo_jukebox_top", 8 | "particle": "block/glass" 9 | }, 10 | "elements": [ 11 | { 12 | "from": [0, 0, 0], 13 | "to": [16, 0.01, 16], 14 | "faces": { 15 | "up": {"uv": [0, 0, 16, 16], "texture": "#3"} 16 | } 17 | }, 18 | { 19 | "from": [0, 0, 0], 20 | "to": [16, 5, 16], 21 | "faces": { 22 | "north": {"uv": [0, 0, 16, 5], "texture": "#0"}, 23 | "east": {"uv": [0, 0, 16, 5], "texture": "#0"}, 24 | "south": {"uv": [0, 0, 16, 5], "texture": "#0"}, 25 | "west": {"uv": [0, 0, 16, 5], "texture": "#0"}, 26 | "up": {"uv": [0, 0, 16, 16], "texture": "#0"} 27 | } 28 | }, 29 | { 30 | "from": [7.875, 0, 7.875], 31 | "to": [8.125, 1.25, 8.125], 32 | "faces": { 33 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 34 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 35 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 36 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 37 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 38 | } 39 | }, 40 | { 41 | "from": [5.75, 1, 11.29], 42 | "to": [6, 1.5, 11.54], 43 | "rotation": {"angle": 45, "axis": "y", "origin": [5, 8, 12]}, 44 | "faces": { 45 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 46 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 47 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 48 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 49 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#2"} 50 | } 51 | }, 52 | { 53 | "from": [0.875, 0, 14.875], 54 | "to": [1.375, 1.5, 15.375], 55 | "rotation": {"angle": 0, "axis": "y", "origin": [1, 8, 15]}, 56 | "faces": { 57 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 58 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 59 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 60 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 61 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 62 | } 63 | }, 64 | { 65 | "from": [0.65, 1.5, 14.875], 66 | "to": [7.15, 2, 15.375], 67 | "rotation": {"angle": 45, "axis": "y", "origin": [1, 10, 15]}, 68 | "faces": { 69 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 70 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 71 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 72 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 73 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 74 | } 75 | } 76 | ] 77 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/jukebox_top_stopped.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "made by Motschen", 3 | "textures": { 4 | "0": "block/glass", 5 | "1": "block/black_concrete", 6 | "2": "block/anvil", 7 | "3": "visualoverhaul:block/vo_jukebox_top", 8 | "particle": "block/glass" 9 | }, 10 | "elements": [ 11 | { 12 | "from": [0, 0, 0], 13 | "to": [16, 0.01, 16], 14 | "faces": { 15 | "up": {"uv": [0, 0, 16, 16], "texture": "#3"} 16 | } 17 | }, 18 | { 19 | "from": [0, 0, 0], 20 | "to": [16, 5, 16], 21 | "faces": { 22 | "north": {"uv": [0, 0, 16, 5], "texture": "#0"}, 23 | "east": {"uv": [0, 0, 16, 5], "texture": "#0"}, 24 | "south": {"uv": [0, 0, 16, 5], "texture": "#0"}, 25 | "west": {"uv": [0, 0, 16, 5], "texture": "#0"}, 26 | "up": {"uv": [0, 0, 16, 16], "texture": "#0"} 27 | } 28 | }, 29 | { 30 | "from": [7.875, 0, 7.875], 31 | "to": [8.125, 1.25, 8.125], 32 | "faces": { 33 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 34 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 35 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 36 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 37 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 38 | } 39 | }, 40 | { 41 | "from": [6.75, 1, 15], 42 | "to": [7, 1.5, 15.25], 43 | "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 16]}, 44 | "faces": { 45 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 46 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 47 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 48 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 49 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#2"} 50 | } 51 | }, 52 | { 53 | "from": [0.875, 0, 14.875], 54 | "to": [1.375, 1.5, 15.375], 55 | "rotation": {"angle": 0, "axis": "y", "origin": [1, 8, 15]}, 56 | "faces": { 57 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 58 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 59 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 60 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 61 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 62 | } 63 | }, 64 | { 65 | "from": [0.65, 1.5, 14.875], 66 | "to": [7.15, 2, 15.375], 67 | "rotation": {"angle": 0, "axis": "y", "origin": [1, 10, 15]}, 68 | "faces": { 69 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 70 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 71 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 72 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 73 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 74 | } 75 | } 76 | ] 77 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_0.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "made by Motschen", 3 | "textures": { 4 | "0": "block/glass", 5 | "1": "block/black_concrete", 6 | "2": "block/anvil", 7 | "3": "visualoverhaul:block/vo_jukebox_top", 8 | "4": "phonos:block/speaker_top_0", 9 | "particle": "block/glass" 10 | }, 11 | "elements": [ 12 | { 13 | "from": [0, 0, 0], 14 | "to": [16, 0.01, 16], 15 | "faces": { 16 | "up": {"uv": [0, 0, 16, 16], "texture": "#3"} 17 | } 18 | }, 19 | { 20 | "from": [0, 0, 0], 21 | "to": [16, 5, 16], 22 | "faces": { 23 | "north": {"uv": [0, 0, 16, 5], "texture": "#0"}, 24 | "east": {"uv": [0, 0, 16, 5], "texture": "#0"}, 25 | "south": {"uv": [0, 0, 16, 5], "texture": "#0"}, 26 | "west": {"uv": [0, 0, 16, 5], "texture": "#0"}, 27 | "up": {"uv": [0, 0, 16, 16], "texture": "#0"} 28 | } 29 | }, 30 | { 31 | "from": [7.875, 0, 7.875], 32 | "to": [8.125, 1.25, 8.125], 33 | "faces": { 34 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 35 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 36 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 37 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 38 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 39 | } 40 | }, 41 | { 42 | "from": [5.75, 1, 11.29], 43 | "to": [6, 1.5, 11.54], 44 | "rotation": {"angle": 45, "axis": "y", "origin": [5, 8, 12]}, 45 | "faces": { 46 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 47 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 48 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 49 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 50 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#2"} 51 | } 52 | }, 53 | { 54 | "from": [0.875, 0, 14.875], 55 | "to": [1.375, 1.5, 15.375], 56 | "rotation": {"angle": 0, "axis": "y", "origin": [1, 8, 15]}, 57 | "faces": { 58 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 59 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 60 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 61 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 62 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 63 | } 64 | }, 65 | { 66 | "from": [0.65, 1.5, 14.875], 67 | "to": [7.15, 2, 15.375], 68 | "rotation": {"angle": 45, "axis": "y", "origin": [1, 10, 15]}, 69 | "faces": { 70 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 71 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 72 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 73 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 74 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 75 | } 76 | }, 77 | { 78 | "from": [10, 0.1, 12], 79 | "to": [15, 0.1, 15], 80 | "faces": { 81 | "up": {"uv": [4, 5, 12, 10], "rotation": 180, "texture": "#4"} 82 | } 83 | } 84 | ] 85 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_1.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_1" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_10.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_10" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_11.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_11" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_12.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_12" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_13.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_13" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_14.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_14" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_15.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_15" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_16.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_16" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_17.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_17" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_18.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_18" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_19.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_19" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_2.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_2" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_3.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_3" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_4.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_4" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_5.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_5" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_6.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_6" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_7.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_7" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_8.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_8" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_playing_9.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_playing_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_9" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_0.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "made by Motschen", 3 | "textures": { 4 | "0": "block/glass", 5 | "1": "block/black_concrete", 6 | "2": "block/anvil", 7 | "3": "visualoverhaul:block/vo_jukebox_top", 8 | "4": "phonos:block/speaker_top_0", 9 | "particle": "block/glass" 10 | }, 11 | "elements": [ 12 | { 13 | "from": [0, 0, 0], 14 | "to": [16, 0.01, 16], 15 | "faces": { 16 | "up": {"uv": [0, 0, 16, 16], "texture": "#3"} 17 | } 18 | }, 19 | { 20 | "from": [0, 0, 0], 21 | "to": [16, 5, 16], 22 | "faces": { 23 | "north": {"uv": [0, 0, 16, 5], "texture": "#0"}, 24 | "east": {"uv": [0, 0, 16, 5], "texture": "#0"}, 25 | "south": {"uv": [0, 0, 16, 5], "texture": "#0"}, 26 | "west": {"uv": [0, 0, 16, 5], "texture": "#0"}, 27 | "up": {"uv": [0, 0, 16, 16], "texture": "#0"} 28 | } 29 | }, 30 | { 31 | "from": [7.875, 0, 7.875], 32 | "to": [8.125, 1.25, 8.125], 33 | "faces": { 34 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 35 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 36 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 37 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 38 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 39 | } 40 | }, 41 | { 42 | "from": [6.75, 1, 15], 43 | "to": [7, 1.5, 15.25], 44 | "rotation": {"angle": 0, "axis": "y", "origin": [6, 8, 16]}, 45 | "faces": { 46 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 47 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 48 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 49 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#2"}, 50 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#2"} 51 | } 52 | }, 53 | { 54 | "from": [0.875, 0, 14.875], 55 | "to": [1.375, 1.5, 15.375], 56 | "rotation": {"angle": 0, "axis": "y", "origin": [1, 8, 15]}, 57 | "faces": { 58 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 59 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 60 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 61 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 62 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 63 | } 64 | }, 65 | { 66 | "from": [0.65, 1.5, 14.875], 67 | "to": [7.15, 2, 15.375], 68 | "rotation": {"angle": 0, "axis": "y", "origin": [1, 10, 15]}, 69 | "faces": { 70 | "north": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 71 | "east": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 72 | "south": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 73 | "west": {"uv": [0, 0, 0.25, 2], "texture": "#1"}, 74 | "up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"} 75 | } 76 | }, 77 | { 78 | "from": [10, 0.1, 12], 79 | "to": [15, 0.1, 15], 80 | "faces": { 81 | "up": {"uv": [4, 5, 12, 10], "rotation": 180, "texture": "#4"} 82 | } 83 | } 84 | ] 85 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_1.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_1" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_10.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_10" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_11.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_11" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_12.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_12" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_13.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_13" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_14.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_14" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_15.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_15" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_16.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_16" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_17.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_17" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_18.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_18" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_19.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_19" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_2.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_2" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_3.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_3" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_4.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_4" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_5.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_5" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_6.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_6" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_7.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_7" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_8.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_8" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/models/fakeblock/phonos/jukebox_top_stopped_9.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "visualoverhaul:block/phonos/jukebox_top_stopped_0", 3 | "textures": { 4 | "4": "phonos:block/speaker_top_9" 5 | } 6 | } -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/textures/block/vo_jukebox_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/assets/visualoverhaul/textures/block/vo_jukebox_top.png -------------------------------------------------------------------------------- /common/src/main/resources/assets/visualoverhaul/textures/item/music_disc_missing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/assets/visualoverhaul/textures/item/music_disc_missing.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/items/axolotl_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "minecraft:item/axolotl_bucket", 5 | "tints": [ 6 | { 7 | "type": "minecraft:constant", 8 | "value": -1 9 | }, 10 | { 11 | "type": "minecraft:potion", 12 | "default": -1 13 | } 14 | ] 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/items/cod_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "minecraft:item/cod_bucket", 5 | "tints": [ 6 | { 7 | "type": "minecraft:constant", 8 | "value": -1 9 | }, 10 | { 11 | "type": "minecraft:potion", 12 | "default": -1 13 | } 14 | ] 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/items/pufferfish_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "minecraft:item/pufferfish_bucket", 5 | "tints": [ 6 | { 7 | "type": "minecraft:constant", 8 | "value": -1 9 | }, 10 | { 11 | "type": "minecraft:potion", 12 | "default": -1 13 | } 14 | ] 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/items/salmon_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "minecraft:item/salmon_bucket", 5 | "tints": [ 6 | { 7 | "type": "minecraft:constant", 8 | "value": -1 9 | }, 10 | { 11 | "type": "minecraft:potion", 12 | "default": -1 13 | } 14 | ] 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/items/tropical_fish_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "minecraft:item/tropical_fish_bucket", 5 | "tints": [ 6 | { 7 | "type": "minecraft:constant", 8 | "value": -1 9 | }, 10 | { 11 | "type": "minecraft:potion", 12 | "default": -1 13 | } 14 | ] 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/items/water_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "model": { 3 | "type": "minecraft:model", 4 | "model": "minecraft:item/water_bucket", 5 | "tints": [ 6 | { 7 | "type": "minecraft:constant", 8 | "value": -1 9 | }, 10 | { 11 | "type": "minecraft:potion", 12 | "default": -1 13 | } 14 | ] 15 | } 16 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/models/item/axolotl_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer1": "item/axolotl_bucket_overlay", 5 | "layer0": "item/axolotl_bucket" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/models/item/cod_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer1": "item/fish_bucket_overlay", 5 | "layer0": "item/cod_bucket" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/models/item/pufferfish_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer1": "item/pufferfish_bucket_overlay", 5 | "layer0": "item/pufferfish_bucket" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/models/item/salmon_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer1": "item/fish_bucket_overlay", 5 | "layer0": "item/salmon_bucket" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/models/item/tropical_fish_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer1": "item/fish_bucket_overlay", 5 | "layer0": "item/tropical_fish_bucket" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/models/item/water_bucket.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "item/generated", 3 | "textures": { 4 | "layer1": "item/water_bucket_overlay", 5 | "layer0": "item/water_bucket" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/axolotl_bucket_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/axolotl_bucket_overlay.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/fish_bucket_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/fish_bucket_overlay.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/pufferfish_bucket_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/pufferfish_bucket_overlay.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/salmon_bucket_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/salmon_bucket_overlay.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/tropical_fish_bucket_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/tropical_fish_bucket_overlay.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/water_bucket_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/coloredwaterbucket/assets/minecraft/textures/item/water_bucket_overlay.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 15, 4 | "supported_formats": [15, 99], 5 | "description": "§2Makes the water bucket respect biome colors" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/coloredwaterbucket/pack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/coloredwaterbucket/pack.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/blockstates/blast_furnace.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "facing=east,lit=false": { 4 | "model": "minecraft:block/blast_furnace", 5 | "y": 90 6 | }, 7 | "facing=east,lit=true": { 8 | "model": "minecraft:block/blast_furnace_on", 9 | "y": 90 10 | }, 11 | "facing=north,lit=false": { 12 | "model": "minecraft:block/blast_furnace" 13 | }, 14 | "facing=north,lit=true": { 15 | "model": "minecraft:block/blast_furnace_on" 16 | }, 17 | "facing=south,lit=false": { 18 | "model": "minecraft:block/blast_furnace", 19 | "y": 180 20 | }, 21 | "facing=south,lit=true": { 22 | "model": "minecraft:block/blast_furnace_on", 23 | "y": 180 24 | }, 25 | "facing=west,lit=false": { 26 | "model": "minecraft:block/blast_furnace", 27 | "y": 270 28 | }, 29 | "facing=west,lit=true": { 30 | "model": "minecraft:block/blast_furnace_on", 31 | "y": 270 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/blockstates/furnace.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "facing=east,lit=false": { 4 | "model": "minecraft:block/furnace", 5 | "y": 90 6 | }, 7 | "facing=east,lit=true": { 8 | "model": "minecraft:block/furnace_on", 9 | "y": 90 10 | }, 11 | "facing=north,lit=false": { 12 | "model": "minecraft:block/furnace" 13 | }, 14 | "facing=north,lit=true": { 15 | "model": "minecraft:block/furnace_on" 16 | }, 17 | "facing=south,lit=false": { 18 | "model": "minecraft:block/furnace", 19 | "y": 180 20 | }, 21 | "facing=south,lit=true": { 22 | "model": "minecraft:block/furnace_on", 23 | "y": 180 24 | }, 25 | "facing=west,lit=false": { 26 | "model": "minecraft:block/furnace", 27 | "y": 270 28 | }, 29 | "facing=west,lit=true": { 30 | "model": "minecraft:block/furnace_on", 31 | "y": 270 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/blockstates/smoker.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "facing=east,lit=false": { 4 | "model": "minecraft:block/smoker", 5 | "y": 90 6 | }, 7 | "facing=east,lit=true": { 8 | "model": "minecraft:block/smoker_on", 9 | "y": 90 10 | }, 11 | "facing=north,lit=false": { 12 | "model": "minecraft:block/smoker" 13 | }, 14 | "facing=north,lit=true": { 15 | "model": "minecraft:block/smoker_on" 16 | }, 17 | "facing=south,lit=false": { 18 | "model": "minecraft:block/smoker", 19 | "y": 180 20 | }, 21 | "facing=south,lit=true": { 22 | "model": "minecraft:block/smoker_on", 23 | "y": 180 24 | }, 25 | "facing=west,lit=false": { 26 | "model": "minecraft:block/smoker", 27 | "y": 270 28 | }, 29 | "facing=west,lit=true": { 30 | "model": "minecraft:block/smoker_on", 31 | "y": 270 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/materialmaps/block/furnace.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultMap": { 3 | "spriteMap": [ 4 | { 5 | "sprite": "minecraft:block/furnace_front_on", 6 | "material": "canvas:warm_glow" 7 | }, 8 | { 9 | "sprite": "minecraft:block/campfire_fire", 10 | "material": "canvas:warm_glow" 11 | } 12 | ] 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/blast_furnace.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "parent": "block/block", 4 | "textures": { 5 | "0": "block/blast_furnace_front", 6 | "2": "block/blast_furnace_side", 7 | "3": "block/blast_furnace_top", 8 | "particle": "block/blast_furnace_front" 9 | }, 10 | "elements": [ 11 | { 12 | "from": [0, 0, 5], 13 | "to": [16, 16, 16], 14 | "faces": { 15 | "north": {"uv": [8, 0, 9, 16], "texture": "#0"}, 16 | "east": {"uv": [0, 0, 11, 16], "texture": "#2"}, 17 | "south": {"uv": [0, 0, 16, 16], "texture": "#2"}, 18 | "west": {"uv": [5, 0, 16, 16], "texture": "#2"}, 19 | "up": {"uv": [0, 5, 16, 16], "texture": "#3"}, 20 | "down": {"uv": [0, 0, 16, 11], "texture": "#3"} 21 | } 22 | }, 23 | { 24 | "from": [10, 0, 0], 25 | "to": [16, 16, 5], 26 | "faces": { 27 | "north": {"uv": [0, 0, 6, 16], "texture": "#0"}, 28 | "east": {"uv": [11, 0, 16, 16], "texture": "#2"}, 29 | "west": {"uv": [6, 0, 7, 16], "texture": "#0"}, 30 | "up": {"uv": [10, 0, 16, 5], "texture": "#3"}, 31 | "down": {"uv": [10, 11, 16, 16], "texture": "#3"} 32 | } 33 | }, 34 | { 35 | "from": [0, 0, 0], 36 | "to": [5, 16, 5], 37 | "faces": { 38 | "north": {"uv": [11, 0, 16, 16], "texture": "#0"}, 39 | "east": {"uv": [10, 0, 11, 16], "texture": "#0"}, 40 | "west": {"uv": [0, 0, 5, 16], "texture": "#2"}, 41 | "up": {"uv": [0, 0, 5, 5], "texture": "#3"}, 42 | "down": {"uv": [0, 11, 5, 16], "texture": "#3"} 43 | } 44 | }, 45 | { 46 | "from": [5, 8, 0], 47 | "to": [10, 16, 5], 48 | "faces": { 49 | "north": {"uv": [6, 0, 11, 8], "texture": "#0"}, 50 | "up": {"uv": [5, 0, 10, 5], "texture": "#3"}, 51 | "down": {"uv": [6, 8, 7, 13], "texture": "#0"} 52 | } 53 | }, 54 | { 55 | "from": [5, 0, 0], 56 | "to": [10, 5, 5], 57 | "faces": { 58 | "north": {"uv": [6, 11, 11, 16], "texture": "#0"}, 59 | "up": {"uv": [6, 12, 7, 15], "texture": "#2"}, 60 | "down": {"uv": [5, 11, 10, 16], "texture": "#3"} 61 | } 62 | }, 63 | { 64 | "from": [8, 5, 0], 65 | "to": [9, 8, 1], 66 | "faces": { 67 | "north": {"uv": [7, 8, 8, 11], "texture": "#0"}, 68 | "east": {"uv": [7, 8, 8, 11], "texture": "#0"}, 69 | "west": {"uv": [7, 8, 8, 11], "texture": "#0"} 70 | } 71 | }, 72 | { 73 | "from": [9.99, 5, 0], 74 | "to": [9.99, 8, 1], 75 | "faces": { 76 | "west": {"uv": [5, 8, 6, 11], "texture": "#0"} 77 | } 78 | }, 79 | { 80 | "from": [6, 5, 0], 81 | "to": [7, 8, 1], 82 | "faces": { 83 | "north": {"uv": [9, 8, 10, 11], "texture": "#0"}, 84 | "east": {"uv": [9, 8, 10, 11], "texture": "#0"}, 85 | "west": {"uv": [9, 8, 10, 11], "texture": "#0"} 86 | } 87 | }, 88 | { 89 | "from": [5.01, 5, 0], 90 | "to": [5.01, 8, 1], 91 | "faces": { 92 | "east": {"uv": [11, 8, 12, 11], "texture": "#0"} 93 | } 94 | } 95 | ] 96 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/blast_furnace_on.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "parent": "block/block", 4 | "textures": { 5 | "0": "block/blast_furnace_front", 6 | "1": "block/blast_furnace_front_on", 7 | "2": "block/blast_furnace_side", 8 | "3": "block/blast_furnace_top", 9 | "particle": "block/blast_furnace_front" 10 | }, 11 | "elements": [ 12 | { 13 | "from": [0, 0, 5], 14 | "to": [16, 16, 16], 15 | "faces": { 16 | "north": {"uv": [8, 0, 9, 16], "texture": "#1"}, 17 | "east": {"uv": [0, 0, 11, 16], "texture": "#2"}, 18 | "south": {"uv": [0, 0, 16, 16], "texture": "#2"}, 19 | "west": {"uv": [5, 0, 16, 16], "texture": "#2"}, 20 | "up": {"uv": [0, 5, 16, 16], "texture": "#3"}, 21 | "down": {"uv": [0, 0, 16, 11], "texture": "#3"} 22 | } 23 | }, 24 | { 25 | "from": [10, 0, 0], 26 | "to": [16, 16, 5], 27 | "faces": { 28 | "north": {"uv": [0, 0, 6, 16], "texture": "#0"}, 29 | "east": {"uv": [11, 0, 16, 16], "texture": "#2"}, 30 | "west": {"uv": [6, 0, 7, 16], "texture": "#1"}, 31 | "up": {"uv": [10, 0, 16, 5], "texture": "#3"}, 32 | "down": {"uv": [10, 11, 16, 16], "texture": "#3"} 33 | } 34 | }, 35 | { 36 | "from": [0, 0, 0], 37 | "to": [5, 16, 5], 38 | "faces": { 39 | "north": {"uv": [11, 0, 16, 16], "texture": "#0"}, 40 | "east": {"uv": [10, 0, 11, 16], "texture": "#1"}, 41 | "west": {"uv": [0, 0, 5, 16], "texture": "#2"}, 42 | "up": {"uv": [0, 0, 5, 5], "texture": "#3"}, 43 | "down": {"uv": [0, 11, 5, 16], "texture": "#3"} 44 | } 45 | }, 46 | { 47 | "from": [5, 8, 0], 48 | "to": [10, 16, 5], 49 | "faces": { 50 | "north": {"uv": [6, 0, 11, 8], "texture": "#0"}, 51 | "up": {"uv": [5, 0, 10, 5], "texture": "#3"}, 52 | "down": {"uv": [6, 8, 7, 13], "texture": "#1"} 53 | } 54 | }, 55 | { 56 | "from": [5, 0, 0], 57 | "to": [10, 5, 5], 58 | "faces": { 59 | "north": {"uv": [6, 11, 11, 16], "texture": "#0"}, 60 | "up": {"uv": [6, 12, 7, 15], "texture": "#2"}, 61 | "down": {"uv": [5, 11, 10, 16], "texture": "#3"} 62 | } 63 | }, 64 | { 65 | "from": [8, 5, 0], 66 | "to": [9, 8, 1], 67 | "faces": { 68 | "north": {"uv": [7, 8, 8, 11], "texture": "#0"}, 69 | "east": {"uv": [7, 8, 8, 11], "texture": "#0"}, 70 | "west": {"uv": [7, 8, 8, 11], "texture": "#0"} 71 | } 72 | }, 73 | { 74 | "from": [9.99, 5, 0], 75 | "to": [9.99, 8, 1], 76 | "faces": { 77 | "west": {"uv": [5, 8, 6, 11], "texture": "#0"} 78 | } 79 | }, 80 | { 81 | "from": [6, 5, 0], 82 | "to": [7, 8, 1], 83 | "faces": { 84 | "north": {"uv": [9, 8, 10, 11], "texture": "#0"}, 85 | "east": {"uv": [9, 8, 10, 11], "texture": "#0"}, 86 | "west": {"uv": [9, 8, 10, 11], "texture": "#0"} 87 | } 88 | }, 89 | { 90 | "from": [5.01, 5, 0], 91 | "to": [5.01, 8, 1], 92 | "faces": { 93 | "east": {"uv": [11, 8, 12, 11], "texture": "#0"} 94 | } 95 | } 96 | ] 97 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "made by Motschen", 3 | "parent": "block/block", 4 | "textures": { 5 | "0": "block/furnace_front", 6 | "1": "block/furnace_side", 7 | "2": "block/furnace_top", 8 | "3": "block/smooth_stone", 9 | "4": "block/furnace_front", 10 | "5": "block/campfire_fire", 11 | "particle": "block/furnace_front" 12 | }, 13 | "elements": [ 14 | { 15 | "from": [0, 0, 6], 16 | "to": [16, 16, 16], 17 | "faces": { 18 | "north": {"uv": [0, 0, 16, 16], "texture": "#4"}, 19 | "east": {"uv": [0, 0, 10, 16], "texture": "#1"}, 20 | "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, 21 | "west": {"uv": [6, 0, 16, 16], "texture": "#1"}, 22 | "up": {"uv": [0, 6, 16, 16], "texture": "#2"}, 23 | "down": {"uv": [0, 0, 16, 10], "texture": "#3"} 24 | } 25 | }, 26 | { 27 | "from": [13, 0, 0], 28 | "to": [16, 16, 6], 29 | "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -2]}, 30 | "faces": { 31 | "north": {"uv": [0, 0, 3, 16], "texture": "#0"}, 32 | "east": {"uv": [10, 0, 16, 16], "texture": "#1"}, 33 | "west": {"uv": [0, 0, 6, 16], "texture": "#1"}, 34 | "up": {"uv": [13, 0, 16, 6], "texture": "#2"}, 35 | "down": {"uv": [13, 10, 16, 16], "texture": "#3"} 36 | } 37 | }, 38 | { 39 | "from": [12, 11, 0], 40 | "to": [13, 16, 6], 41 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 8, -2]}, 42 | "faces": { 43 | "north": {"uv": [3, 0, 4, 5], "texture": "#0"}, 44 | "west": {"uv": [1, 9, 7, 14], "texture": "#1"}, 45 | "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, 46 | "down": {"uv": [12, 10, 13, 16], "texture": "#3"} 47 | } 48 | }, 49 | { 50 | "from": [3, 11, 0], 51 | "to": [4, 16, 6], 52 | "rotation": {"angle": 0, "axis": "y", "origin": [-4, 8, -2]}, 53 | "faces": { 54 | "north": {"uv": [3, 0, 4, 5], "texture": "#0"}, 55 | "east": {"uv": [1, 9, 7, 14], "texture": "#1"}, 56 | "west": {"uv": [1, 8, 7, 13], "texture": "#1"}, 57 | "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, 58 | "down": {"uv": [3, 10, 4, 16], "texture": "#3"} 59 | } 60 | }, 61 | { 62 | "from": [4, 12, 0], 63 | "to": [12, 16, 6], 64 | "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, -2]}, 65 | "faces": { 66 | "north": {"uv": [4, 0, 12, 4], "texture": "#0"}, 67 | "up": {"uv": [4, 0, 12, 6], "texture": "#2"}, 68 | "down": {"uv": [4, 10, 12, 16], "texture": "#3"} 69 | } 70 | }, 71 | { 72 | "from": [0, 0, 0], 73 | "to": [3, 16, 6], 74 | "rotation": {"angle": 0, "axis": "y", "origin": [-5, 8, -2]}, 75 | "faces": { 76 | "north": {"uv": [13, 0, 16, 16], "texture": "#0"}, 77 | "east": {"uv": [10, 0, 16, 16], "texture": "#1"}, 78 | "west": {"uv": [0, 0, 6, 16], "texture": "#1"}, 79 | "up": {"uv": [0, 0, 3, 6], "texture": "#2"}, 80 | "down": {"uv": [0, 10, 3, 16], "texture": "#3"} 81 | } 82 | }, 83 | { 84 | "from": [12, 3, 0], 85 | "to": [13, 9, 6], 86 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 8, -2]}, 87 | "faces": { 88 | "north": {"uv": [3, 7, 4, 13], "texture": "#0"}, 89 | "west": {"uv": [1, 8, 7, 14], "texture": "#1"}, 90 | "up": {"uv": [3, 0, 4, 6], "texture": "#2"}, 91 | "down": {"uv": [3, 10, 4, 16], "texture": "#3"} 92 | } 93 | }, 94 | { 95 | "from": [3, 3, 0], 96 | "to": [4, 9, 6], 97 | "rotation": {"angle": 0, "axis": "y", "origin": [-4, 8, -2]}, 98 | "faces": { 99 | "north": {"uv": [12, 7, 13, 13], "texture": "#0"}, 100 | "east": {"uv": [9, 8, 15, 14], "texture": "#1"}, 101 | "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, 102 | "down": {"uv": [12, 10, 13, 16], "texture": "#3"} 103 | } 104 | }, 105 | { 106 | "from": [11, 4, 0], 107 | "to": [12, 9, 6], 108 | "rotation": {"angle": 0, "axis": "y", "origin": [4, 8, -2]}, 109 | "faces": { 110 | "north": {"uv": [4, 7, 5, 12], "texture": "#0"}, 111 | "west": {"uv": [1, 9, 7, 14], "texture": "#1"}, 112 | "up": {"uv": [4, 0, 5, 6], "texture": "#2"}, 113 | "down": {"uv": [4, 10, 5, 16], "texture": "#3"} 114 | } 115 | }, 116 | { 117 | "from": [4, 4, 0], 118 | "to": [5, 9, 6], 119 | "rotation": {"angle": 0, "axis": "y", "origin": [-3, 8, -2]}, 120 | "faces": { 121 | "north": {"uv": [11, 7, 12, 12], "texture": "#0"}, 122 | "east": {"uv": [10, 9, 16, 14], "texture": "#1"}, 123 | "up": {"uv": [11, 0, 12, 6], "texture": "#2"}, 124 | "down": {"uv": [11, 10, 12, 16], "texture": "#3"} 125 | } 126 | }, 127 | { 128 | "from": [5, 5, 0], 129 | "to": [11, 9, 6], 130 | "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, -2]}, 131 | "faces": { 132 | "north": {"uv": [5, 7, 11, 11], "texture": "#0"}, 133 | "up": {"uv": [5, 0, 11, 6], "texture": "#2"}, 134 | "down": {"uv": [5, 10, 11, 16], "texture": "#3"} 135 | } 136 | }, 137 | { 138 | "from": [3, 0, 0], 139 | "to": [13, 1, 6], 140 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, -2]}, 141 | "faces": { 142 | "north": {"uv": [3, 15, 13, 16], "texture": "#0"}, 143 | "up": {"uv": [3, 0, 13, 6], "texture": "#2"}, 144 | "down": {"uv": [3, 10, 13, 16], "texture": "#3"} 145 | } 146 | } 147 | ] 148 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/furnace_on.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "made by Motschen", 3 | "parent": "block/block", 4 | "textures": { 5 | "0": "block/furnace_front", 6 | "1": "block/furnace_side", 7 | "2": "block/furnace_top", 8 | "3": "block/smooth_stone", 9 | "4": "block/furnace_front_on", 10 | "5": "block/campfire_fire", 11 | "particle": "block/furnace_front" 12 | }, 13 | "elements": [ 14 | { 15 | "from": [0, 0, 6], 16 | "to": [16, 16, 16], 17 | "faces": { 18 | "north": {"uv": [0, 0, 16, 16], "texture": "#4"}, 19 | "east": {"uv": [0, 0, 10, 16], "texture": "#1"}, 20 | "south": {"uv": [0, 0, 16, 16], "texture": "#1"}, 21 | "west": {"uv": [6, 0, 16, 16], "texture": "#1"}, 22 | "up": {"uv": [0, 6, 16, 16], "texture": "#2"}, 23 | "down": {"uv": [0, 0, 16, 10], "texture": "#3"} 24 | } 25 | }, 26 | { 27 | "from": [13, 0, 0], 28 | "to": [16, 16, 6], 29 | "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -2]}, 30 | "faces": { 31 | "north": {"uv": [0, 0, 3, 16], "texture": "#0"}, 32 | "east": {"uv": [10, 0, 16, 16], "texture": "#1"}, 33 | "west": {"uv": [0, 0, 6, 16], "texture": "#1"}, 34 | "up": {"uv": [13, 0, 16, 6], "texture": "#2"}, 35 | "down": {"uv": [13, 10, 16, 16], "texture": "#3"} 36 | } 37 | }, 38 | { 39 | "from": [12, 11, 0], 40 | "to": [13, 16, 6], 41 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 8, -2]}, 42 | "faces": { 43 | "north": {"uv": [3, 0, 4, 5], "texture": "#0"}, 44 | "west": {"uv": [1, 9, 7, 14], "texture": "#1"}, 45 | "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, 46 | "down": {"uv": [12, 10, 13, 16], "texture": "#3"} 47 | } 48 | }, 49 | { 50 | "from": [3, 11, 0], 51 | "to": [4, 16, 6], 52 | "rotation": {"angle": 0, "axis": "y", "origin": [-4, 8, -2]}, 53 | "faces": { 54 | "north": {"uv": [3, 0, 4, 5], "texture": "#0"}, 55 | "east": {"uv": [1, 9, 7, 14], "texture": "#1"}, 56 | "west": {"uv": [1, 8, 7, 13], "texture": "#1"}, 57 | "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, 58 | "down": {"uv": [3, 10, 4, 16], "texture": "#3"} 59 | } 60 | }, 61 | { 62 | "from": [4, 12, 0], 63 | "to": [12, 16, 6], 64 | "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, -2]}, 65 | "faces": { 66 | "north": {"uv": [4, 0, 12, 4], "texture": "#0"}, 67 | "up": {"uv": [4, 0, 12, 6], "texture": "#2"}, 68 | "down": {"uv": [4, 10, 12, 16], "texture": "#3"} 69 | } 70 | }, 71 | { 72 | "from": [0, 0, 0], 73 | "to": [3, 16, 6], 74 | "rotation": {"angle": 0, "axis": "y", "origin": [-5, 8, -2]}, 75 | "faces": { 76 | "north": {"uv": [13, 0, 16, 16], "texture": "#0"}, 77 | "east": {"uv": [10, 0, 16, 16], "texture": "#1"}, 78 | "west": {"uv": [0, 0, 6, 16], "texture": "#1"}, 79 | "up": {"uv": [0, 0, 3, 6], "texture": "#2"}, 80 | "down": {"uv": [0, 10, 3, 16], "texture": "#3"} 81 | } 82 | }, 83 | { 84 | "from": [12, 3, 0], 85 | "to": [13, 9, 6], 86 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 8, -2]}, 87 | "faces": { 88 | "north": {"uv": [3, 7, 4, 13], "texture": "#0"}, 89 | "west": {"uv": [1, 8, 7, 14], "texture": "#1"}, 90 | "up": {"uv": [3, 0, 4, 6], "texture": "#2"}, 91 | "down": {"uv": [3, 10, 4, 16], "texture": "#3"} 92 | } 93 | }, 94 | { 95 | "from": [3, 3, 0], 96 | "to": [4, 9, 6], 97 | "rotation": {"angle": 0, "axis": "y", "origin": [-4, 8, -2]}, 98 | "faces": { 99 | "north": {"uv": [12, 7, 13, 13], "texture": "#0"}, 100 | "east": {"uv": [9, 8, 15, 14], "texture": "#1"}, 101 | "up": {"uv": [12, 0, 13, 6], "texture": "#2"}, 102 | "down": {"uv": [12, 10, 13, 16], "texture": "#3"} 103 | } 104 | }, 105 | { 106 | "from": [11, 4, 0], 107 | "to": [12, 9, 6], 108 | "rotation": {"angle": 0, "axis": "y", "origin": [4, 8, -2]}, 109 | "faces": { 110 | "north": {"uv": [4, 7, 5, 12], "texture": "#0"}, 111 | "west": {"uv": [1, 9, 7, 14], "texture": "#1"}, 112 | "up": {"uv": [4, 0, 5, 6], "texture": "#2"}, 113 | "down": {"uv": [4, 10, 5, 16], "texture": "#3"} 114 | } 115 | }, 116 | { 117 | "from": [4, 4, 0], 118 | "to": [5, 9, 6], 119 | "rotation": {"angle": 0, "axis": "y", "origin": [-3, 8, -2]}, 120 | "faces": { 121 | "north": {"uv": [11, 7, 12, 12], "texture": "#0"}, 122 | "east": {"uv": [10, 9, 16, 14], "texture": "#1"}, 123 | "up": {"uv": [11, 0, 12, 6], "texture": "#2"}, 124 | "down": {"uv": [11, 10, 12, 16], "texture": "#3"} 125 | } 126 | }, 127 | { 128 | "from": [5, 5, 0], 129 | "to": [11, 9, 6], 130 | "rotation": {"angle": 0, "axis": "y", "origin": [3, 8, -2]}, 131 | "faces": { 132 | "north": {"uv": [5, 7, 11, 11], "texture": "#0"}, 133 | "up": {"uv": [5, 0, 11, 6], "texture": "#2"}, 134 | "down": {"uv": [5, 10, 11, 16], "texture": "#3"} 135 | } 136 | }, 137 | { 138 | "from": [3, 0, 0], 139 | "to": [13, 1, 6], 140 | "rotation": {"angle": 0, "axis": "y", "origin": [5, 5, -2]}, 141 | "faces": { 142 | "north": {"uv": [3, 15, 13, 16], "texture": "#0"}, 143 | "up": {"uv": [3, 0, 13, 6], "texture": "#2"}, 144 | "down": {"uv": [3, 10, 13, 16], "texture": "#3"} 145 | } 146 | }, 147 | { 148 | "from": [4, 1, 2], 149 | "to": [12, 3, 2], 150 | "rotation": {"angle": 0, "axis": "y", "origin": [14, 9, 10]}, 151 | "faces": { 152 | "north": {"uv": [4, 0, 12, 2], "texture": "#5"} 153 | } 154 | } 155 | ] 156 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/smoker.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "parent": "block/block", 4 | "textures": { 5 | "0": "block/smoker_front", 6 | "1": "block/smoker_bottom", 7 | "2": "block/smoker_top", 8 | "3": "block/smoker_side", 9 | "4": "block/smoker_front_on", 10 | "particle": "block/smoker_front" 11 | }, 12 | "elements": [ 13 | { 14 | "from": [0, 12, 0], 15 | "to": [16, 16, 16], 16 | "faces": { 17 | "north": {"uv": [0, 0, 16, 4], "texture": "#0"}, 18 | "east": {"uv": [0, 0, 16, 4], "texture": "#3"}, 19 | "south": {"uv": [0, 0, 16, 4], "texture": "#3"}, 20 | "west": {"uv": [0, 0, 16, 4], "texture": "#3"}, 21 | "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, 22 | "down": {"uv": [0, 0, 16, 16], "texture": "#1"} 23 | } 24 | }, 25 | { 26 | "from": [0, 0, 0], 27 | "to": [16, 2, 16], 28 | "faces": { 29 | "north": {"uv": [0, 14, 16, 16], "texture": "#4"}, 30 | "east": {"uv": [0, 14, 16, 16], "texture": "#3"}, 31 | "south": {"uv": [0, 14, 16, 16], "texture": "#3"}, 32 | "west": {"uv": [0, 14, 16, 16], "texture": "#3"}, 33 | "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, 34 | "down": {"uv": [0, 0, 16, 16], "texture": "#1"} 35 | } 36 | }, 37 | { 38 | "from": [14, 2, 0], 39 | "to": [16, 12, 16], 40 | "faces": { 41 | "north": {"uv": [0, 4, 2, 14], "texture": "#0"}, 42 | "east": {"uv": [0, 4, 16, 14], "texture": "#3"}, 43 | "south": {"uv": [14, 4, 16, 14], "texture": "#3"}, 44 | "west": {"uv": [0, 0, 16, 10], "texture": "#1"} 45 | } 46 | }, 47 | { 48 | "from": [0, 2, 0], 49 | "to": [2, 12, 16], 50 | "faces": { 51 | "north": {"uv": [14, 4, 16, 14], "texture": "#0"}, 52 | "east": {"uv": [0, 0, 16, 10], "texture": "#1"}, 53 | "south": {"uv": [0, 4, 2, 14], "texture": "#3"}, 54 | "west": {"uv": [0, 4, 16, 14], "texture": "#3"} 55 | } 56 | }, 57 | { 58 | "from": [13, 8, 0], 59 | "to": [14, 12, 1], 60 | "faces": { 61 | "north": {"uv": [2, 4, 3, 8], "texture": "#4"}, 62 | "west": {"uv": [4, 4, 5, 8], "texture": "#0"} 63 | } 64 | }, 65 | { 66 | "from": [12, 8, 0], 67 | "to": [13, 9, 1], 68 | "faces": { 69 | "north": {"uv": [3, 7, 4, 8], "texture": "#4"}, 70 | "west": {"uv": [3, 7, 4, 8], "texture": "#4"} 71 | } 72 | }, 73 | { 74 | "from": [12, 11, 0], 75 | "to": [13, 12, 1], 76 | "faces": { 77 | "north": {"uv": [3, 4, 4, 5], "texture": "#4"}, 78 | "west": {"uv": [3, 4, 4, 5], "texture": "#4"} 79 | } 80 | }, 81 | { 82 | "from": [2, 8, 0], 83 | "to": [4, 12, 1], 84 | "faces": { 85 | "north": {"uv": [12, 4, 14, 8], "texture": "#0"}, 86 | "east": {"uv": [12, 4, 13, 8], "texture": "#0"} 87 | } 88 | }, 89 | { 90 | "from": [2, 8, 1], 91 | "to": [4, 12, 6], 92 | "faces": { 93 | "east": {"uv": [3, 3, 8, 7], "texture": "#1"} 94 | } 95 | }, 96 | { 97 | "from": [11, 8, 1], 98 | "to": [14, 12, 6], 99 | "faces": { 100 | "north": {"uv": [2, 4, 5, 8], "texture": "#1"}, 101 | "east": {"uv": [3, 3, 8, 7], "texture": "#1"}, 102 | "west": {"uv": [5, 4, 10, 8], "texture": "#1"} 103 | } 104 | }, 105 | { 106 | "from": [2, 7, 0], 107 | "to": [14, 8, 8], 108 | "faces": { 109 | "north": {"uv": [2, 8, 14, 9], "texture": "#0"}, 110 | "up": {"uv": [2, 8, 14, 12], "texture": "#1"}, 111 | "down": {"uv": [2, 5, 14, 9], "texture": "#1"} 112 | } 113 | }, 114 | { 115 | "from": [2, 7, 6], 116 | "to": [14, 12, 16], 117 | "faces": { 118 | "north": {"uv": [2, 4, 14, 9], "texture": "#0"}, 119 | "south": {"uv": [2, 4, 14, 9], "texture": "#3"} 120 | } 121 | }, 122 | { 123 | "from": [2, 1, 5], 124 | "to": [14, 7, 16], 125 | "faces": { 126 | "north": {"uv": [5, 5, 12, 8], "texture": "#0"}, 127 | "south": {"uv": [2, 9, 14, 15], "texture": "#3"} 128 | } 129 | }, 130 | { 131 | "from": [4.9, 10, -5], 132 | "to": [12.9, 12, -4], 133 | "rotation": {"angle": -22.5, "axis": "y", "origin": [0.9, 0, -4.6]}, 134 | "faces": { 135 | "north": {"uv": [4, 4, 12, 6], "texture": "#4"}, 136 | "east": {"uv": [4, 4, 5, 6], "texture": "#4"}, 137 | "south": {"uv": [4, 4, 12, 6], "texture": "#4"}, 138 | "west": {"uv": [11, 4, 12, 6], "texture": "#4"}, 139 | "up": {"uv": [4, 4, 12, 5], "texture": "#4"} 140 | } 141 | }, 142 | { 143 | "from": [4.9, 8, -5], 144 | "to": [12.9, 10, -4], 145 | "rotation": {"angle": -22.5, "axis": "y", "origin": [0.9, -2, -4.6]}, 146 | "faces": { 147 | "north": {"uv": [4, 4, 12, 6], "rotation": 180, "texture": "#4"}, 148 | "east": {"uv": [4, 4, 5, 6], "rotation": 180, "texture": "#4"}, 149 | "south": {"uv": [4, 4, 12, 6], "rotation": 180, "texture": "#4"}, 150 | "west": {"uv": [11, 4, 12, 6], "rotation": 180, "texture": "#4"}, 151 | "up": {"uv": [4, 4, 12, 5], "texture": "#4"}, 152 | "down": {"uv": [4, 5, 12, 6], "texture": "#4"} 153 | } 154 | }, 155 | { 156 | "from": [12.9, 9, -4.9], 157 | "to": [13.9, 11, -3.9], 158 | "rotation": {"angle": -22.5, "axis": "y", "origin": [0.9, 0, -4.6]}, 159 | "faces": { 160 | "north": {"uv": [3, 5, 4, 7], "texture": "#4"}, 161 | "south": {"uv": [3, 5, 4, 7], "texture": "#4"}, 162 | "up": {"uv": [3, 5, 4, 6], "texture": "#4"}, 163 | "down": {"uv": [3, 6, 4, 7], "texture": "#4"} 164 | } 165 | } 166 | ], 167 | "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 168 | { 169 | "name": "group", 170 | "origin": [0, 0, 0], 171 | "children": [13, 14, 15] 172 | } 173 | ] 174 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/assets/minecraft/models/block/smoker_on.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "parent": "block/block", 4 | "textures": { 5 | "0": "block/smoker_front", 6 | "1": "block/smoker_bottom", 7 | "2": "block/smoker_top", 8 | "3": "block/smoker_side", 9 | "4": "block/smoker_front_on", 10 | "particle": "block/smoker_front" 11 | }, 12 | "elements": [ 13 | { 14 | "from": [0, 12, 0], 15 | "to": [16, 16, 16], 16 | "faces": { 17 | "north": {"uv": [0, 0, 16, 4], "texture": "#0"}, 18 | "east": {"uv": [0, 0, 16, 4], "texture": "#3"}, 19 | "south": {"uv": [0, 0, 16, 4], "texture": "#3"}, 20 | "west": {"uv": [0, 0, 16, 4], "texture": "#3"}, 21 | "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, 22 | "down": {"uv": [0, 0, 16, 16], "texture": "#1"} 23 | } 24 | }, 25 | { 26 | "from": [0, 0, 0], 27 | "to": [16, 2, 16], 28 | "faces": { 29 | "north": {"uv": [0, 14, 16, 16], "texture": "#4"}, 30 | "east": {"uv": [0, 14, 16, 16], "texture": "#3"}, 31 | "south": {"uv": [0, 14, 16, 16], "texture": "#3"}, 32 | "west": {"uv": [0, 14, 16, 16], "texture": "#3"}, 33 | "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, 34 | "down": {"uv": [0, 0, 16, 16], "texture": "#1"} 35 | } 36 | }, 37 | { 38 | "from": [14, 2, 0], 39 | "to": [16, 12, 16], 40 | "faces": { 41 | "north": {"uv": [0, 4, 2, 14], "texture": "#0"}, 42 | "east": {"uv": [0, 4, 16, 14], "texture": "#3"}, 43 | "south": {"uv": [14, 4, 16, 14], "texture": "#3"}, 44 | "west": {"uv": [0, 0, 16, 10], "texture": "#1"} 45 | } 46 | }, 47 | { 48 | "from": [0, 2, 0], 49 | "to": [2, 12, 16], 50 | "faces": { 51 | "north": {"uv": [14, 4, 16, 14], "texture": "#0"}, 52 | "east": {"uv": [0, 0, 16, 10], "texture": "#1"}, 53 | "south": {"uv": [0, 4, 2, 14], "texture": "#3"}, 54 | "west": {"uv": [0, 4, 16, 14], "texture": "#3"} 55 | } 56 | }, 57 | { 58 | "from": [13, 8, 0], 59 | "to": [14, 12, 1], 60 | "faces": { 61 | "north": {"uv": [2, 4, 3, 8], "texture": "#4"}, 62 | "west": {"uv": [4, 4, 5, 8], "texture": "#0"} 63 | } 64 | }, 65 | { 66 | "from": [12, 8, 0], 67 | "to": [13, 9, 1], 68 | "faces": { 69 | "north": {"uv": [3, 7, 4, 8], "texture": "#4"}, 70 | "west": {"uv": [3, 7, 4, 8], "texture": "#4"} 71 | } 72 | }, 73 | { 74 | "from": [12, 11, 0], 75 | "to": [13, 12, 1], 76 | "faces": { 77 | "north": {"uv": [3, 4, 4, 5], "texture": "#4"}, 78 | "west": {"uv": [3, 4, 4, 5], "texture": "#4"} 79 | } 80 | }, 81 | { 82 | "from": [2, 8, 0], 83 | "to": [4, 12, 1], 84 | "faces": { 85 | "north": {"uv": [12, 4, 14, 8], "texture": "#0"}, 86 | "east": {"uv": [12, 4, 13, 8], "texture": "#0"} 87 | } 88 | }, 89 | { 90 | "from": [2, 8, 1], 91 | "to": [4, 12, 6], 92 | "faces": { 93 | "east": {"uv": [3, 3, 8, 7], "texture": "#1"} 94 | } 95 | }, 96 | { 97 | "from": [11, 8, 1], 98 | "to": [14, 12, 6], 99 | "faces": { 100 | "north": {"uv": [2, 4, 5, 8], "texture": "#1"}, 101 | "east": {"uv": [3, 3, 8, 7], "texture": "#1"}, 102 | "west": {"uv": [5, 4, 10, 8], "texture": "#1"} 103 | } 104 | }, 105 | { 106 | "from": [2, 7, 0], 107 | "to": [14, 8, 8], 108 | "faces": { 109 | "north": {"uv": [2, 8, 14, 9], "texture": "#0"}, 110 | "up": {"uv": [2, 8, 14, 12], "texture": "#1"}, 111 | "down": {"uv": [2, 5, 14, 9], "texture": "#1"} 112 | } 113 | }, 114 | { 115 | "from": [2, 7, 6], 116 | "to": [14, 12, 16], 117 | "faces": { 118 | "north": {"uv": [2, 4, 14, 9], "texture": "#0"}, 119 | "south": {"uv": [2, 4, 14, 9], "texture": "#3"} 120 | } 121 | }, 122 | { 123 | "from": [2, 1, 5], 124 | "to": [14, 7, 16], 125 | "faces": { 126 | "north": {"uv": [2, 9, 14, 15], "texture": "#4"}, 127 | "south": {"uv": [2, 9, 14, 15], "texture": "#3"} 128 | } 129 | }, 130 | { 131 | "from": [4, 8, -0.4], 132 | "to": [12, 12, 0.6], 133 | "faces": { 134 | "north": {"uv": [4, 4, 12, 8], "texture": "#4"}, 135 | "east": {"uv": [4, 4, 5, 8], "texture": "#4"}, 136 | "west": {"uv": [11, 4, 12, 8], "texture": "#4"}, 137 | "up": {"uv": [4, 4, 12, 5], "texture": "#4"}, 138 | "down": {"uv": [4, 7, 12, 8], "texture": "#4"} 139 | } 140 | }, 141 | { 142 | "from": [12, 9, -0.3], 143 | "to": [13, 11, 0.7], 144 | "faces": { 145 | "north": {"uv": [3, 5, 4, 7], "texture": "#4"}, 146 | "east": {"uv": [3, 5, 4, 7], "texture": "#4"}, 147 | "west": {"uv": [3, 5, 4, 7], "texture": "#4"}, 148 | "up": {"uv": [3, 5, 4, 6], "texture": "#4"}, 149 | "down": {"uv": [3, 6, 4, 7], "texture": "#4"} 150 | } 151 | } 152 | ] 153 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 15, 4 | "supported_formats": [15, 99], 5 | "description": "§2Changes the model of the furnace to be 3D" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/fancyfurnace/pack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/fancyfurnace/pack.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/nobrewingbottles/assets/minecraft/models/block/brewing_stand_bottle0.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "particle": "block/brewing_stand", 5 | "stand": "block/brewing_stand" 6 | }, 7 | "elements": [ 8 | { 9 | "from": [8, 0, 8], 10 | "to": [11, 16, 8], 11 | "faces": { 12 | "north": {"uv": [5, 0, 8, 16], "texture": "#stand"}, 13 | "south": {"uv": [8, 0, 5, 16], "texture": "#stand"} 14 | } 15 | }, 16 | { 17 | "from": [11, 8, 8], 18 | "to": [16, 16, 8], 19 | "faces": { 20 | "north": {"uv": [0, 0, 5, 8], "texture": "#stand"}, 21 | "south": {"uv": [5, 0, 0, 8], "texture": "#stand"} 22 | } 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/nobrewingbottles/assets/minecraft/models/block/brewing_stand_bottle1.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "particle": "block/brewing_stand", 5 | "stand": "block/brewing_stand" 6 | }, 7 | "elements": [ 8 | { 9 | "from": [4.59, 0, 8], 10 | "to": [7.59, 16, 8], 11 | "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, 12 | "faces": { 13 | "north": {"uv": [8, 0, 5, 16], "texture": "#stand"}, 14 | "south": {"uv": [5, 0, 8, 16], "texture": "#stand"} 15 | } 16 | }, 17 | { 18 | "from": [-0.41, 8, 8], 19 | "to": [4.59, 16, 8], 20 | "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, 21 | "faces": { 22 | "north": {"uv": [5, 0, 0, 8], "texture": "#stand"}, 23 | "south": {"uv": [0, 0, 5, 8], "texture": "#stand"} 24 | } 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/nobrewingbottles/assets/minecraft/models/block/brewing_stand_bottle2.json: -------------------------------------------------------------------------------- 1 | { 2 | "credit": "Made with Blockbench", 3 | "textures": { 4 | "particle": "block/brewing_stand", 5 | "stand": "block/brewing_stand" 6 | }, 7 | "elements": [ 8 | { 9 | "from": [4.59, 0, 8], 10 | "to": [7.59, 16, 8], 11 | "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, 12 | "faces": { 13 | "north": {"uv": [8, 0, 5, 16], "texture": "#stand"}, 14 | "south": {"uv": [5, 0, 8, 16], "texture": "#stand"} 15 | } 16 | }, 17 | { 18 | "from": [-0.41, 8, 8], 19 | "to": [4.59, 16, 8], 20 | "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, 21 | "faces": { 22 | "north": {"uv": [5, 0, 0, 8], "texture": "#stand"}, 23 | "south": {"uv": [0, 0, 5, 8], "texture": "#stand"} 24 | } 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/nobrewingbottles/assets/minecraft/textures/block/brewing_stand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/nobrewingbottles/assets/minecraft/textures/block/brewing_stand.png -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/nobrewingbottles/pack.mcmeta: -------------------------------------------------------------------------------- 1 | { 2 | "pack": { 3 | "pack_format": 15, 4 | "supported_formats": [15, 99], 5 | "description": "§2Removes the bottles from the brewing stand" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /common/src/main/resources/resourcepacks/nobrewingbottles/pack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/common/src/main/resources/resourcepacks/nobrewingbottles/pack.png -------------------------------------------------------------------------------- /common/src/main/resources/visualoverhaul.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "eu.midnightdust.visualoverhaul.mixin", 4 | "compatibilityLevel": "JAVA_17", 5 | "minVersion": "0.8", 6 | "mixins": [ 7 | "MixinJukeboxBlockEntity" 8 | ], 9 | "client": [ 10 | "ItemRenderStateAccessor", 11 | "MixinBlastFurnaceBlock", 12 | "MixinConstantTintSource", 13 | "MixinGrassTintSource", 14 | "MixinPotionTintSource", 15 | "MixinPressableWidget", 16 | "MixinSliderWidget", 17 | "MixinSmokerBlock", 18 | "MixinSoundSystem", 19 | "TextureManagerAccessor" 20 | ], 21 | "injectors": { 22 | "defaultRequire": 1 23 | } 24 | } -------------------------------------------------------------------------------- /fabric-like/build.gradle: -------------------------------------------------------------------------------- 1 | architectury { 2 | injectInjectables = false 3 | common(rootProject.enabled_platforms.split(",")) 4 | } 5 | repositories { 6 | flatDir { dirs 'localMaven'} 7 | } 8 | 9 | loom { 10 | } 11 | 12 | dependencies { 13 | modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" 14 | modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" 15 | // Remove the next line if you don't want to depend on the API 16 | //modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" 17 | modCompileOnlyApi "maven.modrinth:phonos:${rootProject.phonos_version}" 18 | 19 | compileClasspath(project(path: ":common", configuration: "namedElements")) { transitive false } 20 | } 21 | -------------------------------------------------------------------------------- /fabric-like/localMaven/phonos-0.3.0+1.19.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/fabric-like/localMaven/phonos-0.3.0+1.19.2.jar -------------------------------------------------------------------------------- /fabric-like/src/main/java/eu/midnightdust/visualoverhaul/compat/phonos/block/RadioJukeboxTop.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.compat.phonos.block; 2 | 3 | import io.github.foundationgames.phonos.block.PhonosBlocks; 4 | import io.github.foundationgames.phonos.block.RadioJukeboxBlock; 5 | import net.minecraft.block.AbstractBlock; 6 | import net.minecraft.block.Block; 7 | import net.minecraft.block.BlockState; 8 | import net.minecraft.state.StateManager; 9 | import net.minecraft.state.property.BooleanProperty; 10 | import net.minecraft.state.property.IntProperty; 11 | 12 | public class RadioJukeboxTop extends Block { 13 | public static final BooleanProperty PLAYING = RadioJukeboxBlock.PLAYING; 14 | public static final IntProperty CHANNEL = RadioJukeboxBlock.CHANNEL; 15 | 16 | public RadioJukeboxTop() { 17 | super(AbstractBlock.Settings.copy(PhonosBlocks.RADIO_JUKEBOX)); 18 | this.setDefaultState(this.stateManager.getDefaultState()); 19 | } 20 | 21 | @Override 22 | protected void appendProperties(StateManager.Builder builder) { 23 | builder.add(PLAYING, CHANNEL); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /fabric-like/src/main/java/eu/midnightdust/visualoverhaul/compat/phonos/block/renderer/RadioJukeboxBlockEntityRenderer.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.compat.phonos.block.renderer; 2 | 3 | import eu.midnightdust.visualoverhaul.compat.phonos.block.RadioJukeboxTop; 4 | import eu.midnightdust.visualoverhaul.compat.phonos.init.PhonosCompatInit; 5 | import eu.midnightdust.visualoverhaul.config.VOConfig; 6 | import io.github.foundationgames.phonos.block.RadioJukeboxBlock; 7 | import io.github.foundationgames.phonos.block.entity.RadioJukeboxBlockEntity; 8 | import net.fabricmc.api.EnvType; 9 | import net.fabricmc.api.Environment; 10 | import net.minecraft.block.BlockState; 11 | import net.minecraft.block.Blocks; 12 | import net.minecraft.client.MinecraftClient; 13 | import net.minecraft.client.render.RenderLayer; 14 | import net.minecraft.client.render.VertexConsumerProvider; 15 | import net.minecraft.client.render.WorldRenderer; 16 | import net.minecraft.client.render.block.entity.BlockEntityRenderer; 17 | import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; 18 | import net.minecraft.client.render.model.json.ModelTransformation; 19 | import net.minecraft.client.util.math.MatrixStack; 20 | import net.minecraft.item.ItemStack; 21 | import net.minecraft.util.math.BlockPos; 22 | import net.minecraft.util.math.random.Random; 23 | import org.joml.Vector3f; 24 | 25 | @Environment(EnvType.CLIENT) 26 | public class RadioJukeboxBlockEntityRenderer implements BlockEntityRenderer { 27 | private ItemStack record; 28 | private float rotation = 0; 29 | private BlockState blockState; 30 | private final MinecraftClient client = MinecraftClient.getInstance(); 31 | 32 | public RadioJukeboxBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) { 33 | super(); 34 | } 35 | 36 | @Override 37 | public void render(RadioJukeboxBlockEntity jukebox, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { 38 | if (VOConfig.jukebox && client.world != null) { 39 | // matrices.push(); 40 | // Vector3f vecPos = matrices.peek().getNormalMatrix().decomposeLinearTransformation().getMiddle(); 41 | // BlockPos pos = new BlockPos(vecPos.getX(), vecPos.getY(), vecPos.getZ()); 42 | // int lightAbove = WorldRenderer.getLightmapCoordinates(client.world, pos.up()); 43 | // 44 | // // Tries to get the disc using the serverside method 45 | // if (jukebox.getStack(jukebox.getPlayingSong()) != ItemStack.EMPTY) { 46 | // record = jukebox.getStack(jukebox.getPlayingSong()).copy(); 47 | // record.setCount(2); 48 | // } 49 | // // If the sound is stopped or no sound is playing, the stack is set to an empty stack // 50 | // else { 51 | // record = ItemStack.EMPTY; 52 | // } 53 | // 54 | // matrices.translate(0.5f, 1.03f, 0.5f); 55 | // matrices.scale(0.75f, 0.75f, 0.75f); 56 | // 57 | // if (jukebox.isPlaying()) { 58 | // rotation = (client.world.getTime() + tickDelta) * 4; 59 | // } 60 | // matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(rotation)); 61 | // client.getItemRenderer().renderItem(record, ModelTransformation.Mode.GROUND, lightAbove, overlay, matrices, vertexConsumers, 0); 62 | // 63 | // matrices.pop(); 64 | // if (VOConfig.jukebox_fake_block && client.world.getBlockState(pos.up()).getBlock() == Blocks.AIR) { 65 | // blockState = client.world.getBlockState(pos); 66 | // matrices.push(); 67 | // matrices.translate(0f, 1f, 0f); 68 | // if (record == ItemStack.EMPTY) { 69 | // client.getBlockRenderManager().renderBlock(PhonosCompatInit.RadioJukeboxTop.getDefaultState().with(RadioJukeboxTop.PLAYING, false).with(RadioJukeboxTop.CHANNEL, blockState.get(RadioJukeboxBlock.CHANNEL)), pos.up(), client.world, matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create()); 70 | // } else { 71 | // client.getBlockRenderManager().renderBlock(PhonosCompatInit.RadioJukeboxTop.getDefaultState().with(RadioJukeboxTop.PLAYING, true).with(RadioJukeboxTop.CHANNEL, blockState.get(RadioJukeboxBlock.CHANNEL)), pos.up(), client.world, matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create()); 72 | // } 73 | // matrices.pop(); 74 | // } 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /fabric-like/src/main/java/eu/midnightdust/visualoverhaul/compat/phonos/init/PhonosCompatInit.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.compat.phonos.init; 2 | 3 | import eu.midnightdust.visualoverhaul.compat.phonos.block.RadioJukeboxTop; 4 | import eu.midnightdust.visualoverhaul.compat.phonos.block.renderer.RadioJukeboxBlockEntityRenderer; 5 | import io.github.foundationgames.phonos.block.PhonosBlocks; 6 | import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; 7 | import net.minecraft.block.Block; 8 | import net.minecraft.client.render.RenderLayer; 9 | import net.minecraft.client.render.block.entity.BlockEntityRendererFactories; 10 | import net.minecraft.registry.Registries; 11 | import net.minecraft.registry.Registry; 12 | import net.minecraft.util.Identifier; 13 | 14 | public class PhonosCompatInit { 15 | public static Block RadioJukeboxTop = new RadioJukeboxTop(); 16 | 17 | public static void init() { 18 | Registry.register(Registries.BLOCK, new Identifier("visualoverhaul","radio_jukebox_top"), RadioJukeboxTop); 19 | 20 | BlockRenderLayerMap.INSTANCE.putBlock(PhonosBlocks.RADIO_JUKEBOX, RenderLayer.getCutout()); 21 | BlockRenderLayerMap.INSTANCE.putBlock(RadioJukeboxTop, RenderLayer.getCutout()); 22 | BlockEntityRendererFactories.register(PhonosBlocks.RADIO_JUKEBOX_ENTITY, RadioJukeboxBlockEntityRenderer::new); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /fabric/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.github.johnrengelman.shadow" 3 | id "me.shedaniel.unified-publishing" 4 | } 5 | 6 | architectury { 7 | platformSetupLoomIde() 8 | fabric() 9 | } 10 | 11 | loom { 12 | } 13 | repositories { 14 | maven { url "https://api.modrinth.com/maven" } 15 | } 16 | 17 | configurations { 18 | common 19 | shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. 20 | compileClasspath.extendsFrom common 21 | runtimeClasspath.extendsFrom common 22 | developmentFabric.extendsFrom common 23 | archivesBaseName = rootProject.archives_base_name + "-fabric" 24 | } 25 | 26 | dependencies { 27 | modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" 28 | modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" 29 | // Remove the next line if you don't want to depend on the API 30 | //modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" 31 | modImplementation "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric" 32 | include "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-fabric" 33 | 34 | common(project(path: ":common", configuration: "namedElements")) { transitive false } 35 | shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } 36 | //common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false } 37 | //shadowCommon(project(path: ":fabric-like", configuration: "transformProductionFabric")) { transitive false } 38 | } 39 | 40 | processResources { 41 | inputs.property "version", project.version 42 | 43 | filesMatching("fabric.mod.json") { 44 | expand "version": project.version 45 | } 46 | } 47 | 48 | 49 | shadowJar { 50 | exclude "architectury.common.json" 51 | 52 | configurations = [project.configurations.shadowCommon] 53 | archiveClassifier = "dev-shadow" 54 | } 55 | 56 | remapJar { 57 | injectAccessWidener = true 58 | input.set shadowJar.archiveFile 59 | dependsOn shadowJar 60 | } 61 | 62 | sourcesJar { 63 | def commonSources = project(":common").sourcesJar 64 | dependsOn commonSources 65 | from commonSources.archiveFile.map { zipTree(it) } 66 | } 67 | 68 | components.java { 69 | withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { 70 | skip() 71 | } 72 | } 73 | 74 | unifiedPublishing { 75 | project { 76 | displayName = "VisualOverhaul v$project.version - Fabric $project.minecraft_version" 77 | releaseType = "$project.release_type" 78 | changelog = releaseChangelog() 79 | gameVersions = [] 80 | gameLoaders = ["fabric","quilt"] 81 | mainPublication remapJar 82 | relations { 83 | depends { 84 | curseforge = "fabric-api" 85 | modrinth = "fabric-api" 86 | } 87 | includes { 88 | curseforge = "midnightlib" 89 | modrinth = "midnightlib" 90 | } 91 | } 92 | 93 | var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN") 94 | if (CURSEFORGE_TOKEN != null) { 95 | curseforge { 96 | token = CURSEFORGE_TOKEN 97 | id = rootProject.curseforge_id 98 | gameVersions.addAll "Java 21", project.minecraft_version 99 | } 100 | } 101 | 102 | var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN") 103 | if (MODRINTH_TOKEN != null) { 104 | modrinth { 105 | token = MODRINTH_TOKEN 106 | id = rootProject.modrinth_id 107 | version = "$project.version-$project.name" 108 | gameVersions.addAll project.minecraft_version 109 | } 110 | } 111 | } 112 | } -------------------------------------------------------------------------------- /fabric/src/main/java/eu/midnightdust/visualoverhaul/fabric/VisualOverhaulFabric.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.fabric; 2 | 3 | import eu.midnightdust.visualoverhaul.packet.HelloPacket; 4 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 5 | import net.fabricmc.api.ModInitializer; 6 | import net.fabricmc.fabric.api.networking.v1.*; 7 | 8 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.playersWithMod; 9 | 10 | public class VisualOverhaulFabric implements ModInitializer { 11 | 12 | @Override 13 | public void onInitialize() { 14 | PayloadTypeRegistry.playC2S().register(HelloPacket.PACKET_ID, HelloPacket.codec); 15 | PayloadTypeRegistry.playS2C().register(UpdateItemsPacket.PACKET_ID, UpdateItemsPacket.codec); 16 | 17 | ServerPlayNetworking.registerGlobalReceiver(HelloPacket.PACKET_ID, (payload, context) -> playersWithMod.add(context.player().getUuid())); 18 | ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> playersWithMod.remove(handler.getPlayer().getUuid())); 19 | }; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /fabric/src/main/java/eu/midnightdust/visualoverhaul/fabric/mixin/MixinAbstractFurnaceBlockEntity.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.fabric.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 5 | import io.netty.buffer.Unpooled; 6 | import net.fabricmc.fabric.api.networking.v1.PlayerLookup; 7 | import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 8 | import net.minecraft.block.BlockState; 9 | import net.minecraft.block.entity.AbstractFurnaceBlockEntity; 10 | import net.minecraft.block.entity.BlockEntityType; 11 | import net.minecraft.block.entity.LockableContainerBlockEntity; 12 | import net.minecraft.item.ItemStack; 13 | import net.minecraft.network.PacketByteBuf; 14 | import net.minecraft.server.network.ServerPlayerEntity; 15 | import net.minecraft.server.world.ServerWorld; 16 | import net.minecraft.util.collection.DefaultedList; 17 | import net.minecraft.util.math.BlockPos; 18 | import net.minecraft.world.World; 19 | import org.spongepowered.asm.mixin.Mixin; 20 | import org.spongepowered.asm.mixin.Shadow; 21 | import org.spongepowered.asm.mixin.Unique; 22 | import org.spongepowered.asm.mixin.injection.At; 23 | import org.spongepowered.asm.mixin.injection.Inject; 24 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 25 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 26 | 27 | import java.util.stream.Stream; 28 | 29 | @Mixin(AbstractFurnaceBlockEntity.class) 30 | public abstract class MixinAbstractFurnaceBlockEntity extends LockableContainerBlockEntity { 31 | 32 | @Shadow protected DefaultedList inventory; 33 | 34 | @Shadow protected abstract DefaultedList getHeldStacks(); 35 | 36 | @Unique 37 | private static boolean visualoverhaul$invUpdate = true; 38 | @Unique 39 | private static int visualoverhaul$playerUpdate = -1; 40 | 41 | 42 | protected MixinAbstractFurnaceBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { 43 | super(blockEntityType, blockPos, blockState); 44 | } 45 | 46 | @Inject(at = @At("TAIL"), method = "tick") 47 | private static void tick(ServerWorld world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity, CallbackInfo ci) { 48 | if (world.getBlockState(pos).hasBlockEntity()) { 49 | if (!world.isClient && (visualoverhaul$invUpdate || world.getPlayers().size() != visualoverhaul$playerUpdate)) { 50 | Stream watchingPlayers = PlayerLookup.tracking(blockEntity).stream(); 51 | DefaultedList inv = DefaultedList.ofSize(3, ItemStack.EMPTY); 52 | for (int i = 0; i <= 2; i++) { 53 | inv.set(i, blockEntity.getStack(i)); 54 | } 55 | 56 | watchingPlayers.forEach(player -> { 57 | if (VisualOverhaulCommon.playersWithMod.contains(player.getUuid())) { 58 | ServerPlayNetworking.send(player, new UpdateItemsPacket(VisualOverhaulCommon.UPDATE_TYPE_FURNACE_ITEMS, pos, inv)); 59 | } 60 | }); 61 | visualoverhaul$invUpdate = false; 62 | } 63 | visualoverhaul$playerUpdate = world.getPlayers().size(); 64 | } 65 | } 66 | 67 | @Inject(at = @At("RETURN"), method = "getHeldStacks") 68 | public void getStack(CallbackInfoReturnable> cir) { 69 | visualoverhaul$invUpdate = true; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /fabric/src/main/java/eu/midnightdust/visualoverhaul/fabric/mixin/MixinBrewingStandBlockEntity.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.fabric.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 5 | import net.fabricmc.fabric.api.networking.v1.PlayerLookup; 6 | import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 7 | import net.minecraft.block.BlockState; 8 | import net.minecraft.block.entity.BlockEntityType; 9 | import net.minecraft.block.entity.BrewingStandBlockEntity; 10 | import net.minecraft.block.entity.LockableContainerBlockEntity; 11 | import net.minecraft.item.ItemStack; 12 | import net.minecraft.server.network.ServerPlayerEntity; 13 | import net.minecraft.util.collection.DefaultedList; 14 | import net.minecraft.util.math.BlockPos; 15 | import net.minecraft.world.World; 16 | import org.spongepowered.asm.mixin.Mixin; 17 | import org.spongepowered.asm.mixin.Shadow; 18 | import org.spongepowered.asm.mixin.Unique; 19 | import org.spongepowered.asm.mixin.injection.At; 20 | import org.spongepowered.asm.mixin.injection.Inject; 21 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 22 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 23 | 24 | import java.util.stream.Stream; 25 | 26 | @Mixin(BrewingStandBlockEntity.class) 27 | public abstract class MixinBrewingStandBlockEntity extends LockableContainerBlockEntity { 28 | 29 | @Shadow private DefaultedList inventory; 30 | @Unique 31 | private static boolean visualoverhaul$invUpdate = true; 32 | @Unique 33 | private static int visualoverhaul$playerUpdate = -1; 34 | 35 | protected MixinBrewingStandBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { 36 | super(blockEntityType, blockPos, blockState); 37 | } 38 | 39 | @Inject(at = @At("TAIL"), method = "tick") 40 | private static void tick(World world, BlockPos pos, BlockState state, BrewingStandBlockEntity blockEntity, CallbackInfo ci) { 41 | if (!world.isClient && (visualoverhaul$invUpdate || world.getPlayers().size() != visualoverhaul$playerUpdate)) { 42 | Stream watchingPlayers = PlayerLookup.tracking(blockEntity).stream(); 43 | DefaultedList inv = DefaultedList.ofSize(5, ItemStack.EMPTY); 44 | for (int i = 0; i <= 4; i++) { 45 | inv.set(i, blockEntity.getStack(i)); 46 | } 47 | 48 | watchingPlayers.forEach(player -> { 49 | if (VisualOverhaulCommon.playersWithMod.contains(player.getUuid())) { 50 | ServerPlayNetworking.send(player, new UpdateItemsPacket(VisualOverhaulCommon.UPDATE_TYPE_POTION_BOTTLES, pos, inv)); 51 | } 52 | }); 53 | //visualoverhaul$invUpdate = false; 54 | } 55 | visualoverhaul$playerUpdate = world.getPlayers().size(); 56 | } 57 | 58 | @Inject(at = @At("RETURN"), method = "getHeldStacks") 59 | private void vo$onInventoryUpdate(CallbackInfoReturnable> cir) { 60 | visualoverhaul$invUpdate = true; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /fabric/src/main/java/eu/midnightdust/visualoverhaul/fabric/mixin/MixinJukeboxBlock.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.fabric.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 5 | import eu.midnightdust.visualoverhaul.util.JukeboxPacketUpdate; 6 | import io.netty.buffer.Unpooled; 7 | import net.fabricmc.fabric.api.networking.v1.PlayerLookup; 8 | import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; 9 | import net.minecraft.block.BlockRenderType; 10 | import net.minecraft.block.BlockState; 11 | import net.minecraft.block.BlockWithEntity; 12 | import net.minecraft.block.JukeboxBlock; 13 | import net.minecraft.block.entity.BlockEntity; 14 | import net.minecraft.block.entity.BlockEntityTicker; 15 | import net.minecraft.block.entity.BlockEntityType; 16 | import net.minecraft.block.entity.JukeboxBlockEntity; 17 | import net.minecraft.item.ItemStack; 18 | import net.minecraft.network.PacketByteBuf; 19 | import net.minecraft.server.network.ServerPlayerEntity; 20 | import net.minecraft.util.collection.DefaultedList; 21 | import net.minecraft.util.math.BlockPos; 22 | import net.minecraft.world.World; 23 | import org.jetbrains.annotations.Nullable; 24 | import org.spongepowered.asm.mixin.Mixin; 25 | import org.spongepowered.asm.mixin.Unique; 26 | 27 | import java.util.stream.Stream; 28 | 29 | @Mixin(JukeboxBlock.class) 30 | public abstract class MixinJukeboxBlock extends BlockWithEntity { 31 | 32 | protected MixinJukeboxBlock(Settings settings) { 33 | super(settings); 34 | } 35 | 36 | @Override 37 | public BlockRenderType getRenderType(BlockState state) { 38 | return BlockRenderType.MODEL; 39 | } 40 | 41 | @Nullable 42 | public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { 43 | return world.isClient() ? null : validateTicker(type, BlockEntityType.JUKEBOX, MixinJukeboxBlock::visualoverhaul$tick); 44 | } 45 | @Unique 46 | private static void visualoverhaul$tick(World world, BlockPos pos, BlockState state, JukeboxBlockEntity blockEntity) { 47 | if (!world.isClient && (JukeboxPacketUpdate.invUpdate || world.getPlayers().size() != JukeboxPacketUpdate.playerUpdate)) { 48 | Stream watchingPlayers = PlayerLookup.tracking(blockEntity).stream(); 49 | 50 | watchingPlayers.forEach(player -> { 51 | if (VisualOverhaulCommon.playersWithMod.contains(player.getUuid())) { 52 | ServerPlayNetworking.send(player, new UpdateItemsPacket(VisualOverhaulCommon.UPDATE_TYPE_RECORD, pos, DefaultedList.ofSize(1, blockEntity.getStack()))); 53 | } 54 | }); 55 | //JukeboxPacketUpdate.invUpdate = false; 56 | } 57 | JukeboxPacketUpdate.playerUpdate = world.getPlayers().size(); 58 | } 59 | } 60 | 61 | -------------------------------------------------------------------------------- /fabric/src/main/java/eu/midnightdust/visualoverhaul/util/fabric/ModIconUtilImpl.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.util.fabric; 2 | 3 | import net.fabricmc.loader.api.FabricLoader; 4 | import net.fabricmc.loader.api.ModContainer; 5 | 6 | import java.nio.file.Path; 7 | 8 | public class ModIconUtilImpl { 9 | public static Path getPath(String modid) { 10 | ModContainer mod = FabricLoader.getInstance().getModContainer(modid).orElseThrow(() -> new RuntimeException("Cannot get ModContainer for Fabric mod with id ")); 11 | return mod.findPath(mod.getMetadata().getIconPath(16).orElseThrow()).orElseThrow(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /fabric/src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "visualoverhaul", 4 | "version": "${version}", 5 | 6 | "name": "VisualOverhaul", 7 | "description": "Adds better visuals for certain Minecraft Vanilla Blocks.", 8 | "authors": [ 9 | "Motschen", 10 | "TeamMidnightDust" 11 | ], 12 | "contact": { 13 | "homepage": "https://www.midnightdust.eu/", 14 | "sources": "https://github.com/TeamMidnightDust/VisualOverhaul", 15 | "issues": "https://github.com/TeamMidnightDust/VisualOverhaul/issues" 16 | }, 17 | 18 | "license": "MIT", 19 | "icon": "assets/visualoverhaul/icon.png", 20 | 21 | "environment": "*", 22 | "entrypoints": { 23 | "client": [ 24 | "eu.midnightdust.visualoverhaul.fabric.VisualOverhaulClientFabric" 25 | ], 26 | "main": [ 27 | "eu.midnightdust.visualoverhaul.fabric.VisualOverhaulFabric" 28 | ] 29 | }, 30 | 31 | "depends": { 32 | "fabric": "*", 33 | "minecraft": ">=1.19" 34 | }, 35 | 36 | "mixins": [ 37 | "visualoverhaul.mixins.json", 38 | "visualoverhaul-fabric.mixins.json" 39 | ] 40 | } -------------------------------------------------------------------------------- /fabric/src/main/resources/visualoverhaul-fabric.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "eu.midnightdust.visualoverhaul.fabric.mixin", 4 | "compatibilityLevel": "JAVA_17", 5 | "minVersion": "0.8", 6 | "mixins": [ 7 | "MixinJukeboxBlock", 8 | "MixinAbstractFurnaceBlockEntity", 9 | "MixinBrewingStandBlockEntity" 10 | ], 11 | "injectors": { 12 | "defaultRequire": 1 13 | } 14 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2048M 2 | 3 | minecraft_version=1.21.4 4 | yarn_mappings=1.21.4+build.1 5 | enabled_platforms=fabric,neoforge 6 | 7 | archives_base_name=visualoverhaul 8 | mod_version=6.0.0 9 | maven_group=eu.midnightdust 10 | release_type=release 11 | curseforge_id=432008 12 | modrinth_id=YQnwl5Vv 13 | 14 | midnightlib_version=1.6.7 15 | phonos_version=0.3.0+1.19.2 16 | 17 | fabric_loader_version=0.16.9 18 | fabric_api_version=0.111.0+1.21.4 19 | 20 | neoforge_version=21.4.10-beta 21 | yarn_mappings_patch_neoforge_version = 1.21+build.4 22 | 23 | quilt_loader_version=0.19.0-beta.18 24 | quilt_fabric_api_version=7.0.1+0.83.0-1.20 25 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if %ERRORLEVEL% equ 0 goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if %ERRORLEVEL% equ 0 goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | set EXIT_CODE=%ERRORLEVEL% 84 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 85 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 86 | exit /b %EXIT_CODE% 87 | 88 | :mainEnd 89 | if "%OS%"=="Windows_NT" endlocal 90 | 91 | :omega 92 | -------------------------------------------------------------------------------- /neoforge/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.github.johnrengelman.shadow' 3 | id "me.shedaniel.unified-publishing" 4 | } 5 | 6 | repositories { 7 | maven { url "https://api.modrinth.com/maven" } 8 | maven { 9 | name = 'NeoForged' 10 | url = 'https://maven.neoforged.net/releases' 11 | } 12 | } 13 | 14 | 15 | architectury { 16 | platformSetupLoomIde() 17 | neoForge() 18 | } 19 | 20 | loom { 21 | accessWidenerPath = project(":common").loom.accessWidenerPath 22 | } 23 | 24 | configurations { 25 | common { 26 | canBeResolved = true 27 | canBeConsumed = false 28 | } 29 | compileClasspath.extendsFrom common 30 | runtimeClasspath.extendsFrom common 31 | developmentNeoForge.extendsFrom common 32 | 33 | // Files in this configuration will be bundled into your mod using the Shadow plugin. 34 | // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. 35 | shadowBundle { 36 | canBeResolved = true 37 | canBeConsumed = false 38 | } 39 | archivesBaseName = rootProject.archives_base_name + "-neoforge" 40 | } 41 | 42 | dependencies { 43 | neoForge "net.neoforged:neoforge:$rootProject.neoforge_version" 44 | modImplementation "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-neoforge" 45 | 46 | common(project(path: ':common', configuration: 'namedElements')) { transitive false } 47 | shadowBundle project(path: ':common', configuration: 'transformProductionNeoForge') 48 | } 49 | 50 | processResources { 51 | inputs.property 'version', project.version 52 | 53 | filesMatching('META-INF/neoforge.mods.toml') { 54 | expand version: project.version 55 | } 56 | } 57 | 58 | shadowJar { 59 | configurations = [project.configurations.shadowBundle] 60 | archiveClassifier = 'dev-shadow' 61 | } 62 | 63 | remapJar { 64 | input.set shadowJar.archiveFile 65 | } 66 | 67 | sourcesJar { 68 | def commonSources = project(":common").sourcesJar 69 | dependsOn commonSources 70 | from commonSources.archiveFile.map { zipTree(it) } 71 | } 72 | 73 | components.java { 74 | withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { 75 | skip() 76 | } 77 | } 78 | 79 | unifiedPublishing { 80 | project { 81 | displayName = "VisualOverhaul v$project.version - NeoForge $project.minecraft_version" 82 | releaseType = "$project.release_type" 83 | changelog = releaseChangelog() 84 | gameVersions = [] 85 | gameLoaders = ["neoforge"] 86 | 87 | mainPublication remapJar 88 | 89 | relations { 90 | depends { 91 | curseforge = "midnightlib" 92 | modrinth = "midnightlib" 93 | } 94 | includes {} 95 | } 96 | 97 | var CURSEFORGE_TOKEN = project.findProperty("CURSEFORGE_TOKEN") ?: System.getenv("CURSEFORGE_TOKEN") 98 | if (CURSEFORGE_TOKEN != null) { 99 | curseforge { 100 | token = CURSEFORGE_TOKEN 101 | id = rootProject.curseforge_id 102 | gameVersions.addAll "Java 21", project.minecraft_version 103 | releaseType = "alpha" 104 | } 105 | } 106 | 107 | var MODRINTH_TOKEN = project.findProperty("MODRINTH_TOKEN") ?: System.getenv("MODRINTH_TOKEN") 108 | if (MODRINTH_TOKEN != null) { 109 | modrinth { 110 | token = MODRINTH_TOKEN 111 | id = rootProject.modrinth_id 112 | version = "$project.version-$project.name" 113 | gameVersions.addAll project.minecraft_version 114 | } 115 | } 116 | } 117 | } -------------------------------------------------------------------------------- /neoforge/gradle.properties: -------------------------------------------------------------------------------- 1 | loom.platform=neoforge -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/VisualOverhaulClientEvents.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge; 2 | 3 | import eu.midnightdust.visualoverhaul.FakeBlocks; 4 | import eu.midnightdust.visualoverhaul.IconicButtons; 5 | import eu.midnightdust.visualoverhaul.block.model.FurnaceWoodenPlanksModel; 6 | import eu.midnightdust.visualoverhaul.block.renderer.BrewingStandBlockEntityRenderer; 7 | import eu.midnightdust.visualoverhaul.block.renderer.FurnaceBlockEntityRenderer; 8 | import eu.midnightdust.visualoverhaul.block.renderer.JukeboxBlockEntityRenderer; 9 | import eu.midnightdust.visualoverhaul.packet.HelloPacket; 10 | import net.minecraft.block.entity.BlockEntityType; 11 | import net.minecraft.client.MinecraftClient; 12 | import net.minecraft.resource.*; 13 | import net.minecraft.text.Text; 14 | import net.minecraft.util.Identifier; 15 | import net.neoforged.api.distmarker.Dist; 16 | import net.neoforged.bus.api.SubscribeEvent; 17 | import net.neoforged.fml.ModList; 18 | import net.neoforged.fml.common.EventBusSubscriber; 19 | import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; 20 | import net.neoforged.neoforge.client.event.EntityRenderersEvent; 21 | import net.neoforged.neoforge.client.event.RegisterClientReloadListenersEvent; 22 | import net.neoforged.neoforge.event.AddPackFindersEvent; 23 | import net.neoforged.neoforgespi.locating.IModFile; 24 | 25 | import java.util.Optional; 26 | 27 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.MOD_ID; 28 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.id; 29 | 30 | @EventBusSubscriber(modid = MOD_ID, bus = EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) 31 | public class VisualOverhaulClientEvents { 32 | @SubscribeEvent 33 | public static void registerLayerDefinition(EntityRenderersEvent.RegisterLayerDefinitions event) { 34 | event.registerLayerDefinition(FurnaceWoodenPlanksModel.WOODEN_PLANKS_MODEL_LAYER, FurnaceWoodenPlanksModel::getTexturedModelData); 35 | } 36 | 37 | @SubscribeEvent 38 | public static void registerBlockEntityRenderers(EntityRenderersEvent.RegisterRenderers event) { 39 | event.registerBlockEntityRenderer(BlockEntityType.BREWING_STAND, BrewingStandBlockEntityRenderer::new); 40 | event.registerBlockEntityRenderer(BlockEntityType.JUKEBOX, JukeboxBlockEntityRenderer::new); 41 | event.registerBlockEntityRenderer(BlockEntityType.FURNACE, FurnaceBlockEntityRenderer::new); 42 | event.registerBlockEntityRenderer(BlockEntityType.SMOKER, FurnaceBlockEntityRenderer::new); 43 | event.registerBlockEntityRenderer(BlockEntityType.BLAST_FURNACE, FurnaceBlockEntityRenderer::new); 44 | } 45 | @SubscribeEvent 46 | public static void addReloadListener(RegisterClientReloadListenersEvent event) { 47 | event.registerReloadListener(new IconReloadListener()); 48 | } 49 | public static class IconReloadListener implements SynchronousResourceReloader { 50 | @Override 51 | public void reload(ResourceManager manager) { 52 | IconicButtons.reload(manager); 53 | FakeBlocks.reload(manager); 54 | } 55 | } 56 | @SubscribeEvent 57 | public static void addPackFinders(AddPackFindersEvent event) { 58 | if (event.getPackType() == ResourceType.CLIENT_RESOURCES) { 59 | registerResourcePack(event, id("nobrewingbottles"), false, true); 60 | registerResourcePack(event, id("fancyfurnace"), false, true); 61 | registerResourcePack(event, id("coloredwaterbucket"), false, true); 62 | } 63 | } 64 | private static void registerResourcePack(AddPackFindersEvent event, Identifier id, boolean alwaysEnabled, boolean defaultEnabled) { 65 | event.addRepositorySource(((profileAdder) -> { 66 | IModFile file = ModList.get().getModFileById(id.getNamespace()).getFile(); 67 | try { 68 | ResourcePackProfile.PackFactory pack = new DirectoryResourcePack.DirectoryBackedFactory(file.findResource("resourcepacks/" + id.getPath())); 69 | ResourcePackInfo info = new ResourcePackInfo(id.toString(), Text.of(id.getNamespace()+"/"+id.getPath()), ResourcePackSource.BUILTIN, Optional.empty()); 70 | ResourcePackProfile packProfile = ResourcePackProfile.create(info, pack, ResourceType.CLIENT_RESOURCES, new ResourcePackPosition(alwaysEnabled, ResourcePackProfile.InsertionPosition.TOP, false)); 71 | if (packProfile != null) { 72 | profileAdder.accept(packProfile); 73 | if (defaultEnabled && !alwaysEnabled) VisualOverhaulClientForge.defaultEnabledPacks.add(packProfile); 74 | } 75 | } catch (NullPointerException e) {e.fillInStackTrace();} 76 | })); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/VisualOverhaulClientForge.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulClient; 4 | import eu.midnightdust.visualoverhaul.config.VOConfig; 5 | import eu.midnightdust.visualoverhaul.util.VOColorUtil; 6 | import net.minecraft.block.Block; 7 | import net.minecraft.block.Blocks; 8 | import net.minecraft.client.MinecraftClient; 9 | import net.minecraft.client.color.world.BiomeColors; 10 | import net.minecraft.client.render.RenderLayer; 11 | import net.minecraft.client.render.RenderLayers; 12 | import net.minecraft.registry.Registries; 13 | import net.minecraft.resource.ResourcePackProfile; 14 | import net.neoforged.neoforge.client.event.ClientTickEvent; 15 | import net.neoforged.neoforge.common.NeoForge; 16 | import net.neoforged.neoforge.registries.DeferredRegister; 17 | import org.apache.commons.compress.utils.Lists; 18 | 19 | import java.util.List; 20 | 21 | import static eu.midnightdust.visualoverhaul.VisualOverhaulClient.*; 22 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.*; 23 | 24 | @SuppressWarnings("all") 25 | public class VisualOverhaulClientForge { 26 | public static List defaultEnabledPacks = Lists.newArrayList(); 27 | public static MinecraftClient client = MinecraftClient.getInstance(); 28 | private static final DeferredRegister BLOCKS = DeferredRegister.create(Registries.BLOCK, MOD_ID); 29 | 30 | public static void initClient() { 31 | VisualOverhaulClient.onInitializeClient(); 32 | NeoForge.EVENT_BUS.addListener(VisualOverhaulClientForge::doClientTick); 33 | 34 | RenderLayers.setRenderLayer(Blocks.JUKEBOX, RenderLayer.getCutout()); 35 | RenderLayers.setRenderLayer(Blocks.FURNACE, RenderLayer.getCutout()); 36 | RenderLayers.setRenderLayer(Blocks.SMOKER, RenderLayer.getCutout()); 37 | RenderLayers.setRenderLayer(Blocks.BLAST_FURNACE, RenderLayer.getCutout()); 38 | } 39 | public static void doClientTick(ClientTickEvent.Pre event) { 40 | if (VOConfig.coloredItems) { 41 | MinecraftClient client = VisualOverhaulClientForge.client; 42 | if (client.world != null && client.player != null) { 43 | waterColor = BiomeColors.getWaterColor(client.world, client.player.getBlockPos()); 44 | foliageColor = BiomeColors.getFoliageColor(client.world, client.player.getBlockPos()); 45 | grassColor = BiomeColors.getGrassColor(client.world, client.player.getBlockPos()); 46 | potionColor = VOColorUtil.convertRgbToArgb(waterColor, 200); 47 | } else { 48 | waterColor = 4159204; 49 | foliageColor = -8934609; 50 | grassColor = -8934609; 51 | potionColor = -13083194; 52 | } 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/VisualOverhaulClientGameEvents.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge; 2 | 3 | import eu.midnightdust.visualoverhaul.packet.HelloPacket; 4 | import net.minecraft.client.MinecraftClient; 5 | import net.neoforged.api.distmarker.Dist; 6 | import net.neoforged.bus.api.SubscribeEvent; 7 | import net.neoforged.fml.common.EventBusSubscriber; 8 | import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; 9 | 10 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.MOD_ID; 11 | 12 | @EventBusSubscriber(modid = MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) 13 | public class VisualOverhaulClientGameEvents { 14 | @SubscribeEvent() 15 | public static void sendPacketOnLogin(ClientPlayerNetworkEvent.LoggingIn event) { 16 | MinecraftClient client = MinecraftClient.getInstance(); 17 | if (client.getNetworkHandler() != null) 18 | client.getNetworkHandler().send(new HelloPacket(event.getPlayer().getUuid())); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/VisualOverhaulEvents.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import eu.midnightdust.visualoverhaul.neoforge.handler.UpdateItemsPacketHandler; 5 | import eu.midnightdust.visualoverhaul.packet.HelloPacket; 6 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 7 | import net.neoforged.bus.api.SubscribeEvent; 8 | import net.neoforged.fml.common.EventBusSubscriber; 9 | import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; 10 | import net.neoforged.neoforge.network.registration.PayloadRegistrar; 11 | 12 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.*; 13 | 14 | @EventBusSubscriber(modid = MOD_ID, bus = EventBusSubscriber.Bus.MOD) 15 | public class VisualOverhaulEvents { 16 | @SubscribeEvent 17 | public static void registerPayloads(RegisterPayloadHandlersEvent event) { 18 | PayloadRegistrar registrar = event.registrar("1"); 19 | registrar.commonToServer(HelloPacket.PACKET_ID, HelloPacket.codec, (payload, context) -> { 20 | VisualOverhaulCommon.playersWithMod.add(context.player().getUuid()); 21 | }); 22 | registrar.playToClient(UpdateItemsPacket.PACKET_ID, UpdateItemsPacket.codec, (payload, context) -> { 23 | UpdateItemsPacketHandler.handlePacket(payload); 24 | }); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/VisualOverhaulForge.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge; 2 | 3 | import net.neoforged.api.distmarker.Dist; 4 | import net.neoforged.fml.common.Mod; 5 | import net.neoforged.fml.loading.FMLEnvironment; 6 | 7 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.*; 8 | 9 | @Mod(MOD_ID) 10 | public class VisualOverhaulForge { 11 | public VisualOverhaulForge() { 12 | if (FMLEnvironment.dist == Dist.CLIENT) VisualOverhaulClientForge.initClient(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/VisualOverhaulGameEvents.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge; 2 | 3 | import net.neoforged.bus.api.SubscribeEvent; 4 | import net.neoforged.fml.common.EventBusSubscriber; 5 | import net.neoforged.neoforge.event.entity.player.PlayerEvent; 6 | 7 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.MOD_ID; 8 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.playersWithMod; 9 | 10 | @EventBusSubscriber(modid = MOD_ID, bus = EventBusSubscriber.Bus.GAME) 11 | public class VisualOverhaulGameEvents { 12 | @SubscribeEvent 13 | public static void removeOnLogout(PlayerEvent.PlayerLoggedOutEvent event) { 14 | playersWithMod.remove(event.getEntity().getUuid()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/handler/UpdateItemsPacketHandler.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge.handler; 2 | 3 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 4 | import net.minecraft.block.entity.AbstractFurnaceBlockEntity; 5 | import net.minecraft.block.entity.BrewingStandBlockEntity; 6 | import net.minecraft.client.MinecraftClient; 7 | 8 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.*; 9 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.UPDATE_TYPE_FURNACE_ITEMS; 10 | 11 | public class UpdateItemsPacketHandler { 12 | public static void handlePacket(UpdateItemsPacket payload) { 13 | MinecraftClient client = MinecraftClient.getInstance(); 14 | client.execute(() -> { 15 | if (payload.blockTypeID().equals(UPDATE_TYPE_RECORD)) 16 | jukeboxItems.put(payload.pos(), payload.inv().getFirst()); 17 | else if (client.world != null && client.world.getBlockEntity(payload.pos()) != null) { 18 | if (payload.blockTypeID().equals(UPDATE_TYPE_POTION_BOTTLES) && client.world.getBlockEntity(payload.pos()) instanceof BrewingStandBlockEntity brewingStand) { 19 | for (int i = 0; i <= 4; i++) { 20 | brewingStand.setStack(i, payload.inv().get(i)); 21 | } 22 | } else if (payload.blockTypeID().equals(UPDATE_TYPE_FURNACE_ITEMS) && client.world.getBlockEntity(payload.pos()) instanceof AbstractFurnaceBlockEntity furnace) { 23 | for (int i = 0; i <= 2; i++) { 24 | furnace.setStack(i, payload.inv().get(i)); 25 | } 26 | } 27 | } 28 | }); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/mixin/MixinAbstractFurnaceBlockEntity.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.entity.AbstractFurnaceBlockEntity; 7 | import net.minecraft.block.entity.BlockEntityType; 8 | import net.minecraft.block.entity.LockableContainerBlockEntity; 9 | import net.minecraft.item.ItemStack; 10 | import net.minecraft.server.network.ServerPlayerEntity; 11 | import net.minecraft.server.world.ServerChunkManager; 12 | import net.minecraft.server.world.ServerWorld; 13 | import net.minecraft.util.collection.DefaultedList; 14 | import net.minecraft.util.math.BlockPos; 15 | import net.minecraft.util.math.ChunkPos; 16 | import net.minecraft.world.World; 17 | import org.spongepowered.asm.mixin.Mixin; 18 | import org.spongepowered.asm.mixin.Unique; 19 | import org.spongepowered.asm.mixin.injection.At; 20 | import org.spongepowered.asm.mixin.injection.Inject; 21 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 22 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 23 | 24 | import java.util.stream.Stream; 25 | 26 | @Mixin(AbstractFurnaceBlockEntity.class) 27 | public abstract class MixinAbstractFurnaceBlockEntity extends LockableContainerBlockEntity { 28 | 29 | @Unique 30 | private static boolean visualoverhaul$invUpdate = true; 31 | @Unique 32 | private static int visualoverhaul$playerUpdate = -1; 33 | 34 | 35 | protected MixinAbstractFurnaceBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { 36 | super(blockEntityType, blockPos, blockState); 37 | } 38 | 39 | @Inject(at = @At("TAIL"), method = "tick") 40 | private static void tick(ServerWorld world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity, CallbackInfo ci) { 41 | if (world.getBlockState(pos).hasBlockEntity()) { 42 | if (!world.isClient && (visualoverhaul$invUpdate || world.getPlayers().size() == visualoverhaul$playerUpdate)) { 43 | Stream watchingPlayers = ((ServerChunkManager)world.getChunkManager()).chunkLoadingManager.getPlayersWatchingChunk(new ChunkPos(pos), false).stream(); 44 | DefaultedList inv = DefaultedList.ofSize(3, ItemStack.EMPTY); 45 | for (int i = 0; i <= 2; i++) { 46 | inv.set(i, blockEntity.getStack(i)); 47 | } 48 | 49 | watchingPlayers.forEach(player -> { 50 | if (VisualOverhaulCommon.playersWithMod.contains(player.getUuid())) { 51 | player.networkHandler.send(new UpdateItemsPacket(VisualOverhaulCommon.UPDATE_TYPE_FURNACE_ITEMS, pos, inv)); 52 | } 53 | }); 54 | //visualoverhaul$invUpdate = false; 55 | } 56 | visualoverhaul$playerUpdate = world.getPlayers().size(); 57 | } 58 | } 59 | 60 | @Inject(at = @At("RETURN"), method = "getHeldStacks") 61 | public void getStack(CallbackInfoReturnable> cir) { 62 | visualoverhaul$invUpdate = true; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/mixin/MixinBlockColors.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.config.VOConfig; 4 | import net.minecraft.block.Blocks; 5 | import net.minecraft.client.color.block.BlockColors; 6 | import net.minecraft.client.color.world.BiomeColors; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 11 | 12 | @Mixin(BlockColors.class) 13 | public abstract class MixinBlockColors { 14 | @Inject(method = "create", at = @At("RETURN")) 15 | private static void create(CallbackInfoReturnable info) { 16 | if (VOConfig.coloredItems) info.getReturnValue().registerColorProvider((state, world, pos, tintIndex) -> world != null ? world.getColor(pos, BiomeColors.FOLIAGE_COLOR) : 0, Blocks.LILY_PAD); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/mixin/MixinBrewingStandBlockEntity.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.entity.BlockEntityType; 7 | import net.minecraft.block.entity.BrewingStandBlockEntity; 8 | import net.minecraft.block.entity.LockableContainerBlockEntity; 9 | import net.minecraft.item.ItemStack; 10 | import net.minecraft.server.network.ServerPlayerEntity; 11 | import net.minecraft.server.world.ServerChunkManager; 12 | import net.minecraft.util.collection.DefaultedList; 13 | import net.minecraft.util.math.BlockPos; 14 | import net.minecraft.util.math.ChunkPos; 15 | import net.minecraft.world.World; 16 | import org.spongepowered.asm.mixin.Mixin; 17 | import org.spongepowered.asm.mixin.Unique; 18 | import org.spongepowered.asm.mixin.injection.At; 19 | import org.spongepowered.asm.mixin.injection.Inject; 20 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 21 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 22 | 23 | import java.util.stream.Stream; 24 | 25 | @Mixin(BrewingStandBlockEntity.class) 26 | public abstract class MixinBrewingStandBlockEntity extends LockableContainerBlockEntity { 27 | 28 | @Unique 29 | private static boolean visualoverhaul$invUpdate = true; 30 | @Unique 31 | private static int visualoverhaul$playerUpdate = -1; 32 | 33 | protected MixinBrewingStandBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { 34 | super(blockEntityType, blockPos, blockState); 35 | } 36 | 37 | @Inject(at = @At("TAIL"), method = "tick") 38 | private static void tick(World world, BlockPos pos, BlockState state, BrewingStandBlockEntity blockEntity, CallbackInfo ci) { 39 | if (!world.isClient && (visualoverhaul$invUpdate || world.getPlayers().size() == visualoverhaul$playerUpdate)) { 40 | Stream watchingPlayers = ((ServerChunkManager)world.getChunkManager()).chunkLoadingManager.getPlayersWatchingChunk(new ChunkPos(pos), false).stream(); 41 | DefaultedList inv = DefaultedList.ofSize(5, ItemStack.EMPTY); 42 | for (int i = 0; i <= 4; i++) { 43 | inv.set(i, blockEntity.getStack(i)); 44 | } 45 | watchingPlayers.forEach(player -> { 46 | if (VisualOverhaulCommon.playersWithMod.contains(player.getUuid())) { 47 | player.networkHandler.send(new UpdateItemsPacket(VisualOverhaulCommon.UPDATE_TYPE_POTION_BOTTLES, pos, inv)); 48 | } 49 | }); 50 | visualoverhaul$invUpdate = false; 51 | } 52 | visualoverhaul$playerUpdate = world.getPlayers().size(); 53 | } 54 | 55 | @Inject(at = @At("RETURN"), method = "getHeldStacks") 56 | public void getStack(CallbackInfoReturnable> cir) { 57 | visualoverhaul$invUpdate = true; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/mixin/MixinJukeboxBlock.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaulCommon; 4 | import eu.midnightdust.visualoverhaul.packet.UpdateItemsPacket; 5 | import eu.midnightdust.visualoverhaul.util.JukeboxPacketUpdate; 6 | import net.minecraft.block.BlockRenderType; 7 | import net.minecraft.block.BlockState; 8 | import net.minecraft.block.BlockWithEntity; 9 | import net.minecraft.block.JukeboxBlock; 10 | import net.minecraft.block.entity.BlockEntity; 11 | import net.minecraft.block.entity.BlockEntityTicker; 12 | import net.minecraft.block.entity.BlockEntityType; 13 | import net.minecraft.block.entity.JukeboxBlockEntity; 14 | import net.minecraft.server.network.ServerPlayerEntity; 15 | import net.minecraft.server.world.ServerChunkManager; 16 | import net.minecraft.util.collection.DefaultedList; 17 | import net.minecraft.util.math.BlockPos; 18 | import net.minecraft.util.math.ChunkPos; 19 | import net.minecraft.world.World; 20 | import org.jetbrains.annotations.Nullable; 21 | import org.spongepowered.asm.mixin.Mixin; 22 | import org.spongepowered.asm.mixin.Unique; 23 | 24 | import java.util.stream.Stream; 25 | 26 | @Mixin(JukeboxBlock.class) 27 | public abstract class MixinJukeboxBlock extends BlockWithEntity { 28 | 29 | protected MixinJukeboxBlock(Settings settings) { 30 | super(settings); 31 | } 32 | 33 | @Override 34 | public BlockRenderType getRenderType(BlockState state) { 35 | return BlockRenderType.MODEL; 36 | } 37 | 38 | @Nullable 39 | public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { 40 | return world.isClient() ? null : validateTicker(type, BlockEntityType.JUKEBOX, MixinJukeboxBlock::visualoverhaul$tick); 41 | } 42 | @Unique 43 | private static void visualoverhaul$tick(World world, BlockPos pos, BlockState state, JukeboxBlockEntity blockEntity) { 44 | if (!world.isClient && (JukeboxPacketUpdate.invUpdate || world.getPlayers().size() == JukeboxPacketUpdate.playerUpdate)) { 45 | Stream watchingPlayers = ((ServerChunkManager)world.getChunkManager()).chunkLoadingManager.getPlayersWatchingChunk(new ChunkPos(pos), false).stream(); 46 | watchingPlayers.forEach(player -> { 47 | if (VisualOverhaulCommon.playersWithMod.contains(player.getUuid())) { 48 | player.networkHandler.send(new UpdateItemsPacket(VisualOverhaulCommon.UPDATE_TYPE_RECORD, pos, DefaultedList.ofSize(1, blockEntity.getStack()))); 49 | } 50 | }); 51 | //JukeboxPacketUpdate.invUpdate = false; 52 | } 53 | JukeboxPacketUpdate.playerUpdate = world.getPlayers().size(); 54 | } 55 | } 56 | 57 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/neoforge/mixin/MixinResourcePackManager.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.neoforge.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.config.VOConfig; 4 | import eu.midnightdust.visualoverhaul.neoforge.VisualOverhaulClientForge; 5 | import net.minecraft.resource.ResourcePackManager; 6 | import net.minecraft.resource.ResourcePackProfile; 7 | import org.apache.commons.compress.utils.Lists; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Shadow; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | import java.util.List; 15 | 16 | import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.MOD_ID; 17 | 18 | @Mixin(ResourcePackManager.class) 19 | public abstract class MixinResourcePackManager { 20 | @Shadow private List enabled; 21 | 22 | @Inject(method = "setEnabledProfiles(Ljava/util/Collection;)V", at = @At("TAIL")) 23 | private void setDefaultEnabledPacks(CallbackInfo info) { 24 | if (VOConfig.firstLaunch) { 25 | List enabledPacks = Lists.newArrayList(); 26 | enabledPacks.addAll(enabled); 27 | enabledPacks.addAll(VisualOverhaulClientForge.defaultEnabledPacks); 28 | this.enabled = enabledPacks; 29 | VOConfig.firstLaunch = false; 30 | VOConfig.write(MOD_ID); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /neoforge/src/main/java/eu/midnightdust/visualoverhaul/util/neoforge/ModIconUtilImpl.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.util.neoforge; 2 | 3 | import net.neoforged.fml.ModList; 4 | import net.neoforged.neoforgespi.language.IModInfo; 5 | 6 | import java.nio.file.Path; 7 | 8 | public class ModIconUtilImpl { 9 | public static Path getPath(String modid) { 10 | IModInfo mod = ModList.get().getMods().stream().filter(modInfo -> modInfo.getModId().equals(modid)).findFirst().orElseThrow(() -> new RuntimeException("Cannot get ModContainer for Forge mod with id ")); 11 | return mod.getOwningFile().getFile().findResource(mod.getLogoFile().orElseThrow()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /neoforge/src/main/resources/META-INF/neoforge.mods.toml: -------------------------------------------------------------------------------- 1 | modLoader = "javafml" 2 | loaderVersion = "[2,)" 3 | #issueTrackerURL = "" 4 | license = "MIT License" 5 | 6 | [[mods]] 7 | modId = "visualoverhaul" 8 | version = "${version}" 9 | displayName = "VisualOverhaul" 10 | logoFile = "icon.png" 11 | authors = "Motschen, TeamMidnightDust" 12 | description = ''' 13 | Adds better visuals for certain Minecraft Vanilla Blocks. 14 | ''' 15 | 16 | [[mixins]] 17 | config = "visualoverhaul.mixins.json" 18 | [[mixins]] 19 | config = "visualoverhaul-neoforge.mixins.json" 20 | 21 | [[dependencies.visualoverhaul]] 22 | modId = "neoforge" 23 | mandatory = true 24 | versionRange = "[21.0,)" 25 | ordering = "NONE" 26 | side = "BOTH" 27 | 28 | [[dependencies.visualoverhaul]] 29 | modId = "minecraft" 30 | mandatory = true 31 | versionRange = "[1.21,)" 32 | ordering = "NONE" 33 | side = "BOTH" 34 | 35 | [[dependencies.visualoverhaul]] 36 | modId = "midnightlib" 37 | mandatory = true 38 | versionRange = "[1.0,)" 39 | ordering = "AFTER" 40 | side = "BOTH" 41 | -------------------------------------------------------------------------------- /neoforge/src/main/resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TeamMidnightDust/VisualOverhaul/f583f515f4503b373c0242ca4610cd70cac3491f/neoforge/src/main/resources/icon.png -------------------------------------------------------------------------------- /neoforge/src/main/resources/visualoverhaul-neoforge.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "eu.midnightdust.visualoverhaul.neoforge.mixin", 4 | "compatibilityLevel": "JAVA_21", 5 | "mixins": [ 6 | "MixinJukeboxBlock", 7 | "MixinAbstractFurnaceBlockEntity", 8 | "MixinBrewingStandBlockEntity" 9 | ], 10 | "client": [ 11 | "MixinResourcePackManager", 12 | "MixinBlockColors" 13 | ], 14 | "injectors": { 15 | "defaultRequire": 1 16 | } 17 | } -------------------------------------------------------------------------------- /quilt/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.github.johnrengelman.shadow" version "7.1.2" 3 | } 4 | 5 | repositories { 6 | maven { url "https://maven.quiltmc.org/repository/release/" } 7 | maven { url "https://api.modrinth.com/maven" } 8 | } 9 | 10 | architectury { 11 | platformSetupLoomIde() 12 | loader("quilt") 13 | } 14 | 15 | loom { 16 | } 17 | 18 | configurations { 19 | common 20 | shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. 21 | compileClasspath.extendsFrom common 22 | runtimeClasspath.extendsFrom common 23 | developmentQuilt.extendsFrom common 24 | archivesBaseName = rootProject.archives_base_name + "-quilt" 25 | } 26 | 27 | dependencies { 28 | modImplementation "org.quiltmc:quilt-loader:${rootProject.quilt_loader_version}" 29 | modApi "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${rootProject.quilt_fabric_api_version}" 30 | // Remove the next few lines if you don't want to depend on the API 31 | //modApi("dev.architectury:architectury-fabric:${rootProject.architectury_version}") { 32 | // // We must not pull Fabric Loader from Architectury Fabric 33 | // exclude group: "net.fabricmc" 34 | // exclude group: "net.fabricmc.fabric-api" 35 | //} 36 | modImplementation "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-quilt" 37 | include "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-quilt" 38 | 39 | common(project(path: ":common", configuration: "namedElements")) { transitive false } 40 | shadowCommon(project(path: ":common", configuration: "transformProductionQuilt")) { transitive false } 41 | //common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false } 42 | //shadowCommon(project(path: ":fabric-like", configuration: "transformProductionQuilt")) { transitive false } 43 | } 44 | 45 | processResources { 46 | inputs.property "group", rootProject.maven_group 47 | inputs.property "version", project.version 48 | 49 | filesMatching("quilt.mod.json") { 50 | expand "group": rootProject.maven_group, 51 | "version": project.version 52 | } 53 | } 54 | 55 | shadowJar { 56 | exclude "architectury.common.json" 57 | 58 | configurations = [project.configurations.shadowCommon] 59 | classifier "dev-shadow" 60 | } 61 | 62 | remapJar { 63 | input.set shadowJar.archiveFile 64 | dependsOn shadowJar 65 | classifier null 66 | } 67 | 68 | jar { 69 | classifier "dev" 70 | } 71 | 72 | sourcesJar { 73 | def commonSources = project(":common").sourcesJar 74 | dependsOn commonSources 75 | from commonSources.archiveFile.map { zipTree(it) } 76 | } 77 | 78 | components.java { 79 | withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { 80 | skip() 81 | } 82 | } 83 | 84 | publishing { 85 | publications { 86 | mavenQuilt(MavenPublication) { 87 | artifactId = rootProject.archives_base_name + "-" + project.name 88 | from components.java 89 | } 90 | } 91 | 92 | // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. 93 | repositories { 94 | // Add repositories to publish to here. 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /quilt/gradle.properties: -------------------------------------------------------------------------------- 1 | loom.platform=quilt -------------------------------------------------------------------------------- /quilt/src/main/java/eu/midnightdust/visualoverhaul/quilt/mixin/MixinAbstractFurnaceBlockEntity.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.quilt.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaul; 4 | import io.netty.buffer.Unpooled; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.entity.AbstractFurnaceBlockEntity; 7 | import net.minecraft.block.entity.BlockEntityType; 8 | import net.minecraft.block.entity.LockableContainerBlockEntity; 9 | import net.minecraft.item.ItemStack; 10 | import net.minecraft.network.PacketByteBuf; 11 | import net.minecraft.server.network.ServerPlayerEntity; 12 | import net.minecraft.util.math.BlockPos; 13 | import net.minecraft.world.World; 14 | import org.quiltmc.qsl.networking.api.PlayerLookup; 15 | import org.quiltmc.qsl.networking.api.ServerPlayNetworking; 16 | import org.spongepowered.asm.mixin.Mixin; 17 | import org.spongepowered.asm.mixin.injection.At; 18 | import org.spongepowered.asm.mixin.injection.Inject; 19 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 20 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 21 | 22 | import java.util.stream.Stream; 23 | 24 | @Mixin(AbstractFurnaceBlockEntity.class) 25 | public abstract class MixinAbstractFurnaceBlockEntity extends LockableContainerBlockEntity { 26 | 27 | private static boolean invUpdate = true; 28 | private static int playerUpdate = -1; 29 | 30 | 31 | protected MixinAbstractFurnaceBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { 32 | super(blockEntityType, blockPos, blockState); 33 | } 34 | 35 | @Inject(at = @At("TAIL"), method = "tick") 36 | private static void tick(World world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity, CallbackInfo ci) { 37 | if (world.getBlockState(pos).hasBlockEntity()) { 38 | if (!world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) { 39 | Stream watchingPlayers = PlayerLookup.tracking(blockEntity).stream(); 40 | PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); 41 | passedData.writeBlockPos(pos); 42 | passedData.writeItemStack(blockEntity.getStack(0)); 43 | passedData.writeItemStack(blockEntity.getStack(1)); 44 | passedData.writeItemStack(blockEntity.getStack(2)); 45 | 46 | watchingPlayers.forEach(player -> ServerPlayNetworking.send(player, VisualOverhaul.UPDATE_FURNACE_ITEMS, passedData)); 47 | invUpdate = false; 48 | } 49 | playerUpdate = world.getPlayers().size(); 50 | } 51 | } 52 | 53 | @Inject(at = @At("RETURN"), method = "getStack") 54 | public void getStack(int slot, CallbackInfoReturnable cir) { 55 | invUpdate = true; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /quilt/src/main/java/eu/midnightdust/visualoverhaul/quilt/mixin/MixinBrewingStandBlockEntity.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.quilt.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaul; 4 | import io.netty.buffer.Unpooled; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.entity.BlockEntityType; 7 | import net.minecraft.block.entity.BrewingStandBlockEntity; 8 | import net.minecraft.block.entity.LockableContainerBlockEntity; 9 | import net.minecraft.item.ItemStack; 10 | import net.minecraft.network.PacketByteBuf; 11 | import net.minecraft.server.network.ServerPlayerEntity; 12 | import net.minecraft.util.math.BlockPos; 13 | import net.minecraft.world.World; 14 | import org.quiltmc.qsl.networking.api.PlayerLookup; 15 | import org.quiltmc.qsl.networking.api.ServerPlayNetworking; 16 | import org.spongepowered.asm.mixin.Mixin; 17 | import org.spongepowered.asm.mixin.injection.At; 18 | import org.spongepowered.asm.mixin.injection.Inject; 19 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 20 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 21 | 22 | import java.util.stream.Stream; 23 | 24 | @Mixin(BrewingStandBlockEntity.class) 25 | public abstract class MixinBrewingStandBlockEntity extends LockableContainerBlockEntity { 26 | 27 | private static boolean invUpdate = true; 28 | private static int playerUpdate = -1; 29 | 30 | protected MixinBrewingStandBlockEntity(BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { 31 | super(blockEntityType, blockPos, blockState); 32 | } 33 | 34 | @Inject(at = @At("TAIL"), method = "tick") 35 | private static void tick(World world, BlockPos pos, BlockState state, BrewingStandBlockEntity blockEntity, CallbackInfo ci) { 36 | if (!world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) { 37 | Stream watchingPlayers = PlayerLookup.tracking(blockEntity).stream(); 38 | PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); 39 | passedData.writeBlockPos(pos); 40 | passedData.writeItemStack(blockEntity.getStack(0)); 41 | passedData.writeItemStack(blockEntity.getStack(1)); 42 | passedData.writeItemStack(blockEntity.getStack(2)); 43 | passedData.writeItemStack(blockEntity.getStack(3)); 44 | passedData.writeItemStack(blockEntity.getStack(4)); 45 | 46 | watchingPlayers.forEach(player -> ServerPlayNetworking.send(player, VisualOverhaul.UPDATE_POTION_BOTTLES, passedData)); 47 | invUpdate = false; 48 | } 49 | playerUpdate = world.getPlayers().size(); 50 | } 51 | 52 | @Inject(at = @At("RETURN"), method = "getStack") 53 | public void getStack(int slot, CallbackInfoReturnable cir) { 54 | invUpdate = true; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /quilt/src/main/java/eu/midnightdust/visualoverhaul/quilt/mixin/MixinJukeboxBlock.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.quilt.mixin; 2 | 3 | import eu.midnightdust.visualoverhaul.VisualOverhaul; 4 | import eu.midnightdust.visualoverhaul.util.JukeboxPacketUpdate; 5 | import io.netty.buffer.Unpooled; 6 | import net.minecraft.block.BlockRenderType; 7 | import net.minecraft.block.BlockState; 8 | import net.minecraft.block.BlockWithEntity; 9 | import net.minecraft.block.JukeboxBlock; 10 | import net.minecraft.block.entity.BlockEntity; 11 | import net.minecraft.block.entity.BlockEntityTicker; 12 | import net.minecraft.block.entity.BlockEntityType; 13 | import net.minecraft.block.entity.JukeboxBlockEntity; 14 | import net.minecraft.network.PacketByteBuf; 15 | import net.minecraft.server.network.ServerPlayerEntity; 16 | import net.minecraft.util.math.BlockPos; 17 | import net.minecraft.world.World; 18 | import org.jetbrains.annotations.Nullable; 19 | import org.quiltmc.qsl.networking.api.PlayerLookup; 20 | import org.quiltmc.qsl.networking.api.ServerPlayNetworking; 21 | import org.spongepowered.asm.mixin.Mixin; 22 | import org.spongepowered.asm.mixin.Unique; 23 | 24 | import java.util.stream.Stream; 25 | 26 | @Mixin(JukeboxBlock.class) 27 | public abstract class MixinJukeboxBlock extends BlockWithEntity { 28 | 29 | protected MixinJukeboxBlock(Settings settings) { 30 | super(settings); 31 | } 32 | 33 | @Override 34 | public BlockRenderType getRenderType(BlockState state) { 35 | return BlockRenderType.MODEL; 36 | } 37 | 38 | @Nullable 39 | public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { 40 | return world.isClient() ? null : checkType(type, BlockEntityType.JUKEBOX, MixinJukeboxBlock::tick); 41 | } 42 | @Unique 43 | private static void tick(World world, BlockPos pos, BlockState state, JukeboxBlockEntity blockEntity) { 44 | if (!world.isClient && (JukeboxPacketUpdate.invUpdate || world.getPlayers().size() == JukeboxPacketUpdate.playerUpdate)) { 45 | Stream watchingPlayers = PlayerLookup.tracking(blockEntity).stream(); 46 | PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); 47 | passedData.writeBlockPos(pos); 48 | passedData.writeItemStack(blockEntity.getStack()); 49 | 50 | watchingPlayers.forEach(player -> ServerPlayNetworking.send(player, VisualOverhaul.UPDATE_RECORD, passedData)); 51 | JukeboxPacketUpdate.invUpdate = false; 52 | } 53 | JukeboxPacketUpdate.playerUpdate = world.getPlayers().size(); 54 | } 55 | } 56 | 57 | -------------------------------------------------------------------------------- /quilt/src/main/java/eu/midnightdust/visualoverhaul/util/fabric/ModIconUtilImpl.java: -------------------------------------------------------------------------------- 1 | package eu.midnightdust.visualoverhaul.util.fabric; 2 | 3 | import org.quiltmc.loader.api.ModContainer; 4 | import org.quiltmc.loader.api.QuiltLoader; 5 | 6 | import java.nio.file.Path; 7 | 8 | public class ModIconUtilImpl { 9 | public static Path getPath(String modid) { 10 | ModContainer mod = QuiltLoader.getModContainer(modid).orElseThrow(() -> new RuntimeException("Cannot get ModContainer for Fabric mod with id ")); 11 | return mod.getPath(mod.metadata().icon(16)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /quilt/src/main/resources/quilt.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schema_version": 1, 3 | "quilt_loader": { 4 | "group": "${group}", 5 | "id": "visualoverhaul", 6 | "version": "${version}", 7 | "intermediate_mappings": "net.fabricmc:intermediary", 8 | "entrypoints": { 9 | "client_init": [ 10 | "eu.midnightdust.visualoverhaul.quilt.VisualOverhaulClientQuilt" 11 | ] 12 | }, 13 | "depends": [ 14 | { 15 | "id": "quilt_loader", 16 | "version": "*" 17 | }, 18 | { 19 | "id": "quilt_base", 20 | "version": "*" 21 | }, 22 | { 23 | "id": "midnightlib", 24 | "version": "*" 25 | } 26 | ], 27 | "metadata": { 28 | "name": "VisualOverhaul (Quilt)", 29 | "description": "Adds better visuals for certain Minecraft Vanilla Blocks.", 30 | "contributors": { 31 | "Motschen": "Author", 32 | "TeamMidnightDust": "Mascot" 33 | }, 34 | "environment": "client", 35 | "license": "MIT", 36 | "contact": { 37 | "email": "mail@midnightdust.eu", 38 | "homepage": "https://modrinth.com/mod/visualoverhaul", 39 | "issues": "https://github.com/TeamMidnightDust/VisualOverhaul/issues", 40 | "sources": "https://github.com/TeamMidnightDust/VisualOverhaul" 41 | }, 42 | "icon": "assets/visualoverhaul/icon.png" 43 | } 44 | }, 45 | "mixin": [ 46 | "visualoverhaul.mixins.json", 47 | "visualoverhaul-quilt.mixins.json" 48 | ] 49 | } -------------------------------------------------------------------------------- /quilt/src/main/resources/visualoverhaul-quilt.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "eu.midnightdust.visualoverhaul.quilt.mixin", 4 | "compatibilityLevel": "JAVA_17", 5 | "minVersion": "0.8", 6 | "mixins": [ 7 | "MixinJukeboxBlock", 8 | "MixinAbstractFurnaceBlockEntity", 9 | "MixinBrewingStandBlockEntity" 10 | ], 11 | "injectors": { 12 | "defaultRequire": 1 13 | } 14 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | maven { url "https://maven.fabricmc.net/" } 4 | maven { url "https://maven.architectury.dev/" } 5 | maven { url "https://maven.neoforged.net/releases" } 6 | gradlePluginPortal() 7 | } 8 | } 9 | 10 | include("common") 11 | include("fabric") 12 | //include("quilt") 13 | include("neoforge") 14 | 15 | rootProject.name = "visualoverhaul" 16 | --------------------------------------------------------------------------------