-
Ilość zawartości
284 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
5
Treść opublikowana przez GotoFinal
-
ale coś więcej? czym jest cmdg? a tak to if(getConfig().getConfigurationSection("Locations." + cmdg) != null){ if(cmdg.equals(getConfig().getConfigurationSection("Locations." + cmdg))){ powinno być jednym ifem z isConfigurationSection + ogólnie nie powinno się tak tego robić, tylko na starcie pluginu wczytać wszystkie lokacje do jakiś wygodniejszych obiektów
-
[Java][Android]Jak zainstalować te chore SDK?
GotoFinal odpowiedział(a) na Wakal pytanie w Pytania i problemy
Instalujesz Android Studio - lub możesz użyć Intellij i dodać pluginy od androida jak jeszcze nie masz - i instalujesz w ustawieniach -
@4RNI pokaż w takim razie co stworzyłeś, config i kod jaki używasz - i zaznacz te brakujące linijki co bym miał pewnośc że rozumiem
-
Nie możesz tak po prostu castować sobie z dupy rzeczy, skąd taki dziwny pomysł? e to zmienna eventu... i tylko eventu, nigdy nie będzie żadnym projectile... https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/entity/EntityShootBowEvent.html Musisz użyć metody od pobrania projectile, dodatkowo zauważ że zwraca ona Entity, więc nie możesz ot-tak castnąć wtedy do projectile, tylko musisz sprawdzić czy to entity jest projectile, jak nie - to pominąć ten event i tyle. Do tego shooter nie koniecznie musi być graczem... to może być nawet blok. Więc po użyciu getShooter też musisz sprawdzić czy to gracz i dopiero wtedy się bawic.
-
no idealnie tak to niezbyt, bo nie masz tu konkretnego node na wiadomość, możesz za to tak: VIP: command: "pex user {GRACZ} group set VIP" message: |2- &8&m--------&8[ &9&lItemShop &8]&m-------- &7Gracz &f{GRACZ} &7zakupil usluge w naszym sklepie &7Zakupiona usluga: &fVIP &7Koszt zakupionej uslugi: od &f4 PLN &8&m--------&8[ &9&lItemShop &8]&m-------- i wtedy możesz spokojnie wczytać "message" jako jeden string i będzie już miał wszystkie linijki itd. czyli config.getString("VIP.message")
-
no bo w środku tego nie masz dostępu do tej zmiennej, tam musisz odwołać się do "this" tylko też "this" odwołuje się tam do instancji BukkitRunnable nie BukkitTask, ale możesz pobrać ID tasku i wtedy znaleźć w schedulerze danego taska. Z tym że sensowniej byłoby chyba dodawać task do mapy za taskiem
-
użyj BukkitRunnable, znacznie wygodniejsze do takiej zabaw new BukkitRunnable(){ @Override public void run() { System.out.println("Z tasku"); this.cancel(); // i anulowany } }.runTaskTimer(plugin, 0, 20); możesz też przypisać do zmiennej i anulować kiedy chcesz z innego miejsca: BukkitTask printTask = new BukkitRunnable() { @Override public void run() { System.out.println("Z tasku"); this.cancel(); // i anulowany } }.runTaskTimer(plugin, 0, 20); // w innym miejscu: printTask.cancel();
-
jak robisz takie mapki po graczach to musisz też usuwać te dane w PlayerQuitEvent inaczej będziesz miał wycieki pomięci. (musisz usunąć wszystkie pary gdzie gracz który wyszedł jest albo kluczem, albo wartością) a zamiast bitwa.get(hit) != null można użyć bitwa.containsKey(hit) Dodatkowo raczej powinieneś nazywać wszystko po angielsku, żeby nie mieszać języków w kodzie bo to nie ma sensu i brzydko wygląda. no i nie nazywać zmiennych z dużej litery jak "TaskID" A tak to nie wiem jak ma działać ten twój kod, więc trudno mi powiedzieć dlaczego nie działa... opisz coś więcej co robisz i jak ma to działać, bo kod piszesz na tyle brzydki że trudno coś zrozumieć. @yooniks Używa tego id taska... I nie powinien nic zmieniać na concurrenthashmap, tylko tamten task nie powinien być async @JanekMaSkrypta_ zamiast scheduleAsyncRepeatingTask powinno być po prostu runTaskTimer
-
nie porównuj obiektów za pomocą == tylko użyj .equals() A ten listener ma odpowiednią adnotację @EventHandler ? Oraz jest zarejestrowany? Dodatkowo pamiętaj że v.getKiller może zwrócić nulla.
-
każdy dobrze napisany kod obiektowy jest łatwy do pracy w zespole, trudno tu o jakieś konkretne wzorce jeśli chodzi ci o bukkita itd, bo większość wzorców jest z myślą o webdevie czy innych aplikacjach z typowym frontem, do gamedevu popularny jest entity component system, ale minecraft go nie ma, więc średnio idzie go sensownie użyć. Zostaje tylko pisanie dobrego obiektowego kodu, czystego i z dobrym podziałem.
-
Emm, znajdz pełny log, nie jestem teraz pewien gdzie będzie, albo gdzieś w instalacji, albo w katalogu tego typu: C:\Users\Admin\.IntelliJIdea2018.1\system\log oczywiście dostosuj wersję i nazwę użytkownika. poklikaj też na te błędy, bo często da się zobaczyć log/stacktrace bezpośrednio z IDE o tutaj: I wklej wtedy co tam masz, ale zgaduje że to jakieś problemy z uprawnieniami programu czy coś takiego - i np system nie pozwala intellij stworzyć nowego pliku.
-
no to najwidoczniej twoja instalacja jest nie jest w C:\Program Files\Java\ jdk1.8.0_101\bin wejdz do program files i poszukaj poprawnej ścieżki
-
i jak wpiszesz w konsolę "C:\Program Files\Java\ jdk1.8.0_101\bin\javac" to działa? (razem z cytatami musisz wpisać), jak tak to po restarcie okienka cmd już powinno działać samo javac
-
co za dziwne spacje tam masz?
-
@yooniks No ale taki styl jest bardzo prosty example: |- pierwsza linijka druga linijka trzecia linijka Wystraczy tylko zostawić w domyślnym configu przykład z użyciem takiego zapisu
-
@GoblicPL@InawiaczeG1338@yooniks Co wy się tak upieracie na te StringList, toż YAML wspiera wielolinijkowe teksty i to na wiele sposobów: example: 'pierwsza linijka druga linijka trzecia linijka' example: 'pierwsza linijka druga linijka trzecia linijka' example: "pierwsza linijka\ndruga linijka\ntrzecia linijka" example: |- pierwsza linijka druga linijka trzecia linijka example: |4- pierwsza linijka druga linijka trzecia linijka example: pierwsza linijka druga linijka trzecia linijka example: >- pierwsza linijka druga linijka trzecia linijka Wszystkie te dadzą taki sam wynik, czyli jeden string z trzema linijkami tekstu. Dodatkowo małe objaśnienie co do | i >. I oznacza że tekst ma być dokładnie taki jak podany, czyli nowe linijki mają się zachować w pełni, a dla > trzeba dać przerwę by była nowa linijka, inaczej je zwinie do jednej, przydatne dla długich tekstów. Obie te możliwości mają kilka opcji, np dodanie znaku + lub -, oznacza to czy na końcu ma być dodatkowa pusta linijka (jeśli to +), plus jest domyślną wartością. Oraz można też podać indent czyli liczbę spacji, domyślnie jest to ilość spacji taka jak w pierwszej linijce, dzięki temu można dodać wcięcie w wiadomości. I wtedy można wygodnie to wczytać jako jeden string.
-
sformatuj ten kod normlanie bo tego się czytać nie da, losowo masz te wcięcia porobione, każde IDE ma skrót od formatowania, np Ctrl + Alt + L, lub Ctrl + Shift + f
-
Zmienna int, boolean dla danego gracza.
GotoFinal odpowiedział(a) na Wakal pytanie w Pytania i problemy
nie używaj Thread.sleep, nigdzie. Jak używasz tego w wątku serwera to zatrzymuje to cały serwer na ten podany czas... Do tego taką mapkę musiałbyś zapisywać przy zmianach i wczytywać na starcie serwera skoro chcesz tam przechowywać coś na stałe. A przechowywanie po Player w mapce też nie jest dobrym pomysłem - szczególnie jak jesteś początkujący, bo jak dodasz gracza do libki i on wyjdzie z serwera to dalej trzymasz go w mapce - a taki obiekt gracza przechowuje bardzo duże ilości danych, które zamiast zostać usunięte musza być dalej trzymane w pamięci. Lepiej trzymać po UUID. System.out.println("[Poradniki] Enabling..."); System.out.println("[Poradniki] Enabled."); Tego nie potrzebujesz, bukkit sam wysyła takie wiadomości, a do tego System.out się prawie nie używa, masz metodę w JavaPlugin, getLogger().log("wiadomość"); wtedy bukkit sam doda odpowiedni tag [Pluginu] Ale zapisu i odczytu to ja cię tutaj nie nauczę, bo zwyczajnie mi się nie chce, musisz poczytać o YamlConfiguration pod bukkita, na pewno znajdziesz sensowne wyjaśnienia. Ewentualnie zadaj konkretniejsze pytanie wtedy tutaj jak coś nie będzie ci wychodzić. -
Ale nie ogarniam obiektów, wiem do czego są i jakie jest ich przeznaczenie, ale, nie ogarniam po co dawać je w klasie prywatnej coś tu mącisz, klasa definuje typ, a instancja tego typu (czyli klasy) to obiekt. No i w javie z obiektów to korzystamy prawie wszędzie, jak robisz coś statyczego to w większości przypadków robisz to źle, dodatkowo jak robisz wiele mapek po tym samym kluczu - to pewnie też jest to źle, np: private final Map<UUID, Double> playerMoney = new HashMap<>(); private final Map<UUID, Integer> playerPoints = new HashMap<>(); to jest to zdecydowanie źle i do dupy, powinien być użyty właśnie specjalny obiekt: public class MyPluginUser { private final UUID uuid; private double money; private int points; public double getMoney() { return this.money; } // + konstruktor i inne gettery/settery tam gdzie potrzeba i inne metody } i wtedy robi się jedną mapkę UUID -> MyPluginUser. A gettery i settery są dla hermetyzacji, tak że w razie czego możesz np zmienić sposób w jaki przechowujesz punkty a reszta kodu zostaje taka sama, np wyobraź sobie taki kod jak wyżej, oraz ze teraz rezygnujesz ze wspierania pieniędzy w swoim pluginie i przerzucasz to do innego pluginu i zamiast musieć edytować caly plugin zmieniam tylko getter na np: public double getMoney() { return JavaPlugin.getPlugin(InnyPlugin.class).getUsers().getUser(this.uuid).getMoney(); } i kompatybilność zachowana + nie trzeba edytować żadnego innego miejsca w kodzie. Do tego nie nalezy wcale dawać getterów i setterów do wszystkiego, tak na prawdę to tym mniej tym lepiej, a już tym bardziej nie powinno się tworzyć kodu potem tylko na tych getterach/setterach, np mając własny system komend nie powinno się potem sprawdzać czy wpisana komenda jest taka sama jak nazwa komendy lub jej aliasy na np zasadzie: String usedCommand = ...; // to co wpisal gracz jako nazwę komendy for (MyCommand command : myCommands) { // zakladamy że mamy jakąś listę tych komend if (command.getName().equals(usedCommand) || command.getAliases().contains(usedCommand)) { command.use(player, args, cokolwiek); } } Tylko poprawnie MyCommand powinno mieć metodę która sama zrobi te sprawdzenia, więc końcowy kod wygląda tak: String usedCommand = ...; // to co wpisal gracz jako nazwę komendy for (MyCommand command : myCommands) { // zakladamy że mamy jakąś listę tych komend if (command.isMatchingName(usedCommand)) { command.use(player, args, cokolwiek); break; } } Wtedy nawet nie ma potrzeby tworzenia gettera nazwy czy aliasów. (no ale w tym wypadku może się pojawiać potrzeba z innego powodu, np tworzenia listy komend czy coś) A plusem takiego zapisu jest fakt że to już sama komenda definiuje jak powinna być używana, to ona decyduje czy ignoruje wielkość liter czy nie, więc osoba używająca tego juz nie musi o tym myśleć. PS: przechowywanie kasy w double to tak na prawdę średnio dobry pomysł, no ale to tylko gra to nikt prawdziwej kasy nie straci.
-
for (String s : Main.getPlugin(Main.class).getConfig().getStringList("message.sendJoin")) { s = s.replace("&", "§"); s = s.replace("{NICK}", p.getName()); e.setJoinMessage(s); } i to też nie ma sensu, po pierwsze od kolorowania teksu nie używa się replace tylko metody z ChatColor.translate.... A do tego jak masz listę wiadomości to ustawi ci wiadomość wejścia na jej ostatnią linijkę... nie wiem czemu nawet myślałeś że to może działać inaczej. do tego nie widzę sensu używa tutaj listy, YAML wspiera wielolinijkowe teksty.
-
Ale to masz PlayerJoinEvent, to jak chcesz tu ustawić wiadomość wyjścia skoro gracz nie wychodzi...
-
no bo musisz mieć też w klasie pole dla tego "r" i w kontruktorze przypisać https://docs.oracle.com/javase/tutorial/java/javaOO/classes.html
-
Nie używaj mysql bezpośrednio w komendach w głównym wątku serwera, ktoś może spamować komendą i znacznie spowolnić serwer. Do tego nie sprawdzasz czy połączenie dalej jest "żywe" jak serwer długo nic nie będzie robił to połączenie może dostać timeouta i wszystkie kolejne operacja wywalą błędem. Do tego łapiesz sobie SQLException ale nic z nim nie robisz, ot wypisujesz do konosli, a gracz co wpisał komendę nie widzi żadnego outputu i nie wie co się dzieje. Tak samo powinno się uniknąć używnaia MySQL w dowolnych eventach, chyba ze są Async - ale wtedy i tak zazwyczaj lepiej unikać. No i po co aż 100 znaków na nick czy ip? Np by zrobić GUI możesz po wpisaniu komendu rozpoczać task Async i w nim pobrać wszystkie potrzebne dane z MYSQL i je przygotować, i wtedy odpalić kolejny task już sync i otworzyć te EQ z już gotowymi danymi. I tak z każdą komendą co używa jakiejś bazy danych.
- 2 odpowiedzi
-
skąd wy macie pomysły na te bezsensowne kody. Ogólnie to polecam jednak zacząć od jakiś podstaw javy tutaj, bo taka operacja nie ma sensu... niby jak ma zadziałać przypisanie liczby do zmiennej obiektowej? co ma się niby stać? język ma się magicznie domyślić co chcesz osiągnąć? trochę logiki... język niczego się za ciebie nie domyśli. Tak to trudno tu cokolwiek więcej pomóc bo nawet nie opisałeś dobrze co chcesz osiągnąć... my też się nie domyślimy.
-
QuickRoads - Szybsze poruszanie po blokach
GotoFinal odpowiedział(a) na ArduinoKrystian temat w Projekty
no nie za bardzo, bo wstawiłeś tego taska do eventu dalej... To powinno być w np OnEnable, jako task z pętlą po graczach online. coś na zasadzie: new BukkitRunnable() { @Override void run() { for (Player p:Bukkit.getOnlinePlayers()) { Block block = p.getLocation().getBlock().getRelative(0, -1, 0); Integer speed = speedBlocksMap.get(block.getType()); if (speed == null) continue; // null czyli nie ma w mapie // nadanie efektu na np 2 sekundy i tej pobranej mocy } } }.startTaskTimer(this, 10,10); Można by też dodac sprawdzenie by nie nadawać efektu komuś kto już ma speeda o silniejszej mocy, lub napisać sprytniejszy system który to zsumuje na czas bycia na tym innym bloku.
