VisualOverhaul 5.0.0 - The Iconic Update

- Port to 1.19.4
- Use Architectury -> Forge & native Quilt support!
- New Feature: Icon Buttons!
  - Makes buttons look less bland by adding icons to them
  - Loaded from resourcepacks
  - Currently uses vanilla items as icons
- Organize config screen in tabs
This commit is contained in:
Motschen
2023-04-26 20:47:43 +02:00
parent 363a9ab634
commit c6ccdb0d95
94 changed files with 611 additions and 169 deletions

View File

@@ -1,10 +1,9 @@
plugins {
id "architectury-plugin" version "3.4-SNAPSHOT"
id "dev.architectury.loom" version "1.0-SNAPSHOT" apply false
id "dev.architectury.loom" version "1.1-SNAPSHOT" apply false
}
architectury {
injectInjectables = false
minecraft = rootProject.minecraft_version
}
@@ -17,16 +16,12 @@ repositories {
subprojects {
apply plugin: "dev.architectury.loom"
loom {
silentMojangMappingsLicense()
}
dependencies {
minecraft "com.mojang:minecraft:${rootProject.minecraft_version}"
// The following line declares the mojmap mappings, you may use other mappings as well
//mappings loom.officialMojangMappings()
// The following line declares the yarn mappings you may select this one as well.
mappings "net.fabricmc:yarn:1.19.2+build.3:v2"
mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2"
}
}

View File

@@ -1,5 +1,4 @@
architectury {
injectInjectables = false
common(rootProject.enabled_platforms.split(","))
}

View File

@@ -0,0 +1,121 @@
package eu.midnightdust.visualoverhaul;
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 net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.texture.*;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.resource.ResourceManager;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableTextContent;
import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager;
import java.io.InputStream;
import java.util.Properties;
public class IconicButtons extends DrawableHelper {
MinecraftClient client = MinecraftClient.getInstance();
private String buttonId;
private Text prevText;
private Identifier iconId;
public IconicButtons(ClickableWidget widget) {
init(widget);
}
public void init(ClickableWidget widget) {
prevText = widget.getMessage();
buttonId = (widget.getMessage().getContent() instanceof TranslatableTextContent translatableTextContent) ? translatableTextContent.getKey().toLowerCase() : "";
if (VOConfig.buttonIcons && !buttonId.equals("")) {
if (VOConfig.debug) System.out.println(buttonId);
iconId = new Identifier("iconic", "textures/gui/icons/" + buttonId.toLowerCase()+".png");
if (buttonId.endsWith(".midnightconfig.title"))
{
iconId = new Identifier("modid", buttonId.replace(".midnightconfig.title", "") + "_icon");
NativeImageBackedTexture icon = new ModIconUtil(buttonId.replace(".midnightconfig.title", "")).createModIcon();
if (icon != null) {
client.getTextureManager().registerTexture(iconId, icon);
} 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;}
textureManager.registerTexture(iconId, abstractTexture);
}
if (abstractTexture == MissingSprite.getMissingSpriteTexture()) iconId = null;
}
}
public void renderIcons(MatrixStack matrices, ClickableWidget widget, float alpha) {
if (widget.getMessage() == null) return;
if (prevText != widget.getMessage()) init(widget);
if (VOConfig.buttonIcons && !buttonId.equals("") && iconId != null) {
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.setShaderTexture(0, iconId);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, alpha);
if (!widget.active) RenderSystem.setShaderColor(0.3F, 0.3F, 0.3F, alpha);
RenderSystem.enableBlend();
RenderSystem.enableDepthTest();
int inset = 2;
if (VOConfig.zoomIconOnHover && widget.isSelected()) inset = 1;
int size = 20-inset*2;
if (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.LEFT) || showLeftWhenBoth || (VOConfig.buttonIconPosition.equals(VOConfig.IconPosition.LOCATION) && widget.getX() < scaledWidth/2))
drawTexture(matrices, 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))
drawTexture(matrices, 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) -> {
if (manager.getResource(id).isEmpty()) return;
try (InputStream stream = manager.getResource(id).get().getInputStream()) {
Identifier iconId = new Identifier(id.getNamespace(), id.getPath().replace(".properties", ".png"));
if (manager.getResource(iconId).isPresent()) return;
Properties properties = new Properties();
properties.load(stream);
while (properties.get("properties") != null) {
Identifier propertiesId = new Identifier(properties.getProperty("properties"));
String textureId = propertiesId.toString().replace(".properties", ".png");
properties.clear();
if (manager.getResource(Identifier.tryParse(textureId)).isPresent()) { // If a texture is present at the location of the referenced properties file, use that instead
properties.put("texture", textureId);
}
else if (manager.getResource(propertiesId).isPresent()) {
properties.load(manager.getResource(propertiesId).get().getInputStream()); // Else load the referenced properties file, if present
} else return;
}
if (properties.get("texture") != null) {
Identifier textureId = new Identifier(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);
}
}
} catch (Exception e) {
LogManager.getLogger("Iconic").error("Error occurred while loading texture.properties " + id.toString(), e);
}
});
}
}

View File

@@ -2,6 +2,11 @@ package eu.midnightdust.visualoverhaul;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.block.Block;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.color.world.BiomeColors;
import net.minecraft.client.item.ModelPredicateProviderRegistry;
import net.minecraft.item.MusicDiscItem;
import net.minecraft.util.Identifier;
import static eu.midnightdust.visualoverhaul.VisualOverhaul.MOD_ID;

View File

@@ -9,15 +9,20 @@ 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.ModelTransformation;
import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.Vec3f;
import org.joml.AxisAngle4f;
import org.joml.Math;
import org.joml.Quaternionf;
import java.util.Objects;
@Environment(EnvType.CLIENT)
public class BrewingStandBlockEntityRenderer implements BlockEntityRenderer<BrewingStandBlockEntity> {
private static final Quaternionf degrees45 = new Quaternionf(new AxisAngle4f(Math.toRadians(45), 0, 1, 0));
private static final Quaternionf degrees180 = new Quaternionf(new AxisAngle4f(Math.toRadians(180), 0, 1, 0));
private static final Quaternionf degrees315 = new Quaternionf(new AxisAngle4f(Math.toRadians(315), 0, 1, 0));
public BrewingStandBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {
}
@@ -37,28 +42,28 @@ public class BrewingStandBlockEntityRenderer implements BlockEntityRenderer<Brew
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.multiply(degrees180);
MinecraftClient.getInstance().getItemRenderer().renderItem(item1, ModelTransformationMode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0);
matrices.pop();
}
if (!item2.isEmpty()) {
matrices.push();
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(315));
matrices.multiply(degrees315);
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);
MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformationMode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0);
matrices.pop();
}
if (!item3.isEmpty()) {
matrices.push();
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(45));
matrices.multiply(degrees45);
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);
MinecraftClient.getInstance().getItemRenderer().renderItem(item3, ModelTransformationMode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0);
matrices.pop();
}

