-
Ilość zawartości
284 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
5
Treść opublikowana przez GotoFinal
-
QuickRoads - Szybsze poruszanie po blokach
GotoFinal odpowiedział(a) na ArduinoKrystian temat w Projekty
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. -
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:
-
Maskowanie informacji do połączenia z bazą.
GotoFinal odpowiedział(a) na KrejzolekPRO temat w Projekty
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) -
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.
-
Jak zrobic skrzydla? Takie jak na bp
GotoFinal odpowiedział(a) na Trumpek pytanie w Pytania i problemy
yep- 11 odpowiedzi
-
Jak zrobic skrzydla? Takie jak na bp
GotoFinal odpowiedział(a) na Trumpek pytanie w Pytania i problemy
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- 11 odpowiedzi
-
Jak zrobic skrzydla? Takie jak na bp
GotoFinal odpowiedział(a) na Trumpek pytanie w Pytania i problemy
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- 11 odpowiedzi
-
Jak zrobic skrzydla? Takie jak na bp
GotoFinal odpowiedział(a) na Trumpek pytanie w Pytania i problemy
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.- 11 odpowiedzi
-
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.
-
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.
-
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
-
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ć.
-
pokaż cały kod, bo niby wygląda ok. Może upewnij się jakimś prostym player.sendMessage że kod nie wykonuje się 2x?
-
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.
-
Pytanie o argument w listenerze
GotoFinal odpowiedział(a) na Killeerek01 pytanie w Pytania i problemy
chodzi o komendy? musisz ręcznie sprawdzać czy array argumentów zawiera taki argument i tyle -
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.
-
no musisz napisać pod dokładnie .jar tego silnika, użyć go jako biblioteki itd
-
... 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
-
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.
-
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
-
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ć
-
No to dodaj import do CraftPlayer
-
no nie masz zaimportowanego CraftPlayer (do tego jest też wymagany spigot/craftbukkit w dependach/bibliotekach, samo API nie wystarczy)
-
no ale jaki masz problem?
-
Tylko główna klasa może rozszerzać JavaPlugin
