-
Ilość zawartości
284 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
5
Treść opublikowana przez GotoFinal
-
no ja też o tym pisałem, to będzie trudne jak chcesz to sparsować, ale też jak pisałem, możesz spróbować sobie to ułatwić. Yaml yaml = new Yaml(); String str = "itemId amount: 4, name: \"My Custom name\""; int indexOf = str.indexOf(' '); String itemTypeId; String restOfData; if (indexOf == -1) { // nie ma spacji w stringu itemTypeId = str; restOfData = null; } else { itemTypeId = str.substring(0, indexOf); restOfData = "{" + str.substring(indexOf + 1) + "}"; } System.out.println("itemTypeId: `" + itemTypeId + "`"); if (restOfData != null) { Map<String, Object> load = (Map<String, Object>) yaml.load(restOfData); int amount = (int) load.getOrDefault("amount", 1); String name = load.get("name").toString(); // może być nullem System.out.println("name: `" + name + "`"); System.out.println("amount: `" + amount + "`"); // no i tworzysz sobie item } Ale to jest bardzo brzydkie rozwianie i dość łatwo rzucające error, np brak spacji po : wywali błąd. No ale nie nauczę cię tutaj pisać parsera, szczególnie że sam dość średnio to robię Dlatego najwygodniej to jak poszukasz jak to robi essentials i użyjesz ich metody, mają dość wygodny format i całkiem dużo wspiera. No a od biedy mozesz swoim nieczytelnym: String str = "57:0-32:Bloki diamentu"; String[] parts = str.split(":"); String blockId = parts[0]; // ale powinieneś sprawdzić czy istnieje, bo może ktoś napisze tylko "57" String amount = parts[1]; String[] amountRangeParts = amount.split("-"); int amountMin = Integer.parseInt(amountRangeParts[0]); // podobnie dla max // też sprawdzić String name = parts[2]; // i robisz co chcesz Proste, ale niezbyt wygodne do rozszerzania, bo jak np będziesz chciał enchanty dodać to będziesz musiał dodać kolejny element po : i zawsze używać w tej kolejności.
-
no właśnie dlatego pisanie parserów jest bardziej skompilowane, więc na twoim miejscu bym odpuścił lub poszukał czegoś gotowego - np można używac formatu z essentials, na pewno gdzieś przez API da się ten ich parser wykonać. Bo tak to musiałbyś parsować np znak po znaku aż natrafisz na :, wtedy będziesz widział czy przeczytałeś do tego miejsca `name` czy `amount`, i wtedy parsować co jest dalej. Ale w przypadku formatów z yamlem to zwyczajnie odczytujesz jak konfiguracje.
-
wiem że na początku to się wydaje wygodne, ale nie rób tak... zostawisz config na jakiś czas i potem będziesz szukał w source co oznaczała 10 liczba po 5 przecinku, cztery średniki za kropką. Ogólnie w yaml nie ma sensu się bawić z czymś takim, jak config jest read-only to można skorzystać z prostego formatu yamla: drops: - {id: "itemid", amount: 5, name: "Jakaś nazwa"} - {id: "itemid", name: "Jakaś nazwa"} i to jest w pełni poprawny yaml, identyczny z takim: drops: - amount: 5 id: itemid name: "Jakaś nazwa" - id: itemid name: "Jakaś nazwa" czyli lista map. nie musisz wtedy pamiętać kolejności itd. Inną opcją jest coś bliżej essentials, czyli proste stringi itemId amount:4 name:"My Custom name" Tylko coś takiego już trudniej sparsować, ale to znowu można iść na łatwiznę i zrobić tak: itemId amount:4, name:"My Custom name" odczytać id, czyli do pierwszej spacji, a potem otoczyć resztę w {} i odczytać znowu jako YAML, tak by było jak w pierwszym przykładzie a u ciebie musisz splitować po np : i się męczyć z tym gównem.
-
kodu to za dużo pisania, to calkiem sporo kodu by dobrze działało. https://www.spigotmc.org/resources/custom-recipes.11440/ Ale masz to, ma całkiem sporo możliwości i ma nawet jakieś podobno API, czyli możesz z poziomu swojego kodu pluginu dodać recepty. Ale jak coś prostego to pewnie da się tam komendami/konfiguracją stworzyć.
-
to jest liczba z sub-typem przedmiotu, nie da się stworzyć za pomocą bukkit api receptur wymagających więcej niż 1 przedmiot w slocie + jest to ogólnie niezgodne z systemem craftingu w minecrafcie. Więc trzeba ręcznie obsługiwać eventy od EQ, a najlepiej użyć gotowego pluginu z spigotmc bo jest ich z 20.
-
nie dałeś kodu... ale pewnie gdzieś tworzysz nową instancje swojej głównej klasy... a tak to package nazywa się tylko małymi literkami...
-
co to znaczy "żeby działało z eventem"? bo jak chcesz potem wpłynąć na event to jest to niemożliwe.
-
a po co ten limit 5 serverów? a tak to ja pier... ten kod to zlepka kopiownych fragmentów, w połowie kodu taby, w drugiej połowie spacje xD do tego główna klasa z małej listery i kompletnie bez sensowne i nie mające prawa działać: if(inst == null) return new mpHub(); .replace("&", "§") a od tego to jest ChatColor.translate... W klasie Server nie wiem czemu jest lista a nie np hashmap, no ale serverów jest mało to różnicy w wydajności nie będzie wiadomości hardcoded więc nie da się zmienić ;/ public static Config getInst() { if (inst == null) { return new Config(); } return inst; } public Config() { inst = this; } niezbyt to obiektowe podejście... a do tego konstruktor publiczny pomimo że to singleton, a jednocześnie nadpisuje instancje, kompletnie bez sensu, tak się nie robi. No i masz publiczne pola, to też nie jest poprawne obiektowe podejście w javie. catch (IOException e) { Bukkit.getConsoleSender().sendMessage("�4Nie mozna polaczyc sie do serwera " + target); } po 1, od tego jest logger, a po 2... nie wyświetlasz nigdzie błędu ani nic z nim nie robisz, więc admin nie dowie się co spowodowało ten błąd, bo jest wiele możliwości zawsze.
-
jeżu, co tu się dzieje, ech, nie mam czasu by za dużo pisać więc tylko dodam Tak się nie powinno robić, lepiej dodać metodę .addMoney/.subtractMoney tak by umożliwić potem dodanie różnej logiki, np wywalenia błędu kiedy ktoś chce zabrać więcej pieniędzy niż ktoś ma, lub zwracać wartość opisującą ile pieniędzy udało się zabrać/dodać
-
słyszałeś kiedyś o hash mapach? po jakiego uja użyłeś tu listy, i po co ten getter listy... też bez sensu że statyczne
-
różnica nie ma nic do tego, w plikach yaml to nie ma prawa działać, bo parser essentials operuje na strinach, więc albo masz to tam wskazane na stringi jakimiś cytatami lub innymi znakami, lub też je pomija.
-
Nie ma jeszcze czegoś niżej? bo jak nie to to jedyne o czym myślę to próba zaktualizowania essentials, zobacz może EssentialsX, bo z jakiegoś powodu brakuje mu klasy, może jakiś uszkodzony .jar, trudno powiedzieć idz być nobem gdzieś indziej zauważ że to się parsuje jako obiekt jak nie dasz cytatów
-
dałeś to w tworzenie pluginów, więc... jak te itemy odczytujesz? czy to może config z essentials? bo jak z essentials to jak ci dalej coś nie działa, to zły dział, ale poszukaj błedów w logach i upewnij się że ci serwer odczytuje poprawny config, np zmień/dodaj item na początku by zobaczyć czy będzie różnica. EDIT: I nie wołaj mnie na PW bo cię zablokuje i tyle
-
string to ciąg znaków, ot jakiś tekst. klucz: "wartość" klucz-lista: - "wartośc w liście" - "wartośc w liście" - "wartośc w liście" - "wartośc w liście" - "wartośc w liście" - "wartośc w liście" nie trzeba wszystkiego dawać w cytaty, tylko wtedy jak są tam jakieś znaki przez które YAML może potraktować to jako coś innego, np właśnie dwukropek
-
daj stringi w jakiejś cytaty, bo myśli że to mappingi a nie stringi, widać nawet po kolorowaniu, zauważ że klucze masz niebieskie, a wartości liczbowe żółte.
-
no to jego nie uwzględnia masy rzeczy, no ale jak ci wystraczy to ¯\_(ツ)_/¯
-
no to musisz się pomęczyć z NMS lub symulowaniem, jak z NMS to musisz znaleźć gdzie wywołuje się drop, najwygodniej poszukać gdzie wywołuje się BlockBreakEvent i tam szukać gdzie jest drop, tylko to dość mało przenośnie i ryzykowne. Możesz też poszukać w innych pluginach jak to wygląda: https://github.com/Zarius/Bukkit-OtherBlocks
-
no niestety ale nie ma dobrego sposobu by ti ładnie zablokować to trzeba albo się jebać w NMS, albo właśnie ręcznie odtwarzać wszystkie reakcje, co oznacza też enchanty od unbreaking, różne zużycie przy niektórych blokach i narzędziach i inne takie. Dlatego często wygodniej użyć np OtherDropa co już to ma, sporo można z configu, albo użyć jako API też powinno się dać.
-
NBans - nie można dać unbana przez console
GotoFinal odpowiedział(a) na mateuszeqq13212 pytanie w Pytania i problemy
ale że jak mamy pomóc bez kodu tych klas/linku do pluginu "ParSuperCraftBanPL " EDIT: a to nie pomgam jak zmieniasz nazwy bez zgody autora itd ;/ -
im.setLore(lore); - jak to ci się psuje to "im" jest nullem is.setItemMeta(im); - jak to, to "is" jest nullem, proste... cokolwiek masz w tej 69 linijce
-
Caused by: java.lang.NullPointerException at com.krejzolekpro.kp_drop.utils.GuiUtil.guiDrop(GuiUtil.java:69) ~[?:?] No to coś co używasz w tej klasie GuiUtil w 69 linijce jest nullem
-
noooo i jaki to błąd?....
-
Ale jaki masz bład z tym lore?
-
No bo tak się z graczem nie robi, gracz nie jest prostym obiektem jak ItemStack który można zapisać do pliku a potem wczytać, trzeba zapisywać po swojemu, np ręcznie uuid i nick
-
nooo to radzę lepiej sprawdzić zanim gracze zaczną ci klonować tym itemki... tak właściwe ratuje cię chyba fakt że dodaje to do EQ gracza, bo oryginalny item też się wtedy edytuje... W niektórych rodzajach inventory po użyciu addItem możesz mieć taką sytuację: - Dodajesz 2 diaxy do inventory - ale jest tylko miesjce na jednego - Więc jeden się dodaje, a ty potem dropisz dwa na ziemię, łącznie nagle są 3 W eq gracza to działa bo ten item diaxa też jest edytowany podczas dodawania. https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/Inventory.html#addItem-org.bukkit.inventory.ItemStack...- > It is known that in some implementations this method will also set the inputted argument amount to the number of that item not placed in slots. Z tym ze to się może nagle zmienić po aktualizacji jakiejś, więc ryzykowne. No ale tak to twoja metoda nie wspiera dodawania kilku itemów na raz, trzeba by ręcznie każdy z nich ogarnąć, a tak to można sobie zrobić osobną metodę addItemsOrDrop(Player player, ItemStack... items)
