Skocz do zawartości
  • 0

Poprawa pluginu na spectate


Pytanie

Hej,

próbowałem napisać plugin na spectatowanei graczy, ale gdy go testuje w konsoli wyskakuje błąd podczas komendy, /unspectate

Kod oraz błąd:
 

package me.kuzja.spectatecommand;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.HashMap;
import java.util.Map;

public class SpectateCommand implements CommandExecutor {
    Map<Player, Location> playerLocation = new HashMap<>();
    Map<Player, GameMode> playerGamemode = new HashMap<>();

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String s, String[] args) {
        Player p = (Player) sender;
        if (cmd.getName().equalsIgnoreCase("spectate")) {
            if (p.hasPermission("spectatecommand.spectate")) {
                if (args.length == 1) {
                    Player ps = Bukkit.getServer().getPlayer(args[0]);
                    if (ps.isOnline()) {
                        if (!ps.getName().equalsIgnoreCase(p.getName())) {
                            if (ps.getGameMode() != GameMode.SPECTATOR) {
                                playerLocation.put(p, p.getLocation());
                                playerGamemode.put(p, p.getGameMode());
                                p.teleport(ps.getLocation());
                                p.setGameMode(GameMode.SPECTATOR);
                                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand] &aSpectating player &7" + ps.getName() + "&a, to stop spectating type: &7/unspectate"));
                            } else {
                                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou can't spectate player, who's already spectating someone!"));
                            }

                        } else {
                            p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou can't spectate yourself!"));
                        }
                    } else {
                        p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cThis player is not online, or doesn't exists"));
                    }

                } else {
                    p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou have to provide player name!"));
                }
            } else {
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou don't have permission to execute this command!"));
            }
        } else if (cmd.getName().equalsIgnoreCase("unspectate")) {
            if (p.getGameMode() == GameMode.SPECTATOR) {
                p.teleport((Location) playerLocation);
                p.setGameMode(playerGamemode.get(p));
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &aStopped spectating!"));
                playerLocation.clear();
                playerGamemode.clear();
            } else {
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou aren't spectating anyone!"));
            }
        }
        return false;
    }
}

[23:34:49 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'unspec' in plugin SpectateCommand v1.0
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:155) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_20_R1.CraftServer.dispatchCommand(CraftServer.java:987) ~[paper-1.20.1.jar:git-Paper-196]
        at org.bukkit.craftbukkit.v1_20_R1.command.BukkitCommandWrapper.run(BukkitCommandWrapper.java:64) ~[paper-1.20.1.jar:git-Paper-196]
        at com.mojang.brigadier.CommandDispatcher.execute(CommandDispatcher.java:265) ~[paper-1.20.1.jar:?]
        at net.minecraft.commands.Commands.performCommand(Commands.java:324) ~[?:?]
        at net.minecraft.commands.Commands.performCommand(Commands.java:308) ~[?:?]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.performChatCommand(ServerGamePacketListenerImpl.java:2354) ~[?:?]
        at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$21(ServerGamePacketListenerImpl.java:2314) ~[?:?]
        at net.minecraft.util.thread.BlockableEventLoop.lambda$submitAsync$0(BlockableEventLoop.java:59) ~[?:?]
        at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[?:?]
        at net.minecraft.server.TickTask.run(TickTask.java:18) ~[paper-1.20.1.jar:git-Paper-196]
        at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:153) ~[?:?]
        at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[?:?]
        at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1338) ~[paper-1.20.1.jar:git-Paper-196]
        at net.minecraft.server.MinecraftServer.d(MinecraftServer.java:197) ~[paper-1.20.1.jar:git-Paper-196]
        at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:126) ~[?:?]
        at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1315) ~[paper-1.20.1.jar:git-Paper-196]
        at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1308) ~[paper-1.20.1.jar:git-Paper-196]
        at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:136) ~[?:?]
        at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1286) ~[paper-1.20.1.jar:git-Paper-196]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1174) ~[paper-1.20.1.jar:git-Paper-196]
        at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.20.1.jar:git-Paper-196]
        at java.lang.Thread.run(Thread.java:1583) ~[?:?]
