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

PlugIn SkyWars Spectator functioniert nicht

Sytexx

Minecrafter
Registriert
10 März 2019
Beiträge
6
Diamanten
250
Hey, Ich bin zurzeit am programmieren eines SkyWars plugins. Wenn ein Spieler getötet wird dann wird er zwar unsichtbar und bekommt alle Items aber wenn man auf den Items Klicken soll functioniert das nicht. Aber wenn man in der Lobby-Phase auf Items Klickt funktioniert es. Vielleicht erkennt jemand von euch das Problem.

Hier der Code des InteractListener:

InteractListener:
    @EventHandler
    public void onDieInteract(PlayerInteractEvent e) {
        
        if(e.getItem() != null && e.getItem().getItemMeta() != null && e.getItem().getType() == Material.BARRIER) {
            
            if(!JoinListener.ingame.contains(e.getPlayer())) {
            
            e.getPlayer().kickPlayer("");
        }else {
            e.getPlayer().sendMessage("§cDas Kannst du nur als Spectator ausführen!");
            e.setCancelled(true);
            
        }
        
        
        }
    }


Und hier der Vom RespawnEvent:

RespawnListener:
@EventHandler

    public void onRespawn(PlayerRespawnEvent e) {

        e.setRespawnLocation((Location)Main.instance.getConfig().get("SkyWars.location.spec"));

      

    e.getPlayer().setAllowFlight(true);

    e.getPlayer().setFlying(true);

      

      

    ItemStack i = new ItemStack(Material.COMPASS);

    ItemMeta m = i.getItemMeta();

    m.setDisplayName("§8» §cSpieler");

    i.setItemMeta(m);

  

    ItemStack i2 = new ItemStack(Material.BARRIER);

    ItemMeta m2 = i2.getItemMeta();

    m2.setDisplayName("§8» §cVerlassen");

    i2.setItemMeta(m2);

  

    e.getPlayer().getInventory().setItem(0, i);

    e.getPlayer().getInventory().setItem(8, i2);

  

    Bukkit.getOnlinePlayers().forEach(all ->{

        all.hidePlayer(e.getPlayer());

    });

  

      

    }
 

TrinityX

Redstoneengineer
Registriert
17 Mai 2020
Beiträge
47
Alter
23
Diamanten
337
Minecraft
NichtTrinity
Moin @ToDiYT ,

Wenn ich das jetzt richtig erkennen konnte fragst du vorher ab ob der Spieler sich nicht in einer List befindet.
Ich schätze mal dein Problem ist, dass du diesen Spieler nach seinem Tod nicht aus dieser List entfernst.

Sollte es an etwas anderem liegen bräuchte ich aber mehr Infos. Zunächst einmal, was genau passiert bzw. passiert denn nicht?

Liebe Grüße,
Trinity
 

Sytexx

Minecrafter
Registriert
10 März 2019
Beiträge
6
Diamanten
250
Moin @ToDiYT ,

Wenn ich das jetzt richtig erkennen konnte fragst du vorher ab ob der Spieler sich nicht in einer List befindet.
Ich schätze mal dein Problem ist, dass du diesen Spieler nach seinem Tod nicht aus dieser List entfernst.

Sollte es an etwas anderem liegen bräuchte ich aber mehr Infos. Zunächst einmal, was genau passiert bzw. passiert denn nicht?

Liebe Grüße,
Trinity
Hey, Ja also es ist so das der Spieler respawnt. Dann hat er die Items bzw. die Barriere im Inventar. Obwohl das ClickEvent gecanncelt ist kann er diese Items bewegen (Vorher konnte er sie ohne im GameMode 1 zu sein mit einem Klick löschen). Und die Action die ausgeführt werden soll wie der Kick wird nicht getahn. Ich schicke auch mal das PlayerDeathEvent rein.


