1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Телепортация оффлайн игрока

Тема в разделе "Разработка плагинов для новичков", создана пользователем ermaksochi, 9 фев 2019.

  1. Автор темы
    ermaksochi

    ermaksochi Активный участник Пользователь

    Баллы:
    66
    Здравствуйте! Мне нужно телепортировать оффлайн игрока редактируя player.dat но как-то не получается. В этом коде используется библиотека JNBT
    Код:
    package ru.main.tpoffline;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.World;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    import org.bukkit.util.FileUtil;
    import org.jnbt.CompoundTag;
    import org.jnbt.DoubleTag;
    import org.jnbt.FloatTag;
    import org.jnbt.ListTag;
    import org.jnbt.LongTag;
    import org.jnbt.NBTInputStream;
    import org.jnbt.NBTOutputStream;
    import org.jnbt.Tag;
    
    @SuppressWarnings("deprecation")
    public class TpOfflineCommand implements CommandExecutor {
    
        private CompoundTag load(String player) {
            NBTInputStream nbt_input;
            CompoundTag tag;
            FileInputStream input_stream;
            File file;
            try {
                file = new File(Bukkit.getWorldContainer().getCanonicalPath(), "playerdata");
                file = new File(file.getAbsolutePath() + File.separator + Bukkit.getOfflinePlayer(player).getUniqueId() + ".dat");
                input_stream = new FileInputStream(file);
                nbt_input = new NBTInputStream(input_stream);
                tag = (CompoundTag) nbt_input.readTag();
                nbt_input.close();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            return tag;
        }
    
        private void save(CompoundTag tag, String player) {
            FileOutputStream output_stream;
            NBTOutputStream nbt_output;
            File temp;
            File file;
            try {
                file = new File(Bukkit.getWorldContainer().getCanonicalPath(), "playerdata");
            } catch (Exception e1) {
                e1.printStackTrace();
                return;
            }
            file = new File(file.getAbsolutePath() + File.separator + Bukkit.getOfflinePlayer(player).getUniqueId() + ".dat");
            if (!file.exists()) {
                if (file.getParent() != null) {
                    file.getParentFile().mkdirs();
                }
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                    return;
                }
            }
            try {
                temp = File.createTempFile(player, ".dat.temp");
                output_stream = new FileOutputStream(temp);
                nbt_output = new NBTOutputStream(output_stream);
                nbt_output.writeTag(tag);
                nbt_output.close();
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
            FileUtil.copy(temp, file);
            temp.delete();
        }
    
        private void teleport(String player, Location loc) {
            CompoundTag tag = load(player);
            List<Tag> pos = ((ListTag) tag.getValue().get("Pos")).getValue();
            pos.set(0, new DoubleTag("", loc.getX()));
            pos.set(1, new DoubleTag("", loc.getY()));
            pos.set(2, new DoubleTag("", loc.getZ()));
            tag.getValue().put("Pos", new ListTag("Pos", DoubleTag.class, pos));
    
            pos = ((ListTag) tag.getValue().get("Rotation")).getValue();
            pos.set(0, new FloatTag("", loc.getYaw()));
            pos.set(1, new FloatTag("", loc.getPitch()));
            tag.getValue().put("Rotation", new ListTag("Rotation", FloatTag.class, pos));
            tag.getValue().put("WorldUUIDLeast", new LongTag("WorldUUIDLeast", loc.getWorld().getUID().getLeastSignificantBits()));
            tag.getValue().put("WorldUUIDMost", new LongTag("WorldUUIDMost", loc.getWorld().getUID().getMostSignificantBits()));
            System.out.println(loc.getWorld().getEnvironment().ordinal());
            save(tag, player);
        }
    
        @SuppressWarnings("unused")
        @Override
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + "Команда доступна только игрокам.");
                return true;
            }
            Player pl = (Player) sender;
            if (!pl.hasPermission("tpoffline.tpoffline")) {
                sender.sendMessage(ChatColor.RED + "У вас недостаточно прав.");
                return true;
            }
            if (args.length == 0) {
                sender.sendMessage(ChatColor.YELLOW + "/" + label + " [игрок] - Телепортировать оффлайн игрок на свою позицию.");
                return true;
            }
            if (args.length > 0) {
                if (args.length == 0) {
                    sender.sendMessage(ChatColor.RED + "Укажите ник игрока.");
                    return true;
                }
                World w = pl.getWorld();
                if (Bukkit.getOfflinePlayer(args[0]).isOnline()) {
                    sender.sendMessage(ChatColor.RED + "Игрок в сети.");
                    return true;
                }
                Location loc = new Location(w, pl.getLocation().getX(), pl.getLocation().getY(), pl.getLocation().getZ(), pl.getLocation().getYaw(), pl.getLocation().getPitch());
                teleport(args[0], loc);
                sender.sendMessage(ChatColor.GREEN + "Игрок " + args[0] + " телепортирован.");
                return true;
            }
            return true;
        }
    }
    
    

    [23:44:27] [Server thread/INFO]: Serega007 issued server command: /tpofflines TestAccount
    [23:44:27] [Server thread/INFO]: 0
    [23:44:27] [Server thread/WARN]: java.lang.IllegalArgumentException: Invalid tag classs (org.jnbt.IntArrayTag).
    [23:44:27] [Server thread/WARN]: at org.jnbt.NBTUtils.getTypeCode(NBTUtils.java:106)
    [23:44:27] [Server thread/WARN]: at org.jnbt.NBTOutputStream.writeTag(NBTOutputStream.java:77)
    [23:44:27] [Server thread/WARN]: at org.jnbt.NBTOutputStream.writeCompoundTagPayload(NBTOutputStream.java:165)
    [23:44:27] [Server thread/WARN]: at org.jnbt.NBTOutputStream.writeTagPayload(NBTOutputStream.java:131)
    [23:44:27] [Server thread/WARN]: at org.jnbt.NBTOutputStream.writeTag(NBTOutputStream.java:89)
    [23:44:27] [Server thread/WARN]: at ru.main.tpoffline.TpOfflineCommand.save(TpOfflineCommand.java:74)
    [23:44:27] [Server thread/WARN]: at ru.main.tpoffline.TpOfflineCommand.teleport(TpOfflineCommand.java:99)
    [23:44:27] [Server thread/WARN]: at ru.main.tpoffline.TpOfflineCommand.onCommand(TpOfflineCommand.java:133)
    [23:44:27] [Server thread/WARN]: at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
    [23:44:27] [Server thread/WARN]: at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:181)
    [23:44:27] [Server thread/WARN]: at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCommand(CraftServer.java:740)
    [23:44:27] [Server thread/WARN]: at net.minecraft.network.NetHandlerPlayServer.func_147361_d(NetHandlerPlayServer.java:1370)
    [23:44:27] [Server thread/WARN]: at net.minecraft.network.NetHandlerPlayServer.func_147354_a(NetHandlerPlayServer.java:1107)
    [23:44:27] [Server thread/WARN]: at net.minecraft.network.play.client.C01PacketChatMessage.func_148833_a(C01PacketChatMessage.java:38)
    [23:44:27] [Server thread/WARN]: at net.minecraft.network.play.client.C01PacketChatMessage.func_148833_a(C01PacketChatMessage.java:53)
    [23:44:27] [Server thread/WARN]: at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:245)
    [23:44:27] [Server thread/WARN]: at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:181)
    [23:44:27] [Server thread/WARN]: at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:1023)
    [23:44:27] [Server thread/WARN]: at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:432)
    [23:44:27] [Server thread/WARN]: at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:841)
    [23:44:27] [Server thread/WARN]: at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:693)
    [23:44:27] [Server thread/WARN]: at java.lang.Thread.run(Unknown Source)
     
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Писец ты сложный :D.

    Код:
        public static void teleport(File file, double x, double y, double z, int dimension) {
            try {
                NBTTagCompound nbt = CompressedStreamTools.readCompressed(new FileInputStream(file));
                nbt.setTag("Pos", newDoubleNBTList(x, y, z));
                nbt.setInteger("Dimension", dimension);
                CompressedStreamTools.writeCompressed(nbt, new FileOutputStream(file));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    Код:
        public static NBTTagList newDoubleNBTList(double... numbers) {
            NBTTagList nbttaglist = new NBTTagList();
            for (double d0 : numbers) {
                nbttaglist.appendTag(new NBTTagDouble(d0));
            }
            return nbttaglist;
        }
     
    Последнее редактирование: 9 фев 2019
  3. LeonardoDaVinci

    LeonardoDaVinci Активный участник Пользователь

    Баллы:
    76
    Создаете jail, в нужном месте, сажаете оффлайн игрока при заходе он будет там где была точка Jail
     
  4. Автор темы
    ermaksochi

    ermaksochi Активный участник Пользователь

    Баллы:
    66
    Это называется костыль

    Спасибо alexandrage, его решение мне помогло, проблема решена
     
  5. LeonardoDaVinci

    LeonardoDaVinci Активный участник Пользователь

    Баллы:
    76
    Нет чтобы написать ,спасибо но мне не нужен костыль, вы очень плохой молодой человек.
     

Поделиться этой страницей