Citizens2/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java

80 lines
2.6 KiB
Java
Raw Normal View History

package net.citizensnpcs.npc.ai;
2012-07-18 17:42:43 +02:00
import net.citizensnpcs.api.ai.EntityTarget;
import net.citizensnpcs.api.ai.TargetType;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.util.Util;
import net.minecraft.server.EntityLiving;
import net.minecraft.server.EntityMonster;
2012-05-08 15:38:28 +02:00
import net.minecraft.server.EntityPlayer;
import net.minecraft.server.Packet18ArmAnimation;
2012-07-18 17:42:43 +02:00
import org.bukkit.Location;
import org.bukkit.craftbukkit.entity.CraftLivingEntity;
import org.bukkit.entity.LivingEntity;
2012-07-18 17:42:43 +02:00
public class MCTargetStrategy implements PathStrategy, EntityTarget {
private final boolean aggro;
2012-03-02 11:36:54 +01:00
private final EntityLiving handle, target;
2012-07-18 17:42:43 +02:00
private final float speed;
2012-07-18 17:42:43 +02:00
public MCTargetStrategy(CitizensNPC handle, LivingEntity target, boolean aggro, float speed) {
2012-03-01 16:12:47 +01:00
this.handle = handle.getHandle();
this.target = ((CraftLivingEntity) target).getHandle();
this.aggro = aggro;
2012-07-18 17:42:43 +02:00
this.speed = speed;
}
2012-03-02 11:36:54 +01:00
private boolean canAttack() {
return handle.attackTicks == 0
&& (handle.boundingBox.e > target.boundingBox.b && handle.boundingBox.b < target.boundingBox.e)
&& distanceSquared() <= ATTACK_DISTANCE && handle.h(target);
}
private double distanceSquared() {
return handle.getBukkitEntity().getLocation().distanceSquared(target.getBukkitEntity().getLocation());
}
2012-07-19 14:58:22 +02:00
@Override
public LivingEntity getTarget() {
return (LivingEntity) target.getBukkitEntity();
}
@Override
public Location getTargetAsLocation() {
return getTarget().getLocation();
}
@Override
public TargetType getTargetType() {
return TargetType.ENTITY;
}
@Override
public boolean isAggressive() {
return aggro;
}
@Override
public boolean update() {
if (target == null || target.dead)
return true;
2012-07-18 17:42:43 +02:00
new MCNavigationStrategy(handle, target, speed).update();
2012-03-23 00:49:15 +01:00
handle.getControllerLook().a(target, 10.0F, handle.D());
2012-02-04 10:58:51 +01:00
if (aggro && canAttack()) {
if (handle instanceof EntityMonster) {
2012-05-08 15:38:28 +02:00
((EntityMonster) handle).a((net.minecraft.server.Entity) target);
// the cast is necessary to resolve overloaded method a
} else if (handle instanceof EntityPlayer) {
EntityPlayer humanHandle = (EntityPlayer) handle;
humanHandle.attack(target);
2012-07-18 17:42:43 +02:00
Util.sendPacketNearby(handle.getBukkitEntity().getLocation(), new Packet18ArmAnimation(
humanHandle, 1), 64);
2012-02-04 10:58:51 +01:00
}
}
2012-02-04 09:13:20 +01:00
return false;
}
2012-02-04 10:58:51 +01:00
private static final double ATTACK_DISTANCE = 1.75 * 1.75;
2012-02-04 09:13:20 +01:00
}