blob: 88f2ca8a07110cf1f6db51e79e1a1ea73e0aaca7 [file] [log] [blame] [raw]
package net.glowstone.entity.passive;
import lombok.Getter;
import net.glowstone.EventFactory;
import net.glowstone.entity.GlowAnimal;
import net.glowstone.entity.meta.MetadataIndex;
import net.glowstone.entity.meta.MetadataIndex.TameableFlags;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.AnimalTamer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.entity.EntityTameEvent;
import java.util.UUID;
public abstract class GlowTameable extends GlowAnimal implements Tameable {
private static final MetadataIndex META_STATUS = MetadataIndex.TAMEABLEAANIMAL_STATUS;
private static final MetadataIndex META_OWNER = MetadataIndex.TAMEABLEANIMAL_OWNER;
private AnimalTamer owner;
@Getter
private UUID ownerUniqueId;
public GlowTameable(Location location, EntityType type, double maxHealth) {
super(location, type, maxHealth);
}
protected GlowTameable(Location location, EntityType type, double maxHealth,
AnimalTamer owner) {
super(location, type, maxHealth);
if (owner != null) {
this.owner = owner;
metadata.set(META_OWNER, owner.getUniqueId());
}
}
@Override
public boolean isTamed() {
return metadata.getBit(META_STATUS, TameableFlags.IS_TAME);
}
@Override
public void setTamed(boolean isTamed) {
metadata.setBit(META_STATUS, TameableFlags.IS_TAME, isTamed);
}
@Override
public AnimalTamer getOwner() {
return owner instanceof Player ? owner : Bukkit.getPlayer(ownerUniqueId);
}
@Override
public void setOwner(AnimalTamer animalTamer) {
if (animalTamer == null) {
owner = null;
ownerUniqueId = null;
return;
}
owner = animalTamer;
ownerUniqueId = animalTamer.getUniqueId();
metadata.set(META_OWNER, owner.getUniqueId());
}
/**
* Added needed method for Storage to convert from UUID to owners.
*
* <p>The UUID's are validated through offline player checking.
*
* <p>If a player with the specified UUID has not played on the server before, the owner is not
* set.
*
* @param ownerUniqueId The player UUID of the owner.
*/
public void setOwnerUniqueId(UUID ownerUniqueId) {
if (ownerUniqueId == null) {
this.ownerUniqueId = null;
return;
}
OfflinePlayer player = Bukkit.getOfflinePlayer(ownerUniqueId);
if (player != null && player.hasPlayedBefore()) {
this.ownerUniqueId = ownerUniqueId;
}
}
/**
* Checks if this animal is sitting.
*
* @return true if sitting
*/
public boolean isSitting() {
return metadata.getBit(META_STATUS, TameableFlags.IS_SITTING);
}
/**
* Sets if this animal is sitting. Will remove any path that the animal
* was following beforehand.
*
* @param isSitting true if sitting
*/
public void setSitting(boolean isSitting) {
metadata.setBit(META_STATUS, TameableFlags.IS_SITTING, isSitting);
}
/**
* Fires an {@link EntityTameEvent}, and checks whether it was cancelled.
*
* @param owner the {@link AnimalTamer} performing the action.
* @return false if the event was cancelled, true otherwise.
*/
protected boolean fireEntityTameEvent(AnimalTamer owner) {
return !EventFactory.getInstance().callEvent(
new EntityTameEvent(this, owner)
).isCancelled();
}
}