diff --git a/dist/pom.xml b/dist/pom.xml
index 20a476777..db555ae84 100644
--- a/dist/pom.xml
+++ b/dist/pom.xml
@@ -40,7 +40,14 @@
${project.version}
jar
compile
-
+
+
+ ${project.groupId}
+ citizens-v1_8_R3
+ ${project.version}
+ jar
+ compile
+
${project.groupId}
citizens-v1_10_R1
diff --git a/main/src/main/java/net/citizensnpcs/Citizens.java b/main/src/main/java/net/citizensnpcs/Citizens.java
index 883963791..77e42378f 100644
--- a/main/src/main/java/net/citizensnpcs/Citizens.java
+++ b/main/src/main/java/net/citizensnpcs/Citizens.java
@@ -307,7 +307,9 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
startMetrics();
scheduleSaveTask(Setting.SAVE_TASK_DELAY.asInt());
Bukkit.getPluginManager().callEvent(new CitizensEnableEvent());
- new PlayerUpdateTask().runTaskTimer(Citizens.this, 0, 1);
+ if (!Util.getMinecraftRevision().equals("1_8_R3")) {
+ new PlayerUpdateTask().runTaskTimer(Citizens.this, 0, 1);
+ }
}
}, 1) == -1) {
Messaging.severeTr(Messages.LOAD_TASK_NOT_SCHEDULED);
diff --git a/main/src/main/java/net/citizensnpcs/EventListen.java b/main/src/main/java/net/citizensnpcs/EventListen.java
index 47f40135d..0821d1ba9 100644
--- a/main/src/main/java/net/citizensnpcs/EventListen.java
+++ b/main/src/main/java/net/citizensnpcs/EventListen.java
@@ -10,7 +10,6 @@ import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
-import org.bukkit.entity.AbstractHorse;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FishHook;
import org.bukkit.entity.LivingEntity;
@@ -46,7 +45,6 @@ import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.event.world.WorldLoadEvent;
import org.bukkit.event.world.WorldUnloadEvent;
-import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.scheduler.BukkitRunnable;
@@ -93,6 +91,7 @@ import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.CurrentLocation;
import net.citizensnpcs.util.Messages;
import net.citizensnpcs.util.NMS;
+import net.citizensnpcs.util.Util;
public class EventListen implements Listener {
private final NPCRegistry npcRegistry = CitizensAPI.getNPCRegistry();
@@ -409,7 +408,7 @@ public class EventListen implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
NPC npc = npcRegistry.getNPC(event.getRightClicked());
- if (npc == null || event.getHand() == EquipmentSlot.OFF_HAND) {
+ if (npc == null || Util.isOffHand(event)) {
return;
}
Player player = event.getPlayer();
@@ -519,7 +518,7 @@ public class EventListen implements Listener {
if (!npcRegistry.isNPC(event.getVehicle()))
return;
NPC npc = npcRegistry.getNPC(event.getVehicle());
- if ((npc.getEntity() instanceof AbstractHorse || npc.getEntity().getType() == EntityType.BOAT
+ if ((Util.isHorse(npc.getEntity()) || npc.getEntity().getType() == EntityType.BOAT
|| npc.getEntity().getType() == EntityType.PIG || npc.getEntity() instanceof Minecart)
&& (!npc.hasTrait(Controllable.class) || !npc.getTrait(Controllable.class).isEnabled())) {
event.setCancelled(true);
diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
index bb072115f..9f09a7708 100644
--- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
+++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java
@@ -16,8 +16,6 @@ import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
-import org.bukkit.boss.BarColor;
-import org.bukkit.boss.BarFlag;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
@@ -48,7 +46,6 @@ import net.citizensnpcs.api.command.CommandContext;
import net.citizensnpcs.api.command.CommandMessages;
import net.citizensnpcs.api.command.Requirements;
import net.citizensnpcs.api.command.exception.CommandException;
-import net.citizensnpcs.api.command.exception.CommandUsageException;
import net.citizensnpcs.api.command.exception.NoPermissionsException;
import net.citizensnpcs.api.command.exception.ServerCommandException;
import net.citizensnpcs.api.event.CommandSenderCreateNPCEvent;
@@ -72,7 +69,6 @@ import net.citizensnpcs.npc.skin.SkinnableEntity;
import net.citizensnpcs.trait.Age;
import net.citizensnpcs.trait.Anchors;
import net.citizensnpcs.trait.ArmorStandTrait;
-import net.citizensnpcs.trait.BossBarTrait;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.CurrentLocation;
import net.citizensnpcs.trait.Gravity;
@@ -84,7 +80,6 @@ import net.citizensnpcs.trait.Powered;
import net.citizensnpcs.trait.RabbitType;
import net.citizensnpcs.trait.ScriptTrait;
import net.citizensnpcs.trait.SheepTrait;
-import net.citizensnpcs.trait.ShulkerTrait;
import net.citizensnpcs.trait.SkinLayers;
import net.citizensnpcs.trait.SkinLayers.Layer;
import net.citizensnpcs.trait.SlimeSize;
@@ -254,38 +249,6 @@ public class NPCCommands {
}
}
- @Command(
- aliases = { "npc" },
- usage = "bossbar --color [color] --title [title] --visible [visible] --flags [flags]",
- desc = "Edit bossbar properties",
- modifiers = { "bossbar" },
- min = 1,
- max = 1)
- @Requirements(selected = true, ownership = true, types = { EntityType.WITHER, EntityType.ENDER_DRAGON })
- public void bossbar(CommandContext args, CommandSender sender, NPC npc) throws CommandException {
- BossBarTrait trait = npc.getTrait(BossBarTrait.class);
- if (args.hasValueFlag("color")) {
- BarColor color = Util.matchEnum(BarColor.values(), args.getFlag("color"));
- trait.setColor(color);
- }
- if (args.hasValueFlag("title")) {
- trait.setTitle(args.getFlag("title"));
- }
- if (args.hasValueFlag("visible")) {
- trait.setVisible(Boolean.parseBoolean(args.getFlag("visible")));
- }
- if (args.hasValueFlag("flags")) {
- List flags = Lists.newArrayList();
- for (String s : Splitter.on(',').omitEmptyStrings().trimResults().split(args.getFlag("flags"))) {
- BarFlag flag = Util.matchEnum(BarFlag.values(), s);
- if (flag != null) {
- flags.add(flag);
- }
- }
- trait.setFlags(flags);
- }
- }
-
@Command(
aliases = { "npc" },
usage = "collidable",
@@ -1494,39 +1457,6 @@ public class NPCCommands {
}
}
- @Command(
- aliases = { "npc" },
- usage = "shulker (--peek [peek] --color [color])",
- desc = "Sets shulker modifiers.",
- modifiers = { "shulker" },
- min = 1,
- max = 1,
- permission = "citizens.npc.shulker")
- @Requirements(selected = true, ownership = true, types = { EntityType.SHULKER })
- public void shulker(CommandContext args, CommandSender sender, NPC npc) throws CommandException {
- ShulkerTrait trait = npc.getTrait(ShulkerTrait.class);
- boolean hasArg = false;
- if (args.hasValueFlag("peek")) {
- int peek = (byte) args.getFlagInteger("peek");
- trait.setPeek(peek);
- Messaging.sendTr(sender, Messages.SHULKER_PEEK_SET, npc.getName(), peek);
- hasArg = true;
- }
- if (args.hasValueFlag("color")) {
- DyeColor color = Util.matchEnum(DyeColor.values(), args.getFlag("color"));
- if (color == null) {
- Messaging.sendErrorTr(sender, Messages.INVALID_SHULKER_COLOR, Util.listValuesPretty(DyeColor.values()));
- return;
- }
- trait.setColor(color);
- Messaging.sendTr(sender, Messages.SHULKER_COLOR_SET, npc.getName(), Util.prettyEnum(color));
- hasArg = true;
- }
- if (!hasArg) {
- throw new CommandUsageException();
- }
- }
-
@Command(
aliases = { "npc" },
usage = "skin (-c -l(atest)) [name]",
diff --git a/main/src/main/java/net/citizensnpcs/editor/EndermanEquipper.java b/main/src/main/java/net/citizensnpcs/editor/EndermanEquipper.java
index 93587469d..731d93f05 100644
--- a/main/src/main/java/net/citizensnpcs/editor/EndermanEquipper.java
+++ b/main/src/main/java/net/citizensnpcs/editor/EndermanEquipper.java
@@ -14,7 +14,7 @@ import net.citizensnpcs.util.Messages;
public class EndermanEquipper implements Equipper {
@Override
public void equip(Player equipper, NPC npc) {
- ItemStack hand = equipper.getInventory().getItemInMainHand();
+ ItemStack hand = equipper.getInventory().getItemInHand();
if (!hand.getType().isBlock()) {
Messaging.sendErrorTr(equipper, Messages.EQUIPMENT_EDITOR_INVALID_BLOCK);
return;
@@ -35,7 +35,7 @@ public class EndermanEquipper implements Equipper {
if (set.getType() != Material.AIR) {
set.setAmount(1);
hand.setAmount(hand.getAmount() - 1);
- equipper.getInventory().setItemInMainHand(hand);
+ equipper.getInventory().setItemInHand(hand);
}
npc.getTrait(Equipment.class).set(0, set);
}
diff --git a/main/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java b/main/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java
index 4d2f7b49f..b8a42b387 100644
--- a/main/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java
+++ b/main/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java
@@ -22,6 +22,7 @@ import net.citizensnpcs.api.trait.trait.Equipment;
import net.citizensnpcs.api.trait.trait.Equipment.EquipmentSlot;
import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.util.Messages;
+import net.citizensnpcs.util.Util;
public class EquipmentEditor extends Editor {
private final NPC npc;
@@ -62,7 +63,7 @@ public class EquipmentEditor extends Editor {
public void run() {
if (!event.getPlayer().isValid())
return;
- ItemStack hand = event.getPlayer().getInventory().getItemInMainHand();
+ ItemStack hand = event.getPlayer().getInventory().getItemInHand();
if (hand.getType() == Material.AIR || hand.getAmount() <= 0) {
return;
}
@@ -74,7 +75,7 @@ public class EquipmentEditor extends Editor {
newStack.setAmount(1);
npc.getTrait(Equipment.class).set(finalSlot, newStack);
hand.setAmount(hand.getAmount() - 1);
- event.getPlayer().getInventory().setItemInMainHand(hand);
+ event.getPlayer().getInventory().setItemInHand(hand);
}
});
event.setCancelled(true);
@@ -89,8 +90,7 @@ public class EquipmentEditor extends Editor {
@EventHandler
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
- if (!npc.isSpawned() || !event.getPlayer().equals(player)
- || event.getHand() != org.bukkit.inventory.EquipmentSlot.HAND
+ if (!npc.isSpawned() || !event.getPlayer().equals(player) || Util.isOffHand(event)
|| !npc.equals(CitizensAPI.getNPCRegistry().getNPC(event.getRightClicked())))
return;
diff --git a/main/src/main/java/net/citizensnpcs/editor/GenericEquipper.java b/main/src/main/java/net/citizensnpcs/editor/GenericEquipper.java
index 3dab798dd..5f5a59ce3 100644
--- a/main/src/main/java/net/citizensnpcs/editor/GenericEquipper.java
+++ b/main/src/main/java/net/citizensnpcs/editor/GenericEquipper.java
@@ -13,67 +13,70 @@ import net.citizensnpcs.util.Messages;
public class GenericEquipper implements Equipper {
@Override
public void equip(Player equipper, NPC toEquip) {
- ItemStack hand = equipper.getInventory().getItemInMainHand();
+ ItemStack hand = equipper.getInventory().getItemInHand();
Equipment trait = toEquip.getTrait(Equipment.class);
EquipmentSlot slot = EquipmentSlot.HAND;
Material type = hand == null ? Material.AIR : hand.getType();
// First, determine the slot to edit
- switch (type) {
- case SKULL_ITEM:
- case PUMPKIN:
- case JACK_O_LANTERN:
- case LEATHER_HELMET:
- case CHAINMAIL_HELMET:
- case GOLD_HELMET:
- case IRON_HELMET:
- case DIAMOND_HELMET:
- if (!equipper.isSneaking()) {
- slot = EquipmentSlot.HELMET;
- }
- break;
- case ELYTRA:
- case LEATHER_CHESTPLATE:
- case CHAINMAIL_CHESTPLATE:
- case GOLD_CHESTPLATE:
- case IRON_CHESTPLATE:
- case DIAMOND_CHESTPLATE:
- if (!equipper.isSneaking()) {
- slot = EquipmentSlot.CHESTPLATE;
- }
- break;
- case LEATHER_LEGGINGS:
- case CHAINMAIL_LEGGINGS:
- case GOLD_LEGGINGS:
- case IRON_LEGGINGS:
- case DIAMOND_LEGGINGS:
- if (!equipper.isSneaking()) {
- slot = EquipmentSlot.LEGGINGS;
- }
- break;
- case LEATHER_BOOTS:
- case CHAINMAIL_BOOTS:
- case GOLD_BOOTS:
- case IRON_BOOTS:
- case DIAMOND_BOOTS:
- if (!equipper.isSneaking()) {
- slot = EquipmentSlot.BOOTS;
- }
- break;
- case AIR:
- if (equipper.isSneaking()) {
- for (int i = 0; i < 6; i++) {
- if (trait.get(i) != null && trait.get(i).getType() != Material.AIR) {
- equipper.getWorld().dropItemNaturally(toEquip.getEntity().getLocation(), trait.get(i));
- trait.set(i, null);
- }
+ if (type.name().equals("ELYTRA") && !equipper.isSneaking()) {
+ slot = EquipmentSlot.CHESTPLATE;
+ } else {
+ switch (type) {
+ case SKULL_ITEM:
+ case PUMPKIN:
+ case JACK_O_LANTERN:
+ case LEATHER_HELMET:
+ case CHAINMAIL_HELMET:
+ case GOLD_HELMET:
+ case IRON_HELMET:
+ case DIAMOND_HELMET:
+ if (!equipper.isSneaking()) {
+ slot = EquipmentSlot.HELMET;
}
- Messaging.sendTr(equipper, Messages.EQUIPMENT_EDITOR_ALL_ITEMS_REMOVED, toEquip.getName());
- } else {
- return;
- }
- break;
- default:
- break;
+ break;
+ case LEATHER_CHESTPLATE:
+ case CHAINMAIL_CHESTPLATE:
+ case GOLD_CHESTPLATE:
+ case IRON_CHESTPLATE:
+ case DIAMOND_CHESTPLATE:
+ if (!equipper.isSneaking()) {
+ slot = EquipmentSlot.CHESTPLATE;
+ }
+ break;
+ case LEATHER_LEGGINGS:
+ case CHAINMAIL_LEGGINGS:
+ case GOLD_LEGGINGS:
+ case IRON_LEGGINGS:
+ case DIAMOND_LEGGINGS:
+ if (!equipper.isSneaking()) {
+ slot = EquipmentSlot.LEGGINGS;
+ }
+ break;
+ case LEATHER_BOOTS:
+ case CHAINMAIL_BOOTS:
+ case GOLD_BOOTS:
+ case IRON_BOOTS:
+ case DIAMOND_BOOTS:
+ if (!equipper.isSneaking()) {
+ slot = EquipmentSlot.BOOTS;
+ }
+ break;
+ case AIR:
+ if (equipper.isSneaking()) {
+ for (int i = 0; i < 6; i++) {
+ if (trait.get(i) != null && trait.get(i).getType() != Material.AIR) {
+ equipper.getWorld().dropItemNaturally(toEquip.getEntity().getLocation(), trait.get(i));
+ trait.set(i, null);
+ }
+ }
+ Messaging.sendTr(equipper, Messages.EQUIPMENT_EDITOR_ALL_ITEMS_REMOVED, toEquip.getName());
+ } else {
+ return;
+ }
+ break;
+ default:
+ break;
+ }
}
// Drop any previous equipment on the ground
ItemStack equippedItem = trait.get(slot);
@@ -88,7 +91,7 @@ public class GenericEquipper implements Equipper {
clone.setAmount(1);
trait.set(slot, clone);
hand.setAmount(hand.getAmount() - 1);
- equipper.getInventory().setItemInMainHand(hand);
+ equipper.getInventory().setItemInHand(hand);
}
}
}
diff --git a/main/src/main/java/net/citizensnpcs/editor/PigEquipper.java b/main/src/main/java/net/citizensnpcs/editor/PigEquipper.java
index 081513a1b..f400800fb 100644
--- a/main/src/main/java/net/citizensnpcs/editor/PigEquipper.java
+++ b/main/src/main/java/net/citizensnpcs/editor/PigEquipper.java
@@ -13,7 +13,7 @@ import net.citizensnpcs.util.Messages;
public class PigEquipper implements Equipper {
@Override
public void equip(Player equipper, NPC toEquip) {
- ItemStack hand = equipper.getInventory().getItemInMainHand();
+ ItemStack hand = equipper.getInventory().getItemInHand();
Pig pig = (Pig) toEquip.getEntity();
if (hand.getType() == Material.SADDLE) {
if (!pig.hasSaddle()) {
@@ -26,6 +26,6 @@ public class PigEquipper implements Equipper {
toEquip.getTrait(Saddle.class).toggle();
Messaging.sendTr(equipper, Messages.SADDLED_STOPPED, toEquip.getName());
}
- equipper.getInventory().setItemInMainHand(hand);
+ equipper.getInventory().setItemInHand(hand);
}
}
diff --git a/main/src/main/java/net/citizensnpcs/editor/SheepEquipper.java b/main/src/main/java/net/citizensnpcs/editor/SheepEquipper.java
index d33e3d30f..26919bf76 100644
--- a/main/src/main/java/net/citizensnpcs/editor/SheepEquipper.java
+++ b/main/src/main/java/net/citizensnpcs/editor/SheepEquipper.java
@@ -16,7 +16,7 @@ import net.citizensnpcs.util.Messages;
public class SheepEquipper implements Equipper {
@Override
public void equip(Player equipper, NPC toEquip) {
- ItemStack hand = equipper.getInventory().getItemInMainHand();
+ ItemStack hand = equipper.getInventory().getItemInHand();
Sheep sheep = (Sheep) toEquip.getEntity();
if (hand.getType() == Material.SHEARS) {
Messaging.sendTr(equipper, toEquip.getTrait(SheepTrait.class).toggleSheared() ? Messages.SHEARED_SET
@@ -35,6 +35,6 @@ public class SheepEquipper implements Equipper {
toEquip.getTrait(WoolColor.class).setColor(DyeColor.WHITE);
Messaging.sendTr(equipper, Messages.EQUIPMENT_EDITOR_SHEEP_COLOURED, toEquip.getName(), "white");
}
- equipper.getInventory().setItemInMainHand(hand);
+ equipper.getInventory().setItemInHand(hand);
}
}
diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
index e1d0778ba..d8fd32deb 100644
--- a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
+++ b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java
@@ -275,17 +275,19 @@ public class CitizensNPC extends AbstractNPC {
NMS.trySwim(getEntity());
}
navigator.run();
-
- getEntity().setGlowing(data().get(NPC.GLOWING_METADATA, false));
+ try {
+ getEntity().setGlowing(data().get(NPC.GLOWING_METADATA, false));
+ } catch (NoSuchMethodError e) {
+ }
if (!getNavigator().isNavigating() && updateCounter++ > Setting.PACKET_UPDATE_DELAY.asInt()) {
updateCounter = 0;
if (getEntity() instanceof LivingEntity) {
- OptionStatus nameVisibility = OptionStatus.NEVER;
+ boolean nameVisibility = false;
if (!getEntity().isCustomNameVisible()
&& !data().