A mod that adds your armor to the hud modrinth.com/mod/simple-armor-hud
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch: cerus/feat/trinkets

Implement Trinkets integration

authored by

Legoraft and committed by
GitHub
82e1a025 62a77ae8

+182 -9
+10 -1
build.gradle
··· 17 17 // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. 18 18 // See https://docs.gradle.org/current/userguide/declaring_repositories.html 19 19 // for more information about repositories. 20 - maven { url = "https://maven.terraformersmc.com/" } 21 20 // maven { url = "https://maven.gegy.dev" } 21 + maven { 22 + name = "TerraformersMC" 23 + url = "https://maven.terraformersmc.com/" 24 + } 25 + maven { 26 + name = "Ladysnake Libs" 27 + url = 'https://maven.ladysnake.org/releases' 28 + } 22 29 } 23 30 24 31 loom { ··· 48 55 // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time. 49 56 50 57 // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}" 58 + 59 + modImplementation "dev.emi:trinkets:${project.trinkets_version}" 51 60 } 52 61 53 62 processResources {
+1
gradle.properties
··· 16 16 # Dependency properties 17 17 fabric_version=0.100.3+1.21 18 18 modmenu_version=11.0.1 19 + trinkets_version=3.7.1
+14
src/client/java/com/armorhud/armor/ArmorAccessor.java
··· 1 + package com.armorhud.armor; 2 + 3 + import net.minecraft.client.network.ClientPlayerEntity; 4 + import net.minecraft.item.ItemStack; 5 + 6 + public interface ArmorAccessor { 7 + 8 + default void initialize(ClientPlayerEntity player) { 9 + } 10 + 11 + ItemStack getArmorPiece(ClientPlayerEntity player, int slotIndex); 12 + 13 + int getPieces(ClientPlayerEntity player); 14 + }
+90
src/client/java/com/armorhud/armor/TrinketsArmorAccessor.java
··· 1 + package com.armorhud.armor; 2 + 3 + import dev.emi.trinkets.api.SlotReference; 4 + import dev.emi.trinkets.api.TrinketComponent; 5 + import dev.emi.trinkets.api.TrinketsApi; 6 + import java.util.ArrayList; 7 + import java.util.HashMap; 8 + import java.util.List; 9 + import java.util.Map; 10 + import java.util.Optional; 11 + import java.util.function.Function; 12 + import net.minecraft.client.network.ClientPlayerEntity; 13 + import net.minecraft.item.ItemStack; 14 + import net.minecraft.util.Pair; 15 + 16 + public class TrinketsArmorAccessor implements ArmorAccessor { 17 + 18 + private final ArmorAccessor fallback; 19 + private final List<SlotFunction> slotFunctions; 20 + private int pieces; 21 + 22 + public TrinketsArmorAccessor(ArmorAccessor fallback) { 23 + this.fallback = fallback; 24 + this.slotFunctions = new ArrayList<>(); 25 + } 26 + 27 + @Override 28 + public void initialize(ClientPlayerEntity player) { 29 + slotFunctions.clear(); 30 + 31 + // Populate functions with fallback entries first 32 + pieces = fallback.getPieces(player); 33 + for (int i = 0; i < pieces; i++) { 34 + int slot = i; 35 + slotFunctions.add(entity -> fallback.getArmorPiece(entity, slot)); 36 + } 37 + 38 + Optional<TrinketComponent> componentOpt = TrinketsApi.getTrinketComponent(player); 39 + if (componentOpt.isEmpty()) { 40 + return; 41 + } 42 + 43 + TrinketComponent component = componentOpt.get(); 44 + List<Pair<SlotReference, ItemStack>> equipped = component.getEquipped($ -> true); 45 + Map<Integer, Integer> offsetMap = new HashMap<>(); 46 + 47 + // Populate functions with additional trinkets slots 48 + for (int i = 0; i < equipped.size(); i++) { 49 + Pair<SlotReference, ItemStack> pair = equipped.get(i); 50 + int groupSlotIdx = groupToSlot(pair.getLeft().inventory().getSlotType().getGroup()); 51 + int offset = offsetMap.compute(groupSlotIdx, (k, v) -> v == null ? 1 : v + 1); 52 + int slot = i; 53 + slotFunctions.add(groupSlotIdx + offset, entity -> getTrinketsItem(entity, slot)); 54 + } 55 + pieces += equipped.size(); 56 + } 57 + 58 + private ItemStack getTrinketsItem(ClientPlayerEntity player, int idx) { 59 + Optional<TrinketComponent> componentOpt = TrinketsApi.getTrinketComponent(player); 60 + if (componentOpt.isEmpty()) { 61 + return ItemStack.EMPTY; 62 + } 63 + TrinketComponent component = componentOpt.get(); 64 + Pair<SlotReference, ItemStack> pair = component.getEquipped($ -> true).get(idx); 65 + return pair.getRight(); 66 + } 67 + 68 + @Override 69 + public ItemStack getArmorPiece(ClientPlayerEntity player, int slotIndex) { 70 + return slotFunctions.get(slotIndex).apply(player); 71 + } 72 + 73 + @Override 74 + public int getPieces(ClientPlayerEntity player) { 75 + return pieces; 76 + } 77 + 78 + private int groupToSlot(String group) { 79 + return switch (group) { 80 + case "feet" -> 0; 81 + case "legs" -> 1; 82 + case "chest" -> 2; 83 + case "head" -> 3; 84 + default -> -1; 85 + }; 86 + } 87 + 88 + private interface SlotFunction extends Function<ClientPlayerEntity, ItemStack> { 89 + } 90 + }
+20
src/client/java/com/armorhud/armor/VanillaArmorAccessor.java
··· 1 + package com.armorhud.armor; 2 + 3 + import net.minecraft.client.network.ClientPlayerEntity; 4 + import net.minecraft.item.ItemStack; 5 + 6 + public class VanillaArmorAccessor implements ArmorAccessor { 7 + 8 + @Override 9 + public ItemStack getArmorPiece(ClientPlayerEntity player, int slotIndex) { 10 + if (slotIndex < 0 || slotIndex >= getPieces(player)) { 11 + throw new IllegalArgumentException("Invalid slot index: " + slotIndex); 12 + } 13 + return player.getInventory().getArmorStack(slotIndex); 14 + } 15 + 16 + @Override 17 + public int getPieces(ClientPlayerEntity player) { 18 + return player.getInventory().armor.size(); 19 + } 20 + }
+20 -1
src/client/java/com/armorhud/armorHud.java
··· 1 1 package com.armorhud; 2 2 3 + import com.armorhud.armor.ArmorAccessor; 4 + import com.armorhud.armor.TrinketsArmorAccessor; 5 + import com.armorhud.armor.VanillaArmorAccessor; 3 6 import com.armorhud.config.config; 4 7 import com.armorhud.util.armorHudRegistries; 5 8 import net.fabricmc.api.ClientModInitializer; 6 9 import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; 10 + import net.fabricmc.loader.api.FabricLoader; 11 + import org.slf4j.Logger; 12 + import org.slf4j.LoggerFactory; 7 13 8 14 public class armorHud implements ClientModInitializer { 9 15 16 + public static final Logger LOGGER = LoggerFactory.getLogger("simple-armor-hud"); 10 17 public static final config CONFIG = new config(); 18 + private static ArmorAccessor armorAccessor; 11 19 12 20 @Override 13 21 public void onInitializeClient() { 14 - System.out.println("Simple Armor Hud loaded!"); 22 + LOGGER.info("Simple Armor Hud loaded!"); 23 + armorAccessor = new VanillaArmorAccessor(); 15 24 CONFIG.load(); 16 25 armorHudRegistries.registerArmorHud(); 17 26 handleKeys(); 27 + 28 + LOGGER.info("Armor accessor implementation: {}", armorAccessor.getClass().getSimpleName()); 18 29 } 19 30 20 31 public void handleKeys() { ··· 23 34 config.ARMOR_HUD = !config.ARMOR_HUD; 24 35 } 25 36 }); 37 + } 38 + 39 + public static void setArmorAccessor(ArmorAccessor armorAccessor) { 40 + armorHud.armorAccessor = armorAccessor; 41 + } 42 + 43 + public static ArmorAccessor getArmorAccessor() { 44 + return armorAccessor; 26 45 } 27 46 }
+15 -4
src/client/java/com/armorhud/mixin/client/armorHudMixin.java
··· 1 1 package com.armorhud.mixin.client; 2 2 3 + import com.armorhud.armor.ArmorAccessor; 4 + import com.armorhud.armorHud; 3 5 import com.armorhud.config.config; 4 6 import net.minecraft.client.MinecraftClient; 5 7 import net.minecraft.client.gui.DrawContext; ··· 26 28 @Shadow public abstract void tick(boolean paused); 27 29 28 30 @Unique int armorHeight; 31 + @Unique boolean initialized; 29 32 30 33 @Inject(at = @At("TAIL"), method = "renderHotbar") 31 34 private void renderHud(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { ··· 33 36 34 37 assert client.player != null; 35 38 39 + if (!initialized) { 40 + armorHud.getArmorAccessor().initialize(client.player); 41 + initialized = true; 42 + } 43 + 36 44 renderArmor(context, tickCounter); 37 45 moveArmor(context); 38 46 } ··· 43 51 44 52 assert client.player != null; 45 53 54 + ArmorAccessor armorAccessor = armorHud.getArmorAccessor(); 55 + int pieces = armorAccessor.getPieces(client.player); 56 + 46 57 final int hungerWidth = 80 + 8; // Bar advances 8 pixels to the left 10 times, 8 is added for the width of the last sprite. 47 58 final int armorWidth = 15; 48 - final int barWidth = armorWidth * 4; 59 + final int barWidth = armorWidth * pieces; 49 60 float hungerX = scaledWidth / 2f + 91; 50 61 float x = hungerX - hungerWidth / 2f + barWidth / 2f; 51 62 x += 2; // This makes it look better because the helmet is thinner. 52 63 53 - for (int j = 0; j < 4; j++) { 64 + for (int j = 0; j < pieces; j++) { 54 65 x -= armorWidth; 55 66 int armorPiece; 56 67 57 68 if (config.RTL) { 58 - armorPiece = 3 - j; 69 + armorPiece = (pieces - 1) - j; 59 70 } else { 60 71 armorPiece = j; 61 72 } 62 73 63 - renderArmorPiece(context, x, armorHeight, tickCounter, client.player, client.player.getInventory().getArmorStack(armorPiece)); 74 + renderArmorPiece(context, x, armorHeight, tickCounter, client.player, armorAccessor.getArmorPiece(client.player, armorPiece)); 64 75 } 65 76 } 66 77
+8 -2
src/client/java/com/armorhud/util/modDetect.java
··· 1 1 package com.armorhud.util; 2 2 3 + import com.armorhud.armor.TrinketsArmorAccessor; 4 + import com.armorhud.armorHud; 3 5 import com.armorhud.config.config; 4 6 import net.fabricmc.loader.api.FabricLoader; 5 7 ··· 8 10 public static void detect() { 9 11 if (FabricLoader.getInstance().isModLoaded("bettermounthud")) { 10 12 config.BETTER_MOUNT_HUD = true; 11 - System.out.println("Better mount hud found!"); 13 + armorHud.LOGGER.info("Better mount hud found!"); 12 14 } 13 15 if (FabricLoader.getInstance().isModLoaded("double_hotbar")) { 14 16 config.DOUBLE_HOTBAR = true; 15 - System.out.println("Double hotbar found!"); 17 + armorHud.LOGGER.info("Double hotbar found!"); 18 + } 19 + if (FabricLoader.getInstance().isModLoaded("trinkets")) { 20 + armorHud.setArmorAccessor(new TrinketsArmorAccessor(armorHud.getArmorAccessor())); 21 + armorHud.LOGGER.info("Trinkets found!"); 16 22 } 17 23 18 24 config.save();
+4 -1
src/main/resources/fabric.mod.json
··· 32 32 "fabricloader": ">=0.14.19", 33 33 "minecraft": ">=1.19", 34 34 "java": ">=17" 35 - } 35 + }, 36 + "suggests": { 37 + "trinkets": ">=3.7.1" 38 + } 36 39 }