Skocz do zawartości
  • 0

Fireball


Stasio

Pytanie

Witam. W jaki sposób moge sprawdzić czy fireball dotyka ziemi a następnie wykonać eksplozje mój obecny kod

		if(e.getAction() == org.bukkit.event.block.Action.LEFT_CLICK_AIR || e.getAction() ==org.bukkit.event.block.Action.LEFT_CLICK_BLOCK) {
			if(p.getInventory().getItemInMainHand().equals(wand)) {
				
				Fireball f = (Fireball) p.getWorld().spawnEntity(p.getEyeLocation().add(p.getEyeLocation().getDirection()), EntityType.FIREBALL);
				f.setVelocity(p.getLocation().getDirection().multiply(3));
				
					f.getWorld().createExplosion(f.getLocation(), 10f);		
					p.sendMessage("EKSPLOZJA!");					

				
			}
		}

 

Odnośnik do komentarza
https://skript.pl/temat/47234-fireball/
Udostępnij na innych stronach

6 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
35 minut temu, Stasio napisał:

Witam. W jaki sposób moge sprawdzić czy fireball dotyka ziemi a następnie wykonać eksplozje mój obecny kod


		if(e.getAction() == org.bukkit.event.block.Action.LEFT_CLICK_AIR || e.getAction() ==org.bukkit.event.block.Action.LEFT_CLICK_BLOCK) {
			if(p.getInventory().getItemInMainHand().equals(wand)) {
				
				Fireball f = (Fireball) p.getWorld().spawnEntity(p.getEyeLocation().add(p.getEyeLocation().getDirection()), EntityType.FIREBALL);
				f.setVelocity(p.getLocation().getDirection().multiply(3));
				
					f.getWorld().createExplosion(f.getLocation(), 10f);		
					p.sendMessage("EKSPLOZJA!");					

				
			}
		}

 

Sprawdzać czy dotyka ziemi byłoby głupio, lepiej dodaj fireballa do gracza (HashMap) i sprawdzać co x ticków, czy fireball istnieje (zniknie jeśli eksploduje), jeśli nie to wtedy wysyła wiadomość do gracza.

Odnośnik do komentarza
https://skript.pl/temat/47234-fireball/#findComment-296267
Udostępnij na innych stronach

  • 0
8 godzin temu, Stasio napisał:

hymm okej spróbuje ale nie ogarniam zbytnio hasmap ale tak jak mówię spróbuje 

 

Dobra nie mam pojęcia jak to napisać xd

 

 

Spieszę z wytłumaczeniem. 

Na początku polecam stworzyć sobie obiekt "User". W tym celu stwórz proszę klasę o nazwie "User". Najlepiej umieść ją w package o nazwie "object". 

Następnie wklej proszę do tej klasy ten kod:

ConcurrentSet jest miejscem gdzie będziesz przechowywał wszystkie rzucone przez gracza fireballe. Dlaczego nie zwykły Set? Ponieważ w tasku (do którego zaraz przejdę) byłaby linijka przez którą wyrzucałoby Ci błędy w konsoli "ConcurrentModificationException". 

 

Dodatkowo stwórz sobie package o nazwie "manager" i stwórz klasę o nazwie "UserManager" a następnie wklej tam nastepujący kod:

 

HashMap'a jest miejscem w którym będziesz przechowywał dane wszystkich graczy na serwerze. Dane z obiektu User

 

Teraz stwórz sobie package o nazwie "task" i stwórz w nim klasę o nazwie np. "FireballTask". Następnie wklej do niej nastepujący kod:

 

Co to jest task i co w tym przypadku wykonuję? 

Task co dokładnie pół sekundy sprawdza u każdego gracza po kolei wszystkie fireballe jakie rzucił a następnie weryfikuje czy na świecie jest jeszcze fireball który został rzucony przez gracza. Jesli nie ma to znaczy, że zniknął ze świata co jednocześnie oznacza, że po prostu wybuchł. W momencie gdy fireballa nie ma na świecie, usuwamy fireballa z obiektu User żeby niepotrzebnie nie zapychał nam RAM'u, a następnie wysylamy do gracza powiadomienie o eksplozji. 

Skoro już jesteśmy przy tasku to troszkę objaśnię. Task jest asynchroniczny co oznacza, że nie będzie obsługiwany przez jeden wątek procesora, a przez oddzielny dzięki czemu nie będzie to w skrócie zamulało serwera. Dlatego też w obiekcie "User" zrobiliśmy sobie "ConcurrentSet", ponieważ w tasku asynchronicznym sypałoby nam błędami ConcurrentModificationException gdyby był to zwykły Set, a że zależy nam na wydajności to warto aby ten task był asynchroniczny. 

 

W listenerze od interakcji gracza dodaj sobie tą linijke tam po linijce z ustawianiem velocity.

 

   user.getFireballs().add(f);

 

Następnie przejdź do głównej klasy i dodaj w onEnable to:

   new FireballTask().start();

Ta linijka odpowiada za rejestracje taska :)

 

Jeśli w klasie z taskiem masz błędy z "Main.getInst()" to na początek klasy głównej (w moim przypadku Main" dodaj:

 

    private static Main inst;

    public static Main getInst(){
        return inst;
    }

    public void onLoad(){
        inst = this;
    }

Jeśli Twoja klasa główna ma inną nazwę to zamień wszędzie "Main" na nazwę swojej klasy.

 

Jeśli wszystko zrobiłeś to skompiluj i zrestartuj serwer :) W razie jakichkolwiek pytań odezwij się w wiadomości prywatnej

 

Pozdrawiam

Edytowane przez paweU
Odnośnik do komentarza
https://skript.pl/temat/47234-fireball/#findComment-296373
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ę...