2017-12-30 08:36:36 +01:00
|
|
|
package net.citizensnpcs.npc;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.UUID;
|
|
|
|
|
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
import org.bukkit.World;
|
|
|
|
import org.bukkit.block.Block;
|
|
|
|
import org.bukkit.command.BlockCommandSender;
|
|
|
|
import org.bukkit.command.CommandSender;
|
|
|
|
import org.bukkit.command.ConsoleCommandSender;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.Listener;
|
|
|
|
import org.bukkit.metadata.FixedMetadataValue;
|
|
|
|
import org.bukkit.metadata.MetadataValue;
|
|
|
|
import org.bukkit.metadata.Metadatable;
|
|
|
|
import org.bukkit.plugin.Plugin;
|
|
|
|
|
|
|
|
import com.google.common.collect.Lists;
|
|
|
|
|
2018-03-09 14:31:29 +01:00
|
|
|
import net.citizensnpcs.Settings.Setting;
|
|
|
|
import net.citizensnpcs.api.CitizensAPI;
|
2020-07-08 17:52:42 +02:00
|
|
|
import net.citizensnpcs.api.event.CitizensGetSelectedNPCEvent;
|
2018-03-09 14:31:29 +01:00
|
|
|
import net.citizensnpcs.api.event.NPCRemoveEvent;
|
|
|
|
import net.citizensnpcs.api.event.NPCRightClickEvent;
|
|
|
|
import net.citizensnpcs.api.event.NPCSelectEvent;
|
|
|
|
import net.citizensnpcs.api.npc.NPC;
|
|
|
|
import net.citizensnpcs.api.trait.trait.Owner;
|
|
|
|
import net.citizensnpcs.api.util.Messaging;
|
|
|
|
import net.citizensnpcs.editor.Editor;
|
|
|
|
import net.citizensnpcs.util.Util;
|
|
|
|
|
2017-12-30 08:36:36 +01:00
|
|
|
public class NPCSelector implements Listener, net.citizensnpcs.api.npc.NPCSelector {
|
|
|
|
private UUID consoleSelectedNPC;
|
|
|
|
private final Plugin plugin;
|
|
|
|
|
|
|
|
public NPCSelector(Plugin plugin) {
|
|
|
|
this.plugin = plugin;
|
|
|
|
Bukkit.getPluginManager().registerEvents(this, plugin);
|
2022-07-26 21:27:49 +02:00
|
|
|
|
2017-12-30 08:36:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public NPC getSelected(CommandSender sender) {
|
2020-07-08 17:52:42 +02:00
|
|
|
CitizensGetSelectedNPCEvent event = new CitizensGetSelectedNPCEvent(sender);
|
|
|
|
Bukkit.getPluginManager().callEvent(event);
|
|
|
|
if (event.getSelected() != null) {
|
|
|
|
return event.getSelected();
|
|
|
|
}
|
2017-12-30 08:36:36 +01:00
|
|
|
if (sender instanceof Player) {
|
|
|
|
return getSelectedFromMetadatable((Player) sender);
|
|
|
|
} else if (sender instanceof BlockCommandSender) {
|
|
|
|
return getSelectedFromMetadatable(((BlockCommandSender) sender).getBlock());
|
|
|
|
} else if (sender instanceof ConsoleCommandSender) {
|
|
|
|
if (consoleSelectedNPC == null)
|
|
|
|
return null;
|
|
|
|
return CitizensAPI.getNPCRegistry().getByUniqueIdGlobal(consoleSelectedNPC);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
private NPC getSelectedFromMetadatable(Metadatable sender) {
|
|
|
|
List<MetadataValue> metadata = sender.getMetadata("selected");
|
|
|
|
if (metadata.size() == 0)
|
|
|
|
return null;
|
2018-03-09 14:31:29 +01:00
|
|
|
if (metadata.get(0).value() == null) {
|
|
|
|
sender.removeMetadata("selected", plugin);
|
|
|
|
return null;
|
|
|
|
}
|
2017-12-30 08:36:36 +01:00
|
|
|
return CitizensAPI.getNPCRegistry().getByUniqueIdGlobal((UUID) metadata.get(0).value());
|
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
public void onNPCRemove(NPCRemoveEvent event) {
|
|
|
|
NPC npc = event.getNPC();
|
|
|
|
List<String> selectors = npc.data().get("selectors");
|
|
|
|
if (selectors == null)
|
|
|
|
return;
|
|
|
|
for (String value : selectors) {
|
|
|
|
if (value.equals("console")) {
|
|
|
|
consoleSelectedNPC = null;
|
|
|
|
} else if (value.startsWith("@")) {
|
|
|
|
String[] parts = value.substring(1, value.length()).split(":");
|
|
|
|
World world = Bukkit.getWorld(parts[0]);
|
|
|
|
if (world != null) {
|
|
|
|
Block block = world.getBlockAt(Integer.parseInt(parts[1]), Integer.parseInt(parts[2]),
|
|
|
|
Integer.parseInt(parts[3]));
|
|
|
|
removeMetadata(block);
|
|
|
|
}
|
|
|
|
} else {
|
2022-10-16 19:17:32 +02:00
|
|
|
removeMetadata(Bukkit.getPlayer(UUID.fromString(value)));
|
2017-12-30 08:36:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
npc.data().remove("selectors");
|
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler
|
|
|
|
public void onNPCRightClick(NPCRightClickEvent event) {
|
|
|
|
Player player = event.getClicker();
|
|
|
|
NPC npc = event.getNPC();
|
|
|
|
List<MetadataValue> selected = player.getMetadata("selected");
|
|
|
|
if (selected == null || selected.size() == 0 || selected.get(0).asInt() != npc.getId()) {
|
|
|
|
if (Util.matchesItemInHand(player, Setting.SELECTION_ITEM.asString())
|
2020-09-14 11:57:58 +02:00
|
|
|
&& npc.getOrAddTrait(Owner.class).isOwnedBy(player)) {
|
2017-12-30 08:36:36 +01:00
|
|
|
player.removeMetadata("selected", plugin);
|
|
|
|
select(player, npc);
|
|
|
|
Messaging.sendWithNPC(player, Setting.SELECTION_MESSAGE.asString(), npc);
|
2023-03-01 16:05:25 +01:00
|
|
|
event.setDelayedCancellation(true);
|
2017-12-30 08:36:36 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void removeMetadata(Metadatable metadatable) {
|
|
|
|
if (metadatable != null) {
|
|
|
|
metadatable.removeMetadata("selected", plugin);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-26 21:27:49 +02:00
|
|
|
@Override
|
2017-12-30 08:36:36 +01:00
|
|
|
public void select(CommandSender sender, NPC npc) {
|
|
|
|
// Remove existing selection if any
|
|
|
|
List<String> selectors = npc.data().get("selectors");
|
|
|
|
if (selectors == null) {
|
|
|
|
selectors = Lists.newArrayList();
|
|
|
|
npc.data().set("selectors", selectors);
|
|
|
|
}
|
|
|
|
if (sender instanceof Player) {
|
|
|
|
Player player = (Player) sender;
|
|
|
|
setMetadata(npc, player);
|
2022-10-16 19:17:32 +02:00
|
|
|
selectors.add(player.getUniqueId().toString());
|
2017-12-30 08:36:36 +01:00
|
|
|
|
|
|
|
// Remove editor if the player has one
|
|
|
|
Editor.leave(player);
|
|
|
|
} else if (sender instanceof BlockCommandSender) {
|
|
|
|
Block block = ((BlockCommandSender) sender).getBlock();
|
2022-12-27 12:20:18 +01:00
|
|
|
while (block != null) {
|
|
|
|
setMetadata(npc, block);
|
|
|
|
selectors.add(toName(block));
|
2022-12-27 12:24:42 +01:00
|
|
|
if (block.getBlockData() instanceof org.bukkit.block.data.Directional) {
|
2023-02-13 13:34:00 +01:00
|
|
|
block = block.getRelative(((org.bukkit.block.data.Directional) block.getBlockData()).getFacing());
|
2022-12-27 12:24:42 +01:00
|
|
|
if (!block.getType().name().contains("COMMAND_BLOCK")) {
|
2022-12-27 12:20:18 +01:00
|
|
|
block = null;
|
|
|
|
}
|
|
|
|
} else {
|
2022-12-27 12:24:42 +01:00
|
|
|
block = null;
|
2022-12-27 12:20:18 +01:00
|
|
|
}
|
|
|
|
}
|
2017-12-30 08:36:36 +01:00
|
|
|
} else if (sender instanceof ConsoleCommandSender) {
|
|
|
|
consoleSelectedNPC = npc.getUniqueId();
|
|
|
|
selectors.add("console");
|
|
|
|
}
|
|
|
|
|
|
|
|
Bukkit.getPluginManager().callEvent(new NPCSelectEvent(npc, sender));
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setMetadata(NPC npc, Metadatable metadatable) {
|
|
|
|
if (metadatable.hasMetadata("selected")) {
|
|
|
|
metadatable.removeMetadata("selected", plugin);
|
|
|
|
}
|
|
|
|
metadatable.setMetadata("selected", new FixedMetadataValue(plugin, npc.getUniqueId()));
|
|
|
|
}
|
|
|
|
|
|
|
|
private String toName(Block block) {
|
|
|
|
return '@' + block.getWorld().getName() + ":" + Integer.toString(block.getX()) + ":"
|
|
|
|
+ Integer.toString(block.getY()) + ":" + Integer.toString(block.getZ());
|
|
|
|
}
|
|
|
|
}
|