From ca79f213a5120f6e138c9485bc964ae8fea52daf Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 15 Dec 2025 01:51:08 +0300 Subject: [PATCH 1/3] Add weapon skin preview --- .../net/asodev/islandutils/modules/cosmetics/CosmeticState.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/asodev/islandutils/modules/cosmetics/CosmeticState.java b/src/main/java/net/asodev/islandutils/modules/cosmetics/CosmeticState.java index c402f484..f9cbd159 100644 --- a/src/main/java/net/asodev/islandutils/modules/cosmetics/CosmeticState.java +++ b/src/main/java/net/asodev/islandutils/modules/cosmetics/CosmeticState.java @@ -82,6 +82,7 @@ public static CosmeticType getType(ItemStack item) { if (path.endsWith(".icon_empty") || path.endsWith(".icon")) return null; if (path.contains("hat.") || path.contains("hair.")) return CosmeticType.HAT; if (path.contains("accessory.")) return CosmeticType.ACCESSORY; + if (path.contains("weapon_skins.")) return CosmeticType.MAIN_HAND; if (path.startsWith("island_lobby.fishing.rods")) return CosmeticType.MAIN_HAND; return null; } From 480020b72793776f8897a30f2809089c92d02379 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 15 Dec 2025 01:51:46 +0300 Subject: [PATCH 2/3] Fix cosmetic preview toggle and hide preview in games --- .../mixins/cosmetics/ChestScreenMixin.java | 17 +++++++++++++---- .../mixins/cosmetics/PreviewTutorialMixin.java | 4 +++- .../islandutils/mixins/cosmetics/UIMixin.java | 2 ++ .../java/net/asodev/islandutils/state/Game.java | 14 +++++++++----- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/asodev/islandutils/mixins/cosmetics/ChestScreenMixin.java b/src/main/java/net/asodev/islandutils/mixins/cosmetics/ChestScreenMixin.java index fc23347a..ff8198d3 100644 --- a/src/main/java/net/asodev/islandutils/mixins/cosmetics/ChestScreenMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/cosmetics/ChestScreenMixin.java @@ -6,6 +6,7 @@ import net.asodev.islandutils.modules.cosmetics.CosmeticState; import net.asodev.islandutils.modules.cosmetics.CosmeticType; import net.asodev.islandutils.options.IslandOptions; +import net.asodev.islandutils.state.Game; import net.asodev.islandutils.state.MccIslandState; import net.asodev.islandutils.util.IslandSoundEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; @@ -15,7 +16,6 @@ import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.renderer.RenderPipelines; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -35,6 +35,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.Objects; + import static net.asodev.islandutils.util.Utils.getCustomItemID; @@ -60,6 +62,7 @@ private void onInit(AbstractContainerMenu abstractContainerMenu, Inventory inven @Inject(method = "renderSlot", at = @At("TAIL")) private void renderSlot(GuiGraphics guiGraphics, Slot slot, CallbackInfo ci) { if (!MccIslandState.isOnline()) return; + if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; if (!slot.hasItem()) return; boolean shouldRender = false; @@ -99,6 +102,7 @@ private void render(GuiGraphics guiGraphics, int i, int j, float f, CallbackInfo CosmeticState.hoveredColor = null; } + @Unique private CosmeticType setHovered(ItemStack item) { CosmeticType type = CosmeticState.getType(item); if (type == null) return null; @@ -111,6 +115,7 @@ private CosmeticType setHovered(ItemStack item) { @Inject(method = "mouseDragged", at = @At("HEAD")) private void mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY, CallbackInfoReturnable cir) { if (!MccIslandState.isOnline()) return; + if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; CosmeticState.yRot = CosmeticState.yRot - Double.valueOf(deltaX).floatValue(); CosmeticState.xRot = CosmeticState.xRot - Double.valueOf(deltaY).floatValue(); @@ -128,6 +133,7 @@ private void mouseReleased(double d, double e, int keyCode, CallbackInfoReturnab @Inject(method = "slotClicked", at = @At("HEAD")) private void slotClicked(Slot slot, int i, int j, ClickType clickType, CallbackInfo ci) { if (!MccIslandState.isOnline()) return; + if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; if (slot == null || !slot.hasItem()) return; ItemStack stack = slot.getItem(); if (CosmeticState.canBeEquipped(stack)) { @@ -140,10 +146,12 @@ private void slotClicked(Slot slot, int i, int j, ClickType clickType, CallbackI } } + @Unique private void triggerPreviewClicked(int keyCode) { if (!MccIslandState.isOnline()) return; if (!IslandOptions.getCosmetics().isShowPlayerPreview()) return; if (hoveredSlot == null || !hoveredSlot.hasItem()) return; + if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; InputConstants.Key previewBind = KeyBindingHelper.getBoundKeyOf(minecraft.options.keyPickItem); if (keyCode == previewBind.getValue()) { ItemStack item = hoveredSlot.getItem(); @@ -164,10 +172,11 @@ private void setPreview(ItemStack item) { @Unique private void setOrNotSet(Cosmetic cosmetic, ResourceLocation itemCMD) { - if (cosmetic.preview == null || itemCMD != getCustomItemID(cosmetic.preview.item)) - cosmetic.preview = new CosmeticSlot(hoveredSlot); - else + if (cosmetic.preview != null && Objects.equals(getCustomItemID(cosmetic.preview.item), itemCMD)) { cosmetic.preview = null; + } else { + cosmetic.preview = new CosmeticSlot(hoveredSlot); + } this.minecraft.getSoundManager().play(SimpleSoundInstance.forUI(IslandSoundEvents.UI_CLICK_NORMAL, 1f, 1f)); } diff --git a/src/main/java/net/asodev/islandutils/mixins/cosmetics/PreviewTutorialMixin.java b/src/main/java/net/asodev/islandutils/mixins/cosmetics/PreviewTutorialMixin.java index 791db14e..2c9d8a93 100644 --- a/src/main/java/net/asodev/islandutils/mixins/cosmetics/PreviewTutorialMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/cosmetics/PreviewTutorialMixin.java @@ -1,8 +1,9 @@ package net.asodev.islandutils.mixins.cosmetics; -import com.llamalad7.mixinextras.sugar.Local; import net.asodev.islandutils.modules.cosmetics.CosmeticState; import net.asodev.islandutils.options.IslandOptions; +import net.asodev.islandutils.state.Game; +import net.asodev.islandutils.state.MccIslandState; import net.asodev.islandutils.util.ChatUtils; import net.asodev.islandutils.util.FontUtils; import net.minecraft.ChatFormatting; @@ -49,6 +50,7 @@ public class PreviewTutorialMixin { private void injectedTooltipLines(Item.TooltipContext tooltipContext, TooltipDisplay tooltipDisplay, @Nullable Player player, TooltipFlag tooltipFlag, Consumer consumer, CallbackInfo ci) { if (CosmeticState.getType((ItemStack) (Object) this) == null) return; if (!IslandOptions.getCosmetics().isShowPlayerPreview()) return; + if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; consumer.accept(previewComponent); } diff --git a/src/main/java/net/asodev/islandutils/mixins/cosmetics/UIMixin.java b/src/main/java/net/asodev/islandutils/mixins/cosmetics/UIMixin.java index c699f738..1d2fe468 100644 --- a/src/main/java/net/asodev/islandutils/mixins/cosmetics/UIMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/cosmetics/UIMixin.java @@ -6,6 +6,7 @@ import net.asodev.islandutils.modules.cosmetics.CosmeticUI; import net.asodev.islandutils.options.IslandOptions; import net.asodev.islandutils.options.categories.CosmeticsOptions; +import net.asodev.islandutils.state.Game; import net.asodev.islandutils.state.MccIslandState; import net.asodev.islandutils.util.FontUtils; import net.minecraft.client.Minecraft; @@ -34,6 +35,7 @@ public UIMixin(ChestMenu abstractContainerMenu, Inventory inventory, Component c @Inject(method = "renderBg", at = @At("TAIL")) public void renderBg(GuiGraphics guiGraphics, float f, int i, int j, CallbackInfo ci) { if (!MccIslandState.isOnline()) return; + if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; CosmeticsOptions options = IslandOptions.getCosmetics(); if (!options.isShowPlayerPreview()) return; diff --git a/src/main/java/net/asodev/islandutils/state/Game.java b/src/main/java/net/asodev/islandutils/state/Game.java index 74ee8585..45713661 100644 --- a/src/main/java/net/asodev/islandutils/state/Game.java +++ b/src/main/java/net/asodev/islandutils/state/Game.java @@ -1,7 +1,6 @@ package net.asodev.islandutils.state; import com.noxcrew.noxesium.network.clientbound.ClientboundMccServerPacket; -import net.asodev.islandutils.discord.FishingPresenceUpdator; import net.minecraft.resources.ResourceLocation; import java.util.NoSuchElementException; @@ -57,11 +56,16 @@ public static ResourceLocation getMusicLocation(String name) { } public static Game fromPacket(ClientboundMccServerPacket packet) throws NoSuchElementException { - if (packet.serverType().equals("lobby")) { - for (String temperature : FishingPresenceUpdator.temperatures) { - if (packet.subType().startsWith(temperature + "_")) return FISHING; + switch (packet.serverType()) { + case "fishing" -> { + return FISHING; + } + case "dojo" -> { + return PARKOUR_WARRIOR_DOJO; + } + case "lobby" -> { + return HUB; } - return HUB; } for (Game game : values()) { From 1526ce13a5d57a8da436009a944a1f18792f45c8 Mon Sep 17 00:00:00 2001 From: Aso <53526710+AsoDesu@users.noreply.github.com> Date: Fri, 19 Dec 2025 18:36:12 +0000 Subject: [PATCH 3/3] feat: add option for disabling cosmetics in game and refactor a few things --- .../mixins/cosmetics/ChestScreenMixin.java | 13 +++++-------- .../mixins/cosmetics/PreviewTutorialMixin.java | 3 +-- .../islandutils/mixins/cosmetics/UIMixin.java | 4 +--- .../modules/cosmetics/CosmeticState.java | 11 +++++++++++ .../options/categories/CosmeticsOptions.java | 11 +++++++++++ .../java/net/asodev/islandutils/state/Game.java | 3 +++ src/main/resources/assets/island/lang/en_us.json | 1 + 7 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/asodev/islandutils/mixins/cosmetics/ChestScreenMixin.java b/src/main/java/net/asodev/islandutils/mixins/cosmetics/ChestScreenMixin.java index ff8198d3..f2076f79 100644 --- a/src/main/java/net/asodev/islandutils/mixins/cosmetics/ChestScreenMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/cosmetics/ChestScreenMixin.java @@ -61,8 +61,7 @@ private void onInit(AbstractContainerMenu abstractContainerMenu, Inventory inven @Inject(method = "renderSlot", at = @At("TAIL")) private void renderSlot(GuiGraphics guiGraphics, Slot slot, CallbackInfo ci) { - if (!MccIslandState.isOnline()) return; - if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; + if (!CosmeticState.shouldShowCosmeticPreview()) return; if (!slot.hasItem()) return; boolean shouldRender = false; @@ -114,8 +113,7 @@ private CosmeticType setHovered(ItemStack item) { @Inject(method = "mouseDragged", at = @At("HEAD")) private void mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY, CallbackInfoReturnable cir) { - if (!MccIslandState.isOnline()) return; - if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; + if (!CosmeticState.shouldShowCosmeticPreview()) return; CosmeticState.yRot = CosmeticState.yRot - Double.valueOf(deltaX).floatValue(); CosmeticState.xRot = CosmeticState.xRot - Double.valueOf(deltaY).floatValue(); @@ -133,7 +131,8 @@ private void mouseReleased(double d, double e, int keyCode, CallbackInfoReturnab @Inject(method = "slotClicked", at = @At("HEAD")) private void slotClicked(Slot slot, int i, int j, ClickType clickType, CallbackInfo ci) { if (!MccIslandState.isOnline()) return; - if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; + if (!MccIslandState.getGame().isHubGame()) return; + if (slot == null || !slot.hasItem()) return; ItemStack stack = slot.getItem(); if (CosmeticState.canBeEquipped(stack)) { @@ -148,10 +147,8 @@ private void slotClicked(Slot slot, int i, int j, ClickType clickType, CallbackI @Unique private void triggerPreviewClicked(int keyCode) { - if (!MccIslandState.isOnline()) return; - if (!IslandOptions.getCosmetics().isShowPlayerPreview()) return; + if (!CosmeticState.shouldShowCosmeticPreview()) return; if (hoveredSlot == null || !hoveredSlot.hasItem()) return; - if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; InputConstants.Key previewBind = KeyBindingHelper.getBoundKeyOf(minecraft.options.keyPickItem); if (keyCode == previewBind.getValue()) { ItemStack item = hoveredSlot.getItem(); diff --git a/src/main/java/net/asodev/islandutils/mixins/cosmetics/PreviewTutorialMixin.java b/src/main/java/net/asodev/islandutils/mixins/cosmetics/PreviewTutorialMixin.java index 2c9d8a93..dec6e2f7 100644 --- a/src/main/java/net/asodev/islandutils/mixins/cosmetics/PreviewTutorialMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/cosmetics/PreviewTutorialMixin.java @@ -48,9 +48,8 @@ public class PreviewTutorialMixin { ) ) private void injectedTooltipLines(Item.TooltipContext tooltipContext, TooltipDisplay tooltipDisplay, @Nullable Player player, TooltipFlag tooltipFlag, Consumer consumer, CallbackInfo ci) { + if (!CosmeticState.shouldShowCosmeticPreview()) return; if (CosmeticState.getType((ItemStack) (Object) this) == null) return; - if (!IslandOptions.getCosmetics().isShowPlayerPreview()) return; - if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; consumer.accept(previewComponent); } diff --git a/src/main/java/net/asodev/islandutils/mixins/cosmetics/UIMixin.java b/src/main/java/net/asodev/islandutils/mixins/cosmetics/UIMixin.java index 1d2fe468..9895e48d 100644 --- a/src/main/java/net/asodev/islandutils/mixins/cosmetics/UIMixin.java +++ b/src/main/java/net/asodev/islandutils/mixins/cosmetics/UIMixin.java @@ -34,11 +34,9 @@ public UIMixin(ChestMenu abstractContainerMenu, Inventory inventory, Component c @Inject(method = "renderBg", at = @At("TAIL")) public void renderBg(GuiGraphics guiGraphics, float f, int i, int j, CallbackInfo ci) { - if (!MccIslandState.isOnline()) return; - if (MccIslandState.getGame() != Game.HUB && MccIslandState.getGame() != Game.FISHING) return; + if (!CosmeticState.shouldShowCosmeticPreview()) return; CosmeticsOptions options = IslandOptions.getCosmetics(); - if (!options.isShowPlayerPreview()) return; boolean isCosmeticMenu = false; if (options.isShowOnOnlyCosmeticMenus() && !(isCosmeticMenu = CosmeticState.isCosmeticMenu(this))) return; diff --git a/src/main/java/net/asodev/islandutils/modules/cosmetics/CosmeticState.java b/src/main/java/net/asodev/islandutils/modules/cosmetics/CosmeticState.java index f9cbd159..50d65aa7 100644 --- a/src/main/java/net/asodev/islandutils/modules/cosmetics/CosmeticState.java +++ b/src/main/java/net/asodev/islandutils/modules/cosmetics/CosmeticState.java @@ -1,5 +1,7 @@ package net.asodev.islandutils.modules.cosmetics; +import net.asodev.islandutils.options.IslandOptions; +import net.asodev.islandutils.state.MccIslandState; import net.asodev.islandutils.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -100,6 +102,15 @@ public static boolean isCosmeticMenu(AbstractContainerScreen screen) return false; } + public static boolean shouldShowCosmeticPreview() { + // don't show if we're not on mcci + if (!MccIslandState.isOnline()) return false; + // don't show if we have them disabled + if (!IslandOptions.getCosmetics().isShowPlayerPreview()) return false; + // if we have chosen to NOT show in games and we are in a game, disable. otherwise show! + return IslandOptions.getCosmetics().isShowInGames() || MccIslandState.getGame().isHubGame(); + } + public static boolean itemsMatch(ItemStack item, ItemStack compare) { ItemStack item1 = item != null ? item : ItemStack.EMPTY; ItemStack item2 = compare != null ? compare : ItemStack.EMPTY; diff --git a/src/main/java/net/asodev/islandutils/options/categories/CosmeticsOptions.java b/src/main/java/net/asodev/islandutils/options/categories/CosmeticsOptions.java index ecff30e9..a1fcaf1a 100644 --- a/src/main/java/net/asodev/islandutils/options/categories/CosmeticsOptions.java +++ b/src/main/java/net/asodev/islandutils/options/categories/CosmeticsOptions.java @@ -13,6 +13,7 @@ public class CosmeticsOptions implements OptionsCategory { boolean showPlayerPreview = true; boolean showOnHover = true; boolean showOnOnlyCosmeticMenus = true; + boolean showInGames = true; public boolean isShowPlayerPreview() { return showPlayerPreview; @@ -26,6 +27,10 @@ public boolean isShowOnOnlyCosmeticMenus() { return showOnOnlyCosmeticMenus; } + public boolean isShowInGames() { + return showInGames; + } + @Override public ConfigCategory getCategory() { Option showPreviewOption = Option.createBuilder() @@ -43,11 +48,17 @@ public ConfigCategory getCategory() { .controller(TickBoxControllerBuilder::create) .binding(defaults.showOnOnlyCosmeticMenus, () -> showOnOnlyCosmeticMenus, value -> this.showOnOnlyCosmeticMenus = value) .build(); + Option showInGamesOption = Option.createBuilder() + .name(Component.translatable("text.autoconfig.islandutils.option.showInGames")) + .controller(TickBoxControllerBuilder::create) + .binding(defaults.showInGames, () -> showInGames, value -> this.showInGames = value) + .build(); return ConfigCategory.createBuilder() .name(Component.translatable("text.autoconfig.islandutils.category.cosmetics")) .option(showPreviewOption) .option(showHoverOption) .option(showInOnlyCosmeticMenu) + .option(showInGamesOption) .build(); } } diff --git a/src/main/java/net/asodev/islandutils/state/Game.java b/src/main/java/net/asodev/islandutils/state/Game.java index 45713661..e7f44872 100644 --- a/src/main/java/net/asodev/islandutils/state/Game.java +++ b/src/main/java/net/asodev/islandutils/state/Game.java @@ -50,6 +50,9 @@ public ResourceLocation getMusicLocation() { public boolean hasTeamChat() { return hasTeamChat; } + public boolean isHubGame() { + return this == FISHING || this == HUB; + } public static ResourceLocation getMusicLocation(String name) { return ResourceLocation.fromNamespaceAndPath("island", "island.music." + name); diff --git a/src/main/resources/assets/island/lang/en_us.json b/src/main/resources/assets/island/lang/en_us.json index 8d533ad0..787772d8 100644 --- a/src/main/resources/assets/island/lang/en_us.json +++ b/src/main/resources/assets/island/lang/en_us.json @@ -24,6 +24,7 @@ "text.autoconfig.islandutils.option.showPlayerPreview": "Show Cosmetic Previews", "text.autoconfig.islandutils.option.showOnHover": "Preview cosmetics on hover", "text.autoconfig.islandutils.option.showOnOnlyCosmeticMenus": "Show cosmetic preview only in Cosmetic Menus", + "text.autoconfig.islandutils.option.showInGames": "Show cosmetic preview in games", "text.autoconfig.islandutils.category.discord": "Discord Presence", "text.autoconfig.islandutils.group.presenceDisplayOptions": "Presence Display Options",