-
Ilość zawartości
718 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
15
Treść opublikowana przez LeviBoyPL
-
Dzieje się tak dlatego, że nie możesz edytować gracza z asynchronicznego wątka (btw kolega dobrze Ci mówił, że problem nie polega na edytowaniu gracza, a na tym jak to robisz). Żeby móc edytować gracza, kod async musisz wykonać w głównym wątku, tworząc nowy BukkitRunnable z użyciem metody .runTask lub .runTaskLater Polecam Ci poczytać też trochę na ten temat https://xyproblem.info/ bo masz duże problemy z opisywaniem tego czego potrzebujesz. Do tego zrażasz do siebie osoby, które próbują Ci pomóc, tylko dla tego, że nie podały Ci gotowego rozwiązania na tacy. Nie na tym polega programowanie.
-
https://helpch.at/docs/1.8.8/org/bukkit/entity/Player.html#sendTitle(java.lang.String, java.lang.String) Co do tematu, jeżeli chcesz, żeby Twoja komenda była handlowana jako pierwsza musisz użyć PlayerCommandPrerocessEvent https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/PlayerCommandPreprocessEvent.html to się dzieje PRZED wykonaniem komendy, więc raczej szedłbym w tym kierunku
-
Zaproś mnie na discordzie Skay#7888, tutaj już za duży spam leci
-
Dobra to wrzuć logi tutaj i powiem Ci co jest nie tak
-
Sprawdzaj błędy w konsoli, event nazwałeś zmienną e, a playera pobierałeś ze zmiennej event, zmień event na e w linijce zaczynającej się na Player player = ..
-
@EventHandler public void onBreak(BlockPlaceEvent e) { Player player = event.getPlayer(); Block b = e.getBlock(); Location loc1 = b.getLocation(); if(b.getType() == Material.ENDER_STONE) { Bukkit.getScheduler().runTaskLater(plugin, new Runnable() { @Override public void run() { if(loc1.getBlock().getType() == Material.ENDER_STONE) { stoneStorage.getBlocksLocations().add(loc1); loc1.getBlock().setType(Material.STONE); } } }, 1); } }
-
Nie, u Ciebie event jest po prostu nazwany e
-
event.getPlayer()
-
Na break pobierasz sobie gracza, który coś rozwalił, później używasz metody .getItemInHand() i sprawdzasz czy typ pobranego itemstacka to złoty kilof, jeżeli tak to usuwasz stoneStorage.getBlocksLocations().remove(loc1);
-
@EventHandler public void onBreak(BlockBreakEvent e) { Block b = e.getBlock(); Location loc1 = b.getLocation(); if(b.getType() == Material.STONE) { if(stoneStorage.getBlocksLocations().contains(loc1) { Bukkit.getScheduler().runTaskLater(plugin, new Runnable() { @Override public void run() { if(loc1.getBlock().getType() == Material.AIR) { b.setType(Material.STONE); } } }, 20); } } @EventHandler public void onBreak(BlockPlaceEvent e) { Block b = e.getBlock(); Location loc1 = b.getLocation(); if(b.getType() == Material.ENDER_STONE) { Bukkit.getScheduler().runTaskLater(plugin, new Runnable() { @Override public void run() { if(loc1.getBlock().getType() == Material.ENDER_STONE) { stoneStorage.getBlocksLocations().add(loc1); loc1.getBlock().setType(Material.STONE); } } }, 1); } }
-
Dobra, no to w tym stonestorage tworzysz sobie nową listę poprzez private ArrayList<Location> blocksLocations = new ArrayList<>(); i metody gettera w tej samej klasie public ArrayList<Location> getBlocksLocations() { return blocksLocations; } I teraz w Twojej klasie main tworzysz sobie nową instancję private StoneStorage stoneStorage = new StoneStorage(); I teraz w miejscu gdzie rejestrujesz sobie listenery w main podajesz ten stone storage getServer().getPluginManager().registerEvents(new BreakListener(this, stoneStorage), this); getServer().getPluginManager().registerEvents(new PlaceListener(this, stoneStorage), this); w konstruktorach listenetów podajesz sobie ten obiekt do zmiennej w klasie private Main plugin; private StoneStorage stoneStorage; public BlockPlace(Main m, StoneStorage stoneStorage) { this.plugin = m; this.stoneStorage = stoneStorage; } i w listenerach najpierw dodajesz do listy w palce a w break sprawdzasz //dodawanie do listy stoneStorage.getBlocksLocations().add(block.getLocation()); //sprawdzanie czy obiekt jest w liście stoneStorage.getBlocksLocations().contains(block.getLocation()) { }
-
Stwórz sobie nową klasę, powiedzmy StoneStorage, a w tej klasie listę z lokacjami, w mainie utwórz sobie nowy obiekt tego storage'a i podaj tę samą instancję w konstruktorach klas listenerów. Później w eventach najpierw dodajesz lokacje do listy, a później sprawdzasz sobie podczas rozwalania czy lokacja bloku jest w tej liście.
-
Ustawiłeś permisje dla graczy? MoneyFromMobs.use \/ sorki, kopiowałem perma ze strony pluginu
-
Nie znam c, ale widzę że w każdej iteracji tworzysz listę co jest głupotą, bo każda lista Ci się nadpisze następną. Kolejną sprawą jest to że niepotrzebnie dwa razy pobierałeś listę plików, wystarczy raz pobrać, później odnosząc się do tej samej zmiennej, która jest listą możesz sobie pobrać długość listy. Metoda GetFiles najprawdopodobniej zwraca całe obiekty plików, a nie ich nazwy, więc prawdopodobnie dlatego dostajesz -1. Na zmiennej files[i] powinieneś użyć metody wyciągającej nazwę, być może .getName(), musisz sobie sprawdzić w dokumentacji. Radziłbym Ci zrobić sobie prostego debuga i w ten sposób próbować uzyskać nazwy plików, tak będzie o wiele szybciej zlokalizować błąd i go usunąć. List<string> files = new List<string>(Directory.GetFiles(@"C:\ProgramData\SkEditor\", "*.sk", SearchOption.AllDirectories)); int fileCount = files.Length; for (int i = 0; i < fileCount; i++){ printDoKonsoliAleFunkcjeZnajdzSam(files[i].getName()); }
-
Nie wiem jak to wygląda na IPS, bo nigdy nie korzystałem, ale można by pokusić się o zapisywanie jednej informacji na koncie, tzn czy chatbox jest włączony czy wyłączony, każdy kto ma już konto miałby chatbox włączony, a każde nowe konto miałoby chatbox wyłączony. Włączanie mogłoby być obsługiwane chociażby ręcznie. Oprócz tego można zrobić szybką rekrutację na chatmodów, którzy byliby odpowiedzialni za usuwanie takiego syfu pokroju gnoma.
-
Wygląda na to, że ProtocolLib stastycznie rejestruje jakieś rzeczy, więc zgaduje że problem jest spowodowany przez /reload
-
Jak to gdzie? W miejscu gdzie chcesz żeby został wysłany, nie jestem jasnowidzem i nie mam wglądu w Twój kod, a najlepiej jakbyś zrobił sobie pod to jakąś metodę
-
String subTitleText = "kupa"; int in = 5; int time = 40; int out = 5; final IChatBaseComponent subTitleComponent = IChatBaseComponent.ChatSerializer .a("{\"text\": \"" + subTitleText + "\"}"); final PacketPlayOutTitle sub = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.SUBTITLE, subTitleComponent); final PacketPlayOutTitle length = new PacketPlayOutTitle(in, time, out); ((CraftPlayer) player).getHandle().playerConnection.sendPacket(sub); ((CraftPlayer) player).getHandle().playerConnection.sendPacket(length);
-
Występuje błąd, bo kod który podałeś prawdopodobnie został niepoprawnie zdekompilowany z jakiegoś innego pluginu. Zmienna val$query nie istnieje w obiekcie StoreSQLite. Nawet jak stworzysz sobie tę zmienną to nadal jest tu masa błędów i nonsensów, powstałych prawdopodobnie przez dekompilacje. Do tego dodanie lub usunięcie spacji po przecinku absolutnie nic nie zmienia. Jeżeli już tak bardzo nie chcesz się uczyć podstaw i błądzić jak we mgle bez latarki to tutaj masz to bardzo dobrze i ładnie opisane https://stackoverflow.com/questions/34856113/implementing-sql-in-a-bukkit-spigot-plugin/34870324#34870324
-
Możesz sobie stworzyć komendy, które wykonują komendy. Droga naokoło, ale działa
-
To nie void tylko metoda Musisz zrobić nowy task https://bukkit.gamepedia.com/Scheduler_Programming Absolutnie nie robisz czegoś takiego, bo to zamraża cały wątek serwera, tzn. cały serwer XD Zanim zaczniesz pisać pluginy naucz się pisać w Javie, bo brakuje Ci podstaw.
-
Zawsze powinieneś zakładać, że kogoś może nie być na serwerze. Zapisuj sobie do bazy każdego kto zakupił coś (chociażby, żeby mieć jakiś dowód na zakup danej usługi). Sprawdzaj przy zakupie czy jest online. Jak jest to ustawiasz status powiedzmy na 1. Co 10 minut sobie sprawdzasz każdą usługę ze statusem na przykład 0 i jeżeli user jest online, a ma status wykonania usługi 0, bo wcześniej go nie było to nakładasz mu dane uprawnienia i dopiero wtedy ustawiasz na 1. Takie rozwiązanie eliminuje też problem kiedy ktoś kupuje coś kiedy serwer jest offline.
-
toggle clicked block toggle clicked block Myślę że cos takiego zrobi robote xD ewentualnie pomiędzy tymi dwoma linijkami wstaw wait 1 tick
-
Otwórz plik .jar winrarem i wyślij screena z tego co tam będzie
-
Jak używasz zależności? Kompilujesz wszystko do Uber jara czy odpisujesz jako zależność w pluginie i wrzucasz na serwer osobno?
