2017-12-30 08:36:36 +01:00
|
|
|
package net.citizensnpcs.trait;
|
|
|
|
|
2019-05-24 12:32:51 +02:00
|
|
|
import java.lang.invoke.MethodHandle;
|
|
|
|
|
|
|
|
import org.bukkit.entity.EntityType;
|
2017-12-30 08:36:36 +01:00
|
|
|
import org.bukkit.entity.Horse;
|
|
|
|
import org.bukkit.entity.Horse.Color;
|
|
|
|
import org.bukkit.entity.Horse.Style;
|
|
|
|
import org.bukkit.inventory.ItemStack;
|
|
|
|
|
|
|
|
import net.citizensnpcs.api.persistence.Persist;
|
|
|
|
import net.citizensnpcs.api.trait.Trait;
|
|
|
|
import net.citizensnpcs.api.trait.TraitName;
|
2019-05-24 12:32:51 +02:00
|
|
|
import net.citizensnpcs.util.NMS;
|
2017-12-30 08:36:36 +01:00
|
|
|
|
2019-05-16 13:58:29 +02:00
|
|
|
/**
|
|
|
|
* Persists various {@link Horse} metadata.
|
|
|
|
*
|
|
|
|
* @see Horse
|
|
|
|
*/
|
2017-12-30 08:36:36 +01:00
|
|
|
@TraitName("horsemodifiers")
|
|
|
|
public class HorseModifiers extends Trait {
|
|
|
|
@Persist("armor")
|
|
|
|
private ItemStack armor = null;
|
|
|
|
@Persist("carryingChest")
|
|
|
|
private boolean carryingChest;
|
|
|
|
@Persist("color")
|
|
|
|
private Color color = Color.CREAMY;
|
|
|
|
@Persist("saddle")
|
|
|
|
private ItemStack saddle = null;
|
|
|
|
@Persist("style")
|
|
|
|
private Style style = Style.NONE;
|
|
|
|
|
|
|
|
public HorseModifiers() {
|
|
|
|
super("horsemodifiers");
|
|
|
|
}
|
|
|
|
|
|
|
|
public ItemStack getArmor() {
|
|
|
|
return armor;
|
|
|
|
}
|
|
|
|
|
2019-05-16 13:58:29 +02:00
|
|
|
/**
|
|
|
|
* @see Horse#getColor()
|
|
|
|
*/
|
2017-12-30 08:36:36 +01:00
|
|
|
public Color getColor() {
|
|
|
|
return color;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ItemStack getSaddle() {
|
|
|
|
return saddle;
|
|
|
|
}
|
|
|
|
|
2019-05-16 13:58:29 +02:00
|
|
|
/**
|
|
|
|
* @see Horse#getStyle()
|
|
|
|
*/
|
2017-12-30 08:36:36 +01:00
|
|
|
public Style getStyle() {
|
|
|
|
return style;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onSpawn() {
|
|
|
|
updateModifiers();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
if (npc.getEntity() instanceof Horse) {
|
|
|
|
Horse horse = (Horse) npc.getEntity();
|
|
|
|
saddle = horse.getInventory().getSaddle();
|
|
|
|
armor = horse.getInventory().getArmor();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setArmor(ItemStack armor) {
|
|
|
|
this.armor = armor;
|
|
|
|
}
|
|
|
|
|
2019-05-16 13:58:29 +02:00
|
|
|
/**
|
|
|
|
* @see Horse#setCarryingChest(boolean)
|
|
|
|
*/
|
2017-12-30 08:36:36 +01:00
|
|
|
public void setCarryingChest(boolean carryingChest) {
|
|
|
|
this.carryingChest = carryingChest;
|
|
|
|
updateModifiers();
|
|
|
|
}
|
|
|
|
|
2019-05-16 13:58:29 +02:00
|
|
|
/**
|
|
|
|
* @see Horse#setColor(Color)
|
|
|
|
*/
|
2017-12-30 08:36:36 +01:00
|
|
|
public void setColor(Horse.Color color) {
|
|
|
|
this.color = color;
|
|
|
|
updateModifiers();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setSaddle(ItemStack saddle) {
|
|
|
|
this.saddle = saddle;
|
|
|
|
}
|
|
|
|
|
2019-05-16 13:58:29 +02:00
|
|
|
/**
|
|
|
|
* @see Horse#setStyle(Style)
|
|
|
|
*/
|
2017-12-30 08:36:36 +01:00
|
|
|
public void setStyle(Horse.Style style) {
|
|
|
|
this.style = style;
|
|
|
|
updateModifiers();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void updateModifiers() {
|
|
|
|
if (npc.getEntity() instanceof Horse) {
|
|
|
|
Horse horse = (Horse) npc.getEntity();
|
|
|
|
horse.setColor(color);
|
|
|
|
horse.setStyle(style);
|
|
|
|
horse.getInventory().setArmor(armor);
|
|
|
|
horse.getInventory().setSaddle(saddle);
|
|
|
|
}
|
2019-05-24 12:32:51 +02:00
|
|
|
EntityType type = npc.getEntity().getType();
|
|
|
|
if (type.name().equals("LLAMA") || type.name().equals("TRADER_LLAMA") || type.name().equals("DONKEY")
|
|
|
|
|| type.name().equals("MULE")) {
|
|
|
|
try {
|
|
|
|
CARRYING_CHEST_METHOD.invoke(npc.getEntity(), carryingChest);
|
|
|
|
} catch (Throwable e) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static MethodHandle CARRYING_CHEST_METHOD;
|
|
|
|
|
|
|
|
static {
|
|
|
|
try {
|
|
|
|
CARRYING_CHEST_METHOD = NMS.getMethodHandle(Class.forName("org.bukkit.entity.ChestedHorse"),
|
|
|
|
"setCarryingChest", false, boolean.class);
|
|
|
|
} catch (Throwable e) {
|
|
|
|
}
|
2017-12-30 08:36:36 +01:00
|
|
|
}
|
|
|
|
}
|