Caused by: java.lang.ClassCastException: class java.util.HashMap cannot be cast to class org.bukkit.Location (java.util.HashMap is in module java.base of loader 'bootstrap'; org.bukkit.Location is in unnamed module of loader java.net.URLClassLoader @1b9e1916)
        at me.kuzja.spectatecommand.SpectateCommand.onCommand(SpectateCommand.java:53) ~[SpectateCommand-1.0.jar:?]
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
        ... 23 more

Odnośnik do komentarza
https://skript.pl/temat/58477-poprawa-pluginu-na-spectate/
Udostępnij na innych stronach

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Błąd jest tutaj

 

p.teleport((Location) playerLocation);

próbujesz castować Location do HashMapy.

HashMap to zbiór danych na podstawie klucza.

Próbujesz przypisać lokalizację do hashmapy co jest błędem, poprawiony kod:

 

p.teleport(playerLocation.get(p));

 

Sam kod w sobie jest tragiczny, no ale w szczegóły nie wchodzę.

Dokładny opis błędu miałeś tutaj

Caused by: java.lang.ClassCastException: class java.util.HashMap cannot be cast to class org.bukkit.Location (java.util.HashMap is in module java.base of loader 'bootstrap'; org.bukkit.Location is in unnamed module of loader java.net.URLClassLoader @1b9e1916)
        at me.kuzja.spectatecommand.SpectateCommand.onCommand(SpectateCommand.java:53) ~[SpectateCommand-1.0.jar:?]

 

A no i ogromny błąd jest tutaj

               playerLocation.clear();
                playerGamemode.clear();

czyścisz całą mapę, powinieneś tylko usunąć wpisy dla konkretnego gracza np. playerLocation.remove(p);

 

Dodatkowo popraw to

