7 Commits

Author SHA1 Message Date
Motschen
1bcba33aaa VisualOverhaul 3.3.0 - 1.17 and small Refactor
Update to 1.17-pre1 and Java 16
Upgrade to MidnightLib, making the config more clean and accessible without modmenu
(Please ignore the commits before)
2021-05-30 13:25:44 +02:00
Motschen
88e5c38337 Revert "VisualOverhaul 3.1.0 - 1.17 and small Refactor"
This reverts commit 98dee343e1.
2021-05-30 13:22:52 +02:00
Motschen
98dee343e1 VisualOverhaul 3.1.0 - 1.17 and small Refactor
Update to 1.17-pre1 and Java 16
Upgrade to MidnightLib, making the config more clean and accessible without modmenu
2021-05-30 13:15:12 +02:00
Motschen
8f51167982 VisualOverhaul 3.2.0 - Compat & Stability
- Overhaul Phonos's Radio Jukebox
-Added compat with Biome Makeover, Desolation, Dynamic Discs, Extra Discs and Phonos discs

- Fixed crash with Charm
- Way smoother biome-colored items
- Biome colored items for more vanilla items
- Serverside method to get music discs is now prioritized, clientside method only applies if the ItemStack is empty

- Move puddles into a seperate mod
2021-03-30 20:35:17 +02:00
Motschen
afac024e9e Client side implementation of the jukebox overhaul
Uses a mixin into the sound system to determine the sound played at the position of the jukebox, then tries to get the record item of the sound.
If it fails it will fall back to the server side implementation.
2021-03-28 12:07:47 +02:00
Motschen
f802e803b9 Fix #9 2021-03-15 13:43:38 +01:00
Motschen
0d008e40d9 Fix puddles connecting weirdly
The cause of the bug cannot be easily fixed and would cause issues with certain renderers, so I just made puddles unable to be placed when the corners or sides of the block above or below already have a fluid.
2021-03-15 13:32:28 +01:00
149 changed files with 1766 additions and 553 deletions

0
.gitignore vendored Normal file → Executable file
View File

0
LICENSE Normal file → Executable file
View File

0
README.md Normal file → Executable file
View File

62
build.gradle Normal file → Executable file
View File

