package net.glowstone.entity.passive;
import com.flowpowered.networking.Message;
import net.glowstone.entity.meta.MetadataIndex;
import net.glowstone.entity.meta.MetadataMap;
import net.glowstone.inventory.GlowHorseInventory;
import net.glowstone.net.message.play.entity.EntityMetadataMessage;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.AnimalTamer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Horse;
import org.bukkit.inventory.HorseInventory;
import java.util.List;
import java.util.Random;
import java.util.UUID;
public class GlowHorse extends GlowTameable implements Horse {
private Variant variant;
private Color horseColor;
private Style horseStyle;
private boolean hasChest;
private int domestication;
private int maxDomestication;
private double jumpStrength;
private boolean eatingHay;
private boolean hasReproduced;
private int temper;
private UUID ownerUUID;
private HorseInventory inventory = new GlowHorseInventory(this);
public GlowHorse(Location location) {
this(location, null);
}
protected GlowHorse(Location location, AnimalTamer owner) {
super(location, EntityType.HORSE, owner);
this.ownerUUID = owner.getUniqueId();
Random rand = new Random();
// Todo make this cleaner and safer to use for spawning random horses
this.variant = Variant.values()[rand.nextInt(4)];
this.horseStyle = Style.values()[rand.nextInt(3)];
this.horseColor = Color.values()[rand.nextInt(6)];
}
@Override
public Variant getVariant() {
return this.variant;
}
@Override
public void setVariant(Variant variant) {
this.variant = variant;
}
@Override
public Color getColor() {
return horseColor;
}
@Override
public void setColor(Color color) {
this.horseColor = color;
}
@Override
public Style getStyle() {
return horseStyle;
}
@Override
public void setStyle(Style style) {
this.horseStyle = style;
}
@Override
public boolean isCarryingChest() {
return hasChest;
}
@Override
public void setCarryingChest(boolean b) {
if (b) {
// TODO Manipulate the HorseInventory somehow
}
this.hasChest = b;
}
@Override
public int getDomestication() {
return domestication;
}
@Override
public void setDomestication(int i) {
this.domestication = i;
}
@Override
public int getMaxDomestication() {
return maxDomestication;
}
@Override
public void setMaxDomestication(int i) {
this.maxDomestication = i;
}
@Override
public double getJumpStrength() {
return jumpStrength;
}
@Override
public void setJumpStrength(double v) {
this.jumpStrength = v;
}
@Override
public HorseInventory getInventory() {
return inventory;
}
public void setInventory(HorseInventory inventory) {
this.inventory = inventory;
}
public boolean isEatingHay() {
return eatingHay;
}
public void setEatingHay(boolean eatingHay) {
this.eatingHay = eatingHay;
}
public boolean hasReproduced() {
return hasReproduced;
}
public void setHasReproduced(boolean hasReproduced) {
this.hasReproduced = hasReproduced;
}
public int getTemper() {
return temper;
}
public void setTemper(int temper) {
this.temper = temper;
}
public UUID getOwnerUUID() {
return ownerUUID;
}
public void setOwnerUUID(UUID ownerUUID) {
this.ownerUUID = ownerUUID;
}
@Override
public List<Message> createSpawnMessage() {
List<Message> messages = super.createSpawnMessage();
MetadataMap map = new MetadataMap(GlowHorse.class);
map.set(MetadataIndex.HORSE_TYPE, (byte) this.getVariant().ordinal());
map.set(MetadataIndex.HORSE_FLAGS, getHorseFlags());
map.set(MetadataIndex.HORSE_STYLE, getHorseStyleData());
map.set(MetadataIndex.HORSE_ARMOR, getHorseArmorData());
messages.add(new EntityMetadataMessage(id, map.getEntryList()));
return messages;
}
private int getHorseFlags() {
int value = 0;
if (isTamed()) {
value |= 0x02;
}
if (getInventory() != null && getInventory().getSaddle() != null) {
value |= 0x04;
}
if (hasChest) {
value |= 0x08;
}
if (hasReproduced) {
value |= 0x10;
}
if (isEatingHay()) {
value |= 0x20;
}
return value;
}
private int getHorseStyleData() {
return this.horseColor.ordinal() & 0xFF | this.horseStyle.ordinal() << 8;
}
private int getHorseArmorData() {
if (getInventory().getArmor() != null) {
if (getInventory().getArmor().getType() == Material.DIAMOND_BARDING) {
return 3;
} else if (getInventory().getArmor().getType() == Material.GOLD_BARDING) {
return 2;
} else if (getInventory().getArmor().getType() == Material.IRON_BARDING) {
return 1;
}
}
return 0;
}
}