PlayerDeathEvent:
@EventHandler
    public void onDeath(PlayerDeathEvent e) {
        e.setDeathMessage(null);
        Player p = e.getEntity();
        Player k = p.getKiller();
        JoinListener.ingame.remove(p);
        
        if(k == null && !Main.kill.isEmpty()) {
            
            Player killer = Bukkit.getPlayer(Main.kill.get(p.getUniqueId()));
            
            killer.sendMessage(Main.instance.getPrefix()+"§7Du hast §e"+p.getName()+" §7getötet!");
            p.sendMessage(Main.instance.getPrefix()+"§7Du wurdest von §e"+killer.getName()+" §7getötet!");
            
            
            Bukkit.getOnlinePlayers().forEach(all ->{
                
                all.sendMessage(Main.instance.getPrefix()+"§7Der Spieler §e"+p.getName()+" §7wurde von §e"+killer.getName()+" §7getötet!");
            });
            p.spigot().respawn();
        
            if(JoinListener.ingame.size() == 3) {
                
                JoinListener.ingame.forEach(winner ->{
                    
                    winner.sendTitle("§eGEWONNEN", "§7DU hast das Spiel gewonnen!");
                    
                    Bukkit.getOnlinePlayers().forEach(players ->{
                        players.sendMessage(Main.instance.getPrefix()+"§7Der Spieler §e"+winner.getName()+" §7hat das Spiel §egewonnen!");
                    });
                    
                });
                
                Main.instance.setGameState(GameState.RESTART);
                
                Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, new Runnable() {
                    
                    @Override
                    public void run() {
                        switch(seconds) {
                        
                        case 30: case 15: case 10: case 5: case 4: case 3: case 2:
                            
                            Bukkit.broadcastMessage(Main.instance.getPrefix()+"§7Der Server wird in §e"+seconds+" Sekunden §7neu gestartet!");
                            
                            break;

                        case 1:
                            
                            Bukkit.broadcastMessage(Main.instance.getPrefix()+"§7Der Server wird in §e"+seconds+" Sekunde §7neu gestartet!");
                            
                            break;
                            
                        case 0:
                            
                            Bukkit.getServer().shutdown();
                            
                            break;
                            
                        }
                        seconds--;
                        
                    }
                }, 0L, 20L);
                
            }
            
        }else if(k == null && Main.kill.isEmpty()){
            
            p.sendMessage(Main.instance.getPrefix()+"§7Du bist §egestorben!");
            
            Bukkit.getOnlinePlayers().forEach(all ->{
                
                all.sendMessage(Main.instance.getPrefix()+"§7Der Spieler §e"+p.getName()+" §7ist §egestorben!");
            });
            
            p.spigot().respawn();
            
            
            if(JoinListener.ingame.size() == 3) {
                
                JoinListener.ingame.forEach(winner ->{
                    
                    winner.sendTitle("§eGEWONNEN", "§7DU hast das Spiel gewonnen!");
                    
                    Bukkit.getOnlinePlayers().forEach(players ->{
                        players.sendMessage(Main.instance.getPrefix()+"§7Der Spieler §e"+winner.getName()+" §7hat das Spiel §egewonnen!");
                    });
                    
                });
                
                Main.instance.setGameState(GameState.RESTART);
                
                Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, new Runnable() {
                    
                    @Override
                    public void run() {
                        switch(seconds) {
                        
                        case 30: case 15: case 10: case 5: case 4: case 3: case 2:
                            
                            Bukkit.broadcastMessage(Main.instance.getPrefix()+"§7Der Server wird in §e"+seconds+" Sekunden §7neu gestartet!");
                            
                            break;

                        case 1:
                            
                            Bukkit.broadcastMessage(Main.instance.getPrefix()+"§7Der Server wird in §e"+seconds+" Sekunde §7neu gestartet!");
                            
                            break;
                            
                        case 0:
                            
                            Bukkit.getServer().shutdown();
                            
                            break;
                            
                        }
                        seconds--;                       
                    }
                }, 0L, 20L);
                
            }
            
        }else if(k != null) {
            k.sendMessage(Main.instance.getPrefix()+"§7Du hast §e"+p.getName()+" §7getötet!");
            p.sendMessage(Main.instance.getPrefix()+"§7Du wurdest von §e"+k.getName()+" §7getötet!");
            
            Main.kill.remove(p.getUniqueId(), k.getName());
            
            Bukkit.getOnlinePlayers().forEach(all ->{
                
                all.sendMessage(Main.instance.getPrefix()+"§7Der Spieler §e"+p.getName()+" §7wurde von §e"+k.getName()+" §7getötet!");
            });
            
            p.spigot().respawn();
            
            
            if(JoinListener.ingame.size() == 3) {
                
                JoinListener.ingame.forEach(winner ->{
                    
                    winner.sendTitle("§eGEWONNEN", "§7DU hast das Spiel gewonnen!");
                    
                    Bukkit.getOnlinePlayers().forEach(players ->{
                        players.sendMessage(Main.instance.getPrefix()+"§7Der Spieler §e"+winner.getName()+" §7hat das Spiel §egewonnen!");
                });
                    
                });
                
                Main.instance.setGameState(GameState.RESTART);
                
                
                Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, new Runnable() {
                    
                    @Override
                    public void run() {
                        switch(seconds) {
                        
                        case 30: case 15: case 10: case 5: case 4: case 3: case 2:
                            
                            Bukkit.broadcastMessage(Main.instance.getPrefix()+"§7Der Server wird in §e"+seconds+" Sekunden §7neu gestartet!");
                            
                            break;

                        case 1:
                            
                            Bukkit.broadcastMessage(Main.instance.getPrefix()+"§7Der Server wird in §e"+seconds+" Sekunde §7neu gestartet!");
                            
                            break;
                            
                        case 0:
                            
                            Bukkit.getServer().shutdown();
                            
                            break;
                            
                        }
                        seconds--;
                        
                    }
                }, 0L, 20L);
                
            }
            
        }
        
        
    }
 

Qubbe

Minecrafter
Registriert
20 Juli 2021
Beiträge
1
Diamanten
250
Hallo ToDiYT,