@@ -1,10 +1,10 @@
plugins {
id 'fabric-loom' version '0.5-SNAPSHOT'
id 'fabric-loom' version '0.8-SNAPSHOT'
id 'maven-publish'
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_16
targetCompatibility = JavaVersion.VERSION_16
archivesBaseName = project.archives_base_name
version = project.mod_version
@@ -14,6 +14,7 @@ minecraft {
}
repositories {
maven { url "https://maven.terraformersmc.com/releases" }
maven { url "https://jitpack.io" }
}
@@ -21,11 +22,16 @@ dependencies {
//to change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
modCompile "net.fabricmc:fabric-loader:${project.loader_version}"
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
modCompile "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
modImplementation ("io.github.prospector:modmenu:${project.mod_menu_version}") {
compileOnly "io.github.FoundationGames:Phonos:0.1.1-1.17"
modImplementation "com.github.TeamMidnightDust:MidnightLib:${midnightlib_version}"
include "com.github.TeamMidnightDust:MidnightLib:${midnightlib_version}"
modImplementation ("com.terraformersmc:modmenu:${project.mod_menu_version}") {
exclude group: "net.fabricmc.fabric-api"
}
}
@@ -33,33 +39,33 @@ dependencies {
processResources {
inputs.property "version", project.version
from(sourceSets.main.resources.srcDirs) {
include "fabric.mod.json"
filesMatching("fabric.mod.json") {
expand "version": project.version
}
from(sourceSets.main.resources.srcDirs) {
exclude "fabric.mod.json"
}
}
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
tasks.withType(JavaCompile).configureEach {
// ensure that the encoding is set to UTF-8, no matter what the system default is
// this fixes some edge cases with special characters not displaying correctly
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
// If Javadoc is generated, this must be specified in that task too.
it.options.encoding = "UTF-8"
// Minecraft 1.17 (21w19a) upwards uses Java 16.
it.options.release = 16
}
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this task, sources will not be generated.
task sourcesJar(type: Jar, dependsOn: classes) {
classifier = "sources"
from sourceSets.main.allSource
java {
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()
}
jar {
from "LICENSE"
from("LICENSE") {
rename { "${it}_${project.archivesBaseName}"}
}
}
// configure the maven publication
@@ -76,9 +82,11 @@ publishing {
}
}
// select the repositories you want to publish to
// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
repositories {
// uncomment to publish to the local maven
// mavenLocal()
// Add repositories to publish to here.
// Notice: This block does NOT have the same function as the block in the top level.
// The repositories here will be used for publishing your artifact, not for
// retrieving dependencies.
}
}

14
gradle.properties Normal file → Executable file
View File

@@ -3,17 +3,17 @@ org.gradle.jvmargs=-Xmx1G
# Fabric Properties
# check these on https://fabricmc.net/use
minecraft_version=1.16.5
yarn_mappings=1.16.5+build.3
loader_version=0.11.1
minecraft_version=1.17-pre1
yarn_mappings=1.17-pre1+build.9
loader_version=0.11.3
# Mod Properties
mod_version = 3.0.0
mod_version = 3.3.0
maven_group = eu.midnightdust
archives_base_name = visualoverhaul
# Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
fabric_version=0.29.4+1.16
mod_menu_version = 1.14.6+build.31
fabric_version=0.34.8+1.17
mod_menu_version = 2.0.0-beta.5
midnightlib_version=v0.2.2

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file → Executable file

Binary file not shown.

2
gradle/wrapper/gradle-wrapper.properties vendored Normal file → Executable file
View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

35
gradlew vendored Normal file → Executable file
View File

@@ -82,6 +82,7 @@ esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -125,10 +126,11 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
@@ -154,19 +156,19 @@ if $cygwin ; then
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
i=`expr $i + 1`
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
@@ -175,14 +177,9 @@ save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

25
gradlew.bat vendored Normal file → Executable file
View File

@@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -51,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -61,28 +64,14 @@ echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell

0
settings.gradle Normal file → Executable file
View File

View File

@@ -1,33 +1,11 @@
package eu.midnightdust.visualoverhaul;
import eu.midnightdust.visualoverhaul.block.PuddleBlock;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory;
import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.Block;
import net.minecraft.block.Material;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.GameRules;
public class VisualOverhaul implements ModInitializer {
public class VisualOverhaul {
public static final String MOD_ID = "visualoverhaul";
public static final Block Puddle = new PuddleBlock(Fluids.WATER, FabricBlockSettings.of(Material.WATER));
public static GameRules.Key<GameRules.IntRule> PUDDLE_SPAWN_RATE;
public static GameRules.Key<GameRules.IntRule> SNOW_STACK_CHANCE;
public static final Identifier UPDATE_POTION_BOTTLES = new Identifier("visualoverhaul", "brewingstand");
public static final Identifier UPDATE_RECORD = new Identifier("visualoverhaul", "record");
public static final Identifier UPDATE_FURNACE_ITEMS = new Identifier("visualoverhaul", "furnace");
public void onInitialize() {
PUDDLE_SPAWN_RATE = GameRuleRegistry.register("puddleSpawnRate", GameRules.Category.SPAWNING, GameRuleFactory.createIntRule(1));
SNOW_STACK_CHANCE = GameRuleRegistry.register("snowStackChance", GameRules.Category.SPAWNING, GameRuleFactory.createIntRule(1));
Registry.register(Registry.BLOCK, new Identifier(MOD_ID,"puddle"), Puddle);
Registry.register(Registry.ITEM, new Identifier(MOD_ID,"puddle"), new BlockItem(Puddle, new Item.Settings()));
}
public static final Identifier UPDATE_POTION_BOTTLES = new Identifier(MOD_ID, "brewingstand");
public static final Identifier UPDATE_RECORD = new Identifier(MOD_ID, "record");
public static final Identifier UPDATE_FURNACE_ITEMS = new Identifier(MOD_ID, "furnace");
}

View File

@@ -1,6 +1,7 @@
package eu.midnightdust.visualoverhaul;
import eu.midnightdust.visualoverhaul.block.JukeboxTop;
import eu.midnightdust.visualoverhaul.block.model.FurnaceWoodenPlanksModel;
import eu.midnightdust.visualoverhaul.block.renderer.BrewingStandBlockEntityRenderer;
import eu.midnightdust.visualoverhaul.block.renderer.FurnaceBlockEntityRenderer;
import eu.midnightdust.visualoverhaul.block.renderer.JukeboxBlockEntityRenderer;
@@ -8,11 +9,13 @@ import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry;
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
import net.fabricmc.fabric.api.item.v1.FabricItemSettings;
import net.fabricmc.fabric.api.object.builder.v1.client.model.FabricModelPredicateProviderRegistry;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl;
import net.fabricmc.fabric.impl.client.rendering.ColorProviderRegistryImpl;
import net.fabricmc.fabric.impl.networking.ClientSidePacketRegistryImpl;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.Block;
@@ -22,7 +25,9 @@ import net.minecraft.block.entity.BrewingStandBlockEntity;
import net.minecraft.block.entity.FurnaceBlockEntity;
import net.minecraft.block.entity.JukeboxBlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.color.world.BiomeColors;
import net.minecraft.client.render.*;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.MusicDiscItem;
@@ -32,17 +37,15 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BuiltinBiomes;
import java.util.Objects;
import static eu.midnightdust.visualoverhaul.VisualOverhaul.*;
@SuppressWarnings("deprecation")
@SuppressWarnings("UnstableApiUsage")
public class VisualOverhaulClient implements ClientModInitializer {
public static Block JukeBoxTop = new JukeboxTop();
public static Item RoundDiscDummy = new Item(new FabricItemSettings());
private final MinecraftClient client = MinecraftClient.getInstance();
@Override
@@ -51,6 +54,9 @@ public class VisualOverhaulClient implements ClientModInitializer {
// Block only registered on client, because it's just used for the renderer //
Registry.register(Registry.BLOCK, new Identifier("visualoverhaul","jukebox_top"), JukeBoxTop);
Registry.register(Registry.ITEM, new Identifier("visualoverhaul","round_disc"), RoundDiscDummy);
EntityModelLayerRegistry.registerModelLayer(FurnaceWoodenPlanksModel.WOODEN_PLANKS_MODEL_LAYER, FurnaceWoodenPlanksModel::getTexturedModelData);
BlockRenderLayerMapImpl.INSTANCE.putBlock(Blocks.JUKEBOX, RenderLayer.getCutout());
BlockRenderLayerMapImpl.INSTANCE.putBlock(JukeBoxTop, RenderLayer.getCutout());
@@ -60,9 +66,15 @@ public class VisualOverhaulClient implements ClientModInitializer {
BlockEntityRendererRegistry.INSTANCE.register(BlockEntityType.JUKEBOX, JukeboxBlockEntityRenderer::new);
BlockEntityRendererRegistry.INSTANCE.register(BlockEntityType.FURNACE, FurnaceBlockEntityRenderer::new);
// // Phonos Compat //
// if (FabricLoader.getInstance().isModLoaded("phonos")) {
// PhonosCompatInit.init();
// BlockEntityRendererRegistry.INSTANCE.register(PhonosBlocks.RADIO_JUKEBOX_ENTITY, RadioJukeboxBlockEntityRenderer::new);
// }
Registry.ITEM.forEach((item) -> {
if(item instanceof MusicDiscItem) {
FabricModelPredicateProviderRegistry.register(item, new Identifier("round"), (stack, world, entity) -> stack.getCount() == 2 ? 1.0F : 0.0F);
if(item instanceof MusicDiscItem || item.getName().getString().toLowerCase().contains("music_disc") || item.getName().getString().toLowerCase().contains("dynamic_disc")) {
FabricModelPredicateProviderRegistry.register(item, new Identifier("round"), (stack, world, entity, seed) -> stack.getCount() == 2 ? 1.0F : 0.0F);
}
});
@@ -74,8 +86,7 @@ public class VisualOverhaulClient implements ClientModInitializer {
inv.set(i, attachedData.readItemStack());
}
packetContext.getTaskQueue().execute(() -> {
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof BrewingStandBlockEntity) {
BrewingStandBlockEntity blockEntity = (BrewingStandBlockEntity) client.world.getBlockEntity(pos);
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof BrewingStandBlockEntity blockEntity) {
blockEntity.setStack(0, inv.get(0));
blockEntity.setStack(1, inv.get(1));
blockEntity.setStack(2, inv.get(2));
@@ -89,8 +100,7 @@ public class VisualOverhaulClient implements ClientModInitializer {
BlockPos pos = attachedData.readBlockPos();
ItemStack record = attachedData.readItemStack();
packetContext.getTaskQueue().execute(() -> {
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof JukeboxBlockEntity) {
JukeboxBlockEntity blockEntity = (JukeboxBlockEntity) client.world.getBlockEntity(pos);
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof JukeboxBlockEntity blockEntity) {
blockEntity.setRecord(record);
}
});
@@ -103,8 +113,7 @@ public class VisualOverhaulClient implements ClientModInitializer {
inv.set(i, attachedData.readItemStack());
}
packetContext.getTaskQueue().execute(() -> {
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof FurnaceBlockEntity) {
FurnaceBlockEntity blockEntity = (FurnaceBlockEntity) client.world.getBlockEntity(pos);
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof FurnaceBlockEntity blockEntity) {
blockEntity.setStack(0, inv.get(0));
blockEntity.setStack(1, inv.get(1));
blockEntity.setStack(2, inv.get(2));
@@ -114,27 +123,33 @@ public class VisualOverhaulClient implements ClientModInitializer {
// Register builtin resourcepacks
FabricLoader.getInstance().getModContainer("visualoverhaul").ifPresent(modContainer -> {
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul:nobottles"), "resourcepacks/nobrewingbottles", modContainer, true);
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul:fancyfurnace"), "resourcepacks/fancyfurnace", modContainer, true);
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul:coloredwaterbucket"), "resourcepacks/coloredwaterbucket", modContainer, true);
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul","nobrewingbottles"), modContainer, ResourcePackActivationType.DEFAULT_ENABLED);
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul","fancyfurnace"), modContainer, ResourcePackActivationType.DEFAULT_ENABLED);
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("visualoverhaul","coloredwaterbucket"), modContainer, ResourcePackActivationType.DEFAULT_ENABLED);
});
// Context Colored Items
// Biome-colored Items
if (VOConfig.coloredItems) {
ClientTickEvents.END_CLIENT_TICK.register(client -> {
int waterColor;
int foliageColor;
int grassColor;
if (client.world != null) {
Biome biome = client.world.getBiome(client.player.getBlockPos());
waterColor = biome.getWaterColor();
foliageColor = biome.getFoliageColor();
assert client.player != null;
waterColor = client.world.getColor(client.player.getBlockPos(), BiomeColors.WATER_COLOR);
foliageColor = client.world.getColor(client.player.getBlockPos(), BiomeColors.FOLIAGE_COLOR);
grassColor = client.world.getColor(client.player.getBlockPos(), BiomeColors.GRASS_COLOR);
} else {
waterColor = BuiltinBiomes.PLAINS.getWaterColor();
foliageColor = BuiltinBiomes.PLAINS.getFoliageColor();
grassColor = BuiltinBiomes.PLAINS.getFoliageColor();
}
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> waterColor, VisualOverhaul.Puddle);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> tintIndex == 0 ? -1 : waterColor, Items.WATER_BUCKET);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> foliageColor, Items.GRASS_BLOCK);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> grassColor, Items.GRASS_BLOCK);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> grassColor, Items.GRASS);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> grassColor, Items.TALL_GRASS);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> grassColor, Items.FERN);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> grassColor, Items.LARGE_FERN);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> foliageColor, Items.ACACIA_LEAVES);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> foliageColor, Items.DARK_OAK_LEAVES);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> foliageColor, Items.JUNGLE_LEAVES);
@@ -145,12 +160,19 @@ public class VisualOverhaulClient implements ClientModInitializer {
}
return tintIndex > 0 ? -1 : PotionUtil.getColor(stack);
}, Items.POTION);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> {
if (PotionUtil.getPotion(stack) == Potions.WATER && tintIndex == 0) {
return waterColor;
}
return tintIndex > 0 ? -1 : PotionUtil.getColor(stack);
}, Items.SPLASH_POTION);
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> {
if (PotionUtil.getPotion(stack) == Potions.WATER && tintIndex == 0) {
return waterColor;
}
return tintIndex > 0 ? -1 : PotionUtil.getColor(stack);
}, Items.LINGERING_POTION);
});
}
// Else just register a static color for our puddle item
else {
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> BuiltinBiomes.PLAINS.getWaterColor(), Puddle);
}
ColorProviderRegistry.BLOCK.register((state, view, pos, tintIndex) -> Objects.requireNonNull(ColorProviderRegistryImpl.BLOCK.get(Blocks.WATER)).getColor(state, view, pos, tintIndex), Puddle);
}
}

