@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(cmd.getName().equalsIgnoreCase("home")) {
if (sender instanceof Player) {
Player p = (Player) sender;
double x = p.getLocation().getX();
double y = p.getLocation().getY();
double z = p.getLocation().getZ();
TextComponent message = new TextComponent("[Click ME]");
message.setColor(ChatColor.GOLD);
message.setBold(true);
message.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tp " + p.getName() + " " + (int)x + " " + (int)y + " " + (int)z));
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
new ComponentBuilder("Click HERE").color(ChatColor.GRAY).italic(true).create()));
p.teleport(p.getBedSpawnLocation());
p.spigot().sendMessage(message);
p.sendMessage("You have arrived home successfully");
}
}
return true;
}
我不知道如何在没有op的情况下进行tp
我想在使用命令时移动到床上,点击[点击我]时移动到使用命令之前的位置。
这里的问题是,通过单击消息执行的命令始终由单击的用户执行。
解决该问题的一种方法是使用 HashMap,其中 Player 有一个键和位置作为值。每次玩家执行命令时,您都会向 HashMap 添加对(玩家,位置),这样您就可以随时恢复玩家保存的位置。
然后创建一个新命令(例如 /backtohome)并创建它以从 HashMap 恢复玩家保存的位置并将其传送回来。
代码:
private Map<Player, Location> positions = new HashMap<>();
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if(cmd.getName().equalsIgnoreCase("home")) {
if (sender instanceof Player) {
Player p = (Player) sender;
double x = p.getLocation().getX();
double y = p.getLocation().getY();
double z = p.getLocation().getZ();
TextComponent message = new TextComponent("[Click ME]");
message.setColor(ChatColor.GOLD);
message.setBold(true);
message.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/backtohome");
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT,
new ComponentBuilder("Click HERE").color(ChatColor.GRAY).italic(true).create()));
p.teleport(p.getBedSpawnLocation());
// Add player position to hashmap
positions.put(p, p.getLocation());
p.spigot().sendMessage(message);
p.sendMessage("You have arrived home successfully");
}
} else if (cmd.getName().equalsIgnoreCase("backtohome")) {
if(sender instanceof Player) {
Player p = (Player) sender;
// Verify back position exist
if(!positions.containsKey(p)) return;
// Teleport back
p.teleport(positions.get(p));
// Clear previous pos
positions.remove(p);
}
}
return true;
}