Merge pull request #88 from TeamMidnightDust/dev

VisualOverhaul 6.0.0 for 1.21.4
This commit is contained in:
Martin Prokoph
2025-01-26 19:23:29 +01:00
committed by GitHub
146 changed files with 484 additions and 2416 deletions

View File

@@ -1,6 +1,6 @@
plugins {
id "architectury-plugin" version "3.4-SNAPSHOT"
id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false
id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false
id "me.shedaniel.unified-publishing" version "0.1.+" apply false
id 'com.github.johnrengelman.shadow' version '8.1.1' apply false
}
@@ -16,7 +16,8 @@ repositories {
}
subprojects {
apply plugin: "dev.architectury.loom"
apply plugin: 'dev.architectury.loom'
apply plugin: 'architectury-plugin'
dependencies {
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"

View File

@@ -0,0 +1,69 @@
package eu.midnightdust.visualoverhaul;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.model.ModelNameSupplier;
import net.minecraft.client.model.SpriteGetter;
import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.block.BlockRenderManager;
import net.minecraft.client.render.model.*;
import net.minecraft.client.render.model.json.JsonUnbakedModel;
import net.minecraft.client.texture.Sprite;
import net.minecraft.client.util.SpriteIdentifier;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.BlockRenderView;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.LOGGER;
public class FakeBlocks {
private static final Baker BAKER = new FakeBaker();
private static final Map<Identifier, BakedModel> FAKE_MODELS = new HashMap<>();
private static final BlockRenderManager renderManager = MinecraftClient.getInstance().getBlockRenderManager();
public static void reload(ResourceManager manager) {
manager.findResources("models", path -> path.getPath().startsWith("models/fakeblock") && path.getPath().endsWith(".json")).forEach((id, resource) -> {
try {
JsonUnbakedModel unbaked = JsonUnbakedModel.deserialize(resource.getReader());
BakedModel baked = unbaked.bake(new ModelTextures.Builder().addFirst(unbaked.getTextures()).build(() -> "#fakeblock"), BAKER,
new ModelBakeSettings(){}, Boolean.TRUE.equals(unbaked.getAmbientOcclusion()), unbaked.getGuiLight() != null && unbaked.getGuiLight().isSide(), unbaked.getTransformation());
Identifier fakeId = Identifier.of(id.getNamespace(), id.getPath().replace("models/fakeblock/", "").replace(".json", ""));
FAKE_MODELS.put(fakeId, baked);
if (VOConfig.debug) LOGGER.info("Successfully loaded fake block model: {}", fakeId);
} catch (IOException e) {
LOGGER.error("Error occurred while loading fake block model {}", id.toString(), e);
}
});
}
public static void renderFakeBlock(Identifier id, BlockPos pos, BlockRenderView world, MatrixStack matrices, VertexConsumer vertexConsumer) {
renderManager.getModelRenderer().render(world, FAKE_MODELS.get(id), Blocks.DIRT.getDefaultState(), // State is just needed for a few generic checks
pos, matrices, vertexConsumer, false, Random.create(), 0, OverlayTexture.DEFAULT_UV);
}
public static class FakeBaker implements Baker {
public BakedModel bake(Identifier id, ModelBakeSettings settings) {
return null; // Not used in Json models, so we just leave ít like this and cross our fingers.
}
@Override
public SpriteGetter getSpriteGetter() {
return new SpriteGetter() {
static final SpriteIdentifier MISSING = new SpriteIdentifier(Identifier.ofVanilla("textures/atlas/blocks.png"), Identifier.ofVanilla("missingno"));
@Override public Sprite get(SpriteIdentifier spriteId) { return spriteId.getSprite(); }
@Override public Sprite getMissing(String textureId) { return MISSING.getSprite(); }
};
}
public ModelNameSupplier getModelNameSupplier() { return () -> "#fakeblock"; }
}
}

View File

@@ -4,24 +4,39 @@ import com.mojang.blaze3d.systems.RenderSystem;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import eu.midnightdust.visualoverhaul.mixin.TextureManagerAccessor;
import eu.midnightdust.visualoverhaul.util.ModIconUtil;
import eu.midnightdust.visualoverhaul.util.VOColorUtil;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.texture.*;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.texture.NativeImageBackedTexture;
import net.minecraft.client.texture.ResourceTexture;
import net.minecraft.client.texture.TextureManager;
import net.minecraft.resource.ResourceManager;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableTextContent;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.ColorHelper;
import net.minecraft.util.math.MathHelper;
import org.apache.logging.log4j.LogManager;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.function.Function;
import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.LOGGER;
import static eu.midnightdust.visualoverhaul.util.VOColorUtil.alphaAndBrightness;
public class IconicButtons {
MinecraftClient client = MinecraftClient.getInstance();
TextureManager textureManager = client.getTextureManager();
private String buttonId;
private Text prevText;
private Identifier iconId;
private static final Map<Identifier, Identifier> ICONS = new HashMap<>();
public IconicButtons() {}
public void init(ClickableWidget widget) {
if (widget == null || widget.getMessage() == null || widget.getMessage().getContent() == null) return;
@@ -30,57 +45,63 @@ public class IconicButtons {
if (VOConfig.buttonIcons && !buttonId.isEmpty()) {
if (VOConfig.debug) System.out.println(buttonId);
iconId = Identifier.tryParse("iconic:textures/gui/icons/" + buttonId.toLowerCase()+".png");
if (buttonId.endsWith(".midnightconfig.title"))
{
// Show mod icons in MidnightConfig overview
if (buttonId.endsWith(".midnightconfig.title")) {
iconId = Identifier.of("modid", buttonId.replace(".midnightconfig.title", "") + "_icon");
NativeImageBackedTexture icon = new ModIconUtil(buttonId.replace(".midnightconfig.title", "")).createModIcon();
if (icon != null) {
client.getTextureManager().registerTexture(iconId, icon);
ICONS.put(iconId, iconId);
} else {
iconId = null;
}
}
if (iconId == null) return;
TextureManager textureManager = client.getTextureManager();
AbstractTexture abstractTexture = textureManager.getOrDefault(iconId, null);
if (abstractTexture == null) {
abstractTexture = new ResourceTexture(iconId);
try { abstractTexture.load(((TextureManagerAccessor)textureManager).getResourceContainer());
} catch (Exception e) {iconId = null; return;}
// Handle dynamic icons
else if (iconId != null && !ICONS.containsKey(iconId)) {
if (((TextureManagerAccessor)textureManager).getResourceContainer().getResource(iconId).isEmpty())
return; // If no icon is present, don't load it
ResourceTexture abstractTexture = new ResourceTexture(iconId);
if (VOConfig.debug) System.out.println("Loading dynamic icon: "+iconId);
try {
abstractTexture.loadContents(((TextureManagerAccessor)textureManager).getResourceContainer());
} catch (Exception e) {e.fillInStackTrace();}
textureManager.registerTexture(iconId, abstractTexture);
ICONS.put(iconId, iconId);
}
if (abstractTexture == MissingSprite.getMissingSpriteTexture()) iconId = null;
}
}
public void renderIcons(DrawContext context, ClickableWidget widget, float alpha) {
if (widget.getMessage() == null || widget.getWidth() <= 20) return;
if (prevText != widget.getMessage()) init(widget);
if (VOConfig.buttonIcons && !buttonId.equals("") && iconId != null) {
if (VOConfig.buttonIcons && !buttonId.isEmpty() && iconId != null && ICONS.containsKey(iconId)) {
int scaledWidth = client.getWindow().getScaledWidth();
boolean limitedSpace = client.textRenderer.getWidth(widget.getMessage()) > (widget.getWidth() * 0.75f);
boolean showLeftWhenBoth = (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.BOTH) && !limitedSpace) || (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.BOTH) && widget.getX() < scaledWidth/2);
boolean showRightWhenBoth = (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.BOTH) && !limitedSpace) || (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.BOTH) && widget.getX() > scaledWidth/2);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, alpha);
if (!widget.active) RenderSystem.setShaderColor(0.3F, 0.3F, 0.3F, alpha);
int color = widget.active ? alphaAndBrightness(alpha, 1.0F) : alphaAndBrightness(alpha, 0.3F);
RenderSystem.enableBlend();
RenderSystem.enableDepthTest();
int inset = 2;
if (VOConfig.zoomIconOnHover && widget.isSelected()) inset = 1;
if (VOConfig.zoomIconOnHover && widget.isSelected() && widget.active) inset = 1;
int size = 20-inset*2;
Identifier textureId = ICONS.get(iconId);
if (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.LEFT) || showLeftWhenBoth || (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.LOCATION) && widget.getX() < scaledWidth/2))
context.drawTexture(iconId, widget.getX()+inset, widget.getY()+inset, 0, 0, size, size, size, size);
context.drawTexture(RenderLayer::getGuiTextured, textureId, widget.getX()+inset, widget.getY()+inset, 0, 0, size, size, size, size, size, size, color);
if (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.RIGHT) || showRightWhenBoth || (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.LOCATION) && widget.getX()+widget.getWidth() > scaledWidth/2))
context.drawTexture(iconId, widget.getX()+widget.getWidth()-20+inset, widget.getY()+inset, 0, 0, size, size, size, size);
context.drawTexture(RenderLayer::getGuiTextured, textureId, widget.getX()+widget.getWidth()-20+inset, widget.getY()+inset, 0, 0, size, size, size, size, size, size, color);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.disableBlend();
RenderSystem.disableDepthTest();
}
}
public static void reload(ResourceManager manager) {
manager.findResources("textures", path -> path.getPath().contains(".properties")).forEach((id, resource) -> {
manager.findResources("textures", path -> path.getNamespace().equals("iconic") && path.getPath().contains(".properties")).forEach((id, resource) -> {
if (manager.getResource(id).isEmpty()) return;
try (InputStream stream = manager.getResource(id).get().getInputStream()) {
Identifier iconId = Identifier.of(id.getNamespace(), id.getPath().replace(".properties", ".png"));
@@ -102,16 +123,11 @@ public class IconicButtons {
}
if (properties.get("texture") != null) {
Identifier textureId = Identifier.of(properties.getProperty("texture"));
TextureManager textureManager = MinecraftClient.getInstance().getTextureManager();
AbstractTexture abstractTexture = textureManager.getOrDefault(iconId, null);
if (abstractTexture == null) {
abstractTexture = new ResourceTexture(textureId);
textureManager.registerTexture(iconId, abstractTexture);
}
Identifier textureId = Identifier.tryParse(properties.getProperty("texture"));
ICONS.put(iconId, textureId);
}
} catch (Exception e) {
LogManager.getLogger("Iconic").error("Error occurred while loading texture.properties " + id.toString(), e);
LOGGER.error("Error occurred while loading texture.properties for button icon {}", id.toString(), e);
}
});
}

View File

@@ -1,7 +1,6 @@
package eu.midnightdust.visualoverhaul;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.block.Block;
import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.MOD_ID;
@@ -11,8 +10,6 @@ public class VisualOverhaulClient {
public static int grassColor = -8934609;
public static int potionColor = -13083194;
public static Block JukeBoxTop;
public static void onInitializeClient() {
VOConfig.init(MOD_ID, VOConfig.class);
}

View File

@@ -3,6 +3,8 @@ package eu.midnightdust.visualoverhaul;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.ArrayList;
@@ -12,6 +14,7 @@ import java.util.UUID;
public class VisualOverhaulCommon {
public static final String MOD_ID = "visualoverhaul";
public static final Logger LOGGER = LoggerFactory.getLogger("VisualOverhaul");
public static final List<UUID> playersWithMod = new ArrayList<>();
public static final Map<BlockPos, ItemStack> jukeboxItems = new HashMap<>();

View File

@@ -1,22 +0,0 @@
package eu.midnightdust.visualoverhaul.block;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.state.StateManager;
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;
public JukeboxTop() {
super(AbstractBlock.Settings.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

@@ -13,7 +13,7 @@ public class FurnaceWoodenPlanksModel extends Model {
public static final EntityModelLayer WOODEN_PLANKS_MODEL_LAYER = new EntityModelLayer(id("wooden_planks"), "main");
public FurnaceWoodenPlanksModel(ModelPart root) {
super(RenderLayer::getEntitySolid);
super(root, RenderLayer::getEntitySolid);
bb_main = root;
bb_main.setPivot(0.0F, 24.0F, 0.0F);
}
@@ -34,7 +34,7 @@ public class FurnaceWoodenPlanksModel extends Model {
return modelData;
}
public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, int color) {
bb_main.render(matrices, vertices, light, overlay);
}
// public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, int color) {
// bb_main.render(matrices, vertices, light, overlay);
// }
}

View File

@@ -9,9 +9,9 @@ import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ModelTransformationMode;
import org.joml.AxisAngle4f;
import org.joml.Math;
import org.joml.Quaternionf;

View File

@@ -13,10 +13,10 @@ import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.client.texture.Sprite;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ModelTransformationMode;
import net.minecraft.registry.tag.ItemTags;
import net.minecraft.util.Identifier;
import org.joml.AxisAngle4f;
@@ -41,7 +41,7 @@ public class FurnaceBlockEntityRenderer<E extends AbstractFurnaceBlockEntity> im
ItemStack input = blockEntity.getStack(0);
ItemStack fuel = blockEntity.getStack(1);
ItemStack output = blockEntity.getStack(2);
float angle = (blockState.get(AbstractFurnaceBlock.FACING)).asRotation();
float angle = (blockState.get(AbstractFurnaceBlock.FACING)).getRotationQuaternion().angle();
if(!input.isEmpty() || !output.isEmpty()) {
matrices.push();

View File

@@ -1,97 +1,73 @@
package eu.midnightdust.visualoverhaul.block.renderer;
import eu.midnightdust.visualoverhaul.FakeBlocks;
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.BlockState;
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.*;
import net.minecraft.client.render.block.BlockRenderManager;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.component.ComponentMap;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.CustomModelDataComponent;
import net.minecraft.item.ItemStack;
import net.minecraft.registry.Registries;
import net.minecraft.state.property.Properties;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.random.Random;
import org.apache.logging.log4j.LogManager;
import net.minecraft.world.BlockRenderView;
import org.joml.AxisAngle4f;
import org.joml.Math;
import org.joml.Quaternionf;
import java.util.Objects;
import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.id;
import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.jukeboxItems;
@Environment(EnvType.CLIENT)
public class JukeboxBlockEntityRenderer implements BlockEntityRenderer<JukeboxBlockEntity> {
private ItemStack record;
private Identifier discItem;
public JukeboxBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {
}
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(Objects.requireNonNull(blockEntity.getWorld()), blockEntity.getPos().up());
Identifier discModel = null; // If the sound is stopped or no sound is playing, no model is set //
// Tries to get the disc using the serverside method
if (jukeboxItems.containsKey(blockEntity.getPos()) && !jukeboxItems.get(blockEntity.getPos()).isEmpty()) {
record = jukeboxItems.get(blockEntity.getPos()).copy();
discModel = RoundDiscRenderer.getModelId(jukeboxItems.get(blockEntity.getPos()));
}
// 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 appropriate disc (minecraft:music_disc.cat -> minecraft:music_disc_cat) //
discItem = Identifier.of(String.valueOf(SoundTest.getSound(blockEntity.getPos())).replace(".", "_"));
// Tries to get the disc item from the registry //
if (Registries.ITEM.getOrEmpty(discItem).isPresent()) {
record = new ItemStack(Registries.ITEM.get(discItem));
}
else {
if (VOConfig.debug) 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;
discModel = Identifier.of(String.valueOf(SoundTest.getSound(blockEntity.getPos())).replace(".", "_"));
}
if (!record.isEmpty()) {
//record.setCount(2);
record.applyComponentsFrom(ComponentMap.builder().add(DataComponentTypes.CUSTOM_MODEL_DATA, new CustomModelDataComponent(710)).build());
if (discModel != null) {
matrices.push();
matrices.translate(0.5f, 1.03f, 0.5f);
matrices.scale(0.75f, 0.75f, 0.75f);
matrices.multiply(new Quaternionf(new AxisAngle4f(Math.toRadians(Util.getMeasuringTimeMs() / 9.0f), 0, 1, 0)));
MinecraftClient.getInstance().getItemRenderer().renderItem(record, ModelTransformationMode.GROUND, lightAbove, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0);
RoundDiscRenderer.render(discModel, lightAbove, overlay, matrices, vertexConsumers);
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) {
MinecraftClient.getInstance().getBlockRenderManager().renderBlock(VisualOverhaulClient.JukeBoxTop.getDefaultState().with(Properties.HAS_RECORD, false), blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create());
} else {
MinecraftClient.getInstance().getBlockRenderManager().renderBlock(VisualOverhaulClient.JukeBoxTop.getDefaultState().with(Properties.HAS_RECORD, true), blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create());
}
Identifier blockId = discModel != null ? id("jukebox_top_playing") : id("jukebox_top_stopped");
FakeBlocks.renderFakeBlock(blockId, blockEntity.getPos().up(), blockEntity.getWorld(), matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()));
matrices.pop();
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,12 @@
package eu.midnightdust.visualoverhaul.mixin;
import net.minecraft.client.render.item.ItemRenderState;
import net.minecraft.item.ModelTransformationMode;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(ItemRenderState.class)
public interface ItemRenderStateAccessor {
@Accessor("modelTransformationMode")
void setModelTransformationMode(ModelTransformationMode modelTransformationMode);
}

View File

@@ -0,0 +1,25 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.client.render.item.tint.ConstantTintSource;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List;
@Mixin(ConstantTintSource.class)
public abstract class MixinConstantTintSource {
@Inject(at = @At("RETURN"), method = "getTint", cancellable = true)
public void vo$modifyLeafTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable<Integer> cir) {
// Dynamic Leaf Item colors
if (VOConfig.coloredItems && List.of(-12012264).contains(cir.getReturnValue())) {
cir.setReturnValue(VisualOverhaulClient.foliageColor);
}
}
}

View File

@@ -0,0 +1,23 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.client.render.item.tint.GrassTintSource;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(GrassTintSource.class)
public abstract class MixinGrassTintSource {
@Inject(at = @At("RETURN"), method = "getTint", cancellable = true)
public void vo$modifyGrassTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable<Integer> cir) {
// Dynamic Grass Item colors
if (VOConfig.coloredItems) {
cir.setReturnValue(VisualOverhaulClient.grassColor);
}
}
}

View File

@@ -0,0 +1,39 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.client.render.item.tint.PotionTintSource;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.potion.Potions;
import net.minecraft.registry.entry.RegistryEntry;
import net.minecraft.util.math.ColorHelper;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List;
@Mixin(PotionTintSource.class)
public class MixinPotionTintSource {
@Unique private static final List<RegistryEntry<Potion>> WATER_POTIONS = List.of(Potions.WATER, Potions.MUNDANE, Potions.THICK, Potions.AWKWARD);
@Inject(at = @At("RETURN"), method = "getTint", cancellable = true)
public void vo$modifyWaterTint(ItemStack stack, ClientWorld world, LivingEntity user, CallbackInfoReturnable<Integer> cir) {
// Dynamic Potion Item colors
if (VOConfig.coloredItems) {
var contents = stack.getComponents().get(DataComponentTypes.POTION_CONTENTS);
if (contents != null && contents.potion().isPresent()) {
if (!WATER_POTIONS.contains(contents.potion().get()))
return; // Skip all potions with effects
}
if (cir.getReturnValue() == -1) cir.setReturnValue(ColorHelper.fullAlpha(VisualOverhaulClient.potionColor));
else cir.setReturnValue(VisualOverhaulClient.potionColor);
}
}
}

View File

@@ -1,12 +1,19 @@
package eu.midnightdust.visualoverhaul.mixin;
import net.minecraft.client.texture.AbstractTexture;
import net.minecraft.client.texture.TextureManager;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.Map;
@Mixin(TextureManager.class)
public interface TextureManagerAccessor {
@Accessor
ResourceManager getResourceContainer();
@Accessor
Map<Identifier, AbstractTexture> getTextures();
}

View File

@@ -1,12 +1,17 @@
package eu.midnightdust.visualoverhaul.util;
import net.minecraft.util.math.ColorHelper;
import net.minecraft.util.math.MathHelper;
public class VOColorUtil {
public static int convertRgbToArgb(int rgb) {
public static int convertRgbToArgb(int rgb, int alpha) {
int red = 0xFF & (rgb >> 16);
int green = 0xFF & (rgb >> 8);
int blue = 0xFF & (rgb);
int alpha = 200; // Makes water bottles transparent, 255 would be opaque
return (alpha << 24) | (red << 16) | (green << 8) | blue;
}
public static int alphaAndBrightness(float alpha, float brightness) {
return ColorHelper.getArgb(MathHelper.floor(alpha*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255));
}
}

View File

@@ -1,10 +0,0 @@
{
"variants": {
"has_record=true": {
"model": "visualoverhaul:block/jukebox_top_playing"
},
"has_record=false": {
"model": "visualoverhaul:block/jukebox_top_stopped"
}
}
}

View File

@@ -1,44 +0,0 @@
{
"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"}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

View File

@@ -0,0 +1,16 @@
{
"model": {
"type": "minecraft:model",
"model": "minecraft:item/axolotl_bucket",
"tints": [
{
"type": "minecraft:constant",
"value": -1
},
{
"type": "minecraft:potion",
"default": -1
}
]
}
}

View File

@@ -0,0 +1,16 @@
{
"model": {
"type": "minecraft:model",
"model": "minecraft:item/cod_bucket",
"tints": [
{
"type": "minecraft:constant",
"value": -1
},
{
"type": "minecraft:potion",
"default": -1
}
]
}
}

View File

@@ -0,0 +1,16 @@
{
"model": {
"type": "minecraft:model",
"model": "minecraft:item/pufferfish_bucket",
"tints": [
{
"type": "minecraft:constant",
"value": -1
},
{
"type": "minecraft:potion",
"default": -1
}
]
}
}

View File

@@ -0,0 +1,16 @@
{
"model": {
"type": "minecraft:model",
"model": "minecraft:item/salmon_bucket",
"tints": [
{
"type": "minecraft:constant",
"value": -1
},
{
"type": "minecraft:potion",
"default": -1
}
]
}
}

View File

@@ -0,0 +1,16 @@
{
"model": {
"type": "minecraft:model",
"model": "minecraft:item/tropical_fish_bucket",
"tints": [
{
"type": "minecraft:constant",
"value": -1
},
{
"type": "minecraft:potion",
"default": -1
}
]
}
}

View File

@@ -0,0 +1,16 @@
{
"model": {
"type": "minecraft:model",
"model": "minecraft:item/water_bucket",
"tints": [
{
"type": "minecraft:constant",
"value": -1
},
{
"type": "minecraft:potion",
"default": -1
}
]
}
}

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

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

View File

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

View File

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

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

@@ -1,15 +0,0 @@
{
"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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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