Stasio 3 Opublikowano 23 marca 2021 Udostępnij Opublikowano 23 marca 2021 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 Więcej opcji udostępniania...
0 Shateq 45 Opublikowano 23 marca 2021 Udostępnij Opublikowano 23 marca 2021 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 Więcej opcji udostępniania...
0 Stasio 3 Opublikowano 23 marca 2021 Autor Udostępnij Opublikowano 23 marca 2021 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 Łączę posty. Notatka dodana przez Glicz Odnośnik do komentarza https://skript.pl/temat/47234-fireball/#findComment-296268 Udostępnij na innych stronach Więcej opcji udostępniania...
0 paweU 64 Opublikowano 23 marca 2021 Udostępnij Opublikowano 23 marca 2021 (edytowane) 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 23 marca 2021 przez paweU Odnośnik do komentarza https://skript.pl/temat/47234-fireball/#findComment-296373 Udostępnij na innych stronach Więcej opcji udostępniania...
0 Stasio 3 Opublikowano 23 marca 2021 Autor Udostępnij Opublikowano 23 marca 2021 Dzięki za objaśnienie jutro to przetestuje naprawdę mnie ratujesz thx paweU 1 Odnośnik do komentarza https://skript.pl/temat/47234-fireball/#findComment-296395 Udostępnij na innych stronach Więcej opcji udostępniania...
0 paweU 64 Opublikowano 23 marca 2021 Udostępnij Opublikowano 23 marca 2021 Godzinę temu, Stasio napisał: Dzięki za objaśnienie jutro to przetestuje naprawdę mnie ratujesz thx Do usług Odnośnik do komentarza https://skript.pl/temat/47234-fireball/#findComment-296427 Udostępnij na innych stronach Więcej opcji udostępniania...
0 paweU 64 Opublikowano 31 marca 2021 Udostępnij Opublikowano 31 marca 2021 Problem został rozwiązany. Odnośnik do komentarza https://skript.pl/temat/47234-fireball/#findComment-298004 Udostępnij na innych stronach Więcej opcji udostępniania...
Pytanie
Stasio 3
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