View File

@@ -13,18 +13,21 @@ 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.ModelTransformation;
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.tag.ItemTags;
import net.minecraft.registry.tag.ItemTags;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.Vec3f;
import org.joml.AxisAngle4f;
import org.joml.Math;
import org.joml.Quaternionf;
import java.util.Objects;
@Environment(EnvType.CLIENT)
public class FurnaceBlockEntityRenderer<E extends AbstractFurnaceBlockEntity> implements BlockEntityRenderer<E> {
private static final Quaternionf degrees90x = new Quaternionf(new AxisAngle4f(Math.toRadians(90), 1, 0, 0));
private final FurnaceWoodenPlanksModel planks;
public FurnaceBlockEntityRenderer(BlockEntityRendererFactory.Context ctx) {
@@ -46,10 +49,10 @@ public class FurnaceBlockEntityRenderer<E extends AbstractFurnaceBlockEntity> im
if (blockEntity.getCachedState().getBlock().equals(Blocks.SMOKER)) matrices.translate(0f, -0.06f, 0f);
if (blockEntity.getCachedState().getBlock().equals(Blocks.BLAST_FURNACE)) matrices.translate(0f, -0.25f, 0f);
matrices.scale(1f, 1f, 1f);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
matrices.multiply(new Quaternionf(new AxisAngle4f(Math.toRadians(angle * 3 + 180), 0, 1, 0)));
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.multiply(degrees90x);
MinecraftClient.getInstance().getItemRenderer().renderItem(item1, ModelTransformationMode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0);
matrices.pop();
@@ -61,10 +64,10 @@ public class FurnaceBlockEntityRenderer<E extends AbstractFurnaceBlockEntity> im
if (blockEntity.getCachedState().getBlock().equals(Blocks.SMOKER)) matrices.translate(0f, 0.06f, 0f);
if (blockEntity.getCachedState().getBlock().equals(Blocks.BLAST_FURNACE)) matrices.translate(0f, 0.24f, 0f);
matrices.scale(1f, 1f, 1f);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
matrices.multiply(new Quaternionf(new AxisAngle4f(Math.toRadians(angle * 3 + 180), 0, 1, 0)));
matrices.translate(0.0f, 0.0f, -0.4f);
matrices.multiply(Vec3f.POSITIVE_X.getDegreesQuaternion(90));
MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformation.Mode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers,0);
matrices.multiply(degrees90x);
MinecraftClient.getInstance().getItemRenderer().renderItem(item2, ModelTransformationMode.GROUND, lightAtBlock, overlay, matrices, vertexConsumers, blockEntity.getWorld(), 0);
matrices.pop();
}
@@ -80,7 +83,7 @@ public class FurnaceBlockEntityRenderer<E extends AbstractFurnaceBlockEntity> im
matrices.scale(1f, 1f, 1f);
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(angle * 3 + 180));
matrices.multiply(new Quaternionf(new AxisAngle4f(Math.toRadians(angle * 3 + 180), 0, 1, 0)));
planks.getPart().render(matrices, vertexConsumer, lightAtBlock, overlay);
matrices.pop();
}
@@ -88,7 +91,7 @@ public class FurnaceBlockEntityRenderer<E extends AbstractFurnaceBlockEntity> im
}
public static Identifier spriteToTexture(Sprite sprite) {
String texture = sprite.getId().getPath();
return new Identifier(sprite.getId().getNamespace(), "textures/" + texture + ".png");
String texture = sprite.getContents().getId().getPath();
return new Identifier(sprite.getAtlasId().getNamespace(), "textures/" + texture + ".png");
}
}

View File

@@ -13,17 +13,19 @@ 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.ModelTransformation;
import net.minecraft.client.render.model.json.ModelTransformationMode;
import net.minecraft.client.util.math.MatrixStack;
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.Direction;
import net.minecraft.util.math.Vec3f;
import net.minecraft.util.math.random.Random;
import net.minecraft.util.registry.Registry;
import org.apache.logging.log4j.LogManager;
import org.joml.AxisAngle4f;
import org.joml.Math;
import org.joml.Quaternionf;
import java.util.Objects;
@@ -41,17 +43,17 @@ public class JukeboxBlockEntityRenderer implements BlockEntityRenderer<JukeboxBl
int lightAbove = WorldRenderer.getLightmapCoordinates(Objects.requireNonNull(blockEntity.getWorld()), blockEntity.getPos().up());
// Tries to get the disc using the serverside method
if (blockEntity.getRecord() != ItemStack.EMPTY) {
record = blockEntity.getRecord().copy();
if (blockEntity.getStack() != ItemStack.EMPTY) {
record = blockEntity.getStack().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 appropriate disc (minecraft:music_disc.cat -> minecraft:music_disc_cat) //
// Converts the Sound ID to the item ID of the appropriate disc (minecraft:music_disc.cat -> minecraft:music_disc_cat) //
discItem = new Identifier(String.valueOf(SoundTest.getSound(blockEntity.getPos())).replace(".", "_"));
// Tries to get the disc item from the registry //
if (Registry.ITEM.getOrEmpty(discItem).isPresent()) {
record = new ItemStack(Registry.ITEM.get(discItem));
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()));
@@ -71,8 +73,8 @@ public class JukeboxBlockEntityRenderer implements BlockEntityRenderer<JukeboxBl
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.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);
matrices.pop();
}

View File

@@ -3,15 +3,21 @@ package eu.midnightdust.visualoverhaul.config;
import eu.midnightdust.lib.config.MidnightConfig;
public class VOConfig extends MidnightConfig {
@Client @Entry public static boolean brewingstand = true;
@Client @Entry public static boolean jukebox = true;
@Client @Entry public static boolean jukebox_fake_block = true;
@Client @Entry public static boolean furnace = true;
@Client @Entry public static boolean smoker_particles = true;
@Client @Entry public static boolean blast_furnace_particles = true;
@Client @Entry public static boolean coloredItems = true;
@Client @Entry public static boolean coloredLilypad = true;
@Client @Entry public static boolean potionEnchantmentGlint = true;
@Client @Entry(name = "Debug") public static boolean debug = false;
public static final String blocks = "blocks";
public static final String colors = "colors";
public static final String gui = "gui";
@Client @Entry(category = blocks) public static boolean brewingstand = true;
@Client @Entry(category = blocks) public static boolean jukebox = true;
@Client @Entry(category = blocks) public static boolean jukebox_fake_block = true;
@Client @Entry(category = blocks) public static boolean furnace = true;
@Client @Entry(category = blocks) public static boolean smoker_particles = true;
@Client @Entry(category = blocks) public static boolean blast_furnace_particles = true;
@Client @Entry(category = colors) public static boolean coloredItems = true;
@Client @Entry(category = colors) public static boolean coloredLilypad = true;
@Client @Entry(category = gui) public static boolean buttonIcons = true;
@Client @Entry(category = gui) public static IconPosition buttonIconPosition = IconPosition.LOCATION;
@Client @Entry(category = gui) public static boolean zoomIconOnHover = true;
@Client @Entry(category = gui, name = "Debug") public static boolean debug = false;
@Client @Entry @Hidden public static boolean firstLaunch = true;
public enum IconPosition {LOCATION, LEFT, RIGHT, BOTH}
}