View File

@@ -9,15 +9,14 @@ import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.Properties;
public class JukeboxTop extends Block {
private static final BooleanProperty HAS_RECORD = Properties.HAS_RECORD;
private static final BooleanProperty HAS_RECORD = Properties.HAS_RECORD;
public JukeboxTop() {
super(FabricBlockSettings.copy(Blocks.JUKEBOX));
this.setDefaultState(this.stateManager.getDefaultState().with(HAS_RECORD,false));
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(HAS_RECORD);
}
public JukeboxTop() {
super(FabricBlockSettings.copy(Blocks.JUKEBOX));
this.setDefaultState(this.stateManager.getDefaultState().with(HAS_RECORD,false));
}
@Override
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
builder.add(HAS_RECORD);
}
}

View File

@@ -1,134 +0,0 @@
package eu.midnightdust.visualoverhaul.block;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.block.*;
import net.minecraft.entity.ai.pathing.NavigationType;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.*;
import net.minecraft.item.*;
import net.minecraft.loot.context.LootContext;
import net.minecraft.potion.PotionUtil;
import net.minecraft.potion.Potions;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
import net.minecraft.stat.Stats;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView;
import net.minecraft.world.World;
import net.minecraft.world.WorldAccess;
import net.minecraft.world.WorldView;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class PuddleBlock extends Block {
protected final FlowableFluid fluid;
public static final VoxelShape COLLISION_SHAPE;
public PuddleBlock(FlowableFluid fluid, AbstractBlock.Settings settings) {
super(settings);
this.fluid = fluid;
}
@Override
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
ItemStack itemStack = player.getStackInHand(hand);
if (itemStack.isEmpty()) {
return ActionResult.PASS;
} else {
Item item = itemStack.getItem();
ItemStack waterBottleStack;
if (item == Items.GLASS_BOTTLE) {
if (!world.isClient) {
if (!player.abilities.creativeMode) {
waterBottleStack = PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER);
player.incrementStat(Stats.USE_CAULDRON);
itemStack.decrement(1);
if (itemStack.isEmpty()) {
player.setStackInHand(hand, waterBottleStack);
} else if (!player.inventory.insertStack(waterBottleStack)) {
player.dropItem(waterBottleStack, false);
} else if (player instanceof ServerPlayerEntity) {
((ServerPlayerEntity)player).refreshScreenHandler(player.playerScreenHandler);
}
}
world.playSound(null, pos, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
world.setBlockState(pos, Blocks.AIR.getDefaultState());
}
return ActionResult.success(world.isClient);
}
else return ActionResult.FAIL;
}
}
@Override
public boolean hasRandomTicks(BlockState state) {
return true;
}
@Override
public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
if (!world.isRaining() && random.nextInt(2000) == 0) {
world.setBlockState(pos, Blocks.AIR.getDefaultState());
}
this.scheduledTick(state, world, pos, random);
}
@Override
public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
return context.isAbove(COLLISION_SHAPE, pos, true) ? COLLISION_SHAPE : VoxelShapes.empty();
}
@Override
public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) {
return COLLISION_SHAPE;
}
@Override
public VoxelShape getCullingShape(BlockState state, BlockView world, BlockPos pos) {
return VoxelShapes.empty();
}
public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) {
return true;
}
public FluidState getFluidState(BlockState state) {
return fluid.getFlowing(1,false);
}
@Environment(EnvType.CLIENT)
public boolean isSideInvisible(BlockState state, BlockState stateFrom, Direction direction) {
return stateFrom.getFluidState().getFluid().matchesType(this.fluid);
}
public BlockRenderType getRenderType(BlockState state) {
return BlockRenderType.INVISIBLE;
}
public List<ItemStack> getDroppedStacks(BlockState state, LootContext.Builder builder) {
return Collections.emptyList();
}
public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) {
return world.getBlockState(pos.down()).isSideSolidFullSquare(world,pos,Direction.UP);
}
public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState newState, WorldAccess world, BlockPos pos, BlockPos posFrom) {
return !state.canPlaceAt(world, pos) ? Blocks.AIR.getDefaultState() : super.getStateForNeighborUpdate(state, direction, newState, world, pos, posFrom);
}
static {
COLLISION_SHAPE = net.minecraft.block.Block.createCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 0.5D, 16.0D);
}
}

View File

@@ -0,0 +1,39 @@
package eu.midnightdust.visualoverhaul.block.model;
import net.minecraft.client.model.*;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.entity.model.EntityModelLayer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
public class FurnaceWoodenPlanksModel extends Model {
private static ModelPart bb_main;
public static final EntityModelLayer WOODEN_PLANKS_MODEL_LAYER = new EntityModelLayer(new Identifier("visualoverhaul", "wooden_planks"), "main");
public FurnaceWoodenPlanksModel(ModelPart root) {
super(RenderLayer::getEntitySolid);
bb_main = root;
bb_main.setPivot(0.0F, 24.0F, 0.0F);
}
public ModelPart getPart() {
return bb_main;
}
public static TexturedModelData getTexturedModelData() {
return TexturedModelData.of(getModelData(), 16, 16);
}
public static ModelData getModelData(){
ModelData modelData = new ModelData();
ModelPartData modelPartData = modelData.getRoot();
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));
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));
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));
return modelData;
}
public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
bb_main.render(matrices, vertices, light, overlay, red, green, blue, alpha);
}
}

View File

@@ -9,16 +9,18 @@ import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
import net.minecraft.client.render.model.json.ModelTransformation;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.Vec3f;
import java.util.Objects;
@Environment(EnvType.CLIENT)
public class BrewingStandBlockEntityRenderer extends BlockEntityRenderer<BrewingStandBlockEntity> {
public class BrewingStandBlockEntityRenderer implements BlockEntityRenderer<BrewingStandBlockEntity> {
public BrewingStandBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) {
super(blockEntityRenderDispatcher);
public BrewingStandBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {
}
@@ -26,35 +28,41 @@ public class BrewingStandBlockEntityRenderer extends BlockEntityRenderer<Brewing
public void render(BrewingStandBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
if (VOConfig.brewingstand) {
int lightAtBlock = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), blockEntity.getPos());
int lightAtBlock = WorldRenderer.getLightmapCoordinates(Objects.requireNonNull(blockEntity.getWorld()), blockEntity.getPos());
ItemStack item1 = blockEntity.getStack(0);
ItemStack item2 = blockEntity.getStack(1);
ItemStack item3 = blockEntity.getStack(2);
matrices.push();
if (!item1.isEmpty()) {
matrices.push();
matrices.translate(0.86f, 0.23f, 0.5f);
matrices.scale(1.15f, 1.15f, 1.15f);
matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(180));
MinecraftClient.getInstance().getItemRenderer().renderItem(item1, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers);
matrices.translate(0.86f, 0.23f, 0.5f);
matrices.scale(1.15f, 1.15f, 1.15f);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(180));
MinecraftClient.getInstance().getItemRenderer().renderItem(item1, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, 0);
matrices.pop();
matrices.push();
matrices.pop();
}
if (!item2.isEmpty()) {
matrices.push();
matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(315));
matrices.translate(0.32f, 0.23f, 0f);
matrices.scale(1.15f, 1.15f, 1.15f);
MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(315));
matrices.translate(0.32f, 0.23f, 0f);
matrices.scale(1.15f, 1.15f, 1.15f);
MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, 0);
matrices.pop();
matrices.push();
matrices.pop();
}
if (!item3.isEmpty()) {
matrices.push();
matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(45));
matrices.translate(-0.39f, 0.23f, 0.705f);
matrices.scale(1.15f, 1.15f, 1.15f);
MinecraftClient.getInstance().getItemRenderer().renderItem(item3, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(45));
matrices.translate(-0.39f, 0.23f, 0.705f);
matrices.scale(1.15f, 1.15f, 1.15f);
MinecraftClient.getInstance().getItemRenderer().renderItem(item3, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, 0);
matrices.pop();
matrices.pop();
}
}
}
}

