Skocz do zawartości

GotoFinal

Użytkownik
  • Ilość zawartości

    284
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    5

Treść opublikowana przez GotoFinal

  1. Musisz udostępnić plik na dropboxie i użyć wygenerowanego linku do udostępniania... bo tak to wkleiłeś linka co każdemu będzie próbował znaleźć ten plik na własnym koncie Dobra, poprawiłeś link, i jest to czego się obawiałem: @EventHandler public void onPlayerMove(PlayerMoveEvent e) { for (int x = 0; x < this.block.length; x++) { if (e.getTo().getBlock().getRelative(BlockFace.DOWN).getType() == Material.valueOf(this.block[x].toUpperCase())) { for (Player p : Bukkit.getServer().getOnlinePlayers()) { e.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 3, this.speed[x] - 1)); } } if ((e.getTo().getBlock().getRelative(BlockFace.SELF).getType() == Material.valueOf(this.block[x].toUpperCase())) && (Material.valueOf(this.block[x].toUpperCase()) == Material.GRASS_PATH)) { for (Player p : Bukkit.getServer().getOnlinePlayers()) { e.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 3, this.speed[x] - 1)); } } } } Taki kod w evencie od ruchu to słaby pomysł, even od ruchu bardzo obciąża serwer bo wykonuje się wiele razy w ciągu sekundy dla każdego gracza. Do tego ten kod nie ma sensu, z jakiegoś powodu robisz tam pętlę po graczach i nawet nie używasz tych graczy z pętli, tam nie powinno być tej pętli - nadajesz efekt graczu tyle razy ilu jest graczy na serwerze online to nie ma sensu. Tak samo słabym pomysłem jest operowania na stringach w takich eventach "Material.valueOf(this.block[x].toUpperCase())" nie ma żadnej potrzeby by coś takiego robić, możesz przygotować to w onEnable, tak by mieć od razu gotowe Material. Do tego w material jest specjalna metoda od szukania po nazwie - sprytniejsza bo robi więcej dodatkowych rzeczy by zwiększyć szansę na znalezienie bloku. Ogólnie najlepiej by było zrobić taska który np co sekundę sprawdza na jakim bloku stoi każdy gracz i odpowiednio mu nadać efekt, do tego same efekty możesz trzymać w mapce Map<Material, Integer> gdzie klucz to ten typ bloku a wartość to poziom efektu - więc nie musisz robić pętli po wszystkich. Na dalsze optymalizacje można podzielić te skanowanie by np sprawdzać X graczy co tick, tak by nie sprawdzać np 500 graczy na raz na większych serwerach, ale to jednak nie powinno być problemem z tak prostą operacją, a dobre podzielenie to jednak sporo roboty, więc można się obejść bez tego.
  2. ale w tym pomie jest tylko spigot api, więc jak ci dodało dobrze samego spigota? A tak to zobacz czy to pomaga: I zobacz czy są jakieś błędy przy buildzie mavena:
  3. Ponieważ aplikacje nigdy nie łączą się z bazą danych po stronie clienta, tylko wysyłają odpowiednie zapytania na serwer - np po http. (ale może być to jakieś własne połączenie na socketach itd, ale po http chyba najpopularniejsze)
  4. nie podawaj publicznie hasła do bazy.... A tak to nie używaj stringów do operacji na bazie danych, użyj PreparedStatement, masz przykłady: https://www.javatpoint.com/PreparedStatement-interface No i od razu mówie że to nie będzie wydajna baza, np klucz masz jako uuid i to jako varchar 100 znakowy, gdzie UUID może być zapisane binarnie jako 16 bajtów. Do tego trzymasz graczy w liśćie co nie ma sensu, bo by pobrać ich po nazwie to musisz po wszystkim iterować, od tego są mapy. sb.append("'" + u.getPkt() +"'"); // nie ma przecinka sb.append("'" + u.getNewPkt() +"'"); sb.append(") ON DUPLICATE KEY UPDATE "); sb.append("name='" + u.getName() +"',"); sb.append("lvl='" + u.getLvl() +"',"); sb.append("coinsy='" + u.getCoinsy() +"',"); sb.append("pkt='" + u.getPkt() +"';"); // dałeś średnik zamiast przecinka sb.append("newpkt='" + u.getNewPkt() +"';"); z prepared statement nie byłoby takich problem a kod byłby bezpieczniejszy i czytelniejszy.
  5. yep
  6. a ile płacisz? ( ͡º ͜ʖ͡º) Niezbyt mam czas ani ochotę się bawić, ale nie ma tam nic trudnego, wybiera się jakiś item, np motykę złotą i na różne poziomy jej zniszczenia tworzy się customowe tekstury/modele i potem ustawia się to jako głowę/item w ręce i steruje pozycją i rotacją armorstanda i jego kończyn
  7. no da się, tylko będzie słabiej wyglądać - chyba że zrobi się to odpowiednio nisko, tak by pakiet o armorstandzie wysyłać z każdym pakietem o zmiane pozycji gracza, wtedy będzie ciut lepiej - ale dalej nie idealnie, bo pozycje klient poprawia trochę sam. za 20$/h jak sam zrobisz model skrzydeł to tak ( ͡º ͜ʖ͡º) Tamte paczki na dronie kosztowały 110$ - a klient dostarzył gotowego resource packa z modelami
  8. nie wiem jakie to są, ani co to jest bp, ale można sporo osiągnąć customowymi resource packami i armor standami, np ostatnio robiłem takiego drona ze zlecenia: Potem z niego wyskakiwały różne inne animacje, jak właśnie armor stand z skrzydłami - wszystko na customowych txt. Innym wyjściem to są już mody, ale to wymaga modyfikacji clienta.
  9. no jak gracz wyjdzie to możesz go z tej mapy usunąć - i jak chcesz liczyć kompletny czas online to musisz też to zapisywać do jakiegoś pliku lub bazy bo przecież bungee może być gdzieś resetowane, paść itd. np czasy wejścia i wyjścia każdego gracza w bazie i wtedy pobierasz i podliczasz cały czas - lub tylko zapisywać kompletny czas do bazy/pliku, no ale daty mogą być pomocniejsze, możesz potem więcej stworzyć, np czas online w ostatnim tygodniu itd.
  10. No widzisz, bungee to już nie taka prosta apka jak spigot, tutaj istnieje wiele wątków, a HashMapa to skomplikowany typ danych - w środku jest całkiem sporo logiki, i gdyby 2 wątki jednocześnie chciały coś na niej zarobić, np oba dodać lub jeden dodać a drugi odczytać - to mogłoby się dziać dziwne rzeczy, więc w domyślne kolekcje javy są zbudowane zabezpieczenia które upewniają się że takie błędy nie wystąpią - zamiast tego jest wyrzucony wyjątkiem będący znakiem dla developera że spie po całości. I u ciebie jest też drugi problem, bo z tego samego powodu nie można edytować kolekcji w trakcie iteracji po niej - bo dodając element też można zmienić się wewnętrzna struktura danych i kolejność iteracji mogłaby nie zostać zachowana. Do tego nie ogarniam po co robisz: players.remove(p); players.put(p, i); możesz zostawić samo put, a najlepiej to... Zapisać czas wejścia na serwer i tylko obliczać ile gracz już jest na serwerze - taki task tylko niepotrzebne zamula i powoduje problemy. Do tego wtedy albo należy użyć mapy synchronizowanej, albo concurrent, w synchronizowanej wątki będą czekać aż inny skończy robić swoje z mapą - co może spowolnić wątek, ale bardzo mało i zazwyczaj nie ma to znaczenia znacznego, a concurrent pozwala na edycje z wielu wątków - jednak mogą wystąpić drobne problemy, np jak doda się element w trakcie interacji po mapie - nawet w tym samym wątku - to nie masz żadnej pewności czy ten element też będzie iterowany w tej pętli. czyli np masz mapę z kluczami [d,b,a,c] (pamiętaj że kolejność też nie jest gwarantowana w hash mapie, tutaj przykładowa), iterujesz i w momencie jak jesteś na "b" to dodajesz jeszcze element z kluczem "e" i "f", i teraz cała pętla np przeiteruje po [d,b,a,c,f] - czyli tutaj bez "e" bo algorytm hashmapy dodał ten element przed "b". Dodatkowo concurrent zjada więcej pamięci.
  11. yhym, to pewnie event wykonuje się 2x - z tego co kojarzę chodziło o rękę - musisz sprawdzić czy event.getHand() == EquipmentSlot.HAND\ Bo teraz w mc są dwie ręcę - główna i poboczna - i event wykonuje się 2x dla obu rąk - bo minecraft traktuje tę interakcje jako osobną dla obu rąk
  12. jeżusz maria, naucz się formatowac kod bo tego się nie da czytać, w eclipse: Ctrl + Shift + F, w jednym prawdziwym IDE - intellij: ctrl alt l I wtedy wklej jeszcze raz, bo tak to gówno widać.
  13. pokaż cały kod, bo niby wygląda ok. Może upewnij się jakimś prostym player.sendMessage że kod nie wykonuje się 2x?
  14. no to jak i tak musisz coś zmienić, to jest masa pluginów od tego na spigocie, i niektóre pewnie mają nawet kod na githubie, więc możesz wygodniej edytować i dodac co chcesz, a może nawet znajdziesz to już w środku. Szybciej, lepiej.
  15. chodzi o komendy? musisz ręcznie sprawdzać czy array argumentów zawiera taki argument i tyle
  16. nie rozumiem twojego pytania.... pisząc plugin wykraczający za API wybierasz silnik pod jaką wersje ma działać i tyle, nie ma żadnych ale.
  17. no musisz napisać pod dokładnie .jar tego silnika, użyć go jako biblioteki itd
  18. ... zdecyduj się może na jaką wersje serwera to piszesz, jak chcesz używać rzeczy których nie ma w api, czyli wszelkie package net.minecraft.server lub org.bukkit.craftbukkit to kod jest tylko na jedną wersje serwera - określoną w package, np v1_12_R1, kod z takim importem nie zadziała na żadnej innej wersji silnika. Więc dodaną masz mieć tylko jedną - tę na której stoi serwer
  19. no bo na 1.12 nie ma takiej funkcji, co z tego że dodałeś inne, nawet jak skompilujesz jakimś cudem - to przecież wywali błąd w trakcie pracy serwera jak nie znajdzie tej funkcji.
  20. No gdzie, przecież CraftPlayer to element craftbukkita, import będzie taki jak podałem, tylko wersje trzeba uzupełnić. W wersji nie ma też ostatniej cyferki 1.12.2 <-, tylko właśnie od razu R1/R2 itd
  21. no zdecydowanie zły import... on jest gdzieś w org.bukkit.craftbukkit.{ver}.entity.CraftPlayer gdzie {ver} zależy od wersji silnika więc musisz poszukać
  22. No to dodaj import do CraftPlayer
  23. no nie masz zaimportowanego CraftPlayer (do tego jest też wymagany spigot/craftbukkit w dependach/bibliotekach, samo API nie wystarczy)
  24. no ale jaki masz problem?
  25. Tylko główna klasa może rozszerzać JavaPlugin
×
×
  • Dodaj nową pozycję...