Skocz do zawartości
  • 0

problem z komenda tpa


rozumek29

Pytanie

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
Udostępnij na innych stronach

3 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

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 przez kerpson
Odnośnik do komentarza
Udostępnij na innych stronach

  • 0

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
Udostępnij na innych stronach

  • 0

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
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

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