mirror of
https://github.com/TeamMidnightDust/VisualOverhaul.git
synced 2025-12-16 05:55:09 +01:00
feat: rework dynamic item colors
This commit is contained in:
@@ -4,6 +4,7 @@ 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;
|
||||
@@ -25,6 +26,8 @@ import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.function.Function;
|
||||
|
||||
import static eu.midnightdust.visualoverhaul.util.VOColorUtil.alphaAndBrightness;
|
||||
|
||||
public class IconicButtons {
|
||||
MinecraftClient client = MinecraftClient.getInstance();
|
||||
TextureManager textureManager = client.getTextureManager();
|
||||
@@ -77,7 +80,7 @@ public class IconicButtons {
|
||||
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);
|
||||
|
||||
int color = widget.active ? fromArgb(alpha, 1.0F) : fromArgb(alpha, 0.3F);
|
||||
int color = widget.active ? alphaAndBrightness(alpha, 1.0F) : alphaAndBrightness(alpha, 0.3F);
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.enableDepthTest();
|
||||
int inset = 2;
|
||||
@@ -96,9 +99,6 @@ public class IconicButtons {
|
||||
RenderSystem.disableDepthTest();
|
||||
}
|
||||
}
|
||||
int fromArgb(float alpha, float brightness) {
|
||||
return ColorHelper.getArgb(MathHelper.floor(alpha*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255), MathHelper.floor(brightness*255));
|
||||
}
|
||||
public static void reload(ResourceManager manager) {
|
||||
manager.findResources("textures", path -> path.getNamespace().equals("iconic") && path.getPath().contains(".properties")).forEach((id, resource) -> {
|
||||
if (manager.getResource(id).isEmpty()) return;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
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 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
|
||||
}
|
||||
cir.setReturnValue(VisualOverhaulClient.potionColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
"client": [
|
||||
"ItemRenderStateAccessor",
|
||||
"MixinBlastFurnaceBlock",
|
||||
"MixinConstantTintSource",
|
||||
"MixinGrassTintSource",
|
||||
"MixinPotionTintSource",
|
||||
"MixinPressableWidget",
|
||||
"MixinSliderWidget",
|
||||
"MixinSmokerBlock",
|
||||
|
||||
Reference in New Issue
Block a user