View File

@@ -0,0 +1,14 @@
package eu.midnightdust.visualoverhaul.mixin;
import net.minecraft.block.entity.JukeboxBlockEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.collection.DefaultedList;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(JukeboxBlockEntity.class)
public interface JukeboxBlockEntityAccessor {
@Accessor @Final
DefaultedList<ItemStack> getInventory();
}

View File

@@ -17,7 +17,7 @@ public abstract class MixinJukeboxBlockEntity extends BlockEntity {
super(type, pos, state);
}
@Inject(at = @At("RETURN"), method = "getRecord")
@Inject(at = @At("RETURN"), method = "getStack")
public void getRecord(CallbackInfoReturnable<ItemStack> cir) {
JukeboxPacketUpdate.invUpdate = true;
}

View File

@@ -1,22 +0,0 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.PotionItem;
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(PotionItem.class)
public abstract class MixinPotionItem extends Item {
public MixinPotionItem(Settings settings) {
super(settings);
}
@Inject(at = @At("HEAD"), method = "hasGlint", cancellable = true)
public void vo$hasGlint(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
if (!VOConfig.potionEnchantmentGlint) cir.setReturnValue(super.hasGlint(stack));
}
}

View File

@@ -0,0 +1,29 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.IconicButtons;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.PressableWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
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.CallbackInfo;
@Mixin(PressableWidget.class)
public abstract class MixinPressableWidget extends ClickableWidget {
@Unique IconicButtons iconicButtons;
public MixinPressableWidget(int x, int y, int width, int height, Text message) {
super(x, y, width, height, message);
}
@Inject(at = @At("TAIL"), method = "<init>")
private void iconic$onInitButton(int i, int j, int k, int l, Text text, CallbackInfo ci) {
iconicButtons = new IconicButtons(this);
}
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/PressableWidget;drawMessage(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/font/TextRenderer;I)V", shift = At.Shift.BEFORE), method = "renderButton")
private void iconic$onRenderButton(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
iconicButtons.renderIcons(matrices, this, this.alpha);
}
}

View File

@@ -0,0 +1,29 @@
package eu.midnightdust.visualoverhaul.mixin;
import eu.midnightdust.visualoverhaul.IconicButtons;
import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.SliderWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
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.CallbackInfo;
@Mixin(SliderWidget.class)
public abstract class MixinSliderWidget extends ClickableWidget {
@Unique IconicButtons iconicButtons;
public MixinSliderWidget(int x, int y, int width, int height, Text message) {
super(x, y, width, height, message);
}
@Inject(at = @At("TAIL"), method = "<init>")
private void iconic$onInitButton(int x, int y, int width, int height, Text text, double value, CallbackInfo ci) {
iconicButtons = new IconicButtons(this);
}
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/SliderWidget;drawScrollableText(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/font/TextRenderer;II)V", shift = At.Shift.BEFORE), method = "renderButton")
private void iconic$onRenderButton(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
iconicButtons.renderIcons(matrices, this, this.alpha);
}
}

View File

