package net.t7seven7t.craftfx;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import java.util.Optional;
import static java.util.Optional.empty;
import static java.util.Optional.of;
/**
*
*/
public class Target {
private final Object target;
public Target(Object target) {
if (target instanceof Target) {
this.target = ((Target) target).target;
} else {
this.target = target;
}
}
@Override
public String toString() {
return "Target{" +
"target=" + target +
'}';
}
public Optional<Player> getPlayer() {
return as(Player.class);
}
public Optional<Block> getBlock() {
return as(Block.class);
}
public Optional<Entity> getEntity() {
return as(Entity.class);
}
public <T extends Entity> Optional<T> getEntity(Class<T> clazz) {
return as(clazz);
}
public Optional<Location> getLocation() {
return as(Location.class);
}
public Optional<Location> getAsLocation() {
return Optional.ofNullable(getBlock().map(Block::getLocation)
.orElse(getEntity().map(Entity::getLocation)
.orElse(getLocation().orElse(null))));
}
public Optional<Block> getAsBlock() {
final Optional<Block> optBlock = getBlock();
if (optBlock.isPresent()) return optBlock;
return Optional.ofNullable(getAsLocation().map(l -> l.getBlock()).orElse(null));
}
public <T> Optional<T> as(Class<T> clazz) {
return clazz.isInstance(target) ? of(clazz.cast(target)) : empty();
}
}