rozumek29 13 Opublikowano 24 czerwca 2020 Udostępnij Opublikowano 24 czerwca 2020 Witam, dopiero się uczę programować zarówno w javie, więc proszę o wyrozumiałość jeśli okażę się że są jakieś rażące błędy. Jest ktoś w stanie powiedzieć dlaczego nie teleportuję gracza, po zaakceptowaniu prośby ? package me.Rozumek29.commands; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; import java.util.HashMap; public class tpa implements Listener, CommandExecutor { HashMap<Player, Player> tpa = new HashMap<Player, Player>(); @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, String commandLabel, String[] args) { Player p1 = (Player)sender; Player p2 = Bukkit.getPlayer(args[0]); if (commandLabel.equalsIgnoreCase("tpa")){ if (args.length==1){ if (p2!=null){ tpa.put(p2, p1); p2.sendMessage(ChatColor.GOLD+"Gracz "+ChatColor.BOLD+p1.getName()+ChatColor.GOLD+" chce sie do ciebie teleportowac"); p2.sendMessage(ChatColor.GOLD+"Wpisz "+ChatColor.GREEN+" /tpaccept aby zatwierdzic"); p2.sendMessage(ChatColor.GOLD+"Lub "+ChatColor.RED+" /tpdeny aby odrzucic"); } }else if (args.length != 1){ sender.sendMessage(ChatColor.GRAY+"["+ChatColor.GOLD+"CORE"+ChatColor.GRAY+"] Poprawne uzycie tej komedy to /tpa <gracz>"); } }else if (commandLabel.equalsIgnoreCase("tpaccept")){ if (tpa.get(p1) != null){ p1.sendMessage(ChatColor.GOLD+"Twoja prosba teleportacji zostala zaakceptowana, zostaniesz teleportowany w ciagu 5 sec"); p2.sendMessage(ChatColor.GOLD+"Zaakceptowano prosbe teleportacji gracza "+p1.getName()); tpa.get(p1).teleport(p2.getLocation()); tpa.put(p1, null); } }else if (commandLabel.equalsIgnoreCase("tpdeny")){ if (tpa.get(p1) != null){ p1.sendMessage(ChatColor.GOLD+"Twoja prosba teleportacji zostala odrzucona."); p2.sendMessage(ChatColor.GOLD+"Odrzucono prosbe teleportacji gracza "+p1.getName()); tpa.put(p1, null); } } return false; } } Odnośnik do komentarza https://skript.pl/temat/40075-problem-z-komenda-tpa/ Udostępnij na innych stronach Więcej opcji udostępniania...
0 kerpson 551 Opublikowano 24 czerwca 2020 Udostępnij Opublikowano 24 czerwca 2020 (edytowane) 1. Niepotrzebny ci listener, jeżeli nie masz żadnego eventu w tej klasie (chyba, że masz to sry) 2. Nie powinno w mapce bezpośrednio zapisywać się obiektu Player, lecz np. UUID 3. 41 minut temu, rozumek29 napisał: tpa.put(p1, null); To ma mały sens, powinno być tpa.remove(p1); 4. Jeżeli używasz A co do kodu: (Nie jestem pewny czy zadziała) Działanie hash mapy: Map<Key, Value>. Key to obiekt, za pomocą którego można otrzymać Value (również obiekt) mu przypisany, pod warunkiem, że w mapce znajduje się Key o wartości o jakiej się go sprawdza. W komendzie /tpa <gracz>: Sprawdzasz czy p2 nie jest nullem, a do mapki dodajesz map.put(p2.getUniqueId(), p1.getUniqueId()); No i wysyłasz wiadomość do gracza p2, że p1 chce się tepać itd itd. Komenda /tpaccept może być bez argumentu:) : (W tym przypadku p1 to po prostu player castowany do sendera) Zrób warunek if map.containsKey(p1.getUniqueId()); jeżeli nie to znaczy, że nikt się do ciebie nie tepał Player p2 = Bukkit.getPlayer(map.get(p1.getUniqueId())); (sprawdz czy nie jest nullem) Sprawdzasz czy p2 nie jest nullem, jeżeli tak to znaczy, że jest offline no i możesz zrobić map.remove(p1.getUniqueId()) (usunąć ich z mapki bo są już niepotrzebni); tepasz p2 do ciebie itp Komenda /tpdeny też może być bez argumentu : (W tym przypadku p1 to po prostu player castowany do sendera) Zrób warunek if map.containsKey(p1.getUniqueId()); jeżeli nie to znaczy, że nikt się do ciebie nie tepał Player p2 = Bukkit.getPlayer(map.get(p1.getUniqueId())); (sprawdz czy nie jest nullem) Sprawdzasz czy p2 nie jest nullem, jeżeli tak to znaczy, że jest offline no i możesz zrobić map.remove(p1.getUniqueId()); wysyłasz p2, że nie chcesz go teleportować I jeszcze taka ciekawostka, fajnym rozwiązaniem też jest zamiast mapki użycia cache z guavy, jest to też cos ala mapka, tylko że usuwa dany klucz po określonym czasie np. 60 sekund https://github.com/google/guava/wiki/CachesExplained Edytowane 24 czerwca 2020 przez kerpson Odnośnik do komentarza https://skript.pl/temat/40075-problem-z-komenda-tpa/#findComment-250658 Udostępnij na innych stronach Więcej opcji udostępniania...
0 rozumek29 13 Opublikowano 24 czerwca 2020 Autor Udostępnij Opublikowano 24 czerwca 2020 Coś mi nadal nie działa. Chyba coś popsułem, teraz w ogóle nie wykonuję się nawet komeda tpa, a wczesniej dzialala. w sensie wczesniej sie chociaz wiadomosci wyswietlaly public class tpa implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, String commandLabel, String[] args) { HashMap<UUID, UUID> tpa = new HashMap<UUID, UUID>(); Player p1 = (Player)sender; Player p2 = Bukkit.getPlayer(tpa.get(p1.getUniqueId())); if (commandLabel.equalsIgnoreCase("tpa")){ if (args.length==1){ if (p2!=null){ tpa.put(p2.getUniqueId(), p1.getUniqueId()); p2.sendMessage(ChatColor.GOLD+"Gracz "+ChatColor.BOLD+p1.getName()+ChatColor.GOLD+" chce sie do ciebie teleportowac"); p2.sendMessage(ChatColor.GOLD+"Wpisz "+ChatColor.GREEN+" /tpaccept aby zatwierdzic"); p2.sendMessage(ChatColor.GOLD+"Lub "+ChatColor.RED+" /tpdeny aby odrzucic"); } }else if (args.length != 1){ sender.sendMessage(ChatColor.GRAY+"["+ChatColor.GOLD+"CORE"+ChatColor.GRAY+"] Poprawne uzycie tej komedy to /tpa <gracz>"); } }else if (commandLabel.equalsIgnoreCase("tpaccept")){ if (tpa.containsKey(p1.getUniqueId())){ if (tpa.get(p1.getUniqueId()) != null){ if (p2 != null){ Bukkit.getPlayer(tpa.get(p1.getUniqueId())).teleport(p1); tpa.remove(p1.getUniqueId()); } else { p1.sendMessage(ChatColor.RED+"Gracz do ktorego probowales sie teleportowac jest offline"); } } }else { p1.sendMessage(ChatColor.GOLD+"Nie mozesz uzyc tej komedy, poniewaz nikt nie probowal sie do ciebie teleportowac"); } }else if (commandLabel.equalsIgnoreCase("tpdeny")){ if (tpa.containsKey(p1.getUniqueId())){ if (Bukkit.getPlayer(tpa.get(p1.getUniqueId())) != null){ Bukkit.getPlayer(tpa.get(p1.getUniqueId())).sendMessage("Odrzucilesc prosbe teleportacji gracza "+p1.getName()); p1.sendMessage("Gracz "+tpa.get(p1.getName())+" Odrzucil twoja prosbe teleportacji"); }else { p1.sendMessage(ChatColor.RED+"Gracz do ktorego probowales sie teleportowac jest offline"); } }else { p1.sendMessage(ChatColor.GOLD+"Nie mozesz uzyc tej komedy, poniewaz nikt nie probowal sie do ciebie teleportowac"); } } return false; } } Odnośnik do komentarza https://skript.pl/temat/40075-problem-z-komenda-tpa/#findComment-250663 Udostępnij na innych stronach Więcej opcji udostępniania...
0 kerpson 551 Opublikowano 24 czerwca 2020 Udostępnij Opublikowano 24 czerwca 2020 Nie lepiej zrobić 3 osobne komendy, i jakiegoś utila ? Np coś takiego: public class TpaManager { private final Cache<UUID, UUID> tpa; public TpaManager() { this.tpa = CacheBuilder.newBuilder().expireAfterWrite(60, TimeUnit.SECONDS).build(); } public void addRequest(UUID uuid, UUID uuid1) { this.tpa.asMap().put(uuid1, uuid); } public void removeRequest(UUID uuid) { this.tpa.asMap().remove(uuid); } public Player getPlayer(UUID uuid) { return Bukkit.getPlayer(this.tpa.asMap().get(uuid)); } } W main: public class Main extends JavaPlugin { private TpaManager tpaManager; @Override public void onEnable() { this.tpaManager = new TpaManager(); } public TpaManager getTpaManager() { return this.tpaManager; } I tu przykład z mojego tpa: https://imgur.com/a/TWr7rPc (zamień CorePlugin na nazwę z twoje glównej klasy, ja korzystam z klasy Command, ale tu chodzi o przykład działania ) Odnośnik do komentarza https://skript.pl/temat/40075-problem-z-komenda-tpa/#findComment-250665 Udostępnij na innych stronach Więcej opcji udostępniania...
Pytanie
rozumek29 13
Witam, dopiero się uczę programować zarówno w javie, więc proszę o wyrozumiałość jeśli okażę się że są jakieś rażące błędy.
Jest ktoś w stanie powiedzieć dlaczego nie teleportuję gracza, po zaakceptowaniu prośby ?
Odnośnik do komentarza
https://skript.pl/temat/40075-problem-z-komenda-tpa/Udostępnij na innych stronach
3 odpowiedzi na to pytanie
Rekomendowane odpowiedzi