Skocz do zawartości
  • 0

Wiele danych w jednej lini


KodziaK

Pytanie

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

6 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

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 :D

 

a u ciebie musisz splitować po np : i się męczyć z tym gównem.

Edytowane przez Ewald
Odnośnik do komentarza
https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150453
Udostępnij na innych stronach

  • 0

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

  • 0
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

  • 1
//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 przez yooniks
Odnośnik do komentarza
https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150479
Udostępnij na innych stronach

  • 0
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ę :P
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 przez GotoFinal
Odnośnik do komentarza
https://skript.pl/temat/22059-wiele-danych-w-jednej-lini/#findComment-150480
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...