diff --git a/docs/CREDITS.txt b/docs/CREDITS.txt index 1e8431d352..7280fd5ea0 100644 --- a/docs/CREDITS.txt +++ b/docs/CREDITS.txt @@ -42,6 +42,7 @@ GizmoTheMoonPig - Implementation of Jade compatibility. - Implementation of Lootr compatibility. - Implementation of Randomium compatibility. +- Implementation of Tips compatibility. - Fixes to Netherite Gloves being uncraftable with 1.20 datapack. - Fixes to the Life Shard silver heart overlay rendering. - Fixes to aether1 and aether2 music naming. @@ -62,6 +63,9 @@ Jonathing - Fixes to Jade compatibility with boss bars. - Cleanup of mixin and event code relating to Valkyrie Tools' reach. +KaiAF +- Fixes to Optifine incompatibility. + Kelvin285 - Implementation of the world preview feature for the Aether's main menu. diff --git a/docs/README.md b/docs/README.md index f0c3868660..67da58adac 100644 --- a/docs/README.md +++ b/docs/README.md @@ -137,6 +137,7 @@ The Aether is available in these languages thanks to the following contributors: | Romanian | (ro_ro) | lucatatar321, gigelciobanu205 | | Russian | (ru_ru) | LeyxorCheysen, andreyalex1236, LunarP1, zombi1944, Foxgreat, lonespeaker, davekart0n, paskanius | | Slovak | (sk_sk) | GaucovyAero | +| Spanish | (es_es) | cabaneter | | Swedish | (sv_se) | magicus, 2lay | | Thai | (th_th) | txwfyxa | | Toki Pona | (tok) | leko soko Wijapipapa | diff --git a/src/generated/resources/assets/aether/lang/en_us.json b/src/generated/resources/assets/aether/lang/en_us.json index 2950cb1302..f71349cdf3 100644 --- a/src/generated/resources/assets/aether/lang/en_us.json +++ b/src/generated/resources/assets/aether/lang/en_us.json @@ -444,17 +444,27 @@ "gui.aether.moa_skins.pack.lifetime_valkyrie_moa_skins": "Lifetime Valkyrie Moa Skins", "gui.aether.moa_skins.pack.natural_moa_skins": "Natural Moa Skins", "gui.aether.moa_skins.skin.arctic_moa": "Arctic Moa", + "gui.aether.moa_skins.skin.battle_sentry_moa": "Battle Sentry Moa", "gui.aether.moa_skins.skin.black_moa": "Black Moa", "gui.aether.moa_skins.skin.blue_moa": "Blue Moa", "gui.aether.moa_skins.skin.boko_yellow": "Boko Yellow", + "gui.aether.moa_skins.skin.chicken_moa": "Chicken Moa", "gui.aether.moa_skins.skin.classic_moa": "Classic Moa", "gui.aether.moa_skins.skin.cockatrice_moa": "Cockatrice", + "gui.aether.moa_skins.skin.construction_bot": "Construction Bot", "gui.aether.moa_skins.skin.crookjaw_purple": "Crookjaw Purple", + "gui.aether.moa_skins.skin.frozen_phoenix": "Frozen Phoenix", + "gui.aether.moa_skins.skin.gargoyle_moa": "Gargoyle Moa", "gui.aether.moa_skins.skin.gharrix_red": "Gharrix Red", + "gui.aether.moa_skins.skin.gilded_gharrix": "Gilded Gharrix", "gui.aether.moa_skins.skin.halcian_pink": "Halcian Pink", + "gui.aether.moa_skins.skin.molten_moa": "Molten Moa", + "gui.aether.moa_skins.skin.mossy_statue_moa": "Mossy Statue Moa", "gui.aether.moa_skins.skin.phoenix_moa": "Phoenix Moa", "gui.aether.moa_skins.skin.sentry_moa": "Sentry Moa", + "gui.aether.moa_skins.skin.stratus": "Stratus", "gui.aether.moa_skins.skin.tivalier_green": "Tivalier Green", + "gui.aether.moa_skins.skin.undead_moa": "Undead Moa", "gui.aether.moa_skins.skin.valkyrie_moa": "Valkyrie Moa", "gui.aether.moa_skins.skin.white_moa": "White Moa", "gui.aether.moa_skins.text.donate": "Donate to the project to get Moa Skins!", @@ -1054,6 +1064,7 @@ "subtitles.aether.item.accessory.equip_iron_ring": "Iron Ring jingles", "subtitles.aether.item.accessory.equip_zanite_pendant": "Zanite Pendant jingles", "subtitles.aether.item.accessory.equip_zanite_ring": "Zanite Ring jingles", + "subtitles.aether.item.ambrosium_shard.use": "Ambrosium Shard used", "subtitles.aether.item.armor.equip_gravitite": "Gravitite armor clinks", "subtitles.aether.item.armor.equip_neptune": "Neptune armor clinks", "subtitles.aether.item.armor.equip_obsidian": "Obsidian armor clanks", @@ -1063,5 +1074,6 @@ "subtitles.aether.item.armor.equip_zanite": "Zanite armor clangs", "subtitles.aether.item.dart_shooter.shoot": "Dart Shooter fired", "subtitles.aether.item.hammer_of_kingbdogz.shoot": "Hammer fired", - "subtitles.aether.item.lightning_knife.shoot": "Lightning Knife flies" + "subtitles.aether.item.lightning_knife.shoot": "Lightning Knife flies", + "subtitles.aether.item.swet_ball.use": "Swet Ball used" } \ No newline at end of file diff --git a/src/generated/resources/assets/aether/sounds.json b/src/generated/resources/assets/aether/sounds.json index 8de8cb743d..674d233925 100644 --- a/src/generated/resources/assets/aether/sounds.json +++ b/src/generated/resources/assets/aether/sounds.json @@ -713,6 +713,12 @@ ], "subtitle": "subtitles.aether.item.accessory.equip_zanite_ring" }, + "item.ambrosium_shard.use": { + "sounds": [ + "block/amethyst/shimmer" + ], + "subtitle": "subtitles.aether.item.ambrosium_shard.use" + }, "item.armor.equip_gravitite": { "sounds": [ "item/armor/equip_gold1", @@ -836,6 +842,15 @@ } ] }, + "item.swet_ball.use": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.aether.item.swet_ball.use" + }, "music.aether": { "sounds": [ { diff --git a/src/generated/resources/assets/aether/tips/aerogel_explosion_resistance.json b/src/generated/resources/assets/aether/tips/aerogel_explosion_resistance.json new file mode 100644 index 0000000000..59aba001df --- /dev/null +++ b/src/generated/resources/assets/aether/tips/aerogel_explosion_resistance.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.aerogel_explosion_resistance" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/aether_day_length.json b/src/generated/resources/assets/aether/tips/aether_day_length.json new file mode 100644 index 0000000000..eebc14837f --- /dev/null +++ b/src/generated/resources/assets/aether/tips/aether_day_length.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.aether_day_length" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/altar_repairing.json b/src/generated/resources/assets/aether/tips/altar_repairing.json new file mode 100644 index 0000000000..0fc4e173a1 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/altar_repairing.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.altar_repairing" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/ambrosium_shard_fuel.json b/src/generated/resources/assets/aether/tips/ambrosium_shard_fuel.json new file mode 100644 index 0000000000..6f02a93014 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/ambrosium_shard_fuel.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.ambrosium_shard_fuel" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/blue_aerclouds.json b/src/generated/resources/assets/aether/tips/blue_aerclouds.json new file mode 100644 index 0000000000..015f1c3311 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/blue_aerclouds.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.blue_aerclouds" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/champs.json b/src/generated/resources/assets/aether/tips/champs.json new file mode 100644 index 0000000000..387d1408f5 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/champs.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.champs" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/check_surroundings.json b/src/generated/resources/assets/aether/tips/check_surroundings.json new file mode 100644 index 0000000000..c72b76ff53 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/check_surroundings.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.check_surroundings" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/close_door.json b/src/generated/resources/assets/aether/tips/close_door.json new file mode 100644 index 0000000000..7b36900590 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/close_door.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.close_door" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/cold_parachute_crafting.json b/src/generated/resources/assets/aether/tips/cold_parachute_crafting.json new file mode 100644 index 0000000000..27a24e4cb6 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/cold_parachute_crafting.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.cold_parachute_crafting" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/creepers.json b/src/generated/resources/assets/aether/tips/creepers.json new file mode 100644 index 0000000000..dd6cff943c --- /dev/null +++ b/src/generated/resources/assets/aether/tips/creepers.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.creepers" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/dart_shooter_crafting.json b/src/generated/resources/assets/aether/tips/dart_shooter_crafting.json new file mode 100644 index 0000000000..b390c3fa4b --- /dev/null +++ b/src/generated/resources/assets/aether/tips/dart_shooter_crafting.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.dart_shooter_crafting" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/darts_no_gravity.json b/src/generated/resources/assets/aether/tips/darts_no_gravity.json new file mode 100644 index 0000000000..5611ef1928 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/darts_no_gravity.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.darts_no_gravity" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/difficulty.json b/src/generated/resources/assets/aether/tips/difficulty.json new file mode 100644 index 0000000000..f40a37c255 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/difficulty.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.difficulty" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/dig_straight_down.json b/src/generated/resources/assets/aether/tips/dig_straight_down.json new file mode 100644 index 0000000000..0847a5d551 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/dig_straight_down.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.dig_straight_down" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/do_things.json b/src/generated/resources/assets/aether/tips/do_things.json new file mode 100644 index 0000000000..14273014a6 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/do_things.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.do_things" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/drops.json b/src/generated/resources/assets/aether/tips/drops.json new file mode 100644 index 0000000000..b0dbaf9aab --- /dev/null +++ b/src/generated/resources/assets/aether/tips/drops.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.drops" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/dungeon_rewards.json b/src/generated/resources/assets/aether/tips/dungeon_rewards.json new file mode 100644 index 0000000000..0ba2a373b1 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/dungeon_rewards.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.dungeon_rewards" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/dungeon_tiers.json b/src/generated/resources/assets/aether/tips/dungeon_tiers.json new file mode 100644 index 0000000000..f38df2d3c2 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/dungeon_tiers.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.dungeon_tiers" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/enchant_blue_disk.json b/src/generated/resources/assets/aether/tips/enchant_blue_disk.json new file mode 100644 index 0000000000..60ff8b05f9 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/enchant_blue_disk.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.enchant_blue_disk" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/enchanted_gravitite_crafting.json b/src/generated/resources/assets/aether/tips/enchanted_gravitite_crafting.json new file mode 100644 index 0000000000..9f9461b1a7 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/enchanted_gravitite_crafting.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.enchanted_gravitite_crafting" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/enchanted_gravitite_floating.json b/src/generated/resources/assets/aether/tips/enchanted_gravitite_floating.json new file mode 100644 index 0000000000..f6dbc5d5dd --- /dev/null +++ b/src/generated/resources/assets/aether/tips/enchanted_gravitite_floating.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.enchanted_gravitite_floating" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/expectations.json b/src/generated/resources/assets/aether/tips/expectations.json new file mode 100644 index 0000000000..f1d5135bcf --- /dev/null +++ b/src/generated/resources/assets/aether/tips/expectations.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.expectations" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/glowstone_portal_forming.json b/src/generated/resources/assets/aether/tips/glowstone_portal_forming.json new file mode 100644 index 0000000000..c8551382e2 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/glowstone_portal_forming.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.glowstone_portal_forming" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/golden_apples.json b/src/generated/resources/assets/aether/tips/golden_apples.json new file mode 100644 index 0000000000..d73c946d77 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/golden_apples.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.golden_apples" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/golden_oak_amber.json b/src/generated/resources/assets/aether/tips/golden_oak_amber.json new file mode 100644 index 0000000000..1f93b36595 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/golden_oak_amber.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.golden_oak_amber" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/golden_parachute_durability.json b/src/generated/resources/assets/aether/tips/golden_parachute_durability.json new file mode 100644 index 0000000000..9b5c011b7d --- /dev/null +++ b/src/generated/resources/assets/aether/tips/golden_parachute_durability.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.golden_parachute_durability" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/gravitite_armour_ability.json b/src/generated/resources/assets/aether/tips/gravitite_armour_ability.json new file mode 100644 index 0000000000..91b82b6827 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/gravitite_armour_ability.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.gravitite_armour_ability" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/gravitite_ore_enchanting.json b/src/generated/resources/assets/aether/tips/gravitite_ore_enchanting.json new file mode 100644 index 0000000000..9d7a006f47 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/gravitite_ore_enchanting.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.gravitite_ore_enchanting" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/gravitite_tool_ability.json b/src/generated/resources/assets/aether/tips/gravitite_tool_ability.json new file mode 100644 index 0000000000..190110a42e --- /dev/null +++ b/src/generated/resources/assets/aether/tips/gravitite_tool_ability.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.gravitite_tool_ability" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/harvest_aechor_poison.json b/src/generated/resources/assets/aether/tips/harvest_aechor_poison.json new file mode 100644 index 0000000000..2562b89030 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/harvest_aechor_poison.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.harvest_aechor_poison" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/holystone_tool_ability.json b/src/generated/resources/assets/aether/tips/holystone_tool_ability.json new file mode 100644 index 0000000000..0a89bc9760 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/holystone_tool_ability.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.holystone_tool_ability" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/icestone_freezing_blocks.json b/src/generated/resources/assets/aether/tips/icestone_freezing_blocks.json new file mode 100644 index 0000000000..1eca40a5fc --- /dev/null +++ b/src/generated/resources/assets/aether/tips/icestone_freezing_blocks.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.icestone_freezing_blocks" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/mimic_chest.json b/src/generated/resources/assets/aether/tips/mimic_chest.json new file mode 100644 index 0000000000..24bfe9efa5 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/mimic_chest.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.mimic_chest" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/mining.json b/src/generated/resources/assets/aether/tips/mining.json new file mode 100644 index 0000000000..e53dab62c4 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/mining.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.mining" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/moa_egg_incubation.json b/src/generated/resources/assets/aether/tips/moa_egg_incubation.json new file mode 100644 index 0000000000..41f2166c93 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/moa_egg_incubation.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.moa_egg_incubation" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/moa_nature_staff.json b/src/generated/resources/assets/aether/tips/moa_nature_staff.json new file mode 100644 index 0000000000..60aefc96fd --- /dev/null +++ b/src/generated/resources/assets/aether/tips/moa_nature_staff.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.moa_nature_staff" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/parachute_activation.json b/src/generated/resources/assets/aether/tips/parachute_activation.json new file mode 100644 index 0000000000..426dd673fe --- /dev/null +++ b/src/generated/resources/assets/aether/tips/parachute_activation.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.parachute_activation" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/phoenix_armor_submerging.json b/src/generated/resources/assets/aether/tips/phoenix_armor_submerging.json new file mode 100644 index 0000000000..8de6470189 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/phoenix_armor_submerging.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.phoenix_armor_submerging" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/phyg_saddle.json b/src/generated/resources/assets/aether/tips/phyg_saddle.json new file mode 100644 index 0000000000..e947c1f073 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/phyg_saddle.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.phyg_saddle" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/portal_misclick.json b/src/generated/resources/assets/aether/tips/portal_misclick.json new file mode 100644 index 0000000000..62aa1472b8 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/portal_misclick.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.portal_misclick" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/quicksoil_sliding.json b/src/generated/resources/assets/aether/tips/quicksoil_sliding.json new file mode 100644 index 0000000000..af5e6606db --- /dev/null +++ b/src/generated/resources/assets/aether/tips/quicksoil_sliding.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.quicksoil_sliding" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/raw_meat.json b/src/generated/resources/assets/aether/tips/raw_meat.json new file mode 100644 index 0000000000..7d15e1ef4f --- /dev/null +++ b/src/generated/resources/assets/aether/tips/raw_meat.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.raw_meat" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/remedy_bucket_enchanting.json b/src/generated/resources/assets/aether/tips/remedy_bucket_enchanting.json new file mode 100644 index 0000000000..3f7669e531 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/remedy_bucket_enchanting.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.remedy_bucket_enchanting" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/respect.json b/src/generated/resources/assets/aether/tips/respect.json new file mode 100644 index 0000000000..ea1bd66196 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/respect.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.respect" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/risk_taking.json b/src/generated/resources/assets/aether/tips/risk_taking.json new file mode 100644 index 0000000000..6df39b954f --- /dev/null +++ b/src/generated/resources/assets/aether/tips/risk_taking.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.risk_taking" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/security.json b/src/generated/resources/assets/aether/tips/security.json new file mode 100644 index 0000000000..d7a45360c9 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/security.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.security" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/sheepuff_puff.json b/src/generated/resources/assets/aether/tips/sheepuff_puff.json new file mode 100644 index 0000000000..42f8b69dce --- /dev/null +++ b/src/generated/resources/assets/aether/tips/sheepuff_puff.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.sheepuff_puff" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/shelter.json b/src/generated/resources/assets/aether/tips/shelter.json new file mode 100644 index 0000000000..d14a7bcace --- /dev/null +++ b/src/generated/resources/assets/aether/tips/shelter.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.shelter" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/skyroot_tool_ability.json b/src/generated/resources/assets/aether/tips/skyroot_tool_ability.json new file mode 100644 index 0000000000..6eaacf06e1 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/skyroot_tool_ability.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.skyroot_tool_ability" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/slimes.json b/src/generated/resources/assets/aether/tips/slimes.json new file mode 100644 index 0000000000..8bcfe621a3 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/slimes.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.slimes" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/spare_stack.json b/src/generated/resources/assets/aether/tips/spare_stack.json new file mode 100644 index 0000000000..054114dd62 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/spare_stack.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.spare_stack" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/the_game.json b/src/generated/resources/assets/aether/tips/the_game.json new file mode 100644 index 0000000000..d15c7a9f9c --- /dev/null +++ b/src/generated/resources/assets/aether/tips/the_game.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.the_game" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/victory_medal_drop.json b/src/generated/resources/assets/aether/tips/victory_medal_drop.json new file mode 100644 index 0000000000..92abe54cbd --- /dev/null +++ b/src/generated/resources/assets/aether/tips/victory_medal_drop.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.victory_medal_drop" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/watch_your_step.json b/src/generated/resources/assets/aether/tips/watch_your_step.json new file mode 100644 index 0000000000..13216e9efc --- /dev/null +++ b/src/generated/resources/assets/aether/tips/watch_your_step.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.watch_your_step" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/white_aerclouds.json b/src/generated/resources/assets/aether/tips/white_aerclouds.json new file mode 100644 index 0000000000..5f11ce5e25 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/white_aerclouds.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.white_aerclouds" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/zanite_tool_ability.json b/src/generated/resources/assets/aether/tips/zanite_tool_ability.json new file mode 100644 index 0000000000..ece88613a4 --- /dev/null +++ b/src/generated/resources/assets/aether/tips/zanite_tool_ability.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.zanite_tool_ability" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/aether/tips/zephyr_shooting.json b/src/generated/resources/assets/aether/tips/zephyr_shooting.json new file mode 100644 index 0000000000..cefcc484fe --- /dev/null +++ b/src/generated/resources/assets/aether/tips/zephyr_shooting.json @@ -0,0 +1,11 @@ +{ + "tip": { + "translate": "aether.pro_tips.line.aether.zephyr_shooting" + }, + "title": { + "bold": true, + "color": "yellow", + "translate": "gui.aether.pro_tip", + "underlined": true + } +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aether/Aether.java b/src/main/java/com/aetherteam/aether/Aether.java index b3e69bb038..e273f54f5c 100644 --- a/src/main/java/com/aetherteam/aether/Aether.java +++ b/src/main/java/com/aetherteam/aether/Aether.java @@ -7,6 +7,7 @@ import com.aetherteam.aether.block.AetherCauldronInteractions; import com.aetherteam.aether.block.dispenser.AetherDispenseBehaviors; import com.aetherteam.aether.block.dispenser.DispenseDartBehavior; +import com.aetherteam.aether.block.dispenser.DispenseSkyrootBoatBehavior; import com.aetherteam.aether.block.dispenser.DispenseUsableItemBehavior; import com.aetherteam.aether.blockentity.AetherBlockEntityTypes; import com.aetherteam.aether.client.AetherSoundEvents; @@ -421,6 +422,8 @@ private void registerDispenserBehaviors() { DispenserBlock.registerBehavior(AetherItems.SKYROOT_BUCKET.get(), AetherDispenseBehaviors.SKYROOT_BUCKET_PICKUP_BEHAVIOR); DispenserBlock.registerBehavior(AetherItems.AMBROSIUM_SHARD.get(), new DispenseUsableItemBehavior<>(AetherRecipeTypes.AMBROSIUM_ENCHANTING.get())); DispenserBlock.registerBehavior(AetherItems.SWET_BALL.get(), new DispenseUsableItemBehavior<>(AetherRecipeTypes.SWET_BALL_CONVERSION.get())); + DispenserBlock.registerBehavior(AetherItems.SKYROOT_BOAT.get(), new DispenseSkyrootBoatBehavior()); + DispenserBlock.registerBehavior(AetherItems.SKYROOT_CHEST_BOAT.get(), new DispenseSkyrootBoatBehavior(true)); } private void registerCauldronInteractions() { diff --git a/src/main/java/com/aetherteam/aether/block/dispenser/DispenseSkyrootBoatBehavior.java b/src/main/java/com/aetherteam/aether/block/dispenser/DispenseSkyrootBoatBehavior.java new file mode 100644 index 0000000000..8e76b40d20 --- /dev/null +++ b/src/main/java/com/aetherteam/aether/block/dispenser/DispenseSkyrootBoatBehavior.java @@ -0,0 +1,59 @@ +package com.aetherteam.aether.block.dispenser; + +import com.aetherteam.aether.entity.miscellaneous.SkyrootBoat; +import com.aetherteam.aether.entity.miscellaneous.SkyrootChestBoat; +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.Direction; +import net.minecraft.core.dispenser.BoatDispenseItemBehavior; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DispenserBlock; + +/** + * [CODE COPY] - {@link BoatDispenseItemBehavior} + */ +public class DispenseSkyrootBoatBehavior extends DefaultDispenseItemBehavior { + private final DefaultDispenseItemBehavior defaultDispenseItemBehavior = new DefaultDispenseItemBehavior(); + private final boolean isChestBoat; + + public DispenseSkyrootBoatBehavior() { + this(false); + } + + public DispenseSkyrootBoatBehavior(boolean isChestBoat) { + this.isChestBoat = isChestBoat; + } + + public ItemStack execute(BlockSource source, ItemStack stack) { + Direction direction = source.getBlockState().getValue(DispenserBlock.FACING); + Level level = source.getLevel(); + double width = 0.5625 + EntityType.BOAT.getWidth() / 2.0; + double x = source.x() + direction.getStepX() * width; + double y = source.y() + direction.getStepY() * 1.125F; + double z = source.z() + direction.getStepZ() * width; + BlockPos blockpos = source.getPos().relative(direction); + Boat boat = (this.isChestBoat ? new SkyrootChestBoat(level, width, x, y) : new SkyrootBoat(level, width, x, y)); + boat.setYRot(direction.toYRot()); + double yOffset; + if (boat.canBoatInFluid(level.getFluidState(blockpos))) { + yOffset = 1.0D; + } else { + if (!level.getBlockState(blockpos).isAir() || !boat.canBoatInFluid(level.getFluidState(blockpos.below()))) { + return this.defaultDispenseItemBehavior.dispense(source, stack); + } + yOffset = 0.0D; + } + boat.setPos(x, y + yOffset, z); + level.addFreshEntity(boat); + stack.shrink(1); + return stack; + } + + protected void playSound(BlockSource source) { + source.getLevel().levelEvent(1000, source.getPos(), 0); + } +} diff --git a/src/main/java/com/aetherteam/aether/client/AetherSoundEvents.java b/src/main/java/com/aetherteam/aether/client/AetherSoundEvents.java index 0c5db75333..e19330928a 100644 --- a/src/main/java/com/aetherteam/aether/client/AetherSoundEvents.java +++ b/src/main/java/com/aetherteam/aether/client/AetherSoundEvents.java @@ -23,6 +23,9 @@ public class AetherSoundEvents { public static final RegistryObject WATER_EVAPORATE = register("block.water.evaporate"); + public static final RegistryObject ITEM_AMBROSIUM_SHARD = register("item.ambrosium_shard.use"); + public static final RegistryObject ITEM_SWET_BALL_USE = register("item.swet_ball.use"); + public static final RegistryObject ITEM_DART_SHOOTER_SHOOT = register("item.dart_shooter.shoot"); public static final RegistryObject ITEM_LIGHTNING_KNIFE_SHOOT = register("item.lightning_knife.shoot"); public static final RegistryObject ITEM_HAMMER_OF_KINGBDOGZ_SHOOT = register("item.hammer_of_kingbdogz.shoot"); diff --git a/src/main/java/com/aetherteam/aether/client/event/hooks/GuiHooks.java b/src/main/java/com/aetherteam/aether/client/event/hooks/GuiHooks.java index f7b852ec12..fa9f9f0e89 100644 --- a/src/main/java/com/aetherteam/aether/client/event/hooks/GuiHooks.java +++ b/src/main/java/com/aetherteam/aether/client/event/hooks/GuiHooks.java @@ -8,6 +8,7 @@ import com.aetherteam.aether.client.gui.screen.inventory.AccessoriesScreen; import com.aetherteam.aether.client.gui.screen.perks.AetherCustomizationsScreen; import com.aetherteam.aether.client.gui.screen.perks.MoaSkinsScreen; +import com.aetherteam.aether.entity.AetherBossMob; import com.aetherteam.aether.event.hooks.DimensionHooks; import com.aetherteam.aether.inventory.menu.AccessoriesMenu; import com.aetherteam.aether.network.AetherPacketHandler; @@ -46,16 +47,13 @@ import top.theillusivec4.curios.client.gui.CuriosScreen; import javax.annotation.Nullable; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; -public class GuiHooks { //todo without GridLayout, some gui elements need to be redone manually. - private static final ResourceLocation AETHER_BARS_LOCATION = new ResourceLocation(Aether.MODID, "textures/gui/boss_bar.png"); +public class GuiHooks { /** * Set of UUIDs of boss bars that belong to Aether bosses. */ - public static final Set BOSS_EVENTS = new HashSet<>(); + public static final Map BOSS_EVENTS = new HashMap<>(); private static boolean shouldAddButton = true; private static boolean generateTrivia = true; @Nullable @@ -268,14 +266,17 @@ public static void closeContainerMenu(int key, int action) { * @see com.aetherteam.aether.client.event.listeners.GuiListener#onRenderBossBar(CustomizeGuiOverlayEvent.BossEventProgress) */ public static void drawBossHealthBar(PoseStack poseStack, int x, int y, LerpingBossEvent bossEvent) { - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.setShaderTexture(0, AETHER_BARS_LOCATION); - drawBar(poseStack, x + 2, y + 2, bossEvent); - Component component = bossEvent.getName(); - int nameLength = Minecraft.getInstance().font.width(component); - int nameX = Minecraft.getInstance().getWindow().getGuiScaledWidth() / 2 - nameLength / 2; - int nameY = y - 9; - Minecraft.getInstance().font.drawShadow(poseStack, component, (float) nameX, (float) nameY, 16777215); + int entityID = BOSS_EVENTS.get(bossEvent.getId()); + if (Minecraft.getInstance().level != null && Minecraft.getInstance().level.getEntity(entityID) instanceof AetherBossMob aetherBossMob && aetherBossMob.getBossBarTexture() != null) { + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.setShaderTexture(0, aetherBossMob.getBossBarTexture()); + drawBar(poseStack, x + 2, y + 2, bossEvent); + Component component = bossEvent.getName(); + int nameLength = Minecraft.getInstance().font.width(component); + int nameX = Minecraft.getInstance().getWindow().getGuiScaledWidth() / 2 - nameLength / 2; + int nameY = y - 9; + Minecraft.getInstance().font.drawShadow(poseStack, component, (float) nameX, (float) nameY, 16777215); + } } /** @@ -297,6 +298,6 @@ public static void drawBar(PoseStack poseStack, int x, int y, BossEvent pBossEve * @return The {@link Boolean} value. */ public static boolean isAetherBossBar(UUID uuid) { - return BOSS_EVENTS.contains(uuid); + return BOSS_EVENTS.containsKey(uuid); } } diff --git a/src/main/java/com/aetherteam/aether/client/event/listeners/GuiListener.java b/src/main/java/com/aetherteam/aether/client/event/listeners/GuiListener.java index b50b92d537..867d2536e4 100644 --- a/src/main/java/com/aetherteam/aether/client/event/listeners/GuiListener.java +++ b/src/main/java/com/aetherteam/aether/client/event/listeners/GuiListener.java @@ -16,6 +16,7 @@ import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import java.util.UUID; @@ -55,7 +56,9 @@ public static void onGuiInitialize(ScreenEvent.Init.Post event) { public static void onGuiDraw(ScreenEvent.Render event) { Screen screen = event.getScreen(); PoseStack poseStack = event.getPoseStack(); - GuiHooks.drawTrivia(screen, poseStack); + if (!ModList.get().isLoaded("tipsmod")) { + GuiHooks.drawTrivia(screen, poseStack); + } GuiHooks.drawAetherTravelMessage(screen, poseStack); } diff --git a/src/main/java/com/aetherteam/aether/client/gui/screen/perks/MoaSkinsScreen.java b/src/main/java/com/aetherteam/aether/client/gui/screen/perks/MoaSkinsScreen.java index 6ee187f8ec..00f2367e94 100644 --- a/src/main/java/com/aetherteam/aether/client/gui/screen/perks/MoaSkinsScreen.java +++ b/src/main/java/com/aetherteam/aether/client/gui/screen/perks/MoaSkinsScreen.java @@ -24,6 +24,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Quaternion; +import com.mojang.math.Vector3f; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; @@ -412,8 +413,8 @@ public static void renderRotatingEntity(int posX, int posY, int scale, float ang PoseStack poseStack = new PoseStack(); poseStack.translate(0.0F, 0.0F, 1000.0F); poseStack.scale((float) scale, (float) scale, (float) scale); - Quaternion xQuaternion = new Quaternion(0, 0, 0, 0).toXYZ().rotation(Mth.PI); - Quaternion zQuaternion = new Quaternion(0, 0, 0, 0).toXYZ().rotation(angleYComponent * Mth.DEG_TO_RAD); + Quaternion xQuaternion = Vector3f.ZP.rotationDegrees(180.0F); + Quaternion zQuaternion = Vector3f.XP.rotationDegrees(angleYComponent); xQuaternion.mul(zQuaternion); poseStack.mulPose(xQuaternion); float yBodyRot = livingEntity.yBodyRot; diff --git a/src/main/java/com/aetherteam/aether/client/renderer/entity/MoaRenderer.java b/src/main/java/com/aetherteam/aether/client/renderer/entity/MoaRenderer.java index cd1b11675a..62b210bb8e 100644 --- a/src/main/java/com/aetherteam/aether/client/renderer/entity/MoaRenderer.java +++ b/src/main/java/com/aetherteam/aether/client/renderer/entity/MoaRenderer.java @@ -6,6 +6,7 @@ import com.aetherteam.aether.client.gui.screen.perks.MoaSkinsScreen; import com.aetherteam.aether.client.renderer.AetherModelLayers; import com.aetherteam.aether.client.renderer.entity.layers.MoaEmissiveLayer; +import com.aetherteam.aether.client.renderer.entity.layers.MoaSaddleEmissiveLayer; import com.aetherteam.aether.client.renderer.entity.layers.MoaSaddleLayer; import com.aetherteam.aether.client.renderer.entity.model.MoaModel; import com.aetherteam.aether.entity.passive.Moa; @@ -30,6 +31,7 @@ public MoaRenderer(EntityRendererProvider.Context context) { super(context, new MoaModel(context.bakeLayer(AetherModelLayers.MOA)), 0.7F); this.addLayer(new MoaEmissiveLayer(this)); this.addLayer(new MoaSaddleLayer(this, new MoaModel(context.bakeLayer(AetherModelLayers.MOA_SADDLE)))); + this.addLayer(new MoaSaddleEmissiveLayer(this, new MoaModel(context.bakeLayer(AetherModelLayers.MOA_SADDLE)))); } /** 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 new file mode 100644 index 0000000000..38d7baf772 --- /dev/null +++ b/src/main/java/com/aetherteam/aether/client/renderer/entity/layers/MoaSaddleEmissiveLayer.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 MoaSaddleEmissiveLayer extends RenderLayer { + private final MoaModel saddle; + + public MoaSaddleEmissiveLayer(RenderLayerParent entityRenderer, MoaModel saddleModel) { + super(entityRenderer); + this.saddle = saddleModel; + } + + /** + * Renders an emissive saddle 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) { + if (moa.isSaddled()) { + ResourceLocation moaSkin = this.getMoaSkinLocation(moa); + if (moaSkin != null) { + RenderType renderType = RenderType.eyes(moaSkin); + this.getParentModel().copyPropertiesTo(this.saddle); + 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); + } + } + } + + /** + * Retrieves the saddle 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 emissive 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().getSaddleEmissiveLocation(); + } else if (userSkinsData.containsKey(lastRiderUUID) && userSkinsData.get(lastRiderUUID).moaUUID() != null && userSkinsData.get(lastRiderUUID).moaUUID().equals(moaUUID)) { + return userSkinsData.get(lastRiderUUID).moaSkin().getSaddleEmissiveLocation(); + } + return null; + } +} diff --git a/src/main/java/com/aetherteam/aether/client/renderer/entity/model/BipedBirdModel.java b/src/main/java/com/aetherteam/aether/client/renderer/entity/model/BipedBirdModel.java index a11c57b685..0476befee4 100644 --- a/src/main/java/com/aetherteam/aether/client/renderer/entity/model/BipedBirdModel.java +++ b/src/main/java/com/aetherteam/aether/client/renderer/entity/model/BipedBirdModel.java @@ -45,8 +45,8 @@ public static LayerDefinition createBodyLayer(CubeDeformation cube) { head.addOrReplaceChild("jaw", CubeListBuilder.create().texOffs(24, 13).addBox(-2.0F, -1.0F, -6.0F, 4.0F, 1.0F, 8.0F, new CubeDeformation(-0.1F), 0.5F, 0.5F), PartPose.ZERO); head.addOrReplaceChild("neck", CubeListBuilder.create().texOffs( 22, 0).addBox(-1.0F, 0.0F, -1.0F, 2.0F, 6.0F, 2.0F, cube, 0.5F, 0.5F), PartPose.ZERO); PartDefinition body = partDefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 0).addBox(-3.0F, -3.0F, 0.0F, 6.0F, 8.0F, 5.0F, cube, 0.5F, 0.5F), PartPose.offsetAndRotation(0.0F, 16.0F, 0.0F, Mth.HALF_PI, 0.0F, 0.0F)); - partDefinition.addOrReplaceChild("right_leg", CubeListBuilder.create().texOffs(54, 21).addBox(-1.0F, -1.0F, -1.0F, 2.0F, 9.0F, 2.0F, cube, 0.5F, 0.5F), PartPose.offset(-2.0F, 16.0F, 1.0F)); - partDefinition.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(46, 21).addBox(-1.0F, -1.0F, -1.0F, 2.0F, 9.0F, 2.0F, cube, 0.5F, 0.5F), PartPose.offset(2.0F, 16.0F, 1.0F)); + partDefinition.addOrReplaceChild("right_leg", CubeListBuilder.create().texOffs(54, 21).addBox(-0.99F, -1.0F, -1.0F, 2.0F, 9.0F, 2.0F, cube, 0.5F, 0.5F), PartPose.offset(-2.0F, 16.0F, 1.0F)); + partDefinition.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(46, 21).addBox(-1.01F, -1.0F, -1.0F, 2.0F, 9.0F, 2.0F, cube, 0.5F, 0.5F), PartPose.offset(2.0F, 16.0F, 1.0F)); body.addOrReplaceChild("right_wing", CubeListBuilder.create().texOffs(40, 0).addBox(-1.0F, 0.0F, -2.0F, 1.0F, 8.0F, 4.0F, cube, 0.5F, 0.5F), PartPose.offset(-3.001F, -3.0F, 3.0F)); body.addOrReplaceChild("left_wing", CubeListBuilder.create().texOffs(30, 0).addBox(0.0F, 0.0F, -2.0F, 1.0F, 8.0F, 4.0F, cube, 0.5F, 0.5F), PartPose.offset(3.001F, -3.0F, 3.0F)); partDefinition.addOrReplaceChild("right_tail_feather", CubeListBuilder.create().texOffs(0, 26).addBox(-1.0F, -5.0F, 5.0F, 2.0F, 1.0F, 5.0F, new CubeDeformation(-0.3F), 0.5F, 0.5F), PartPose.offsetAndRotation(0.0F, 17.5F, 1.0F, 0.25F, -0.375F, 0.0F)); diff --git a/src/main/java/com/aetherteam/aether/entity/AetherBossMob.java b/src/main/java/com/aetherteam/aether/entity/AetherBossMob.java index 2f2202095b..34ea779f25 100644 --- a/src/main/java/com/aetherteam/aether/entity/AetherBossMob.java +++ b/src/main/java/com/aetherteam/aether/entity/AetherBossMob.java @@ -4,6 +4,7 @@ import com.aetherteam.aether.client.AetherSoundEvents; import com.aetherteam.nitrogen.entity.BossMob; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.Mob; import net.minecraft.world.level.block.Blocks; @@ -14,6 +15,7 @@ import net.minecraftforge.event.ForgeEventFactory; import org.apache.commons.lang3.tuple.Pair; +import javax.annotation.Nullable; import java.util.function.Predicate; /** @@ -89,4 +91,10 @@ default Pair getDefaultBounds(T entity) { BlockPos max = new BlockPos(Math.ceil(boundingBox.maxX - 1) + 1, Math.ceil(boundingBox.maxY - 1) + 1, Math.ceil(boundingBox.maxZ - 1) + 1); return Pair.of(min, max); } + + /** + * @return The {@link ResourceLocation} for this boss's health bar. + */ + @Nullable + ResourceLocation getBossBarTexture(); } diff --git a/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/Slider.java b/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/Slider.java index d78a9bc740..b417ef0880 100644 --- a/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/Slider.java +++ b/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/Slider.java @@ -1,5 +1,6 @@ package com.aetherteam.aether.entity.monster.dungeon.boss; +import com.aetherteam.aether.Aether; import com.aetherteam.aether.AetherTags; import com.aetherteam.aether.block.AetherBlocks; import com.aetherteam.aether.client.AetherSoundEvents; @@ -20,6 +21,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerBossEvent; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; @@ -332,7 +334,7 @@ public BlockState convertBlock(BlockState state) { @Override public void startSeenByPlayer(ServerPlayer player) { super.startSeenByPlayer(player); - PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Display(this.bossFight.getId()), player); + PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Display(this.bossFight.getId(), this.getId()), player); if (this.getDungeon() == null || this.getDungeon().isPlayerTracked(player)) { this.bossFight.addPlayer(player); } @@ -345,7 +347,7 @@ public void startSeenByPlayer(ServerPlayer player) { @Override public void stopSeenByPlayer(ServerPlayer player) { super.stopSeenByPlayer(player); - PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Remove(this.bossFight.getId()), player); + PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Remove(this.bossFight.getId(), this.getId()), player); this.bossFight.removePlayer(player); } @@ -484,6 +486,15 @@ public void setBossFight(boolean isFighting) { this.bossFight.setVisible(isFighting); } + /** + * @return The {@link ResourceLocation} for this boss's health bar. + */ + @Nullable + @Override + public ResourceLocation getBossBarTexture() { + return new ResourceLocation(Aether.MODID, "textures/gui/boss_bar_slider.png"); + } + /** * @return The {@link Integer} for the cooldown until another chat message can display. */ diff --git a/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/SunSpirit.java b/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/SunSpirit.java index 6320bdf77c..a7929f85ca 100644 --- a/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/SunSpirit.java +++ b/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/SunSpirit.java @@ -1,5 +1,6 @@ package com.aetherteam.aether.entity.monster.dungeon.boss; +import com.aetherteam.aether.Aether; import com.aetherteam.aether.AetherConfig; import com.aetherteam.aether.block.AetherBlocks; import com.aetherteam.aether.capability.AetherCapabilities; @@ -28,6 +29,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerBossEvent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; @@ -388,7 +390,7 @@ public BlockState convertBlock(BlockState state) { @Override public void startSeenByPlayer(ServerPlayer player) { super.startSeenByPlayer(player); - PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Display(this.bossFight.getId()), player); + PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Display(this.bossFight.getId(), this.getId()), player); if (this.getDungeon() == null || this.getDungeon().isPlayerTracked(player)) { this.bossFight.addPlayer(player); } @@ -401,7 +403,7 @@ public void startSeenByPlayer(ServerPlayer player) { @Override public void stopSeenByPlayer(ServerPlayer player) { super.stopSeenByPlayer(player); - PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Remove(this.bossFight.getId()), player); + PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Remove(this.bossFight.getId(), this.getId()), player); this.bossFight.removePlayer(player); } @@ -506,6 +508,15 @@ public void setBossFight(boolean isFighting) { this.bossFight.setVisible(isFighting); } + /** + * @return The {@link ResourceLocation} for this boss's health bar. + */ + @Nullable + @Override + public ResourceLocation getBossBarTexture() { + return new ResourceLocation(Aether.MODID, "textures/gui/boss_bar_sun_spirit.png"); + } + /** * @return The {@link Integer} for the cooldown until another chat message can display. */ diff --git a/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/ValkyrieQueen.java b/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/ValkyrieQueen.java index 1c185d9955..549a537264 100644 --- a/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/ValkyrieQueen.java +++ b/src/main/java/com/aetherteam/aether/entity/monster/dungeon/boss/ValkyrieQueen.java @@ -1,5 +1,6 @@ package com.aetherteam.aether.entity.monster.dungeon.boss; +import com.aetherteam.aether.Aether; import com.aetherteam.aether.AetherTags; import com.aetherteam.aether.block.AetherBlocks; import com.aetherteam.aether.client.AetherSoundEvents; @@ -32,6 +33,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerBossEvent; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; @@ -486,7 +488,7 @@ public BlockState convertBlock(BlockState state) { @Override public void startSeenByPlayer(ServerPlayer player) { super.startSeenByPlayer(player); - PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Display(this.bossFight.getId()), player); + PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Display(this.bossFight.getId(), this.getId()), player); if (this.getDungeon() == null || this.getDungeon().isPlayerTracked(player)) { this.bossFight.addPlayer(player); } @@ -499,7 +501,7 @@ public void startSeenByPlayer(ServerPlayer player) { @Override public void stopSeenByPlayer(ServerPlayer player) { super.stopSeenByPlayer(player); - PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Remove(this.bossFight.getId()), player); + PacketRelay.sendToPlayer(AetherPacketHandler.INSTANCE, new BossInfoPacket.Remove(this.bossFight.getId(), this.getId()), player); this.bossFight.removePlayer(player); } @@ -596,6 +598,15 @@ public void setBossFight(boolean isFighting) { this.bossFight.setVisible(isFighting); } + /** + * @return The {@link ResourceLocation} for this boss's health bar. + */ + @Nullable + @Override + public ResourceLocation getBossBarTexture() { + return new ResourceLocation(Aether.MODID, "textures/gui/boss_bar_valkyrie_queen.png"); + } + /** * Sets the bounds of the entire Silver Dungeon. * @param dungeonBounds The {@link AABB} bounds. 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 457dbee9b1..2369f927de 100644 --- a/src/main/java/com/aetherteam/aether/entity/passive/Moa.java +++ b/src/main/java/com/aetherteam/aether/entity/passive/Moa.java @@ -852,8 +852,12 @@ public void setAge(int age) { @Nullable @Override public ItemStack getPickResult() { - MoaEggItem moaEggItem = MoaEggItem.byId(this.getMoaType()); - return moaEggItem == null ? null : new ItemStack(moaEggItem); + if (this.getMoaType() != null) { + MoaEggItem moaEggItem = MoaEggItem.byId(this.getMoaType()); + return moaEggItem == null ? null : new ItemStack(moaEggItem); + } else { + return null; + } } @Override diff --git a/src/main/java/com/aetherteam/aether/event/hooks/AbilityHooks.java b/src/main/java/com/aetherteam/aether/event/hooks/AbilityHooks.java index 2355af8b81..b3260295db 100644 --- a/src/main/java/com/aetherteam/aether/event/hooks/AbilityHooks.java +++ b/src/main/java/com/aetherteam/aether/event/hooks/AbilityHooks.java @@ -25,8 +25,10 @@ import com.google.common.collect.ImmutableMap; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.item.ItemEntity; @@ -46,6 +48,7 @@ import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.ToolAction; import net.minecraftforge.common.ToolActions; import net.minecraftforge.event.entity.EntityStruckByLightningEvent; @@ -342,6 +345,50 @@ public static void stripGoldenOak(LevelAccessor accessor, BlockState state, Item } } + + /** + * Checks if an entity is too far away for the player to be able to interact with if they're trying to interact using a hand that doesn't contain a {@link ValkyrieTool}, but are still holding a Valkyrie Tool in another hand. + * @param target The target {@link Entity} being interacted with. + * @param player The {@link Player} attempting to interact. + * @param hand The {@link InteractionHand} used to interact. + * @return Whether the player is too far to interact, as a {@link Boolean}. + */ + public static boolean entityTooFar(Entity target, Player player, InteractionHand hand) { + if (hand == InteractionHand.OFF_HAND && hasValkyrieItemInMainHandOnly(player)) { + AttributeInstance attackRange = player.getAttribute(ForgeMod.ATTACK_RANGE.get()); + if (attackRange != null) { + AttributeModifier valkyrieModifier = attackRange.getModifier(ValkyrieTool.ATTACK_RANGE_MODIFIER_UUID); + if (valkyrieModifier != null) { + double range = player.getAttributeValue(ForgeMod.ATTACK_RANGE.get()) - valkyrieModifier.getAmount(); + double trueReach = range == 0 ? 0 : range + (player.isCreative() ? 3 : 0); // [CODE COPY] - IForgePlayer#getAttackRange(). + return !player.isCloseEnough(target, trueReach); + } + } + } + return false; + } + + /** + * Checks if a block is too far away for the player to be able to interact with if they're trying to interact using a hand that doesn't contain a {@link ValkyrieTool}, but are still holding a Valkyrie Tool in another hand. + * @param player The {@link Player} attempting to interact. + * @param hand The {@link InteractionHand} used to interact. + * @return Whether the player is too far to interact, as a {@link Boolean}. + */ + public static boolean blockTooFar(Player player, InteractionHand hand) { + if (hand == InteractionHand.OFF_HAND && hasValkyrieItemInMainHandOnly(player)) { + AttributeInstance reachDistance = player.getAttribute(ForgeMod.REACH_DISTANCE.get()); + if (reachDistance != null) { + AttributeModifier valkyrieModifier = reachDistance.getModifier(ValkyrieTool.REACH_DISTANCE_MODIFIER_UUID); + if (valkyrieModifier != null) { + double reach = player.getAttributeValue(ForgeMod.REACH_DISTANCE.get()) - valkyrieModifier.getAmount(); + double trueReach = reach == 0 ? 0 : reach + (player.isCreative() ? 0.5 : 0); // [CODE COPY] - IForgePlayer#getReachDistance(). + return player.pick(trueReach, 0.0F, false).getType() != HitResult.Type.BLOCK; + } + } + } + return false; + } + /** * Checks if the player is holding a {@link ValkyrieTool} in the main hand. * @param player The {@link Player} holding the Valkyrie Tool. diff --git a/src/main/java/com/aetherteam/aether/event/listeners/abilities/ToolAbilityListener.java b/src/main/java/com/aetherteam/aether/event/listeners/abilities/ToolAbilityListener.java index 99f6f86baa..5a86887d75 100644 --- a/src/main/java/com/aetherteam/aether/event/listeners/abilities/ToolAbilityListener.java +++ b/src/main/java/com/aetherteam/aether/event/listeners/abilities/ToolAbilityListener.java @@ -4,6 +4,7 @@ import com.aetherteam.aether.event.hooks.AbilityHooks; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -12,6 +13,7 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.ToolAction; +import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.level.BlockEvent; @@ -83,10 +85,50 @@ public static void doGoldenOakStripping(BlockEvent.BlockToolModificationEvent ev } /** - * @see com.aetherteam.aether.mixin.mixins.common.LivingEntityMixin#modifyReachAttribute(double, Attribute) + * @see ToolAbilityListener#checkEntityTooFar(PlayerEvent, Entity, Player, InteractionHand) */ @SubscribeEvent - public static void onRightClickItem(PlayerInteractEvent.RightClickItem event) { - INTERACTION_HAND = event.getHand(); + public static void onEntityAttack(AttackEntityEvent event) { + checkEntityTooFar(event, event.getTarget(), event.getEntity(), InteractionHand.MAIN_HAND); + } + + /** + * @see ToolAbilityListener#checkEntityTooFar(PlayerEvent, Entity, Player, InteractionHand) + * @see ToolAbilityListener#checkBlockTooFar(PlayerEvent, Player, InteractionHand) + * @see com.aetherteam.aether.mixin.mixins.common.ItemMixin#getPlayerPOVHitResult(Level, Player, ClipContext.Fluid, CallbackInfoReturnable) + */ + @SubscribeEvent + public static void onEntityInteract(PlayerInteractEvent event) { + if (event instanceof PlayerInteractEvent.EntityInteractSpecific entityInteractSpecific) { + checkEntityTooFar(entityInteractSpecific, entityInteractSpecific.getTarget(), entityInteractSpecific.getEntity(), entityInteractSpecific.getHand()); + } else if (event instanceof PlayerInteractEvent.EntityInteract entityInteract) { + checkEntityTooFar(entityInteract, entityInteract.getTarget(), entityInteract.getEntity(), entityInteract.getHand()); + } else if (event instanceof PlayerInteractEvent.RightClickBlock rightClickBlock) { + checkBlockTooFar(event, rightClickBlock.getEntity(), rightClickBlock.getHand()); + } else if (event instanceof PlayerInteractEvent.LeftClickBlock leftClickBlock) { + checkBlockTooFar(event, leftClickBlock.getEntity(), leftClickBlock.getHand()); + } else if (event instanceof PlayerInteractEvent.RightClickItem rightClickItem) { + INTERACTION_HAND = rightClickItem.getHand(); + } + } + + /** + * Cancels the given event if the targeted entity is too far away. + * @see AbilityHooks.ToolHooks#entityTooFar(Entity, Player, InteractionHand) + */ + private static void checkEntityTooFar(PlayerEvent event, Entity target, Player player, InteractionHand hand) { + if (!event.isCanceled() && AbilityHooks.ToolHooks.entityTooFar(target, player, hand)) { + event.setCanceled(true); + } + } + + /** + * Cancels the given event if the targeted block is too far away. + * @see AbilityHooks.ToolHooks#blockTooFar(Player, InteractionHand) + */ + private static void checkBlockTooFar(PlayerEvent event, Player player, InteractionHand hand) { + if (!event.isCanceled() && AbilityHooks.ToolHooks.blockTooFar(player, hand)) { + event.setCanceled(true); + } } } diff --git a/src/main/java/com/aetherteam/aether/item/materials/AmbrosiumShardItem.java b/src/main/java/com/aetherteam/aether/item/materials/AmbrosiumShardItem.java index 9e7bcf2b8c..264a84cd79 100644 --- a/src/main/java/com/aetherteam/aether/item/materials/AmbrosiumShardItem.java +++ b/src/main/java/com/aetherteam/aether/item/materials/AmbrosiumShardItem.java @@ -1,10 +1,12 @@ package com.aetherteam.aether.item.materials; import com.aetherteam.aether.AetherConfig; +import com.aetherteam.aether.client.AetherSoundEvents; import com.aetherteam.aether.item.materials.behavior.ItemUseConversion; import com.aetherteam.aether.item.miscellaneous.ConsumableItem; import com.aetherteam.aether.recipe.AetherRecipeTypes; import com.aetherteam.aether.recipe.recipes.block.AmbrosiumRecipe; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -25,7 +27,11 @@ public AmbrosiumShardItem(Properties properties) { @Override public InteractionResult useOn(UseOnContext context) { - return this.convertBlock(AetherRecipeTypes.AMBROSIUM_ENCHANTING.get(), context); + InteractionResult result = this.convertBlock(AetherRecipeTypes.AMBROSIUM_ENCHANTING.get(), context); + if (context.getLevel().isClientSide() && result == InteractionResult.SUCCESS) { + context.getLevel().playSound(context.getPlayer(), context.getClickedPos(), AetherSoundEvents.ITEM_AMBROSIUM_SHARD.get(), SoundSource.BLOCKS, 1.0F, 3.0F + (context.getLevel().getRandom().nextFloat() - context.getLevel().getRandom().nextFloat()) * 0.8F); + } + return result; } /** diff --git a/src/main/java/com/aetherteam/aether/item/materials/SwetBallItem.java b/src/main/java/com/aetherteam/aether/item/materials/SwetBallItem.java index fa34dd5f52..1c2564961f 100644 --- a/src/main/java/com/aetherteam/aether/item/materials/SwetBallItem.java +++ b/src/main/java/com/aetherteam/aether/item/materials/SwetBallItem.java @@ -1,8 +1,10 @@ package com.aetherteam.aether.item.materials; +import com.aetherteam.aether.client.AetherSoundEvents; import com.aetherteam.aether.item.materials.behavior.ItemUseConversion; import com.aetherteam.aether.recipe.AetherRecipeTypes; import com.aetherteam.aether.recipe.recipes.block.SwetBallRecipe; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.Item; import net.minecraft.world.item.context.UseOnContext; @@ -14,6 +16,10 @@ public SwetBallItem(Properties properties) { @Override public InteractionResult useOn(UseOnContext context) { - return this.convertBlock(AetherRecipeTypes.SWET_BALL_CONVERSION.get(), context); + InteractionResult result = this.convertBlock(AetherRecipeTypes.SWET_BALL_CONVERSION.get(), context); + if (context.getLevel().isClientSide() && result == InteractionResult.SUCCESS) { + context.getLevel().playSound(context.getPlayer(), context.getClickedPos(), AetherSoundEvents.ITEM_SWET_BALL_USE.get(), SoundSource.BLOCKS, 0.8F, 1.0F + (context.getLevel().getRandom().nextFloat() - context.getLevel().getRandom().nextFloat()) * 0.2F); + } + return result; } } diff --git a/src/main/java/com/aetherteam/aether/mixin/AetherMixinPlugin.java b/src/main/java/com/aetherteam/aether/mixin/AetherMixinPlugin.java new file mode 100644 index 0000000000..05c8416dd4 --- /dev/null +++ b/src/main/java/com/aetherteam/aether/mixin/AetherMixinPlugin.java @@ -0,0 +1,53 @@ +package com.aetherteam.aether.mixin; + +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +public class AetherMixinPlugin implements IMixinConfigPlugin { + private boolean isOptiFineInstalled = false; + + @Override + public void onLoad(String mixinPackage) { + try { + Class.forName("optifine.Installer", false, getClass().getClassLoader()); + isOptiFineInstalled = true; + } catch (ClassNotFoundException e) { + } + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if (this.isOptiFineInstalled) { + if (mixinClassName.equals("com.aetherteam.aether.mixin.mixins.client.BossHealthOverlayMixin")) return false; + if (mixinClassName.equals("com.aetherteam.aether.mixin.mixins.client.optifine.BossHealthOverlayMixin")) return true; + } + + return !mixinClassName.equals("com.aetherteam.aether.mixin.mixins.client.optifine.BossHealthOverlayMixin"); + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } +} diff --git a/src/main/java/com/aetherteam/aether/mixin/mixins/client/BossHealthOverlayMixin.java b/src/main/java/com/aetherteam/aether/mixin/mixins/client/BossHealthOverlayMixin.java index 292a3e49ca..a29a2d44b8 100644 --- a/src/main/java/com/aetherteam/aether/mixin/mixins/client/BossHealthOverlayMixin.java +++ b/src/main/java/com/aetherteam/aether/mixin/mixins/client/BossHealthOverlayMixin.java @@ -18,7 +18,7 @@ public class BossHealthOverlayMixin { */ @ModifyVariable(at = @At(value = "STORE"), method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;)V", index = 7) private CustomizeGuiOverlayEvent.BossEventProgress event(CustomizeGuiOverlayEvent.BossEventProgress event) { - event.setCanceled(GuiHooks.BOSS_EVENTS.contains(event.getBossEvent().getId())); + event.setCanceled(GuiHooks.BOSS_EVENTS.containsKey(event.getBossEvent().getId())); return event; } } diff --git a/src/main/java/com/aetherteam/aether/mixin/mixins/client/optifine/BossHealthOverlayMixin.java b/src/main/java/com/aetherteam/aether/mixin/mixins/client/optifine/BossHealthOverlayMixin.java new file mode 100644 index 0000000000..67e8fa7ecc --- /dev/null +++ b/src/main/java/com/aetherteam/aether/mixin/mixins/client/optifine/BossHealthOverlayMixin.java @@ -0,0 +1,26 @@ +package com.aetherteam.aether.mixin.mixins.client.optifine; + +import com.aetherteam.aether.client.event.hooks.GuiHooks; +import net.minecraft.client.gui.components.BossHealthOverlay; +import net.minecraftforge.client.event.CustomizeGuiOverlayEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(BossHealthOverlay.class) +public class BossHealthOverlayMixin { + /** + * Cancels the {@link CustomizeGuiOverlayEvent.BossEventProgress} GUI event after the event hook has been called for it. + * Made as a workaround for Jade's boss bar pushdown.
+ * This modifies the assignment of the {@link CustomizeGuiOverlayEvent.BossEventProgress} event variable. + * @param event The original {@link CustomizeGuiOverlayEvent.BossEventProgress} parameter value. + * @return The modified {@link CustomizeGuiOverlayEvent.BossEventProgress} parameter value. + */ + @ModifyVariable(at = @At(value = "STORE"), method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;)V", index = 9) + @SuppressWarnings({"MixinAnnotationTarget", "InvalidInjectorMethodSignature"}) + private Object event(Object event) { + CustomizeGuiOverlayEvent.BossEventProgress e = (CustomizeGuiOverlayEvent.BossEventProgress)event; + e.setCanceled(GuiHooks.BOSS_EVENTS.containsKey(e.getBossEvent().getId())); + return event; + } +} \ No newline at end of file diff --git a/src/main/java/com/aetherteam/aether/mixin/mixins/common/ItemMixin.java b/src/main/java/com/aetherteam/aether/mixin/mixins/common/ItemMixin.java new file mode 100644 index 0000000000..4ddea5b181 --- /dev/null +++ b/src/main/java/com/aetherteam/aether/mixin/mixins/common/ItemMixin.java @@ -0,0 +1,82 @@ +package com.aetherteam.aether.mixin.mixins.common; + +import com.aetherteam.aether.event.hooks.AbilityHooks; +import com.aetherteam.aether.event.listeners.abilities.ToolAbilityListener; +import com.aetherteam.aether.item.tools.abilities.ValkyrieTool; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Item.class) +public class ItemMixin { + /** + * Checks if a block-item interaction is too far away. + * @param level The {@link Level} for interaction. + * @param player The {@link Player} attempting to interact. + * @param fluidMode The {@link net.minecraft.world.level.ClipContext.Fluid} for interaction. + * @param cir The {@link BlockHitResult} {@link CallbackInfoReturnable} used for the method's return value. + * @see ItemMixin#interactionTooFar(Level, Player, InteractionHand, ClipContext.Fluid) + */ + @Inject(at = @At(value = "HEAD"), method = "getPlayerPOVHitResult(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/ClipContext$Fluid;)Lnet/minecraft/world/phys/BlockHitResult;", cancellable = true) + private static void getPlayerPOVHitResult(Level level, Player player, ClipContext.Fluid fluidMode, CallbackInfoReturnable cir) { + InteractionHand hand = ToolAbilityListener.INTERACTION_HAND; + if (hand != null) { + BlockHitResult hitResult = interactionTooFar(level, player, hand, fluidMode); + if (hitResult != null) { + cir.setReturnValue(hitResult); + } + } + } + + /** + * Checks if a block-item interaction is too far away for the player to be able to interact with if they're trying to interact using a hand that doesn't contain a {@link ValkyrieTool}, but are still holding a Valkyrie Tool in another hand. + * @param player The {@link Player} attempting to interact. + * @param hand The {@link InteractionHand} used to interact. + * @return Whether the player is too far to interact, as a {@link Boolean}. + * @see ItemMixin#getPlayerPOVHitResultForReach(Level, Player, double, ClipContext.Fluid) + */ + private static BlockHitResult interactionTooFar(Level level, Player player, InteractionHand hand, ClipContext.Fluid fluidMode) { + if (hand == InteractionHand.OFF_HAND && AbilityHooks.ToolHooks.hasValkyrieItemInMainHandOnly(player)) { + AttributeInstance reachDistance = player.getAttribute(ForgeMod.REACH_DISTANCE.get()); + if (reachDistance != null) { + AttributeModifier valkyrieModifier = reachDistance.getModifier(ValkyrieTool.REACH_DISTANCE_MODIFIER_UUID); + if (valkyrieModifier != null) { + double reach = player.getAttributeValue(ForgeMod.REACH_DISTANCE.get()) - valkyrieModifier.getAmount(); + double trueReach = reach == 0 ? 0 : reach + (player.isCreative() ? 0.5 : 0); // [CODE COPY] - IForgePlayer#getReachDistance(). + return getPlayerPOVHitResultForReach(level, player, trueReach, fluidMode); + } + } + } + return null; + } + + /** + * [CODE COPY] - {@link net.minecraft.world.item.Item#getPlayerPOVHitResult(Level, Player, ClipContext.Fluid)}.

+ * Accepts a specified reach value from a parameter instead of a hardcoded one. + */ + private static BlockHitResult getPlayerPOVHitResultForReach(Level level, Player player, double reach, ClipContext.Fluid fluidClip) { + float f = player.getXRot(); + float f1 = player.getYRot(); + Vec3 vec3 = player.getEyePosition(); + float f2 = Mth.cos(-f1 * Mth.DEG_TO_RAD - Mth.PI); + float f3 = Mth.sin(-f1 * Mth.DEG_TO_RAD - Mth.PI); + float f4 = -Mth.cos(-f * Mth.DEG_TO_RAD); + float f5 = Mth.sin(-f * Mth.DEG_TO_RAD); + float f6 = f3 * f4; + float f7 = f2 * f4; + Vec3 vec31 = vec3.add((double) f6 * reach, (double) f5 * reach, (double) f7 * reach); + return level.clip(new ClipContext(vec3, vec31, ClipContext.Block.OUTLINE, fluidClip, player)); + } +} diff --git a/src/main/java/com/aetherteam/aether/mixin/mixins/common/LivingEntityMixin.java b/src/main/java/com/aetherteam/aether/mixin/mixins/common/LivingEntityMixin.java index 282c385ad5..1d079ca576 100644 --- a/src/main/java/com/aetherteam/aether/mixin/mixins/common/LivingEntityMixin.java +++ b/src/main/java/com/aetherteam/aether/mixin/mixins/common/LivingEntityMixin.java @@ -1,17 +1,7 @@ package com.aetherteam.aether.mixin.mixins.common; -import com.aetherteam.aether.event.hooks.AbilityHooks; -import com.aetherteam.aether.event.listeners.abilities.ToolAbilityListener; import com.aetherteam.aether.item.combat.abilities.armor.PhoenixArmor; -import com.aetherteam.aether.item.tools.abilities.ValkyrieTool; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeInstance; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.entity.player.Player; -import net.minecraftforge.common.ForgeMod; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -29,29 +19,4 @@ private void travel(CallbackInfo ci) { LivingEntity livingEntity = (LivingEntity) (Object) this; PhoenixArmor.boostVerticalLavaSwimming(livingEntity); } - - /** - * Reduces the player's offhand reach to its normal distance when holding a Valkyrie Tool in the mainhand. - * This ensures that the offhand reach is not extended by the mainhand attribute modifier given by the Valkyrie Tool. - * @param reach The {@link Double} for the original reach attribute. - * @param attribute The reach {@link Attribute}. - * @return The {@link Double} for the new reach attribute. - */ - @ModifyExpressionValue(at = @At(value = "INVOKE", target = "net/minecraft/world/entity/ai/attributes/AttributeMap.getValue(Lnet/minecraft/world/entity/ai/attributes/Attribute;)D"), method = "getAttributeValue(Lnet/minecraft/world/entity/ai/attributes/Attribute;)D") - private double modifyReachAttribute(double reach, Attribute attribute) { - LivingEntity livingEntity = (LivingEntity) (Object) this; - if (livingEntity instanceof Player player && (attribute == ForgeMod.ATTACK_RANGE.get() || attribute == ForgeMod.REACH_DISTANCE.get())) { - InteractionHand hand = ToolAbilityListener.INTERACTION_HAND; - if (hand == InteractionHand.OFF_HAND && AbilityHooks.ToolHooks.hasValkyrieItemInMainHandOnly(player)) { - AttributeInstance reachDistance = player.getAttribute(attribute); - if (reachDistance != null) { - AttributeModifier valkyrieModifier = reachDistance.getModifier(ValkyrieTool.REACH_DISTANCE_MODIFIER_UUID); - if (valkyrieModifier != null) { - return reach - valkyrieModifier.getAmount(); - } - } - } - } - return reach; - } } diff --git a/src/main/java/com/aetherteam/aether/network/packet/serverbound/BossInfoPacket.java b/src/main/java/com/aetherteam/aether/network/packet/serverbound/BossInfoPacket.java index 05e964107e..a6abf35177 100644 --- a/src/main/java/com/aetherteam/aether/network/packet/serverbound/BossInfoPacket.java +++ b/src/main/java/com/aetherteam/aether/network/packet/serverbound/BossInfoPacket.java @@ -12,32 +12,36 @@ */ public abstract class BossInfoPacket implements BasePacket { protected final UUID bossEvent; + protected final int entityID; - public BossInfoPacket(UUID bossEvent) { + public BossInfoPacket(UUID bossEvent, int entityID) { this.bossEvent = bossEvent; + this.entityID = entityID; } @Override public void encode(FriendlyByteBuf buf) { buf.writeUUID(this.bossEvent); + buf.writeInt(this.entityID); } /** * Adds a boss bar for the client. */ public static class Display extends BossInfoPacket { - public Display(UUID bossEvent) { - super(bossEvent); + public Display(UUID bossEvent, int entityID) { + super(bossEvent, entityID); } public static Display decode(FriendlyByteBuf buf) { UUID bossEvent = buf.readUUID(); - return new Display(bossEvent); + int entityID = buf.readInt(); + return new Display(bossEvent, entityID); } @Override public void execute(Player playerEntity) { - GuiHooks.BOSS_EVENTS.add(this.bossEvent); + GuiHooks.BOSS_EVENTS.put(this.bossEvent, this.entityID); } } @@ -45,13 +49,14 @@ public void execute(Player playerEntity) { * Removes a boss bar for the client. */ public static class Remove extends BossInfoPacket { - public Remove(UUID bossEvent) { - super(bossEvent); + public Remove(UUID bossEvent, int entityID) { + super(bossEvent, entityID); } public static Remove decode(FriendlyByteBuf buf) { UUID bossEvent = buf.readUUID(); - return new Remove(bossEvent); + int entityID = buf.readInt(); + return new Remove(bossEvent, entityID); } @Override 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 c1f45a2daf..a1331cdca7 100644 --- a/src/main/java/com/aetherteam/aether/perk/types/MoaSkins.java +++ b/src/main/java/com/aetherteam/aether/perk/types/MoaSkins.java @@ -80,6 +80,47 @@ public static void registerMoaSkins() { .saddleLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/tivalier_green/tivalier_green_saddle.png")) .info(new MoaSkin.Info(User.Tier.ASCENTAN, true)) )); + 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")) + .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix.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")) + .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa.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")) + .skinLocation(new ResourceLocation(Aether.MODID, "textures/entity/mobs/moa/skins/construction_bot/construction_bot.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)) + )); + 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")) + .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)) + )); + 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")) + .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)) + )); 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)) @@ -123,6 +164,51 @@ public static void registerMoaSkins() { .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")) + .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")) + .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)) + )); + 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")) + .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")) + .info(new MoaSkin.Info(User.Tier.VALKYRIE, false)) + )); + 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")) + .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")) + .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")) + .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")) + .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")) + .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)) + )); } private static void register(String id, MoaSkin moaSkin) { @@ -142,13 +228,15 @@ public static class MoaSkin { @Nullable private final ResourceLocation emissiveLocation; 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.info); + this(id, properties.displayName, properties.userPredicate, properties.iconLocation, properties.skinLocation, properties.emissiveLocation, properties.saddleLocation, properties.saddleEmissiveLocation, properties.info); } - protected MoaSkin(String id, Component displayName, Predicate userPredicate, ResourceLocation iconLocation, ResourceLocation skinLocation, ResourceLocation emissiveLocation, ResourceLocation saddleLocation, Info info) { + protected MoaSkin(String id, Component displayName, Predicate userPredicate, ResourceLocation iconLocation, ResourceLocation skinLocation, ResourceLocation emissiveLocation, ResourceLocation saddleLocation, ResourceLocation saddleEmissiveLocation, Info info) { this.id = id; this.displayName = displayName; this.userPredicate = userPredicate; @@ -156,6 +244,7 @@ protected MoaSkin(String id, Component displayName, Predicate userPredicat this.skinLocation = skinLocation; this.emissiveLocation = emissiveLocation; this.saddleLocation = saddleLocation; + this.saddleEmissiveLocation = saddleEmissiveLocation; this.info = info; } @@ -209,6 +298,14 @@ public ResourceLocation getSaddleLocation() { return this.saddleLocation; } + /** + * @return The {@link ResourceLocation} of the {@link MoaSkin}'s saddle emissive overlay texture. + */ + @Nullable + public ResourceLocation getSaddleEmissiveLocation() { + return this.saddleEmissiveLocation; + } + /** * @return The Patreon {@link com.aetherteam.nitrogen.api.users.User.Tier} and lifetime {@link Boolean} {@link Info} of the {@link MoaSkin}. */ @@ -243,6 +340,8 @@ public static class Properties { @Nullable private ResourceLocation emissiveLocation = null; private ResourceLocation saddleLocation; + @Nullable + private ResourceLocation saddleEmissiveLocation = null; private Info info; /** @@ -293,6 +392,14 @@ public Properties saddleLocation(ResourceLocation saddleLocation) { return this; } + /** + * @see MoaSkin#getSaddleEmissiveLocation() + */ + public Properties saddleEmissiveLocation(ResourceLocation saddleEmissiveLocation) { + this.saddleEmissiveLocation = saddleEmissiveLocation; + return this; + } + /** * @see MoaSkin#getInfo() */ diff --git a/src/main/resources/aether.mixins.json b/src/main/resources/aether.mixins.json index 2a57e5771f..8445f88aeb 100644 --- a/src/main/resources/aether.mixins.json +++ b/src/main/resources/aether.mixins.json @@ -1,6 +1,7 @@ { "required": true, "package": "com.aetherteam.aether.mixin.mixins", + "plugin": "com.aetherteam.aether.mixin.AetherMixinPlugin", "minVersion": "0.8", "compatibilityLevel": "JAVA_17", "refmap": "aether.refmap.json", @@ -9,6 +10,7 @@ "common.DimensionTypeMixin", "common.DirectoryLockMixin", "common.FeatureMixin", + "common.ItemMixin", "common.LivingEntityMixin", "common.PlayerMixin", "common.accessor.AbstractContainerMenuAccessor", @@ -56,7 +58,8 @@ "client.accessor.PlayerModelAccessor", "client.accessor.QuadrupedModelAccessor", "client.accessor.ScreenAccessor", - "client.accessor.TitleScreenAccessor" + "client.accessor.TitleScreenAccessor", + "client.optifine.BossHealthOverlayMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa.png new file mode 100644 index 0000000000..aed43924e5 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_emissive.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_emissive.png new file mode 100644 index 0000000000..bb5e71b377 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_emissive.png differ 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 new file mode 100644 index 0000000000..2eee20b97f Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_saddle_emissive.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_saddle_emissive.png new file mode 100644 index 0000000000..fa683390eb Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/battle_sentry_moa/battle_sentry_moa_saddle_emissive.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/chicken_moa/chicken_moa.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/chicken_moa/chicken_moa.png new file mode 100644 index 0000000000..c0171c69be Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/chicken_moa/chicken_moa.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/chicken_moa/chicken_moa_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/chicken_moa/chicken_moa_saddle.png new file mode 100644 index 0000000000..69a0960c59 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/chicken_moa/chicken_moa_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot.png new file mode 100644 index 0000000000..814c26e03c Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_emissive.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_emissive.png new file mode 100644 index 0000000000..0af0382099 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_emissive.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_saddle.png new file mode 100644 index 0000000000..71b2b9f9cc Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/construction_bot/construction_bot_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix.png new file mode 100644 index 0000000000..b7bca86700 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix_emissive.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix_emissive.png new file mode 100644 index 0000000000..79347f3f1a Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix_emissive.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix_saddle.png new file mode 100644 index 0000000000..c3b6461367 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/frozen_phoenix/frozen_phoenix_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa.png new file mode 100644 index 0000000000..e2193a38d1 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa_saddle.png new file mode 100644 index 0000000000..3de4b7629a Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gargoyle_moa/gargoyle_moa_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix.png new file mode 100644 index 0000000000..17167d5379 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix_saddle.png new file mode 100644 index 0000000000..b5afdd0cc5 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/gilded_gharrix/gilded_gharrix_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa.png new file mode 100644 index 0000000000..26b926fb9b Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_emissive.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_emissive.png new file mode 100644 index 0000000000..0d5ed47424 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_emissive.png differ 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 new file mode 100644 index 0000000000..d47bb1cdb9 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/molten_moa/molten_moa_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/mossy_statue_moa/mossy_statue_moa.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/mossy_statue_moa/mossy_statue_moa.png new file mode 100644 index 0000000000..b509593621 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/mossy_statue_moa/mossy_statue_moa.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/mossy_statue_moa/mossy_statue_moa_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/mossy_statue_moa/mossy_statue_moa_saddle.png new file mode 100644 index 0000000000..0b81bd654f Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/mossy_statue_moa/mossy_statue_moa_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/phoenix_moa/phoenix_moa_emissive.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/phoenix_moa/phoenix_moa_emissive.png index 41f68c6195..1c24062f2f 100644 Binary files a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/phoenix_moa/phoenix_moa_emissive.png and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/phoenix_moa/phoenix_moa_emissive.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/stratus/stratus.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/stratus/stratus.png new file mode 100644 index 0000000000..c88c338158 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/stratus/stratus.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/stratus/stratus_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/stratus/stratus_saddle.png new file mode 100644 index 0000000000..11bedc5e23 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/stratus/stratus_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa.png new file mode 100644 index 0000000000..d848df41a7 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa_emissive.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa_emissive.png new file mode 100644 index 0000000000..024d8a1b0a Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa_emissive.png differ diff --git a/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa_saddle.png b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa_saddle.png new file mode 100644 index 0000000000..9ad0083a30 Binary files /dev/null and b/src/main/resources/assets/aether/textures/entity/mobs/moa/skins/undead_moa/undead_moa_saddle.png differ diff --git a/src/main/resources/assets/aether/textures/gui/boss_bar.png b/src/main/resources/assets/aether/textures/gui/boss_bar_slider.png similarity index 100% rename from src/main/resources/assets/aether/textures/gui/boss_bar.png rename to src/main/resources/assets/aether/textures/gui/boss_bar_slider.png diff --git a/src/main/resources/assets/aether/textures/gui/boss_bar_sun_spirit.png b/src/main/resources/assets/aether/textures/gui/boss_bar_sun_spirit.png new file mode 100644 index 0000000000..251dde5870 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/boss_bar_sun_spirit.png differ diff --git a/src/main/resources/assets/aether/textures/gui/boss_bar_valkyrie_queen.png b/src/main/resources/assets/aether/textures/gui/boss_bar_valkyrie_queen.png new file mode 100644 index 0000000000..251dde5870 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/boss_bar_valkyrie_queen.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/battle_sentry_moa_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/battle_sentry_moa_icon.png new file mode 100644 index 0000000000..240ff377c1 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/battle_sentry_moa_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/chicken_moa_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/chicken_moa_icon.png new file mode 100644 index 0000000000..8e1f07e593 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/chicken_moa_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/construction_bot_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/construction_bot_icon.png new file mode 100644 index 0000000000..8d2590a440 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/construction_bot_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/frozen_phoenix_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/frozen_phoenix_icon.png new file mode 100644 index 0000000000..e3444d42c1 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/frozen_phoenix_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/gargoyle_moa_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/gargoyle_moa_icon.png new file mode 100644 index 0000000000..38a9189f55 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/gargoyle_moa_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/gilded_gharrix_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/gilded_gharrix_icon.png new file mode 100644 index 0000000000..5b78f3ce36 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/gilded_gharrix_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/molten_moa_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/molten_moa_icon.png new file mode 100644 index 0000000000..8e0f6de8f4 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/molten_moa_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/mossy_statue_moa_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/mossy_statue_moa_icon.png new file mode 100644 index 0000000000..2bbb4e0487 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/mossy_statue_moa_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/stratus_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/stratus_icon.png new file mode 100644 index 0000000000..0581172125 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/stratus_icon.png differ diff --git a/src/main/resources/assets/aether/textures/gui/perks/skins/icons/undead_moa_icon.png b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/undead_moa_icon.png new file mode 100644 index 0000000000..3d94f37146 Binary files /dev/null and b/src/main/resources/assets/aether/textures/gui/perks/skins/icons/undead_moa_icon.png differ diff --git a/src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar.png b/src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar_slider.png similarity index 100% rename from src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar.png rename to src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar_slider.png diff --git a/src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar_sun_spirit.png b/src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar_sun_spirit.png new file mode 100644 index 0000000000..9eb118040e Binary files /dev/null and b/src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar_sun_spirit.png differ diff --git a/src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar_valkyrie_queen.png b/src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar_valkyrie_queen.png new file mode 100644 index 0000000000..9eb118040e Binary files /dev/null and b/src/main/resources/packs/classic_base/assets/aether/textures/gui/boss_bar_valkyrie_queen.png differ