minecraft 插件如何在不成为操作员的情况下进行 tp

问题描述 投票:0回答:1
    @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

我想在使用命令时移动到床上,点击[点击我]时移动到使用命令之前的位置。

java plugins minecraft
1个回答
0
投票

这里的问题是,通过单击消息执行的命令始终由单击的用户执行。

解决该问题的一种方法是使用 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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.