auch wenn dieser Thread mittlerweile 2 Monate alt ist, wollte ich noch einmal auf ein paar Dinge aufmerksam machen, ungeachtet davon ob das Problem gelöst ist. Nachdem ich einige Zeit deinen Code gelesen habe, sind mir ein paar Dinge aufgefallen, die Problempotential bieten und das Problem unter anderem ausgelöst haben könnten.

if(e.getItem() != null && e.getItem().getItemMeta() != null && e.getItem().getType() == Material.BARRIER) { if(!JoinListener.ingame.contains(e.getPlayer())) { e.getPlayer().kickPlayer(""); }else { e.getPlayer().sendMessage("§cDas Kannst du nur als Spectator ausführen!"); e.setCancelled(true); }
Obwohl das ClickEvent gecanncelt ist kann er diese Items bewegen

Wenn du nicht willst, dass die Items bewegt werden können, wenn man tot ist, musst du die setCancelled Methode ebenfalls aufrufen, wenn sich ein Spieler nicht in der Liste befindet. Beispielsweise:
Java:
    public void onInteractEvent(PlayerInteractEvent event)
    {
        if(!JoinListener.ingame.contains(event.getPlayer()))
        {
            event.setCancelled(true);
        }
    }

Des weiteren würde ich für den InteractListener anmerken, dass es in meinen Augen mehr Sinn machen würde, wenn man erst die Abfrage der Liste macht und danach lediglich abfragt, ob das Item ungleich null ist und dem Material einer Barriere entspricht. Die ItemMeta-Abfrage würde entfallen, da ich stark bezweifle, dass ein Spieler zu einem anderen Zeitpunkt eine Barriere bei sich tragen wird. Falls doch ist es klüger, direkt den spezifisch gesetzten Parameter abzufragen, in deinem Fall den Namen. Zusätzlich ist es besser, diese Abfragen geschachtelt zu tätigen, da der Code so weniger an Struktur verliert und potentiell variierbarer ist.
In etwa so:
Java:
public static final String LEAVE_NAME = "§8» §cVerlassen";

public void onRespawn(PlayerRespawnEvent event) { /*...*/ }
Java:
    public void onInteractEvent(PlayerInteractEvent event)
    {
        if(!JoinListener.ingame.contains(event.getPlayer()))
        {
            event.setCancelled(true);
            if(event.getItem() != null)
                if(event.getItem().getType() == Material.BARRIER)
                    if(event.getItem().getItemMeta().getDisplayName().equals(RespawnListener.LEAVE_NAME))
                        event.getPlayer().kickPlayer("");

            //potentielle else Abfragen
        }
    }
Wie du siehst, habe ich den Namen der Barriere direkt als statische Variable gespeichert, so kannst du diesen zentral verändern und musst ihn nicht immer neu schreiben und es gibt weniger Hardcodings.

Nun noch ein paar theoretische Ansätze. Ich würde dir wirklich ans Herz legen noch einmal zu Themen Struktur und Formatierung des Codes, sowie Benennung von Variablen und das Kommentieren des Codes zu recherchieren. Ich selbst habe vor ein paar Jahren manchmal unkommentierten Code mit einer schrecklichen Variablenbenennung geschrieben und wie zu erwarten, musste ich mich später immer und immer wieder in meinen eigenen Code einarbeiten, um ihn zu verstehen und anzupassen. Wenn dies schon bei dem eigenen Code passiert, kannst du dir sicher vorstellen, dass sich nicht viele Leute so einen Code von Fremden anschauen werden und versuchen ihn zu verstehen. Deshalb kann ich dir auch unter anderem zu deinem eigentlichen Problem keine direkte Lösung oder einen direkten Fehler nennen, da er vermutlich inmitten der Klassen irgendwo klein und leicht zu übersehen schlummert! Gerade wenn du mit vielen statischen Verlinkungen arbeitest, können sich schnell Fehler ergeben. Statische Werte beziehen sich auf die Klasse und können so an vielen Stellen verändert werden, ich würde bei Listen eher davon abraten, static einzusetzen. (In deinem Fall geht es natürlich, allerdings sollte man mit static-Deklarierungen trotzdem vorsichtig sein).

Als einen letzten Schritt würde ich dir ebenfalls noch empfehlen, gerade für deinen DeathListener, einzelne Abläufe auf jeden Fall in Methoden abzuspeichern und diese lediglich bei gewissen Zuständen auszuführen oder (wenn es sich anbietet) auf andere Klassen zu verteilen. Denn dein DeathListener zieht sich sehr in die Länge und ist gerade im Forum schwer zu lesen (wann welcher Zustand eintrifft, wann etwas gemacht wird etc). Und gerade bei Runnables, von denen ich beim Überfliegen einige gesehen habe, sollten lieber strukturiert geführt werden, da hier bei Fehlern vor allem auch die Rechenleistung des Servers in Mitleidenschaft gezogen wird.

Ich hoffe, ich konnte hiermit ein paar Denkansätze geben und für spätere Zeit weiterhelfen!

Freundliche Grüße,
Qubbe
 
Zuletzt bearbeitet:
Oben