View File

@@ -1,98 +1,71 @@
package eu.midnightdust.visualoverhaul.block.renderer;
import eu.midnightdust.visualoverhaul.block.model.FurnaceWoodenPlanksModel;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.block.*;
import net.minecraft.block.entity.FurnaceBlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.model.ModelPart;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
import net.minecraft.client.render.model.json.ModelTransformation;
import net.minecraft.client.texture.Sprite;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.item.ItemStack;
import net.minecraft.tag.ItemTags;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Vec3f;
import java.util.Objects;
@Environment(EnvType.CLIENT)
public class FurnaceBlockEntityRenderer extends BlockEntityRenderer<FurnaceBlockEntity> {
private static final ModelPart bb_main;
private static final ModelPart cube_r1;
private static final ModelPart cube_r2;
private static final ModelPart cube_r3;
public class FurnaceBlockEntityRenderer implements BlockEntityRenderer<FurnaceBlockEntity> {
private final FurnaceWoodenPlanksModel planks;
static {
bb_main = new ModelPart(16, 16, 0, 0);
bb_main.setPivot(0.0F, 24.0F, 0.0F);
cube_r1 = new ModelPart(16, 16, 0, 0);
cube_r1.setPivot(6.0F, 1.0F, -2.0F);
bb_main.addChild(cube_r1);
setRotationAngle(cube_r1, 0.0F, -0.5672F, 0.0F);
cube_r1.setTextureOffset(0, 0).addCuboid(-10.0F, -3.0F, 0.0F, 10.0F, 1.0F, 1.0F, 0.0F, false);
cube_r2 = new ModelPart(16, 16, 0, 0);
cube_r2.setPivot(5.0F, 0.0F, -5.0F);
bb_main.addChild(cube_r2);
setRotationAngle(cube_r2, 0.0F, -0.1309F, 0.0F);
cube_r2.setTextureOffset(0, 0).addCuboid(-10.0F, -2.5F, 0.0F, 10.0F, 2.0F, 2.0F, 0.0F, false);
cube_r3 = new ModelPart(16, 16, 0, 0);
cube_r3.setPivot(5.0F, -1.0F, -7.0F);
bb_main.addChild(cube_r3);
setRotationAngle(cube_r3, 0.0F, 0.2618F, 0.0F);
cube_r3.setTextureOffset(0, 0).addCuboid(-10.0F, -2.0F, 0.0F, 10.0F, 2.0F, 2.0F, 0.0F, false);
}
public static void setRotationAngle(ModelPart bone, float x, float y, float z) {
bone.pitch = x;
bone.yaw = y;
bone.roll = z;
}
public FurnaceBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) {
super(blockEntityRenderDispatcher);
public FurnaceBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {
this.planks = new FurnaceWoodenPlanksModel(ctx.getLayerModelPart(FurnaceWoodenPlanksModel.WOODEN_PLANKS_MODEL_LAYER));
}
@Override
public void render(FurnaceBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
if (VOConfig.furnace && blockEntity.getCachedState().getBlock().is(Blocks.FURNACE)) {
if (VOConfig.furnace && blockEntity.getCachedState().getBlock().getDefaultState().isOf(Blocks.FURNACE)) {
BlockState blockState = blockEntity.getCachedState();
int lightAtBlock = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), blockEntity.getPos().offset(blockState.get(AbstractFurnaceBlock.FACING)));
int lightAtBlock = WorldRenderer.getLightmapCoordinates(Objects.requireNonNull(blockEntity.getWorld()), blockEntity.getPos().offset(blockState.get(AbstractFurnaceBlock.FACING)));
ItemStack item1 = blockEntity.getStack(0);
ItemStack item2 = blockEntity.getStack(1);
float angle = (blockState.get(AbstractFurnaceBlock.FACING)).asRotation();
matrices.push();
if(!item1.isEmpty()) {
matrices.push();
matrices.translate(0.5f, 0.58f, 0.5f);
matrices.scale(1f, 1f, 1f);
matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
matrices.translate(0.0f, 0.0f, -0.4f);
matrices.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90));
MinecraftClient.getInstance().getItemRenderer().renderItem(item1, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers);
matrices.translate(0.5f, 0.58f, 0.5f);
matrices.scale(1f, 1f, 1f);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
matrices.translate(0.0f, 0.0f, -0.4f);
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(90));
MinecraftClient.getInstance().getItemRenderer().renderItem(item1, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, 0);
matrices.pop();
if (!item2.getItem().isIn(ItemTags.LOGS_THAT_BURN) && !item2.getItem().isIn(ItemTags.PLANKS)) {
matrices.pop();
}
if (!item2.isEmpty() && !ItemTags.LOGS_THAT_BURN.contains(item2.getItem()) && !ItemTags.PLANKS.contains(item2.getItem())) {
matrices.push();
matrices.translate(0.5f, 0.08f, 0.5f);
matrices.scale(1f, 1f, 1f);
matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
matrices.translate(0.0f, 0.0f, -0.4f);
matrices.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(90));
MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers);
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(90));
MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers,0);
matrices.pop();
}
if (item2.getItem().isIn(ItemTags.LOGS_THAT_BURN) || item2.getItem().isIn(ItemTags.PLANKS)) {
else if (!item2.isEmpty()) {
matrices.push();
BlockState state = Block.getBlockFromItem(item2.getItem()).getDefaultState();
Sprite texture = MinecraftClient.getInstance().getBlockRenderManager().getModel(state).getSprite();
@@ -102,8 +75,8 @@ public class FurnaceBlockEntityRenderer extends BlockEntityRenderer<FurnaceBlock
matrices.scale(1f, 1f, 1f);
matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
bb_main.render(matrices, vertexConsumer, lightAtBlock, overlay);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
planks.getPart().render(matrices, vertexConsumer, lightAtBlock, overlay);
matrices.pop();
}
}

View File

