Skocz do zawartości
  • 0

problem z komenda tpa


rozumek29
 Udostępnij

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

Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!

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:

Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!

(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.
 Udostępnij

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

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