package com.kasetoatz.elytramace; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.*; import net.minecraft.registry.tag.ItemTags; import net.minecraft.registry.tag.TagKey; import net.minecraft.util.Hand; import java.util.Comparator; public class ElytraMace implements ClientModInitializer { private int getItem(PlayerInventory inventory, Item item) { for (int i = 0; i < 9; i++) { if (inventory.getStack(i).isOf(item)) { return i; } } return -1; } private int getBestItem(PlayerInventory inventory, TagKey tag) { int index = -1; int durability = -1; for (int i = 0; i < 9; i++) { ItemStack stack = inventory.getStack(i); int maxDamage = stack.getMaxDamage(); if (stack.isIn(tag) && maxDamage > durability) { index = i; durability = maxDamage; } } return index; } @Override public void onInitializeClient() { ClientTickEvents.END_CLIENT_TICK.register(client -> { if (client.player == null || client.interactionManager == null || client.world == null) { return; } LivingEntity target = client.world.getEntitiesByClass(LivingEntity.class, client.player.getBoundingBox().expand(client.player.getAttributeValue(EntityAttributes.ENTITY_INTERACTION_RANGE) + client.player.getVelocity().length() * 2), e -> e != client.player).stream().min(Comparator.comparingDouble(client.player::squaredDistanceTo)).orElse(null); if (target == null || client.player.fallDistance < 1.5) { return; } PlayerInventory inventory = client.player.getInventory(); if (client.player.isGliding()) { int chestplate = getBestItem(inventory, ItemTags.CHEST_ARMOR); if (chestplate == -1) { return; } inventory.setSelectedSlot(chestplate); client.interactionManager.interactItem(client.player, Hand.MAIN_HAND); } else { int mace = getItem(inventory, Items.MACE); int elytra = getItem(inventory, Items.ELYTRA); if (mace == -1 || elytra == -1) { return; } inventory.setSelectedSlot(elytra); client.interactionManager.interactItem(client.player, Hand.MAIN_HAND); int axe = getBestItem(inventory, ItemTags.AXES); if (target.isBlocking() && axe > -1) { inventory.setSelectedSlot(axe); client.interactionManager.attackEntity(client.player, target); } inventory.setSelectedSlot(mace); client.interactionManager.attackEntity(client.player, target); int fireworks = getItem(inventory, Items.FIREWORK_ROCKET); if (fireworks != -1) { inventory.setSelectedSlot(fireworks); } } }); } }