-
Ilość zawartości
987 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
13
Treść opublikowana przez yooniks
-
dobrze wielcy znawcy bukkita, a co jeżeli gracz nie jest na serwerze? przecież Server#getPlayer moze zwrocic nulla /\ @edit pan na górze ma piękną sygnaturę: while (this.isAlive()) { attemptSuicide(this); } isAlive() nie potrzebuje parametru z jakims obiektem, ale attemptSuicide to już tak? =/
-
fuj ja tu przyszedłem tylko po to aby odradzić używania tego pluginu
- 5 odpowiedzi
-
- java plugin
- java
-
(i 1 więcej)
Oznaczone tagami:
-
przepraszam bardzo, czy to czasem nie moj kod z bardzo bardzo starego pluginu? Jak kolega juz daje kod to najlepiej jakby był jego autorstwa i dobry,  nw czemu takie osoby się wypowiadają ;( castowanie playera do sendera kiedy to nawet nie jest potrzebne, ehh fuj, przeciez w StringUtilach jest metoda zwracajaca boolean, isNumeric(.) ktora jako parametr przyjmuje string, lub po prostu lapac numberformatexception????? kolega tak sie chwali a kod nawet nie jego =( zamiast proponować komuś naukę podstaw pierw sam się ich naucz a ten kod z itembuildera to juz wgl syf =(
-
nie po to autorzy mają paczkę i dają ją tylko wybranym, dobrym serwerom, które się czymś wyróżniają, a nie zwykłe easyhc, żeby losowe serwery sobie robiły na to pluginy =/ były już na to pluginy, ale to zablokowali po aktualizacji i wątpie, że da się to teraz zrobić, tymbardziej nikt by ci tego za free nie napisał XD
-
Czy ten sposob na cooldown jest dobry czy lepiej uzyc HashMapy ?
yooniks odpowiedział(a) na kerpson pytanie w Pytania i problemy
Bukkit.getServer().getScheduler().scheduleAsyncDelayedTask(Main.getPlugin(Main.class), new Runnable(){ public void run() { cooldownns.remove(p); } },100); gdzie lambda? i czemu nie runTaskLaterAsynchrously if(e.getItem().getType().equals(Material.NETHER_STAR)){ == if(p.getItemInHand() == null) return; e.getItem() i nie wiem od ktorej wersji, ale w nowszych jest juz event.hasItem() Player p = (Player) e.getPlayer(); czemu castujesz playera do playera ArrayList<Player> cooldownf = new ArrayList<>(); List<Player> cooldown = new ArrayList<>(); a tak poza tym to jezeli bylby to tylko jeden cooldown to uzylbym jakiejs mapy od guavy private final Cache<UUID, Integer> registerRequests = CacheBuilder .newBuilder().expireAfterWrite(60, TimeUnit.SECONDS).build(); chociaz nie wiem czy tutaj sie przyda mapka =/ najlepiej wedlug mnie byloby to trzymac w jakims userze i po prostu trzy longi no i ustawiasz je po prostu na System.currentTimeMillis() + TImeUnit.SECONDS.toMillis(10); czyli czas z teraz + 10 sekund - i masz 10 sekundowy cooldown, a w ifach sprawdzasz: if (user.cooldown(FIRST) > System.currentTimeMillis()) { player.sendMessage("Mozesz tego uzywac co 10 sekund!"); return; } user.putCooldown(FIRST, System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)); player.sendMessage("uzyto!"); -
Jak sprawdzac przez BungeeCord czy podlaczony serwer jest on czy off?
yooniks odpowiedział(a) na kerpson pytanie w Pytania i problemy
zawsze możesz sobie w np. pluginie na lobby trzymać listę serwerów (obiekty) z ilością graczy online itd i podczas wyłączania serwera wysyłać pluginmessage żeby poinformować bungee itd, tak samo podczas wlaczania, a w twoim pluginie to sprawdzać i jakoś przetwarzac, wtedy nie musisz pingowac, ale to alternatywa -
pokaz plugin.yml i pelna klase main
-
Wszystko do zmiany, za dużo pisania w skrócie nie polecam na żaden serwer =/
- 7 odpowiedzi
-
tak, będzie tepal poza border (miałem tak w pluginie na uhc) https://hub.spigotmc.org/javadocs/spigot/org/bukkit/World.html#getWorldBorder-- czyli pobierasz gracza z np. eventu, pobierasz świat i worldbordera możesz sobie walnąć do zmiennej, ustawiać mu wielkość, pobierac itd.. A jak chcesz danemu graczowi to pakietami lecisz. Jeszcze gdzieś miałem metodę sprawdzajaca czy dana lokalizacja jest poza borderem, ale nie jestem teraz na kompie ;/
-
Programista Java na Twój serwer Minecraft!
yooniks odpowiedział(a) na xCreepeTM temat w Archiwum współpracy
Sam temat nie zachęca, konto masz dopiero kilka godzin, żadnych postów z pomaganiem (np. w dziale java, gdzie moglibyśmy zobaczyć czy się chociaż trochę znasz), żadnego portfolio, napisałeś, że zajmujesz się javą od ponad roku, a nie masz żadnych przykładowych projektów.. Każdy programista musi mieć jakieś portfolio, nikt nie pójdzie w ciemno. Nie wiem jak innych, ale mnie to nie zachęca Wszystko co można znaleźc w internecie - zedytowałeś jakiegoś kguildsa, jakiegoś limitera pakietów, proxy i sektorki - wszystko dostępne w internecie, chciałbym zobaczyć jakiś twój przykładowy projekt :d Nikt nie poleci w ciemno. -
public class SimplePlugin extends JavaPlugin { private InventoryManager inventoryManager; @Override public void onEnable() { final Inventory shopInventory = this.getServer().createInventory(null, 9*3, "Ekwipunek sklepu"); shopInventory.setItem(0, new ItemStack(Material.GLASS)); this.inventoryManager = new InventoryManager(shopInventory); } public InventoryManager getInventoryManager() { return this.inventoryManager; } } public class InventoryManager { private final Inventory shopInventory; public InventoryManager(Inventory shopInventory) { this.shopInventory = shopInventory; } public void openShopInventory(Player player) { player.openInventory(this.shopInventory); } } i w komendzie wtedy tylko: public class SimpleCommand implements CommandExecutor { private final InventoryManager inventoryManager; public SimpleCommand(InventoryManager inventoryManager) { this.inventoryManager = inventoryManager; } @Override public boolean onCommand(CommandSender sender, ....) { if (!(sender instanceof Player)) { sender.sendMessage("this command is only executable by player"); return true; } final Player player = (Player) sender; this.inventoryManager.openShopInventory(player); player.sendMessage(ChatColor.RED + "Otworzono ekwipunek sklepu!"); } } naprawde, zacznij sobie pierw od pisania malych programów, tak zeby kod ladnie wygladal i bylo to czytelne dla kazdego kto by ten kod czytał i żeby był w stanie ten twój kod zedytować i sie w nim połapać, bo jak zaczynasz od mc to później takie problemy są, że niby coś tam w bukkicie umiesz, ale nawet nie wiesz jak to działa i kod wychodzi tak jak wychodzi =/
-
jak podmienić znaki z '&' na '§' w stringList
yooniks odpowiedział(a) na kerpson pytanie w Pytania i problemy
Eh, no tak jest, jak piszesz pluginy, a nie ogarniasz javy Przecież jako parametry, przyjmujesz string w metodzie to nic dziwnego, że jest na czerwono jak chcesz dać listę? Zrób sobie kolejna metodę, która przyjmuję listę jako parametr i zwraca też listę. public static List<String> colored(List<String> list) { return list .stream() .map(string -> ChatColor.translateAlternateColorCodes('&', string)) .collect(Collectors.toList()); //mam troche przerwe z java i mc wiec moze cos pokrecilem, ale wydaje mi sie ze dobrze } -
[Optymalizacja] Automessage oraz inventory
yooniks odpowiedział(a) na kerpson pytanie w Pytania i problemy
rozszerz klase o runnable, a wiadomosci dostarcz od razu w konstruktorze no i wtedy mozesz jeszcze od razu je skoloryzować i tyle, a w run() juz tylko sprawdzasz size listy itd no i: mozesz puszczac to async i uzyc od razu this.getServer().getScheduler() a nie Bukkit.getScheduler(), no ale jak kto woli, i tak wyjdzie na to samo nie rozumiem po co to printujecie =/ przeciez sam serwer juz to robi podczas wlaczania pluginu.. do tego println, a przeciez mozesz uzyc loggera ktory jest juz w javaplugin stringi porownujemy equals(), a enumy enum equals czyli == a itemshop.create.. to juz kompletnie fuj = ( uzyj jakiegos api, do tego masz przeciez petle, a ty odwalasz cos takiego: lore mozesz dac juz wgl do configu i te inventory wczytuj sobie tylko raz =/ przeciez przy kazdym wywolaniem tej metody robisz pelno akcji =/ sprobuj to skrocic, czyli przy onenable laduj to tylko raz, a w create...() tylko otwieraj inventory graczowi ogolnie te tworzenie itemkow wyglada okropnie, jest pelno api gotowych do gui =( np. opengui i ogolnie cancelowac event mozesz od razu po sprawdzeniu nazwy inventory, a nie przy kazdym sprawdzaniu nazwy itemu bo i tak wychodzi na to samo, do tego sprawdzaj czy item ma itemmete i displayname bo sie zdziwisz jak ci zacznie rzucac nulle -
eh.. tak jest jak piszesz pluginy pod mc, a jedyne co widziales to kod z dekompilatora public class PlayersHolder { private final Set<UUID> players = new HashSet<>(); private boolean contains(UUID uuid) { return this.players.contains(uuid); } private void add(UUID uuid) { this.players.add(uuid); } private void remove(UUID uuid) { this.players.remove(uuid); } } (zmien private na public bo robilem na szybko) private final PlayersHolder playersHolder = new PlayersHolder(); @EventHandler public void onJoin(PlayerJoinEvent event) { this.playersHolder.add(event.getPlayer().getUniqueId()); } @EventHandler public void onQuit(PlayerQuitEvent event) { this.playersHolder.remove(event.getPlayer().getUniqueId()); } //dodaj sobie jakis listener i wtedy: if (this.playersHolder.contains(player.getUniqueId()) { player.sendMessage("contains!"); }
-
tak, bo wcale funnyguilds nie ma swojego repo, maven taki trudny =/ i ten depend tez niepotrzebny, mozna wykrywac czy plugin istnieje - jak tak to dodaje zmienne do scoreboarda z fg i nie wiem czy funnyguilds uzywa placeholderapi, ale jezeli tak to mozna uzyc pewnie jego zmiennych do papi, bedzie latwiej mozesz dodać tą "jarkę" jako zwykłą biblioteke, tak jak dodawałeś silnik, no chyba, że używasz intellij i korzystasz z mavena, to przecież na githubie fg jest podane repo https://github.com/FunnyGuilds/FunnyGuilds - nikt nie bedzie cie tutaj uczyl kazdej rzeczy od zera - zacznij pierw z czyms prostym bez mc, a potem dopiero zacznij z mc, bo nic nie potrafisz i ze wszystkim przychodzisz tutaj, a tutaj nikt cie nie bedzie uczył, bo nie ma ochoty, tutaj sie pomaga w np. problemach z kodem
-
prosty przyklad zmiennej boolean true/false
yooniks odpowiedział(a) na kerpson pytanie w Pytania i problemy
moze zacznij od nauki programowania obiektowego bez mc? -
tak jak wyzej ^ do tego nie trzymaj implementacji mapy: HashMap<K, V> map = new HashMap<>(); tylko interfejs: Map<K, V> map = new HashMap<>(); tutaj nie ma to prawie znaczenia, ale rób to tak jak napisałem, bo potem wejdzie ci to w nawyk i bedziesz, źle robił =/ tutaj masz lepiej wytlumaczone i przykład: https://www.p-programowanie.pl/paradygmaty-programowania/zasady-solid/ (spójrz na linkov substitution) nick gracza może nie być w mapce i wtedy rzuca nulla =( czemu castujesz playera do playera? przeciez nawet IDE pewnie ci pokazuje ze to jest niepotrzebne.. czemu z playera pobierasz jeszcze raz playera i dopiero jego displayname? po co trzymać true/false w mapce skoro możesz użyć coś w stylu listy, setów i wtedy tylko sprawdzasz czy jest - jezeli tak to true, jezeli nie to false i zamiast putowania false/true to wyrzucasz/wrzucasz do listy/seta czy czegos tam no i ten task z kickaniem tez chyba niepotrzebny, a efekt i tak słaby daje bo 20L to 1 sekunda, 6L = 6/20 sekundy więc prawie niewidoczne, a niepotrzebnie to wykonujesz do tego przetrzymujesz nick gracza, a co jak on go zmieni? trzymaj uuid, bo one jest unikalne i sie nie zmienia a co do tego, że nie działa - wywal casta, wywal getPlayer(), używaj uuid zamiast nicku gracza i przed get dodaj sprawdzanie czy gracz jest w mapce
-
nie ma tu uzytych funkcji javy 8, takie rzeczy to tylko w javie 6 =/ co do reszty: public UserManager getUserManager() { if(this.userManager == null) this.userManager = new UserManager(); return this.userManager; } public CustomClassManager getCustomClassManager() { if(this.customClassManager == null) this.customClassManager = new CustomClassManager(); return this.customClassManager; } gettery powinny zwracać od razu coś, no chyba, że to singleton czy coś, no a nie widze zebys ustawial gdzies te zmienne na null, wiec nie ma potrzeby nawet takiego sprawdzania, bo są inicjowane w konstruktorze (no i powinny byc rejestrowane w onenable, a nie w konstruktorze) for(Entity entity : Bukkit.getWorld("world").getEntities()){ if(this.mobManager.isMob(entity.getCustomName()) && !(entity instanceof Player)){ ((LivingEntity) entity).setHealth(0); } } od razu mozesz uzyc getlivingentities, no i uzyc streamow =/ private final Map<String, List<String>> moreMessages = new HashMap<String, List<String>>(); mozesz zastapic to multimapą z guavy ogólnie to jest tu dużo błędów, a kod wygląda nieestetycznie i słabe rozwiązania =/ public void save(Main main){ for(User user : main.getUserManager().userSet()){ if(user.isChanged()){ new FlatUser(user).save(); } } } tworzysz obiekt tylko po to aby wykonać metode save, od razu w parametrze mozesz dostarczyc usermanager lub od razu liste, bo po co main skoro i tak nie uzywasz wiecej funkcji od niego. nazwy zmiennych z małych liter, tak samo metod i pakietów, klasy z dużych liter. for(String string : Messages.getInstance().getList("LevelUpMessage")) { player.sendMessage(string .replace("{LVL}", "" + this.getLevel()) .replace("{EXP}", "" + this.getExp()) .replace("{NEED}", "" + this.getNeed())); } yaml wspiera wielolinijkowe teksty, tzn. message: "Pierwsza linia\nDruga linia" #musi być te " ", jest oczywiscie duzo wiecej sposobow na tworzenie takich tekstow, ale ten jest chyba najprostszy dla kogos kto tego nie ogarnia i wtedy wysylasz to jako jedną wiadomość, do tego zamiast String#replace mozesz uzyc StringUtils.replace, ktore jest kilka razy szybsze. no i tez czasem immutable tez by sie tu przydalo edit: no i oczywiscie tutaj flat ssie, do tego widze ze masz tutaj kilka obiektów, które używają metody np. save, mógłbyś pobawić sie z interfejsami lub dziedziczeniem, ładniej by wyszło
-
a po co konczyc edycje? wgraj najnowszego builda, który jest wspierany i aktualizowany a w razie dalszych problemow pisz tu: https://github.com/FunnyGuilds/FunnyGuilds/issues - pewnie topka sie po prostu nie aktualizuje, albo jakis problem z tabem, albo sortowaniem
-
co to jest x d no tych podstawowych tez za bardzo nie, pelno bledow, a dalej nic nie zmieniasz =/ czekam az zrobisz jakis update i wtedy ocenie
-
Zmienna boolean osobna dla każdego gracza
yooniks odpowiedział(a) na ToffikTV pytanie w Pytania i problemy
private final Set<UUID> players = new HashSet<>(); public boolean has(UUID uuid) { return this.players.contains(uuid); } public void add(UUID uuid) { this.players.add(uuid); } public void remove(UUID uuid) { this.players.remove(uuid); } @Test public void booleanTests() { final UUID uuid = UUID.randomUUID(); Assert.assertTrue(this.has(uuid)); this.add(uuid); Assert.assertTrue(this.has(uuid)); } normalnie uzylbys mapek lub zmiennych w jakims obiekcie, ale takie cos mozesz przetrzymywac sobie w secie, gracz w nim jest - zwraca true - nie jest - zwraca false. przetrzymujesz tam uuid gracza tak jest wygodniej. w drugim kodzie po prostu sprawdzasz czy metoda zwraca true testami jednostkowymi: https://kobietydokodu.pl/17-testy-jednostkowe/ przydadzą ci sie podstawy javy, po co zaczynac z minecraftem i pisaniem pod niego pluginów skoro nie potrafisz zrobic prostego programu sprawdzajacego czy lista coś zawiera, albo nie wiesz co to mapki.. narobisz sobie tylko pełno problemów, pierw zacznij od podstaw javy, a potem bukkit. -
Szukasz technika, a jedyne co możesz zaoferować to serwer na jakimś hostingu za 20 zł na miesiąc? Ktoś kto potrafi pisać pluginy na pewno nie bedzie tracił na ciebie czasu =/ Jeszcze "pisanie dla ciebie pluginów" - wszystkie twoje zachcianki za 20 zł XD (i to nie jeszcze dla technika tylko na serwer, to tak na prawde gowno ma z tego technik) Co technik zyskuje współpracując z tobą? Nic oprócz straty czasu.
-
tak, i ładowanie 100+ światów przy starcie serwera i przy save-all lub wyłączeniu =/ przecież taki border można zrobić na jednym świecie, tylko wysyłać każdemu graczowi inny pakiet z wielkościa bordera itd
-
Tworzenie i odczytywanie pakietu PayLoad.
yooniks odpowiedział(a) na Masloid pytanie w Pytania i problemy
no jak chcesz pobrac tą tablice byte'ow to uzywasz: packet.getByteArrays().read(0) w protocollibie, a to jak juz bedziesz nasluchiwal to bardzo prosto zrobic.. no i tylko tam gdzie przetrzymujesz protocolManager to dodajesz ten listener -
ale tłumaczył jak ogarnąć środowisko
