Files
ElytraMace/src/main/java/com/kasetoatz/elytramace/ElytraMace.java
2026-02-16 23:46:55 +01:00

97 lines
3.5 KiB
Java

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<Item> 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);
}
}
});
}
}