53 lines
2.1 KiB
Java
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);
|
|
}
|
|
}
|