• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Plugin pod bukkit] zatrzymywanie pluginu po ruszeniu się

Object Storage Arubacloud
0 głosów
416 wizyt
pytanie zadane 30 grudnia 2016 w Java przez Stami Gaduła (3,790 p.)

Witam, troszkę ogarnąłem pisanie pluginów w bukkit (minecraft). Teraz pisze plugin dla mojego serwera. Ma za zadanie po prostu teleportować gracza po wpisaniu komendy i poczekaniu 3 sekund. (Przy okazji teleportuje gracza zależnie od danej permisji (która określa drużyne (które sobie wymyśliliśmy na serwerze)) dlatego nie może być to plugin normalnie pobrany z internetu).

Niestety nie wiem jak przerwać wykonywanie się pluginu po ruchu gracza.

 

Player zmienna = (Player)sender; Pobiera dane kiedy gracz wpisuje komendę

Wykminiłem że można zrobić tak:

Player zmienna2 = Bukkit.getPlayer(zmienna.getName());   Wywołuje to za każdym razem w pętli (kod na dole) lecz pobiera kordynaty takie same jak w wcześniejszym wariancie.

 

Kod (tylko ten który coś robi):   /  kod na wklejce (czytelniejszy): http://wklejaj.pl/7443

if(sender.hasPermission("ho.szymon"))
						{
							World w = Bukkit.getWorld("survival");
							Location l = new Location(w, -502, 68, -396);
							Player cel = (Player)sender;
							sender.sendMessage("gracz: " + cel);
							//Location p = new Location(cel.getLocation().getWorld(), cel.getLocation().getX(), cel.getLocation().getY(), cel.getLocation().getZ());
							double xs = cel.getLocation().getX();
							double ys = cel.getLocation().getY();
							double zs = cel.getLocation().getZ();
							double xz;
							double yz;
							double zz;
							
							sender.sendMessage("x = " + xs);
							sender.sendMessage("x = " + ys);
							sender.sendMessage("x = " + zs);
							
							Player zp;
							//czekanie
							try 
							{
								sender.sendMessage("§9Nie ruszaj się przez §43 sekundy §9aby teleportacja została dokonana!");
								for(int i = 0; i <= 3; i++)
								{
									zp = Bukkit.getPlayer(cel.getName());
									Thread.sleep(1000); 
									xz = zp.getLocation().getX();
									yz = zp.getLocation().getY();
									zz = zp.getLocation().getZ();
									//Location s = new Location(cel.getLocation().getWorld(), cel.getLocation().getX(), cel.getLocation().getY(), cel.getLocation().getZ());
									if(xz != xs || yz != ys || zz != zs)
									{
										sender.sendMessage("§4Poruszyłeś się! Teleportacja nie została wykonana!");
										return false;
									}
									sender.sendMessage("§b//for -------------------------------");
									sender.sendMessage("x = " + xz);
									sender.sendMessage("x = " + yz);
									sender.sendMessage("x = " + zz);
									sender.sendMessage("§b//for -------------------------------");
								
								}
								
							} 
							catch(InterruptedException ex) 
							{
							    sender.sendMessage("§4Błąd krytyczny!");
							    sender.sendMessage("§4Błąd: §7catch został uruchomiony w sekcji czekania");
							    sender.sendMessage("§4Skontaktuj się z administracją! §6(§bKubek§6/§bKubSu§6)");
							    return false;
							}
							//END czekanie
							((Player)sender).teleport(l);
							sender.sendMessage("§2Pomyślnie zakończenie teleportacji§b!");
							return true;
						}

 

2 odpowiedzi

0 głosów
odpowiedź 2 stycznia 2017 przez PsyLisek Użytkownik (570 p.)

Niestety nie znam się na programowaniu Bukkita, ale mogę postarać się podpowiedzieć z samym kodem.
Nie sądzisz, że sprawdzanie 1s to jak na grę bardzo dużo czasu? A drugą rzeczą, która mi się w tym kodzie nie podoba jest to, że najpierw czekasz sekundę, a później pobierasz koordynaty i od razu sprawdzasz.

 for(int i = 0; i <= 30; i++)
{
zp = Bukkit.getPlayer(cel.getName());
xz = zp.getLocation().getX();
yz = zp.getLocation().getY();
zz = zp.getLocation().getZ();
Thread.sleep(100); 
//Location s = new Location(cel.getLocation().getWorld(), cel.getLocation().getX(), cel.getLocation().getY(), cel.getLocation().getZ());
if(xz != xs || yz != ys || zz != zs)
{
sender.sendMessage("§4Poruszyłeś się! Teleportacja nie została wykonana!");
return false;
}

 

Mam nadzieję, że choć troszkę pomogłem. Napisz czy kod działa :)

