Crafter6432
Workaholic
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.
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!
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: