KodziaK 30 Opublikowano 8 października 2017 Udostępnij Opublikowano 8 października 2017 Witajcie. Zaczynam pisać plugin na bossy. Alę potrzebuję do tego wyczytywać specjalne dropy z nich. Ponieważ to mogły by nie być tylko zwykłe itemy z daną ilością chciałbym aby to w configu wyglądało tak: creeper: drops: 57:0-32:Bloki diamentu 145:0-64:Kowadla;322:1-16:Zlote jablka (koxy) 388:0-64:Szmaragdy id:damagevalue-ilosc:Nazwa Ale za grzyba nie wiem jak odczytywać różne dane z jednej lini. Jeżeli ktoś umie to niech mi pomoże :). Ja idę spać dobranoc xD Odnośnik do komentarza https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/ Udostępnij na innych stronach Więcej opcji udostępniania...
0 GotoFinal 195 Opublikowano 8 października 2017 Udostępnij Opublikowano 8 października 2017 (edytowane) 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. Edytowane 9 października 2017 przez Ewald Odnośnik do komentarza https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150453 Udostępnij na innych stronach Więcej opcji udostępniania...
0 KodziaK 30 Opublikowano 9 października 2017 Autor Udostępnij Opublikowano 9 października 2017 Wiem że to o co zapytam jest głupie ale dopiero się uczę. Jak ja mam odczytywać z tego konkretne dane? Czyli chcę np. NAME ale zamiast w 2 argumencie być NAME jest AMOUNT i co teraz? Odnośnik do komentarza https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150472 Udostępnij na innych stronach Więcej opcji udostępniania...
0 GotoFinal 195 Opublikowano 9 października 2017 Udostępnij Opublikowano 9 października 2017 Godzinę temu, K0dziakOfSky napisał: Wiem że to o co zapytam jest głupie ale dopiero się uczę. Jak ja mam odczytywać z tego konkretne dane? Czyli chcę np. NAME ale zamiast w 2 argumencie być NAME jest AMOUNT i co teraz? 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. Odnośnik do komentarza https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150477 Udostępnij na innych stronach Więcej opcji udostępniania...
0 KodziaK 30 Opublikowano 9 października 2017 Autor Udostępnij Opublikowano 9 października 2017 14 godzin temu, GotoFinal napisał: itemId amount:4, name:"My Custom name" Mi chodzi o ten moment dokładniej nie wiem jak stąd odczytywać dane Odnośnik do komentarza https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150478 Udostępnij na innych stronach Więcej opcji udostępniania...
1 yooniks 347 Opublikowano 9 października 2017 Udostępnij Opublikowano 9 października 2017 (edytowane) //config key: "GOLDEN_APPLE;1;32;Kox" #String path //klasa public ItemStack parseItemStack(String path){ final String[] split = path.split(";"); //tworzenie itemu final ItemStack is = new ItemStack(Material.matchMaterial(split[0]), Integer.valueOf(split[2]), (short)split[1])); final ItemMeta im = is.getItemMeta(); im.setDisplayName(split[3]); is.setItemMeta(im); return is; } ale tak jest latwiej: //config items: jakis-item: material: GOLDEN_APPLE amount: 1 data: 0 i po prostu return new ItemStack(Material.matchMaterial(cf.getString(path+"material")) ....); Edytowane 9 października 2017 przez yooniks Odnośnik do komentarza https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150479 Udostępnij na innych stronach Więcej opcji udostępniania...
0 GotoFinal 195 Opublikowano 9 października 2017 Udostępnij Opublikowano 9 października 2017 (edytowane) 13 minut temu, K0dziakOfSky napisał: Mi chodzi o ten moment dokładniej nie wiem jak stąd odczytywać dane 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. Edytowane 9 października 2017 przez GotoFinal Odnośnik do komentarza https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150480 Udostępnij na innych stronach Więcej opcji udostępniania...
Pytanie
KodziaK 30
Witajcie. Zaczynam pisać plugin na bossy. Alę potrzebuję do tego wyczytywać specjalne dropy z nich.
Ponieważ to mogły by nie być tylko zwykłe itemy z daną ilością chciałbym aby to w configu wyglądało tak:
Ale za grzyba nie wiem jak odczytywać różne dane z jednej lini. Jeżeli ktoś umie to niech mi pomoże :). Ja idę spać dobranoc xD
Odnośnik do komentarza
https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/Udostępnij na innych stronach
6 odpowiedzi na to pytanie
Rekomendowane odpowiedzi