diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java index 7bcb75be1e..ffd46dc6f4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java @@ -3,10 +3,14 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityWolf; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.AnimalTamer; +import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import net.minecraft.server.PathEntity; public class CraftWolf extends CraftAnimals implements Wolf { + private AnimalTamer owner; + public CraftWolf(CraftServer server, EntityWolf wolf) { super(server, wolf); } @@ -25,41 +29,85 @@ public class CraftWolf extends CraftAnimals implements Wolf { public void setSitting(boolean sitting) { getHandle().setSitting(sitting); + // TODO determine what the following would do - it is affected every time a player makes their wolf sit or stand + //getHandle().ay = false; + setPath((PathEntity) null); } - public boolean isTame() { + public boolean isTamed() { return getHandle().m_(); } - - public void setTame(boolean tame) { + + public void setTamed(boolean tame) { getHandle().d(tame); } - - public String getOwner() { + + public AnimalTamer getOwner() { + // If the wolf has a previously set owner use that, otherwise try and find the player who owns it + if (owner == null) { + // TODO try and recover owner from persistence store before defaulting to playername + owner = getServer().getPlayer(getOwnerName()); + } + return owner; + } + + public void setOwner(AnimalTamer tamer) { + owner = tamer; + if (owner != null) { + setTamed(true); /* Make him tame */ + setPath((PathEntity) null); /* Clear path */ + /* Set owner */ + // TODO persist owner to the persistence store + if (owner instanceof Player) { + setOwnerName(((Player) owner).getName()); + } else { + setOwnerName(""); + } + } else { + setTamed(false); /* Make him not tame */ + setOwnerName(""); /* Clear owner */ + } + } + + /** + * The owner's name is how MC knows and persists the Wolf's owner. Since we choose to instead use an AnimalTamer, this functionality + * is used only as a backup. If the animal tamer is a player, we will store their name, otherwise we store an empty string. + * @return the owner's name, if they are a player; otherwise, the empty string or null. + */ + String getOwnerName() { return getHandle().x(); } - - public void setOwner(String player) { - EntityWolf e = getHandle(); - if ((player != null) && (player.length() > 0)) { - e.d(true); /* Make him tame */ - e.a((PathEntity)null); /* Clear path */ - e.a(player); /* Set owner */ - } - else { - e.d(false); /* Make him not tame */ - e.a(""); /* Clear owner */ - } + void setOwnerName(String ownerName) { + getHandle().a(ownerName); } + /** + * Only used internally at the moment, and there to set the path to null (that is stop the thing from running around) + * TODO use this later to extend the API, when we have Path classes in Bukkit + * @param pathentity currently the MC defined PathEntity class. Should be replaced with an API interface at some point. + */ + private void setPath(PathEntity pathentity) { + getHandle().a(pathentity); + } + + /* + * This method requires a(boolean) to be made visible. It will allow for hearts to be animated on a successful taming. + * TODO add this to the API, and make it visible + private void playTamingAnimation(boolean successful){ + getHandle().a(successful); + } + */ + @Override public EntityWolf getHandle() { + // It's somewhat easier to override this here, as many internal methods rely on EntityWolf specific methods. + // Doing this has no impact on anything outside this class. return (EntityWolf) entity; } @Override public String toString() { - return "CraftWolf[anger=" + isAngry() + ",owner=" + getOwner() + ",tame=" + isTame() + ",sitting=" + isSitting() + "]"; + return "CraftWolf[anger=" + isAngry() + ",owner=" + getOwner() + ",tame=" + isTamed() + ",sitting=" + isSitting() + "]"; } }