package com.bergerkiller.bukkit.common.utils;
import java.util.UUID;
import net.minecraft.server.Entity;
import net.minecraft.server.EntityLiving;
import net.minecraft.server.GenericAttributes;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import com.bergerkiller.bukkit.common.entity.CommonEntity;
import com.bergerkiller.bukkit.common.internal.CommonNMS;
import com.bergerkiller.bukkit.common.internal.CommonPlugin;
public class EntityUtil extends EntityPropertyUtil {
/**
* Finds an Entity that has the given entity UUID and is of the type specified from a world
*
* @param world to find the Entity
* @param uid of the Entity to find
* @param type Class of the Entity to find
* @return the found Entity, or null if not found
*/
public static <T extends org.bukkit.entity.Entity> T getEntity(org.bukkit.World world, UUID uid, Class<T> type) {
return CommonUtil.tryCast(getEntity(world, uid), type);
}
/**
* Finds an Entity that has the given entity UUID from a world
*
* @param world to find the Entity
* @param uid of the Entity to find
* @return the found Entity, or null if not found
*/
public static org.bukkit.entity.Entity getEntity(org.bukkit.World world, UUID uid) {
for (org.bukkit.entity.Entity entity : WorldUtil.getEntities(world)) {
if (entity.getUniqueId().equals(uid)) {
return entity;
}
}
return null;
}
/**
* Adds a single entity to the server
*
* @param entity to add
*/
public static void addEntity(org.bukkit.entity.Entity entity) {
Entity nmsentity = CommonNMS.getNative(entity);
nmsentity.world.getChunkAt(MathUtil.toChunk(nmsentity.locX), MathUtil.toChunk(nmsentity.locZ));
nmsentity.dead = false;
// Remove an entity tracker for this entity if it was present
WorldUtil.getTracker(entity.getWorld()).stopTracking(entity);
// Add the entity to the world
nmsentity.world.addEntity(nmsentity);
}
/**
* Changes the speed of a living entity
*
* @param entity Entity
* @param speed New entity speed
*/
public static void setSpeed(LivingEntity entity, double speed) {
EntityLiving nmsEntity = CommonNMS.getNative(entity);
nmsEntity.getAttributeInstance(GenericAttributes.d).setValue(speed);
}
/**
* Gets the speed of a living entity
*
* @param entity to check speed
* @return entity speed
*/
public static double getSpeed(LivingEntity entity) {
EntityLiving nmsEntity = CommonNMS.getNative(entity);
return nmsEntity.getAttributeInstance(GenericAttributes.d).getValue();
}
/**
* Checks whether a given Entity should be ignored when working with it<br>
* This could be because another plugin is operating on it, or for Virtual items
*
* @param entity to check
* @return True if the entity should be ignored, False if not
*/
public static boolean isIgnored(org.bukkit.entity.Entity entity) {
return CommonPlugin.getInstance().getEntityBlacklist().isFiltered(entity);
}
/*
* Is near something?
*/
public static boolean isNearChunk(org.bukkit.entity.Entity entity, final int cx, final int cz, final int chunkview) {
final int x = MathUtil.toChunk(getLocX(entity)) - cx;
final int z = MathUtil.toChunk(getLocZ(entity)) - cz;
return Math.abs(x) <= chunkview && Math.abs(z) <= chunkview;
}
public static boolean isNearBlock(org.bukkit.entity.Entity entity, final int bx, final int bz, final int blockview) {
final int x = MathUtil.floor(getLocX(entity) - bx);
final int z = MathUtil.floor(getLocZ(entity) - bz);
return Math.abs(x) <= blockview && Math.abs(z) <= blockview;
}
/**
* Performs entity on entity collision logic for an entity.
* This will perform the push logic caused by collision.
*
* @param entity to work on
* @param with the entity to collide
*/
public static void doCollision(org.bukkit.entity.Entity entity, org.bukkit.entity.Entity with) {
CommonNMS.getNative(entity).collide(CommonNMS.getNative(with));
}
/**
* Teleports an entity in the next tick
*
* @param entity to teleport
* @param to location to teleport to
*/
public static void teleportNextTick(final org.bukkit.entity.Entity entity, final Location to) {
CommonUtil.nextTick(new Runnable() {
public void run() {
teleport(entity, to);
}
});
}
/**
* Teleports an entity
*
* @param entity to teleport
* @param to location to teleport to
*/
public static boolean teleport(final org.bukkit.entity.Entity entity, final Location to) {
return CommonEntity.get(entity).teleport(to);
}
}