53 lines
2.1 KiB
Java

package com.jenny.magic.items.wands;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class WandPush extends BaseWand {
public WandPush(Properties properties) {
super(properties);
}
private static @Nullable LivingEntity lookingAtClosest(@NotNull Player player) {
LivingEntity closest = null;
for (LivingEntity e : player.level().getEntitiesOfClass(LivingEntity.class,
new AABB(player.position().subtract(10, 10, 10), player.position().add(10, 10, 10)))) {
if (!e.is(player) && lookingAtEntity(e, player)) {
if (closest == null || closest.distanceTo(player) > e.distanceTo(player)) {
closest = e;
}
}
}
return closest;
}
private static boolean lookingAtEntity(Entity e, Player p) {
Vec3 vec3 = p.getViewVector(1.0F).normalize();
Vec3 vec31 = new Vec3(e.getX() - p.getX(), e.getEyeY() - p.getEyeY(), e.getZ() - p.getZ());
double d0 = vec31.length();
vec31 = vec31.normalize();
double d1 = vec3.dot(vec31);
return d1 > (double) 1.0F - 0.025 / d0 && p.hasLineOfSight(e);
}
public @NotNull InteractionResultHolder<ItemStack> use(@NotNull Level pLevel, Player pPlayer, @NotNull InteractionHand pHand) {
ItemStack itemStack = pPlayer.getItemInHand(pHand);
LivingEntity target = lookingAtClosest(pPlayer);
if (target != null && tryUse(itemStack, pPlayer)) {
target.addDeltaMovement(target.position().subtract(pPlayer.position()).normalize().scale(2));
return InteractionResultHolder.consume(itemStack);
}
return InteractionResultHolder.fail(itemStack);
}
}