mirror of
https://github.com/CitizensDev/Citizens2.git
synced 2024-12-29 12:37:37 +01:00
Format and potential fix for incorrect chunk unload logic
This commit is contained in:
parent
c053fa9871
commit
dc4fb0a33e
@ -62,8 +62,8 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
|
||||
private CitizensNPCRegistry npcRegistry;
|
||||
private NPCDataStore saves;
|
||||
private NPCSelector selector;
|
||||
private CitizensTraitFactory traitFactory;
|
||||
private CitizensSpeechFactory speechFactory;
|
||||
private CitizensTraitFactory traitFactory;
|
||||
|
||||
private void despawnNPCs() {
|
||||
Iterator<NPC> itr = npcRegistry.iterator();
|
||||
@ -131,13 +131,13 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
|
||||
}
|
||||
|
||||
@Override
|
||||
public TraitFactory getTraitFactory() {
|
||||
return traitFactory;
|
||||
public SpeechFactory getSpeechFactory() {
|
||||
return speechFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SpeechFactory getSpeechFactory() {
|
||||
return speechFactory;
|
||||
public TraitFactory getTraitFactory() {
|
||||
return traitFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -69,21 +69,13 @@ public class EventListen implements Listener {
|
||||
/*
|
||||
* Chunk events
|
||||
*/
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onChunkLoad(ChunkLoadEvent event) {
|
||||
ChunkCoord coord = toCoord(event.getChunk());
|
||||
List<Integer> ids = toRespawn.get(coord);
|
||||
for (int i = 0; i < ids.size(); i++) {
|
||||
int id = ids.get(i);
|
||||
boolean success = spawn(id);
|
||||
if (!success)
|
||||
continue;
|
||||
ids.remove(i);
|
||||
Messaging.debug("Spawned", id, "due to chunk load at [" + coord.x + "," + coord.z + "]");
|
||||
}
|
||||
respawnAllFromCoord(coord);
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onChunkUnload(ChunkUnloadEvent event) {
|
||||
ChunkCoord coord = toCoord(event.getChunk());
|
||||
Location location = new Location(null, 0, 0, 0);
|
||||
@ -93,13 +85,15 @@ public class EventListen implements Listener {
|
||||
location = npc.getBukkitEntity().getLocation(location);
|
||||
boolean sameChunkCoordinates = coord.z == location.getBlockZ() >> 4 && coord.x == location.getBlockX() >> 4;
|
||||
if (sameChunkCoordinates && event.getWorld().equals(location.getWorld())) {
|
||||
npc.despawn(DespawnReason.CHUNK_UNLOAD);
|
||||
if (event.getChunk().isLoaded()) {
|
||||
toRespawn.removeAll(coord);
|
||||
if (!npc.despawn(DespawnReason.CHUNK_UNLOAD)) {
|
||||
event.setCancelled(true);
|
||||
Messaging.debug("Cancelled chunk unload at [" + coord.x + "," + coord.z + "]");
|
||||
respawnAllFromCoord(coord);
|
||||
return;
|
||||
}
|
||||
toRespawn.put(coord, npc.getId());
|
||||
Messaging.debug("Despawned", npc.getId(), "due to chunk unload at [" + coord.x + "," + coord.z + "]");
|
||||
Messaging.debug("Despawned id ", npc.getId(), "due to chunk unload at [" + coord.x + "," + coord.z
|
||||
+ "]");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -189,10 +183,6 @@ public class EventListen implements Listener {
|
||||
// undesirable as player NPCs are not real players and confuse plugins.
|
||||
}
|
||||
|
||||
/*
|
||||
* Player events
|
||||
*/
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onPlayerCreateNPC(PlayerCreateNPCEvent event) {
|
||||
if (event.getCreator().hasPermission("citizens.admin.avoid-limits"))
|
||||
@ -219,6 +209,10 @@ public class EventListen implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Player events
|
||||
*/
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
|
||||
NPC npc = npcRegistry.getNPC(event.getRightClicked());
|
||||
@ -232,7 +226,7 @@ public class EventListen implements Listener {
|
||||
Bukkit.getPluginManager().callEvent(rightClickEvent);
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
Editor.leave(event.getPlayer());
|
||||
}
|
||||
@ -255,17 +249,34 @@ public class EventListen implements Listener {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onWorldUnload(WorldUnloadEvent event) {
|
||||
for (NPC npc : npcRegistry) {
|
||||
if (!npc.isSpawned() || !npc.getBukkitEntity().getWorld().equals(event.getWorld()))
|
||||
continue;
|
||||
storeForRespawn(npc);
|
||||
npc.despawn();
|
||||
npc.despawn(DespawnReason.WORLD_UNLOAD);
|
||||
if (event.isCancelled())
|
||||
return;
|
||||
Messaging.debug("Despawned", npc.getId() + "due to world unload at", event.getWorld().getName());
|
||||
}
|
||||
}
|
||||
|
||||
private void respawnAllFromCoord(ChunkCoord coord) {
|
||||
List<Integer> ids = toRespawn.get(coord);
|
||||
for (int i = 0; i < ids.size(); i++) {
|
||||
int id = ids.get(i);
|
||||
boolean success = spawn(id);
|
||||
if (!success) {
|
||||
Messaging.debug("Couldn't respawn id " + id + " during chunk event at [" + coord.x + "," + coord.z
|
||||
+ "]");
|
||||
continue;
|
||||
}
|
||||
ids.remove(i);
|
||||
Messaging.debug("Spawned id ", id, "due to chunk event at [" + coord.x + "," + coord.z + "]");
|
||||
}
|
||||
}
|
||||
|
||||
private boolean spawn(int id) {
|
||||
NPC npc = npcRegistry.getById(id);
|
||||
if (npc == null)
|
||||
|
@ -28,6 +28,27 @@ public class NPCDataStore {
|
||||
root = saves;
|
||||
}
|
||||
|
||||
public void addPlotters(Graph graph) {
|
||||
graph.addPlotter(new Plotter("Database") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return root instanceof DatabaseStorage ? 1 : 0;
|
||||
}
|
||||
});
|
||||
graph.addPlotter(new Plotter("YAML") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return root instanceof YamlStorage ? 1 : 0;
|
||||
}
|
||||
});
|
||||
graph.addPlotter(new Plotter("NBT") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return root instanceof NBTStorage ? 1 : 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void loadInto(CitizensNPCRegistry registry) {
|
||||
int created = 0;
|
||||
for (DataKey key : root.getKey("npc").getIntegerSubKeys()) {
|
||||
@ -81,16 +102,14 @@ public class NPCDataStore {
|
||||
String type = Setting.STORAGE_TYPE.asString();
|
||||
if (type.equalsIgnoreCase("db") || type.equalsIgnoreCase("database")) {
|
||||
try {
|
||||
saves = new DatabaseStorage(Setting.DATABASE_DRIVER.asString(),
|
||||
Setting.DATABASE_URL.asString(), Setting.DATABASE_USERNAME.asString(),
|
||||
Setting.DATABASE_PASSWORD.asString());
|
||||
saves = new DatabaseStorage(Setting.DATABASE_DRIVER.asString(), Setting.DATABASE_URL.asString(),
|
||||
Setting.DATABASE_USERNAME.asString(), Setting.DATABASE_PASSWORD.asString());
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Messaging.logTr(Messages.DATABASE_CONNECTION_FAILED);
|
||||
}
|
||||
} else if (type.equalsIgnoreCase("nbt")) {
|
||||
saves = new NBTStorage(folder + File.separator + Setting.STORAGE_FILE.asString(),
|
||||
"Citizens NPC Storage");
|
||||
saves = new NBTStorage(folder + File.separator + Setting.STORAGE_FILE.asString(), "Citizens NPC Storage");
|
||||
}
|
||||
if (saves == null)
|
||||
saves = new YamlStorage(new File(folder, Setting.STORAGE_FILE.asString()), "Citizens NPC Storage");
|
||||
@ -98,25 +117,4 @@ public class NPCDataStore {
|
||||
return null;
|
||||
return new NPCDataStore(saves);
|
||||
}
|
||||
|
||||
public void addPlotters(Graph graph) {
|
||||
graph.addPlotter(new Plotter("Database") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return root instanceof DatabaseStorage ? 1 : 0;
|
||||
}
|
||||
});
|
||||
graph.addPlotter(new Plotter("YAML") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return root instanceof YamlStorage ? 1 : 0;
|
||||
}
|
||||
});
|
||||
graph.addPlotter(new Plotter("NBT") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return root instanceof NBTStorage ? 1 : 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -43,14 +43,16 @@ public class Settings {
|
||||
}
|
||||
|
||||
public enum Setting {
|
||||
CHAT_FORMAT("npc.chat.format.no-targets", "[<npc>]: <text>"),
|
||||
CHAT_FORMAT_TO_TARGET("npc.chat.format.to-target", "[<npc>] -> You: <text>"),
|
||||
CHAT_FORMAT_TO_BYSTANDERS("npc.chat.format.with-target-to-bystanders", "[<npc>] -> [<target>]: <text>"),
|
||||
CHAT_FORMAT_WITH_TARGETS_TO_BYSTANDERS("npc.chat.format.with-targets-to-bystanders", "[<npc>] -> [<targets>]: <text>"),
|
||||
CHAT_RANGE("npc.chat.options.range", 5),
|
||||
CHAT_BYSTANDERS_HEAR_TARGETED_CHAT("npc.chat.options.bystanders-hear-targeted-chat", true),
|
||||
CHAT_FORMAT("npc.chat.format.no-targets", "[<npc>]: <text>"),
|
||||
CHAT_FORMAT_TO_BYSTANDERS("npc.chat.format.with-target-to-bystanders", "[<npc>] -> [<target>]: <text>"),
|
||||
CHAT_FORMAT_TO_TARGET("npc.chat.format.to-target", "[<npc>] -> You: <text>"),
|
||||
CHAT_FORMAT_WITH_TARGETS_TO_BYSTANDERS("npc.chat.format.with-targets-to-bystanders",
|
||||
"[<npc>] -> [<targets>]: <text>"),
|
||||
CHAT_MAX_NUMBER_OF_TARGETS("npc.chat.options.max-number-of-targets-to-show", 2),
|
||||
CHAT_MULTIPLE_TARGETS_FORMAT("npc.chat.options.multiple-targets-format", "<target>|, <target>| & <target>| & others"),
|
||||
CHAT_MULTIPLE_TARGETS_FORMAT("npc.chat.options.multiple-targets-format",
|
||||
"<target>|, <target>| & <target>| & others"),
|
||||
CHAT_RANGE("npc.chat.options.range", 5),
|
||||
DATABASE_DRIVER("storage.database.driver", ""),
|
||||
DATABASE_PASSWORD("storage.database.password", ""),
|
||||
DATABASE_URL("storage.database.url", ""),
|
||||
|
@ -215,7 +215,7 @@ public class CommandContext {
|
||||
location = ((BlockCommandSender) sender).getBlock().getLocation();
|
||||
return location;
|
||||
}
|
||||
|
||||
|
||||
public String[] getSlice(int index) {
|
||||
String[] slice = new String[args.length - index];
|
||||
System.arraycopy(args, index, slice, 0, args.length - index);
|
||||
|
@ -35,8 +35,7 @@ import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
public class CommandManager {
|
||||
private final Map<Class<? extends Annotation>, CommandAnnotationProcessor> annotationProcessors = Maps
|
||||
.newHashMap();
|
||||
private final Map<Class<? extends Annotation>, CommandAnnotationProcessor> annotationProcessors = Maps.newHashMap();
|
||||
|
||||
/*
|
||||
* Mapping of commands (including aliases) with a description. Root commands
|
||||
@ -77,8 +76,8 @@ public class CommandManager {
|
||||
* @throws CommandException
|
||||
* Any exceptions caused from execution of the command
|
||||
*/
|
||||
public void execute(org.bukkit.command.Command command, String[] args, CommandSender sender,
|
||||
Object... methodArgs) throws CommandException {
|
||||
public void execute(org.bukkit.command.Command command, String[] args, CommandSender sender, Object... methodArgs)
|
||||
throws CommandException {
|
||||
// must put command into split.
|
||||
String[] newArgs = new String[args.length + 1];
|
||||
System.arraycopy(args, 0, newArgs, 1, args.length);
|
||||
@ -90,8 +89,7 @@ public class CommandManager {
|
||||
}
|
||||
|
||||
// Attempt to execute a command.
|
||||
private void executeMethod(String[] args, CommandSender sender, Object[] methodArgs)
|
||||
throws CommandException {
|
||||
private void executeMethod(String[] args, CommandSender sender, Object[] methodArgs) throws CommandException {
|
||||
String cmdName = args[0];
|
||||
String modifier = args.length > 1 ? args[1] : "";
|
||||
|
||||
@ -288,8 +286,7 @@ public class CommandManager {
|
||||
// Returns whether a player has access to a command.
|
||||
private boolean hasPermission(Method method, CommandSender sender) {
|
||||
Command cmd = method.getAnnotation(Command.class);
|
||||
if (cmd.permission().isEmpty() || hasPermission(sender, cmd.permission())
|
||||
|| hasPermission(sender, "admin"))
|
||||
if (cmd.permission().isEmpty() || hasPermission(sender, cmd.permission()) || hasPermission(sender, "admin"))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -64,8 +64,8 @@ public class RequirementsProcessor implements CommandAnnotationProcessor {
|
||||
|
||||
EntityType type = npc.getTrait(MobType.class).getType();
|
||||
if (!types.contains(type)) {
|
||||
throw new RequirementMissingException(Messaging.tr(
|
||||
Messages.COMMAND_REQUIREMENTS_INVALID_MOB_TYPE, type.getName()));
|
||||
throw new RequirementMissingException(Messaging.tr(Messages.COMMAND_REQUIREMENTS_INVALID_MOB_TYPE,
|
||||
type.getName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,10 +23,8 @@ public class AdminCommands {
|
||||
|
||||
@Command(aliases = { "citizens" }, desc = "Show basic plugin information", max = 0, permission = "admin")
|
||||
public void citizens(CommandContext args, CommandSender sender, NPC npc) {
|
||||
Messaging.send(
|
||||
sender,
|
||||
" "
|
||||
+ StringHelper.wrapHeader("<e>Citizens v" + plugin.getDescription().getVersion()));
|
||||
Messaging.send(sender,
|
||||
" " + StringHelper.wrapHeader("<e>Citizens v" + plugin.getDescription().getVersion()));
|
||||
Messaging.send(sender, " <7>-- <c>Written by fullwall and aPunch");
|
||||
Messaging.send(sender, " <7>-- <c>Source Code: http://github.com/CitizensDev");
|
||||
Messaging.send(sender, " <7>-- <c>Website: " + plugin.getDescription().getWebsite());
|
||||
|
@ -23,8 +23,8 @@ public class EditorCommands {
|
||||
min = 1,
|
||||
max = 1,
|
||||
permission = "npc.edit.equip")
|
||||
@Requirements(selected = true, ownership = true, types = { EntityType.ENDERMAN, EntityType.PLAYER,
|
||||
EntityType.PIG, EntityType.SHEEP })
|
||||
@Requirements(selected = true, ownership = true, types = { EntityType.ENDERMAN, EntityType.PLAYER, EntityType.PIG,
|
||||
EntityType.SHEEP })
|
||||
public void equip(CommandContext args, Player player, NPC npc) {
|
||||
Editor.enterOrLeave(player, new EquipmentEditor(player, npc));
|
||||
}
|
||||
@ -37,8 +37,8 @@ public class EditorCommands {
|
||||
min = 1,
|
||||
max = 1,
|
||||
permission = "npc.edit.path")
|
||||
@Requirements(selected = true, ownership = true, excludedTypes = { EntityType.BLAZE,
|
||||
EntityType.ENDER_DRAGON, EntityType.GHAST, EntityType.BAT, EntityType.WITHER, EntityType.SQUID })
|
||||
@Requirements(selected = true, ownership = true, excludedTypes = { EntityType.BLAZE, EntityType.ENDER_DRAGON,
|
||||
EntityType.GHAST, EntityType.BAT, EntityType.WITHER, EntityType.SQUID })
|
||||
public void path(CommandContext args, Player player, NPC npc) {
|
||||
Editor.enterOrLeave(player, npc.getTrait(Waypoints.class).getEditor(player));
|
||||
}
|
||||
|
@ -112,8 +112,7 @@ public class HelpCommands {
|
||||
throw new CommandException(Messages.COMMAND_PAGE_MISSING, page);
|
||||
}
|
||||
|
||||
private void sendSpecificHelp(CommandSender sender, String rootCommand, String modifier)
|
||||
throws CommandException {
|
||||
private void sendSpecificHelp(CommandSender sender, String rootCommand, String modifier) throws CommandException {
|
||||
CommandInfo info = plugin.getCommandInfo(rootCommand, modifier);
|
||||
if (info == null)
|
||||
throw new CommandException(Messages.COMMAND_MISSING, rootCommand + " " + modifier);
|
||||
@ -165,7 +164,7 @@ public class HelpCommands {
|
||||
private static final String COMMAND_FORMAT = "<7>/<c>%s%s <7>- <e>%s";
|
||||
|
||||
private static final String format(Command command) {
|
||||
return String.format(COMMAND_FORMAT, command.aliases()[0], (command.usage().isEmpty() ? "" : " "
|
||||
+ command.usage()), Messaging.tryTranslate(command.desc()));
|
||||
return String.format(COMMAND_FORMAT, command.aliases()[0],
|
||||
(command.usage().isEmpty() ? "" : " " + command.usage()), Messaging.tryTranslate(command.desc()));
|
||||
}
|
||||
}
|
@ -30,8 +30,7 @@ public class ScriptCommands {
|
||||
min = 2,
|
||||
max = 2,
|
||||
permission = "script.compile")
|
||||
public void runScript(final CommandContext args, final CommandSender sender, NPC npc)
|
||||
throws CommandException {
|
||||
public void runScript(final CommandContext args, final CommandSender sender, NPC npc) throws CommandException {
|
||||
File file = new File(CitizensAPI.getScriptFolder(), args.getString(1));
|
||||
if (!file.exists())
|
||||
throw new CommandException(Messages.SCRIPT_FILE_MISSING, args.getString(1));
|
||||
|
@ -55,8 +55,8 @@ public class SelectionPrompt extends NumericPrompt {
|
||||
}
|
||||
|
||||
public static void start(NPCSelector selector, Player player, List<NPC> possible) {
|
||||
final Conversation conversation = new ConversationFactory(CitizensAPI.getPlugin())
|
||||
.withLocalEcho(false).withEscapeSequence("exit").withModality(false)
|
||||
final Conversation conversation = new ConversationFactory(CitizensAPI.getPlugin()).withLocalEcho(false)
|
||||
.withEscapeSequence("exit").withModality(false)
|
||||
.withFirstPrompt(new SelectionPrompt(selector, possible)).buildConversation(player);
|
||||
conversation.begin();
|
||||
}
|
||||
|
@ -24,13 +24,8 @@ import com.google.common.collect.Lists;
|
||||
@Requirements(selected = true, ownership = true)
|
||||
public class TraitCommands {
|
||||
|
||||
@Command(
|
||||
aliases = { "trait", "tr" },
|
||||
usage = "add [trait name]...",
|
||||
desc = "Adds traits to the NPC",
|
||||
modifiers = { "add", "a" },
|
||||
min = 1,
|
||||
permission = "npc.trait")
|
||||
@Command(aliases = { "trait", "tr" }, usage = "add [trait name]...", desc = "Adds traits to the NPC", modifiers = {
|
||||
"add", "a" }, min = 1, permission = "npc.trait")
|
||||
public void add(CommandContext args, CommandSender sender, NPC npc) throws CommandException {
|
||||
List<String> added = Lists.newArrayList();
|
||||
List<String> failed = Lists.newArrayList();
|
||||
|
@ -26,8 +26,7 @@ public class WaypointCommands {
|
||||
min = 1,
|
||||
max = 1,
|
||||
permission = "waypoints.disableteleport")
|
||||
public void disableTeleporting(CommandContext args, CommandSender sender, NPC npc)
|
||||
throws CommandException {
|
||||
public void disableTeleporting(CommandContext args, CommandSender sender, NPC npc) throws CommandException {
|
||||
npc.getNavigator().getDefaultParameters().stuckAction(null);
|
||||
Messaging.sendTr(sender, Messages.WAYPOINT_TELEPORTING_DISABLED);
|
||||
}
|
||||
@ -47,8 +46,7 @@ public class WaypointCommands {
|
||||
if (args.hasFlag('a')) {
|
||||
waypoints.describeProviders(sender);
|
||||
} else
|
||||
Messaging.sendTr(sender, Messages.CURRENT_WAYPOINT_PROVIDER,
|
||||
waypoints.getCurrentProviderName());
|
||||
Messaging.sendTr(sender, Messages.CURRENT_WAYPOINT_PROVIDER, waypoints.getCurrentProviderName());
|
||||
return;
|
||||
}
|
||||
boolean success = waypoints.setWaypointProvider(args.getString(1));
|
||||
|
@ -27,8 +27,7 @@ public class EndermanEquipper implements Equipper {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
equipper.getWorld()
|
||||
.dropItemNaturally(npc.getBukkitEntity().getLocation(), carried.toItemStack(1));
|
||||
equipper.getWorld().dropItemNaturally(npc.getBukkitEntity().getLocation(), carried.toItemStack(1));
|
||||
((Enderman) npc.getBukkitEntity()).setCarriedMaterial(hand.getData());
|
||||
}
|
||||
|
||||
|
@ -56,8 +56,7 @@ public class GenericEquipper implements Equipper {
|
||||
case AIR:
|
||||
for (int i = 0; i < 5; i++) {
|
||||
if (trait.get(i) != null && trait.get(i).getType() != Material.AIR) {
|
||||
equipper.getWorld().dropItemNaturally(toEquip.getBukkitEntity().getLocation(),
|
||||
trait.get(i));
|
||||
equipper.getWorld().dropItemNaturally(toEquip.getBukkitEntity().getLocation(), trait.get(i));
|
||||
trait.set(i, null);
|
||||
}
|
||||
}
|
||||
|
@ -26,8 +26,8 @@ public class SheepEquipper implements Equipper {
|
||||
|
||||
DyeColor color = DyeColor.getByData((byte) (15 - hand.getData().getData()));
|
||||
toEquip.getTrait(WoolColor.class).setColor(color);
|
||||
Messaging.sendTr(equipper, Messages.EQUIPMENT_EDITOR_SHEEP_COLOURED, toEquip.getName(), color
|
||||
.name().toLowerCase().replace("_", " "));
|
||||
Messaging.sendTr(equipper, Messages.EQUIPMENT_EDITOR_SHEEP_COLOURED, toEquip.getName(), color.name()
|
||||
.toLowerCase().replace("_", " "));
|
||||
|
||||
hand.setAmount(hand.getAmount() - 1);
|
||||
} else {
|
||||
|
@ -58,8 +58,7 @@ public class CitizensNPC extends AbstractNPC {
|
||||
event.setCancelled(Setting.KEEP_CHUNKS_LOADED.asBoolean());
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if (event.isCancelled()) {
|
||||
getBukkitEntity().getLocation().getChunk();
|
||||
// ensure that we are in a loaded chunk.
|
||||
getBukkitEntity().getLocation().getChunk().load();
|
||||
return false;
|
||||
}
|
||||
boolean keepSelected = getTrait(Spawned.class).shouldSpawn();
|
||||
@ -97,8 +96,8 @@ public class CitizensNPC extends AbstractNPC {
|
||||
// Load traits
|
||||
|
||||
String traitNames = root.getString("traitnames");
|
||||
Iterable<DataKey> keys = traitNames.isEmpty() ? root.getRelative("traits").getSubKeys() : Iterables
|
||||
.transform(Splitter.on(',').split(traitNames), new Function<String, DataKey>() {
|
||||
Iterable<DataKey> keys = traitNames.isEmpty() ? root.getRelative("traits").getSubKeys() : Iterables.transform(
|
||||
Splitter.on(',').split(traitNames), new Function<String, DataKey>() {
|
||||
@Override
|
||||
public DataKey apply(@Nullable String input) {
|
||||
return root.getRelative("traits." + input);
|
||||
@ -196,8 +195,7 @@ public class CitizensNPC extends AbstractNPC {
|
||||
|
||||
entityController.spawn(at, this);
|
||||
EntityLiving mcEntity = getHandle();
|
||||
boolean couldSpawn = !Util.isLoaded(at) ? false : mcEntity.world.addEntity(mcEntity,
|
||||
SpawnReason.CUSTOM);
|
||||
boolean couldSpawn = !Util.isLoaded(at) ? false : mcEntity.world.addEntity(mcEntity, SpawnReason.CUSTOM);
|
||||
if (!couldSpawn) {
|
||||
// we need to wait for a chunk load before trying to spawn
|
||||
mcEntity = null;
|
||||
@ -213,8 +211,7 @@ public class CitizensNPC extends AbstractNPC {
|
||||
}
|
||||
|
||||
NMS.setHeadYaw(mcEntity, at.getYaw());
|
||||
getBukkitEntity().setMetadata(NPC_METADATA_MARKER,
|
||||
new FixedMetadataValue(CitizensAPI.getPlugin(), true));
|
||||
getBukkitEntity().setMetadata(NPC_METADATA_MARKER, new FixedMetadataValue(CitizensAPI.getPlugin(), true));
|
||||
|
||||
// Set the spawned state
|
||||
getTrait(CurrentLocation.class).setLocation(at);
|
||||
|
@ -38,8 +38,8 @@ import com.google.common.collect.Maps;
|
||||
|
||||
public class EntityControllers {
|
||||
|
||||
private static final Map<EntityType, Class<? extends EntityController>> TYPES = Maps
|
||||
.newEnumMap(EntityType.class);
|
||||
private static final Map<EntityType, Class<? extends EntityController>> TYPES = Maps.newEnumMap(EntityType.class);
|
||||
|
||||
public static EntityController createForType(EntityType type) {
|
||||
Class<? extends EntityController> controllerClass = TYPES.get(type);
|
||||
if (controllerClass == null)
|
||||
|
@ -102,8 +102,7 @@ public class Template {
|
||||
}
|
||||
}
|
||||
|
||||
private static YamlStorage templates = new YamlStorage(new File(CitizensAPI.getDataFolder(),
|
||||
"templates.yml"));
|
||||
private static YamlStorage templates = new YamlStorage(new File(CitizensAPI.getDataFolder(), "templates.yml"));
|
||||
|
||||
public static Template byName(String name) {
|
||||
if (!templates.getKey("").keyExists(name))
|
||||
|
@ -31,8 +31,9 @@ public class AStarNavigationStrategy extends AbstractPathStrategy {
|
||||
this.destination = dest;
|
||||
this.npc = npc;
|
||||
Location location = npc.getBukkitEntity().getEyeLocation();
|
||||
plan = ASTAR.runFully(new VectorGoal(dest), new VectorNode(location, new ChunkBlockSource(location,
|
||||
params.range()), params.examiners()), (int) (params.range() * 10));
|
||||
plan = ASTAR.runFully(new VectorGoal(dest),
|
||||
new VectorNode(location, new ChunkBlockSource(location, params.range()), params.examiners()),
|
||||
(int) (params.range() * 10));
|
||||
if (plan == null || plan.isComplete()) {
|
||||
setCancelReason(CancelReason.STUCK);
|
||||
} else {
|
||||
|
@ -23,10 +23,10 @@ import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
public class CitizensNavigator implements Navigator, Runnable {
|
||||
private final NavigatorParameters defaultParams = new NavigatorParameters()
|
||||
.baseSpeed(UNINITIALISED_SPEED).range(Setting.DEFAULT_PATHFINDING_RANGE.asFloat())
|
||||
.stationaryTicks(Setting.DEFAULT_STATIONARY_TICKS.asInt())
|
||||
.stuckAction(TeleportStuckAction.INSTANCE).examiner(new MinecraftBlockExaminer());
|
||||
private final NavigatorParameters defaultParams = new NavigatorParameters().baseSpeed(UNINITIALISED_SPEED)
|
||||
.range(Setting.DEFAULT_PATHFINDING_RANGE.asFloat())
|
||||
.stationaryTicks(Setting.DEFAULT_STATIONARY_TICKS.asInt()).stuckAction(TeleportStuckAction.INSTANCE)
|
||||
.examiner(new MinecraftBlockExaminer());
|
||||
private PathStrategy executing;
|
||||
private int lastX, lastY, lastZ;
|
||||
private NavigatorParameters localParams = defaultParams;
|
||||
@ -82,15 +82,12 @@ public class CitizensNavigator implements Navigator, Runnable {
|
||||
|
||||
public void load(DataKey root) {
|
||||
defaultParams.baseSpeed((float) root.getDouble("speed", UNINITIALISED_SPEED));
|
||||
defaultParams.range((float) root.getDouble("pathfindingrange",
|
||||
Setting.DEFAULT_PATHFINDING_RANGE.asFloat()));
|
||||
defaultParams
|
||||
.stationaryTicks(root.getInt("stationaryticks", Setting.DEFAULT_STATIONARY_TICKS.asInt()));
|
||||
defaultParams.range((float) root.getDouble("pathfindingrange", Setting.DEFAULT_PATHFINDING_RANGE.asFloat()));
|
||||
defaultParams.stationaryTicks(root.getInt("stationaryticks", Setting.DEFAULT_STATIONARY_TICKS.asInt()));
|
||||
defaultParams.speedModifier((float) root.getDouble("speedmodifier", 1F));
|
||||
if (root.keyExists("avoidwater"))
|
||||
defaultParams.avoidWater(root.getBoolean("avoidwater"));
|
||||
if (!root.getBoolean("usedefaultstuckaction")
|
||||
&& defaultParams.stuckAction() == TeleportStuckAction.INSTANCE)
|
||||
if (!root.getBoolean("usedefaultstuckaction") && defaultParams.stuckAction() == TeleportStuckAction.INSTANCE)
|
||||
defaultParams.stuckAction(null);
|
||||
}
|
||||
|
||||
|
@ -48,6 +48,7 @@ public class MCTargetStrategy implements PathStrategy, EntityTarget {
|
||||
return handle.getBukkitEntity().getLocation(HANDLE_LOCATION)
|
||||
.distanceSquared(target.getBukkitEntity().getLocation(TARGET_LOCATION));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CancelReason getCancelReason() {
|
||||
return cancelReason;
|
||||
|
@ -17,101 +17,120 @@ import net.citizensnpcs.util.Messaging;
|
||||
|
||||
public class Chat implements VocalChord {
|
||||
|
||||
public final String VOCAL_CHORD_NAME = "chat";
|
||||
public final String VOCAL_CHORD_NAME = "chat";
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return VOCAL_CHORD_NAME;
|
||||
}
|
||||
@Override
|
||||
public String getName() {
|
||||
return VOCAL_CHORD_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void talk(SpeechContext context) {
|
||||
|
||||
// Check valid talker
|
||||
if (context.getTalker() == null) return;
|
||||
NPC npc = CitizensAPI.getNPCRegistry().getNPC(context.getTalker().getEntity());
|
||||
if (npc == null) return;
|
||||
|
||||
// If no recipients, chat to the world with CHAT_FORMAT and CHAT_RANGE settings
|
||||
if (!context.hasRecipients()) {
|
||||
String text = Setting.CHAT_FORMAT.asString().replace("<npc>", npc.getName()).replace("<text>", context.getMessage());
|
||||
talkToBystanders(npc, text, context);
|
||||
return;
|
||||
}
|
||||
@Override
|
||||
public void talk(SpeechContext context) {
|
||||
|
||||
// Assumed recipients at this point
|
||||
else if (context.size() <= 1) { // One recipient
|
||||
String text = Setting.CHAT_FORMAT_TO_TARGET.asString().replace("<npc>", npc.getName()).replace("<text>", context.getMessage());
|
||||
String targetName = "";
|
||||
// For each recipient
|
||||
for (Talkable entity : context) {
|
||||
entity.talkTo(context, text, this);
|
||||
targetName = entity.getName();
|
||||
}
|
||||
// Check if bystanders hear targeted chat
|
||||
if (!Setting.CHAT_BYSTANDERS_HEAR_TARGETED_CHAT.asBoolean()) return;
|
||||
// Format message with config setting and send to bystanders
|
||||
String bystanderText = Setting.CHAT_FORMAT_TO_BYSTANDERS.asString().replace("<npc>", npc.getName()).replace("<target>", targetName).replace("<text>", context.getMessage());
|
||||
talkToBystanders(npc, bystanderText, context);
|
||||
return;
|
||||
}
|
||||
// Check valid talker
|
||||
if (context.getTalker() == null)
|
||||
return;
|
||||
NPC npc = CitizensAPI.getNPCRegistry().getNPC(context.getTalker().getEntity());
|
||||
if (npc == null)
|
||||
return;
|
||||
|
||||
else { // Multiple recipients
|
||||
String text = Setting.CHAT_FORMAT_TO_TARGET.asString().replace("<npc>", npc.getName()).replace("<text>", context.getMessage());
|
||||
List<String> targetNames = Collections.emptyList();
|
||||
// Talk to each recipient
|
||||
for (Talkable entity : context) {
|
||||
entity.talkTo(context, text, this);
|
||||
targetNames.add(entity.getName());
|
||||
}
|
||||
// If no recipients, chat to the world with CHAT_FORMAT and CHAT_RANGE
|
||||
// settings
|
||||
if (!context.hasRecipients()) {
|
||||
String text = Setting.CHAT_FORMAT.asString().replace("<npc>", npc.getName())
|
||||
.replace("<text>", context.getMessage());
|
||||
talkToBystanders(npc, text, context);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Setting.CHAT_BYSTANDERS_HEAR_TARGETED_CHAT.asBoolean()) return;
|
||||
String targets = "";
|
||||
int max = Setting.CHAT_MAX_NUMBER_OF_TARGETS.asInt();
|
||||
String[] format = Setting.CHAT_FORMAT_WITH_TARGETS_TO_BYSTANDERS.asString().split("\\|");
|
||||
if (format.length != 4) Messaging.log(Level.WARNING, "npc.chat.format.with-target-to-bystanders invalid!");
|
||||
if (max == 1) {
|
||||
targets = format[0].replace("<npc>", targetNames.get(0)) + format[3];
|
||||
}
|
||||
else if (max == 2 || targetNames.size() == 2) {
|
||||
if (targetNames.size() == 2)
|
||||
targets = format[0].replace("<npc>", targetNames.get(0)) + format[2].replace("<npc>", targetNames.get(1));
|
||||
else
|
||||
targets = format[0].replace("<npc>", targetNames.get(0)) + format[1].replace("<npc>", targetNames.get(1)) + format[3];
|
||||
}
|
||||
else if (max >= 3) {
|
||||
targets = format[0].replace("<npc>", targetNames.get(0));
|
||||
// Assumed recipients at this point
|
||||
else if (context.size() <= 1) { // One recipient
|
||||
String text = Setting.CHAT_FORMAT_TO_TARGET.asString().replace("<npc>", npc.getName())
|
||||
.replace("<text>", context.getMessage());
|
||||
String targetName = "";
|
||||
// For each recipient
|
||||
for (Talkable entity : context) {
|
||||
entity.talkTo(context, text, this);
|
||||
targetName = entity.getName();
|
||||
}
|
||||
// Check if bystanders hear targeted chat
|
||||
if (!Setting.CHAT_BYSTANDERS_HEAR_TARGETED_CHAT.asBoolean())
|
||||
return;
|
||||
// Format message with config setting and send to bystanders
|
||||
String bystanderText = Setting.CHAT_FORMAT_TO_BYSTANDERS.asString().replace("<npc>", npc.getName())
|
||||
.replace("<target>", targetName).replace("<text>", context.getMessage());
|
||||
talkToBystanders(npc, bystanderText, context);
|
||||
return;
|
||||
}
|
||||
|
||||
int x = 1;
|
||||
for (x = 1; x < max - 1; x++) {
|
||||
if (targetNames.size() - 1 == x) break;
|
||||
targets = targets + format[1].replace("<npc>", targetNames.get(x));
|
||||
}
|
||||
if (targetNames.size() == max)
|
||||
targets = targets + format[2].replace("<npc>", targetNames.get(x));
|
||||
else targets = targets + format[3];
|
||||
}
|
||||
|
||||
String bystanderText = Setting.CHAT_FORMAT_WITH_TARGETS_TO_BYSTANDERS.asString().replace("<npc>", npc.getName()).replace("<targets>", targets).replace("<text>", context.getMessage());
|
||||
talkToBystanders(npc, bystanderText, context);
|
||||
}
|
||||
}
|
||||
else { // Multiple recipients
|
||||
String text = Setting.CHAT_FORMAT_TO_TARGET.asString().replace("<npc>", npc.getName())
|
||||
.replace("<text>", context.getMessage());
|
||||
List<String> targetNames = Collections.emptyList();
|
||||
// Talk to each recipient
|
||||
for (Talkable entity : context) {
|
||||
entity.talkTo(context, text, this);
|
||||
targetNames.add(entity.getName());
|
||||
}
|
||||
|
||||
private void talkToBystanders(NPC npc, String text, SpeechContext context) {
|
||||
// Get list of nearby entities
|
||||
List<Entity> bystanderEntities = npc.getBukkitEntity().getNearbyEntities(Setting.CHAT_RANGE.asDouble(), Setting.CHAT_RANGE.asDouble(), Setting.CHAT_RANGE.asDouble());
|
||||
for (Entity bystander : bystanderEntities)
|
||||
// Continue if a LivingEntity, which is compatible with TalkableEntity
|
||||
if (bystander instanceof LivingEntity) {
|
||||
// Exclude targeted recipients
|
||||
if (context.hasRecipients()) {
|
||||
for (Talkable target : context)
|
||||
if (target.getEntity() == bystander) continue;
|
||||
else new TalkableEntity((LivingEntity) bystander).talkNear(context, text, this);
|
||||
} else
|
||||
// Found a nearby LivingEntity, make it Talkable and talkNear it
|
||||
new TalkableEntity((LivingEntity) bystander).talkNear(context, text, this);
|
||||
}
|
||||
}
|
||||
if (!Setting.CHAT_BYSTANDERS_HEAR_TARGETED_CHAT.asBoolean())
|
||||
return;
|
||||
String targets = "";
|
||||
int max = Setting.CHAT_MAX_NUMBER_OF_TARGETS.asInt();
|
||||
String[] format = Setting.CHAT_FORMAT_WITH_TARGETS_TO_BYSTANDERS.asString().split("\\|");
|
||||
if (format.length != 4)
|
||||
Messaging.log(Level.WARNING, "npc.chat.format.with-target-to-bystanders invalid!");
|
||||
if (max == 1) {
|
||||
targets = format[0].replace("<npc>", targetNames.get(0)) + format[3];
|
||||
} else if (max == 2 || targetNames.size() == 2) {
|
||||
if (targetNames.size() == 2)
|
||||
targets = format[0].replace("<npc>", targetNames.get(0))
|
||||
+ format[2].replace("<npc>", targetNames.get(1));
|
||||
else
|
||||
targets = format[0].replace("<npc>", targetNames.get(0))
|
||||
+ format[1].replace("<npc>", targetNames.get(1)) + format[3];
|
||||
} else if (max >= 3) {
|
||||
targets = format[0].replace("<npc>", targetNames.get(0));
|
||||
|
||||
int x = 1;
|
||||
for (x = 1; x < max - 1; x++) {
|
||||
if (targetNames.size() - 1 == x)
|
||||
break;
|
||||
targets = targets + format[1].replace("<npc>", targetNames.get(x));
|
||||
}
|
||||
if (targetNames.size() == max)
|
||||
targets = targets + format[2].replace("<npc>", targetNames.get(x));
|
||||
else
|
||||
targets = targets + format[3];
|
||||
}
|
||||
|
||||
String bystanderText = Setting.CHAT_FORMAT_WITH_TARGETS_TO_BYSTANDERS.asString()
|
||||
.replace("<npc>", npc.getName()).replace("<targets>", targets)
|
||||
.replace("<text>", context.getMessage());
|
||||
talkToBystanders(npc, bystanderText, context);
|
||||
}
|
||||
}
|
||||
|
||||
private void talkToBystanders(NPC npc, String text, SpeechContext context) {
|
||||
// Get list of nearby entities
|
||||
List<Entity> bystanderEntities = npc.getBukkitEntity().getNearbyEntities(Setting.CHAT_RANGE.asDouble(),
|
||||
Setting.CHAT_RANGE.asDouble(), Setting.CHAT_RANGE.asDouble());
|
||||
for (Entity bystander : bystanderEntities)
|
||||
// Continue if a LivingEntity, which is compatible with
|
||||
// TalkableEntity
|
||||
if (bystander instanceof LivingEntity) {
|
||||
// Exclude targeted recipients
|
||||
if (context.hasRecipients()) {
|
||||
for (Talkable target : context)
|
||||
if (target.getEntity() == bystander)
|
||||
continue;
|
||||
else
|
||||
new TalkableEntity((LivingEntity) bystander).talkNear(context, text, this);
|
||||
} else
|
||||
// Found a nearby LivingEntity, make it Talkable and
|
||||
// talkNear it
|
||||
new TalkableEntity((LivingEntity) bystander).talkNear(context, text, this);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -14,66 +14,68 @@ import net.citizensnpcs.api.ai.speech.VocalChord;
|
||||
|
||||
public class CitizensSpeechFactory implements SpeechFactory {
|
||||
|
||||
Map<String, Class<? extends VocalChord>> registered = new HashMap<String, Class <? extends VocalChord>>();
|
||||
|
||||
@Override
|
||||
public VocalChord getVocalChord(Class<? extends VocalChord> clazz) {
|
||||
// Return a new instance of the VocalChord specified
|
||||
try {
|
||||
return clazz.newInstance();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
Map<String, Class<? extends VocalChord>> registered = new HashMap<String, Class<? extends VocalChord>>();
|
||||
|
||||
@Override
|
||||
public VocalChord getVocalChord(String name) {
|
||||
// Check if VocalChord name is a registered type
|
||||
if (isRegistered(name))
|
||||
// Return a new instance of the VocalChord specified
|
||||
try {
|
||||
return registered.get(name.toLowerCase()).newInstance();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public VocalChord getVocalChord(Class<? extends VocalChord> clazz) {
|
||||
// Return a new instance of the VocalChord specified
|
||||
try {
|
||||
return clazz.newInstance();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getVocalChordName(Class<? extends VocalChord> clazz) {
|
||||
// Get the name of a VocalChord class that has been registered
|
||||
for (Entry<String, Class<? extends VocalChord>> vocalChord : registered.entrySet())
|
||||
if (vocalChord.getValue() == clazz) return vocalChord.getKey();
|
||||
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public VocalChord getVocalChord(String name) {
|
||||
// Check if VocalChord name is a registered type
|
||||
if (isRegistered(name))
|
||||
// Return a new instance of the VocalChord specified
|
||||
try {
|
||||
return registered.get(name.toLowerCase()).newInstance();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRegistered(String name) {
|
||||
if (registered.containsKey(name.toLowerCase())) return true;
|
||||
else return false;
|
||||
}
|
||||
@Override
|
||||
public String getVocalChordName(Class<? extends VocalChord> clazz) {
|
||||
// Get the name of a VocalChord class that has been registered
|
||||
for (Entry<String, Class<? extends VocalChord>> vocalChord : registered.entrySet())
|
||||
if (vocalChord.getValue() == clazz)
|
||||
return vocalChord.getKey();
|
||||
|
||||
@Override
|
||||
public void register(Class<? extends VocalChord> clazz, String name) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRegistered(String name) {
|
||||
if (registered.containsKey(name.toLowerCase()))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Talkable newTalkableEntity(LivingEntity entity) {
|
||||
if (entity == null)
|
||||
return null;
|
||||
return new TalkableEntity(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(Class<? extends VocalChord> clazz, String name) {
|
||||
Preconditions.checkNotNull(name, "info cannot be null");
|
||||
Preconditions.checkNotNull(clazz, "vocalchord cannot be null");
|
||||
if (registered.containsKey(name.toLowerCase()))
|
||||
throw new IllegalArgumentException("vocalchord name already registered");
|
||||
registered.put(name.toLowerCase(), clazz);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Talkable newTalkableEntity(LivingEntity entity) {
|
||||
if (entity == null) return null;
|
||||
return new TalkableEntity(entity);
|
||||
}
|
||||
|
||||
|
||||
registered.put(name.toLowerCase(), clazz);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,77 +15,82 @@ import org.bukkit.entity.Player;
|
||||
|
||||
public class TalkableEntity implements Talkable {
|
||||
|
||||
LivingEntity entity;
|
||||
|
||||
public TalkableEntity(LivingEntity entity) {
|
||||
this.entity = entity;
|
||||
}
|
||||
|
||||
public TalkableEntity(NPC npc) {
|
||||
entity = npc.getBukkitEntity();
|
||||
}
|
||||
|
||||
public TalkableEntity(Player player) {
|
||||
entity = (LivingEntity) player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to compare a LivingEntity to this TalkableEntity
|
||||
*
|
||||
* @return
|
||||
* 0 if the Entities are the same, 1 if they are not, -1 if
|
||||
* the object compared is not a valid LivingEntity
|
||||
*/
|
||||
@Override
|
||||
public int compareTo(Object o) {
|
||||
// If not living entity, return -1
|
||||
if (!(o instanceof LivingEntity)) return -1;
|
||||
// If NPC and matches, return 0
|
||||
else if (CitizensAPI.getNPCRegistry().isNPC((LivingEntity) o)
|
||||
&& CitizensAPI.getNPCRegistry().isNPC((LivingEntity) entity)
|
||||
&& CitizensAPI.getNPCRegistry().getNPC((LivingEntity) o).getId() ==
|
||||
CitizensAPI.getNPCRegistry().getNPC((LivingEntity) entity).getId())
|
||||
return 0;
|
||||
else if ((LivingEntity) o == entity) return 0;
|
||||
// Not a match, return 1
|
||||
else return 1;
|
||||
}
|
||||
LivingEntity entity;
|
||||
|
||||
@Override
|
||||
public LivingEntity getEntity() {
|
||||
return entity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
if (CitizensAPI.getNPCRegistry().isNPC(entity))
|
||||
return CitizensAPI.getNPCRegistry().getNPC(entity).getName();
|
||||
else if (entity instanceof Player)
|
||||
return ((Player) entity).getName();
|
||||
else
|
||||
return entity.getType().name().replace("_", " ");
|
||||
}
|
||||
|
||||
private void talk(String message) {
|
||||
if (entity instanceof Player
|
||||
&& !CitizensAPI.getNPCRegistry().isNPC(entity))
|
||||
Messaging.send((Player) entity, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void talkNear(SpeechContext context, String text, VocalChord vocalChord) {
|
||||
SpeechBystanderEvent event = new SpeechBystanderEvent(this, context, text, vocalChord);
|
||||
Bukkit.getServer().getPluginManager().callEvent(event);
|
||||
if (event.isCancelled()) return;
|
||||
else talk(event.getMessage());
|
||||
}
|
||||
public TalkableEntity(LivingEntity entity) {
|
||||
this.entity = entity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void talkTo(SpeechContext context, String text, VocalChord vocalChord) {
|
||||
SpeechTargetedEvent event = new SpeechTargetedEvent(this, context, text, vocalChord);
|
||||
Bukkit.getServer().getPluginManager().callEvent(event);
|
||||
if (event.isCancelled()) return;
|
||||
else talk(event.getMessage());
|
||||
}
|
||||
public TalkableEntity(NPC npc) {
|
||||
entity = npc.getBukkitEntity();
|
||||
}
|
||||
|
||||
public TalkableEntity(Player player) {
|
||||
entity = (LivingEntity) player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to compare a LivingEntity to this TalkableEntity
|
||||
*
|
||||
* @return 0 if the Entities are the same, 1 if they are not, -1 if the
|
||||
* object compared is not a valid LivingEntity
|
||||
*/
|
||||
@Override
|
||||
public int compareTo(Object o) {
|
||||
// If not living entity, return -1
|
||||
if (!(o instanceof LivingEntity))
|
||||
return -1;
|
||||
// If NPC and matches, return 0
|
||||
else if (CitizensAPI.getNPCRegistry().isNPC((LivingEntity) o)
|
||||
&& CitizensAPI.getNPCRegistry().isNPC((LivingEntity) entity)
|
||||
&& CitizensAPI.getNPCRegistry().getNPC((LivingEntity) o).getId() == CitizensAPI.getNPCRegistry()
|
||||
.getNPC((LivingEntity) entity).getId())
|
||||
return 0;
|
||||
else if ((LivingEntity) o == entity)
|
||||
return 0;
|
||||
// Not a match, return 1
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LivingEntity getEntity() {
|
||||
return entity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
if (CitizensAPI.getNPCRegistry().isNPC(entity))
|
||||
return CitizensAPI.getNPCRegistry().getNPC(entity).getName();
|
||||
else if (entity instanceof Player)
|
||||
return ((Player) entity).getName();
|
||||
else
|
||||
return entity.getType().name().replace("_", " ");
|
||||
}
|
||||
|
||||
private void talk(String message) {
|
||||
if (entity instanceof Player && !CitizensAPI.getNPCRegistry().isNPC(entity))
|
||||
Messaging.send((Player) entity, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void talkNear(SpeechContext context, String text, VocalChord vocalChord) {
|
||||
SpeechBystanderEvent event = new SpeechBystanderEvent(this, context, text, vocalChord);
|
||||
Bukkit.getServer().getPluginManager().callEvent(event);
|
||||
if (event.isCancelled())
|
||||
return;
|
||||
else
|
||||
talk(event.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void talkTo(SpeechContext context, String text, VocalChord vocalChord) {
|
||||
SpeechTargetedEvent event = new SpeechTargetedEvent(this, context, text, vocalChord);
|
||||
Bukkit.getServer().getPluginManager().callEvent(event);
|
||||
if (event.isCancelled())
|
||||
return;
|
||||
else
|
||||
talk(event.getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -189,8 +189,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder {
|
||||
net.minecraft.server.v1_4_6.ItemStack previous = previousEquipment[i];
|
||||
net.minecraft.server.v1_4_6.ItemStack current = getEquipment(i);
|
||||
if (previous != current) {
|
||||
NMS.sendPacketNearby(getBukkitEntity().getLocation(), new Packet5EntityEquipment(id, i,
|
||||
current));
|
||||
NMS.sendPacketNearby(getBukkitEntity().getLocation(), new Packet5EntityEquipment(id, i, current));
|
||||
previousEquipment[i] = current;
|
||||
}
|
||||
}
|
||||
|
@ -19,8 +19,8 @@ public class HumanController extends AbstractEntityController {
|
||||
@Override
|
||||
protected LivingEntity createEntity(final Location at, final NPC npc) {
|
||||
WorldServer ws = ((CraftWorld) at.getWorld()).getHandle();
|
||||
final EntityHumanNPC handle = new EntityHumanNPC(ws.getServer().getServer(), ws,
|
||||
StringHelper.parseColors(npc.getFullName()), new PlayerInteractManager(ws), npc);
|
||||
final EntityHumanNPC handle = new EntityHumanNPC(ws.getServer().getServer(), ws, StringHelper.parseColors(npc
|
||||
.getFullName()), new PlayerInteractManager(ws), npc);
|
||||
handle.getBukkitEntity().teleport(at);
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), new Runnable() {
|
||||
@Override
|
||||
|
@ -18,8 +18,7 @@ import net.minecraft.server.v1_4_6.Packet3Chat;
|
||||
import net.minecraft.server.v1_4_6.Packet51MapChunk;
|
||||
|
||||
public class EmptyNetHandler extends PlayerConnection {
|
||||
public EmptyNetHandler(MinecraftServer minecraftServer, NetworkManager networkManager,
|
||||
EntityPlayer entityPlayer) {
|
||||
public EmptyNetHandler(MinecraftServer minecraftServer, NetworkManager networkManager, EntityPlayer entityPlayer) {
|
||||
super(minecraftServer, networkManager, entityPlayer);
|
||||
}
|
||||
|
||||
|
@ -11,8 +11,7 @@ import net.minecraft.server.v1_4_6.Packet;
|
||||
|
||||
public class EmptyNetworkManager extends NetworkManager {
|
||||
|
||||
public EmptyNetworkManager(Socket socket, String string, Connection conn, PrivateKey key)
|
||||
throws IOException {
|
||||
public EmptyNetworkManager(Socket socket, String string, Connection conn, PrivateKey key) throws IOException {
|
||||
super(socket, string, conn, key);
|
||||
|
||||
NMS.stopNetworkThreads(this);
|
||||
|
@ -202,16 +202,6 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab
|
||||
}
|
||||
}
|
||||
|
||||
public static interface MovementController {
|
||||
void leftClick(PlayerInteractEvent event);
|
||||
|
||||
void rightClick(PlayerInteractEvent event);
|
||||
|
||||
void rightClickEntity(NPCRightClickEvent event);
|
||||
|
||||
void run(Player rider);
|
||||
}
|
||||
|
||||
public class GroundController implements MovementController {
|
||||
private void jump() {
|
||||
boolean allowed = getHandle().onGround;
|
||||
@ -249,6 +239,16 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab
|
||||
private static final float JUMP_VELOCITY = 0.6F;
|
||||
}
|
||||
|
||||
public static interface MovementController {
|
||||
void leftClick(PlayerInteractEvent event);
|
||||
|
||||
void rightClick(PlayerInteractEvent event);
|
||||
|
||||
void rightClickEntity(NPCRightClickEvent event);
|
||||
|
||||
void run(Player rider);
|
||||
}
|
||||
|
||||
private static final Map<EntityType, Class<? extends MovementController>> controllerTypes = Maps
|
||||
.newEnumMap(EntityType.class);
|
||||
|
||||
|
@ -53,8 +53,7 @@ public class Poses extends Trait {
|
||||
paginator.addLine("<e>Key: <a>ID <b>Name <c>Pitch/Yaw");
|
||||
int i = 0;
|
||||
for (Pose pose : poses.values()) {
|
||||
String line = "<a>" + i + "<b> " + pose.getName() + "<c> " + pose.getPitch() + "/"
|
||||
+ pose.getYaw();
|
||||
String line = "<a>" + i + "<b> " + pose.getName() + "<c> " + pose.getPitch() + "/" + pose.getYaw();
|
||||
paginator.addLine(line);
|
||||
i++;
|
||||
}
|
||||
|
@ -11,13 +11,11 @@ import java.util.concurrent.TimeUnit;
|
||||
import net.citizensnpcs.Settings.Setting;
|
||||
import net.citizensnpcs.api.CitizensAPI;
|
||||
import net.citizensnpcs.api.ai.speech.SpeechContext;
|
||||
import net.citizensnpcs.api.ai.speech.Talkable;
|
||||
import net.citizensnpcs.api.event.NPCRightClickEvent;
|
||||
import net.citizensnpcs.api.exception.NPCLoadException;
|
||||
import net.citizensnpcs.api.trait.Trait;
|
||||
import net.citizensnpcs.api.util.DataKey;
|
||||
import net.citizensnpcs.editor.Editor;
|
||||
import net.citizensnpcs.npc.ai.speech.TalkableEntity;
|
||||
import net.citizensnpcs.trait.Toggleable;
|
||||
import net.citizensnpcs.util.Messages;
|
||||
import net.citizensnpcs.util.Messaging;
|
||||
@ -65,10 +63,9 @@ public class Text extends Trait implements Runnable, Toggleable, Listener, Conve
|
||||
}
|
||||
|
||||
public Editor getEditor(final Player player) {
|
||||
final Conversation conversation = new ConversationFactory(plugin)
|
||||
.addConversationAbandonedListener(this).withLocalEcho(false).withEscapeSequence("/npc text")
|
||||
.withEscapeSequence("exit").withModality(false).withFirstPrompt(new TextStartPrompt(this))
|
||||
.buildConversation(player);
|
||||
final Conversation conversation = new ConversationFactory(plugin).addConversationAbandonedListener(this)
|
||||
.withLocalEcho(false).withEscapeSequence("/npc text").withEscapeSequence("exit").withModality(false)
|
||||
.withFirstPrompt(new TextStartPrompt(this)).buildConversation(player);
|
||||
return new Editor() {
|
||||
|
||||
@Override
|
||||
@ -111,8 +108,7 @@ public class Text extends Trait implements Runnable, Toggleable, Listener, Conve
|
||||
public void onRightClick(NPCRightClickEvent event) {
|
||||
if (!event.getNPC().equals(npc))
|
||||
return;
|
||||
String localPattern = itemInHandPattern.equals("default") ? Setting.TALK_ITEM.asString()
|
||||
: itemInHandPattern;
|
||||
String localPattern = itemInHandPattern.equals("default") ? Setting.TALK_ITEM.asString() : itemInHandPattern;
|
||||
if (Util.matchesItemInHand(event.getClicker(), localPattern) && !shouldTalkClose())
|
||||
sendText(event.getClicker());
|
||||
}
|
||||
@ -192,9 +188,10 @@ public class Text extends Trait implements Runnable, Toggleable, Listener, Conve
|
||||
currentIndex = 0;
|
||||
index = currentIndex++;
|
||||
}
|
||||
|
||||
|
||||
npc.getDefaultSpeechController().speak(new SpeechContext(text.get(index), player));
|
||||
// Messaging.sendWithNPC(player, Setting.CHAT_PREFIX.asString() + text.get(index), npc);
|
||||
// Messaging.sendWithNPC(player, Setting.CHAT_PREFIX.asString() +
|
||||
// text.get(index), npc);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -20,8 +20,7 @@ public class TextEditPrompt extends StringPrompt {
|
||||
public Prompt acceptInput(ConversationContext context, String input) {
|
||||
int index = (Integer) context.getSessionData("index");
|
||||
text.edit(index, input);
|
||||
Messaging
|
||||
.sendTr((CommandSender) context.getForWhom(), Messages.TEXT_EDITOR_EDITED_TEXT, index, input);
|
||||
Messaging.sendTr((CommandSender) context.getForWhom(), Messages.TEXT_EDITOR_EDITED_TEXT, index, input);
|
||||
return new TextStartPrompt(text);
|
||||
}
|
||||
|
||||
|
@ -30,8 +30,7 @@ public class TextStartPrompt extends StringPrompt {
|
||||
else if (input.equalsIgnoreCase("random"))
|
||||
Messaging.sendTr(sender, Messages.TEXT_EDITOR_RANDOM_TALKER_SET, text.toggleRandomTalker());
|
||||
else if (input.equalsIgnoreCase("realistic looking"))
|
||||
Messaging.sendTr(sender, Messages.TEXT_EDITOR_REALISTIC_LOOKING_SET,
|
||||
text.toggleRealisticLooking());
|
||||
Messaging.sendTr(sender, Messages.TEXT_EDITOR_REALISTIC_LOOKING_SET, text.toggleRealisticLooking());
|
||||
else if (input.equalsIgnoreCase("close") || input.equalsIgnoreCase("talk-close"))
|
||||
Messaging.sendTr(sender, Messages.TEXT_EDITOR_CLOSE_TALKER_SET, text.toggle());
|
||||
else if (input.equalsIgnoreCase("range")) {
|
||||
|
@ -267,8 +267,8 @@ public class LinearWaypointProvider implements WaypointProvider {
|
||||
if (!event.getRightClicked().hasMetadata("waypointindex"))
|
||||
return;
|
||||
editingSlot = event.getRightClicked().getMetadata("waypointindex").get(0).asInt();
|
||||
Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_EDIT_SLOT_SET, editingSlot,
|
||||
formatLoc(waypoints.get(editingSlot).getLocation()));
|
||||
Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_EDIT_SLOT_SET, editingSlot, formatLoc(waypoints
|
||||
.get(editingSlot).getLocation()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@ -288,8 +288,8 @@ public class LinearWaypointProvider implements WaypointProvider {
|
||||
editingSlot += diff > 0 ? 1 : -1;
|
||||
}
|
||||
normaliseEditingSlot();
|
||||
Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_EDIT_SLOT_SET, editingSlot,
|
||||
formatLoc(waypoints.get(editingSlot).getLocation()));
|
||||
Messaging.sendTr(player, Messages.LINEAR_WAYPOINT_EDITOR_EDIT_SLOT_SET, editingSlot, formatLoc(waypoints
|
||||
.get(editingSlot).getLocation()));
|
||||
}
|
||||
|
||||
private void onWaypointsModified() {
|
||||
@ -339,8 +339,8 @@ public class LinearWaypointProvider implements WaypointProvider {
|
||||
}
|
||||
|
||||
private Iterator<Waypoint> getNewIterator() {
|
||||
LinearWaypointsCompleteEvent event = new LinearWaypointsCompleteEvent(
|
||||
LinearWaypointProvider.this, waypoints.iterator());
|
||||
LinearWaypointsCompleteEvent event = new LinearWaypointsCompleteEvent(LinearWaypointProvider.this,
|
||||
waypoints.iterator());
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
Iterator<Waypoint> next = event.getNextWaypoints();
|
||||
return next;
|
||||
|
@ -23,8 +23,7 @@ public class AnimationTriggerPrompt extends StringPrompt implements WaypointTrig
|
||||
if (input.equalsIgnoreCase("back"))
|
||||
return (Prompt) context.getSessionData("previous");
|
||||
if (input.equalsIgnoreCase("finish")) {
|
||||
context.setSessionData(WaypointTriggerPrompt.CREATED_TRIGGER_KEY,
|
||||
new AnimationTrigger(animations));
|
||||
context.setSessionData(WaypointTriggerPrompt.CREATED_TRIGGER_KEY, new AnimationTrigger(animations));
|
||||
return (Prompt) context.getSessionData(WaypointTriggerPrompt.RETURN_PROMPT_KEY);
|
||||
}
|
||||
PlayerAnimation animation = Util.matchEnum(PlayerAnimation.values(), input);
|
||||
@ -36,8 +35,7 @@ public class AnimationTriggerPrompt extends StringPrompt implements WaypointTrig
|
||||
|
||||
@Override
|
||||
public String getPromptText(ConversationContext context) {
|
||||
Messaging.sendTr((CommandSender) context.getForWhom(), Messages.ANIMATION_TRIGGER_PROMPT,
|
||||
getValidAnimations());
|
||||
Messaging.sendTr((CommandSender) context.getForWhom(), Messages.ANIMATION_TRIGGER_PROMPT, getValidAnimations());
|
||||
return "";
|
||||
}
|
||||
|
||||
|
@ -27,8 +27,7 @@ public class ChatTriggerPrompt extends StringPrompt implements WaypointTriggerPr
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(),
|
||||
Messages.WAYPOINT_TRIGGER_CHAT_INVALID_RADIUS);
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(),
|
||||
Messages.WAYPOINT_TRIGGER_CHAT_NO_RADIUS);
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_CHAT_NO_RADIUS);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
@ -18,8 +18,8 @@ public class TeleportTrigger implements WaypointTrigger {
|
||||
|
||||
@Override
|
||||
public String description() {
|
||||
return String.format("Teleport to [%s, %d, %d, %d]", location.getWorld().getName(),
|
||||
location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||
return String.format("Teleport to [%s, %d, %d, %d]", location.getWorld().getName(), location.getBlockX(),
|
||||
location.getBlockY(), location.getBlockZ());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -29,8 +29,7 @@ public class TeleportTriggerPrompt extends RegexPrompt implements WaypointTrigge
|
||||
return (Prompt) context.getSessionData("previous");
|
||||
if (input.equalsIgnoreCase("here")) {
|
||||
Player player = (Player) context.getForWhom();
|
||||
context.setSessionData(WaypointTriggerPrompt.CREATED_TRIGGER_KEY,
|
||||
new TeleportTrigger(player.getLocation()));
|
||||
context.setSessionData(WaypointTriggerPrompt.CREATED_TRIGGER_KEY, new TeleportTrigger(player.getLocation()));
|
||||
return (Prompt) context.getSessionData(WaypointTriggerPrompt.RETURN_PROMPT_KEY);
|
||||
}
|
||||
String[] parts = Iterables.toArray(Splitter.on(':').split(input), String.class);
|
||||
|
@ -35,23 +35,20 @@ public class TriggerAddPrompt extends StringPrompt {
|
||||
|
||||
@Override
|
||||
public String getPromptText(ConversationContext context) {
|
||||
WaypointTrigger returned = (WaypointTrigger) context
|
||||
.getSessionData(WaypointTriggerPrompt.CREATED_TRIGGER_KEY);
|
||||
WaypointTrigger returned = (WaypointTrigger) context.getSessionData(WaypointTriggerPrompt.CREATED_TRIGGER_KEY);
|
||||
if (returned != null) {
|
||||
if (editor.getCurrentWaypoint() != null) {
|
||||
editor.getCurrentWaypoint().addTrigger(returned);
|
||||
context.setSessionData(WaypointTriggerPrompt.CREATED_TRIGGER_KEY, null);
|
||||
Messaging.sendTr((CommandSender) context.getForWhom(),
|
||||
Messages.WAYPOINT_TRIGGER_ADDED_SUCCESSFULLY, returned.description());
|
||||
Messaging.sendTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_ADDED_SUCCESSFULLY,
|
||||
returned.description());
|
||||
} else
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(),
|
||||
Messages.WAYPOINT_TRIGGER_EDITOR_INACTIVE);
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_EDITOR_INACTIVE);
|
||||
}
|
||||
if (context.getSessionData("said") == Boolean.TRUE)
|
||||
return "";
|
||||
context.setSessionData("said", true);
|
||||
context.setSessionData(WaypointTriggerPrompt.RETURN_PROMPT_KEY, this);
|
||||
return Messaging.tr(Messages.WAYPOINT_TRIGGER_ADD_PROMPT,
|
||||
WaypointTriggerRegistry.describeValidTriggerNames());
|
||||
return Messaging.tr(Messages.WAYPOINT_TRIGGER_ADD_PROMPT, WaypointTriggerRegistry.describeValidTriggerNames());
|
||||
}
|
||||
}
|
||||
|
@ -53,9 +53,9 @@ public class TriggerEditPrompt extends StringPrompt {
|
||||
}
|
||||
|
||||
public static Conversation start(Player player, WaypointEditor editor) {
|
||||
final Conversation conversation = new ConversationFactory(CitizensAPI.getPlugin())
|
||||
.withLocalEcho(false).withEscapeSequence("exit").withEscapeSequence("/npc path")
|
||||
.withModality(false).withFirstPrompt(new TriggerEditPrompt(editor)).buildConversation(player);
|
||||
final Conversation conversation = new ConversationFactory(CitizensAPI.getPlugin()).withLocalEcho(false)
|
||||
.withEscapeSequence("exit").withEscapeSequence("/npc path").withModality(false)
|
||||
.withFirstPrompt(new TriggerEditPrompt(editor)).buildConversation(player);
|
||||
conversation.begin();
|
||||
return conversation;
|
||||
}
|
||||
|
@ -25,16 +25,15 @@ public class TriggerRemovePrompt extends StringPrompt {
|
||||
return (Prompt) context.getSessionData("previous");
|
||||
}
|
||||
if (editor.getCurrentWaypoint() == null) {
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(),
|
||||
Messages.WAYPOINT_TRIGGER_EDITOR_INACTIVE);
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_EDITOR_INACTIVE);
|
||||
return this;
|
||||
}
|
||||
int index = 0;
|
||||
try {
|
||||
index = Math.max(0, Integer.parseInt(input) - 1);
|
||||
} catch (NumberFormatException e) {
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(),
|
||||
Messages.WAYPOINT_TRIGGER_REMOVE_INVALID_NUMBER);
|
||||
Messaging
|
||||
.sendErrorTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_REMOVE_INVALID_NUMBER);
|
||||
return this;
|
||||
}
|
||||
List<WaypointTrigger> triggers = editor.getCurrentWaypoint().getTriggers();
|
||||
@ -43,8 +42,7 @@ public class TriggerRemovePrompt extends StringPrompt {
|
||||
Messages.WAYPOINT_TRIGGER_REMOVE_INDEX_OUT_OF_RANGE, triggers.size());
|
||||
} else {
|
||||
triggers.remove(index);
|
||||
Messaging.sendTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_REMOVE_REMOVED,
|
||||
index + 1);
|
||||
Messaging.sendTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_REMOVE_REMOVED, index + 1);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
@ -52,8 +50,7 @@ public class TriggerRemovePrompt extends StringPrompt {
|
||||
@Override
|
||||
public String getPromptText(ConversationContext context) {
|
||||
if (editor.getCurrentWaypoint() == null) {
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(),
|
||||
Messages.WAYPOINT_TRIGGER_EDITOR_INACTIVE);
|
||||
Messaging.sendErrorTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_EDITOR_INACTIVE);
|
||||
return "";
|
||||
}
|
||||
if (context.getSessionData("said") == Boolean.TRUE)
|
||||
@ -64,8 +61,7 @@ public class TriggerRemovePrompt extends StringPrompt {
|
||||
for (WaypointTrigger trigger : editor.getCurrentWaypoint().getTriggers()) {
|
||||
root += String.format("<br> %d. " + trigger.description(), i++);
|
||||
}
|
||||
Messaging
|
||||
.sendTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_REMOVE_PROMPT + root);
|
||||
Messaging.sendTr((CommandSender) context.getForWhom(), Messages.WAYPOINT_TRIGGER_REMOVE_PROMPT + root);
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
@ -44,14 +44,14 @@ public class Anchor {
|
||||
}
|
||||
|
||||
public String stringValue() {
|
||||
return name + ";" + location.getWorld().getName() + ";" + location.getX() + ";" + location.getY()
|
||||
+ ";" + location.getZ();
|
||||
return name + ";" + location.getWorld().getName() + ";" + location.getX() + ";" + location.getY() + ";"
|
||||
+ location.getZ();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Name: " + name + " World: " + location.getWorld().getName() + " Location: "
|
||||
+ location.getBlockX() + "," + location.getBlockY() + "," + location.getBlockZ();
|
||||
return "Name: " + name + " World: " + location.getWorld().getName() + " Location: " + location.getBlockX()
|
||||
+ "," + location.getBlockY() + "," + location.getBlockZ();
|
||||
}
|
||||
|
||||
}
|
@ -50,38 +50,12 @@ public class NMS {
|
||||
// util class
|
||||
}
|
||||
|
||||
public static void sendToOnline(Packet... packets) {
|
||||
Validate.notNull(packets, "packets cannot be null");
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if (player == null || !player.isOnline())
|
||||
continue;
|
||||
for (Packet packet : packets) {
|
||||
sendPacket(player, packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void sendPacketNearby(Location location, Packet packet, double radius) {
|
||||
radius *= radius;
|
||||
final org.bukkit.World world = location.getWorld();
|
||||
for (Player ply : Bukkit.getServer().getOnlinePlayers()) {
|
||||
if (ply == null || world != ply.getWorld()) {
|
||||
continue;
|
||||
}
|
||||
if (location.distanceSquared(ply.getLocation()) > radius) {
|
||||
continue;
|
||||
}
|
||||
sendPacket(ply, packet);
|
||||
}
|
||||
}
|
||||
|
||||
public static void sendPacketNearby(Location location, Packet packet) {
|
||||
NMS.sendPacketNearby(location, packet, 64);
|
||||
}
|
||||
|
||||
private static final float DEFAULT_SPEED = 0.4F;
|
||||
|
||||
private static Map<Class<?>, Integer> ENTITY_CLASS_TO_INT;
|
||||
|
||||
private static final Map<Class<?>, Constructor<?>> ENTITY_CONSTRUCTOR_CACHE = new WeakHashMap<Class<?>, Constructor<?>>();
|
||||
|
||||
private static Map<Integer, Class<?>> ENTITY_INT_TO_CLASS;
|
||||
private static Field GOAL_FIELD;
|
||||
private static Field LAND_SPEED_MODIFIER_FIELD;
|
||||
@ -92,9 +66,7 @@ public class NMS {
|
||||
private static Set<Integer> SLAB_MATERIALS = Sets.newHashSet();
|
||||
private static Field SPEED_FIELD;
|
||||
private static Set<Integer> STAIR_MATERIALS = Sets.newHashSet();
|
||||
|
||||
private static Field THREAD_STOPPER;
|
||||
|
||||
public static void addOrRemoveFromPlayerList(LivingEntity bukkitEntity, boolean remove) {
|
||||
if (bukkitEntity == null)
|
||||
return;
|
||||
@ -107,7 +79,6 @@ public class NMS {
|
||||
handle.world.players.add(handle);
|
||||
}
|
||||
}
|
||||
|
||||
public static void attack(EntityLiving handle, EntityLiving target) {
|
||||
int damage = handle instanceof EntityMonster ? ((EntityMonster) handle).c((Entity) target) : 2;
|
||||
|
||||
@ -157,8 +128,8 @@ public class NMS {
|
||||
}
|
||||
}
|
||||
|
||||
private static Constructor<?> getCustomEntityConstructor(Class<?> clazz, EntityType type)
|
||||
throws SecurityException, NoSuchMethodException {
|
||||
private static Constructor<?> getCustomEntityConstructor(Class<?> clazz, EntityType type) throws SecurityException,
|
||||
NoSuchMethodException {
|
||||
Constructor<?> constructor = ENTITY_CONSTRUCTOR_CACHE.get(clazz);
|
||||
if (constructor == null) {
|
||||
constructor = clazz.getConstructor(World.class);
|
||||
@ -241,6 +212,35 @@ public class NMS {
|
||||
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
|
||||
}
|
||||
|
||||
public static void sendPacketNearby(Location location, Packet packet) {
|
||||
NMS.sendPacketNearby(location, packet, 64);
|
||||
}
|
||||
|
||||
public static void sendPacketNearby(Location location, Packet packet, double radius) {
|
||||
radius *= radius;
|
||||
final org.bukkit.World world = location.getWorld();
|
||||
for (Player ply : Bukkit.getServer().getOnlinePlayers()) {
|
||||
if (ply == null || world != ply.getWorld()) {
|
||||
continue;
|
||||
}
|
||||
if (location.distanceSquared(ply.getLocation()) > radius) {
|
||||
continue;
|
||||
}
|
||||
sendPacket(ply, packet);
|
||||
}
|
||||
}
|
||||
|
||||
public static void sendToOnline(Packet... packets) {
|
||||
Validate.notNull(packets, "packets cannot be null");
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if (player == null || !player.isOnline())
|
||||
continue;
|
||||
for (Packet packet : packets) {
|
||||
sendPacket(player, packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void setDestination(LivingEntity bukkitEntity, double x, double y, double z, float speed) {
|
||||
((CraftLivingEntity) bukkitEntity).getHandle().getControllerMove().a(x, y, z, speed);
|
||||
}
|
||||
|
@ -20,8 +20,7 @@ public class Paginator {
|
||||
}
|
||||
|
||||
public boolean sendPage(CommandSender sender, int page) {
|
||||
int pages = (int) ((lines.size() / LINES_PER_PAGE == 0) ? 1 : Math.ceil((double) lines.size()
|
||||
/ LINES_PER_PAGE));
|
||||
int pages = (int) ((lines.size() / LINES_PER_PAGE == 0) ? 1 : Math.ceil((double) lines.size() / LINES_PER_PAGE));
|
||||
if (page < 0 || page > pages)
|
||||
return false;
|
||||
|
||||
|
@ -33,8 +33,8 @@ public enum PlayerAnimation {
|
||||
SLEEP {
|
||||
@Override
|
||||
protected void playAnimation(EntityPlayer player, int radius) {
|
||||
Packet17EntityLocationAction packet = new Packet17EntityLocationAction(player, 0,
|
||||
(int) player.locX, (int) player.locY, (int) player.locZ);
|
||||
Packet17EntityLocationAction packet = new Packet17EntityLocationAction(player, 0, (int) player.locX,
|
||||
(int) player.locY, (int) player.locZ);
|
||||
sendPacketNearby(packet, player, radius);
|
||||
}
|
||||
},
|
||||
@ -42,8 +42,7 @@ public enum PlayerAnimation {
|
||||
@Override
|
||||
protected void playAnimation(EntityPlayer player, int radius) {
|
||||
player.getBukkitEntity().setSneaking(true);
|
||||
sendPacketNearby(new Packet40EntityMetadata(player.id, player.getDataWatcher(), true), player,
|
||||
radius);
|
||||
sendPacketNearby(new Packet40EntityMetadata(player.id, player.getDataWatcher(), true), player, radius);
|
||||
}
|
||||
},
|
||||
STOP_SITTING {
|
||||
@ -63,8 +62,7 @@ public enum PlayerAnimation {
|
||||
@Override
|
||||
protected void playAnimation(EntityPlayer player, int radius) {
|
||||
player.getBukkitEntity().setSneaking(false);
|
||||
sendPacketNearby(new Packet40EntityMetadata(player.id, player.getDataWatcher(), true), player,
|
||||
radius);
|
||||
sendPacketNearby(new Packet40EntityMetadata(player.id, player.getDataWatcher(), true), player, radius);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -93,7 +93,6 @@ public class StringHelper {
|
||||
String colors = "";
|
||||
for (ChatColor color : ChatColor.values())
|
||||
colors += color.getChar();
|
||||
COLOR_MATCHER = Pattern.compile("\\<([COLORS])\\>".replace("COLORS", colors),
|
||||
Pattern.CASE_INSENSITIVE);
|
||||
COLOR_MATCHER = Pattern.compile("\\<([COLORS])\\>".replace("COLORS", colors), Pattern.CASE_INSENSITIVE);
|
||||
}
|
||||
}
|
@ -37,8 +37,8 @@ public class Translator {
|
||||
this.resourceFile = resourceFile;
|
||||
this.defaultLocale = locale;
|
||||
try {
|
||||
preferredBundle = ResourceBundle.getBundle(PREFIX, defaultLocale, new FileClassLoader(
|
||||
Translator.class.getClassLoader(), resourceFile));
|
||||
preferredBundle = ResourceBundle.getBundle(PREFIX, defaultLocale,
|
||||
new FileClassLoader(Translator.class.getClassLoader(), resourceFile));
|
||||
} catch (MissingResourceException e) {
|
||||
preferredBundle = getDefaultBundle();
|
||||
Messaging.log(translate(Messages.MISSING_TRANSLATIONS, locale));
|
||||
@ -53,8 +53,8 @@ public class Translator {
|
||||
|
||||
private ResourceBundle getBundle(Locale locale) {
|
||||
try {
|
||||
ResourceBundle bundle = ResourceBundle.getBundle(PREFIX, locale, new FileClassLoader(
|
||||
Translator.class.getClassLoader(), resourceFile));
|
||||
ResourceBundle bundle = ResourceBundle.getBundle(PREFIX, locale,
|
||||
new FileClassLoader(Translator.class.getClassLoader(), resourceFile));
|
||||
return bundle == null ? preferredBundle : bundle;
|
||||
} catch (MissingResourceException e) {
|
||||
return preferredBundle;
|
||||
@ -275,8 +275,8 @@ public class Translator {
|
||||
public static String translate(String key, Locale preferredLocale, Object... msg) {
|
||||
if (instance == null)
|
||||
createInstance();
|
||||
return StringHelper.parseColors(msg.length == 0 ? instance.translate(key, preferredLocale) : instance
|
||||
.format(key, preferredLocale, msg));
|
||||
return StringHelper.parseColors(msg.length == 0 ? instance.translate(key, preferredLocale) : instance.format(
|
||||
key, preferredLocale, msg));
|
||||
}
|
||||
|
||||
public static String translate(String key, Object... msg) {
|
||||
|
Loading…
Reference in New Issue
Block a user