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

ermaksochi

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Serega007
Здравствуйте! Мне нужно телепортировать оффлайн игрока редактируя 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)
 
Писец ты сложный 😁.

Код:
    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;
    }
 
Последнее редактирование:
Здравствуйте! Мне нужно телепортировать оффлайн игрока редактируя 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)
Создаете jail, в нужном месте, сажаете оффлайн игрока при заходе он будет там где была точка Jail
 
Назад
Верх