blob: ebd815b215148441203805fc30254ed649f2c9db [file] [log] [blame] [raw]
package net.glowstone.entity.passive;
import com.flowpowered.network.Message;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import java.util.List;
import java.util.Map;
import java.util.Set;
import lombok.Getter;
import lombok.Setter;
import net.glowstone.entity.GlowPlayer;
import net.glowstone.entity.meta.MetadataIndex;
import net.glowstone.entity.meta.MetadataMap;
import net.glowstone.net.message.play.entity.EntityMetadataMessage;
import net.glowstone.util.InventoryUtil;
import net.glowstone.util.TickUtil;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.AbstractHorse;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Horse;
public abstract class GlowAbstractHorse extends GlowTameable implements AbstractHorse {
private static final Set<Material> BREEDING_FOODS = Sets.immutableEnumSet(Material.GOLDEN_APPLE,
Material.GOLDEN_CARROT);
private static final Map<Material, Integer> GROWING_FOODS = ImmutableMap
.<Material, Integer>builder()
.put(Material.SUGAR, TickUtil.secondsToTicks(30))
.put(Material.WHEAT, TickUtil.secondsToTicks(20))
.put(Material.APPLE, TickUtil.minutesToTicks(1))
.put(Material.GOLDEN_CARROT, TickUtil.minutesToTicks(1))
.put(Material.GOLDEN_APPLE, TickUtil.minutesToTicks(4))
.put(Material.HAY_BLOCK, TickUtil.minutesToTicks(3))
.build();
@Getter
@Setter
private int domestication;
@Getter
@Setter
private int maxDomestication;
@Getter
@Setter
private double jumpStrength;
@Getter
@Setter
private boolean tamed;
public GlowAbstractHorse(Location location, EntityType type, double maxHealth) {
super(location, type, maxHealth);
setSize(1.3964f, 1.6f);
}
@Override
protected boolean tryFeed(Material food, GlowPlayer player) {
if (!isAdult() || isTamed()) {
return super.tryFeed(food, player);
}
int taming = computeDomestication(food);
if (taming > 0) {
domestication = Math.max(domestication + taming, maxDomestication);
super.tryFeed(food, player); // can have another effect in addition to taming
return true;
}
return super.tryFeed(food, player);
}
@Override
public List<Message> createSpawnMessage() {
List<Message> messages = super.createSpawnMessage();
MetadataMap map = new MetadataMap(GlowHorse.class);
map.set(MetadataIndex.ABSTRACT_HORSE_FLAGS, getHorseFlags());
messages.add(new EntityMetadataMessage(entityId, map.getEntryList()));
return messages;
}
@Override
public Horse.Variant getVariant() {
// Field has been removed in 1.11
return null;
}
@Override
public void setVariant(Horse.Variant variant) {
// Field has been removed in 1.11
}
@Override
public boolean canBreed() {
return super.canBreed() && isTamed();
}
private int getHorseFlags() {
int value = 0;
if (isTamed()) {
value |= 0x02;
}
if (this instanceof GlowHorse) {
GlowHorse horse = (GlowHorse) this;
if (getInventory() != null && !InventoryUtil.isEmpty(getInventory().getSaddle())) {
value |= 0x04;
}
if (horse.hasReproduced()) {
value |= 0x10;
}
if (horse.isEatingHay()) {
value |= 0x20;
}
}
if (this instanceof ChestedHorse) {
ChestedHorse horse = (ChestedHorse) this;
if (horse.isCarryingChest()) {
value |= 0x08;
}
}
return value;
}
@Override
public Set<Material> getBreedingFoods() {
return BREEDING_FOODS;
}
/**
* Returns the amount to increment the {@linkplain #setDomestication(int) domestication}
* (progress toward taming) when the given food is consumed by an untamed adult mob, before
* applying the {@linkplain #getMaxDomestication() maximum domestication}. Zero is returned for
* any item this mob cannot eat.
*
* @param food the food to consume
* @return the amount of domestication to gain
*/
protected int computeDomestication(Material food) {
// TODO
return BREEDING_FOODS.contains(food) ? 10 : 0;
}
@Override
protected int computeGrowthAmount(Material material) {
// We need to be a baby and only tamed horses can be fed with hay block
if (canGrow() && (Material.HAY_BLOCK != material || isTamed())) {
return Math.min(GROWING_FOODS.getOrDefault(material, 0), Math.abs(getAge()));
}
return 0;
}
}