if (ps.isOnline()) {

Gdy pobierasz gracze przez Bukkit.getPlayer, gdy nie ma go na serwerze, jego wartością będzie null, gdy wpiszesz niepoprawną nazwę gracza to nie da komunikatu, że jest offline tylko wywali ci NullPointerException

 

Wystarczy sprawdzenie

if (ps != null)

 

Odnośnik do komentarza
https://skript.pl/temat/58477-poprawa-pluginu-na-spectate/#findComment-346042
Udostępnij na innych stronach

  • 0
1 godzinę temu, kerpson napisał:

Błąd jest tutaj

 

p.teleport((Location) playerLocation);

próbujesz castować Location do HashMapy.

HashMap to zbiór danych na podstawie klucza.

Próbujesz przypisać lokalizację do hashmapy co jest błędem, poprawiony kod:

 

p.teleport(playerLocation.get(p));

 

Sam kod w sobie jest tragiczny, no ale w szczegóły nie wchodzę.

Dokładny opis błędu miałeś tutaj

Caused by: java.lang.ClassCastException: class java.util.HashMap cannot be cast to class org.bukkit.Location (java.util.HashMap is in module java.base of loader 'bootstrap'; org.bukkit.Location is in unnamed module of loader java.net.URLClassLoader @1b9e1916)
        at me.kuzja.spectatecommand.SpectateCommand.onCommand(SpectateCommand.java:53) ~[SpectateCommand-1.0.jar:?]

 

A no i ogromny błąd jest tutaj

               playerLocation.clear();
                playerGamemode.clear();

czyścisz całą mapę, powinieneś tylko usunąć wpisy dla konkretnego gracza np. playerLocation.remove(p);

 

Dodatkowo popraw to

if (ps.isOnline()) {

Gdy pobierasz gracze przez Bukkit.getPlayer, gdy nie ma go na serwerze, jego wartością będzie null, gdy wpiszesz niepoprawną nazwę gracza to nie da komunikatu, że jest offline tylko wywali ci NullPointerException

 

Wystarczy sprawdzenie

if (ps != null)

 

Dzięki za pomoc, co do kodu, to dopiero się uczę pisać.

Odnośnik do komentarza
https://skript.pl/temat/58477-poprawa-pluginu-na-spectate/#findComment-346043
Udostępnij na innych stronach

  • 0
3 godziny temu, kerpson napisał:

Błąd jest tutaj

 

p.teleport((Location) playerLocation);

próbujesz castować Location do HashMapy.

HashMap to zbiór danych na podstawie klucza.

Próbujesz przypisać lokalizację do hashmapy co jest błędem, poprawiony kod:

 

p.teleport(playerLocation.get(p));

 

Sam kod w sobie jest tragiczny, no ale w szczegóły nie wchodzę.

Dokładny opis błędu miałeś tutaj

Caused by: java.lang.ClassCastException: class java.util.HashMap cannot be cast to class org.bukkit.Location (java.util.HashMap is in module java.base of loader 'bootstrap'; org.bukkit.Location is in unnamed module of loader java.net.URLClassLoader @1b9e1916)
        at me.kuzja.spectatecommand.SpectateCommand.onCommand(SpectateCommand.java:53) ~[SpectateCommand-1.0.jar:?]

 

A no i ogromny błąd jest tutaj

               playerLocation.clear();
                playerGamemode.clear();

czyścisz całą mapę, powinieneś tylko usunąć wpisy dla konkretnego gracza np. playerLocation.remove(p);

 

Dodatkowo popraw to

if (ps.isOnline()) {

Gdy pobierasz gracze przez Bukkit.getPlayer, gdy nie ma go na serwerze, jego wartością będzie null, gdy wpiszesz niepoprawną nazwę gracza to nie da komunikatu, że jest offline tylko wywali ci NullPointerException

 

Wystarczy sprawdzenie

if (ps != null)

 

Jednak gdy poprawiłem to o czym wspomniales + wniosłem poprawki, że zamiast spectatora jest na vanishu z flyem to gdy wpisuje /unspectate to wyskakuje komunikat
"You aren't spectating anyone"
oto aktualny kod:
 

package me.kuzja.spectatecommand;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class SpectateCommand implements CommandExecutor {
    Map<Player, Location> playerLocation = new HashMap<>();
    ArrayList<Player> playerSpectating = new ArrayList<>();

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String s, String[] args) {
        Player p = (Player) sender;
        if (cmd.getName().equalsIgnoreCase("spectate")) {
            if (p.hasPermission("spectatecommand.spectate")) {
                if (args.length == 1) {
                    Player ps = Bukkit.getServer().getPlayer(args[0]);
                    if (ps != null) {
                        if (!ps.getName().equalsIgnoreCase(p.getName())) {
                            if (!playerSpectating.contains(ps)) {
                                playerLocation.put(p, p.getLocation());
                                playerSpectating.add(p);
                                p.teleport(ps.getLocation());
                                p.setInvulnerable(true);
                                p.setAllowFlight(true);
                                for (Player plrs : Bukkit.getServer().getOnlinePlayers()) {
                                    plrs.hidePlayer(p);
                                }
                                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand] &aSpectating player &7" + ps.getName() + "&a, to stop spectating type: &7/unspectate"));
                            } else {
                                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou can't spectate player, who's already spectating someone!"));
                            }

                        } else {
                            p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou can't spectate yourself!"));
                        }
                    } else {
                        p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cThis player is not online, or doesn't exists"));
                    }

                } else {
                    p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou have to provide player name!"));
                }
            } else {
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou don't have permission to execute this command!"));
            }
        } else if (cmd.getName().equalsIgnoreCase("unspectate")) {
            if (playerSpectating.contains(p)) {
                p.teleport(playerLocation.get(p));
                playerSpectating.remove(p);
                p.setInvulnerable(false);
                p.setAllowFlight(false);
                for (Player plrs : Bukkit.getServer().getOnlinePlayers()) {
                    plrs.showPlayer(p);
                }
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &aStopped spectating!"));
                playerLocation.remove(p);
            } else {
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou aren't spectating anyone!"));
            }
        }
        return false;
    }
}
Odnośnik do komentarza
https://skript.pl/temat/58477-poprawa-pluginu-na-spectate/#findComment-346045
Udostępnij na innych stronach

  • 0

W liście przetrzymujesz objekt Player.

 

Gdy sprawdzasz czy w liście jest gracz wyskakuje, że go nie ma - gdyż player to zbyt duży objekt, porównując go metodą equals prawie zawsze wychodzi nam to na false, zbyt wiele zmiennych nie będzie sobie równych takich jak np. lokalizacja itd.

 

Zamiast przetrzymywać Playera użyj UUID.

Odnośnik do komentarza
https://skript.pl/temat/58477-poprawa-pluginu-na-spectate/#findComment-346046
Udostępnij na innych stronach

  • 0
Godzinę temu, kerpson napisał:

W liście przetrzymujesz objekt Player.

 

Gdy sprawdzasz czy w liście jest gracz wyskakuje, że go nie ma - gdyż player to zbyt duży objekt, porównując go metodą equals prawie zawsze wychodzi nam to na false, zbyt wiele zmiennych nie będzie sobie równych takich jak np. lokalizacja itd.

 

Zamiast przetrzymywać Playera użyj UUID.

dobra nie rozumiem tego, cos tam zmienilem ale nie dziala XD, wyslesz kod ktory zadziala?
 

package me.kuzja.spectatecommand;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class SpectateCommand implements CommandExecutor {
    Map<Player, Location> playerLocation = new HashMap<>();
    ArrayList<UUID> playerSpectating = new ArrayList<>();

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String s, String[] args) {
        Player p = (Player) sender;
        if (cmd.getName().equalsIgnoreCase("spectate")) {
            if (p.hasPermission("spectatecommand.spectate")) {
                if (args.length == 1) {
                    Player ps = Bukkit.getServer().getPlayer(args[0]);
                    if (ps != null) {
                        if (!ps.getName().equalsIgnoreCase(p.getName())) {
                            if (!playerSpectating.contains(ps.getUniqueId())) {
                                playerLocation.put(p, p.getLocation());
                                playerSpectating.add(p.getUniqueId());
                                p.teleport(ps.getLocation());
                                p.setInvulnerable(true);
                                p.setAllowFlight(true);
                                for (Player plrs : Bukkit.getServer().getOnlinePlayers()) {
                                    plrs.hidePlayer(p);
                                }
                                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand] &aSpectating player &7" + ps.getName() + "&a, to stop spectating type: &7/unspectate"));
                            } else {
                                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou can't spectate player, who's already spectating someone!"));
                            }

                        } else {
                            p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou can't spectate yourself!"));
                        }
                    } else {
                        p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cThis player is not online, or doesn't exists"));
                    }

                } else {
                    p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou have to provide player name!"));
                }
            } else {
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou don't have permission to execute this command!"));
            }
        } else if (cmd.getName().equalsIgnoreCase("unspectate")) {
            if (playerSpectating.contains(p.getUniqueId())) {
                p.teleport(playerLocation.get(p));
                playerSpectating.remove(p.getUniqueId());
                p.setInvulnerable(false);
                p.setAllowFlight(false);
                for (Player plrs : Bukkit.getServer().getOnlinePlayers()) {
                    plrs.showPlayer(p);
                }
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &aStopped spectating!"));
                playerLocation.remove(p);
            } else {
                p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&bSpectateCommand&8] &cYou aren't spectating anyone!"));
            }
        }
        return false;
    }
}

 

Odnośnik do komentarza
https://skript.pl/temat/58477-poprawa-pluginu-na-spectate/#findComment-346049
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Odpowiedz na pytanie...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...