From 7f704a4c0528da4d39f4c20849fe152611e997ad Mon Sep 17 00:00:00 2001 From: bconlon Date: Thu, 25 Apr 2024 17:09:40 -0700 Subject: [PATCH] build(version): 1.4.0->1.4.1 --- .circleci/continue_config.yml | 2 +- docs/CHANGELOG.md | 15 +++ gradle.properties | 2 +- .../1742123cf955ee7ecf092ba55decb836aa65bc2c | 6 +- .../models/block/potted_berry_bush.json | 108 +++++++++++++++--- .../models/block/potted_berry_bush_stem.json | 108 +++++++++++++++--- .../client/event/hooks/HandRenderHooks.java | 2 +- .../client/renderer/AetherModelLayers.java | 1 + .../client/renderer/AetherRenderers.java | 28 ++++- .../client/renderer/block/FastModel.java | 31 +++++ .../entity/layers/MoaHatEmissiveLayer.java | 75 ++++++++++++ .../renderer/entity/layers/MoaHatLayer.java | 74 ++++++++++++ .../entity/layers/MoaSaddleEmissiveLayer.java | 2 +- .../entity/layers/QuadrupedWingsLayer.java | 3 +- .../entity/layers/ValkyrieWingsLayer.java | 3 +- .../providers/AetherBlockStateProvider.java | 18 ++- .../aether/entity/ai/goal/MoaFollowGoal.java | 5 + .../aether/entity/monster/Swet.java | 2 +- .../aether/entity/passive/Aerbunny.java | 28 ++++- .../aetherteam/aether/entity/passive/Moa.java | 16 ++- .../aether/perk/types/MoaSkins.java | 101 ++++++++++++---- .../textures/block/natural/berry_bush.png | Bin 3446 -> 332 bytes .../block/natural/potted_berry_bush.png | Bin 496 -> 266 bytes .../block/natural/potted_berry_bush_stem.png | Bin 536 -> 283 bytes .../battle_sentry_moa_hat.png | Bin 0 -> 904 bytes .../battle_sentry_moa_hat_emissive.png | Bin 0 -> 248 bytes .../battle_sentry_moa_saddle.png | Bin 1330 -> 734 bytes .../battle_sentry_moa_saddle_emissive.png | Bin 276 -> 216 bytes .../moa/skins/boko_yellow/boko_yellow_hat.png | Bin 0 -> 1663 bytes .../skins/boko_yellow/boko_yellow_saddle.png | Bin 1660 -> 848 bytes .../construction_bot/construction_bot_hat.png | Bin 0 -> 2381 bytes .../construction_bot_saddle.png | Bin 2381 -> 270 bytes .../crookjaw_purple/crookjaw_purple_hat.png | Bin 0 -> 650 bytes .../crookjaw_purple_saddle.png | Bin 987 -> 795 bytes .../skins/gargoyle_moa/gargoyle_moa_hat.png | Bin 0 -> 612 bytes .../gargoyle_moa/gargoyle_moa_saddle.png | Bin 922 -> 634 bytes .../gilded_gharrix/gilded_gharrix_hat.png | Bin 0 -> 10130 bytes .../gilded_gharrix/gilded_gharrix_saddle.png | Bin 10187 -> 979 bytes .../skins/halcian_pink/halcian_pink_hat.png | Bin 0 -> 811 bytes .../halcian_pink/halcian_pink_saddle.png | Bin 1240 -> 798 bytes .../moa/skins/molten_moa/molten_moa_hat.png | Bin 0 -> 1625 bytes .../skins/molten_moa/molten_moa_saddle.png | Bin 1623 -> 800 bytes .../moa/skins/undead_moa/undead_moa_hat.png | Bin 0 -> 598 bytes .../skins/undead_moa/undead_moa_saddle.png | Bin 895 -> 619 bytes .../skins/valkyrie_moa/valkyrie_moa_hat.png | Bin 0 -> 934 bytes .../valkyrie_moa/valkyrie_moa_saddle.png | Bin 1386 -> 773 bytes update.json | 10 +- 47 files changed, 562 insertions(+), 78 deletions(-) create mode 100644 src/main/java/com/aetherteam/aether/client/renderer/block/FastModel.java create mode 100644 src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaHatEmissiveLayer.java create mode 100644 src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaHatLayer.java create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_hat_emissive.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/boko_yellow/boko_yellow_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/crookjaw_purple/crookjaw_purple_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/halcian_pink/halcian_pink_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa_hat.png create mode 100644 src/main/resources/assets/aether/textures/entity/mobs/moa/skins/valkyrie_moa/valkyrie_moa_hat.png diff --git a/.circleci/continue_config.yml b/.circleci/continue_config.yml index 709bb02d72..d4cc0bbab8 100644 --- a/.circleci/continue_config.yml +++ b/.circleci/continue_config.yml @@ -6,7 +6,7 @@ orbs: parameters: artifact-name: type: string - default: aether-1.19.4-1.4.0-forge.jar + default: aether-1.19.4-1.4.1-forge.jar deploy-branch: type: string default: 1.20.1-develop diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b1bf51af41..60df533db7 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,3 +1,18 @@ +# The Aether - Forge - 1.19.4-1.4.1 + +Changes + +- Rework the follow behavior for Moas now be controlled by shift right-clicking with a Nature Staff instead of by empty hand. +- Split some Moa Skin elements between the saddle layer and a hat layer. +- Make the Berry Bush model opaque with the fast graphics option. + +Fixes + +- Fix Aerbunny boosts sometimes not resetting from jumping on Blue Aerclouds. +- Fix speed effects not working on Swets and Moas. +- Fix the wings of Phygs, Flying Cows, and Valkyries not flashing red when hit. +- Fix gloves letting the sleeve layer clip through them slightly. + # The Aether - Forge - 1.19.4-1.4.0 Additions diff --git a/gradle.properties b/gradle.properties index a8cee2674a..b421410077 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +z# Sets default memory used for gradle commands. Can be overridden by user or command line properties. # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false diff --git a/src/generated/resources/.cache/1742123cf955ee7ecf092ba55decb836aa65bc2c b/src/generated/resources/.cache/1742123cf955ee7ecf092ba55decb836aa65bc2c index 28e40e1e61..d93961cdbf 100644 --- a/src/generated/resources/.cache/1742123cf955ee7ecf092ba55decb836aa65bc2c +++ b/src/generated/resources/.cache/1742123cf955ee7ecf092ba55decb836aa65bc2c @@ -1,4 +1,4 @@ -// 1.19.4 2024-01-01T14:23:34.4917018 Block States: aether +// 1.19.4 2024-04-25T17:08:22.5771969 Block States: aether 79cb0c0ea34a92e86b03080a209cb60f268cb31e assets/aether/blockstates/aerogel.json 28f7eea22b621bda459b2328c2252cdebe0bcdb9 assets/aether/blockstates/aerogel_slab.json 0866f96b2339b894ff4c8a01aebb3d87103eb0fb assets/aether/blockstates/aether_dirt.json @@ -246,8 +246,8 @@ a8854a5e210ca69e33042bfe746e6971e6a099b4 assets/aether/models/block/mossy_holyst cb2a8ab22c6bfe0e3353c310af35d8e990e9f926 assets/aether/models/block/pillar_horizontal.json 45eca4fd51bdc28e50e4ba3f0587c76d9f7f4450 assets/aether/models/block/pillar_top.json f4e9ea5d483484d62b4b6de8aea208b28a2e485c assets/aether/models/block/pillar_top_horizontal.json -402b62a8443994b9cf239cc5db1a8ddbb30cc007 assets/aether/models/block/potted_berry_bush.json -62591dd2d094bff022d534b7b91295e86a1e649b assets/aether/models/block/potted_berry_bush_stem.json +c555738f3c7edf5fbed00421dda5626335df4be2 assets/aether/models/block/potted_berry_bush.json +60782e46f7fdcad6bb7c691dd203caebc00738fc assets/aether/models/block/potted_berry_bush_stem.json 7c3a50c0820e7cf446e38e18b7cd7ec07d831566 assets/aether/models/block/potted_golden_oak_sapling.json eb9987a5ae084a2563cf1b396202a09d77a8877e assets/aether/models/block/potted_purple_flower.json eda9086f5b2a7381d2f2ef777f0196e2a17af85a assets/aether/models/block/potted_skyroot_sapling.json diff --git a/src/generated/resources/assets/aether/models/block/potted_berry_bush.json b/src/generated/resources/assets/aether/models/block/potted_berry_bush.json index e40401138d..291666951a 100644 --- a/src/generated/resources/assets/aether/models/block/potted_berry_bush.json +++ b/src/generated/resources/assets/aether/models/block/potted_berry_bush.json @@ -153,24 +153,24 @@ "north": { "texture": "#stem", "uv": [ - 0.0, - 4.0, - 16.0, + 7.0, + 14.0, + 9.0, 16.0 ] }, "south": { "texture": "#stem", "uv": [ - 0.0, - 4.0, - 16.0, + 7.0, + 14.0, + 9.0, 16.0 ] } }, "from": [ - 1, + 7, 4, 8 ], @@ -183,6 +183,47 @@ 8 ] }, + "to": [ + 9, + 6, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#stem", + "uv": [ + 1.0, + 4.0, + 15.0, + 14.0 + ] + }, + "south": { + "texture": "#stem", + "uv": [ + 1.0, + 4.0, + 15.0, + 14.0 + ] + } + }, + "from": [ + 1, + 6, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ] + }, "to": [ 15, 16, @@ -194,18 +235,18 @@ "east": { "texture": "#stem", "uv": [ - 0.0, - 4.0, - 16.0, + 7.0, + 14.0, + 9.0, 16.0 ] }, "west": { "texture": "#stem", "uv": [ - 0.0, - 4.0, - 16.0, + 7.0, + 14.0, + 9.0, 16.0 ] } @@ -213,6 +254,47 @@ "from": [ 8, 4, + 7 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ] + }, + "to": [ + 8, + 6, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#stem", + "uv": [ + 1.0, + 4.0, + 15.0, + 14.0 + ] + }, + "west": { + "texture": "#stem", + "uv": [ + 1.0, + 4.0, + 15.0, + 14.0 + ] + } + }, + "from": [ + 8, + 6, 1 ], "rotation": { diff --git a/src/generated/resources/assets/aether/models/block/potted_berry_bush_stem.json b/src/generated/resources/assets/aether/models/block/potted_berry_bush_stem.json index 27fb76879c..c3e3cb6c4e 100644 --- a/src/generated/resources/assets/aether/models/block/potted_berry_bush_stem.json +++ b/src/generated/resources/assets/aether/models/block/potted_berry_bush_stem.json @@ -153,24 +153,24 @@ "north": { "texture": "#stem", "uv": [ - 0.0, - 4.0, - 16.0, + 7.0, + 14.0, + 9.0, 16.0 ] }, "south": { "texture": "#stem", "uv": [ - 0.0, - 4.0, - 16.0, + 7.0, + 14.0, + 9.0, 16.0 ] } }, "from": [ - 1, + 7, 4, 8 ], @@ -183,6 +183,47 @@ 8 ] }, + "to": [ + 9, + 6, + 8 + ] + }, + { + "faces": { + "north": { + "texture": "#stem", + "uv": [ + 1.0, + 4.0, + 15.0, + 14.0 + ] + }, + "south": { + "texture": "#stem", + "uv": [ + 1.0, + 4.0, + 15.0, + 14.0 + ] + } + }, + "from": [ + 1, + 6, + 8 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ] + }, "to": [ 15, 16, @@ -194,18 +235,18 @@ "east": { "texture": "#stem", "uv": [ - 0.0, - 4.0, - 16.0, + 7.0, + 14.0, + 9.0, 16.0 ] }, "west": { "texture": "#stem", "uv": [ - 0.0, - 4.0, - 16.0, + 7.0, + 14.0, + 9.0, 16.0 ] } @@ -213,6 +254,47 @@ "from": [ 8, 4, + 7 + ], + "rotation": { + "angle": 45.0, + "axis": "y", + "origin": [ + 8, + 8, + 8 + ] + }, + "to": [ + 8, + 6, + 9 + ] + }, + { + "faces": { + "east": { + "texture": "#stem", + "uv": [ + 1.0, + 4.0, + 15.0, + 14.0 + ] + }, + "west": { + "texture": "#stem", + "uv": [ + 1.0, + 4.0, + 15.0, + 14.0 + ] + } + }, + "from": [ + 8, + 6, 1 ], "rotation": { diff --git a/src/main/java/com/aetherteam/aether/client/event/hooks/HandRenderHooks.java b/src/main/java/com/aetherteam/aether/client/event/hooks/HandRenderHooks.java index e777f2dd36..c1a62788fb 100644 --- a/src/main/java/com/aetherteam/aether/client/event/hooks/HandRenderHooks.java +++ b/src/main/java/com/aetherteam/aether/client/event/hooks/HandRenderHooks.java @@ -148,7 +148,7 @@ public static void renderPlayerArm(ICurioRenderer renderer, ItemStack glovesStac if (isSlim) { offset = 5.65F; } - poseStack.translate(f * offset, 0.0F, 0.0F); + poseStack.translate(f * offset, 0.005F, 0.0F); switch (handRenderType) { case GLOVES -> ((GlovesRenderer) renderer).renderFirstPerson(glovesStack, poseStack, buffer, combinedLight, player, arm); case SHIELD_OF_REPULSION -> ((ShieldOfRepulsionRenderer) renderer).renderFirstPerson(glovesStack, poseStack, buffer, combinedLight, player, arm); diff --git a/src/main/java/com/aetherteam/aether/client/renderer/AetherModelLayers.java b/src/main/java/com/aetherteam/aether/client/renderer/AetherModelLayers.java index 08ad5481c1..568a2ce870 100644 --- a/src/main/java/com/aetherteam/aether/client/renderer/AetherModelLayers.java +++ b/src/main/java/com/aetherteam/aether/client/renderer/AetherModelLayers.java @@ -21,6 +21,7 @@ public class AetherModelLayers { public static final ModelLayerLocation SHEEPUFF_WOOL_PUFFED = register("sheepuff", "outer_puffed"); public static final ModelLayerLocation AERBUNNY = register("aerbunny"); public static final ModelLayerLocation MOA = register("moa"); + public static final ModelLayerLocation MOA_HAT = register("moa", "hat"); public static final ModelLayerLocation MOA_SADDLE = register("moa", "saddle"); public static final ModelLayerLocation AERWHALE = register("aerwhale"); public static final ModelLayerLocation AERWHALE_CLASSIC = register("aerwhale", "classic"); diff --git a/src/main/java/com/aetherteam/aether/client/renderer/AetherRenderers.java b/src/main/java/com/aetherteam/aether/client/renderer/AetherRenderers.java index bb7e6cb3b8..285f07c659 100644 --- a/src/main/java/com/aetherteam/aether/client/renderer/AetherRenderers.java +++ b/src/main/java/com/aetherteam/aether/client/renderer/AetherRenderers.java @@ -9,6 +9,7 @@ import com.aetherteam.aether.client.renderer.accessory.ShieldOfRepulsionRenderer; import com.aetherteam.aether.client.renderer.accessory.model.GlovesModel; import com.aetherteam.aether.client.renderer.accessory.model.PendantModel; +import com.aetherteam.aether.client.renderer.block.FastModel; import com.aetherteam.aether.client.renderer.blockentity.ChestMimicRenderer; import com.aetherteam.aether.client.renderer.blockentity.SkyrootBedRenderer; import com.aetherteam.aether.client.renderer.blockentity.TreasureChestRenderer; @@ -33,13 +34,21 @@ import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.ThrownItemRenderer; import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import top.theillusivec4.curios.api.client.CuriosRendererRegistry; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + @Mod.EventBusSubscriber(modid = Aether.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) public class AetherRenderers { @SubscribeEvent @@ -112,7 +121,8 @@ public static void registerLayerDefinitions(EntityRenderersEvent.RegisterLayerDe event.registerLayerDefinition(AetherModelLayers.SHEEPUFF_WOOL_PUFFED, () -> SheepuffWoolModel.createFurLayer(new CubeDeformation(3.75F), 2.0F)); event.registerLayerDefinition(AetherModelLayers.AERBUNNY, AerbunnyModel::createBodyLayer); event.registerLayerDefinition(AetherModelLayers.MOA, () -> MoaModel.createBodyLayer(CubeDeformation.NONE)); - event.registerLayerDefinition(AetherModelLayers.MOA_SADDLE, () -> MoaModel.createBodyLayer(new CubeDeformation(0.25F))); + event.registerLayerDefinition(AetherModelLayers.MOA_HAT, () -> MoaModel.createBodyLayer(new CubeDeformation(0.23F))); + event.registerLayerDefinition(AetherModelLayers.MOA_SADDLE, () -> MoaModel.createBodyLayer(new CubeDeformation(0.27F))); event.registerLayerDefinition(AetherModelLayers.AERWHALE, AerwhaleModel::createBodyLayer); event.registerLayerDefinition(AetherModelLayers.AERWHALE_CLASSIC, ClassicAerwhaleModel::createBodyLayer); @@ -197,4 +207,20 @@ public static void addPlayerLayers(EntityRenderersEvent.AddLayers event) { } } } + + @SubscribeEvent + public static void bakeModels(ModelEvent.ModifyBakingResult event) { + List> models = new ArrayList<>(); + for (Map.Entry model : event.getModels().entrySet()) { + if (model.getKey().getNamespace().equals(Aether.MODID)) { + String path = model.getKey().getPath(); + if (path.equals(BuiltInRegistries.BLOCK.getKey(AetherBlocks.BERRY_BUSH.get()).getPath())) { + models.add(model); + } else if (path.equals(BuiltInRegistries.BLOCK.getKey(AetherBlocks.BERRY_BUSH.get()).getPath())) { + models.add(model); + } + } + } + models.forEach(entry -> event.getModels().put(entry.getKey(), new FastModel(entry.getValue()))); + } } diff --git a/src/main/java/com/aetherteam/aether/client/renderer/block/FastModel.java b/src/main/java/com/aetherteam/aether/client/renderer/block/FastModel.java new file mode 100644 index 0000000000..5c30d4d92f --- /dev/null +++ b/src/main/java/com/aetherteam/aether/client/renderer/block/FastModel.java @@ -0,0 +1,31 @@ +package com.aetherteam.aether.client.renderer.block; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.ChunkRenderTypeSet; +import net.minecraftforge.client.model.BakedModelWrapper; +import net.minecraftforge.client.model.data.ModelData; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class FastModel extends BakedModelWrapper { + public FastModel(BakedModel originalModel) { + super(originalModel); + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData extraData, @Nullable RenderType renderType) { + return super.getQuads(state, side, rand, extraData, null); + } + + @Override + public ChunkRenderTypeSet getRenderTypes(BlockState state, RandomSource rand, ModelData data) { + return ChunkRenderTypeSet.of(Minecraft.useFancyGraphics() ? RenderType.cutoutMipped() : RenderType.solid()); + } +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaHatEmissiveLayer.java b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaHatEmissiveLayer.java new file mode 100644 index 0000000000..2f8e61a9a2 --- /dev/null +++ b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaHatEmissiveLayer.java @@ -0,0 +1,75 @@ +package com.aetherteam.aether.client.renderer.entity.layers; + +import com.aetherteam.aether.client.gui.screen.perks.MoaSkinsScreen; +import com.aetherteam.aether.client.renderer.entity.model.MoaModel; +import com.aetherteam.aether.entity.passive.Moa; +import com.aetherteam.aether.perk.data.ClientMoaSkinPerkData; +import com.aetherteam.aether.perk.types.MoaData; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; + +import javax.annotation.Nullable; +import java.util.Map; +import java.util.UUID; + +public class MoaHatEmissiveLayer extends RenderLayer { + private final MoaModel hat; + + public MoaHatEmissiveLayer(RenderLayerParent entityRenderer, MoaModel hatModel) { + super(entityRenderer); + this.hat = hatModel; + } + + /** + * Renders an emissive hat layer on a Moa if the texture from a {@link com.aetherteam.aether.perk.types.MoaSkins.MoaSkin} is present. + * + * @param poseStack The rendering {@link PoseStack}. + * @param buffer The rendering {@link MultiBufferSource}. + * @param packedLight The {@link Integer} for the packed lighting for rendering. + * @param moa The {@link Moa} entity. + * @param limbSwing The {@link Float} for the limb swing rotation. + * @param limbSwingAmount The {@link Float} for the limb swing amount. + * @param partialTicks The {@link Float} for the game's partial ticks. + * @param ageInTicks The {@link Float} for the entity's age in ticks. + * @param netHeadYaw The {@link Float} for the head yaw rotation. + * @param headPitch The {@link Float} for the head pitch rotation. + */ + @Override + public void render(PoseStack poseStack, MultiBufferSource buffer, int packedLight, Moa moa, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + ResourceLocation texture = this.getMoaSkinLocation(moa); + if (texture != null && !moa.isInvisible()) { + RenderType renderType = RenderType.eyes(texture); + this.getParentModel().copyPropertiesTo(this.hat); + this.hat.prepareMobModel(moa, limbSwing, limbSwingAmount, partialTicks); + this.hat.setupAnim(moa, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + VertexConsumer consumer = buffer.getBuffer(renderType); + this.hat.renderToBuffer(poseStack, consumer, 15728640, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } + + /** + * Retrieves the hat emissive texture for the player's {@link com.aetherteam.aether.perk.types.MoaSkins.MoaSkin}, if there is one and the player has a Moa Skin. + * + * @param moa The {@link Moa} to retrieve the skin from. + * @return The {@link ResourceLocation} for the hat texture. + */ + @Nullable + private ResourceLocation getMoaSkinLocation(Moa moa) { + UUID lastRiderUUID = moa.getLastRider(); + UUID moaUUID = moa.getMoaUUID(); + Map userSkinsData = ClientMoaSkinPerkData.INSTANCE.getClientPerkData(); + if (Minecraft.getInstance().screen instanceof MoaSkinsScreen moaSkinsScreen && moaSkinsScreen.getSelectedSkin() != null && moaSkinsScreen.getPreviewMoa() != null && moaSkinsScreen.getPreviewMoa().getMoaUUID() != null && moaSkinsScreen.getPreviewMoa().getMoaUUID().equals(moaUUID)) { + return moaSkinsScreen.getSelectedSkin().getHatEmissiveLocation(); + } else if (userSkinsData.containsKey(lastRiderUUID) && userSkinsData.get(lastRiderUUID).moaUUID() != null && userSkinsData.get(lastRiderUUID).moaUUID().equals(moaUUID)) { + return userSkinsData.get(lastRiderUUID).moaSkin().getHatEmissiveLocation(); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaHatLayer.java b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaHatLayer.java new file mode 100644 index 0000000000..340e4ff437 --- /dev/null +++ b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaHatLayer.java @@ -0,0 +1,74 @@ +package com.aetherteam.aether.client.renderer.entity.layers; + +import com.aetherteam.aether.client.gui.screen.perks.MoaSkinsScreen; +import com.aetherteam.aether.client.renderer.entity.model.MoaModel; +import com.aetherteam.aether.entity.passive.Moa; +import com.aetherteam.aether.perk.data.ClientMoaSkinPerkData; +import com.aetherteam.aether.perk.types.MoaData; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; + +import javax.annotation.Nullable; +import java.util.Map; +import java.util.UUID; + +public class MoaHatLayer extends RenderLayer { + private final MoaModel hat; + + public MoaHatLayer(RenderLayerParent entityRenderer, MoaModel hatModel) { + super(entityRenderer); + this.hat = hatModel; + } + + /** + * Renders a hat layer on a Moa if the texture from a {@link com.aetherteam.aether.perk.types.MoaSkins.MoaSkin} is present. + * + * @param poseStack The rendering {@link PoseStack}. + * @param buffer The rendering {@link MultiBufferSource}. + * @param packedLight The {@link Integer} for the packed lighting for rendering. + * @param moa The {@link Moa} entity. + * @param limbSwing The {@link Float} for the limb swing rotation. + * @param limbSwingAmount The {@link Float} for the limb swing amount. + * @param partialTicks The {@link Float} for the game's partial ticks. + * @param ageInTicks The {@link Float} for the entity's age in ticks. + * @param netHeadYaw The {@link Float} for the head yaw rotation. + * @param headPitch The {@link Float} for the head pitch rotation. + */ + @Override + public void render(PoseStack poseStack, MultiBufferSource buffer, int packedLight, Moa moa, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + ResourceLocation texture = this.getMoaSkinLocation(moa); + if (texture != null && !moa.isInvisible()) { + this.getParentModel().copyPropertiesTo(this.hat); + this.hat.prepareMobModel(moa, limbSwing, limbSwingAmount, partialTicks); + this.hat.setupAnim(moa, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); + VertexConsumer consumer = buffer.getBuffer(RenderType.entityCutoutNoCull(texture)); + this.hat.renderToBuffer(poseStack, consumer, packedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } + + /** + * Retrieves the hat texture for the player's {@link com.aetherteam.aether.perk.types.MoaSkins.MoaSkin}, if there is one and the player has a Moa Skin. + * + * @param moa The {@link Moa} to retrieve the skin from. + * @return The {@link ResourceLocation} for the hat texture. + */ + @Nullable + private ResourceLocation getMoaSkinLocation(Moa moa) { + UUID lastRiderUUID = moa.getLastRider(); + UUID moaUUID = moa.getMoaUUID(); + Map userSkinsData = ClientMoaSkinPerkData.INSTANCE.getClientPerkData(); + if (Minecraft.getInstance().screen instanceof MoaSkinsScreen moaSkinsScreen && moaSkinsScreen.getSelectedSkin() != null && moaSkinsScreen.getPreviewMoa() != null && moaSkinsScreen.getPreviewMoa().getMoaUUID() != null && moaSkinsScreen.getPreviewMoa().getMoaUUID().equals(moaUUID)) { + return moaSkinsScreen.getSelectedSkin().getHatLocation(); + } else if (userSkinsData.containsKey(lastRiderUUID) && userSkinsData.get(lastRiderUUID).moaUUID() != null && userSkinsData.get(lastRiderUUID).moaUUID().equals(moaUUID)) { + return userSkinsData.get(lastRiderUUID).moaSkin().getHatLocation(); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaSaddleEmissiveLayer.java b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaSaddleEmissiveLayer.java index cd4e1b580b..92c7dec126 100644 --- a/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaSaddleEmissiveLayer.java +++ b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaSaddleEmissiveLayer.java @@ -50,7 +50,7 @@ public void render(PoseStack poseStack, MultiBufferSource buffer, int packedLigh this.saddle.prepareMobModel(moa, limbSwing, limbSwingAmount, partialTicks); this.saddle.setupAnim(moa, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); VertexConsumer consumer = buffer.getBuffer(renderType); - this.saddle.renderToBuffer(poseStack, consumer, packedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + this.saddle.renderToBuffer(poseStack, consumer, 15728640, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); } } } diff --git a/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/QuadrupedWingsLayer.java b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/QuadrupedWingsLayer.java index 94360cc4ef..c70b2ddf08 100644 --- a/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/QuadrupedWingsLayer.java +++ b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/QuadrupedWingsLayer.java @@ -7,6 +7,7 @@ import net.minecraft.client.model.QuadrupedModel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -44,7 +45,7 @@ public void render(PoseStack poseStack, MultiBufferSource buffer, int packedLigh } this.wings.setupAnim(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch); VertexConsumer consumer = buffer.getBuffer(RenderType.entityCutoutNoCull(this.resourceLocation)); - this.wings.renderToBuffer(poseStack, consumer, packedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + this.wings.renderToBuffer(poseStack, consumer, packedLight, LivingEntityRenderer.getOverlayCoords(entity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); } } } diff --git a/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/ValkyrieWingsLayer.java b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/ValkyrieWingsLayer.java index 7c64d4dd4a..35d597cdf8 100644 --- a/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/ValkyrieWingsLayer.java +++ b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/ValkyrieWingsLayer.java @@ -8,6 +8,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -42,7 +43,7 @@ public void render(PoseStack poseStack, MultiBufferSource buffer, int packedLigh this.setupWingRotation(valkyrie, ageInTicks); VertexConsumer consumer = buffer.getBuffer(RenderType.entityCutoutNoCull(this.wingsLocation)); if (!valkyrie.isInvisible()) { - this.wings.renderToBuffer(poseStack, consumer, packedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + this.wings.renderToBuffer(poseStack, consumer, packedLight, LivingEntityRenderer.getOverlayCoords(valkyrie, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F); } } diff --git a/src/main/java/com/aetherteam/aether/data/providers/AetherBlockStateProvider.java b/src/main/java/com/aetherteam/aether/data/providers/AetherBlockStateProvider.java index 012535715b..88b1825311 100644 --- a/src/main/java/com/aetherteam/aether/data/providers/AetherBlockStateProvider.java +++ b/src/main/java/com/aetherteam/aether/data/providers/AetherBlockStateProvider.java @@ -212,12 +212,18 @@ public BlockModelBuilder pottedStemModel(Block block, Block stem, String locatio .element().from(6.0F, 0.0F, 6.0F).to(10.0F, 4.0F, 10.0F) .face(Direction.UP).uvs(6.0F, 6.0F, 10.0F, 10.0F).texture("#dirt").end() .face(Direction.DOWN).uvs(6.0F, 12.0F, 10.0F, 16.0F).texture("#flowerpot").cullface(Direction.DOWN).end().end() - .element().from(1.0F, 4.0F, 8.0F).to(15.0F, 16.0F, 8.0F).rotation().angle(45.0F).axis(Direction.Axis.Y).origin(8.0F, 8.0F, 8.0F).end() - .face(Direction.NORTH).uvs(0.0F, 4.0F, 16.0F, 16.0F).texture("#stem").end() - .face(Direction.SOUTH).uvs(0.0F, 4.0F, 16.0F, 16.0F).texture("#stem").end().end() - .element().from(8.0F, 4.0F, 1.0F).to(8.0F, 16.0F, 15.0F).rotation().angle(45.0F).axis(Direction.Axis.Y).origin(8.0F, 8.0F, 8.0F).end() - .face(Direction.EAST).uvs(0.0F, 4.0F, 16.0F, 16.0F).texture("#stem").end() - .face(Direction.WEST).uvs(0.0F, 4.0F, 16.0F, 16.0F).texture("#stem").end().end(); + .element().from(7.0F, 4.0F, 8.0F).to(9.0F, 6.0F, 8.0F).rotation().angle(45.0F).axis(Direction.Axis.Y).origin(8.0F, 8.0F, 8.0F).end() + .face(Direction.NORTH).uvs(7.0F, 14.0F, 9.0F, 16.0F).texture("#stem").end() + .face(Direction.SOUTH).uvs(7.0F, 14.0F, 9.0F, 16.0F).texture("#stem").end().end() + .element().from(1.0F, 6.0F, 8.0F).to(15.0F, 16.0F, 8.0F).rotation().angle(45.0F).axis(Direction.Axis.Y).origin(8.0F, 8.0F, 8.0F).end() + .face(Direction.NORTH).uvs(1.0F, 4.0F, 15.0F, 14.0F).texture("#stem").end() + .face(Direction.SOUTH).uvs(1.0F, 4.0F, 15.0F, 14.0F).texture("#stem").end().end() + .element().from(8.0F, 4.0F, 7.0F).to(8.0F, 6.0F, 9.0F).rotation().angle(45.0F).axis(Direction.Axis.Y).origin(8.0F, 8.0F, 8.0F).end() + .face(Direction.EAST).uvs(7.0F, 14.0F, 9.0F, 16.0F).texture("#stem").end() + .face(Direction.WEST).uvs(7.0F, 14.0F, 9.0F, 16.0F).texture("#stem").end().end() + .element().from(8.0F, 6.0F, 1.0F).to(8.0F, 16.0F, 15.0F).rotation().angle(45.0F).axis(Direction.Axis.Y).origin(8.0F, 8.0F, 8.0F).end() + .face(Direction.EAST).uvs(1.0F, 4.0F, 15.0F, 14.0F).texture("#stem").end() + .face(Direction.WEST).uvs(1.0F, 4.0F, 15.0F, 14.0F).texture("#stem").end().end(); } public void pottedStem(Block stem, String location) { diff --git a/src/main/java/com/aetherteam/aether/entity/ai/goal/MoaFollowGoal.java b/src/main/java/com/aetherteam/aether/entity/ai/goal/MoaFollowGoal.java index 323738b4d6..7c4fe5182f 100644 --- a/src/main/java/com/aetherteam/aether/entity/ai/goal/MoaFollowGoal.java +++ b/src/main/java/com/aetherteam/aether/entity/ai/goal/MoaFollowGoal.java @@ -36,6 +36,11 @@ public boolean canUse() { return false; } else { this.player = this.moa.level.getNearestPlayer(this.targetingConditions, this.moa); + if (this.player != null) { + if (this.moa.distanceToSqr(this.player) >= 6.25) { + this.mob.getMoveControl().setWantedPosition(this.player.getX(), this.player.getY(), this.player.getZ(), this.speedModifier); + } + } return this.player != null; } } diff --git a/src/main/java/com/aetherteam/aether/entity/monster/Swet.java b/src/main/java/com/aetherteam/aether/entity/monster/Swet.java index be90c012b1..ef8eefcea8 100644 --- a/src/main/java/com/aetherteam/aether/entity/monster/Swet.java +++ b/src/main/java/com/aetherteam/aether/entity/monster/Swet.java @@ -430,7 +430,7 @@ public boolean canJump() { */ @Override public float getSteeringSpeed() { - return 0.084F; + return (float) (this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 0.21F); } /** diff --git a/src/main/java/com/aetherteam/aether/entity/passive/Aerbunny.java b/src/main/java/com/aetherteam/aether/entity/passive/Aerbunny.java index c76f1253e8..8c9bb49fc5 100644 --- a/src/main/java/com/aetherteam/aether/entity/passive/Aerbunny.java +++ b/src/main/java/com/aetherteam/aether/entity/passive/Aerbunny.java @@ -38,7 +38,10 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; +import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.common.ForgeMod; import javax.annotation.Nullable; @@ -103,7 +106,30 @@ public void tick() { this.setPuffiness(0); } this.handlePlayerInput(); - if (this.getVehicle() != null && (this.getVehicle().isOnGround() || this.getVehicle().isInFluidType())) { // Reset the last tracked fall position if the Aerbunny touches a surface. + + boolean blockIntersection = false; + if (this.getVehicle() != null) { + AABB vehicleBounds = this.getVehicle().getBoundingBox(); + BlockPos minPos = BlockPos.containing(vehicleBounds.minX, vehicleBounds.minY, vehicleBounds.minZ); + BlockPos maxPos = BlockPos.containing(vehicleBounds.maxX, vehicleBounds.maxY, vehicleBounds.maxZ); + for (int x = minPos.getX(); x <= maxPos.getX(); x++) { + for (int y = minPos.getY(); y <= maxPos.getY(); y++) { + for (int z = minPos.getZ(); z <= maxPos.getZ(); z++) { + BlockPos pos = BlockPos.containing(x, y, z); + BlockState blockState = this.getLevel().getBlockState(pos); + VoxelShape shape = blockState.getShape(this.getVehicle().getLevel(), this.getVehicle().blockPosition()); + for (AABB aabb : shape.toAabbs()) { + AABB offset = aabb.move(pos); + if (vehicleBounds.intersects(offset)) { + blockIntersection = true; + } + } + } + } + } + } + + if (this.getVehicle() != null && (this.getVehicle().isOnGround() || this.getVehicle().isInFluidType() || blockIntersection)) { // Reset the last tracked fall position if the Aerbunny this.lastPos = null; } } diff --git a/src/main/java/com/aetherteam/aether/entity/passive/Moa.java b/src/main/java/com/aetherteam/aether/entity/passive/Moa.java index d6340a8e73..c6bd32b45c 100644 --- a/src/main/java/com/aetherteam/aether/entity/passive/Moa.java +++ b/src/main/java/com/aetherteam/aether/entity/passive/Moa.java @@ -361,10 +361,18 @@ public void onJump(Mob mob) { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemStack = player.getItemInHand(hand); - if (this.isPlayerGrown() && itemStack.is(AetherItems.NATURE_STAFF.get())) { // Sits a tamed Moa down when right-clicked with a Nature Staff. - itemStack.hurtAndBreak(1, player, (p) -> p.broadcastBreakEvent(hand)); - this.setSitting(!this.isSitting()); - this.spawnExplosionParticle(); + if (this.isPlayerGrown() && itemStack.is(AetherItems.NATURE_STAFF.get())) { + if (player.isShiftKeyDown()) { // Toggles whether a tamed Moa will follow the player. + if (this.getFollowing() == null) { + this.setFollowing(player.getUUID()); + } else { + this.setFollowing(null); + } + } else { // Sits a tamed Moa down when right-clicked with a Nature Staff. + itemStack.hurtAndBreak(1, player, (p) -> p.broadcastBreakEvent(hand)); + this.setSitting(!this.isSitting()); + this.spawnExplosionParticle(); + } return InteractionResult.sidedSuccess(this.getLevel().isClientSide()); } else if (this.isPlayerGrown() && itemStack.isEmpty() && player.isShiftKeyDown()) { // Toggles whether a tamed Moa will follow the player. if (this.getFollowing() == null) { diff --git a/src/main/java/com/aetherteam/aether/perk/types/MoaSkins.java b/src/main/java/com/aetherteam/aether/perk/types/MoaSkins.java index a1331cdca7..b70fbe681d 100644 --- a/src/main/java/com/aetherteam/aether/perk/types/MoaSkins.java +++ b/src/main/java/com/aetherteam/aether/perk/types/MoaSkins.java @@ -25,7 +25,7 @@ public static void registerMoaSkins() { register(name, new MoaSkin(name, new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin." + name)) .userPredicate((user) -> PerkUtil.hasLifetimeAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/" + name + "_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/" + name + "_icon")) .skinLocation(moaType.getMoaTexture()) .saddleLocation(moaType.getSaddleTexture()) .info(new MoaSkin.Info(User.Tier.ASCENTAN, true)) @@ -34,7 +34,7 @@ public static void registerMoaSkins() { register("classic_moa", new MoaSkin("classic_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.classic_moa")) .userPredicate((user) -> PerkUtil.hasLifetimeAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/classic_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/classic_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/classic_moa.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/moa_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, true)) @@ -42,24 +42,26 @@ public static void registerMoaSkins() { register("boko_yellow", new MoaSkin("boko_yellow", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.boko_yellow")) .userPredicate((user) -> PerkUtil.hasLifetimeAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/boko_yellow_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/boko_yellow_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/boko_yellow/boko_yellow.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/boko_yellow/boko_yellow_hat.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/boko_yellow/boko_yellow_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, true)) )); register("crookjaw_purple", new MoaSkin("crookjaw_purple", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.crookjaw_purple")) .userPredicate((user) -> PerkUtil.hasLifetimeAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/crookjaw_purple_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/crookjaw_purple_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/crookjaw_purple/crookjaw_purple.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/crookjaw_purple/crookjaw_purple_emissive.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/crookjaw_purple/crookjaw_purple_hat.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/crookjaw_purple/crookjaw_purple_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, true)) )); register("gharrix_red", new MoaSkin("gharrix_red", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.gharrix_red")) .userPredicate((user) -> PerkUtil.hasLifetimeAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/gharrix_red_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/gharrix_red_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gharrix_red/gharrix_red.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gharrix_red/gharrix_red_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, true)) @@ -67,15 +69,16 @@ public static void registerMoaSkins() { register("halcian_pink", new MoaSkin("halcian_pink", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.halcian_pink")) .userPredicate((user) -> PerkUtil.hasLifetimeAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/halcian_pink_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/halcian_pink_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/halcian_pink/halcian_pink.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/halcian_pink/halcian_pink_hat.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/halcian_pink/halcian_pink_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, true)) )); register("tivalier_green", new MoaSkin("tivalier_green", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.tivalier_green")) .userPredicate((user) -> PerkUtil.hasLifetimeAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/tivalier_green_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/tivalier_green_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/tivalier_green/tivalier_green.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/tivalier_green/tivalier_green_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, true)) @@ -83,24 +86,27 @@ public static void registerMoaSkins() { register("gilded_gharrix", new MoaSkin("gilded_gharrix", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.gilded_gharrix")) .userPredicate((user) -> PerkUtil.hasAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/gilded_gharrix_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/gilded_gharrix_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix_hat.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, false)) )); register("gargoyle_moa", new MoaSkin("gargoyle_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.gargoyle_moa")) .userPredicate((user) -> PerkUtil.hasAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/gargoyle_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/gargoyle_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa_hat.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, false)) )); register("construction_bot", new MoaSkin("construction_bot", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.construction_bot")) .userPredicate((user) -> PerkUtil.hasAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/construction_bot_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/construction_bot_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/construction_bot/construction_bot.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/construction_bot/construction_bot_hat.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/construction_bot/construction_bot_emissive.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/construction_bot/construction_bot_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, false)) @@ -108,7 +114,7 @@ public static void registerMoaSkins() { register("mossy_statue_moa", new MoaSkin("mossy_statue_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.mossy_statue_moa")) .userPredicate((user) -> PerkUtil.hasAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/mossy_statue_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/mossy_statue_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/mossy_statue_moa/mossy_statue_moa.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/mossy_statue_moa/mossy_statue_moa_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, false)) @@ -116,7 +122,7 @@ public static void registerMoaSkins() { register("chicken_moa", new MoaSkin("chicken_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.chicken_moa")) .userPredicate((user) -> PerkUtil.hasAscentanMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/chicken_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/chicken_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/chicken_moa/chicken_moa.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/chicken_moa/chicken_moa_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, false)) @@ -124,7 +130,7 @@ public static void registerMoaSkins() { register("arctic_moa", new MoaSkin("arctic_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.arctic_moa")) .userPredicate((user) -> PerkUtil.hasLifetimeValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/arctic_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/arctic_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/arctic_moa/arctic_moa.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/arctic_moa/arctic_moa_saddle.png")) .info(new MoaSkin.Info(User.Tier.VALKYRIE, true)) @@ -132,7 +138,7 @@ public static void registerMoaSkins() { register("cockatrice_moa", new MoaSkin("cockatrice_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.cockatrice_moa")) .userPredicate((user) -> PerkUtil.hasLifetimeValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/cockatrice_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/cockatrice_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/cockatrice_moa/cockatrice_moa.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/cockatrice_moa/cockatrice_moa_emissive.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/cockatrice_moa/cockatrice_moa_saddle.png")) @@ -141,7 +147,7 @@ public static void registerMoaSkins() { register("phoenix_moa", new MoaSkin("phoenix_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.phoenix_moa")) .userPredicate((user) -> PerkUtil.hasLifetimeValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/phoenix_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/phoenix_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/phoenix_moa/phoenix_moa.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/phoenix_moa/phoenix_moa_emissive.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/phoenix_moa/phoenix_moa_saddle.png")) @@ -150,7 +156,7 @@ public static void registerMoaSkins() { register("sentry_moa", new MoaSkin("sentry_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.sentry_moa")) .userPredicate((user) -> PerkUtil.hasLifetimeValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/sentry_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/sentry_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/sentry_moa/sentry_moa.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/sentry_moa/sentry_moa_emissive.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/sentry_moa/sentry_moa_saddle.png")) @@ -159,17 +165,20 @@ public static void registerMoaSkins() { register("valkyrie_moa", new MoaSkin("valkyrie_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.valkyrie_moa")) .userPredicate((user) -> PerkUtil.hasLifetimeValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/valkyrie_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/valkyrie_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/valkyrie_moa/valkyrie_moa.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/valkyrie_moa/valkyrie_moa_hat.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/valkyrie_moa/valkyrie_moa_saddle.png")) .info(new MoaSkin.Info(User.Tier.VALKYRIE, true)) )); register("battle_sentry_moa", new MoaSkin("battle_sentry_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.battle_sentry_moa")) .userPredicate((user) -> PerkUtil.hasValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/battle_sentry_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/battle_sentry_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_emissive.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_hat.png")) + .hatEmissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_hat_emissive.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_saddle.png")) .saddleEmissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_saddle_emissive.png")) .info(new MoaSkin.Info(User.Tier.VALKYRIE, false)) @@ -177,7 +186,7 @@ public static void registerMoaSkins() { register("frozen_phoenix", new MoaSkin("frozen_phoenix", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.frozen_phoenix")) .userPredicate((user) -> PerkUtil.hasValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/frozen_phoenix_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/frozen_phoenix_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix_emissive.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix_saddle.png")) @@ -186,25 +195,27 @@ public static void registerMoaSkins() { register("molten_moa", new MoaSkin("molten_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.molten_moa")) .userPredicate((user) -> PerkUtil.hasValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/molten_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/molten_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/molten_moa/molten_moa.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/molten_moa/molten_moa_emissive.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/molten_moa/molten_moa_hat.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/molten_moa/molten_moa_saddle.png")) .info(new MoaSkin.Info(User.Tier.VALKYRIE, false)) )); register("undead_moa", new MoaSkin("undead_moa", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.undead_moa")) .userPredicate((user) -> PerkUtil.hasValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/undead_moa_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/undead_moa_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/undead_moa/undead_moa.png")) .emissiveLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/undead_moa/undead_moa_emissive.png")) + .hatLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/undead_moa/undead_moa_hat.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/undead_moa/undead_moa_saddle.png")) .info(new MoaSkin.Info(User.Tier.VALKYRIE, false)) )); register("stratus", new MoaSkin("stratus", new MoaSkin.Properties() .displayName(Component.translatable("gui.aether.moa_skins.skin.stratus")) .userPredicate((user) -> PerkUtil.hasValkyrieMoaSkins().test(user)) - .iconLocation(new ResourceLocation(Aether.MODID, "textures/gui/perks/skins/icons/stratus_icon.png")) + .iconLocation(new ResourceLocation(Aether.MODID, "skins/icons/stratus_icon")) .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/stratus/stratus.png")) .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/stratus/stratus_saddle.png")) .info(new MoaSkin.Info(User.Tier.VALKYRIE, false)) @@ -227,22 +238,28 @@ public static class MoaSkin { private final ResourceLocation skinLocation; @Nullable private final ResourceLocation emissiveLocation; + @Nullable + private final ResourceLocation hatLocation; + @Nullable + private final ResourceLocation hatEmissiveLocation; private final ResourceLocation saddleLocation; @Nullable private final ResourceLocation saddleEmissiveLocation; private final Info info; protected MoaSkin(String id, Properties properties) { - this(id, properties.displayName, properties.userPredicate, properties.iconLocation, properties.skinLocation, properties.emissiveLocation, properties.saddleLocation, properties.saddleEmissiveLocation, properties.info); + this(id, properties.displayName, properties.userPredicate, properties.iconLocation, properties.skinLocation, properties.emissiveLocation, properties.hatLocation, properties.hatEmissiveLocation, properties.saddleLocation, properties.saddleEmissiveLocation, properties.info); } - protected MoaSkin(String id, Component displayName, Predicate userPredicate, ResourceLocation iconLocation, ResourceLocation skinLocation, ResourceLocation emissiveLocation, ResourceLocation saddleLocation, ResourceLocation saddleEmissiveLocation, Info info) { + protected MoaSkin(String id, Component displayName, Predicate userPredicate, ResourceLocation iconLocation, ResourceLocation skinLocation, ResourceLocation emissiveLocation, ResourceLocation hatLocation, ResourceLocation hatEmissiveLocation, ResourceLocation saddleLocation, ResourceLocation saddleEmissiveLocation, Info info) { this.id = id; this.displayName = displayName; this.userPredicate = userPredicate; this.iconLocation = iconLocation; this.skinLocation = skinLocation; this.emissiveLocation = emissiveLocation; + this.hatLocation = hatLocation; + this.hatEmissiveLocation = hatEmissiveLocation; this.saddleLocation = saddleLocation; this.saddleEmissiveLocation = saddleEmissiveLocation; this.info = info; @@ -291,6 +308,20 @@ public ResourceLocation getEmissiveLocation() { return this.emissiveLocation; } + /** + * @return The {@link ResourceLocation} of the {@link MoaSkin}'s hat texture. + */ + public ResourceLocation getHatLocation() { + return this.hatLocation; + } + + /** + * @return The {@link ResourceLocation} of the {@link MoaSkin}'s hat emissive overlay texture. + */ + public ResourceLocation getHatEmissiveLocation() { + return this.hatEmissiveLocation; + } + /** * @return The {@link ResourceLocation} of the {@link MoaSkin}'s saddle texture. */ @@ -339,6 +370,10 @@ public static class Properties { private ResourceLocation skinLocation; @Nullable private ResourceLocation emissiveLocation = null; + @Nullable + private ResourceLocation hatLocation = null; + @Nullable + private ResourceLocation hatEmissiveLocation = null; private ResourceLocation saddleLocation; @Nullable private ResourceLocation saddleEmissiveLocation = null; @@ -384,6 +419,22 @@ public Properties emissiveLocation(@Nullable ResourceLocation emissiveLocation) return this; } + /** + * @see MoaSkin#getHatLocation() + */ + public Properties hatLocation(ResourceLocation hatLocation) { + this.hatLocation = hatLocation; + return this; + } + + /** + * @see MoaSkin#getHatEmissiveLocation() + */ + public Properties hatEmissiveLocation(ResourceLocation hatEmissiveLocation) { + this.hatEmissiveLocation = hatEmissiveLocation; + return this; + } + /** * @see MoaSkin#getSaddleLocation() */ @@ -414,4 +465,4 @@ public Properties info(Info info) { */ public record Info(User.Tier tier, boolean lifetime) { } } -} +} \ No newline at end of file diff --git a/src/main/resources/assets/aether/textures/block/natural/berry_bush.png b/src/main/resources/assets/aether/textures/block/natural/berry_bush.png index 08efd715b7a27276a7e25416e1fdb71316e362b4..aa838984e552ac4b99ee7fd17303bf8c24191d50 100644 GIT binary patch delta 305 zcmew+b%tqzNGZx^prw85kH?(j9#r85lP9bN@+X1@g55d_r7jAIQz`^VxK} z);-23ve@3u%|uO2#y4Yvu5Dy`_aU30;miJmTwAsWG|{hX7IDDW`X3U);P|G)e8sSv^A2@A#2 zjL(_-eU0ZW-nH?;4U;SPA|mI{a!l2oo&G+!N6_|t-si91I9u+--Cb@osY&s=TEF7b zg`W;vxU{SF`7Qmlv;R?ol{33_*sb}_y)mLQrY20fUKuTR^S6pznAegGS2eYABDOJg qSQWbN=c>3_dwy|^ri6pkZ+87EHiMj2PZyx;7(8A5T-G@yGywqrKz|GX delta 3422 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 delta 470 zcmeBT`oKIvrCue#C&ZP3f#LuE|M`7Bn{L<6K9HNUc_m{DOg87+?^(f9@PmoU_0qvY3H^?+6GpPSxg<1`6hRx;TbNOr6^A$alzq zhvj(R-GGn(x9>Wbd!})Pkok?r8R_*)r>fr%tYd7J;89|`V0Oa$`OC|z-!Rvh-4zoprEYHkak=AsYQC8o=*WY3H{e#E$thHN{_vzDD@kgGq z^~=)KcI>c9&q`~W*Ko}5SXjgP#$DFzzK)M4D=!J>YAIO}YV&Go*{;KKz7Li^{CeB0 zhBIlg)pEX^^fJzu=AA&PGNWy;{=A(qPx{cU;;8KjZ!K3@zX{wf{xkjdjA@FBvOqg# z*AzZNckz=Uqy^NsM6GZx^prw85kH?(j9#r85lP9bN@+X1@h$rd_r7fq8*cyy=EWC z-E_M)zt6|t*UUY}D6-hz!Bz{XWCFuy6(Ge`666>B9|jmUozXcD6y+@Nh%9Dc;5!1s zj8nDwq=AA3o-U3d8o_h>9Ql|HD>#^Wj|u$y|4?XK^~;SMsuv~REU16w&rtk+*;)&B zW-tC#?C)JHmmThod9Y-D&=kgP2}`)-Rw%Pc=-hSHTKuj{SV&NE_5G=SEb40cAKreH vzHDgTe~DWM4f!xCaM delta 490 zcmbQuG=pV=imOV1Plzi61H=FS|2N&PoqZrTzt1N**()a6F|yd+-`C7N#>l}|3n7q-BlQ=P)jK%^8v%F}Y(~^!AGT5)*a*H?($s|Hi#* z-hz;;iHSyE>o)-nYwys_yo-z;UQ`~P$5mCHe= zg!Xb(Y}+SYx#Z1bcE>}83|NpW(}dRi=bHkWRVFgr*tU0tl~HK3iVZ7=IH!ZyzWwK& zcqbLG3FuwV+s?~yHNzw!Qf$k$w7_oDt=EoiTJy1NZJ05`gWq-x30v}uc3*y3;Ood^ z$#Cj>?d81fAO9S-x^`+dH)rFuTW@6FE_(kpVD;6W_rGIIZP+atHt2Z&+?RhSp~J3f z#vkoD;-@!V_+G`)thj{t-?eMg7#k)}p3J`YnZ@zvQoYAsq;CzeIUH3f{C;1)-IBft ztGVaCb}cdr_@S1*HevHkll*;q9PYnfcr$0#<_NcWU4p;vDt1DXH_pYR(B7;F; z{&{8wJ$?O+yLNFgSlHY5Z|T2t)$H`g%ge91TxYp-x2&w}pQUT~>Z=jw|4w-P)3Tw! z_$-5?fW-OF3=X>b`pbhSF8H@8VHrcky!N7sg+A^=HEZV;&;Lr7qn?7neSg=9Sj{U~X@zv&s SrnCaH7K5j&pUXO@geCxh>zPUb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_hat_emissive.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_hat_emissive.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f4ac2d7bc6c07293b6c263d610d5433e1c6754 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0Vnyg-<-ysE?(DA?=i;uum9_x9F8-opk0tO45A)5@n_`1DRN zCT1F=Qfd34Z3Y)Z-IZD+yBhB+Ut_-}`_Wwws0{%e_8&W*I(ORdS%NRT_Wa9e?14!+ z1aE)7_2vA1Gi0q(p0GI2tKa{A`JQ{l%RV1{bAxeL(Cr%2@8!G>(p%3iw`2tAX-Hn0 XBRko`vwfa*H;C`)>gTe~DWM4fd6H9L literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_saddle.png index 2eee20b97f213e55f86aa0cec4156292632f3222..a98504bcf2b29cd4bb457a469d3c91c2ead1e993 100644 GIT binary patch literal 734 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 delta 198 zcmcb?IE86KSp7;*7srr_xVLu}Ju#I~>fblsUrZM$OBzdnz>+TO9Z&}~}$?z`=us_Zr~ z0o6Ttf8>JtvWiHi*+TXI^%uv(^e$-SD7If$x!hl?qEi0l1CJ+eM&-Ie2XlgQpRc}Y n|J#n?^oqANR_b8o25YC7&%5pWzxZ1xFG#@C)z4*}Q$iB}9c@t- diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/boko_yellow/boko_yellow_hat.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/boko_yellow/boko_yellow_hat.png new file mode 100644 index 0000000000000000000000000000000000000000..ba04d8ba6245e54fd43208ee9186848a9c747afd GIT binary patch literal 1663 zcmV-_27vjAP)^5F-b&0RCt{2obO8V0QWEnfTCv8KB#4^Ag&MD=T2FhY z^=`fOeuU|ZbGLW#Ja6N!hR%H8*yGvRc^;kb%sex@dxTO74!absbpV{Tg$sajgvZ_A z7F6()Pd}po$j2XjXlPlz?5cj(@H$yW*9fq=Yy<7R+mW}7?^-+EP~yPBJ+G}OFwW|r zO8|0g9?9}5+BH0x^L*FvB$Z?Hn2y8@365hvf{wBz>E217_T7Nwu+!f0^+=Xi!SDBD zw=;~fsejS}aqooF4FZHs3z}mbdISIfWI7U~0O0>Uh$n-0005R!MeFr%R#g(e-;eu4 zqd0WT&{#PpK!&@%DY$U!cRc`r-OhCH9*(+cWo0D*5X*R?Z9GU=p*S^xdC#<)pPe)?#xFm#TW!ihUgNxuLK$`+eBym-i zZ=o64bRV3;5ds5U0041&4Q$E~0Fe0jAXIyyP)b1vS*{qFb8e?wU*CfykmaMTBR!o+ zq7{3$l>q<-M}m-*1OVV%U3#?PNuaT4Q^3={8;D0@u$AvM)nR;m5Kp7OVQbYpn$6eQ zkJ^Jf000x=C{W(2o=unY~KB z9$sMYM=&&_0ssUGc|=>+D(61IHKy zNwmfAy;~aruK4Z|AbSMxb@l@QCc-kjZYl3Z z)I?b3L%#`-`nPwl+49QQ*$-Jspxje}*|~Ymu1*Qh+r~o?-1^DC>T&*`5ejYmLYI1a zP<{J4`%%5WB5&F5fdJk=b=Xk<939UCW$a%R~ zu>b%Nm(#JxXcYuVq79SNeE05UhED;E!}0vLx2fN{707)MJ2n;TA0NwksXFTT$z&~UPf z0zmuCK0_Y}RO>~KeS%A8k5ZS@u_zXf@hrOva60UOId9_-r^B8z1GNanCb;9|LK8r7 zaqih*ooIt3+Dvh7X5E~^5Sr?1Xn0nJ*Rvj?)v{`i+i&)vx#2|4bIH^*jEqguri_~)H5WKsYNF*ojpn=(Pr8|SQ2eyCK{uc&!5V&Cz7eGc*3(X!m~0a z!?RgO&dMnQKw^rrsF9oMYpBcVFuixVoDMQM9a+@dBT<X)&J(>M}Nj~V(%*i0L;wBFP}e!JA;2O^1Xq~5CEvyREEG< zaLMa$_5NyFY%HK{1vfP{rGFV@>T&wa#$6NuX=!OOJ&3jR%{u&E0ORnTK*r$$U>q(0 z#^C~B94-LH;R0YBE&#^i0$?020LI}0U>q(0#^C~B94-LH`4?~WJz9V0t4aU>002ov JPDHLkV1hrB3FZI* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/boko_yellow/boko_yellow_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/boko_yellow/boko_yellow_saddle.png index d7b595b9f06bbb995deb3a30432fd6f606adfd26..634a3595e1f49146516b09bb646e69304dcb635f 100644 GIT binary patch literal 848 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!QI^H16xYTyqN(KgI zCQlc~kcv5PZ*TOLPLw(J@wslhq3K%R$xclQQCz!jypmv7y`tLeEZeeXsggy>iyQU} z7B@EsFvVKQSfs3&;$z0rwa{76I#gh3v&w~tm3zM>Y3-3cRjqPu-o-Y#AJul|sOBfTguXCnMDRFRuqnte3-mE^9A{`rW;kTX@KB7)C(mrhTLy*=+^M#JQv z_T{^urvBr9FEpY4^S$U99q!iq7SBI^oS`A>?Sb3j7GJ8rAMK6h`F_0ie*QUuE0JOh zK0SO1NhJrOcciSZysy7r#FRnj%(C;PuWWzXJ$IL7xKI;z@~Jn&E$dg+)w}-hu(_~* zv(m$Li_`VFZpCEJei5^;rS;|(qsf(V+?z9}o}Rv?y5vpn z`MI72o8JG}=O?}x6p}e=q9@e#fl__99pe93?W_scB zI0vl-8FjQ<-t>j63@lVA>jwS-g^e+=FzJx_qI;38qZ#dJ?VIYvSvT4uY6mH^W@BbX zm*`Bcx#mYXdlBzl(xfJ-_iEvs56G40o_n4L&-eUz&OKK`DSrirT}swF0M7ct1;9AM zqyFy-D){MVpHl$jlaD{rwQRBMX?RcfI$5Tu5nyZOCOUY>vtk+d)gHR3+=|2dURzaQ zoVB4S0m#uMB&zFZ-}p?<`+egxRE{oTE*#Y*IF9iMMU*88$8P#$=sF~886EU*M54M5 zUauE>Z6Qp}{(qYih+{Ww4iF$@SkN5(C`JGPK<2_x3IN_e0(d-n8vtOcP_$nEW?e1u zdcC+eHi;w0b&Zu{0A#%H+ky*seLnyI*lSDm?(v9&*4EYn05SQ8R2u-G?Nq(4fvWID zpuQBf2537~kBIMnx`{0R008cdO(NpEZ&>4V^e1Bq=zqS_MVE*2=caJ!_VMKr0RWC1 zZ^=94cVFqEPP+tWg+z`VZ+YRMIr^aqz}fth=rrDRPQ&`Vaz{@Cz0Q= zz3yGj=I$M)&4+gZ0H#9`j7|h70Mu@EqRL^@%D9>iZN-jsMN9Unu}m>9lL_ z2_8@WsR^QDLs`a^vo>f`fT!=FW~_ADb$66VCIJ9};JoHbw4~hkkN8l#)w$yH>IlKn z7k>c&jvm;CqX)KW#>?)z+V5T0`Y8akoo*;<=zaD%Il2S@NFP02j7YT#20s;VZv^Hh*Zncrlwtv(kU*oT|0PMQfPt_4XtuuWDaQ6;V0GJNR zc||ZC;`;|iKwNL{U2-)YT9=iVyLXt%N*vYBax5$^X?Ar=c-H0*hH>*}FV6yWL@2cJ z3r+QkLCx#ky~DKOV9knU`$v5E;N(%>_&QVYd4ODv-+bY#oMnIf;=`hXa5Wtw>3=(c z={&m=$k7+VzYAa+ek`1ExBwW33xIKoJrtTnyQ`6!O#;d+CICQbNouVYPdvq<5(5Cz znYOdYdAV4%000oX&6;I23j!q3f|)tKd-pQKrvS#`X&~e95rA>H02pW0i@?@*>Zr|H zhH^;+04&84FbSntRAPvv&H#{}8-GKqb;B_TJ+c6pO#=M0^BFcrMgDjEob^YyG%!~x zXt!B0F*U1$3yx9fG6JZiH};M#oAs=kV-P$IWE`FaFb)?0<8T2mjpOK60D5i=>3Sqftrt1=2`-*FM(s9hRxBL-$(se(tYtusZv}OL*ng~LIai=2 zq0|6(oLp!EC@sxB8*C6QkVK0i&W)^_Qy4Htg;zld03?%75l&Yi^V(SNdh zZzA&q0BW{W!Z#Io?(;VXe={sL7SOhW+uPey{~2WVQR>d-Jrn@x>`?49Jc#x5%{u&D z0ORnTK*r$$U>q(0#^C~B94-LH;R0YBE&#^i0$?020LI}0U>q(0#^C~B94-LH`47q_ VOIK7F7DWI6002ovPDHLkV1lBH{N?}v diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_hat.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_hat.png new file mode 100644 index 0000000000000000000000000000000000000000..71b2b9f9cc9ac609ca1ef86e942bc71209a335b2 GIT binary patch literal 2381 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 delta 2350 zcmV+}3DNeB0?iVTIDZKLNklZ)lsx9ml`QJmkm7k0ht=sMT57}xGaIa7#$nIv^0CM7ww2?N;mc@vy&GaENkPH)M*TjGn}<4 zDb!A)Byy0TQ)B(HiDE|k?1gfV@44q5>CvM{(xc=)VEjn;yMNz3e(ra_``tZvXI#2; zNl_F9PWZ8c-Fnk^jwtCnN37k91$`qUBN!PO(OsLR(){eR*%XOHTosl0h?7mEZP!`I ztl6&9E?ibyUM+CBDz`;5_g{(L$;n9t0LI71ZD|;G>#G*_d9^g?J{(IR5Ws^64{X!7 zdGltpwzk@)℘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 AA^-pY literal 987 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!QI^H16xYTyqN(Khz zUQZXtkcv5PZ~0~jXG$FS_&-|tsKl&7{+I09YM2nGTi&L zpl}VeY{Qk>eBeUo9;e)#wfb5!Cb01!Q<73EQ zc-3g>2fc)fAAI3f>!KPGj#kZ?-^U9sQrIY ziqN$+k@wQ8ckOzcf1Hou!@IjI%8UOp}4#&&S=qe$&%$8PunpFgt7*;YQBGYjB$zvFm}@Gx94=(q!_&U$9K%L_!7Od& z;&}ogbx-!NNHFW_@~T~5ob>Hr{2$fi%f|%PzMX#Qcls>$zlaI&KFQoSR+71CT;+O1`Q7ka~AyB%z8`oUc#{mAW(i7cCu zUKZD_h@+lCuPx7e-I~<$D{WFul8{rw2cvE~hDaS&2S3IM!3UG|ASbv*S zdu`au>g4AIm9@fq`zyb!&n>)kgZD{gU*I%Gh91Mq*HbL7RF#=IYCFi>Wrka+_e(S3 zVt=F1@=2lzZ|?NRP2RtJk|hH}&nBPZ2GuQJPH%q3P*@`D0dwR|kr_6ppI7#+zP)?q z>_ZP1$alH#S~c%w^<6)PhN)rP>CeTDZ{N9poA;Q+Spg}7SjIiyi|r$x>ObC{TU)LZ zG#99Qdvvz9y+Ik@y0(Sq_T)xon|fz>Sjl`jta19^mB{CN+qafg{hVo@b<>Thn?G-U{gzJ| zA~MGrCO@s%diP(!v9;T7_sY85-1mCNn-gnX(gnkcv5PZyn5%HWX=nXsoKR-sHT{^eHS%-wyT9b!BQ4<9fTfB5dF4lZSS0^Gs4^ zT^Uq-ZacTw!3FhhQoZe!^Cmtz{{5-Vv5xlR%O76aakk1de>vy=|9|#cyxSbKfBll5 z(~K+9!%}*_C|foNIDN7|E2*8EdY4g*Q+T$K+pmc-4XJl-6(948zFFOHwyLyDd|TxD zw6~1^^qpU=tCC>5qqF|Gz@eMB|D5AV3wz7Sa3RKYM21bnTZ)4915glpFpkKYbb8 zW}lU}eC1v7KZjSU) z0|TG;f!o#xC6vV!H5$BjaWdTS|MxOBA-(ObiR_~ZpLTH^P`~q?Y5DrewV%WlUzirN z#)zdQ1#`%j=&1c)5T{ v!#iBWaxah4a)uL{3`JZGbC?up%hd1NbN?{&rIpFR#Khp~>gTe~DWM4f5-kv7 delta 879 zcmV-#1Cads1eynsIDZ37Nkl&$mjfK^mAd_iuhYV+_i0_HJmRFvRyC zKfR)M^V!ramP=e+-xRicDP{Xh%HdaO9Bb{Q4e1W01)!8F{eRLbZArUSvH<-O16!sI z=?9ySf>r&1y zE(;Yl8IR1prGM#$5?=|GvVbPAZeubYPUx+(;z<(xh4}u`GLA-N7(sML&CP|IkOUS7%8UI-aCboJZS^^G?fkBt3JRxDuq#x>)`_%b9^)yJeYAugTdZ9k@aof2(}-1GDtYA1PX@&5Do<( z911`<6o7Cj0O3#o!l3|!Ljeef0uT-bARG!nI23?z{sYZ#!#+EX#l!#r002ovPDHLk FV1fuMhXeos diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix_hat.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix_hat.png new file mode 100644 index 0000000000000000000000000000000000000000..e8138fd4c7924ed89a4004994416182887fc6897 GIT binary patch literal 10130 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 literal 10187 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 EA9dR@6951J diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/halcian_pink/halcian_pink_hat.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/halcian_pink/halcian_pink_hat.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0784f5c615ad7bee6ff07056f41b31d7f43781 GIT binary patch literal 811 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!QI^H16xYTyqN(Kg| zyPhtNAr*7p-muOH4wO0m@xEa0uVZ4F?LoS0cdTfBq2?#c;=cS`P=SVr6~|1YBdQjx zM;+N$u1;_d>?*m`6tXhc$i#H}(wEBp&kFO4CabNDVc)oA!CT*={MtYD^I!6{AC`YN z{qRGL)0+~GH*ZW2%a1o-cYn_!zUc3%X%}bB?oBY>yQ+q9{o1|Rg&$u{cwFsOcIe%q zHS^r6(^s$EYQ6jFF7`!_OE2~Mo-g^DP*QWGckRiG?!iGPX;*K)>;{{sz z;uI6mon7il71m#+yjLey%$glw;uYbY^~1or_vu$xph{MT?eBSZo10o5D`VK#AnsVt zv9BRq)hK&agi%PKxnSQJ<;BZG-27Ko1O+n)d})u7o-t?X8#@+PyQ2($e(e0XgpFZ` zNy%BR<7xahJYT=_9qMIYF#m_ZlQpxLZ{)vuw|DP*b$|J*rU$x@PrmlxC*zlIrHgaI zE?j!{^XaZ9RbscUi`vZDQUAhQFg>T#(?W%UO`P{m)idp`Q3_Wu= z89r<=VPr7zJshTY@yCV|2WLi;PmjL`E`F@c@yj{P{dOjULv^+~!-Al@Yz!%1uiSe& zX-?>6=LykG{{)I;E0@-GuWFjSzCw6HNU*lUTs zIrd8`&Q8{}zCV6f(N(rnO)s+F8!|6+?Afzp{`ATXMw5e!EiD7p=C-Y0apH1%^2Zgn zr4NiDn#D0Yx47Ri&yPp6Mmfh;>`=A<3@IF`1p*4RRK!}X*6M;Dt-^?C5=t8~TJ6cL6ElcJ6sJ7#6{(!`5tsRr+~#XEMe z_@33R`1eC_UayUb-twtBKY~xXB&=_oYtQY+{pRZ_e^ue=^{cb~#oRQV=cg+7liQY& zVTOeK;f=!SG5r(o6yN>px+^+&$!^ov_R^=G6+dO?fBHn?y(X=s$Apt@lqK-#$5dz4`uk;^O<>SNRv6{%U#P+1m&I?>yh#d35o%l{=4q zoYDEwuw=_!!}R{^PgD8UoO#V3|No_D!oJqSd&L-k delta 1200 zcmb`CeLT~70LQ;GwUgtJJT*&3<0k1`=y0_>%bgP|t)cwJwXkD#FAK{M zO2=v_k3ss`~UvD&!3;q`}O&}K9!rN^{#k8x{N?yTm+T# zRveQ=NVGtxHYANL-x2;Cb0by6L}GFoLk7Ne?h?99Usp? z#cO(vyv&`!GdqIpQU)QO22I@z@GPdRh2C}Z4h&OI&V3@a@{+SoXJ(F7532=R_NNk2 z)Q$PUtV;9^*2wH1$DpbJ!uOWU4r+K(ksvz-Z}`#R0fr&;7dLz!N3X z9CeV9pFN%5v#WILC4G_ri`iOSQhK~*i2T*oW3I&tDa^JZm+Hi(aI6YQ=^y5p43gmR zIRI>2ysIc7uPD=Ldw*V17#{R8rq?(uD;8o~z4j4T7OzD^_;8~zU$R17HCTTok)?F) ztX-`%MaR3_0S#pmjX-#LERN}a7Mkax>a{^h2?qA2J>9p>L)&7~!20&|cR-6iPnQU_ zUTLEyzkC*j|DbNNAU?h!%Zpv*kpmTvb&83tSzPX5-M%Wl6Y^&bg;WZqdJtWd225H^7-L8Z$0JtIU( zc0vuTg|Qts_ml#Zl-Glo?ho&{F!ST@H2wKK{cD%s{Boz^^CSD1I^4u@@_K#7^14+Q zBDRAoE=Z8X2ci33$>E(LX~_PUknWu3s)OV1T>As&z{s#3fM6U7bk3_^P?9L~!n^<<_IR zo=ouszOnH{oa&rk)eMsAv;NP#tO(73>x*!aC5n?ZFm$0B};2Ca0G6v-ADk zqX|d5-Zxx>hoetUHzbb@C31N=5J?nZ8RBCIf%DTViaG?B6|(c0JlPtQTP@t=wkJRF zA!sk@f{i<)Ejv{*tI3X`!ci}HLV=S<`8V|ARdHP50dBLZ{5|nq>}m)9*&b(6>N1m! zP1zCmiJXQRUQx8%ZyTuX4NGDw-YPEDzOW`QH#Zbc9K5=Gff^KvaT%Xco-qNpA>qQX zE%!3Rd1_S$JTOjhewGRsZ;Y=!`Xs&}gxN6R2ayPxhan&%f!qUhlR^G0FzWsP0>}U8 YS~K8mq9?J%Y8{|epkJsj?@(OsKk4p3`2YX_ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_hat.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_hat.png new file mode 100644 index 0000000000000000000000000000000000000000..61b3c5844f59ca10f592555abe3469fdea013a76 GIT binary patch literal 1625 zcmV-f2B!ImP)^53rR#lRCt{2o!w6qR~Uz%!_LmI%eo*`{2+)mYEqk45(rWoTCbY) z&TY~^pz)@?>P_Q~CQTFV1tBUXMsJLNKojjdK1#H98zUnlYzhXL zGEFSYB3xBXxC-H!#|l>|b`mI3vuP~LVr*i9zP>(2M@Jc(nBc|KG^yD%b#-+D;L(#| z58PF_&AKB%EOvyOcY1hd`wp=w7yuxg$;!IAIsjpgj{-0+9B4KbIXOQ>iu6NyWzC2%y|BHY9yZ zB$J-oP^=$qXz&35we=0m&I2H(CdSE?yNu8yQMtXL0U*ytcTX<>x*lZ5)>;6bj*Vm6 z82}EoGy{bzfr`>_<^T`w-6b`frfN&Arv|4c#<3G7d*A=SDeLVYVE?{70GKlgo{o(J zP+L<&bW_Bs)7*H#Q{ViE*4sajuHIa2q-N7hnl{hO*f#0Mn-F z*wTYR0694HnA)0}Rj(f$dYluB5`v3p0J|IN+1>E+>0Q^Y+s@~kcYX(;t@U704ZnI_ z+Ohyx8dY)=zg6yfhjPQn8y*zypy_(h`nBsfxp+6`(cRNaTkAomGmE9I^&s6nz1SJ2 z<77@;b|zz0S5;!$8KRNMnr%fR5zLvyYx$vA84W1^?C>Xfg}F{T)YAOgoev99AQu6; zZrv7;9|3y%2LLb=38In6stZwOBB4UR2Q2$AXlW-E8~RteZmkLBcs%ZOaBfJ*4I4|# z6z-zE$=o_;ySIOUJ-ZrKtvfjM*jWrxxJNM?LJC+ZC;#QjPerxU+;|{wC2%RPt^_LF zMO?XZX{@Ht8VKBwd%p#9WI zX&5@8@^Sz&nK=T1GA!H1vKF#{W5-XFYDVD^Ze#&y0gb6?Gq0>79LBZZ z&<*j`*Wct-Xg_sQ0vtPj!qr{5xprA*o#6bL(=r?i75JiXpEW0ehM|KuZ{rBV(3jl` z9tfzwv{5($C@Wk3M>ljGL-%G&wwG-y)`!;F(Jqt86qV5^L9OuZAg?%f`~(-zon7`^ zHapKmJT5ys+ShC+7K^DDMoORzV19m{x$IoQ$@6DUOG7t2`+*JJ5UJT&dHLdnyz;s1 z9CLFo{YfTMB$Fv-W)gWvMd_3Q!nW;#PVVezm*G&z^Sdh?3JEhYQ*gJZ(`gZpPYOV! z(`k`Tr-g0XdB?@`iV_f?9%>~XpJYyy$*t8@&WW+fDfaHH7XV()#xGyIz=J2l1-3Og zF92$4s)@%ZSG@l2-}gQ9%?~&)hFrRINdhAAVqrZ$vbjbA;^@(%o;y*BZS`VEX$bWn zL;Q_OxP6WifX`6^@Ht8VK1T__=O_XA93=psqXgh{lmL8=5`fQ90`NIX06s?vz~}r2 X_{uH8i`sQg00000NkvXXu0mjfLK*rt literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_saddle.png index d47bb1cdb930a631d3eb50ee133e8e7ffcf76e30..e096ace45280112930b610563623aada08a360e6 100644 GIT binary patch literal 800 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 Q0j6sPPgg&ebxsLQ021X?(EtDd delta 1347 zcmV-J1-$x&2I>lsIDZ8kNklk zvh(brxpz%lZ9;C6tLOVc;NE-gx#vsH|DN-G-?_PlQVKy|wtuwR0HL*r05nGgpgAG{ z%@F};jtD?=L;#v20?-^0faZt*G)DxWIU)ef@wD0ii^Jit0_gO5nHU{408YhXYOz!T z;6@^00EA2vfcB0KyKbpiw6`}pzWUhRbh<&`;O)e4!)oBESWKNC9tPlXE=T(MbpQsA zALoOf9sn+kjDOg|5S+vKxUWx5W-=}LVMC^=cJAKI_?0VM7#RV;y5lXjwYLLset4L# zPoL&?DkUOt5Z6or!C-LHbKcv!wF#E!g)0PbVPwP}?z`IBI2(@xFdmOnSX$z7E@zJr zg0pNYfK#!UnxCBoFm9((RbTjUIIKFoUI1fabo7nq27iM=yYnw6lZ?mXyy6^}l1aXa zM4+dKU@*w<_wH5QzEB+=fX`2!R4-;`))ihm_JG9bmqcUUnlIex^^zDh$fbT#A@kw7 z@?CrP+S`HNULNOi(9^^6@-ojC`YGMH&+_s`=E@^Lptn~9&;UFDx2|5@(6P#Qg%aJg2dQTeHj$I`XezESHkZCG_?9`Mkf-{4I{Fw9r2RSns;m?OF;>k`; z)zrRF9o6^%My;I>(CPIWup$IL+WdSg^h@)x_`hwbeeeSoU# zt{p2z7qfkfGpjCfK~LS z_+4WA7UP%zUiVPRT%jO$xr=E?B4}V}i1gT)$~F3sX}0XIYC2Le0$8hh zt)x2;kc3hb5hqY{Dg^K(n{AaHuChTVWCYM0Pk%J30OLj?fzR*fNj9rOrr8olFl3s_ z=lApKBM%*9pCg7qO$i-IroK~n0DOMGQOM_2F7*rThw}EF)=YeUzx}V^LjC|~^0d%0 za5f%S0ORp^&EL7+`Y5I3)56d96B9})rT$ehRo-rDeR&?B$$U02pmvwvjj(gi9y+#d zaD*T838m$@&KAs(-bhfxTqdYPXidA?%&@Si!^G_ z4b&unN7K`MxNl#hY|*YgH&C??a4DHo^9u_Abne)}xk#j;ar(R7o?EEe2RxWxSm01! zpYiSBpke(`jpSW#&n-w4pg9r+XpRU#b3_1|BLdKz{{Z5Olq)x=#p3_~002ovPDHLk FV1m{@lq>)M diff --git a/update.json b/update.json index b5544e21cd..c353597a5c 100644 --- a/update.json +++ b/update.json @@ -1,10 +1,10 @@ { "homepage": "https://modrinth.com/mod/aether", "promos": { - "1.19.2-recommended": "1.19.2-1.4.0-forge", - "1.19.4-recommended": "1.19.4-1.4.0-forge", - "1.20.1-recommended": "1.20.1-1.4.0-neoforge", - "1.20.2-recommended": "1.20.2-1.4.0-neoforge", - "1.20.4-recommended": "1.20.4-1.4.0-neoforge" + "1.19.2-recommended": "1.19.2-1.4.1-forge", + "1.19.4-recommended": "1.19.4-1.4.1-forge", + "1.20.1-recommended": "1.20.1-1.4.1-neoforge", + "1.20.2-recommended": "1.20.2-1.4.1-neoforge", + "1.20.4-recommended": "1.20.4-1.4.1-neoforge" } }