mirror of
https://github.com/TeamMidnightDust/VisualOverhaul.git
synced 2025-12-16 14:05:08 +01:00
port: 1.21.4
- Also substantially improve iconic buttons
This commit is contained in:
@@ -7,7 +7,10 @@ import eu.midnightdust.visualoverhaul.util.ModIconUtil;
|
||||
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;
|
||||
@@ -15,13 +18,18 @@ import net.minecraft.util.Identifier;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
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,32 +38,36 @@ 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);
|
||||
@@ -70,17 +82,19 @@ public class IconicButtons {
|
||||
if (VOConfig.zoomIconOnHover && widget.isSelected()) 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);
|
||||
|
||||
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);
|
||||
|
||||
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
|
||||
}
|
||||
}
|
||||
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 +116,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);
|
||||
LogManager.getLogger("Iconic").error("Error occurred while loading texture.properties {}", id.toString(), e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -4,15 +4,19 @@ import net.minecraft.block.AbstractBlock;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.registry.RegistryKey;
|
||||
import net.minecraft.registry.RegistryKeys;
|
||||
import net.minecraft.state.StateManager;
|
||||
import net.minecraft.state.property.BooleanProperty;
|
||||
import net.minecraft.state.property.Properties;
|
||||
|
||||
import static eu.midnightdust.visualoverhaul.VisualOverhaulCommon.id;
|
||||
|
||||
public class JukeboxTop extends Block {
|
||||
private static final BooleanProperty HAS_RECORD = Properties.HAS_RECORD;
|
||||
|
||||
public JukeboxTop() {
|
||||
super(AbstractBlock.Settings.copy(Blocks.JUKEBOX));
|
||||
super(AbstractBlock.Settings.copy(Blocks.JUKEBOX).registryKey(RegistryKey.of(RegistryKeys.BLOCK, id("jukebox_top"))));
|
||||
this.setDefaultState(this.stateManager.getDefaultState().with(HAS_RECORD,false));
|
||||
}
|
||||
@Override
|
||||
|
||||
@@ -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);
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user