• 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!

Spigot PlayerJoin in deaktivierter Welt

Sensei

Minecrafter
Registriert
11 April 2020
Beiträge
4
Diamanten
300
Hallo, ich habe ein kleines Problem wo ich nicht mehr weiter komme, und hoffe hier auf Hilfe.
Ich habe ein "eigenes Multiverse" programmiert. Nun, alles funktioniert. Ich kann Welten erstellen, laden, deaktivieren etc.

Nun stellt sich folgendes Problem.
Spieler "A" loggt sich in Welt "test" aus. Admin deaktiviert die Welt "test". Spieler "A" joint dem Server und spawnt in "world" unter den selben Koordinaten wo er sich in Welt "test" ausgeloggt hat -> In diesem Fall in Y4, und somit in vollen Blöcken -> Tod.

Nun, ich wollte dieses Problem mit dem PlayerJoinEvent lösen, folgendes habe ich probiert: (Habe es auch mit dem PlayerLoginEvent probiert)

Java:
@EventHandler (priority = EventPriority.HIGHEST)
    public void onJoin(PlayerJoinEvent e) {

        Player p = e.getPlayer();

        Bukkit.broadcastMessage("DEBUG 1"); // Wird ausgegeben


        if(p.getWorld() == null) {
            p.performCommand("spawn");
            Bukkit.broadcastMessage("DEBUG NULL"); //Wird nicht ausgegeben
        }

        if(p.getWorld() != null) {
            Bukkit.broadcastMessage("DEBUG NICHT NULL"); //Wird ausgegeben, wenn die Welt  in der man spawnt geladen ist
        }
    
    }

Die Abfrage ob die Welt null ist greift komischer weise nicht, da der Spieler zu dem Zeitpunkt schon in "world" landet.
Die Abfrage ob die Welt nicht null ist, funktioniert.

Ich wäre echt dankbar für Hilfe. Habt nachsicht, gehöre noch zu den "Anfängern"..

Viele Grüße
Sensei


/edit: Falls wichtig -> Spigot Version: 1.15.2
 
Zuletzt bearbeitet:

Sensei

Minecrafter
Registriert
11 April 2020
Beiträge
4
Diamanten
300
Erst mal vielen Dank für deine ausführliche Antwort und Erklärung. Zu Punkt 1.: Das wollte ich vermeiden, extra Daten dafür zu speichern.
Zu Punkt 2. Ist den PlayerSpawnLocationEvent jetzt meine Lösung? Kann ich damit abfragen ob die Welt null ist und wenn ja teleportiere Spieler an den Welt Spawn?!

Über eine Abfrage ob der Spieler sich in Blöcken oder über Blöcken befindet habe ich auch schon nach gedacht, konnte es aber mit meinem Wissen noch nicht umsetzen. Hast du hierzu evtl. ein Beispiel?
 

Sensei

Minecrafter
Registriert
11 April 2020
Beiträge
4
Diamanten
300
Problem gelöst. Die "isSafeLocation" Methode habe ich aus einem anderem Forum.

//EDIT: ACHTUNG, diesen Code nicht kopieren. Lese weiter ;)

Java:
[S]public class OnPlayerJoin implements Listener {

    @EventHandler (priority = EventPriority.HIGHEST)
    public void onJoin(PlayerJoinEvent e) {
       
        Player p = e.getPlayer();
        Location pLoc = p.getLocation();
       
         if (isSafeLocation(pLoc)) {
             p.performCommand("spawn");
         }
   
    }
   
    public static boolean isSafeLocation(Location location) {
        try {
            Block feet = location.getBlock();
            if (!feet.getType().isOccluding() && !feet.getLocation().add(0, 1, 0).getBlock().getType().isOccluding()) {
                return false;
            }
            Block head = feet.getRelative(BlockFace.UP);
            if (!head.getType().isOccluding()) {
                return false;
            }
            Block ground = feet.getRelative(BlockFace.DOWN);
            return ground.getType().isSolid();
           
        } catch (Exception e) {
            System.out.println(e);
        }
        return false;
    }
}[/S]
 
Zuletzt bearbeitet:

Sensei

Minecrafter
Registriert
11 April 2020
Beiträge
4
Diamanten
300
Hallo @LapisMC, ich habe die Methode aus dem Spigot Forum.. :/

Bevor ich zum eigentlichen Thema komme möchte ich mich nochmals bei dir bedanken, dass du mir alles so ausführlich erklärst und mir auch erklärst was daran falsch ist. Find ich top *daumen hoch*

Nun, ich muss auch zu geben, bevor ich diesem Beitrag hier erstellt habe, habe ich schon eine weile an diesem Problem gesessen und wollte es so schnell wie möglich behoben haben. Nun habe ich mich nochmal hin gesetzt und es selbst "um"programmiert.
Ich habe auch abgefragt ob ein Spieler "fällt", dass hat auch soweit funktioniert. Habe dies aber weg gelassen, da dies ausgenutzt werden könnte.

Java:
public class OnPlayerJoin implements Listener {

    @EventHandler (priority = EventPriority.HIGHEST)
    public void onJoin(PlayerSpawnLocationEvent e) {
        
        Player p = e.getPlayer();
        
        if (isNotSafe(p.getLocation())) {
            e.setSpawnLocation(p.getLocation().getWorld().getSpawnLocation());
        }
                
    
    }
        
    private boolean isNotSafe(Location loc) {
        
        Block feet = loc.getBlock();
        
        if((feet.getType().isOccluding()) && (feet.getLocation().add(0, 1, 0).getBlock().getType().isOccluding())) {
            return true;
        }
        
        return false;
    }
    
}
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Speicher einfach selbst die Welt des Spielers beim Logout, sowie periodisch. Wenn der Spieler joint aber plötzlich auf einer andere Welt steht, dann wurde die Map gelöscht. Alternativ setzt du beim Löschen der Map ein Flag für alle Spieler, die auf dieser Welt waren und spawnst sie beim Join neu. (Diese Ausführung basiert auf dem von @LapisMC beschriebenen Eigenschaften, ich hab das Verhalten gerade nicht selbst geprüft)

Andernfalls, kann man dein System für gezielte Teleportation missbrauchen, indem man sich selbst einbaut.
 
Oben