@@ -21,7 +21,7 @@ public abstract class MixinSoundSystem {
@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(Math.floor(soundInstance.getX()), Math.floor(soundInstance.getY()), Math.floor(soundInstance.getZ()));
jukeboxPos = BlockPos.ofFloored(Math.floor(soundInstance.getX()), Math.floor(soundInstance.getY()), Math.floor(soundInstance.getZ()));
SoundTest.soundPos.put(jukeboxPos, soundInstance.getId());
}
}
@@ -30,7 +30,7 @@ public abstract class MixinSoundSystem {
public void vo$onStopRecordSound(SoundInstance soundInstance, CallbackInfo ci) {
if (soundInstance != null) {
if (soundInstance.getCategory().equals(SoundCategory.RECORDS)) {
jukeboxPos = new BlockPos(Math.floor(soundInstance.getX()), Math.floor(soundInstance.getY()), Math.floor(soundInstance.getZ()));
jukeboxPos = BlockPos.ofFloored(Math.floor(soundInstance.getX()), Math.floor(soundInstance.getY()), Math.floor(soundInstance.getZ()));
if (SoundTest.soundPos.containsKey(jukeboxPos)) {
SoundTest.soundPos.remove(jukeboxPos, soundInstance.getId());
}

View File

@@ -0,0 +1,12 @@
package eu.midnightdust.visualoverhaul.mixin;
import net.minecraft.client.texture.TextureManager;
import net.minecraft.resource.ResourceManager;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(TextureManager.class)
public interface TextureManagerAccessor {
@Accessor
ResourceManager getResourceContainer();
}

View File

@@ -0,0 +1,63 @@
package eu.midnightdust.visualoverhaul.util;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.fabricmc.loader.api.FabricLoader;
import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.client.texture.NativeImage;
import net.minecraft.client.texture.NativeImageBackedTexture;
import org.apache.commons.lang3.Validate;
import org.spongepowered.asm.mixin.Unique;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class ModIconUtil {
private static final Map<Path, NativeImageBackedTexture> modIconCache = new HashMap<>();
private final String modid;
public ModIconUtil(String modid) {
this.modid = modid;
}
@ExpectPlatform
public static Path getPath(String modid) {
throw new AssertionError();
}
@Unique
public NativeImageBackedTexture createModIcon() {
try {
Path path = getPath(modid);
if (VOConfig.debug) System.out.println(path);
NativeImageBackedTexture cachedIcon = getCachedModIcon(path);
if (cachedIcon != null) {
return cachedIcon;
}
cachedIcon = getCachedModIcon(path);
if (cachedIcon != null) {
return cachedIcon;
}
try (InputStream inputStream = Files.newInputStream(path)) {
NativeImage image = NativeImage.read(Objects.requireNonNull(inputStream));
Validate.validState(image.getHeight() == image.getWidth(), "Must be square icon");
NativeImageBackedTexture tex = new NativeImageBackedTexture(image);
cacheModIcon(path, tex);
return tex;
}
} catch (Throwable t) {
if (VOConfig.debug) System.out.println(t.getMessage());
return null;
}
}
static NativeImageBackedTexture getCachedModIcon(Path path) {
return modIconCache.get(path);
}
static void cacheModIcon(Path path, NativeImageBackedTexture tex) {
modIconCache.put(path, tex);
}
}

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/gui.done.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/written_book.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/paper.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/knowledge_book.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/modmenu.title.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/experience_bottle.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/gui.cancel.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/coal.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/emerald.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/block/redstone_lamp.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/gui.done.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/paper.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/block/redstone_lamp_on.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/menu.returntomenu.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/diamond_sword.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/netherite_hoe.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/command_block_minecart.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/mangrove_sign.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/barrier.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/pufferfish.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/emerald.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/blaze_powder.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/echo_shard.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/recovery_compass_18.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/iron_pickaxe.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/gui.no.properties

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/gui.yes.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/totem_of_undying.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/axolotl_bucket.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/birch_hanging_sign.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/jungle_boat.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/name_tag.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/ender_eye.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/writable_book.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/comparator.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/painting.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/armor_stand.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/music_disc_otherside.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/nether_star.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/end_crystal.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/mojang_banner_pattern.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/slime_ball.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/selectworld.create.properties

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/selectworld.delete.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/firework_rocket.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/selectworld.edit.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/blaze_powder.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/selectworld.select.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/diamond.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/tnt_minecart.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/menu.options.properties

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/gui.done.properties

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/furnace_minecart.png

View File

@@ -0,0 +1 @@
texture=minecraft:textures/item/trident.png

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/gui.no.properties

View File

@@ -0,0 +1 @@
properties=iconic:textures/gui/icons/gui.yes.properties

View File

@@ -0,0 +1,23 @@
{
"visualoverhaul.midnightconfig.title":"Visual Overhaul Konfiguration",
"visualoverhaul.midnightconfig.brewingstand":"Braustand-Verbesserungen",
"visualoverhaul.midnightconfig.jukebox":"Jukebox-Verbesserungen",
"visualoverhaul.midnightconfig.jukebox_fake_block":"Fake-Block auf der Jukebox",
"visualoverhaul.midnightconfig.furnace":"Ofen-Verbesserungen",
"visualoverhaul.midnightconfig.smoker_particles":"Räucherofen-Partikel",
"visualoverhaul.midnightconfig.blast_furnace_particles":"Schmelzofen-Partikel",
"visualoverhaul.midnightconfig.coloredItems":"Biom-basierte Item-Farben",
"visualoverhaul.midnightconfig.coloredItems.tooltip":"§cNeustart benötigt!",
"visualoverhaul.midnightconfig.coloredLilypad":"Biom-basierte Seerosenfarbe",
"visualoverhaul.midnightconfig.coloredLilypad.tooltip":"§cNeustart benötigt!",
"visualoverhaul.midnightconfig.buttonIcons": "Symbole auf Knöpfen",
"visualoverhaul.midnightconfig.buttonIconPosition": "Knopfsymbolposition",
"visualoverhaul.midnightconfig.enum.IconPosition.LOCATION": "Ortsbasiert",
"visualoverhaul.midnightconfig.enum.IconPosition.LEFT": "Links",
"visualoverhaul.midnightconfig.enum.IconPosition.RIGHT": "Rechts",
"visualoverhaul.midnightconfig.enum.IconPosition.BOTH": "Links & Rechts",
"visualoverhaul.midnightconfig.zoomIconOnHover": "Vergrößere Symbol beim Überfahren",
"visualoverhaul.midnightconfig.category.gui": "GUI",
"visualoverhaul.midnightconfig.category.blocks": "Blöcke",
"visualoverhaul.midnightconfig.category.colors": "Farben"
}

View File

@@ -10,5 +10,14 @@
"visualoverhaul.midnightconfig.coloredItems.tooltip":"§cNeeds restart!",
"visualoverhaul.midnightconfig.coloredLilypad":"Biome-based Lily Pad color",
"visualoverhaul.midnightconfig.coloredLilypad.tooltip":"§cNeeds restart!",
"visualoverhaul.midnightconfig.potionEnchantmentGlint":"Potion enchantment glint"
"visualoverhaul.midnightconfig.buttonIcons": "Button Icons",
"visualoverhaul.midnightconfig.buttonIconPosition": "Button Icon Position",
"visualoverhaul.midnightconfig.enum.IconPosition.LOCATION": "Location-dependant",
"visualoverhaul.midnightconfig.enum.IconPosition.LEFT": "Left",
"visualoverhaul.midnightconfig.enum.IconPosition.RIGHT": "Right",
"visualoverhaul.midnightconfig.enum.IconPosition.BOTH": "Left & Right",
"visualoverhaul.midnightconfig.zoomIconOnHover": "Zoom icon on hover",
"visualoverhaul.midnightconfig.category.gui": "GUI",
"visualoverhaul.midnightconfig.category.blocks": "Blocks",
"visualoverhaul.midnightconfig.category.colors": "Colors"
}

View File

@@ -9,6 +9,5 @@
"visualoverhaul.midnightconfig.coloredItems":"Couleurs des objets basées sur le biome",
"visualoverhaul.midnightconfig.coloredItems.tooltip":"§cBesoin de redémarrer !",
"visualoverhaul.midnightconfig.coloredLilypad":"Couleur de nénuphar basée sur le biome",
"visualoverhaul.midnightconfig.coloredLilypad.tooltip":"§cBesoin de redémarrer !",
"visualoverhaul.midnightconfig.potionEnchantmentGlint":"Brillance d'enchantement de potion"
"visualoverhaul.midnightconfig.coloredLilypad.tooltip":"§cBesoin de redémarrer !"
}

View File

@@ -10,7 +10,10 @@
"MixinSoundSystem",
"MixinSmokerBlock",
"MixinBlastFurnaceBlock",
"MixinPotionItem"
"MixinPressableWidget",
"MixinSliderWidget",
"TextureManagerAccessor",
"JukeboxBlockEntityAccessor"
],
"injectors": {
"defaultRequire": 1

View File

@@ -19,8 +19,8 @@ import net.minecraft.client.render.model.json.ModelTransformation;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3f;
import net.minecraft.util.math.random.Random;
import org.joml.Vector3f;
@Environment(EnvType.CLIENT)
public class RadioJukeboxBlockEntityRenderer implements BlockEntityRenderer<RadioJukeboxBlockEntity> {
@@ -36,42 +36,42 @@ public class RadioJukeboxBlockEntityRenderer implements BlockEntityRenderer<Radi
@Override
public void render(RadioJukeboxBlockEntity jukebox, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
if (VOConfig.jukebox && client.world != null) {
matrices.push();
Vec3f vecPos = matrices.peek().getNormalMatrix().decomposeLinearTransformation().getMiddle();
BlockPos pos = new BlockPos(vecPos.getX(), vecPos.getY(), vecPos.getZ());
int lightAbove = WorldRenderer.getLightmapCoordinates(client.world, pos.up());
// Tries to get the disc using the serverside method
if (jukebox.getStack(jukebox.getPlayingSong()) != ItemStack.EMPTY) {
record = jukebox.getStack(jukebox.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.translate(0.5f, 1.03f, 0.5f);
matrices.scale(0.75f, 0.75f, 0.75f);
if (jukebox.isPlaying()) {
rotation = (client.world.getTime() + tickDelta) * 4;
}
matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(rotation));
client.getItemRenderer().renderItem(record, ModelTransformation.Mode.GROUND, lightAbove, overlay, matrices, vertexConsumers, 0);
matrices.pop();
if (VOConfig.jukebox_fake_block && client.world.getBlockState(pos.up()).getBlock() == Blocks.AIR) {
blockState = client.world.getBlockState(pos);
matrices.push();
matrices.translate(0f, 1f, 0f);
if (record == ItemStack.EMPTY) {
client.getBlockRenderManager().renderBlock(PhonosCompatInit.RadioJukeboxTop.getDefaultState().with(RadioJukeboxTop.PLAYING, false).with(RadioJukeboxTop.CHANNEL, blockState.get(RadioJukeboxBlock.CHANNEL)), pos.up(), client.world, matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create());
} else {
client.getBlockRenderManager().renderBlock(PhonosCompatInit.RadioJukeboxTop.getDefaultState().with(RadioJukeboxTop.PLAYING, true).with(RadioJukeboxTop.CHANNEL, blockState.get(RadioJukeboxBlock.CHANNEL)), pos.up(), client.world, matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create());
}
matrices.pop();
}
// matrices.push();
// Vector3f vecPos = matrices.peek().getNormalMatrix().decomposeLinearTransformation().getMiddle();
// BlockPos pos = new BlockPos(vecPos.getX(), vecPos.getY(), vecPos.getZ());
// int lightAbove = WorldRenderer.getLightmapCoordinates(client.world, pos.up());
//
// // Tries to get the disc using the serverside method
// if (jukebox.getStack(jukebox.getPlayingSong()) != ItemStack.EMPTY) {
// record = jukebox.getStack(jukebox.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.translate(0.5f, 1.03f, 0.5f);
// matrices.scale(0.75f, 0.75f, 0.75f);
//
// if (jukebox.isPlaying()) {
// rotation = (client.world.getTime() + tickDelta) * 4;
// }
// matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(rotation));
// client.getItemRenderer().renderItem(record, ModelTransformation.Mode.GROUND, lightAbove, overlay, matrices, vertexConsumers, 0);
//
// matrices.pop();
// if (VOConfig.jukebox_fake_block && client.world.getBlockState(pos.up()).getBlock() == Blocks.AIR) {
// blockState = client.world.getBlockState(pos);
// matrices.push();
// matrices.translate(0f, 1f, 0f);
// if (record == ItemStack.EMPTY) {
// client.getBlockRenderManager().renderBlock(PhonosCompatInit.RadioJukeboxTop.getDefaultState().with(RadioJukeboxTop.PLAYING, false).with(RadioJukeboxTop.CHANNEL, blockState.get(RadioJukeboxBlock.CHANNEL)), pos.up(), client.world, matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create());
// } else {
// client.getBlockRenderManager().renderBlock(PhonosCompatInit.RadioJukeboxTop.getDefaultState().with(RadioJukeboxTop.PLAYING, true).with(RadioJukeboxTop.CHANNEL, blockState.get(RadioJukeboxBlock.CHANNEL)), pos.up(), client.world, matrices, vertexConsumers.getBuffer(RenderLayer.getCutout()), false, Random.create());
// }
// matrices.pop();
// }
}
}
}

View File

@@ -4,20 +4,21 @@ import eu.midnightdust.visualoverhaul.compat.phonos.block.RadioJukeboxTop;
import eu.midnightdust.visualoverhaul.compat.phonos.block.renderer.RadioJukeboxBlockEntityRenderer;
import io.github.foundationgames.phonos.block.PhonosBlocks;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry;
import net.minecraft.block.Block;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
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);
Registry.register(Registries.BLOCK, new Identifier("visualoverhaul","radio_jukebox_top"), RadioJukeboxTop);
BlockRenderLayerMap.INSTANCE.putBlock(PhonosBlocks.RADIO_JUKEBOX, RenderLayer.getCutout());
BlockRenderLayerMap.INSTANCE.putBlock(RadioJukeboxTop, RenderLayer.getCutout());
BlockEntityRendererRegistry.register(PhonosBlocks.RADIO_JUKEBOX_ENTITY, RadioJukeboxBlockEntityRenderer::new);
BlockEntityRendererFactories.register(PhonosBlocks.RADIO_JUKEBOX_ENTITY, RadioJukeboxBlockEntityRenderer::new);
}
}

View File

@@ -3,7 +3,6 @@ plugins {
}
architectury {
injectInjectables = false
platformSetupLoomIde()
fabric()
}
@@ -33,7 +32,7 @@ dependencies {
common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false }
common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false }
//common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false }
//shadowCommon(project(path: ":fabric-like", configuration: "transformProductionFabric")) { transitive false }
}

View File

@@ -1,5 +1,6 @@
package eu.midnightdust.visualoverhaul.fabric;
import eu.midnightdust.visualoverhaul.IconicButtons;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.block.JukeboxTop;
import eu.midnightdust.visualoverhaul.block.model.FurnaceWoodenPlanksModel;
@@ -7,33 +8,44 @@ import eu.midnightdust.visualoverhaul.block.renderer.BrewingStandBlockEntityRend
import eu.midnightdust.visualoverhaul.block.renderer.FurnaceBlockEntityRenderer;
import eu.midnightdust.visualoverhaul.block.renderer.JukeboxBlockEntityRenderer;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import eu.midnightdust.visualoverhaul.mixin.JukeboxBlockEntityAccessor;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
import net.fabricmc.fabric.api.resource.ResourcePackActivationType;
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.block.Blocks;
import net.minecraft.block.entity.AbstractFurnaceBlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.block.entity.BrewingStandBlockEntity;
import net.minecraft.block.entity.JukeboxBlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.color.world.BiomeColors;
import net.minecraft.client.item.ModelPredicateProviderRegistry;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories;
import net.minecraft.client.texture.*;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.MusicDiscItem;
import net.minecraft.potion.PotionUtil;
import net.minecraft.potion.Potions;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.resource.ResourceManager;
import net.minecraft.resource.ResourceType;
import net.minecraft.util.Identifier;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
import org.apache.logging.log4j.LogManager;
import java.io.InputStream;
import java.util.Properties;
import static eu.midnightdust.visualoverhaul.VisualOverhaul.*;
import static eu.midnightdust.visualoverhaul.VisualOverhaulClient.JukeBoxTop;
@@ -44,7 +56,7 @@ public class VisualOverhaulClientFabric implements ClientModInitializer {
VisualOverhaulClient.onInitializeClient();
JukeBoxTop = new JukeboxTop();
// Block only registered on client, because it's just used for the renderer //
Registry.register(Registry.BLOCK, new Identifier(MOD_ID,"jukebox_top"), JukeBoxTop);
Registry.register(Registries.BLOCK, new Identifier(MOD_ID,"jukebox_top"), JukeBoxTop);
EntityModelLayerRegistry.registerModelLayer(FurnaceWoodenPlanksModel.WOODEN_PLANKS_MODEL_LAYER, FurnaceWoodenPlanksModel::getTexturedModelData);
@@ -54,18 +66,18 @@ public class VisualOverhaulClientFabric implements ClientModInitializer {
BlockRenderLayerMap.INSTANCE.putBlock(Blocks.SMOKER, RenderLayer.getCutout());
BlockRenderLayerMap.INSTANCE.putBlock(Blocks.BLAST_FURNACE, RenderLayer.getCutout());
BlockEntityRendererRegistry.register(BlockEntityType.BREWING_STAND, BrewingStandBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(BlockEntityType.JUKEBOX, JukeboxBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(BlockEntityType.FURNACE, FurnaceBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(BlockEntityType.SMOKER, FurnaceBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(BlockEntityType.BLAST_FURNACE, FurnaceBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.BREWING_STAND, BrewingStandBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.JUKEBOX, JukeboxBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.FURNACE, FurnaceBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.SMOKER, FurnaceBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.BLAST_FURNACE, FurnaceBlockEntityRenderer::new);
// Phonos Compat //
if (FabricLoader.getInstance().isModLoaded("phonos")) {
//PhonosCompatInit.init();
}
//if (FabricLoader.getInstance().isModLoaded("phonos")) {
// PhonosCompatInit.init();
//}
Registry.ITEM.forEach((item) -> {
Registries.ITEM.forEach((item) -> {
if(item instanceof MusicDiscItem || item.getName().getString().toLowerCase().contains("music_disc") || item.getName().getString().toLowerCase().contains("record") || item.getName().getString().toLowerCase().contains("dynamic_disc")) {
ModelPredicateProviderRegistry.register(item, new Identifier("round"), (stack, world, entity, seed) -> stack.getCount() == 2 ? 1.0F : 0.0F);
}
@@ -94,7 +106,7 @@ public class VisualOverhaulClientFabric implements ClientModInitializer {
ItemStack record = attachedData.readItemStack();
client.execute(() -> {
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof JukeboxBlockEntity blockEntity) {
blockEntity.setRecord(record);
((JukeboxBlockEntityAccessor)blockEntity).getInventory().set(0, record);
}
});
});
@@ -180,5 +192,17 @@ public class VisualOverhaulClientFabric implements ClientModInitializer {
if (VOConfig.coloredLilypad) {
ColorProviderRegistry.BLOCK.register((state, world, pos, tintIndex) -> world != null ? world.getColor(pos, BiomeColors.FOLIAGE_COLOR) : 0, Blocks.LILY_PAD);
}
ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(new SimpleSynchronousResourceReloadListener() {
@Override
public Identifier getFabricId() {
return new Identifier("iconic", "button_icons");
}
@Override
public void reload(ResourceManager manager) {
IconicButtons.reload(manager);
}
});
}
}

View File

@@ -45,7 +45,7 @@ public abstract class MixinJukeboxBlock extends BlockWithEntity {
Stream<ServerPlayerEntity> watchingPlayers = PlayerLookup.tracking(blockEntity).stream();
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeBlockPos(pos);
passedData.writeItemStack(blockEntity.getRecord());
passedData.writeItemStack(blockEntity.getStack());
watchingPlayers.forEach(player -> ServerPlayNetworking.send(player, VisualOverhaul.UPDATE_RECORD, passedData));
JukeboxPacketUpdate.invUpdate = false;

View File

@@ -0,0 +1,13 @@
package eu.midnightdust.visualoverhaul.util.fabric;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import java.nio.file.Path;
public class ModIconUtilImpl {
public static Path getPath(String modid) {
ModContainer mod = FabricLoader.getInstance().getModContainer(modid).orElseThrow(() -> new RuntimeException("Cannot get ModContainer for Fabric mod with id "));
return mod.findPath(mod.getMetadata().getIconPath(16).orElseThrow()).orElseThrow();
}
}

View File

@@ -3,7 +3,6 @@ plugins {
}
architectury {
injectInjectables = false
platformSetupLoomIde()
forge()
}
@@ -32,7 +31,7 @@ dependencies {
// Remove the next line if you don't want to depend on the API
modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}"
modImplementation "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-forge"
include "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-forge"
//include "maven.modrinth:midnightlib:${rootProject.midnightlib_version}-forge"
common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false }

View File

@@ -1,5 +1,6 @@
package eu.midnightdust.visualoverhaul.forge;
import eu.midnightdust.visualoverhaul.IconicButtons;
import eu.midnightdust.visualoverhaul.block.model.FurnaceWoodenPlanksModel;
import eu.midnightdust.visualoverhaul.block.renderer.BrewingStandBlockEntityRenderer;
import eu.midnightdust.visualoverhaul.block.renderer.FurnaceBlockEntityRenderer;
@@ -9,11 +10,11 @@ import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.color.world.BiomeColors;
import net.minecraft.resource.*;
import net.minecraft.resource.metadata.PackResourceMetadata;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.EntityRenderersEvent;
import net.minecraftforge.client.event.RegisterClientReloadListenersEvent;
import net.minecraftforge.event.AddPackFindersEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -22,8 +23,6 @@ import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.forgespi.locating.IModFile;
import net.minecraftforge.resource.PathPackResources;
import java.io.IOException;
import static eu.midnightdust.visualoverhaul.VisualOverhaul.MOD_ID;
@Mod.EventBusSubscriber(modid = MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
@@ -57,6 +56,16 @@ public class VisualOverhaulClientEvents {
event.registerBlockEntityRenderer(BlockEntityType.BLAST_FURNACE, FurnaceBlockEntityRenderer::new);
}
@SubscribeEvent
public static void addReloadListener(RegisterClientReloadListenersEvent event) {
event.registerReloadListener(new IconReloadListener());
}
public static class IconReloadListener implements SynchronousResourceReloader {
@Override
public void reload(ResourceManager manager) {
IconicButtons.reload(manager);
}
}
@SubscribeEvent
public static void addPackFinders(AddPackFindersEvent event) {
if (event.getPackType() == ResourceType.CLIENT_RESOURCES) {
registerResourcePack(event, new Identifier(MOD_ID,"nobrewingbottles"), false, true);
@@ -66,13 +75,15 @@ public class VisualOverhaulClientEvents {
}
}
private static void registerResourcePack(AddPackFindersEvent event, Identifier id, boolean alwaysEnabled, boolean defaultEnabled) {
event.addRepositorySource(((profileAdder, factory) -> {
event.addRepositorySource(((profileAdder) -> {
IModFile file = ModList.get().getModFileById(id.getNamespace()).getFile();
try (PathPackResources pack = new PathPackResources(id.toString(), file.findResource("resourcepacks/" +id.getPath()))) {
ResourcePackProfile packProfile = new ResourcePackProfile(id.toString(), alwaysEnabled, () -> pack, Text.of(id.getNamespace()+"/"+id.getPath()), pack.parseMetadata(PackResourceMetadata.READER).getDescription().copy().append(" §7(built-in)"), ResourcePackCompatibility.COMPATIBLE, ResourcePackProfile.InsertionPosition.TOP, false, ResourcePackSource.PACK_SOURCE_BUILTIN, false);
profileAdder.accept(packProfile);
if (defaultEnabled && !alwaysEnabled) VisualOverhaulClientForge.defaultEnabledPacks.add(packProfile);
} catch (IOException | NullPointerException e) {e.printStackTrace();}
try (PathPackResources pack = new PathPackResources(id.toString(), true, file.findResource("resourcepacks/" +id.getPath()))) {
ResourcePackProfile packProfile = ResourcePackProfile.create(id.toString(), Text.of(id.getNamespace()+"/"+id.getPath()), alwaysEnabled, a -> pack, ResourceType.CLIENT_RESOURCES, ResourcePackProfile.InsertionPosition.TOP, ResourcePackSource.BUILTIN);
if (packProfile != null) {
profileAdder.accept(packProfile);
if (defaultEnabled && !alwaysEnabled) VisualOverhaulClientForge.defaultEnabledPacks.add(packProfile);
}
} catch (NullPointerException e) {e.printStackTrace();}
}));
}
}

View File

@@ -4,6 +4,7 @@ import dev.architectury.networking.NetworkManager;
import eu.midnightdust.lib.config.MidnightConfig;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.block.JukeboxTop;
import eu.midnightdust.visualoverhaul.mixin.JukeboxBlockEntityAccessor;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.block.entity.AbstractFurnaceBlockEntity;
@@ -84,7 +85,7 @@ public class VisualOverhaulClientForge {
ItemStack record = attachedData.readItemStack();
client.execute(() -> {
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof JukeboxBlockEntity blockEntity) {
blockEntity.setRecord(record);
((JukeboxBlockEntityAccessor)blockEntity).getInventory().set(0, record);
}
});
});

View File

@@ -46,7 +46,7 @@ public abstract class MixinJukeboxBlock extends BlockWithEntity {
Stream<ServerPlayerEntity> watchingPlayers = ((ServerChunkManager)world.getChunkManager()).threadedAnvilChunkStorage.getPlayersWatchingChunk(new ChunkPos(pos), false).stream();
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeBlockPos(pos);
passedData.writeItemStack(blockEntity.getRecord());
passedData.writeItemStack(blockEntity.getStack());
watchingPlayers.forEach(player -> NetworkManager.sendToPlayer(player, VisualOverhaul.UPDATE_RECORD, passedData));
JukeboxPacketUpdate.invUpdate = false;

View File

@@ -0,0 +1,13 @@
package eu.midnightdust.visualoverhaul.util.forge;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.forgespi.language.IModInfo;
import java.nio.file.Path;
public class ModIconUtilImpl {
public static Path getPath(String modid) {
IModInfo mod = ModList.get().getMods().stream().filter(modInfo -> modInfo.getModId().equals(modid)).findFirst().orElseThrow(() -> new RuntimeException("Cannot get ModContainer for Forge mod with id "));
return mod.getOwningFile().getFile().findResource(mod.getLogoFile().orElseThrow());
}
}

View File

@@ -1,20 +1,21 @@
org.gradle.jvmargs=-Xmx4096M
minecraft_version=1.19.2
minecraft_version=1.19.4
yarn_mappings=1.19.4+build.1
enabled_platforms=quilt,fabric,forge
archives_base_name=visualoverhaul
mod_version=5.0.0
maven_group=eu.midnightdust
architectury_version=6.2.43
midnightlib_version=1.0.0
architectury_version=8.1.75
midnightlib_version=1.3.0
phonos_version=0.3.0+1.19.2
fabric_loader_version=0.14.9
fabric_api_version=0.59.0+1.19.2
fabric_loader_version=0.14.18
fabric_api_version=0.76.0+1.19.4
forge_version=1.19.2-43.0.8
forge_version=1.19.4-45.0.24
quilt_loader_version=0.17.2-beta.3
quilt_fabric_api_version=4.0.0-beta.7+0.59.0-1.19.2
quilt_loader_version=0.18.6
quilt_fabric_api_version=6.0.0-beta.2+0.76.0-1.19.4

View File

@@ -8,7 +8,6 @@ repositories {
}
architectury {
injectInjectables = false
platformSetupLoomIde()
loader("quilt")
}
@@ -39,7 +38,7 @@ dependencies {
common(project(path: ":common", configuration: "namedElements")) { transitive false }
shadowCommon(project(path: ":common", configuration: "transformProductionQuilt")) { transitive false }
common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false }
//common(project(path: ":fabric-like", configuration: "namedElements")) { transitive false }
//shadowCommon(project(path: ":fabric-like", configuration: "transformProductionQuilt")) { transitive false }
}

View File

@@ -1,5 +1,6 @@
package eu.midnightdust.visualoverhaul.quilt;
import eu.midnightdust.visualoverhaul.IconicButtons;
import eu.midnightdust.visualoverhaul.VisualOverhaulClient;
import eu.midnightdust.visualoverhaul.block.JukeboxTop;
import eu.midnightdust.visualoverhaul.block.model.FurnaceWoodenPlanksModel;
@@ -7,7 +8,7 @@ import eu.midnightdust.visualoverhaul.block.renderer.BrewingStandBlockEntityRend
import eu.midnightdust.visualoverhaul.block.renderer.FurnaceBlockEntityRenderer;
import eu.midnightdust.visualoverhaul.block.renderer.JukeboxBlockEntityRenderer;
import eu.midnightdust.visualoverhaul.config.VOConfig;
import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry;
import eu.midnightdust.visualoverhaul.mixin.JukeboxBlockEntityAccessor;
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry;
import net.minecraft.block.Blocks;
@@ -18,15 +19,19 @@ import net.minecraft.block.entity.JukeboxBlockEntity;
import net.minecraft.client.color.world.BiomeColors;
import net.minecraft.client.item.ModelPredicateProviderRegistry;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.MusicDiscItem;
import net.minecraft.potion.PotionUtil;
import net.minecraft.potion.Potions;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.resource.ResourceManager;
import net.minecraft.resource.ResourceType;
import net.minecraft.util.Identifier;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
import org.quiltmc.loader.api.ModContainer;
import org.quiltmc.loader.api.QuiltLoader;
import org.quiltmc.qsl.base.api.entrypoint.client.ClientModInitializer;
@@ -35,6 +40,7 @@ import org.quiltmc.qsl.lifecycle.api.client.event.ClientTickEvents;
import org.quiltmc.qsl.networking.api.client.ClientPlayNetworking;
import org.quiltmc.qsl.resource.loader.api.ResourceLoader;
import org.quiltmc.qsl.resource.loader.api.ResourcePackActivationType;
import org.quiltmc.qsl.resource.loader.api.reloader.SimpleSynchronousResourceReloader;
import static eu.midnightdust.visualoverhaul.VisualOverhaul.*;
import static eu.midnightdust.visualoverhaul.VisualOverhaulClient.JukeBoxTop;
@@ -45,7 +51,7 @@ public class VisualOverhaulClientQuilt implements ClientModInitializer {
VisualOverhaulClient.onInitializeClient();
JukeBoxTop = new JukeboxTop();
// Block only registered on client, because it's just used for the renderer //
Registry.register(Registry.BLOCK, new Identifier(MOD_ID,"jukebox_top"), JukeBoxTop);
Registry.register(Registries.BLOCK, new Identifier(MOD_ID,"jukebox_top"), JukeBoxTop);
EntityModelLayerRegistry.registerModelLayer(FurnaceWoodenPlanksModel.WOODEN_PLANKS_MODEL_LAYER, FurnaceWoodenPlanksModel::getTexturedModelData);
@@ -55,18 +61,18 @@ public class VisualOverhaulClientQuilt implements ClientModInitializer {
BlockRenderLayerMap.put(RenderLayer.getCutout(), Blocks.SMOKER);
BlockRenderLayerMap.put(RenderLayer.getCutout(), Blocks.BLAST_FURNACE);
BlockEntityRendererRegistry.register(BlockEntityType.BREWING_STAND, BrewingStandBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(BlockEntityType.JUKEBOX, JukeboxBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(BlockEntityType.FURNACE, FurnaceBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(BlockEntityType.SMOKER, FurnaceBlockEntityRenderer::new);
BlockEntityRendererRegistry.register(BlockEntityType.BLAST_FURNACE, FurnaceBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.BREWING_STAND, BrewingStandBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.JUKEBOX, JukeboxBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.FURNACE, FurnaceBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.SMOKER, FurnaceBlockEntityRenderer::new);
BlockEntityRendererFactories.register(BlockEntityType.BLAST_FURNACE, FurnaceBlockEntityRenderer::new);
// Phonos Compat //
if (QuiltLoader.isModLoaded("phonos")) {
//PhonosCompatInit.init();
}
Registry.ITEM.forEach((item) -> {
Registries.ITEM.forEach((item) -> {
if(item instanceof MusicDiscItem || item.getName().getString().toLowerCase().contains("music_disc") || item.getName().getString().toLowerCase().contains("record") || item.getName().getString().toLowerCase().contains("dynamic_disc")) {
ModelPredicateProviderRegistry.register(item, new Identifier("round"), (stack, world, entity, seed) -> stack.getCount() == 2 ? 1.0F : 0.0F);
}
@@ -95,7 +101,7 @@ public class VisualOverhaulClientQuilt implements ClientModInitializer {
ItemStack record = attachedData.readItemStack();
client.execute(() -> {
if (client.world != null && client.world.getBlockEntity(pos) != null && client.world.getBlockEntity(pos) instanceof JukeboxBlockEntity blockEntity) {
blockEntity.setRecord(record);
((JukeboxBlockEntityAccessor)blockEntity).getInventory().set(0, record);
}
});
});
@@ -178,5 +184,17 @@ public class VisualOverhaulClientQuilt implements ClientModInitializer {
if (VOConfig.coloredLilypad) {
ColorProviderRegistry.BLOCK.register((state, world, pos, tintIndex) -> world != null ? world.getColor(pos, BiomeColors.FOLIAGE_COLOR) : 0, Blocks.LILY_PAD);
}
ResourceLoader.get(ResourceType.CLIENT_RESOURCES).registerReloader(new SimpleSynchronousResourceReloader() {
@Override
public Identifier getQuiltId() {
return new Identifier("iconic", "button_icons");
}
@Override
public void reload(ResourceManager manager) {
IconicButtons.reload(manager);
}
});
}
}

View File

@@ -45,7 +45,7 @@ public abstract class MixinJukeboxBlock extends BlockWithEntity {
Stream<ServerPlayerEntity> watchingPlayers = PlayerLookup.tracking(blockEntity).stream();
PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer());
passedData.writeBlockPos(pos);
passedData.writeItemStack(blockEntity.getRecord());
passedData.writeItemStack(blockEntity.getStack());
watchingPlayers.forEach(player -> ServerPlayNetworking.send(player, VisualOverhaul.UPDATE_RECORD, passedData));
JukeboxPacketUpdate.invUpdate = false;

View File

@@ -0,0 +1,13 @@
package eu.midnightdust.visualoverhaul.util.fabric;
import org.quiltmc.loader.api.ModContainer;
import org.quiltmc.loader.api.QuiltLoader;
import java.nio.file.Path;
public class ModIconUtilImpl {
public static Path getPath(String modid) {
ModContainer mod = QuiltLoader.getModContainer(modid).orElseThrow(() -> new RuntimeException("Cannot get ModContainer for Fabric mod with id "));
return mod.getPath(mod.metadata().icon(16));
}
}

View File

@@ -8,7 +8,6 @@ pluginManagement {
}
include("common")
include("fabric-like")
include("fabric")
include("quilt")
include("forge")