Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
484b373
fix: hand animation for deploying companion
bconlon1 May 22, 2026
9baeca7
refactor: allow aerbunny to be damaged by hostiles
bconlon1 May 22, 2026
b5259f6
feat: render aerbunny hearts above player hotbar
bconlon1 May 24, 2026
bee8eac
improv: replace companion test item with WIP one for aerbunnies + min…
bconlon1 May 24, 2026
5b5b28e
refactor: custom aerbunny heart textures
bconlon1 May 24, 2026
643188e
refactor: misc improvements
bconlon1 May 24, 2026
d8611f7
improv: companion retreat message and properly reset statuses after d…
bconlon1 May 28, 2026
d45b9e6
improv: placeholder aerbunny bell companion item
bconlon1 May 29, 2026
9d90bac
feat: resonant jewel item; placeholder texture
bconlon1 May 30, 2026
d55c556
Merge branch '26.1.2-alpha.4' into feat/bconlon/aerbunny-companion-item
bconlon1 May 30, 2026
8b3eb56
improv: add resonant jewel to cave ruin loot
bconlon1 May 30, 2026
c5a7570
refactor: change aerbunny bell recipe
bconlon1 May 30, 2026
b74a1be
improv: fix aerbunny bell active texture displaying without aerbunny …
bconlon1 May 30, 2026
e760e45
improv: status tooltip for companion item
bconlon1 May 30, 2026
352aa8f
refactor: change aerbunny bell rarity to uncommon
bconlon1 May 30, 2026
5d43119
improv: add usage sound to aerbunny bell
bconlon1 May 30, 2026
a8be0e3
refactor: rename and retexture jewel of resonance
bconlon1 May 31, 2026
6fe3c44
improv: updated aerbunny bell visuals
Builderdog841 Jun 1, 2026
033050d
improv: new assets for stone of resonance and aerbunny bell
bconlon1 Jun 6, 2026
08a6cf7
improv: rebalanced stone of resonance frequency and added it to under…
Builderdog841 Jun 6, 2026
4e512fe
refactor: pitch up aerbunny bell sound
bconlon1 Jun 9, 2026
dd4130a
refactor: add recovering tooltip to companion item
bconlon1 Jun 9, 2026
e0a52b3
Merge branch '26.1.2-alpha.4' into feat/bconlon/aerbunny-companion-item
bconlon1 Jun 9, 2026
b69bbff
chore: annotate override
bconlon1 Jun 9, 2026
267c602
refactor: allow recalling companion without interacting directly
bconlon1 Jun 9, 2026
6f5745e
fix: companion not returning to item when going between dimensions
bconlon1 Jun 9, 2026
4b5078b
fix: aerbunny properly returns to thrown item
bconlon1 Jun 9, 2026
1ec3970
Merge branch '26.1.2-alpha.4' into feat/bconlon/aerbunny-companion-item
bconlon1 Jun 9, 2026
ebfa121
refactor: spawn companion at click location
bconlon1 Jun 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/generated/resources/assets/aether_ii/items/aerbunny_bell.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"model": {
"type": "minecraft:condition",
"on_false": {
"type": "minecraft:model",
"model": "aether_ii:item/aerbunny_bell_empty"
},
"on_true": {
"type": "minecraft:condition",
"on_false": {
"type": "minecraft:model",
"model": "aether_ii:item/aerbunny_bell_active"
},
"on_true": {
"type": "minecraft:model",
"model": "aether_ii:item/aerbunny_bell"
},
"property": "aether_ii:stored_companion"
},
"property": "aether_ii:attached_companion"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "aether_ii:item/companion"
"model": "aether_ii:item/stone_of_resonance"
}
}
9 changes: 9 additions & 0 deletions src/generated/resources/assets/aether_ii/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,11 @@
"aether_ii.tooltip.item.charm.type.armor": "Armor Charm",
"aether_ii.tooltip.item.charm.type.tool": "Tool Charm",
"aether_ii.tooltip.item.charm.type.weapon": "Weapon Charm",
"aether_ii.tooltip.item.companion.status": "Status: %s",
"aether_ii.tooltip.item.companion.status.active": "Active",
"aether_ii.tooltip.item.companion.status.empty": "Empty",
"aether_ii.tooltip.item.companion.status.recovering": "Recovering",
"aether_ii.tooltip.item.companion.status.stored": "Stored",
"aether_ii.tooltip.item.curative.reduces": "Reduces: %s",
"aether_ii.tooltip.item.curative.removes": "Removes: %s",
"aether_ii.tooltip.item.currency.amount": "%s Glint",
Expand Down Expand Up @@ -944,6 +949,7 @@
"death.attack.aether_ii.effect.venom.player": "%1$s succumbed to venom while trying to escape %2$s",
"death.attack.aether_ii.effect.wound": "%1$s was fatally wounded",
"death.attack.aether_ii.effect.wound.player": "%1$s was fatally wounded by %2$s",
"death.attack.aether_ii.retreat": "%1$s retreated",
"death.attack.aether_ii.shock": "%1$s was electrocuted",
"death.attack.aether_ii.shock.player": "%1$s was electrocuted by %2$s",
"dimension.aether_ii.aether_holy_isles": "Aether Holy Isles",
Expand Down Expand Up @@ -1063,6 +1069,7 @@
"gui.aether_ii.toast.guidebook.exploration": "New Exploration Entry!",
"item.aether_ii.aechor_petal": "Aechor Petal",
"item.aether_ii.aechor_plant_spawn_egg": "Aechor Plant Spawn Egg",
"item.aether_ii.aerbunny_bell": "Aerbunny Bell",
"item.aether_ii.aerbunny_spawn_egg": "Aerbunny Spawn Egg",
"item.aether_ii.aerwhale_spawn_egg": "Aerwhale Spawn Egg",
"item.aether_ii.aether_portal_frame": "Aether Portal Frame",
Expand Down Expand Up @@ -1397,6 +1404,7 @@
"item.aether_ii.skyroot_water_bucket": "Skyroot Water Bucket",
"item.aether_ii.slider_spawn_egg": "Slider Spawn Egg",
"item.aether_ii.splint": "Splint",
"item.aether_ii.stone_of_resonance": "Stone of Resonance",
"item.aether_ii.swet_gel": "Swet Gel",
"item.aether_ii.swet_gel.nitrogen_internals.ability.tooltip.1": "§9Ability:§r Grows Nature",
"item.aether_ii.swet_jelly": "Swet Jelly",
Expand Down Expand Up @@ -1633,6 +1641,7 @@
"subtitles.aether_ii.entity.zephyr.hurt": "Zephyr hurts",
"subtitles.aether_ii.entity.zephyr.shoot": "Zephyr spits",
"subtitles.aether_ii.item.accessory.equip_generic": "Accessory equips",
"subtitles.aether_ii.item.aerbunny_bell.ring": "Aerbunny Bell rings",
"subtitles.aether_ii.item.ambrosium_shard.use": "Ambrosium Shard used",
"subtitles.aether_ii.item.arkenium_canister.empty": "Arkenium Canister empties",
"subtitles.aether_ii.item.arkenium_canister.fill": "Arkenium Canister fills",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "aether_ii:item/companion"
"layer0": "aether_ii:item/aerbunny_bell"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "aether_ii:item/aerbunny_bell_active"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "aether_ii:item/aerbunny_bell_empty"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "aether_ii:item/stone_of_resonance"
}
}
9 changes: 9 additions & 0 deletions src/generated/resources/assets/aether_ii/sounds.json
Original file line number Diff line number Diff line change
Expand Up @@ -1504,6 +1504,15 @@
],
"subtitle": "subtitles.aether_ii.item.accessory.equip_generic"
},
"item.aerbunny_bell.ring": {
"sounds": [
{
"name": "block/bell/bell_use01",
"pitch": 20.0
}
],
"subtitle": "subtitles.aether_ii.item.aerbunny_bell.ring"
},
"item.ambrosium_shard.use": {
"sounds": [
"block/amethyst/shimmer"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_stone_of_resonance": {
"conditions": {
"items": [
{
"items": "aether_ii:stone_of_resonance"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "aether_ii:aerbunny_bell"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_stone_of_resonance"
]
],
"rewards": {
"recipes": [
"aether_ii:aerbunny_bell"
]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -185,18 +185,23 @@
}
],
"name": "aether_ii:glint_coin",
"weight": 12
"weight": 10
},
{
"type": "minecraft:item",
"name": "aether_ii:zanite_pendant",
"weight": 6
"weight": 4
},
{
"type": "minecraft:item",
"name": "aether_ii:holystone_pickaxe",
"weight": 4
},
{
"type": "minecraft:item",
"name": "aether_ii:stone_of_resonance",
"weight": 2
},
{
"type": "minecraft:item",
"name": "aether_ii:zanite_pickaxe",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,11 @@
"name": "aether_ii:zanite_pickaxe",
"weight": 3
},
{
"type": "minecraft:item",
"name": "aether_ii:stone_of_resonance",
"weight": 3
},
{
"type": "minecraft:item",
"name": "aether_ii:zanite_pendant",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,11 @@
"name": "aether_ii:zanite_pendant",
"weight": 2
},
{
"type": "minecraft:item",
"name": "aether_ii:stone_of_resonance",
"weight": 2
},
{
"type": "minecraft:loot_table",
"value": "aether_ii:chests/dungeons/music_discs"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,11 @@
"name": "aether_ii:fossilized_glint",
"weight": 4
},
{
"type": "minecraft:item",
"name": "aether_ii:stone_of_resonance",
"weight": 3
},
{
"type": "minecraft:item",
"name": "aether_ii:cold_aercloud_glider",
Expand Down
17 changes: 17 additions & 0 deletions src/generated/resources/data/aether_ii/recipe/aerbunny_bell.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"type": "minecraft:crafting_shaped",
"category": "misc",
"key": {
"#": "#aether_ii:gems/zanite",
"/": "aether_ii:cloudtwine",
"A": "aether_ii:stone_of_resonance"
},
"pattern": [
" # ",
"#/#",
"#A#"
],
"result": {
"id": "aether_ii:aerbunny_bell"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.aetherteam.aetherii.effect.buildup.EffectBuildupInstance;
import com.aetherteam.aetherii.entity.attributes.AetherIIAttributes;
import com.aetherteam.aetherii.entity.monster.Swet;
import com.aetherteam.aetherii.entity.passive.Aerbunny;
import com.aetherteam.aetherii.entity.passive.Moa;
import com.aetherteam.aetherii.item.AetherIIItems;
import com.aetherteam.aetherii.mixin.mixins.client.accessor.InventoryScreenAccessor;
Expand All @@ -29,13 +30,15 @@
import net.minecraft.resources.Identifier;
import net.minecraft.util.ARGB;
import net.minecraft.util.Mth;
import net.minecraft.util.profiling.Profiler;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.HumanoidArm;
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.level.GameType;
import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent;
import net.neoforged.neoforge.client.gui.VanillaGuiLayers;

import java.awt.*;
import java.util.Collection;
Expand All @@ -53,8 +56,10 @@ public class AetherIIOverlays {
protected static final Identifier HOTBAR_BLOCK_INDICATOR_BACKGROUND_SPRITE = Identifier.fromNamespaceAndPath(AetherII.MODID, "hud/hotbar_block_indicator_background");
protected static final Identifier HOTBAR_BLOCK_INDICATOR_PROGRESS_SPRITE = Identifier.fromNamespaceAndPath(AetherII.MODID, "hud/hotbar_block_indicator_progress");
protected static final Identifier HOTBAR_BLOCK_INDICATOR_BROKEN_SPRITE = Identifier.fromNamespaceAndPath(AetherII.MODID, "hud/hotbar_block_indicator_broken");

public static final Identifier TEXTURE_DEFAULT_JUMPS = Identifier.fromNamespaceAndPath(AetherII.MODID, "hud/jumps");
protected static final Identifier HEART_AERBUNNY_CONTAINER_SPRITE = Identifier.fromNamespaceAndPath(AetherII.MODID, "hud/heart/aerbunny_container");
protected static final Identifier HEART_AERBUNNY_FULL_SPRITE = Identifier.fromNamespaceAndPath(AetherII.MODID, "hud/heart/aerbunny_full");
protected static final Identifier HEART_AERBUNNY_HALF_SPRITE = Identifier.fromNamespaceAndPath(AetherII.MODID, "hud/heart/aerbunny_half");
protected static final Identifier TEXTURE_DEFAULT_JUMPS = Identifier.fromNamespaceAndPath(AetherII.MODID, "hud/jumps");


public static void registerOverlays(RegisterGuiLayersEvent event) {
Expand Down Expand Up @@ -101,6 +106,50 @@ public static void registerOverlays(RegisterGuiLayersEvent event) {
renderMoaJumps(guiGraphics, player);
}
});
event.registerAbove(VanillaGuiLayers.AIR_LEVEL, Identifier.fromNamespaceAndPath(AetherII.MODID, "aerbunny_health"), (guiGraphics, partialTicks) -> {
Minecraft minecraft = Minecraft.getInstance();
LocalPlayer player = minecraft.player;
if (player != null) {
extractAerbunnyHealth(guiGraphics, minecraft.gui, player);
}
});
}

private static void extractAerbunnyHealth(GuiGraphicsExtractor graphics, Gui gui, LocalPlayer player) {
if (!Minecraft.getInstance().options.hideGui && player.getFirstPassenger() instanceof Aerbunny aerbunny) {
float maxHealth = aerbunny.getMaxHealth();
int hearts = (int) (maxHealth + 0.5F) / 2;
if (hearts > 30) {
hearts = 30;
}
if (hearts != 0) {
int currentHealth = (int) Math.ceil(aerbunny.getHealth());
Profiler.get().popPush("mountHealth");
int yLine1 = graphics.guiHeight() - gui.rightHeight;
int xRight = graphics.guiWidth() / 2 + 91;
int yo = yLine1;

for (int baseHealth = 0; hearts > 0; baseHealth += 20) {
int rowHearts = Math.min(hearts, 10);
hearts -= rowHearts;

for (int i = 0; i < rowHearts; i++) {
int xo = xRight - i * 8 - 9;
graphics.blitSprite(RenderPipelines.GUI_TEXTURED, HEART_AERBUNNY_CONTAINER_SPRITE, xo, yo, 9, 9);
if (i * 2 + 1 + baseHealth < currentHealth) {
graphics.blitSprite(RenderPipelines.GUI_TEXTURED, HEART_AERBUNNY_FULL_SPRITE, xo, yo, 9, 9);
}

if (i * 2 + 1 + baseHealth == currentHealth) {
graphics.blitSprite(RenderPipelines.GUI_TEXTURED, HEART_AERBUNNY_HALF_SPRITE, xo, yo, 9, 9);
}
}

yo -= 10;
gui.rightHeight += 10;
}
}
}
}

private static void renderMoaJumps(GuiGraphicsExtractor guiGraphics, LocalPlayer player) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.aetherteam.aetherii.client.renderer.item.properties;

import com.aetherteam.aetherii.AetherII;
import com.aetherteam.aetherii.client.renderer.item.properties.conditional.BetterIsUsingItem;
import com.aetherteam.aetherii.client.renderer.item.properties.conditional.HasBlockState;
import com.aetherteam.aetherii.client.renderer.item.properties.conditional.HoldingShift;
import com.aetherteam.aetherii.client.renderer.item.properties.conditional.LassoThrow;
import com.aetherteam.aetherii.client.renderer.item.properties.conditional.*;
import com.aetherteam.aetherii.client.renderer.item.properties.range.*;
import com.aetherteam.aetherii.client.renderer.item.properties.select.SelectFeatherColor;
import com.aetherteam.aetherii.client.renderer.item.properties.select.SelectMoaEggType;
Expand All @@ -15,6 +12,8 @@

public class AetherIIItemModelProperties {
public static void registerConditionalProperties(RegisterConditionalItemModelPropertyEvent event) {
event.register(Identifier.fromNamespaceAndPath(AetherII.MODID, "attached_companion"), AttachedCompanion.MAP_CODEC);
event.register(Identifier.fromNamespaceAndPath(AetherII.MODID, "stored_companion"), StoredCompanion.MAP_CODEC);
event.register(Identifier.fromNamespaceAndPath(AetherII.MODID, "using_item"), BetterIsUsingItem.MAP_CODEC);
event.register(Identifier.fromNamespaceAndPath(AetherII.MODID, "has_block_state"), HasBlockState.MAP_CODEC);
event.register(Identifier.fromNamespaceAndPath(AetherII.MODID, "holding_shift"), HoldingShift.MAP_CODEC);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.aetherteam.aetherii.client.renderer.item.properties.conditional;

import com.aetherteam.aetherii.item.components.AetherIIDataComponents;
import com.mojang.serialization.MapCodec;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.item.properties.conditional.ConditionalItemModelProperty;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;

import javax.annotation.Nullable;

public record AttachedCompanion() implements ConditionalItemModelProperty {
public static final MapCodec<AttachedCompanion> MAP_CODEC = MapCodec.unit(new AttachedCompanion());

@Override
public boolean get(ItemStack stack, @Nullable ClientLevel level, @Nullable LivingEntity entity, int i, ItemDisplayContext context) {
return stack.has(AetherIIDataComponents.COMPANION_UUID);
}

@Override
public MapCodec<AttachedCompanion> type() {
return MAP_CODEC;
}
}
Loading