@@ -2,47 +2,81 @@ package eu.midnightdust.visualoverhaul.block.renderer;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import eu.midnightdust.visualoverhaul.util.SoundTest;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.block.SideShapeType;
import net.minecraft.block.entity.JukeboxBlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
import net.minecraft.client.render.model.json.ModelTransformation;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Vector3f;
import net.minecraft.item.ItemStack;
import net.minecraft.state.property.Properties;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3f;
import net.minecraft.util.registry.Registry;
import org.apache.logging.log4j.LogManager;
import java.util.Random;
import java.util.*;
@Environment(EnvType.CLIENT)
public class JukeboxBlockEntityRenderer extends BlockEntityRenderer<JukeboxBlockEntity> {
public class JukeboxBlockEntityRenderer implements BlockEntityRenderer<JukeboxBlockEntity> {
private ItemStack record;
private Identifier discItem;
public JukeboxBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) {
super(blockEntityRenderDispatcher);
public JukeboxBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {
}
@Override
public void render(JukeboxBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
if (VOConfig.jukebox) {
int lightAbove = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), blockEntity.getPos().up());
ItemStack record = blockEntity.getRecord();
record.setCount(2);
int lightAbove = WorldRenderer.getLightmapCoordinates(Objects.requireNonNull(blockEntity.getWorld()), blockEntity.getPos().up());
matrices.push();
// Tries to get the disc using the serverside method
if (blockEntity.getRecord() != ItemStack.EMPTY) {
record = blockEntity.getRecord().copy();
}
// Else gets the record sound played at the position of the jukebox //
else if (SoundTest.getSound(blockEntity.getPos()) != null) {
// Converts the Sound Id to the item id of the approprieate disc (minecraft:music_disc.cat -> minecraft:music_disc_cat) //
discItem = new Identifier(String.valueOf(SoundTest.getSound(blockEntity.getPos())).replace(".", "_"));
matrices.translate(0.5f, 1.03f, 0.5f);
matrices.scale(0.75f, 0.75f, 0.75f);
matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion((blockEntity.getWorld().getTime() + tickDelta) * 4));
MinecraftClient.getInstance().getItemRenderer().renderItem(record, ModelTransformation.Mode.GROUND, lightAbove, overlay, matrices, vertexConsumers);
// Tries to get the disc item from the registry //
if (Registry.ITEM.getOrEmpty(discItem).isPresent()) {
matrices.pop();
if (VOConfig.jukebox_fake_block) {
record = new ItemStack(Registry.ITEM.get(discItem));
}
else {
LogManager.getLogger("VisualOverhaul").warn("Error getting music disc item for" + SoundTest.getSound(blockEntity.getPos()));
discItem = null;
record = ItemStack.EMPTY;
}
}
// If the sound is stopped or no sound is playing, the stack is set to an empty stack //
else {
discItem = null;
record = ItemStack.EMPTY;
}
if (!record.isEmpty()) {
record.setCount(2);
matrices.push();
matrices.translate(0.5f, 1.03f, 0.5f);
matrices.scale(0.75f, 0.75f, 0.75f);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(Util.getMeasuringTimeMs() / 9.0f));
MinecraftClient.getInstance().getItemRenderer().renderItem(record, ModelTransformation.Mode.GROUND, lightAbove, overlay, matrices, vertexConsumers, 0);
matrices.pop();
}
if (VOConfig.jukebox_fake_block && !blockEntity.getWorld().getBlockState(blockEntity.getPos().up()).isSideSolid(blockEntity.getWorld(),blockEntity.getPos().up(), Direction.DOWN, SideShapeType.FULL)) {
matrices.push();
matrices.translate(0f, 1f, 0f);
if (record == ItemStack.EMPTY) {

View File

@@ -0,0 +1,25 @@
package eu.midnightdust.visualoverhaul.compat.phonos.block;
import io.github.foundationgames.phonos.block.PhonosBlocks;
import io.github.foundationgames.phonos.block.RadioJukeboxBlock;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.IntProperty;
//public class RadioJukeboxTop extends Block {
// public static final BooleanProperty PLAYING = RadioJukeboxBlock.PLAYING;
// public static final IntProperty CHANNEL = RadioJukeboxBlock.CHANNEL;
//
// public RadioJukeboxTop() {
// super(FabricBlockSettings.copy(PhonosBlocks.RADIO_JUKEBOX));
// this.setDefaultState(this.stateManager.getDefaultState());
// }
//
// @Override
// protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
// builder.add(PLAYING, CHANNEL);
// }
//}

View File

@@ -0,0 +1,74 @@
package eu.midnightdust.visualoverhaul.compat.phonos.block.renderer;
//
//import eu.midnightdust.visualoverhaul.compat.phonos.block.RadioJukeboxTop;
//import eu.midnightdust.visualoverhaul.compat.phonos.init.PhonosCompatInit;
//import eu.midnightdust.visualoverhaul.config.VOConfig;
//import io.github.foundationgames.phonos.block.RadioJukeboxBlock;
//import io.github.foundationgames.phonos.block.entity.RadioJukeboxBlockEntity;
//import net.fabricmc.api.EnvType;
//import net.fabricmc.api.Environment;
//import net.minecraft.block.BlockState;
//import net.minecraft.block.Blocks;
//import net.minecraft.client.MinecraftClient;
//import net.minecraft.client.render.RenderLayer;
//import net.minecraft.client.render.VertexConsumerProvider;
//import net.minecraft.client.render.WorldRenderer;
//import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
//import net.minecraft.client.render.block.entity.BlockEntityRenderer;
//import net.minecraft.client.render.model.json.ModelTransformation;
//import net.minecraft.client.util.math.MatrixStack;
//import net.minecraft.item.ItemStack;
//
//import java.util.Random;
//
//@Environment(EnvType.CLIENT)
//public class RadioJukeboxBlockEntityRenderer implements BlockEntityRenderer<RadioJukeboxBlockEntity> {
// private ItemStack record;
// private float rotation = 0;
// private BlockState blockState;
//
// public RadioJukeboxBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) {
// super();
// }
//
// @Override
// public void render(RadioJukeboxBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
// if (VOConfig.jukebox) {
// int lightAbove = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), blockEntity.getPos().up());
//
// // Tries to get the disc using the serverside method
// if (blockEntity.getStack(blockEntity.getPlayingSong()) != ItemStack.EMPTY) {
// record = blockEntity.getStack(blockEntity.getPlayingSong()).copy();
// record.setCount(2);
// }
// // If the sound is stopped or no sound is playing, the stack is set to an empty stack //
// else {
// record = ItemStack.EMPTY;
// }
//
// matrices.push();
//
// matrices.translate(0.5f, 1.03f, 0.5f);
// matrices.scale(0.75f, 0.75f, 0.75f);
//
// if (blockEntity.isPlaying()) {
// rotation = (blockEntity.getWorld().getTime() + tickDelta) * 4;
// }
// matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(rotation));
// MinecraftClient.getInstance().getItemRenderer().renderItem(record, ModelTransformation.Mode.GROUND, lightAbove, overlay, matrices, vertexConsumers);
//
// matrices.pop();
// if (VOConfig.jukebox_fake_block && blockEntity.getWorld().getBlockState(blockEntity.getPos().up()).getBlock() == Blocks.AIR) {
// blockState = blockEntity.getWorld().getBlockState(blockEntity.getPos());
// matrices.push();
// matrices.translate(0f, 1f, 0f);
// if (record == ItemStack.EMPTY) {
// MinecraftClient.getInstance().getBlockRenderManager().renderBlock(PhonosCompatInit.RadioJukeboxTop.getDefaultState().with(RadioJukeboxTop.PLAYING, false).with(RadioJukeboxTop.CHANNEL, blockState.get(RadioJukeboxBlock.CHANNEL)), blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, new Random());
// } else {
// MinecraftClient.getInstance().getBlockRenderManager().renderBlock(PhonosCompatInit.RadioJukeboxTop.getDefaultState().with(RadioJukeboxTop.PLAYING, true).with(RadioJukeboxTop.CHANNEL, blockState.get(RadioJukeboxBlock.CHANNEL)), blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, new Random());
// }
// matrices.pop();
// }
// }
// }
//}

View File

@@ -0,0 +1,20 @@
package eu.midnightdust.visualoverhaul.compat.phonos.init;
//import eu.midnightdust.visualoverhaul.compat.phonos.block.RadioJukeboxTop;
import io.github.foundationgames.phonos.block.PhonosBlocks;
import net.fabricmc.fabric.impl.blockrenderlayer.BlockRenderLayerMapImpl;
import net.minecraft.block.Block;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
public class PhonosCompatInit {
//public static Block RadioJukeboxTop = new RadioJukeboxTop();
public static void init() {
//Registry.register(Registry.BLOCK, new Identifier("visualoverhaul","radio_jukebox_top"), RadioJukeboxTop);
//BlockRenderLayerMapImpl.INSTANCE.putBlock(PhonosBlocks.RADIO_JUKEBOX, RenderLayer.getCutout());
//BlockRenderLayerMapImpl.INSTANCE.putBlock(RadioJukeboxTop, RenderLayer.getCutout());
}
}

View File

@@ -1,7 +1,8 @@
package eu.midnightdust.visualoverhaul.config;
import io.github.prospector.modmenu.api.ConfigScreenFactory;
import io.github.prospector.modmenu.api.ModMenuApi;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi;
import eu.midnightdust.lib.config.MidnightConfig;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -10,6 +11,6 @@ public class ModMenuIntegration implements ModMenuApi {
@Override
public ConfigScreenFactory<?> getModConfigScreenFactory() {
return parent -> new VOConfig().getScreen(parent);
return parent -> MidnightConfig.getScreen(parent,"visualoverhaul");
}
}

View File

@@ -1,14 +1,11 @@
package eu.midnightdust.visualoverhaul.config;
import eu.midnightdust.lib.config.MidnightConfig;
public class VOConfig extends MidnightConfig {
@Entry
public static boolean brewingstand = true;
@Entry
public static boolean jukebox = true;
@Entry
public static boolean jukebox_fake_block = true;
@Entry
public static boolean furnace = true;
@Entry
public static boolean coloredItems = true;
@Entry public static boolean brewingstand = true;
@Entry public static boolean jukebox = true;
@Entry public static boolean jukebox_fake_block = true;
@Entry public static boolean furnace = true;
@Entry public static boolean coloredItems = true;
}

View File

@@ -4,14 +4,15 @@ import eu.midnightdust.visualoverhaul.VisualOverhaul;
import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.server.PlayerStream;
import net.fabricmc.fabric.impl.networking.ServerSidePacketRegistryImpl;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.entity.*;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -22,26 +23,25 @@ import java.util.stream.Stream;
@Mixin(AbstractFurnaceBlockEntity.class)
public abstract class MixinAbstractFurnaceBlockEntity extends LockableContainerBlockEntity {
@Shadow protected DefaultedList<ItemStack> inventory;
Boolean invUpdate = true;
int playerUpdate = -1;
private static boolean invUpdate = true;
private static int playerUpdate = -1;
private MixinAbstractFurnaceBlockEntity(BlockEntityType<?> blockEntityType) {
super(blockEntityType);
protected MixinAbstractFurnaceBlockEntity(BlockEntityType<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
super(blockEntityType, blockPos, blockState);
}
@Inject(at = @At("TAIL"), method = "tick")
public void tick(CallbackInfo ci) {
if (this.world.getBlockState(this.pos).getBlock().is(Blocks.FURNACE)) {
if (!this.world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) {
Stream<PlayerEntity> watchingPlayers = PlayerStream.watching(world, getPos());
private static void tick(World world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity, CallbackInfo ci) {
if (world.getBlockState(pos).getBlock().equals(Blocks.FURNACE)) {
if (!world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) {
Stream<PlayerEntity> watchingPlayers = PlayerStream.watching(world, pos);
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeBlockPos(pos);
passedData.writeItemStack(inventory.get(0));
passedData.writeItemStack(inventory.get(1));
passedData.writeItemStack(inventory.get(2));
passedData.writeItemStack(blockEntity.getStack(0));
passedData.writeItemStack(blockEntity.getStack(1));
passedData.writeItemStack(blockEntity.getStack(2));
passedData.writeString(String.valueOf(inventory));
watchingPlayers.forEach(player -> ServerSidePacketRegistryImpl.INSTANCE.sendToPlayer(player, VisualOverhaul.UPDATE_FURNACE_ITEMS, passedData));
invUpdate = false;
}
@@ -50,7 +50,7 @@ public abstract class MixinAbstractFurnaceBlockEntity extends LockableContainerB
}
@Inject(at = @At("RETURN"), method = "getStack", cancellable = true)
public void getStack(int slot, CallbackInfoReturnable cir) {
this.invUpdate = true;
public void getStack(int slot, CallbackInfoReturnable<ItemStack> cir) {
invUpdate = true;
}
}

View File

@@ -4,15 +4,16 @@ import eu.midnightdust.visualoverhaul.VisualOverhaul;
import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.server.PlayerStream;
import net.fabricmc.fabric.impl.networking.ServerSidePacketRegistryImpl;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.block.entity.BrewingStandBlockEntity;
import net.minecraft.block.entity.LockableContainerBlockEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -23,27 +24,25 @@ import java.util.stream.Stream;
@Mixin(BrewingStandBlockEntity.class)
public abstract class MixinBrewingStandBlockEntity extends LockableContainerBlockEntity {
@Shadow private DefaultedList<ItemStack> inventory;
Boolean invUpdate = true;
int playerUpdate = -1;
private static boolean invUpdate = true;
private static int playerUpdate = -1;
private MixinBrewingStandBlockEntity(BlockEntityType<?> blockEntityType) {
super(blockEntityType);
protected MixinBrewingStandBlockEntity(BlockEntityType<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
super(blockEntityType, blockPos, blockState);
}
@Inject(at = @At("TAIL"), method = "tick")
public void tick(CallbackInfo ci) {
if (!this.world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) {
Stream<PlayerEntity> watchingPlayers = PlayerStream.watching(world, getPos());
private static void tick(World world, BlockPos pos, BlockState state, BrewingStandBlockEntity blockEntity, CallbackInfo ci) {
if (!world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) {
Stream<PlayerEntity> watchingPlayers = PlayerStream.watching(world, pos);
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeBlockPos(pos);
passedData.writeItemStack(inventory.get(0));
passedData.writeItemStack(inventory.get(1));
passedData.writeItemStack(inventory.get(2));
passedData.writeItemStack(inventory.get(3));
passedData.writeItemStack(inventory.get(4));
passedData.writeItemStack(blockEntity.getStack(0));
passedData.writeItemStack(blockEntity.getStack(1));
passedData.writeItemStack(blockEntity.getStack(2));
passedData.writeItemStack(blockEntity.getStack(3));
passedData.writeItemStack(blockEntity.getStack(4));
passedData.writeString(String.valueOf(inventory));
watchingPlayers.forEach(player -> ServerSidePacketRegistryImpl.INSTANCE.sendToPlayer(player, VisualOverhaul.UPDATE_POTION_BOTTLES, passedData));
invUpdate = false;
}
@@ -51,7 +50,7 @@ public abstract class MixinBrewingStandBlockEntity extends LockableContainerBloc
}
@Inject(at = @At("RETURN"), method = "getStack", cancellable = true)
public void getStack(int slot, CallbackInfoReturnable cir) {
this.invUpdate = true;
public void getStack(int slot, CallbackInfoReturnable<ItemStack> cir) {
invUpdate = true;
}
}

View File

@@ -0,0 +1,56 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaul;
import eu.midnightdust.visualoverhaul.util.JukeboxPacketUpdate;
import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.networking.v1.PlayerLookup;
import net.fabricmc.fabric.impl.networking.ServerSidePacketRegistryImpl;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;
import net.minecraft.block.BlockWithEntity;
import net.minecraft.block.JukeboxBlock;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityTicker;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.block.entity.JukeboxBlockEntity;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import java.util.stream.Stream;
@Mixin(JukeboxBlock.class)
public abstract class MixinJukeboxBlock extends BlockWithEntity {
protected MixinJukeboxBlock(Settings settings) {
super(settings);
}
@Override
public BlockRenderType getRenderType(BlockState state) {
return BlockRenderType.MODEL;
}
@Nullable
public <T extends BlockEntity> BlockEntityTicker<T> getTicker(World world, BlockState state, BlockEntityType<T> type) {
return world.isClient() ? null : checkType(type, BlockEntityType.JUKEBOX, MixinJukeboxBlock::tick);
}
@Unique
private static void tick(World world, BlockPos pos, BlockState state, JukeboxBlockEntity blockEntity) {
if (!world.isClient && (JukeboxPacketUpdate.invUpdate || world.getPlayers().size() == JukeboxPacketUpdate.playerUpdate)) {
Stream<ServerPlayerEntity> watchingPlayers = PlayerLookup.tracking(blockEntity).stream();
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeBlockPos(pos);
passedData.writeItemStack(blockEntity.getRecord());
watchingPlayers.forEach(player -> ServerSidePacketRegistryImpl.INSTANCE.sendToPlayer(player, VisualOverhaul.UPDATE_RECORD, passedData));
JukeboxPacketUpdate.invUpdate = false;
}
JukeboxPacketUpdate.playerUpdate = world.getPlayers().size();
}
}

View File

@@ -1,16 +1,18 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaul;
import eu.midnightdust.visualoverhaul.util.JukeboxPacketUpdate;
import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.server.PlayerStream;
import net.fabricmc.fabric.impl.networking.ServerSidePacketRegistryImpl;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.*;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.util.Tickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -19,32 +21,28 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.stream.Stream;
@Mixin(JukeboxBlockEntity.class)
public abstract class MixinJukeboxBlockEntity extends BlockEntity implements Tickable {
public abstract class MixinJukeboxBlockEntity extends BlockEntity {
@Shadow private ItemStack record;
Boolean invUpdate = true;
int playerUpdate = -1;
private MixinJukeboxBlockEntity(BlockEntityType<?> blockEntityType) {
super(blockEntityType);
public MixinJukeboxBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Unique
public void tick() {
if (!this.world.isClient && (invUpdate || world.getPlayers().size() == playerUpdate)) {
Stream<PlayerEntity> watchingPlayers = PlayerStream.watching(world, getPos());
private static void tick(World world, BlockPos pos, BlockState state, JukeboxBlockEntity blockEntity) {
if (!world.isClient && (JukeboxPacketUpdate.invUpdate || world.getPlayers().size() == JukeboxPacketUpdate.playerUpdate)) {
Stream<PlayerEntity> watchingPlayers = PlayerStream.watching(world, pos);
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeBlockPos(pos);
passedData.writeItemStack(record);
passedData.writeItemStack(blockEntity.getRecord());
watchingPlayers.forEach(player -> ServerSidePacketRegistryImpl.INSTANCE.sendToPlayer(player, VisualOverhaul.UPDATE_RECORD, passedData));
invUpdate = false;
JukeboxPacketUpdate.invUpdate = false;
}
playerUpdate = world.getPlayers().size();
JukeboxPacketUpdate.playerUpdate = world.getPlayers().size();
}
@Inject(at = @At("RETURN"), method = "getRecord", cancellable = true)
public void getRecord(CallbackInfoReturnable cir) {
this.invUpdate = true;
public void getRecord(CallbackInfoReturnable<ItemStack> cir) {
JukeboxPacketUpdate.invUpdate = true;
}
}

View File

@@ -1,63 +0,0 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaul;
import net.minecraft.block.Blocks;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.state.property.Properties;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.profiler.Profiler;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.*;
import net.minecraft.world.chunk.WorldChunk;
import net.minecraft.world.dimension.DimensionType;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.function.Supplier;
@Mixin(ServerWorld.class)
public abstract class MixinServerWorld extends World {
protected MixinServerWorld(MutableWorldProperties properties, RegistryKey<World> registryRef, DimensionType dimensionType, Supplier<Profiler> profiler, boolean isClient, boolean debugWorld, long seed) {
super(properties, registryRef, dimensionType, profiler, isClient, debugWorld, seed);
}
@Shadow protected abstract BlockPos getSurface(BlockPos pos);
@Inject(at = @At("TAIL"),method = "tickChunk")
public void tickChunk(WorldChunk chunk, int randomTickSpeed, CallbackInfo ci) {
ChunkPos chunkPos = chunk.getPos();
boolean bl = this.isRaining();
int x = chunkPos.getStartX();
int z = chunkPos.getStartZ();
Profiler profiler = this.getProfiler();
BlockPos pos;
if (this.getGameRules().getInt(VisualOverhaul.PUDDLE_SPAWN_RATE) != 0) {
profiler.push("puddles");
if (bl && random.nextInt(10000 / this.getGameRules().getInt(VisualOverhaul.PUDDLE_SPAWN_RATE)) == 0) {
pos = this.getSurface(getRandomPosInChunk(x, 0, z, 15));
if (this.hasRain(pos) && getBlockState(pos.down()).isSideSolidFullSquare(this, pos, Direction.UP)) {
setBlockState(pos, VisualOverhaul.Puddle.getDefaultState());
}
}
profiler.pop();
}
if (this.getGameRules().getInt(VisualOverhaul.SNOW_STACK_CHANCE) != 0) {
profiler.push("extra_snow");
if (bl && random.nextInt(10000 / this.getGameRules().getInt(VisualOverhaul.SNOW_STACK_CHANCE)) == 0) {
pos = this.getSurface(getRandomPosInChunk(x, 0, z, 15));
if (this.getBlockState(pos).getBlock() == Blocks.SNOW && getBlockState(pos.down()).isSideSolidFullSquare(this, pos, Direction.UP)) {
int layer = getBlockState(pos).get(Properties.LAYERS);
setBlockState(pos, Blocks.SNOW.getDefaultState().with(Properties.LAYERS, layer + 1));
}
}
profiler.pop();
}
}
}

View File

@@ -0,0 +1,40 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.util.SoundTest;
import net.minecraft.client.sound.SoundInstance;
import net.minecraft.client.sound.SoundSystem;
import net.minecraft.sound.SoundCategory;
import net.minecraft.util.math.BlockPos;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(SoundSystem.class)
public abstract class MixinSoundSystem {
@Shadow private boolean started;
private BlockPos jukeboxPos;
@Inject(at = @At("TAIL"),method = "play(Lnet/minecraft/client/sound/SoundInstance;)V")
public void vo$onPlayRecordSound(SoundInstance soundInstance, CallbackInfo ci) {
if (soundInstance.getCategory().equals(SoundCategory.RECORDS) && this.started) {
jukeboxPos = new BlockPos(soundInstance.getX(),soundInstance.getY(),soundInstance.getZ());
SoundTest.soundPos.put(jukeboxPos, soundInstance.getId());
}
}
@Inject(at = @At("HEAD"),method = "stop(Lnet/minecraft/client/sound/SoundInstance;)V")
public void vo$onStopRecordSound(SoundInstance soundInstance, CallbackInfo ci) {
if (soundInstance != null) {
if (soundInstance.getCategory().equals(SoundCategory.RECORDS)) {
jukeboxPos = new BlockPos(soundInstance.getX(), soundInstance.getY(), soundInstance.getZ());
if (SoundTest.soundPos.containsKey(jukeboxPos)) {
SoundTest.soundPos.remove(jukeboxPos, soundInstance.getId());
}
}
}
}
}

View File

@@ -0,0 +1,6 @@
package eu.midnightdust.visualoverhaul.util;
public class JukeboxPacketUpdate {
public static boolean invUpdate = true;
public static int playerUpdate = -1;
}

View File

@@ -0,0 +1,23 @@
package eu.midnightdust.visualoverhaul.util;
import com.google.common.collect.Maps;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import java.util.Map;
public class SoundTest {
public static Map<BlockPos, Identifier> soundPos = Maps.newHashMap();
/**
* Returns the Sound provided in MixinSoundSystem
* {@link eu.midnightdust.visualoverhaul.mixin.MixinSoundSystem}
*/
public static Identifier getSound(BlockPos pos) {
if (soundPos.containsKey(pos)) {
return soundPos.get(pos);
}
return null;
}
}

View File

@@ -0,0 +1,23 @@
package eu.midnightdust.visualoverhaul.util.sound;
import com.google.common.collect.Maps;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import java.util.Map;
public class SoundTest {
public static Map<BlockPos, Identifier> soundPos = Maps.newHashMap();
/**
* Returns the Sound provided in MixinSoundSystem
* {@link eu.midnightdust.visualoverhaul.mixin.MixinSoundSystem}
*/
public static Identifier getSound(BlockPos pos) {
if (soundPos.containsKey(pos)) {
return soundPos.get(pos);
}
return null;
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "biomemakeover:item/music_disk_button_mushrooms"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "biomemakeover:item/button_mushrooms_music_disk_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "biomemakeover:item/music_disk_button_mushrooms"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "biomemakeover:item/music_disc_ghost_town"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "biomemakeover:item/ghost_town_music_disk_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "biomemakeover:item/music_disc_ghost_town"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "biomemakeover:item/music_disc_swamp_jives"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "biomemakeover:item/swamp_jives_music_disk_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "biomemakeover:item/music_disc_swamp_jives"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "desolation:item/music_disc_ashes"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "desolation:item/music_disc_ashes_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "desolation:item/music_disc_ashes"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "minecraft:item/music_disc_13"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "minecraft:item/music_disc_13_round"
}
]
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "extra_discs:item/music_disc_0x10c"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "extra_discs:item/music_disc_0x10c_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "extra_discs:item/music_disc_0x10c"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "extra_discs:item/music_disc_cliffside_hinson"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "extra_discs:item/music_disc_cliffside_hinson_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "extra_discs:item/music_disc_cliffside_hinson"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "extra_discs:item/music_disc_i_jate_my_hob"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "extra_discs:item/music_disc_i_jate_my_hob_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "extra_discs:item/music_disc_i_jate_my_hob"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "extra_discs:item/music_disc_peanuts"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "extra_discs:item/music_disc_peanuts_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "extra_discs:item/music_disc_peanuts"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "extra_discs:item/music_disc_repetition"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "extra_discs:item/music_disc_repetition_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "extra_discs:item/music_disc_repetition"
}
}

View File

@@ -0,0 +1,15 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "extra_discs:item/music_disc_sometimes_i_make_video_game_music"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "extra_discs:item/music_disc_sometimes_i_make_video_game_music_round"
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:item/round_disc",
"textures": {
"0": "extra_discs:item/music_disc_sometimes_i_make_video_game_music"
}
}

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

@@ -0,0 +1,16 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer1": "phonos:item/music_disc_outer",
"layer0": "phonos:item/music_disc_inner"
},
"overrides": [
{
"predicate": {
"round": 1
},
"model": "phonos:item/custom_music_disc_round"
}
]
}

View File

@@ -0,0 +1,7 @@
{
"parent": "visualoverhaul:item/round_disc_colored_layers",
"textures": {
"0": "phonos:item/music_disc_inner",
"1": "phonos:item/music_disc_outer"
}
}

View File

View File

@@ -1,7 +0,0 @@
{
"variants": {
"": {
"model": "visualoverhaul:block/puddle"
}
}
}

View File

@@ -0,0 +1,44 @@
{
"variants": {
"playing=true,channel=0": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_0"},
"playing=false,channel=0": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_0"},
"playing=true,channel=1": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_1"},
"playing=false,channel=1": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_1"},
"playing=true,channel=2": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_2"},
"playing=false,channel=2": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_2"},
"playing=true,channel=3": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_3"},
"playing=false,channel=3": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_3"},
"playing=true,channel=4": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_4"},
"playing=false,channel=4": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_4"},
"playing=true,channel=5": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_5"},
"playing=false,channel=5": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_5"},
"playing=true,channel=6": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_6"},
"playing=false,channel=6": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_6"},
"playing=true,channel=7": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_7"},
"playing=false,channel=7": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_7"},
"playing=true,channel=8": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_8"},
"playing=false,channel=8": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_8"},
"playing=true,channel=9": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_9"},
"playing=false,channel=9": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_9"},
"playing=true,channel=10": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_10"},
"playing=false,channel=10": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_10"},
"playing=true,channel=11": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_11"},
"playing=false,channel=11": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_11"},
"playing=true,channel=12": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_12"},
"playing=false,channel=12": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_12"},
"playing=true,channel=13": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_13"},
"playing=false,channel=13": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_13"},
"playing=true,channel=14": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_14"},
"playing=false,channel=14": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_14"},
"playing=true,channel=15": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_15"},
"playing=false,channel=15": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_15"},
"playing=true,channel=16": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_16"},
"playing=false,channel=16": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_16"},
"playing=true,channel=17": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_17"},
"playing=false,channel=17": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_17"},
"playing=true,channel=18": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_18"},
"playing=false,channel=18": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_18"},
"playing=true,channel=19": {"model": "visualoverhaul:block/phonos/jukebox_top_playing_19"},
"playing=false,channel=19": {"model": "visualoverhaul:block/phonos/jukebox_top_stopped_19"}
}
}

0
src/main/resources/assets/visualoverhaul/icon.png Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -1,10 +1,9 @@
{
"visualoverhaul.midnightconfig.title":"Visual Overhaul Config",
"visualoverhaul.midnightconfig.brewingstand":"Enable Brewing Stand Enhancements",
"visualoverhaul.midnightconfig.jukebox":"Enable Jukebox Enhancements",
"visualoverhaul.midnightconfig.jukebox_fake_block":"Enable fake block on jukebox top",
"visualoverhaul.midnightconfig.furnace":"Enable Furnace Enhancements",
"visualoverhaul.midnightconfig.coloredItems":"Enable biome-based item colors",
"visualoverhaul.midnightconfig.coloredItems.tooltip":"Needs restart!",
"block.visualoverhaul.puddle":"Puddle"
{
"visualoverhaul.midnightconfig.title":"Visual Overhaul Config",
"visualoverhaul.midnightconfig.brewingstand":"Enable Brewing Stand Enhancements",
"visualoverhaul.midnightconfig.jukebox":"Enable Jukebox Enhancements",
"visualoverhaul.midnightconfig.jukebox_fake_block":"Enable fake block on jukebox top",
"visualoverhaul.midnightconfig.furnace":"Enable Furnace Enhancements",
"visualoverhaul.midnightconfig.coloredItems":"Enable biome-based item colors",
"visualoverhaul.midnightconfig.coloredItems.tooltip":"Needs restart!"
}

View File

@@ -0,0 +1,85 @@
{
"credit": "made by Motschen",
"textures": {
"0": "block/glass",
"1": "block/black_concrete",
"2": "block/anvil",
"3": "visualoverhaul:block/vo_jukebox_top",
"4": "phonos:block/speaker_top_0",
"particle": "block/glass"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 0.01, 16],
"faces": {
"up": {"uv": [0, 0, 16, 16], "texture": "#3"}
}
},
{
"from": [0, 0, 0],
"to": [16, 5, 16],
"faces": {
"north": {"uv": [0, 0, 16, 5], "texture": "#0"},
"east": {"uv": [0, 0, 16, 5], "texture": "#0"},
"south": {"uv": [0, 0, 16, 5], "texture": "#0"},
"west": {"uv": [0, 0, 16, 5], "texture": "#0"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0"}
}
},
{
"from": [7.875, 0, 7.875],
"to": [8.125, 1.25, 8.125],
"faces": {
"north": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"east": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"south": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"west": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"}
}
},
{
"from": [5.75, 1, 11.29],
"to": [6, 1.5, 11.54],
"rotation": {"angle": 45, "axis": "y", "origin": [5, 8, 12]},
"faces": {
"north": {"uv": [0, 0, 0.25, 2], "texture": "#2"},
"east": {"uv": [0, 0, 0.25, 2], "texture": "#2"},
"south": {"uv": [0, 0, 0.25, 2], "texture": "#2"},
"west": {"uv": [0, 0, 0.25, 2], "texture": "#2"},
"up": {"uv": [0, 0, 0.25, 0.25], "texture": "#2"}
}
},
{
"from": [0.875, 0, 14.875],
"to": [1.375, 1.5, 15.375],
"rotation": {"angle": 0, "axis": "y", "origin": [1, 8, 15]},
"faces": {
"north": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"east": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"south": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"west": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"}
}
},
{
"from": [0.65, 1.5, 14.875],
"to": [7.15, 2, 15.375],
"rotation": {"angle": 45, "axis": "y", "origin": [1, 10, 15]},
"faces": {
"north": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"east": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"south": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"west": {"uv": [0, 0, 0.25, 2], "texture": "#1"},
"up": {"uv": [0, 0, 0.25, 0.25], "texture": "#1"}
}
},
{
"from": [10, 0.1, 12],
"to": [15, 0.1, 15],
"faces": {
"up": {"uv": [4, 5, 12, 10], "rotation": 180, "texture": "#4"}
}
}
]
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_1"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_10"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_11"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_12"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_13"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_14"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_15"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_16"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_17"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_18"
}
}

View File

@@ -0,0 +1,6 @@
{
"parent": "visualoverhaul:block/phonos/jukebox_top_playing_0",
"textures": {
"4": "phonos:block/speaker_top_19"
}
}

Some files were not shown because too many files have changed in this diff Show More