From a86b5d51096ad532476525b507ec3ae91545003a Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Tue, 25 Jun 2024 15:04:59 -0500 Subject: [PATCH 01/12] Fix build script, fix shulker boxes Now correct sound, rotation fixed --- build.gradle | 2 +- gradle.properties | 4 +-- .../block/NetheritePlusBlocks.java | 36 +++++++++---------- ...etheriteShulkerBoxBlockEntityRenderer.java | 5 +-- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/build.gradle b/build.gradle index 7bc3b4b..ccf6c9a 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,7 @@ dependencies { modImplementation "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${project.qfapi_version}" modImplementation "com.oroarmor:multi-item-lib:1.6.2" - modCompileOnly('com.github.CrimsonDawn45:Fabric-Shield-Lib:main-SNAPSHOT') + modCompileOnly("com.github.CrimsonDawn45:Fabric-Shield-Lib:1.7.2-1.20.2") modRuntimeOnly("com.terraformersmc:modmenu:7.2.1") } diff --git a/gradle.properties b/gradle.properties index 35dc50b..ee31862 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx2G # Quilt Properties minecraft_version=1.20.1 -quilt_loader_version=0.20.2 +quilt_loader_version=0.26.1-beta.1 # Mod Properties mod_version=2.2.0 @@ -14,5 +14,5 @@ discord_hook_image_url=https://raw.githubusercontent.com/OroArmorModding/Netheri # Dependencies qsl_version=6.1.1+1.20.1 -qfapi_version=7.2.1+0.88.0-1.20.1 +qfapi_version=7.5.0+0.92.2-1.20.1 mappings=1.20.1+build.23 diff --git a/src/main/java/com/oroarmor/netherite_plus/block/NetheritePlusBlocks.java b/src/main/java/com/oroarmor/netherite_plus/block/NetheritePlusBlocks.java index 8c70659..e50ef09 100644 --- a/src/main/java/com/oroarmor/netherite_plus/block/NetheritePlusBlocks.java +++ b/src/main/java/com/oroarmor/netherite_plus/block/NetheritePlusBlocks.java @@ -96,23 +96,23 @@ private static Block register(String id, Block block) { } private static void registerShulkerBoxBlocks() { - NETHERITE_SHULKER_BOX = register("netherite_shulker_box", createShulkerBoxBlock(null, AbstractBlock.Settings.create().mapColor(MapColor.GRAY))); - NETHERITE_WHITE_SHULKER_BOX = register("netherite_white_shulker_box", createShulkerBoxBlock(DyeColor.WHITE, AbstractBlock.Settings.create().mapColor(MapColor.SNOW))); - NETHERITE_ORANGE_SHULKER_BOX = register("netherite_orange_shulker_box", createShulkerBoxBlock(DyeColor.ORANGE, AbstractBlock.Settings.create().mapColor(MapColor.ORANGE))); - NETHERITE_MAGENTA_SHULKER_BOX = register("netherite_magenta_shulker_box", createShulkerBoxBlock(DyeColor.MAGENTA, AbstractBlock.Settings.create().mapColor(MapColor.MAGENTA))); - NETHERITE_LIGHT_BLUE_SHULKER_BOX = register("netherite_light_blue_shulker_box", createShulkerBoxBlock(DyeColor.LIGHT_BLUE, AbstractBlock.Settings.create().mapColor(MapColor.LIGHT_BLUE))); - NETHERITE_YELLOW_SHULKER_BOX = register("netherite_yellow_shulker_box", createShulkerBoxBlock(DyeColor.YELLOW, AbstractBlock.Settings.create().mapColor(MapColor.YELLOW))); - NETHERITE_LIME_SHULKER_BOX = register("netherite_lime_shulker_box", createShulkerBoxBlock(DyeColor.LIME, AbstractBlock.Settings.create().mapColor(MapColor.LIME))); - NETHERITE_PINK_SHULKER_BOX = register("netherite_pink_shulker_box", createShulkerBoxBlock(DyeColor.PINK, AbstractBlock.Settings.create().mapColor(MapColor.PINK))); - NETHERITE_GRAY_SHULKER_BOX = register("netherite_gray_shulker_box", createShulkerBoxBlock(DyeColor.GRAY, AbstractBlock.Settings.create().mapColor(MapColor.GRAY))); - NETHERITE_LIGHT_GRAY_SHULKER_BOX = register("netherite_light_gray_shulker_box", createShulkerBoxBlock(DyeColor.LIGHT_GRAY, AbstractBlock.Settings.create().mapColor(MapColor.LIGHT_GRAY))); - NETHERITE_CYAN_SHULKER_BOX = register("netherite_cyan_shulker_box", createShulkerBoxBlock(DyeColor.CYAN, AbstractBlock.Settings.create().mapColor(MapColor.CYAN))); - NETHERITE_PURPLE_SHULKER_BOX = register("netherite_purple_shulker_box", createShulkerBoxBlock(DyeColor.PURPLE, AbstractBlock.Settings.create().mapColor(MapColor.PURPLE))); - NETHERITE_BLUE_SHULKER_BOX = register("netherite_blue_shulker_box", createShulkerBoxBlock(DyeColor.BLUE, AbstractBlock.Settings.create().mapColor(MapColor.BLUE))); - NETHERITE_BROWN_SHULKER_BOX = register("netherite_brown_shulker_box", createShulkerBoxBlock(DyeColor.BROWN, AbstractBlock.Settings.create().mapColor(MapColor.BROWN))); - NETHERITE_GREEN_SHULKER_BOX = register("netherite_green_shulker_box", createShulkerBoxBlock(DyeColor.GREEN, AbstractBlock.Settings.create().mapColor(MapColor.GREEN))); - NETHERITE_RED_SHULKER_BOX = register("netherite_red_shulker_box", createShulkerBoxBlock(DyeColor.RED, AbstractBlock.Settings.create().mapColor(MapColor.RED))); - NETHERITE_BLACK_SHULKER_BOX = register("netherite_black_shulker_box", createShulkerBoxBlock(DyeColor.BLACK, AbstractBlock.Settings.create().mapColor(MapColor.BLACK))); + NETHERITE_SHULKER_BOX = register("netherite_shulker_box", createShulkerBoxBlock(null, AbstractBlock.Settings.create().mapColor(MapColor.GRAY).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_WHITE_SHULKER_BOX = register("netherite_white_shulker_box", createShulkerBoxBlock(DyeColor.WHITE, AbstractBlock.Settings.create().mapColor(MapColor.SNOW).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_ORANGE_SHULKER_BOX = register("netherite_orange_shulker_box", createShulkerBoxBlock(DyeColor.ORANGE, AbstractBlock.Settings.create().mapColor(MapColor.ORANGE).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_MAGENTA_SHULKER_BOX = register("netherite_magenta_shulker_box", createShulkerBoxBlock(DyeColor.MAGENTA, AbstractBlock.Settings.create().mapColor(MapColor.MAGENTA).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_LIGHT_BLUE_SHULKER_BOX = register("netherite_light_blue_shulker_box", createShulkerBoxBlock(DyeColor.LIGHT_BLUE, AbstractBlock.Settings.create().mapColor(MapColor.LIGHT_BLUE).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_YELLOW_SHULKER_BOX = register("netherite_yellow_shulker_box", createShulkerBoxBlock(DyeColor.YELLOW, AbstractBlock.Settings.create().mapColor(MapColor.YELLOW).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_LIME_SHULKER_BOX = register("netherite_lime_shulker_box", createShulkerBoxBlock(DyeColor.LIME, AbstractBlock.Settings.create().mapColor(MapColor.LIME).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_PINK_SHULKER_BOX = register("netherite_pink_shulker_box", createShulkerBoxBlock(DyeColor.PINK, AbstractBlock.Settings.create().mapColor(MapColor.PINK).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_GRAY_SHULKER_BOX = register("netherite_gray_shulker_box", createShulkerBoxBlock(DyeColor.GRAY, AbstractBlock.Settings.create().mapColor(MapColor.GRAY).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_LIGHT_GRAY_SHULKER_BOX = register("netherite_light_gray_shulker_box", createShulkerBoxBlock(DyeColor.LIGHT_GRAY, AbstractBlock.Settings.create().mapColor(MapColor.LIGHT_GRAY).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_CYAN_SHULKER_BOX = register("netherite_cyan_shulker_box", createShulkerBoxBlock(DyeColor.CYAN, AbstractBlock.Settings.create().mapColor(MapColor.CYAN).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_PURPLE_SHULKER_BOX = register("netherite_purple_shulker_box", createShulkerBoxBlock(DyeColor.PURPLE, AbstractBlock.Settings.create().mapColor(MapColor.PURPLE).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_BLUE_SHULKER_BOX = register("netherite_blue_shulker_box", createShulkerBoxBlock(DyeColor.BLUE, AbstractBlock.Settings.create().mapColor(MapColor.BLUE).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_BROWN_SHULKER_BOX = register("netherite_brown_shulker_box", createShulkerBoxBlock(DyeColor.BROWN, AbstractBlock.Settings.create().mapColor(MapColor.BROWN).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_GREEN_SHULKER_BOX = register("netherite_green_shulker_box", createShulkerBoxBlock(DyeColor.GREEN, AbstractBlock.Settings.create().mapColor(MapColor.GREEN).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_RED_SHULKER_BOX = register("netherite_red_shulker_box", createShulkerBoxBlock(DyeColor.RED, AbstractBlock.Settings.create().mapColor(MapColor.RED).sounds(BlockSoundGroup.NETHERITE))); + NETHERITE_BLACK_SHULKER_BOX = register("netherite_black_shulker_box", createShulkerBoxBlock(DyeColor.BLACK, AbstractBlock.Settings.create().mapColor(MapColor.BLACK).sounds(BlockSoundGroup.NETHERITE))); NETHERITE_SHULKER_BOX_ENTITY = Registry.register(Registries.BLOCK_ENTITY_TYPE, id("netherite_shulker_box"), BlockEntityType.Builder.create(NetheriteShulkerBoxBlockEntity::new, @@ -140,4 +140,4 @@ private static NetheriteShulkerBoxBlock createShulkerBoxBlock(DyeColor color, Ab ); } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheriteShulkerBoxBlockEntityRenderer.java b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheriteShulkerBoxBlockEntityRenderer.java index 4f88a04..a511be3 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheriteShulkerBoxBlockEntityRenderer.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheriteShulkerBoxBlockEntityRenderer.java @@ -25,6 +25,7 @@ package com.oroarmor.netherite_plus.client.render; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.oroarmor.netherite_plus.block.NetheriteShulkerBoxBlock; import com.oroarmor.netherite_plus.block.entity.NetheriteShulkerBoxBlockEntity; import com.oroarmor.netherite_plus.client.NetheritePlusTextures; @@ -59,7 +60,7 @@ public void render(NetheriteShulkerBoxBlockEntity shulkerBoxBlockEntity, float f Direction direction = Direction.UP; if (shulkerBoxBlockEntity.hasWorld()) { BlockState blockState = shulkerBoxBlockEntity.getWorld().getBlockState(shulkerBoxBlockEntity.getPos()); - if (blockState.getBlock() instanceof ShulkerBoxBlock) { + if (blockState.getBlock() instanceof NetheriteShulkerBoxBlock) { direction = blockState.get(ShulkerBoxBlock.FACING); } } @@ -86,4 +87,4 @@ public void render(NetheriteShulkerBoxBlockEntity shulkerBoxBlockEntity, float f this.model.render(matrixStack, vertexConsumer, i, j, 1.0F, 1.0F, 1.0F, 1.0F); matrixStack.pop(); } -} +} \ No newline at end of file From 2a32b262edc2afe403c855647e6aadb2b9508bab Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Wed, 26 Jun 2024 01:25:18 -0500 Subject: [PATCH 02/12] Revert Quilt to 0.26.0, enable shields Some parts of the shields working will require my upcoming PR for MultiItemLib Textures are still borked, fix currently unknown --- gradle.properties | 2 +- .../oroarmor/netherite_plus/NetheritePlusMod.java | 4 ++-- .../client/NetheritePlusClientMod.java | 4 ++-- .../client/NetheritePlusModelProvider.java | 4 ++-- .../client/NetheritePlusTextures.java | 2 +- .../NetheritePlusBuiltinItemModelRenderer.java | 2 +- .../config/NetheritePlusConfig.java | 4 ++-- .../netherite_plus/item/NetheritePlusItems.java | 13 ++++++++----- .../netherite_plus/item/NetheriteShieldItem.java | 15 ++------------- .../mixin/render/BackgroundRendererMixin.java | 3 +-- 10 files changed, 22 insertions(+), 31 deletions(-) diff --git a/gradle.properties b/gradle.properties index ee31862..3fe85c9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx2G # Quilt Properties minecraft_version=1.20.1 -quilt_loader_version=0.26.1-beta.1 +quilt_loader_version=0.26.0 # Mod Properties mod_version=2.2.0 diff --git a/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java b/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java index d7575d2..eebf9f6 100644 --- a/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java +++ b/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java @@ -95,7 +95,7 @@ public static Identifier id(String id) { public static void registerItemsWithMultiItemLib() { if (CONFIG.enabled.shields.value()) { -// UniqueItemRegistry.SHIELD.addItemToRegistry(NETHERITE_SHIELD); + UniqueItemRegistry.SHIELD.addItemToRegistry(NETHERITE_SHIELD); } if (CONFIG.enabled.fishing_rod.value()) { UniqueItemRegistry.FISHING_ROD.addItemToRegistry(NETHERITE_FISHING_ROD); @@ -107,4 +107,4 @@ public static void registerItemsWithMultiItemLib() { UniqueItemRegistry.SHEARS.addItemToRegistry(NETHERITE_SHEARS); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusClientMod.java b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusClientMod.java index 7e7b28e..a5236a2 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusClientMod.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusClientMod.java @@ -122,10 +122,10 @@ public static void registerBuiltinItemRenderers(MinecraftClient client) { } if (NetheritePlusMod.CONFIG.enabled.shields.value()) { -// BuiltinItemRendererRegistry.INSTANCE.register(NetheritePlusItems.NETHERITE_SHIELD, dynamicItemRenderer); + BuiltinItemRendererRegistry.INSTANCE.register(NetheritePlusItems.NETHERITE_SHIELD, dynamicItemRenderer); } if (NetheritePlusMod.CONFIG.enabled.trident.value()) { BuiltinItemRendererRegistry.INSTANCE.register(NetheritePlusItems.NETHERITE_TRIDENT, dynamicItemRenderer); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusModelProvider.java b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusModelProvider.java index dced85d..7f676b5 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusModelProvider.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusModelProvider.java @@ -109,7 +109,7 @@ public static void registerItemsWithModelProvider() { } if (NetheritePlusMod.CONFIG.enabled.shields.value()) { -// registerShieldModels(); + registerShieldModels(); } if (NetheritePlusMod.CONFIG.enabled.fishing_rod.value()) { @@ -137,4 +137,4 @@ private static void registerTridentModels() { return livingEntity != null && livingEntity.isUsingItem() && livingEntity.getActiveItem() == itemStack ? 1.0F : 0.0F; }); } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java index c0d0ff3..bc402d5 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java @@ -40,4 +40,4 @@ NETHERITE_SHIELD_PATTERNS_ATLAS_TEXTURE, id("entity/netherite_shield_base") public static final Material NETHERITE_SHIELD_BASE_NO_PATTERN = new Material( NETHERITE_SHIELD_PATTERNS_ATLAS_TEXTURE, id("entity/netherite_shield_base_nopattern") ); -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java index 5683417..d54ab2f 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java @@ -128,4 +128,4 @@ public static void renderTrident(TridentEntityModel model, ItemStack stack, Mode public Identifier getQuiltId() { return id("netherite_plus_builtin_item_model_reloader"); } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/config/NetheritePlusConfig.java b/src/main/java/com/oroarmor/netherite_plus/config/NetheritePlusConfig.java index ac41e51..0fb51f9 100644 --- a/src/main/java/com/oroarmor/netherite_plus/config/NetheritePlusConfig.java +++ b/src/main/java/com/oroarmor/netherite_plus/config/NetheritePlusConfig.java @@ -120,7 +120,7 @@ public static class EnabledConfigs extends Section { @Comment("Enables horse armor features.") public final TrackedValue horse_armor = value(true); @Comment("Enables shields features.") - public final TrackedValue shields = value(false); + public final TrackedValue shields = value(true); @Comment("Enables shulker box features.") public final TrackedValue shulker_boxes = value(true); @Comment("Enables trident features.") @@ -135,4 +135,4 @@ public static class GraphicsConfigs extends Section { @Comment("Distance to see in lava.") public final TrackedValue lava_vision_distance = value(0.25); } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/item/NetheritePlusItems.java b/src/main/java/com/oroarmor/netherite_plus/item/NetheritePlusItems.java index fa3469f..c0608a6 100644 --- a/src/main/java/com/oroarmor/netherite_plus/item/NetheritePlusItems.java +++ b/src/main/java/com/oroarmor/netherite_plus/item/NetheritePlusItems.java @@ -34,6 +34,7 @@ import net.minecraft.block.cauldron.LeveledCauldronBlock; import net.minecraft.block.dispenser.DispenserBlock; import net.minecraft.block.dispenser.ShearsDispenserBehavior; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemGroups; @@ -48,6 +49,8 @@ import net.minecraft.util.Rarity; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; +import org.quiltmc.qsl.item.setting.api.QuiltItemSettings; + import static com.oroarmor.netherite_plus.NetheritePlusMod.id; public final class NetheritePlusItems { @@ -219,10 +222,10 @@ public static void init() { } private static void registerShield() { -// NETHERITE_SHIELD = register(id("netherite_shield"), new NetheriteShieldItem(new QuiltItemSettings().maxDamage(NetheritePlusMod.CONFIG.durability.shield.value()).fireproof().equipmentSlot(stack -> EquipmentSlot.OFFHAND))); -// ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> { -// entries.addAfter(Items.SHIELD, NETHERITE_SHIELD); -// }); + NETHERITE_SHIELD = register(id("netherite_shield"), new NetheriteShieldItem(new QuiltItemSettings().maxDamage(NetheritePlusMod.CONFIG.durability.shield.value()).fireproof().equipmentSlot(stack -> EquipmentSlot.OFFHAND))); + ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> { + entries.addAfter(Items.SHIELD, NETHERITE_SHIELD); + }); } private static void registerShulkerBoxes() { @@ -261,4 +264,4 @@ private static void registerTrident() { }); } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/item/NetheriteShieldItem.java b/src/main/java/com/oroarmor/netherite_plus/item/NetheriteShieldItem.java index f63cd35..a535632 100644 --- a/src/main/java/com/oroarmor/netherite_plus/item/NetheriteShieldItem.java +++ b/src/main/java/com/oroarmor/netherite_plus/item/NetheriteShieldItem.java @@ -30,7 +30,7 @@ import net.minecraft.item.Items; import net.minecraft.item.ShieldItem; -public class NetheriteShieldItem extends ShieldItem implements FabricShield { +public class NetheriteShieldItem extends ShieldItem { public NetheriteShieldItem(Settings settings) { super(settings); } @@ -39,15 +39,4 @@ public NetheriteShieldItem(Settings settings) { public boolean canRepair(ItemStack stack, ItemStack ingredient) { return stack.isOf(Items.NETHERITE_INGOT); } - - @Override - public int getCoolDownTicks() { - return 50; - } - - @Override - public boolean supportsBanner() { - // Already have banner code handled - return false; - } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/mixin/render/BackgroundRendererMixin.java b/src/main/java/com/oroarmor/netherite_plus/mixin/render/BackgroundRendererMixin.java index d2e0e78..1624afb 100644 --- a/src/main/java/com/oroarmor/netherite_plus/mixin/render/BackgroundRendererMixin.java +++ b/src/main/java/com/oroarmor/netherite_plus/mixin/render/BackgroundRendererMixin.java @@ -41,7 +41,6 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -@Environment(EnvType.CLIENT) @Mixin(BackgroundRenderer.class) public class BackgroundRendererMixin { @Inject(at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;setShaderFogStart(F)V", shift = At.Shift.BEFORE), method = "applyFog", locals = LocalCapture.CAPTURE_FAILHARD) @@ -52,4 +51,4 @@ private static void applyFog(Camera camera, BackgroundRenderer.FogType fogType, } } } -} +} \ No newline at end of file From c8d531e05148c16e1621010c9cbf2376b3748e77 Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Wed, 26 Jun 2024 01:45:34 -0500 Subject: [PATCH 03/12] Create changelog, add my name as a contributor --- CHANGELOG.md | 9 ++++++++- README.md | 1 - src/main/resources/quilt.mod.json | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e037ee1..48af068 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +Version 2.2.1 + +- Requires new version of Multi Item Lib +- Fixed Netherite Shulker Box sound +- Re-enabled shields, removed Fabric-Shield-Lib dependency +- Update by Roadhog360 +---- Version 2.2.0 - Update to Minecraft 1.20.1 @@ -7,4 +14,4 @@ Version 2.1.0 - Update Netherite Plus to 1.19.4 - Use oro-gradle-plugin -- Update multi-item-lib to 1.6.2 \ No newline at end of file +- Update multi-item-lib to 1.6.2 diff --git a/README.md b/README.md index 3a350af..75581bf 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ Discord: https://discord.gg/dGCvj56 * Netherite Shulker Boxes - Don't burn in lava - - Still are exploded by TNT, will be fixed soon * Netherite Fishing Rod - Doesnt burn in lava diff --git a/src/main/resources/quilt.mod.json b/src/main/resources/quilt.mod.json index cc42143..42ba481 100644 --- a/src/main/resources/quilt.mod.json +++ b/src/main/resources/quilt.mod.json @@ -17,6 +17,7 @@ "contributors": { "OroArmor": "Owner", "1198159": "Contributor", + "Roadhog360": "Contributor", "Ron": "Texture Artist" }, "contact": { From ae05252f3e514afc601342ef6f2043963b56d8e3 Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Wed, 26 Jun 2024 01:47:04 -0500 Subject: [PATCH 04/12] Bump version, forgot to do that! --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3fe85c9..bd81765 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.20.1 quilt_loader_version=0.26.0 # Mod Properties -mod_version=2.2.0 +mod_version=2.2.1 maven_group=com.oroarmor archives_base_name=netherite-plus-mod project_name=Netherite Plus Mod From 6180053ff623cbb5e9a23e5886362e7fc98919b0 Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Wed, 26 Jun 2024 02:00:08 -0500 Subject: [PATCH 05/12] Update quilt.mod.json and document lib version bumps --- CHANGELOG.md | 1 + src/main/resources/quilt.mod.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48af068..893c2fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ Version 2.2.1 - Requires new version of Multi Item Lib - Fixed Netherite Shulker Box sound - Re-enabled shields, removed Fabric-Shield-Lib dependency +- Now requires Quilt Loader 0.26.0 or greater, and QFAPi 7.5.0+0.92.2-1.20.1 or greater - Update by Roadhog360 ---- Version 2.2.0 diff --git a/src/main/resources/quilt.mod.json b/src/main/resources/quilt.mod.json index 42ba481..a3c046c 100644 --- a/src/main/resources/quilt.mod.json +++ b/src/main/resources/quilt.mod.json @@ -32,11 +32,11 @@ "depends": [ { "id": "quilt_loader", - "versions": ">=0.20.2" + "versions": ">=0.26.0" }, { "id": "quilted_fabric_api", - "versions": ">=7.2.1+0.88.0-1.20.1" + "versions": ">=7.5.0+0.92.2-1.20.1" }, { "id": "minecraft", From e575803c1d75609249dc16f93e26cf38b01abcca Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Wed, 26 Jun 2024 03:18:55 -0500 Subject: [PATCH 06/12] Remove Player Entity mixin, will be added to MIL --- .../mixin/PlayerEntityMixin.java | 63 ------------------- src/main/resources/netherite_plus.mixins.json | 1 - 2 files changed, 64 deletions(-) delete mode 100644 src/main/java/com/oroarmor/netherite_plus/mixin/PlayerEntityMixin.java diff --git a/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerEntityMixin.java b/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerEntityMixin.java deleted file mode 100644 index cebfb06..0000000 --- a/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerEntityMixin.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021-2023 OroArmor (Eli Orona) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.oroarmor.netherite_plus.mixin; - -import com.oroarmor.netherite_plus.item.NetheritePlusItems; -import com.oroarmor.netherite_plus.stat.NetheritePlusStats; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; - -@Mixin(PlayerEntity.class) -public abstract class PlayerEntityMixin extends LivingEntity { - @Shadow public abstract void increaseStat(Identifier stat, int amount); - - protected PlayerEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - @Inject(method = "increaseTravelMotionStats", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;increaseStat(Lnet/minecraft/util/Identifier;I)V", ordinal = 7)) - private void increaseTravelMotionStats(double dx, double dy, double dz, CallbackInfo ci) { - boolean hasNetheriteElytra = false; - for (ItemStack item : this.getArmorItems()) { - hasNetheriteElytra |= item.isOf(NetheritePlusItems.NETHERITE_ELYTRA); - } - if (!hasNetheriteElytra) { - return; - } - - this.increaseStat(NetheritePlusStats.FLY_NETHERITE_ELYTRA_ONE_CM, Math.round((float)Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F)); - } -} diff --git a/src/main/resources/netherite_plus.mixins.json b/src/main/resources/netherite_plus.mixins.json index ee9abaf..ff835b8 100644 --- a/src/main/resources/netherite_plus.mixins.json +++ b/src/main/resources/netherite_plus.mixins.json @@ -6,7 +6,6 @@ "mixins": [ "BlockItemMixin", "ItemPredicateMixin", - "PlayerEntityMixin", "ServerPlayNetworkHandlerMixin", "ShulkerBoxBlockEntityMixin", "TridentEntityMixin" From 1463175480f9a2b653c845a83b076d61f6734cce Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Wed, 26 Jun 2024 03:22:52 -0500 Subject: [PATCH 07/12] Revert "Remove Player Entity mixin, will be added to MIL" This reverts commit e575803c1d75609249dc16f93e26cf38b01abcca. --- .../mixin/PlayerEntityMixin.java | 63 +++++++++++++++++++ src/main/resources/netherite_plus.mixins.json | 1 + 2 files changed, 64 insertions(+) create mode 100644 src/main/java/com/oroarmor/netherite_plus/mixin/PlayerEntityMixin.java diff --git a/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerEntityMixin.java b/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerEntityMixin.java new file mode 100644 index 0000000..cebfb06 --- /dev/null +++ b/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerEntityMixin.java @@ -0,0 +1,63 @@ +/* + * MIT License + * + * Copyright (c) 2021-2023 OroArmor (Eli Orona) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.oroarmor.netherite_plus.mixin; + +import com.oroarmor.netherite_plus.item.NetheritePlusItems; +import com.oroarmor.netherite_plus.stat.NetheritePlusStats; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import net.minecraft.world.World; + +@Mixin(PlayerEntity.class) +public abstract class PlayerEntityMixin extends LivingEntity { + @Shadow public abstract void increaseStat(Identifier stat, int amount); + + protected PlayerEntityMixin(EntityType entityType, World world) { + super(entityType, world); + } + + @Inject(method = "increaseTravelMotionStats", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;increaseStat(Lnet/minecraft/util/Identifier;I)V", ordinal = 7)) + private void increaseTravelMotionStats(double dx, double dy, double dz, CallbackInfo ci) { + boolean hasNetheriteElytra = false; + for (ItemStack item : this.getArmorItems()) { + hasNetheriteElytra |= item.isOf(NetheritePlusItems.NETHERITE_ELYTRA); + } + if (!hasNetheriteElytra) { + return; + } + + this.increaseStat(NetheritePlusStats.FLY_NETHERITE_ELYTRA_ONE_CM, Math.round((float)Math.sqrt(dx * dx + dy * dy + dz * dz) * 100.0F)); + } +} diff --git a/src/main/resources/netherite_plus.mixins.json b/src/main/resources/netherite_plus.mixins.json index ff835b8..ee9abaf 100644 --- a/src/main/resources/netherite_plus.mixins.json +++ b/src/main/resources/netherite_plus.mixins.json @@ -6,6 +6,7 @@ "mixins": [ "BlockItemMixin", "ItemPredicateMixin", + "PlayerEntityMixin", "ServerPlayNetworkHandlerMixin", "ShulkerBoxBlockEntityMixin", "TridentEntityMixin" From 629448b4b9ca25269e8cc321b0ac979646a52b8d Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Thu, 27 Jun 2024 02:59:35 -0500 Subject: [PATCH 08/12] Elytra fixes, temporary MIL solution, update quilt loom & gradle Basically temporary compile the jar so maven is not needed to test the new changes. Elytra now extends ElytraItem and not ArmorItem, allowing for better compatibility. Instead we add stuff in so it is treated like armor by areas we want it to be. Loom updates needed for MixinExtras FOR SOME REASON THE DEBUG LAUNCHER NO LONGER WORKS It's due to the loom update, I tracked it down to that individual change, but it is needed for MixinExtras. I'll look into it soon. I'm tired and have been fighting with this stupid error for 2 whole freaking hours... --- CHANGELOG.md | 6 +- build.gradle | 11 ++-- gradle/wrapper/gradle-wrapper.properties | 7 ++- libs/multi-item-lib-1.6.3.jar | Bin 0 -> 27300 bytes .../netherite_plus/NetheritePlusMod.java | 3 + .../item/NetheriteElytraArmorMaterials.java | 10 ++-- .../item/NetheriteElytraItem.java | 56 +++++++++++++++--- .../mixin/EnchantmentHelperMixin.java | 49 +++++++++++++++ .../mixin/PlayerInventoryMixin.java | 54 +++++++++++++++++ .../models/armor/netherite_elytra_layer_1.png | Bin 6213 -> 0 bytes .../models/armor/netherite_elytra_layer_2.png | Bin 3061 -> 0 bytes src/main/resources/netherite_plus.mixins.json | 2 + src/main/resources/quilt.mod.json | 4 +- 13 files changed, 179 insertions(+), 23 deletions(-) create mode 100644 libs/multi-item-lib-1.6.3.jar create mode 100644 src/main/java/com/oroarmor/netherite_plus/mixin/EnchantmentHelperMixin.java create mode 100644 src/main/java/com/oroarmor/netherite_plus/mixin/PlayerInventoryMixin.java delete mode 100644 src/main/resources/assets/minecraft/textures/models/armor/netherite_elytra_layer_1.png delete mode 100644 src/main/resources/assets/minecraft/textures/models/armor/netherite_elytra_layer_2.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 893c2fe..5a56f07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,9 @@ Version 2.2.1 - Requires new version of Multi Item Lib - Fixed Netherite Shulker Box sound - Re-enabled shields, removed Fabric-Shield-Lib dependency -- Now requires Quilt Loader 0.26.0 or greater, and QFAPi 7.5.0+0.92.2-1.20.1 or greater +- Reworked the elytra internally to be registered like an actual elytra item, uses reintroduced Multi Item Lib functionality to hopefully have better compatibility + - Still functions as a piece of armor if a protection value is provided. +- Now requires Quilt Loader 0.26.0 or greater, and QFApi 7.5.0+0.92.2-1.20.1 or greater - Update by Roadhog360 ---- Version 2.2.0 @@ -15,4 +17,4 @@ Version 2.1.0 - Update Netherite Plus to 1.19.4 - Use oro-gradle-plugin -- Update multi-item-lib to 1.6.2 +- Update multi-item-lib to 1.6.2 \ No newline at end of file diff --git a/build.gradle b/build.gradle index ccf6c9a..a73622c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'org.quiltmc.loom' version "1.1.+" + id 'org.quiltmc.loom' version "1.4.+" id 'com.oroarmor.general-gradle-plugin' version '1.2.3' id 'com.oroarmor.minecraft-gradle-plugin' version '1.2.3' @@ -47,7 +47,7 @@ minecraftPublishing { curseforgeId = "394120" dependencies { "multi-item-lib" { - version = "1.6.2" + version = "1.6.3" type = DependencyType.REQUIRED } } @@ -71,7 +71,10 @@ dependencies { modImplementation "org.quiltmc:qsl:${project.qsl_version}" modImplementation "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${project.qfapi_version}" - modImplementation "com.oroarmor:multi-item-lib:1.6.2" +// modImplementation "com.oroarmor:multi-item-lib:1.6.2" +//Temporary + modImplementation files('libs/multi-item-lib-1.6.3.jar') + modCompileOnly("com.github.CrimsonDawn45:Fabric-Shield-Lib:1.7.2-1.20.2") modRuntimeOnly("com.terraformersmc:modmenu:7.2.1") } @@ -125,4 +128,4 @@ task github(type: PublishProjectToGithubTask) { import com.oroarmor.orogradleplugin.minecraft.* task curseforge(type: CurseforgePublishTask) -task modrinth(type: ModrinthPublishTask) +task modrinth(type: ModrinthPublishTask) \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7b769df..81c736b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ -#Thu Jul 23 21:34:18 PDT 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/libs/multi-item-lib-1.6.3.jar b/libs/multi-item-lib-1.6.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..89424067184de8d2dbb7b46dd806d9fb5f52880a GIT binary patch literal 27300 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java b/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java index eebf9f6..cfb13b3 100644 --- a/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java +++ b/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java @@ -106,5 +106,8 @@ public static void registerItemsWithMultiItemLib() { if (CONFIG.enabled.shears.value()) { UniqueItemRegistry.SHEARS.addItemToRegistry(NETHERITE_SHEARS); } + if (CONFIG.enabled.elytra.value()) { + UniqueItemRegistry.ELYTRA.addItemToRegistry(NETHERITE_ELYTRA); + } } } \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/item/NetheriteElytraArmorMaterials.java b/src/main/java/com/oroarmor/netherite_plus/item/NetheriteElytraArmorMaterials.java index e1177fc..6c1eff7 100644 --- a/src/main/java/com/oroarmor/netherite_plus/item/NetheriteElytraArmorMaterials.java +++ b/src/main/java/com/oroarmor/netherite_plus/item/NetheriteElytraArmorMaterials.java @@ -39,9 +39,11 @@ import net.minecraft.util.Lazy; public enum NetheriteElytraArmorMaterials implements ArmorMaterial { - NETHERITE_ELYTRA_MATERIAL("netherite_elytra", 37, new int[]{3, 6, NetheritePlusMod.CONFIG.damage.elytra_armor_points.value(), 3}, 15, SoundEvents.ITEM_ARMOR_EQUIP_NETHERITE, 3.0F, 0.1F, () -> { - return Ingredient.ofItems(Items.NETHERITE_INGOT); - }); + NETHERITE_ELYTRA_MATERIAL("netherite_elytra", + 37, + new int[]{3, 6, NetheritePlusMod.CONFIG.damage.elytra_armor_points.value(), 3}, + 15, SoundEvents.ITEM_ARMOR_EQUIP_NETHERITE, 3.0F, 0.1F, + () -> Ingredient.ofItems(Items.NETHERITE_INGOT)); private static final int[] BASE_DURABILITY = new int[]{13, 15, 16, 11}; private final String name; @@ -103,4 +105,4 @@ public Ingredient getRepairIngredient() { public float getToughness() { return toughness; } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/item/NetheriteElytraItem.java b/src/main/java/com/oroarmor/netherite_plus/item/NetheriteElytraItem.java index c5a09d2..ca39957 100644 --- a/src/main/java/com/oroarmor/netherite_plus/item/NetheriteElytraItem.java +++ b/src/main/java/com/oroarmor/netherite_plus/item/NetheriteElytraItem.java @@ -24,20 +24,60 @@ package com.oroarmor.netherite_plus.item; -import net.minecraft.item.ArmorItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.Multimap; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.item.*; import net.fabricmc.fabric.api.entity.event.v1.FabricElytraItem; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; -public class NetheriteElytraItem extends ArmorItem implements FabricElytraItem { +import java.util.UUID; + +public class NetheriteElytraItem extends ElytraItem implements FabricElytraItem { + + private final ArmorMaterial material; + private final int protection; + private final Multimap attributeModifiers; public NetheriteElytraItem(Settings settings) { - super(NetheriteElytraArmorMaterials.NETHERITE_ELYTRA_MATERIAL, ArmorSlot.CHESTPLATE, settings); + super(settings); + material = NetheriteElytraArmorMaterials.NETHERITE_ELYTRA_MATERIAL; + protection = material.getProtection(ArmorItem.ArmorSlot.CHESTPLATE); + float toughness = material.getToughness(); + float knockbackResistance = material.getKnockbackResistance(); + if(protection > 0) { + ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); + UUID uUID = UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"); + builder.put(EntityAttributes.GENERIC_ARMOR, new EntityAttributeModifier(uUID, "Armor modifier", protection, EntityAttributeModifier.Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_ARMOR_TOUGHNESS, new EntityAttributeModifier(uUID, "Armor toughness", toughness, EntityAttributeModifier.Operation.ADDITION)); + builder.put(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, new EntityAttributeModifier(uUID, "Armor knockback resistance", knockbackResistance, EntityAttributeModifier.Operation.ADDITION)); + this.attributeModifiers = builder.build(); + } else { + attributeModifiers = null; + } + } + + @Override + public SoundEvent getEquipSound() { + return SoundEvents.ITEM_ARMOR_EQUIP_NETHERITE; + } + + public Multimap getAttributeModifiers(EquipmentSlot slot) { + return slot == ArmorItem.ArmorSlot.CHESTPLATE.getEquipmentSlot() && attributeModifiers != null + ? this.attributeModifiers : super.getAttributeModifiers(slot); + } + + public int getEnchantability() { + return protection > 0 ? this.material.getEnchantability() : 0; } @Override - public boolean canRepair(ItemStack stack, ItemStack ingredient) { - return ingredient.getItem() == Items.PHANTOM_MEMBRANE; + public boolean isEnchantable(ItemStack stack) { + return protection > 0; } -} +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/mixin/EnchantmentHelperMixin.java b/src/main/java/com/oroarmor/netherite_plus/mixin/EnchantmentHelperMixin.java new file mode 100644 index 0000000..455d7d6 --- /dev/null +++ b/src/main/java/com/oroarmor/netherite_plus/mixin/EnchantmentHelperMixin.java @@ -0,0 +1,49 @@ +/* + * MIT License + * + * Copyright (c) 2021-2023 OroArmor (Eli Orona) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.oroarmor.netherite_plus.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.oroarmor.netherite_plus.item.NetheriteElytraArmorMaterials; +import com.oroarmor.netherite_plus.item.NetheritePlusItems; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.EnchantmentTarget; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(EnchantmentHelper.class) +public class EnchantmentHelperMixin { + @WrapOperation(method = "getPossibleEntries", at = @At(value = "INVOKE", target = "Lnet/minecraft/enchantment/EnchantmentTarget;isAcceptableItem(Lnet/minecraft/item/Item;)Z")) + private static boolean doNetheriteElytraCheck(EnchantmentTarget instance, Item item, Operation original) { + if(item == NetheritePlusItems.NETHERITE_ELYTRA && (instance == EnchantmentTarget.ARMOR || instance == EnchantmentTarget.ARMOR_CHEST) + && NetheriteElytraArmorMaterials.NETHERITE_ELYTRA_MATERIAL.getProtection(ArmorItem.ArmorSlot.CHESTPLATE) > 0) { + return true; + } + return original.call(instance, item); + } +} \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerInventoryMixin.java b/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerInventoryMixin.java new file mode 100644 index 0000000..6f99300 --- /dev/null +++ b/src/main/java/com/oroarmor/netherite_plus/mixin/PlayerInventoryMixin.java @@ -0,0 +1,54 @@ +/* + * MIT License + * + * Copyright (c) 2021-2023 OroArmor (Eli Orona) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.oroarmor.netherite_plus.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.oroarmor.netherite_plus.item.NetheriteElytraArmorMaterials; +import com.oroarmor.netherite_plus.item.NetheritePlusItems; +import net.minecraft.enchantment.EnchantmentTarget; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ArmorItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.Nameable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(PlayerInventory.class) +public abstract class PlayerInventoryMixin implements Inventory, Nameable { + @WrapOperation(method = "damageArmor", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getItem()Lnet/minecraft/item/Item;", ordinal = 1)) + private Item damageNetheriteElytra(ItemStack instance, Operation original) { + if(instance.getItem() == NetheritePlusItems.NETHERITE_ELYTRA + && NetheriteElytraArmorMaterials.NETHERITE_ELYTRA_MATERIAL.getProtection(ArmorItem.ArmorSlot.CHESTPLATE) > 0) { + //This doesn't matter, we're just lying so itemStack.getItem() instanceof ArmorItem returns true + //This is so it applies damage to the Netherite elytra, netherite elytra will not be treated as leather boots + return Items.LEATHER_BOOTS; + } + return original.call(instance); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/textures/models/armor/netherite_elytra_layer_1.png b/src/main/resources/assets/minecraft/textures/models/armor/netherite_elytra_layer_1.png deleted file mode 100644 index db6540c60ef52c409baba1eeaaecacfa5a1e5da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6213 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 diff --git a/src/main/resources/assets/minecraft/textures/models/armor/netherite_elytra_layer_2.png b/src/main/resources/assets/minecraft/textures/models/armor/netherite_elytra_layer_2.png deleted file mode 100644 index 21842792a25f85e91ae890f51b4d991409b2bb02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3061 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
MGKN zOrPx|lp8xTu!7uK<-Ks3^jFk6KLXK39rjG@=|1k#UUBn&{md zc<0EEjsVCG53#= z-{P#rtgK+WUCPrJ=ynGghO>;Q(g`vQ$&Ux+%uGcWNxXj{< zlHHHKyj%fUuZK%hoVAD`An*5ac@EB@lNLg2#y{>7bUFl`4l*#5qY*yOkx_(8Q+7Z3 zikxhac?xWl?vte!UI< z^7G|az~e8z{zos^dT^iHgFU1%_^L#PbufN5?#_Z0m>r^CJ}W3rU(|DeJE!{ysp@QT z4(}YkDF6MV@ZTk9w-HiMr77jv86r)&J=i0-ejSk{vw6NO!8=4~kj9|mnCR_y@XoQ5 zAE6eLI$SUEM@HdnH~LQtD27AA^$m2qNVvX%uS)dN60R&sAOD1kV;0_fADp8akEy0p zs`U+293w)5J3psNQ(T^tJ?|ooA-=g;|CqH}moDHBRuExp*xrHB00000NkvXXu0mjf DmZH^N diff --git a/src/main/resources/netherite_plus.mixins.json b/src/main/resources/netherite_plus.mixins.json index ee9abaf..263d25d 100644 --- a/src/main/resources/netherite_plus.mixins.json +++ b/src/main/resources/netherite_plus.mixins.json @@ -5,8 +5,10 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "BlockItemMixin", + "EnchantmentHelperMixin", "ItemPredicateMixin", "PlayerEntityMixin", + "PlayerInventoryMixin", "ServerPlayNetworkHandlerMixin", "ShulkerBoxBlockEntityMixin", "TridentEntityMixin" diff --git a/src/main/resources/quilt.mod.json b/src/main/resources/quilt.mod.json index a3c046c..4bcfaf6 100644 --- a/src/main/resources/quilt.mod.json +++ b/src/main/resources/quilt.mod.json @@ -44,7 +44,7 @@ }, { "id": "multi_item_lib", - "versions": ">=1.6.2" + "versions": ">=1.6.3" } ] }, @@ -56,4 +56,4 @@ "environment": "*" }, "schema_version": 1 -} +} \ No newline at end of file From e2f458b36c4daabadff04ca3f80ed7f1c6cef33c Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Thu, 27 Jun 2024 14:24:49 -0500 Subject: [PATCH 09/12] Add bow/crossbow to UniqueItemRegistry --- .../java/com/oroarmor/netherite_plus/NetheritePlusMod.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java b/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java index cfb13b3..b68cab6 100644 --- a/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java +++ b/src/main/java/com/oroarmor/netherite_plus/NetheritePlusMod.java @@ -106,6 +106,10 @@ public static void registerItemsWithMultiItemLib() { if (CONFIG.enabled.shears.value()) { UniqueItemRegistry.SHEARS.addItemToRegistry(NETHERITE_SHEARS); } + if (CONFIG.enabled.bows_and_crossbows.value()) { + UniqueItemRegistry.BOW.addItemToRegistry(NETHERITE_BOW); + UniqueItemRegistry.CROSSBOW.addItemToRegistry(NETHERITE_CROSSBOW); + } if (CONFIG.enabled.elytra.value()) { UniqueItemRegistry.ELYTRA.addItemToRegistry(NETHERITE_ELYTRA); } From fd0fec64eff3f99a1a24a51956bcbe2abcfc7133 Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Thu, 27 Jun 2024 16:04:41 -0500 Subject: [PATCH 10/12] Fix shield textures --- .../netherite_plus/client/NetheritePlusTextures.java | 8 ++------ .../render/NetheritePlusBuiltinItemModelRenderer.java | 6 +++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java index bc402d5..a66e94d 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java @@ -34,10 +34,6 @@ public class NetheritePlusTextures { public static final Identifier NETHERITE_SHULKER_BOXES_ATLAS_TEXTURE = id("textures/atlas/netherite_shulker_boxes.png"); public static final Identifier NETHERITE_SHIELD_PATTERNS_ATLAS_TEXTURE = id("textures/atlas/netherite_shield_patterns.png"); - public static final Material NETHERITE_SHIELD_BASE = new Material( - NETHERITE_SHIELD_PATTERNS_ATLAS_TEXTURE, id("entity/netherite_shield_base") - ); - public static final Material NETHERITE_SHIELD_BASE_NO_PATTERN = new Material( - NETHERITE_SHIELD_PATTERNS_ATLAS_TEXTURE, id("entity/netherite_shield_base_nopattern") - ); + //Shields with patterns need an atlas, supposedly + public static final Material NETHERITE_SHIELD_BASE = new Material(NETHERITE_SHIELD_PATTERNS_ATLAS_TEXTURE, id("entity/netherite_shield_base")); } \ No newline at end of file diff --git a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java index d54ab2f..b9a7c4d 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java @@ -103,12 +103,12 @@ public void renderShield(ShieldEntityModel model, ItemStack stack, ModelTransfor boolean bl = stack.getSubNbt("BlockEntityTag") != null; matrices.push(); matrices.scale(1.0F, -1.0F, -1.0F); - Material material = bl ? NetheritePlusTextures.NETHERITE_SHIELD_BASE : NetheritePlusTextures.NETHERITE_SHIELD_BASE_NO_PATTERN; - VertexConsumer vertexConsumer = material.getSprite().getTextureSpecificVertexConsumer(ItemRenderer.getDirectItemGlintConsumer(vertexConsumers, model.getLayer(material.getTexture()), true, stack.hasGlint())); + Identifier id = bl ? id("textures/entity/netherite_shield_base.png") : id("textures/entity/netherite_shield_base_nopattern.png"); + VertexConsumer vertexConsumer = ItemRenderer.getDirectItemGlintConsumer(vertexConsumers, model.getLayer(id), true, stack.hasGlint()); model.getHandle().render(matrices, vertexConsumer, light, overlay, 1.0F, 1.0F, 1.0F, 1.0F); if (bl) { List, DyeColor>> list = BannerBlockEntity.getPatternsFromNbt(ShieldItem.getColor(stack), BannerBlockEntity.getPatternListTag(stack)); - BannerBlockEntityRenderer.renderCanvas(matrices, vertexConsumers, light, overlay, model.getPlate(), material, false, list, stack.hasGlint()); + BannerBlockEntityRenderer.renderCanvas(matrices, vertexConsumers, light, overlay, model.getPlate(), NetheritePlusTextures.NETHERITE_SHIELD_BASE, false, list, stack.hasGlint()); } else { model.getPlate().render(matrices, vertexConsumer, light, overlay, 1.0F, 1.0F, 1.0F, 1.0F); } From 6fbe6dfde9942d32731e0c4557d5e02749fbf047 Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Fri, 28 Jun 2024 23:59:22 -0500 Subject: [PATCH 11/12] Elytra renderer is now a mixin, fix lang key Also store the Identifier instances instead of making a new one every frame --- libs/multi-item-lib-1.6.3.jar | Bin 27300 -> 27540 bytes .../client/NetheritePlusClientMod.java | 30 ++---- .../client/NetheritePlusTextures.java | 4 + .../NetheriteElytraFeatureRenderer.java | 88 ------------------ ...NetheritePlusBuiltinItemModelRenderer.java | 4 +- .../render/ElytraFeatureRendererMixin.java | 58 ++++++++++++ .../assets/netherite_plus/lang/en_us.json | 2 +- .../assets/netherite_plus/lang/pl_pl.json | 2 +- .../assets/netherite_plus/lang/zh_cn.json | 4 +- src/main/resources/netherite_plus.mixins.json | 1 + 10 files changed, 76 insertions(+), 117 deletions(-) delete mode 100644 src/main/java/com/oroarmor/netherite_plus/client/render/NetheriteElytraFeatureRenderer.java create mode 100644 src/main/java/com/oroarmor/netherite_plus/mixin/render/ElytraFeatureRendererMixin.java diff --git a/libs/multi-item-lib-1.6.3.jar b/libs/multi-item-lib-1.6.3.jar index 89424067184de8d2dbb7b46dd806d9fb5f52880a..0c112b4465e0d992e3d0c15c31967cdaae3fdaf3 100644 GIT binary patch delta 5872 zcmZvAbySqmyYjR-PQ0#ZXa(%t1y5{@GTXPteXv-74=5@t~t&9yx#0l;WmQ#0L;ge(p6uPeV~Twx@a4{ zCVQWhTo5c>rRxliYb|EsqC{o2wBO7(w?gA6_Lw3ZdRraLo3`Zp3o{kEYIZDj9vSob zGd<{LntsdIn^fAUtLF2Dimlm5ro^b&XyC=>rPTX(xT}03)V4C(geum)I-;5yZd}~? zg-Z@q=j8jHM`>JL zm5FN|Abm%Z+MlHY=kCzKSTSv&3m&ESe4|0n@W4#a^EU=hr_oLL#k-P988{|1>cqvr z5BfU&GAvOy4!E9Ndfxp+=t^a!ElyUNS>cf^L8qR+UsMmAq3J%hzzCCJf<_T?!g*!If<^C61R=?CO0R1TEAJn!-^wgS)bS)zq zbNGNxoFOk@P3KTp@wN+}l}Esyk+on5VU=(gs$z1~K-<@)yb*m$a_T`7)}&gInMwJU zYPV^f-5xUz;@Py}oAR)yZ%-K|!EBo)oy@xzbQ?ccqRV zAzWX}amfB5cRiNxlQ0w+<{;ajaOnl@lK)ij@q_U*|s>t@A0;EN;}TfOu>%bSR z0$*@T)_TD;gUI!F>gZsZyr8PZ;+~iF?$JG|qFo9jc)Y81ue3plJ=wu$i@TCaUr_#x zq&$w5*oqeF){SiM+Z3Gw6J@VvGaTLUY;zSiDBWYZr=|0+R>mpAeV4S)t%z($~u(ju}1LC}3IBVDpTA}nIk zGK2Z%lM9ZKb&H#TG7W5eoM@n+D66Fb19Z?{0gCAh94pj^52E0|m#T>QE}G0j^^ z5|Np4BDy2N``fkG7|JUEuPY2l`@we^ak0Lw9XCrsLk%JX6Hqh4Gixd$yfrRbayf2a z%7lL$4$@j`Fx18ycRA8S?+U457d{b>)4vO^JL4n#$S?1Tx5AV&mvElfIy^S_BN?1c z&C46cFhVqLBxFvd)@I0O{S^}FkDVp_9o-MwaIBnYPI8^Q7>+#?V5dP`cZuTiWSnzljj-=6IS9M zTO8DW#e^xHOU9*(54usN$nP_Or-=HrDAxylDK22msSoIEuGT2)h#&L`Dbde`Il=#E z8x`$+pUa%?g=SaB8Z}F)V-4$S#@+-J?x96 zPo2tHk^W9#>in=JaGFW4#`EyY7|Zq3WjDrtC%m#y11N=`sz)tsMIUb|)H8!71Ml35 zAx08U$dh)Gw^v&n70PQAr0pkYREbE-;gI#`s7zZstWdfe<;*=VBntvZ6xu{x3MB;c$S~AeLY_$RPVp zI$=~McA-lCR(IWV@~{lQ60j4O7l=t2W{J@dR*x28k+HeJyotAox!JzypyC|tM3y!A z9*&oiYGBRqsXz+lui`wnJL%Rz2LMEI{t8aDkI3Wgqi^V={U|wVY1?&5T+c}4sS^mk zhiH*ZBrKpt%T2)Y(187eU@%1Wk)bNDp8b=YD(YSI_t9L7& z>KJ|gCd3c=gm~CAQeIeODqbzB$(QOKo1cYdeafb!4<>3SfPXMcdfF8-^aM@mjZgA7 zlN!15FP4qH+|6=p{()t=$}C16@c4yRn>d0<$_=ly_3&SBM-%F9WHzU*lJzr6+`sYD z{YZDnjKBAxY7Jb`Q+T#7=Go)H({Z?o^v*Y0$Q(UHwIJ4@BI)t4Q3}L?pNNXSOLN_a zc1+ZN!EQSs3=%ebCqU^En>5iGKG+JX>8On zHA4-IGK?S9Jw)W5rnn4<$2oV=GHnn0WM<=icGGsm^WS?8RrL!fHoU=m4;HX=8Q{Oy z(^cR7Gwd(gL_FQh99gp6A9rL~He&aa*A>3K?G%H(Br{xcRM===J~5kP>#FVnO&ge3 z^|J(~?_(tCZTl5zoH;IN>@U9-`x01kJs||?EbLab)Y)3LIkhDnY_}_sy5^$l%MY*L zb!mLXjzQW$()*%Z>(k1BsPthc2gEH^dXhP0;vQm5$Q&a4T*3%(DdOcuRh@T@DWvRL z;*~={jkKV0T|wXbDH8XnTMo%kaWv6>E7ZccOx0FzA-Y!t5DROMNDU(&UYFaC=A!Ot zxf9OCRD!L2+_e?mV z@y=>`_Co?PEwe73Y&7E~5~^)KSnTFBIU+lQ$iAh2)x&n)n?s~re>;$aqHp<~CE|@c zM^7{{olYP&mxEniw(2Q`(=_an_0Q8$pISBQ8Il~O-Ur zpZ)#u!}qD+oeb^9w9&W8+Gdn|hP%_+juHA#)^pOeAwVY9=`D?}mYRF}$eYgT90aI^66o0DJFWwq?-haOl-^E% zo*uBW?p4`S0imDNG0j$ofa$j}>(e5?QOJibJtdO49Okiao@`9IZFvt4ac>_ryg&%{k~Ktk+lH9Df7+#C@6V=RDT^Wv(ij)D*8&KGka z5STXo=QK9{1x}eoM~^viD-t9IEdAx=-r*hef}H9Z8?u)+Z{S{=b`3=hPA@M7P#Fkd8n{wy4m&~aJ(M>;^(wy?Dc(RjGb6>DTrsTib&O9o0 zWS4}$8H}A)DxsnGkE8cz{A3b6a(YCB|Dc+wII-q+J|z|j8&E5w9~>J=!jDggE2a^( zj;ns-`7Ov{aZmC9m!hj0Ea;2(j_>z{&X(uFXQ0Yt&FkSNDL&&o&!soXPWNeY59z5q zq;UA3{B3okl-r`wtR%ndS8e(b4f?ISBl!_^yB<)^yjkqN?;LWOyn_0<|2^>UcB3X2 zMs1(~09k1N8vSeoFooGmX>%Sm!TdCb+0YWzgN=<}>1SJW2oyt4=pg~?1BIf)^qGvE z%kxuMXVDLW!-n_Yu+e|J83SZ`((5Xa8(|@PD<6su`;tqPGy^nUFKYsWfVh#cc78@DND2y#uwWd$p3FY2xc#b)XJHfkp~P7J@n zU9(QT)2!CPT;a)6G)<>u>?VQ1#(7KV6Unh{8BK~?l!yV%nVLIfLZyjzYW{iLIU|g4 zed7&7IlN&Odb~@vs>?|#=iP*2=}^$g(Gz0bwRL&u9i=%Fo77G)>(r3>3$!rJPnrW$ zuJtJFL29P9p{SK*ZNhMmS4QhV60xupSA#o*;KHX2YtPx&SPO^8SP@_gzA@t&m(t?e zWf5k@aub4O8`#bsbWna3Zn|$;Z;4eMz;$(ppB@1<89iHBDZYwX+hw*bd|Nhdfvq;h zcrJQCa}A47B*4~@og2(lt#;Jg@t8lvEtqrlRo{1%2|TLjmdA>lC~}TyS_(QsCy={C zn9Jhy7q{PixMEkF$ZztAEKY4jg;oOqB1LA>rX*94P~^kxDZdo9bn}y4K3fcW20e`l z-x27tcbAuJB4s((5$i8bQzbm8LtVN-!MQ_(ke3pOT-2}bGYD34`;OHqsjw__J<>X| z{a`yjSUP<8=`8ZwV&U&B#n+{ar*uJiRGLY$F`RLq)^GLOp6ME={#mueQqy?TNF}-y z=Zd<4N(@-~9vq`xy%IQ(`^UC6Y92;j9heK%(2G%==1wBCmwmQ9=RJ+|E4M0rCwGb5 z#B%L{m@n~Ul!Nqr z>v4KA;@k`=NJ4&+IM3C2u%Zxg&MX4E~I*p@7JaVUTfP z)d?c9v8-H1Q00^M$-f#HlBVHP-p#JyS4p8F(e5rri-oFX3lSf!@N2aQrtE!a7VAhC zG%dejHps{}_mVz5V1ARrVZ<9!nn)Vpb#V{9fh>!EbtI5b_A$I3je~t z>;zHm{y%h+$3hItvmsO+h!8M)8q@{le~dPJ71R;6e~{ln5%rJOf8}8#Y_y*KCDZ;# w&jA3!|FI$seZ-*yBkg~74gjF}9|U(p1ec>cs+xHdq~NV5Cn!822n}rkdO`uX_OuigaMI| z?&e3m>U+QM@45eZ&L3x8>$^VZ?7i1_o$KsbyapCGp{=R-* z9tO@X4(|5KF21&Q?hZ;`Uhei@fu4L&cUxcIu!I`YNCBYAJ`S!w`l8Qh zu54 z_iU|vyc;B43-lGEaaSM@3kUmSH)AO{ymU432}Bm@)l zWnop2ikWm1EtO|`g%e%NXH^2%(MuzDj@dl7rE4D0w4bd4ucOf%{yWX2We{H3I5t7! z^rE%+rRg7BOcR>}4rOnV-rF%k3!C;AKIz;d9~w)=iM8hi5j%6DBBW$eyVBG1-CN7; zv~%K~Ly_|(;Y0BBP6Ywg$=a2rp-2Qx?p@B-KF60+Rr)5%>cO9R>DA@k=KOKBi0lQ8 zCAPycAX7Duw(x3zOJDX45p7ogyMQc3xt^LQmMPuLN~*m6V;n~XK`~UbOZ}C|F7nYL z81?$*(%0`)qnjQYF({HNURBdU8xX5Y{Dxvr>?XZ0jRQO>jqElkL`ds)M5!RA1FA7K zgCDZF%UGoA=3CvC6pR^{oZX+4ZCOa(C{zHx8!0CJpubmgVSb$~YrhO?@3V z4+}-rJN=nZ{pzcEpYp7aY#RKTFRvE30oFvr^mLEl0AhrK^(mAO40Be@4`64}OL{7n;>J>7> zl%adS6~;9Y_>-KE3bDx054p6u)Y)XmQm^8u$A=|OW1+!$24e;vL8>sswD|_R`lEi> zNuPMc{aVbT7LeJS{8eCQ&T!@6J2CBeYyi~B7yr-hdhf}m&^B|U?ZX}@!q$DN*R|y%P&87qj;oFp;N|77C`^mrI zdu3DP)-cp@Msu3iB*Upr(Nf`n`6fNQGaEA25gIZkd-*GwDID7yKPaZFZT)S|K5X$Y zbdn3Bp}`I|U(-^ReN!c||I5*W{o7ufES%1UxN_`5RLoo7)|AcxeNsZ~Xz z=KiLJ|C>D7*-Q^b)@7J-ip{H1URnX-qD5XBq1l?gg-G7Lp%?4!$l26xK7rEJ3Aim{ zfl-@*lUCg{F9fqj+7x74v8*p`B1@*V>G~E@%8>h}E%l%!HOGx_y427seQEn{VOKf0 zGu8AdwSHiaJY69@WN)pEnSz8FM)>P135$$1b-MLB8Y(cj-wgsi%uYk zJcHzpT-Rl zFO`_rVdjv~#~>!VI->P$=n&d=C~PCSfCh(n1Ya2s&mRM^d^YB^AxZw)=oc#DAu*?o zU3A{f$NA4Bc+doVqABGiVfcKs9)jJQs;QJ_AtkKU@hTBZIeh?$4yGb@N($k|bAFD< zC2kk7Bu!g4r28mI<9cIj15X8T9&n@Sq!3fC-2-oRYzPe(8*eUnOzv-S;nby>iT|P& z6Oo%`UPM!-xJyZJ>Q?pjT6N@+*mgUxXQ z8)_p=_1VM3r||Rd5|!%{_q+8d`L3H*;%%1~5tflIbKJVAye_Tvy6^y>ZtICM19-8F zqQKD2L4@JE5!$|E>(OKV(|LbgmnK64_u;|(A){H&){qu0)&UArS~W_YmZ}oP^OI2X z^`6V7-Y^}M?nQ6BQ(J8=O`SeQ!ld1;1rzJJLbqvK|v0>>H=fAH0OT%&kHD1o9W;yL}|(pOE3u$OKj%{sfF-K4!G(H^2< z*DcZ>w|V;HY$lObs2p_bo>?ojTCf2>qrEqwH(c4ivO}(pdNavkIzPLgTY7M3$(F&m z^YXYT=~3jEi-+osm$QiXaUe0Mc_6&#OHn~PAZj}N#O4LZC|raXnsQr1jC2P*6`*t! zRF!P^vw9L!$~ga-kWnuO7$zdD-M~uk_$h)kb^7I$ORFA}e)a`|CFn?uBco0uE0O$- zsC3bdkb3LJ$q&hAFN8OW!zi8Npt$0(=QvpdG=($N51p9BnDLpF=5WboAU^fEEK04! zc(j8BOZ>kriHKk^?72h$E&vdB|BoltX^Pe0z>Q5!3`~Hxr1x7=qL(dT6-p1rgC8J4 zkpwJdWwt3ckYZjLw%FB;k@mwM^snW{zjgk$B~9xc9A3*0mS+u}rDWM>66&Dn!Ui)Y zpP2UZ*`C1j6zjX|LnnZku0wNb;Md|6$$4I>D$^>nj50!;S0`^icW7hlS8c&tNAU&}eCI{bOyNX> z{C%vRnf2-#&gET|x)Fn@t%(;$!4x5lz4ZxOI{+czf3^2dsCJCx@`IU@k2xAuisDQIA>C7WRCh z`)Zlhf)J(Zm>`tQX(oXGDrmow6Vfx7nMT)hYc{f&&S>qKCL6T~MC4KbdJ|kwUgCGR zm7Tc|?>ddVXLP)(rkZEABJB5|QOS4zfoim8o}^lrZn@w?Qfff zHsB@}P!I0uMRq986d!`}y!ifO8GXotTz@t}s+!(poyeuU(s{a|X2w2CU8RoL)om!)C%%gOTfJp4JZ$P7Q7SjN}r z>tXGn#?#c0mB!r*Gj<0z?{2P?x&@abXsekO^~OAGiOZcYj%H5HfAcr+&}sYj|ysLY5-^jUcvj zT0WKS9Mc4^RujRl9{itsaZm1Yof|eB(WA~@`*(~XR^xdj4rWRj-^tA7(AeJ-!ZJFU z@YUjidA9ml7MJEumM) zswj){M;ND&SsXfK3rVY=rNMoIa|7O4keFC1@y#V1X^xgEz&kjA3!h7GtlGA8O@v67 zhe3G=IpYSh#2?vNI?Flp5A8kxtNUj-K98GS8b5qkz6Kxa!CLHT}>QZAb@~?pe|INmu8slEGwd~J_fu|kLhd;Q2P3Ch7T+>sX3Ue?E)YBn1_ox8)qG~mB*WtKhxV|3{`%!^W=vht_DH2c4YxI23x3Z7P@}P zQ*&NE!(1=U=4T94op>19pnXJ|E@%9+U|ZF{T!2E$8|+J&o?wMnCD~M%rY0%x2gDo7 za(aPm*m1vg?3|q6H zM8+0_r@GIThYC#%gRg}Zz$)riD%IX{Um6)ay!K@+SSzXS$6ETk%x?^yK^T^>^Q}onW8zz}TQr;Y&3%DL<;@hZMph!1eT5%vqItN-?7QwEp37 z*0;7Xh7+r4Vwm|yP;O{GNMNm{{Jf;Rut#2&kg0^%wd?NqkfmsQy4WJKv*MriDZh6D zjn^4w;vNpv*GECN)Vae0GjSQw0fAUv&Yg`>{Ch&KXGctb+HG=*;rWgQ03dPx9suG^ zHL1r)$(wm}1dB3VW@5{=cc52N>!A_@sBKd}csql}EpH0CeEsFBXn*2?ZG*pOs)9I z!zE)kVV`T>gC$j4zBi$t|7@6P#56M0``Nb8CVI1^s8frv(JFQSaxG?!O8CI0U_cs6 zo9b3dL!jiEzAegxk10D?+Sq2RZH&J*YZt=U06BqynLi}Wk_P5_QF zTI;1=Jkb}&q5a8SP(j7RiWdx3Gu|?b{`GYxlC=?p4X~2Fw|W_!SUMHCs}Y0;i(~1M zB8Uj2=i57!;9PQcVc?89{@m`z1`qa^E%LtanktLY&oKz*mH>(8Z|>y`-SN^#&<9tB zEFc($k2Y~pV&mUhbJjaMtIm?(OPj2YB|f|pwgfs;d?#W%be9qFYNXzVQJA3&O<_0V zoB9gldj{?_6(#-+@Aojf@e>M#j~^w>d7i(|xs~sgyDyrSl0`U7_6i=!X6bqEDQGll z^3#hN@EPxvXpo~bN2>R_GaY`Z09dws8Yswp0jP;g?UxM-p|7GZ4_GRPUt1mJEWhqO zc=Kc^PDLZP7-CRTXaFm4k}4{qXw|e%TC^apSVT8s8@=mMiZeH%;5Li@5W)Sqo1CdO)VnQ zWu*k5jZ%aTYp-ynKbs(u(YIdAS9oNc>JcYj^IFyCgRAHlHR zKQ%ksy-c9mzB559mJ84T)4tY88TOTUcXHg`HS6uhD>*Z)!wP`CophTTE;_=A|KXr= zw3Pud8rwU0=qc;rRbPGzY4O;7C649G_~jH*KW%Je+{bo9Hgp&K2^TQC`(A6F9g^{u zE)p5n<(lMNi1W#67izysPjg=tnViJI%%Gr%CM?CH{i5vD&dH@dkeuj~`Y!3Qg+5xr z+S*uXg1uNx6QB7mtIeKezSG(+7|Jq<1@ny*gtmP@QT3EmXxV%*Kdb5^q~~Y$Rfqd< zbLWcek5jB?G~+Lp{@#}xKmLzZP}aS*!p0@}|H<0#bWI*rV#g2u-=ad4E|eOD4W+~W z0Yv55ga1T}DCP$slri)XmLw_ys*M%@`_76QrKLfAav(?1+S6gLfPbT`sAu-7SZS#D z_O93fw%-L76rY0zHk9+P%yLl2?s@cA-go2%|C?(70Aj!A_3y>P_ZM>Hqe1<&CkOv~ z*Z=??|4aQ=F9rXCEkeLQAnMAI4%<@nZ^=sx@@Hz`|M{!@??KQKf5B=e1?)7rzY^%I zfW4&nSKcat{;o{Nju=(xOo}b|Hp_B0+g}=;~yCOubTq^WdF4qm@#U>^&$9o6aUjg0D$hlfS6|}gee#$ b>h=gbz!LS!3XBSOBPI+Z0stti|A7Aoc{_d0 diff --git a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusClientMod.java b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusClientMod.java index a5236a2..6df8dd9 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusClientMod.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusClientMod.java @@ -24,18 +24,19 @@ package com.oroarmor.netherite_plus.client; -import java.util.LinkedList; -import java.util.Queue; - import com.oroarmor.netherite_plus.NetheritePlusMod; import com.oroarmor.netherite_plus.block.NetheritePlusBlocks; import com.oroarmor.netherite_plus.client.render.NetheriteBeaconBlockEntityRenderer; -import com.oroarmor.netherite_plus.client.render.NetheriteElytraFeatureRenderer; import com.oroarmor.netherite_plus.client.render.NetheritePlusBuiltinItemModelRenderer; import com.oroarmor.netherite_plus.client.render.NetheriteShulkerBoxBlockEntityRenderer; import com.oroarmor.netherite_plus.item.NetheritePlusItems; import com.oroarmor.netherite_plus.network.LavaVisionUpdatePacket; import com.oroarmor.netherite_plus.screen.NetheritePlusScreenHandlers; +import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.resource.ResourceType; import org.quiltmc.loader.api.ModContainer; import org.quiltmc.qsl.base.api.entrypoint.client.ClientModInitializer; import org.quiltmc.qsl.block.extensions.api.client.BlockRenderLayerMap; @@ -43,20 +44,9 @@ import org.quiltmc.qsl.networking.api.client.ClientPlayNetworking; import org.quiltmc.qsl.resource.loader.api.ResourceLoader; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.model.ArmorStandEntityModel; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.resource.ResourceType; +import java.util.LinkedList; +import java.util.Queue; -import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; -import net.fabricmc.fabric.api.client.rendering.v1.BuiltinItemRendererRegistry; -import net.fabricmc.fabric.api.client.rendering.v1.LivingEntityFeatureRendererRegistrationCallback; import static com.oroarmor.netherite_plus.NetheritePlusMod.id; public class NetheritePlusClientMod implements ClientModInitializer { @@ -87,12 +77,6 @@ public void onInitializeClient(ModContainer mod) { if (NetheritePlusMod.CONFIG.enabled.beacon.value()) { BlockRenderLayerMap.put(RenderLayer.getCutout(), NetheritePlusBlocks.NETHERITE_BEACON); } - - LivingEntityFeatureRendererRegistrationCallback.EVENT.register(((EntityType entityType, LivingEntityRenderer entityRenderer, LivingEntityFeatureRendererRegistrationCallback.RegistrationHelper registrationHelper, EntityRendererFactory.Context context) -> { - if (entityRenderer.getModel() instanceof PlayerEntityModel || entityRenderer.getModel() instanceof BipedEntityModel || entityRenderer.getModel() instanceof ArmorStandEntityModel) { - registrationHelper.register(new NetheriteElytraFeatureRenderer<>(entityRenderer, context.getModelLoader())); - } - })); } public static void registerBuiltinItemRenderers(MinecraftClient client) { diff --git a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java index a66e94d..4a1eeb0 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/NetheritePlusTextures.java @@ -33,6 +33,10 @@ public class NetheritePlusTextures { public static final Identifier NETHERITE_SHULKER_BOXES_ATLAS_TEXTURE = id("textures/atlas/netherite_shulker_boxes.png"); public static final Identifier NETHERITE_SHIELD_PATTERNS_ATLAS_TEXTURE = id("textures/atlas/netherite_shield_patterns.png"); + public static final Identifier NETHERITE_ELYTRA_SKIN = id("textures/entity/netherite_elytra.png"); + public static final Identifier NETHERITE_SHIELD_TEXTURE = id("textures/entity/netherite_shield_base.png"); + public static final Identifier NETHERITE_SHIELD_TEXTURE_NOPATTERN = id("textures/entity/netherite_shield_base_nopattern.png"); + public static final Identifier NETHERITE_TRIDENT_TEXTURE = id("textures/entity/netherite_trident.png"); //Shields with patterns need an atlas, supposedly public static final Material NETHERITE_SHIELD_BASE = new Material(NETHERITE_SHIELD_PATTERNS_ATLAS_TEXTURE, id("entity/netherite_shield_base")); diff --git a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheriteElytraFeatureRenderer.java b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheriteElytraFeatureRenderer.java deleted file mode 100644 index e744544..0000000 --- a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheriteElytraFeatureRenderer.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2021-2023 OroArmor (Eli Orona) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package com.oroarmor.netherite_plus.client.render; - -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.oroarmor.netherite_plus.item.NetheritePlusItems; - -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.PlayerModelPart; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.ElytraEntityModel; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.render.entity.model.EntityModelLayers; -import net.minecraft.client.render.entity.model.EntityModelLoader; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Identifier; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import static com.oroarmor.netherite_plus.NetheritePlusMod.id; - -@Environment(EnvType.CLIENT) -public class NetheriteElytraFeatureRenderer> extends FeatureRenderer { - public static final Identifier NETHERITE_ELYTRA_SKIN = id("textures/entity/netherite_elytra.png"); - private final ElytraEntityModel elytra; - - public NetheriteElytraFeatureRenderer(FeatureRendererContext featureRendererContext, EntityModelLoader entityModelLoader) { - super(featureRendererContext); - this.elytra = new ElytraEntityModel<>(entityModelLoader.getModelPart(EntityModelLayers.ELYTRA)); - } - - @Override - public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { - ItemStack itemStack = livingEntity.getEquippedStack(EquipmentSlot.CHEST); - if (itemStack.isOf(NetheritePlusItems.NETHERITE_ELYTRA)) { - Identifier identifier4; - if (livingEntity instanceof AbstractClientPlayerEntity abstractClientPlayerEntity) { - if (abstractClientPlayerEntity.canRenderElytraTexture() && abstractClientPlayerEntity.getElytraTexture() != null) { - identifier4 = abstractClientPlayerEntity.getElytraTexture(); - } else if (abstractClientPlayerEntity.canRenderCapeTexture() && abstractClientPlayerEntity.getCapeTexture() != null && abstractClientPlayerEntity.isPartVisible(PlayerModelPart.CAPE)) { - identifier4 = abstractClientPlayerEntity.getCapeTexture(); - } else { - identifier4 = NETHERITE_ELYTRA_SKIN; - } - } else { - identifier4 = NETHERITE_ELYTRA_SKIN; - } - - matrixStack.push(); - matrixStack.translate(0.0D, 0.0D, 0.125D); - getContextModel().copyStateTo(this.elytra); - this.elytra.setAngles(livingEntity, f, g, j, k, l); - VertexConsumer vertexConsumer = ItemRenderer.getDirectItemGlintConsumer(vertexConsumerProvider, this.elytra.getLayer(identifier4), false, itemStack.hasGlint()); - this.elytra.render(matrixStack, vertexConsumer, i, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); - matrixStack.pop(); - } - } - -} diff --git a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java index b9a7c4d..1dcb0de 100644 --- a/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java +++ b/src/main/java/com/oroarmor/netherite_plus/client/render/NetheritePlusBuiltinItemModelRenderer.java @@ -103,7 +103,7 @@ public void renderShield(ShieldEntityModel model, ItemStack stack, ModelTransfor boolean bl = stack.getSubNbt("BlockEntityTag") != null; matrices.push(); matrices.scale(1.0F, -1.0F, -1.0F); - Identifier id = bl ? id("textures/entity/netherite_shield_base.png") : id("textures/entity/netherite_shield_base_nopattern.png"); + Identifier id = bl ? NetheritePlusTextures.NETHERITE_SHIELD_TEXTURE : NetheritePlusTextures.NETHERITE_SHIELD_TEXTURE_NOPATTERN; VertexConsumer vertexConsumer = ItemRenderer.getDirectItemGlintConsumer(vertexConsumers, model.getLayer(id), true, stack.hasGlint()); model.getHandle().render(matrices, vertexConsumer, light, overlay, 1.0F, 1.0F, 1.0F, 1.0F); if (bl) { @@ -119,7 +119,7 @@ public void renderShield(ShieldEntityModel model, ItemStack stack, ModelTransfor public static void renderTrident(TridentEntityModel model, ItemStack stack, ModelTransformationMode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { matrices.push(); matrices.scale(1.0F, -1.0F, -1.0F); - VertexConsumer vertexConsumer2 = ItemRenderer.getDirectItemGlintConsumer(vertexConsumers, model.getLayer(id("textures/entity/netherite_trident.png")), false, stack.hasGlint()); + VertexConsumer vertexConsumer2 = ItemRenderer.getDirectItemGlintConsumer(vertexConsumers, model.getLayer(NetheritePlusTextures.NETHERITE_TRIDENT_TEXTURE), false, stack.hasGlint()); model.render(matrices, vertexConsumer2, light, overlay, 1.0F, 1.0F, 1.0F, 1.0F); matrices.pop(); } diff --git a/src/main/java/com/oroarmor/netherite_plus/mixin/render/ElytraFeatureRendererMixin.java b/src/main/java/com/oroarmor/netherite_plus/mixin/render/ElytraFeatureRendererMixin.java new file mode 100644 index 0000000..158f276 --- /dev/null +++ b/src/main/java/com/oroarmor/netherite_plus/mixin/render/ElytraFeatureRendererMixin.java @@ -0,0 +1,58 @@ +/* + * MIT License + * + * Copyright (c) 2021-2023 OroArmor (Eli Orona) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.oroarmor.netherite_plus.mixin.render; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; +import com.oroarmor.netherite_plus.client.NetheritePlusTextures; +import com.oroarmor.netherite_plus.item.NetheritePlusItems; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.feature.ElytraFeatureRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(ElytraFeatureRenderer.class) +public class ElytraFeatureRendererMixin { + @ModifyExpressionValue(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/LivingEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z")) + private boolean canRender(boolean original, @Local(ordinal = 0) ItemStack stack, @Share("isNetheriteElytra") LocalBooleanRef ref) { + if (stack.isOf(NetheritePlusItems.NETHERITE_ELYTRA)) { + ref.set(true); + return true; + } + return original; + } + + @ModifyVariable(method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/LivingEntity;FFFFFF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;push()V")) + private Identifier putNewTexture(Identifier value, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, LivingEntity living, @Share("isNetheriteElytra") LocalBooleanRef ref) { + return ref.get() ? NetheritePlusTextures.NETHERITE_ELYTRA_SKIN : value; + } +} \ No newline at end of file diff --git a/src/main/resources/assets/netherite_plus/lang/en_us.json b/src/main/resources/assets/netherite_plus/lang/en_us.json index 549c793..130b9b6 100644 --- a/src/main/resources/assets/netherite_plus/lang/en_us.json +++ b/src/main/resources/assets/netherite_plus/lang/en_us.json @@ -121,5 +121,5 @@ "advancements.netherite_plus.netherite_horse_armor_special.description": "Ride a Horse with Netherite Horse Armor", "advancements.netherite_plus.netherite_shears.title": "Time for a haircut", "advancements.netherite_plus.netherite_shears.description": "Get a pair of netherite shears", - "stat.netherite_plus.netherite_elytra_flight_distance": "Distance by Netherite Elytra" + "stat.netherite_plus.netherite_elytra_flight_cm": "Distance by Netherite Elytra" } \ No newline at end of file diff --git a/src/main/resources/assets/netherite_plus/lang/pl_pl.json b/src/main/resources/assets/netherite_plus/lang/pl_pl.json index f696281..18ef705 100644 --- a/src/main/resources/assets/netherite_plus/lang/pl_pl.json +++ b/src/main/resources/assets/netherite_plus/lang/pl_pl.json @@ -116,5 +116,5 @@ "advancements.netherite_plus.netherite_fishing_rod_special.description": "Zacznij łowić w lawie za pomocą netherytowej wędki i złów pradawne zgliszcza", "advancements.netherite_plus.netherite_horse_armor_special.title": "Niezłe Lambo", "advancements.netherite_plus.netherite_horse_armor_special.description": "Wsiądź na konia z założoną netherytową końską zbroją", - "stat.netherite_plus.netherite_elytra_flight_distance": "Dystans przebyty przy użyciu netherytowej elytry" + "stat.netherite_plus.netherite_elytra_flight_cm": "Dystans przebyty przy użyciu netherytowej elytry" } \ No newline at end of file diff --git a/src/main/resources/assets/netherite_plus/lang/zh_cn.json b/src/main/resources/assets/netherite_plus/lang/zh_cn.json index 62b55e0..8c085d9 100644 --- a/src/main/resources/assets/netherite_plus/lang/zh_cn.json +++ b/src/main/resources/assets/netherite_plus/lang/zh_cn.json @@ -41,11 +41,11 @@ "item.netherite_plus.netherite_crossbow": "下界合金弩", "item.netherite_plus.netherite_horse_armor": "下界合金马铠", "warning.netherite_elytra.trinkets": "无法装备在胸甲栏", - "stat.netherite_plus.netherite_elytra_flight_distance": "使用下界合金鞘翅飞行时间", + "stat.netherite_plus.netherite_elytra_flight_cm": "使用下界合金鞘翅飞行时间", "block.netherite_plus.netherite_beacon": "下界合金信标", "item.netherite_plus.netherite_trident": "下界合金三叉戟", "block.netherite_plus.netherite_anvil": "下界合金铁砧", "item.netherite_plus.netherite_shears": "下界合金剪刀", "block.netherite_plus.netherite_beacon.tertiary": "副效果", "effect.netherite_plus.lava_vision": "岩浆夜视" -} +} \ No newline at end of file diff --git a/src/main/resources/netherite_plus.mixins.json b/src/main/resources/netherite_plus.mixins.json index 263d25d..dfa278e 100644 --- a/src/main/resources/netherite_plus.mixins.json +++ b/src/main/resources/netherite_plus.mixins.json @@ -16,6 +16,7 @@ "client": [ "ClientPlayNetworkHandlerAccessor", "ClientPlayNetworkHandlerMixin", + "render.ElytraFeatureRendererMixin", "render.BackgroundRendererMixin", "render.ItemRendererAccessor", "render.ItemRendererMixin", From d76d512909e5147750cf3c0d08245a11c91c141b Mon Sep 17 00:00:00 2001 From: Roadhog360 Date: Sat, 29 Jun 2024 17:14:58 -0500 Subject: [PATCH 12/12] Update MultiItemLib, proper Maven integration --- build.gradle | 6 ++---- libs/multi-item-lib-1.6.3.jar | Bin 27540 -> 0 bytes src/main/resources/quilt.mod.json | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) delete mode 100644 libs/multi-item-lib-1.6.3.jar diff --git a/build.gradle b/build.gradle index a73622c..2e3bed0 100644 --- a/build.gradle +++ b/build.gradle @@ -71,9 +71,7 @@ dependencies { modImplementation "org.quiltmc:qsl:${project.qsl_version}" modImplementation "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${project.qfapi_version}" -// modImplementation "com.oroarmor:multi-item-lib:1.6.2" -//Temporary - modImplementation files('libs/multi-item-lib-1.6.3.jar') + modImplementation "com.oroarmor:multi-item-lib:1.7.0" modCompileOnly("com.github.CrimsonDawn45:Fabric-Shield-Lib:1.7.2-1.20.2") modRuntimeOnly("com.terraformersmc:modmenu:7.2.1") @@ -128,4 +126,4 @@ task github(type: PublishProjectToGithubTask) { import com.oroarmor.orogradleplugin.minecraft.* task curseforge(type: CurseforgePublishTask) -task modrinth(type: ModrinthPublishTask) \ No newline at end of file +task modrinth(type: ModrinthPublishTask) diff --git a/libs/multi-item-lib-1.6.3.jar b/libs/multi-item-lib-1.6.3.jar deleted file mode 100644 index 0c112b4465e0d992e3d0c15c31967cdaae3fdaf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27540 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.6.3" + "versions": ">=1.7.0" } ] }, @@ -56,4 +56,4 @@ "environment": "*" }, "schema_version": 1 -} \ No newline at end of file +}