From 677a85352a7064bccdeec3df503647a83f76ddb5 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sun, 23 Aug 2015 17:36:01 +0800 Subject: [PATCH 1/5] Fix /npc name visibility not toggling off, fix minecart NPCs being destroyable --- .../java/net/citizensnpcs/EventListen.java | 10 ++++++ .../citizensnpcs/commands/NPCCommands.java | 5 --- .../net/citizensnpcs/npc/CitizensNPC.java | 13 ++++++-- .../nonliving/MinecartChestController.java | 22 +++++++++---- .../nonliving/MinecartCommandController.java | 32 ++++++++++++------- .../nonliving/MinecartFurnaceController.java | 32 ++++++++++++------- .../nonliving/MinecartHopperController.java | 24 +++++++++----- .../nonliving/MinecartRideableController.java | 32 ++++++++++++------- .../nonliving/MinecartSpawnerController.java | 24 +++++++++----- .../nonliving/MinecartTNTController.java | 24 +++++++++----- 10 files changed, 144 insertions(+), 74 deletions(-) diff --git a/src/main/java/net/citizensnpcs/EventListen.java b/src/main/java/net/citizensnpcs/EventListen.java index a7e76525f..e3992d7a2 100644 --- a/src/main/java/net/citizensnpcs/EventListen.java +++ b/src/main/java/net/citizensnpcs/EventListen.java @@ -33,6 +33,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.event.vehicle.VehicleEnterEvent; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkUnloadEvent; @@ -384,6 +385,15 @@ public class EventListen implements Listener { recalculatePlayer(event.getPlayer()); } + @EventHandler + public void onVehicleDestroy(VehicleDestroyEvent event) { + NPC npc = npcRegistry.getNPC(event.getVehicle()); + if (npc == null) { + return; + } + event.setCancelled(npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)); + } + @EventHandler(ignoreCancelled = true) public void onVehicleEnter(VehicleEnterEvent event) { if (!npcRegistry.isNPC(event.getEntered())) diff --git a/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/src/main/java/net/citizensnpcs/commands/NPCCommands.java index c4c28b140..316ce9410 100644 --- a/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -851,11 +851,6 @@ public class NPCCommands { public void name(CommandContext args, CommandSender sender, NPC npc) { LivingEntity entity = (LivingEntity) npc.getEntity(); entity.setCustomNameVisible(!entity.isCustomNameVisible()); - if (!entity.isCustomNameVisible()) { - entity.setCustomName(""); - } else { - entity.setCustomName(npc.getFullName()); - } npc.data().setPersistent(NPC.NAMEPLATE_VISIBLE_METADATA, entity.isCustomNameVisible()); Messaging.sendTr(sender, Messages.NAMEPLATE_VISIBILITY_TOGGLED); } diff --git a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index 8a71d4424..b83088520 100644 --- a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -236,7 +236,12 @@ public class CitizensNPC extends AbstractNPC { if (getEntity() instanceof LivingEntity) { LivingEntity entity = (LivingEntity) getEntity(); entity.setRemoveWhenFarAway(false); - entity.setCustomName(getFullName()); + + if (!data().get(NPC.NAMEPLATE_VISIBLE_METADATA, true)) { + entity.setCustomName(""); + } else { + entity.setCustomName(getFullName()); + } if (NMS.getStepHeight(entity) < 1) { NMS.setStepHeight(NMS.getHandle(entity), 1); @@ -285,7 +290,11 @@ public class CitizensNPC extends AbstractNPC { if (!getNavigator().isNavigating() && getEntity().getWorld().getFullTime() % Setting.PACKET_UPDATE_DELAY.asInt() == 0) { if (getEntity() instanceof LivingEntity) { - ((LivingEntity) getEntity()).setCustomName(getFullName()); + if (!getEntity().isCustomNameVisible()) { + getEntity().setCustomName(""); + } else { + getEntity().setCustomName(getFullName()); + } } Player player = getEntity() instanceof Player ? (Player) getEntity() : null; NMS.sendPacketNearby(player, getStoredLocation(), diff --git a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartChestController.java b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartChestController.java index f2a8b9cfa..ab11b1691 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartChestController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartChestController.java @@ -1,5 +1,12 @@ package net.citizensnpcs.npc.entity.nonliving; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_8_R3.CraftServer; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftMinecartChest; +import org.bukkit.entity.Minecart; +import org.bukkit.util.Vector; + import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.npc.CitizensNPC; @@ -7,17 +14,11 @@ import net.citizensnpcs.npc.MobEntityController; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_8_R3.DamageSource; import net.minecraft.server.v1_8_R3.EntityMinecartChest; import net.minecraft.server.v1_8_R3.NBTTagCompound; import net.minecraft.server.v1_8_R3.World; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_8_R3.CraftServer; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftMinecartChest; -import org.bukkit.entity.Minecart; -import org.bukkit.util.Vector; - public class MinecartChestController extends MobEntityController { public MinecartChestController() { super(EntityMinecartChestNPC.class); @@ -55,6 +56,13 @@ public class MinecartChestController extends MobEntityController { return npc == null ? super.d(save) : false; } + @Override + public boolean damageEntity(DamageSource damagesource, float f) { + if (npc == null || !npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + return super.damageEntity(damagesource, f); + return false; + } + @Override public void g(double x, double y, double z) { if (npc == null) { diff --git a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartCommandController.java b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartCommandController.java index c1dffe50a..df13bd017 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartCommandController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartCommandController.java @@ -1,5 +1,12 @@ package net.citizensnpcs.npc.entity.nonliving; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_8_R3.CraftServer; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftMinecartCommand; +import org.bukkit.entity.Minecart; +import org.bukkit.util.Vector; + import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.npc.CitizensNPC; @@ -7,17 +14,11 @@ import net.citizensnpcs.npc.MobEntityController; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_8_R3.DamageSource; import net.minecraft.server.v1_8_R3.EntityMinecartCommandBlock; import net.minecraft.server.v1_8_R3.NBTTagCompound; import net.minecraft.server.v1_8_R3.World; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_8_R3.CraftServer; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftMinecartCommand; -import org.bukkit.entity.Minecart; -import org.bukkit.util.Vector; - public class MinecartCommandController extends MobEntityController { public MinecartCommandController() { super(EntityMinecartCommandNPC.class); @@ -40,11 +41,6 @@ public class MinecartCommandController extends MobEntityController { this.npc = (CitizensNPC) npc; } - @Override - public boolean d(NBTTagCompound save) { - return npc == null ? super.d(save) : false; - } - @Override public void collide(net.minecraft.server.v1_8_R3.Entity entity) { // this method is called by both the entities involved - cancelling @@ -55,6 +51,18 @@ public class MinecartCommandController extends MobEntityController { } } + @Override + public boolean d(NBTTagCompound save) { + return npc == null ? super.d(save) : false; + } + + @Override + public boolean damageEntity(DamageSource damagesource, float f) { + if (npc == null || !npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + return super.damageEntity(damagesource, f); + return false; + } + @Override public void g(double x, double y, double z) { if (npc == null) { diff --git a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartFurnaceController.java b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartFurnaceController.java index f90aa7305..d3407c5d4 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartFurnaceController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartFurnaceController.java @@ -1,5 +1,12 @@ package net.citizensnpcs.npc.entity.nonliving; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_8_R3.CraftServer; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftMinecartFurnace; +import org.bukkit.entity.Minecart; +import org.bukkit.util.Vector; + import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.npc.CitizensNPC; @@ -7,17 +14,11 @@ import net.citizensnpcs.npc.MobEntityController; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_8_R3.DamageSource; import net.minecraft.server.v1_8_R3.EntityMinecartFurnace; import net.minecraft.server.v1_8_R3.NBTTagCompound; import net.minecraft.server.v1_8_R3.World; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_8_R3.CraftServer; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftMinecartFurnace; -import org.bukkit.entity.Minecart; -import org.bukkit.util.Vector; - public class MinecartFurnaceController extends MobEntityController { public MinecartFurnaceController() { super(EntityMinecartFurnaceNPC.class); @@ -40,11 +41,6 @@ public class MinecartFurnaceController extends MobEntityController { this.npc = (CitizensNPC) npc; } - @Override - public boolean d(NBTTagCompound save) { - return npc == null ? super.d(save) : false; - } - @Override public void collide(net.minecraft.server.v1_8_R3.Entity entity) { // this method is called by both the entities involved - cancelling @@ -55,6 +51,18 @@ public class MinecartFurnaceController extends MobEntityController { } } + @Override + public boolean d(NBTTagCompound save) { + return npc == null ? super.d(save) : false; + } + + @Override + public boolean damageEntity(DamageSource damagesource, float f) { + if (npc == null || !npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + return super.damageEntity(damagesource, f); + return false; + } + @Override public void g(double x, double y, double z) { if (npc == null) { diff --git a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartHopperController.java b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartHopperController.java index 975656355..343825425 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartHopperController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartHopperController.java @@ -1,5 +1,8 @@ package net.citizensnpcs.npc.entity.nonliving; +import org.bukkit.entity.Minecart; +import org.bukkit.util.Vector; + import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.npc.CitizensNPC; @@ -7,13 +10,11 @@ import net.citizensnpcs.npc.MobEntityController; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_8_R3.DamageSource; import net.minecraft.server.v1_8_R3.EntityMinecartHopper; import net.minecraft.server.v1_8_R3.NBTTagCompound; import net.minecraft.server.v1_8_R3.World; -import org.bukkit.entity.Minecart; -import org.bukkit.util.Vector; - public class MinecartHopperController extends MobEntityController { public MinecartHopperController() { super(EntityMinecartHopperNPC.class); @@ -36,11 +37,6 @@ public class MinecartHopperController extends MobEntityController { this.npc = (CitizensNPC) npc; } - @Override - public boolean d(NBTTagCompound save) { - return npc == null ? super.d(save) : false; - } - @Override public void collide(net.minecraft.server.v1_8_R3.Entity entity) { // this method is called by both the entities involved - cancelling @@ -51,6 +47,18 @@ public class MinecartHopperController extends MobEntityController { } } + @Override + public boolean d(NBTTagCompound save) { + return npc == null ? super.d(save) : false; + } + + @Override + public boolean damageEntity(DamageSource damagesource, float f) { + if (npc == null || !npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + return super.damageEntity(damagesource, f); + return false; + } + @Override public void g(double x, double y, double z) { if (npc == null) { diff --git a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartRideableController.java b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartRideableController.java index 63ad4be31..b4eab2a8a 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartRideableController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartRideableController.java @@ -1,5 +1,12 @@ package net.citizensnpcs.npc.entity.nonliving; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_8_R3.CraftServer; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftMinecartRideable; +import org.bukkit.entity.Minecart; +import org.bukkit.util.Vector; + import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.npc.CitizensNPC; @@ -7,17 +14,11 @@ import net.citizensnpcs.npc.MobEntityController; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_8_R3.DamageSource; import net.minecraft.server.v1_8_R3.EntityMinecartRideable; import net.minecraft.server.v1_8_R3.NBTTagCompound; import net.minecraft.server.v1_8_R3.World; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_8_R3.CraftServer; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftMinecartRideable; -import org.bukkit.entity.Minecart; -import org.bukkit.util.Vector; - public class MinecartRideableController extends MobEntityController { public MinecartRideableController() { super(EntityMinecartRideableNPC.class); @@ -40,11 +41,6 @@ public class MinecartRideableController extends MobEntityController { this.npc = (CitizensNPC) npc; } - @Override - public boolean d(NBTTagCompound save) { - return npc == null ? super.d(save) : false; - } - @Override public void collide(net.minecraft.server.v1_8_R3.Entity entity) { // this method is called by both the entities involved - cancelling @@ -55,6 +51,18 @@ public class MinecartRideableController extends MobEntityController { } } + @Override + public boolean d(NBTTagCompound save) { + return npc == null ? super.d(save) : false; + } + + @Override + public boolean damageEntity(DamageSource damagesource, float f) { + if (npc == null || !npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + return super.damageEntity(damagesource, f); + return false; + } + @Override public void g(double x, double y, double z) { if (npc == null) { diff --git a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartSpawnerController.java b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartSpawnerController.java index 22988f2f6..7cc0d697e 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartSpawnerController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartSpawnerController.java @@ -1,5 +1,8 @@ package net.citizensnpcs.npc.entity.nonliving; +import org.bukkit.entity.Minecart; +import org.bukkit.util.Vector; + import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.npc.CitizensNPC; @@ -7,13 +10,11 @@ import net.citizensnpcs.npc.MobEntityController; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_8_R3.DamageSource; import net.minecraft.server.v1_8_R3.EntityMinecartMobSpawner; import net.minecraft.server.v1_8_R3.NBTTagCompound; import net.minecraft.server.v1_8_R3.World; -import org.bukkit.entity.Minecart; -import org.bukkit.util.Vector; - public class MinecartSpawnerController extends MobEntityController { public MinecartSpawnerController() { super(EntityMinecartSpawnerNPC.class); @@ -36,11 +37,6 @@ public class MinecartSpawnerController extends MobEntityController { this.npc = (CitizensNPC) npc; } - @Override - public boolean d(NBTTagCompound save) { - return npc == null ? super.d(save) : false; - } - @Override public void collide(net.minecraft.server.v1_8_R3.Entity entity) { // this method is called by both the entities involved - cancelling @@ -51,6 +47,18 @@ public class MinecartSpawnerController extends MobEntityController { } } + @Override + public boolean d(NBTTagCompound save) { + return npc == null ? super.d(save) : false; + } + + @Override + public boolean damageEntity(DamageSource damagesource, float f) { + if (npc == null || !npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + return super.damageEntity(damagesource, f); + return false; + } + @Override public void g(double x, double y, double z) { if (npc == null) { diff --git a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartTNTController.java b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartTNTController.java index 92324ce8e..f79b6e37a 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartTNTController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/nonliving/MinecartTNTController.java @@ -1,5 +1,8 @@ package net.citizensnpcs.npc.entity.nonliving; +import org.bukkit.entity.Minecart; +import org.bukkit.util.Vector; + import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.npc.CitizensNPC; @@ -7,13 +10,11 @@ import net.citizensnpcs.npc.MobEntityController; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; +import net.minecraft.server.v1_8_R3.DamageSource; import net.minecraft.server.v1_8_R3.EntityMinecartTNT; import net.minecraft.server.v1_8_R3.NBTTagCompound; import net.minecraft.server.v1_8_R3.World; -import org.bukkit.entity.Minecart; -import org.bukkit.util.Vector; - public class MinecartTNTController extends MobEntityController { public MinecartTNTController() { super(EntityMinecartTNTNPC.class); @@ -36,11 +37,6 @@ public class MinecartTNTController extends MobEntityController { this.npc = (CitizensNPC) npc; } - @Override - public boolean d(NBTTagCompound save) { - return npc == null ? super.d(save) : false; - } - @Override public void collide(net.minecraft.server.v1_8_R3.Entity entity) { // this method is called by both the entities involved - cancelling @@ -51,6 +47,18 @@ public class MinecartTNTController extends MobEntityController { } } + @Override + public boolean d(NBTTagCompound save) { + return npc == null ? super.d(save) : false; + } + + @Override + public boolean damageEntity(DamageSource damagesource, float f) { + if (npc == null || !npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) + return super.damageEntity(damagesource, f); + return false; + } + @Override public void g(double x, double y, double z) { if (npc == null) { From 2f0c1949c2558bff8473ade207565f2bfefd632d Mon Sep 17 00:00:00 2001 From: fullwall Date: Tue, 25 Aug 2015 21:52:10 +0800 Subject: [PATCH 2/5] Fixes --- .../citizensnpcs/commands/TraitCommands.java | 18 +++++++++--------- .../java/net/citizensnpcs/npc/CitizensNPC.java | 2 +- .../citizensnpcs/npc/ai/MCTargetStrategy.java | 11 ++++++----- .../npc/entity/HumanController.java | 3 +-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/citizensnpcs/commands/TraitCommands.java b/src/main/java/net/citizensnpcs/commands/TraitCommands.java index 7de240746..a328c5511 100644 --- a/src/main/java/net/citizensnpcs/commands/TraitCommands.java +++ b/src/main/java/net/citizensnpcs/commands/TraitCommands.java @@ -2,6 +2,13 @@ package net.citizensnpcs.commands; import java.util.List; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.Lists; + import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.command.Command; import net.citizensnpcs.api.command.CommandConfigurable; @@ -16,13 +23,6 @@ import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.StringHelper; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; - -import com.google.common.base.Joiner; -import com.google.common.base.Splitter; -import com.google.common.collect.Lists; - @Requirements(selected = true, ownership = true) public class TraitCommands { @Command( @@ -30,12 +30,12 @@ public class TraitCommands { usage = "add [trait name]...", desc = "Adds traits to the NPC", modifiers = { "add", "a" }, - min = 1, + min = 2, permission = "citizens.npc.trait") public void add(CommandContext args, CommandSender sender, NPC npc) throws CommandException { List added = Lists.newArrayList(); List failed = Lists.newArrayList(); - for (String traitName : Splitter.on(',').split(args.getJoinedStrings(0))) { + for (String traitName : Splitter.on(',').split(args.getJoinedStrings(1))) { if (!sender.hasPermission("citizens.npc.trait." + traitName) && !sender.hasPermission("citizens.npc.trait.*")) { failed.add(String.format("%s: No permission", traitName)); diff --git a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index b83088520..d8147918f 100644 --- a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -291,7 +291,7 @@ public class CitizensNPC extends AbstractNPC { && getEntity().getWorld().getFullTime() % Setting.PACKET_UPDATE_DELAY.asInt() == 0) { if (getEntity() instanceof LivingEntity) { if (!getEntity().isCustomNameVisible()) { - getEntity().setCustomName(""); + getEntity().setCustomName("&2"); } else { getEntity().setCustomName(getFullName()); } diff --git a/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java b/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java index c79813373..c7d91628c 100644 --- a/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java +++ b/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java @@ -1,5 +1,9 @@ package net.citizensnpcs.npc.ai; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; +import org.bukkit.entity.LivingEntity; + import net.citizensnpcs.api.ai.AttackStrategy; import net.citizensnpcs.api.ai.EntityTarget; import net.citizensnpcs.api.ai.NavigatorParameters; @@ -13,10 +17,6 @@ import net.minecraft.server.v1_8_R3.EntityLiving; import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.NavigationAbstract; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity; -import org.bukkit.entity.LivingEntity; - public class MCTargetStrategy implements PathStrategy, EntityTarget { private final boolean aggro; private int attackTicks; @@ -117,9 +117,10 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget { } if (!aggro && distanceSquared() < parameters.distanceMargin()) { stop(); - } else if (target.world.getWorld().getFullTime() % 10 == 0) { + } else if (target.world.getWorld().getFullTime() % 40 == 0) { setPath(); } + NMS.look(handle, target); if (aggro && canAttack()) { AttackStrategy strategy = parameters.attackStrategy(); diff --git a/src/main/java/net/citizensnpcs/npc/entity/HumanController.java b/src/main/java/net/citizensnpcs/npc/entity/HumanController.java index 046fe92bf..f977bdcdc 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/HumanController.java +++ b/src/main/java/net/citizensnpcs/npc/entity/HumanController.java @@ -100,7 +100,6 @@ public class HumanController extends AbstractEntityController { msb |= 0x0000000000002000L; uuid = new UUID(msb, uuid.getLeastSignificantBits()); } - GameProfile profile = new GameProfile(uuid, coloredName); updateSkin(npc, nmsWorld, profile); @@ -118,7 +117,7 @@ public class HumanController extends AbstractEntityController { if (prefixCapture != null) { Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard(); - String teamName = UUID.randomUUID().toString().substring(0,16); + String teamName = UUID.randomUUID().toString().substring(0, 16); Team team = scoreboard.getTeam(teamName); if (team == null) { From 6419d7a17cdb898acad0fdcaf05ecd4af1984a7c Mon Sep 17 00:00:00 2001 From: fullwall Date: Tue, 25 Aug 2015 22:07:03 +0800 Subject: [PATCH 3/5] Set pathing delay to be same as Minecraft's --- src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java b/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java index c7d91628c..13044f799 100644 --- a/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java +++ b/src/main/java/net/citizensnpcs/npc/ai/MCTargetStrategy.java @@ -117,7 +117,7 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget { } if (!aggro && distanceSquared() < parameters.distanceMargin()) { stop(); - } else if (target.world.getWorld().getFullTime() % 40 == 0) { + } else if (target.world.getWorld().getFullTime() % 60 == 0) { setPath(); } From fef6ddc5fc0899d7b385f3b01d852b8695d019ee Mon Sep 17 00:00:00 2001 From: fullwall Date: Tue, 25 Aug 2015 23:21:23 +0800 Subject: [PATCH 4/5] Update EventListen.java --- src/main/java/net/citizensnpcs/EventListen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/citizensnpcs/EventListen.java b/src/main/java/net/citizensnpcs/EventListen.java index e3992d7a2..cc4f64197 100644 --- a/src/main/java/net/citizensnpcs/EventListen.java +++ b/src/main/java/net/citizensnpcs/EventListen.java @@ -216,8 +216,8 @@ public class EventListen implements Listener { if (npc == null) { return; } - Bukkit.getPluginManager().callEvent(new NPCDeathEvent(npc, event)); final Location location = npc.getEntity().getLocation(); + Bukkit.getPluginManager().callEvent(new NPCDeathEvent(npc, event)); npc.despawn(DespawnReason.DEATH); if (npc.data().has(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA)) { @@ -235,7 +235,7 @@ public class EventListen implements Listener { Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), new Runnable() { @Override public void run() { - if (!npc.isSpawned()) { + if (!npc.isSpawned() && npc.getOwningRegistry().getByUniqueId(npc.getUniqueId()) == npc) { npc.spawn(location); } } From a911c3dd347bf3b4610fa42aef5098d286d89ecc Mon Sep 17 00:00:00 2001 From: fullwall Date: Tue, 25 Aug 2015 23:41:37 +0800 Subject: [PATCH 5/5] Fix player NPCs not working with /npc name --- .../net/citizensnpcs/npc/CitizensNPC.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index d8147918f..5c9eaa479 100644 --- a/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -17,6 +17,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scoreboard.NameTagVisibility; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; @@ -67,7 +68,6 @@ public class CitizensNPC extends AbstractNPC { } return false; } - NPCDespawnEvent event = new NPCDespawnEvent(this, reason); if (reason == DespawnReason.CHUNK_UNLOAD) { event.setCancelled(Setting.KEEP_CHUNKS_LOADED.asBoolean()); @@ -237,12 +237,6 @@ public class CitizensNPC extends AbstractNPC { LivingEntity entity = (LivingEntity) getEntity(); entity.setRemoveWhenFarAway(false); - if (!data().get(NPC.NAMEPLATE_VISIBLE_METADATA, true)) { - entity.setCustomName(""); - } else { - entity.setCustomName(getFullName()); - } - if (NMS.getStepHeight(entity) < 1) { NMS.setStepHeight(NMS.getHandle(entity), 1); } @@ -291,8 +285,18 @@ public class CitizensNPC extends AbstractNPC { && getEntity().getWorld().getFullTime() % Setting.PACKET_UPDATE_DELAY.asInt() == 0) { if (getEntity() instanceof LivingEntity) { if (!getEntity().isCustomNameVisible()) { - getEntity().setCustomName("&2"); + if (getEntity() instanceof Player && data().has(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA)) { + String teamName = data().get(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA); + Bukkit.getScoreboardManager().getMainScoreboard().getTeam(teamName) + .setNameTagVisibility(NameTagVisibility.NEVER); + } + getEntity().setCustomName(""); } else { + if (getEntity() instanceof Player && data().has(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA)) { + String teamName = data().get(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA); + Bukkit.getScoreboardManager().getMainScoreboard().getTeam(teamName) + .setNameTagVisibility(NameTagVisibility.ALWAYS); + } getEntity().setCustomName(getFullName()); } }