komentarz 6 stycznia 2017 przez Stami Gaduła (3,790 p.)
Co do opóźnienia to zrobiłem taką, gdyż plugin jest przeznaczony tylko do użytku prywatnego. Może być tak sprawdzane, bo nikt się nie uczepi, a zasoby chociaż trochę uda się zaoszczędzić (dobra, słaby argument).

Ogólnie nie zadziała, bo (dowiedziałem się) getLocation() ma dziwne zachowanie
0 głosów
odpowiedź 6 stycznia 2017 przez Marcin2000Xpl Gaduła (3,250 p.)

Powinieneś to zrobić zupełnie inaczej. Niepotrzebnie sprawdzasz to już w samej funkcji. Dodatkowo też niepotrzebnie tworzysz kolejny obiekt gracza, gdyż lokalizację można pobrać też ze zmiennej "cel". A także niepotrzebnie tworzysz zmienną lokalizacji w funkcji, skoro dla każdego gracz będzie taka sama, możesz zrobić globalną zmienną. Pomijając wszystkie te błędy, najlepiej jest to wykonać na opóźnionych zadaniach.

// Zmienna przechowująca zadania.
Map<Player, Integer> pending=new HashMap<Player, Integer>();

// Tworzenie opóżnionego zadania.
int task = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, 
  new Runnable() {
    @Override
    public void run() {
      // Kod
    }
  }, 60L); // Jedna sekunda to 20L. Przyrostek "L" oznacza zmienną typu long
  
// Przypisanie zadania do gracza.
pending.put(player, task);

// Anulowanie opóżnionego zadania.
Bukkit.getServer().getScheduler().cancelTask(task);

// Przykładowe tworzenie opóżnionego zadania.
int task = Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, 
  new Runnable() {
    @Override
    public void run() {
      player.teleport(location);
      pending.remove(player);
      player.sendMessage("§2Pomyślnie zakończono teleportację§b!");
    }
  }, 60L);
  
// Przykładowe wydarzenie, gdy gracz się poruszy. Nie zostaje wywołane przy obrocie kamery!
@EventHandler
public void onMove(PlayerMoveEvent event){
  Player p=event.getPlayer();
  if(pending.containsKey(p)){
    if(!event.getFrom().getBlock().equals(event.getTo().getBlock())){
      Bukkit.getServer().getScheduler().cancelTask(pending.get(p));
      pending.remove(p);
      p.sendMessage("§4Poruszyłeś się! Teleportacja nie została wykonana!");
    }
  }
}

Mam nadzieję, że pomogłem wink

komentarz 6 stycznia 2017 przez Stami Gaduła (3,790 p.)

Cały bałagan w kodzie, wynika z tego, że pisałem ten kod już w depresji... Snułem teorie, że może zmienna się blokuje itp. Co do kodu co napisałeś, to sobie go przeanalizuje i zobaczę czy działa smiley

komentarz 7 stycznia 2017 przez Marcin2000Xpl Gaduła (3,250 p.)
Zmienna się nie blokowała tylko ty użyłeś do tego usypiania wątku. Usypiając taką metodą wątek zawieszasz cały serwer i nie aktualizuje on twojej lokalizacji. Gdybyś ustawił ten czas na ok. 10 sekund to by cię prawdopodobnie wywaliło z serwera z powodu braku połączenia.

Podobne pytania

0 głosów
1 odpowiedź 597 wizyt
pytanie zadane 5 grudnia 2018 w Java przez Bartosz Paterek Początkujący (410 p.)
0 głosów
2 odpowiedzi 365 wizyt
pytanie zadane 25 stycznia 2021 w Nasze projekty przez Bakkit Dyskutant (7,600 p.)
0 głosów
3 odpowiedzi 4,288 wizyt
pytanie zadane 11 czerwca 2016 w Offtop przez zkkf56 Dyskutant (8,710 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...