• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Spieler Teleportieren, der Quasi Offline ist

Crafter6432

Workaholic
Registriert
22 Dezember 2011
Beiträge
681
Diamanten
0
Hallo,

In meinem Plugin starte ich im PlayerQuitEvent einen Thread, der die Position und das Inventar des Spielers von der Festplatte läd, wenn dies fertig führt der Thread über den Bukkit Scheduler das wiederherstellen des Inventars und der Position im Mainthread durch. Das Problem dabei ist, dass der Spieler meistens schon Offline ist, wenn die Position wiedergestellt wird, komischerweise klappt es mit dem Inventar problemlos.

Code:
//Wird vom Quit event aufgerufen
public void restorePlayer(final Session session) {
        final Player p = session.getPlayer();
        new Thread(new Runnable() {


            @Override
            public void run() {
                File loc = getPlayerCache(p);
                if (!loc.exists())
                    return;
                final YamlConfiguration invStorage = YamlConfiguration
                        .loadConfiguration(loc);
                loc.delete();
                Commands.getInstance().runSync(new Runnable() {
                    @Override
                    public void run() {
                        ConfigurationSection potion = invStorage
                                .getConfigurationSection("potion");
                        if (potion != null) {
                            for (String pe : potion.getKeys(false)) {
                                p.addPotionEffect((PotionEffect) potion.get(pe));
                            }
                        }


                        Location loc = new Location(getServer().getWorld(
                                invStorage.getString("location.world",
                                        getServer().getWorlds().get(0)
                                                .getName())), invStorage
                                .getDouble("location.x", 0), invStorage
                                .getDouble("location.y", 128), invStorage
                                .getDouble("location.z", 0));
                        if (loc != null) {
                            session.setLastPos(loc);
                        }
                        for (int i = 0; i < p.getInventory().getSize(); i++) {
                            if (invStorage.isSet(String.valueOf(i))) {
                                p.getInventory().setItem(
                                        i,
                                        (ItemStack) invStorage.get(String
                                                .valueOf(i)));
                            }
                        }
                        safeTeleport(p, session.getLastPos());
                        System.out.println(p.getLocation()); //Position ändert sich nicht
                        p.saveData();


                    }
                });


            }
        }).start();
    }
    public Location safeTeleportLocation(Player p,Location loc){
        Material block = loc.getBlock().getType();
        Material blockU = loc.getBlock().getRelative(BlockFace.UP).getLocation().getBlock().getType();
        while (block.isSolid() || block == Material.LAVA|| blockU.isSolid()) {
            loc.setY(loc.getY()+1);
            block = loc.getBlock().getType();
            blockU = loc.getBlock().getRelative(BlockFace.UP).getLocation().getBlock().getType();
        }
        if(loc.getY() % 1 < 0.1){
            loc.setY(loc.getY()+0.1);
        }
        return loc;
    }
    
    public void safeTeleport(Player p,Location loc){
        p.teleport(safeTeleportLocation(p, loc));
    }

Hat jemand eine Idee, wie ich den Spieler Teleportieren kann, obwohl dieser Offline ist? Das ganze möchte ich aber nicht im Mainthread laufen lassen oder den Spieler erst beim nächsten Join teleportieren!
 
Zuletzt bearbeitet:

Crafter6432

Workaholic
Registriert
22 Dezember 2011
Beiträge
681
Diamanten
0
Erstmal den Spieler wenn er das Spiel verlässt in der Config verewigen. Am besten <Playername>_Pos: <Koordinaten> und einen zweiten Eintrag <Playername>. Wenn Playername auf "true" gesetzt wird soll der Spieler zu <Playername>_Post teleportiert werden. Wenn ein Command, das mit tp startet erkannt wird und der betroffene Spieler offline ist werden die koordinaten in die <Playername>_Pos eingetragen. Nach der Teleportation sollte <Playername> wieder auf "false" gesetzt werden.

Man sieht: sehr easy! ;)


Genau das will ich nicht, wie ich auch schon geschrieben hatte.
 
C

Chrisliebaer

Guest
NBT ist aber nicht von Bukkit, also muss ich es für jede neue Version Plugin kompilieren, gibt es denn keine "schöne" Lösung über die Bukkit API ?

Du müsst nur eine Library verwenden, die dir direkt den Zugriff auf die NBT Struktur erlaubt. Das hat ja mit Bukkit nichts zu tun und läuft komplett extra. Du wird lediglich das Problem haben, dass du nicht weiß, wann Bukkit die Datei nicht mehr offen hat.

Ich habe auch mal nach einer solchen Möglichkeit gesucht und nichts gefunden. Entweder player.dat oder beim joinen.
 
Oben