Skocz do zawartości

Rekomendowane odpowiedzi

So, generally chciałbym zacząć tworzyć taki mały projekcik: Mapa typu "clicker", inspirowana flashową grą GrindCraft. Mam jednak mały problem. Potrzebuję pilnie jakiegoś generatora liczb losowych. Chodzi o to, że mamy sobie blok, który należy niszczyć (do czego sprowadza cały sens tegoż "clickera"). Z tym, że ten blok ma być losowany, więc np. mamy 30% szans, że to będzie dirt, 20%, że to będzie drewno, 20%, że stone itd.

Poprzeglądałem różne kontrapcje na YouTube i najbardziej pasującym mi rozwiązaniem jest losowanie Armor Standów. Jednakże, wiedząc, jak ma wyglądać moja mapa, obawiam się, że ilość Armor Standów może spowodować lagi, czego chciałbym uniknąć. Czy znacie może jakieś inne metody randomizacji? 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja bym zwyczajnie odpalił zegar dodający co sekundę +1 pkt do utworzonej tablicy wyników. Można tak zostawić by były dodawane w nieskończoność lub po osiągnięciu np. liczby 10 wynik byłby ponownie ustawiany na zero. Aktualna liczba z tablicy wyników byłaby podstawą do utworzenia losowanego wyniku.
Jakby kazać np. resetować wynik do zera po osiągnięciu 100 to mamy ładne procenty i każdemu procentowi można przyporządkować inny drop.
Nie jest to perfekcyjny generator liczb losowych no bo jednak to tylko bardzo szybko by odliczało, ale wyniku nie dałoby się praktycznie przewidzieć.
Plusy to banalność, prostota i chyba nikłe obciążenie dla MC.
Powinno wystarczyć.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

JbQWko5.png stworzyłem nową tablicę wyników. Nazwałem ją 1, a kryterium zmieniania wybrałem dummy (czyli możliwe jest zmiana wartości tej tablicy jedynie przy pomocy komend).
Taki blok poleceń stworzyłem
Un1SySx.png
Komenda w tym przypadku nakazuje każdemu graczowi (@a) do wyniku o nazwie "1" (możesz ustawić inną) dodawać jeden punkt.
Ustawienie Repeat powoduje automatyczne powtarzanie tej komendy. Needs Redstone sprawia, że blok poleceń będzie funkcjonował tylko gdy będzie zasilony (czyli w tym przypadku musisz go zasilić).

/scoreboard players set @a[scores={1=100..999}] 1 0 ta komenda każdemu graczowi (@a) z wynikiem o nazwie 1 o wartości minimalnej 100, a maksymalnej 999 zmienia wartość wyniku o nazwie 1 na 0
wsadź to do bloku poleceń i ustaw by była ta komenda cały czas powtarzana.

Efekt jest taki, że każdemu graczowi bardzo szybko dodawany jest po jeden pkt do tablicy wyników o nazwie 1. Gdy uzbiera się ich 100 to wynik jest resetowany do 0
Jeśli teraz przykładowo do innego bloku poleceń wpiszesz /execute if entity @a[scores={1=10..15}] run setblock ~ ~2 ~ minecraft:acacia_wood replace to będzie on sprawdzał czy istnieje gracz z wynikiem o nazwie 1 w przedziale 10-15. Jeśli tak to dwa bloki nad blokiem poleceń powstaje drewno.
Możesz tak dla każdej wartości wyniku o nazwie "1" ustawić inny efekt. Czyli np. przy przedziale 2-3 będzie powstał diax blok, a przy 30-70 stone.

Wpisz sobie później /gamerule commandBlockOutput false by czat nie był zapełniony wiadomościami od bloku poleceń.

@edit
Jeśli nowy blok ma się pojawiać dopiero po zniszczeniu poprzedniego to musisz poprawić komendę na:
/execute if entity @a[scores={1=10..15}] if block ~ ~2 ~ air run setblock ~ ~2 ~ minecraft:acacia_wood replace
dodałem tutaj jedynie w środku if block ~ ~2 ~ air dzięki czemu oprócz sprawdzania wartości wyników blok poleceń upewnia się czy w tym miejscu jest blok powietrza (czyli nic) i dopiero wtedy zastępuje go innym blokiem.

Od paru lat nie dotykałem bloków poleceń, więc niekoniecznie zrobiłem to najlepiej. Jak coś to śmiało wołaj.

@edit2 Może warto rozważyć zmianę @a na @p bo mogą być problemy i nazwać wynik inaczej niż 1 bo przez mi się myliło.
Świat na którym to zrobiłem: https://www.dropbox.com/s/buwjo7kn6ta2gob/2019-06-19_23-33-51_New World [1].zip?dl=0

Edytowane przez Ersanek
  • Wygryw 1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

OK. Chyba rozumiem. Teoretycznie można przewidzieć co się pojawi, niszcząc blok w odpowiednim momencie.Jest to jednak, jak mniemam, trudne, gdyż score zmienia się co 1 tick. Am I right? 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
22 minuty temu, SergeantGoodberry napisał:

OK. Chyba rozumiem. Teoretycznie można przewidzieć co się pojawi, niszcząc blok w odpowiednim momencie.Jest to jednak, jak mniemam, trudne, gdyż score zmienia się co 1 tick. Am I right? 

Tak (tak na 95% pewności score zmienia się co 1 tict). Jeśli stworzysz większą ilość bloków poleceń i nie będziesz robił przedziałów w stylu 0-4 (czyli 0,1,2,3,4=5%) dla bloku złota tylko dla tego bloku ustawisz 0 później 10, 50, 78, 90 (wychodzi też 5%) to nie ma szans by ktoś przewidział pojedynczy tict.

 

@edit

Czyli przykładowa poprawiona komenda z drewnem:
/execute if entity @p[scores={1=10..11}] if block ~ ~2 ~ air run setblock ~ ~2 ~ minecraft:acacia_wood replace
/execute if entity @p[scores={1=20..21}] if block ~ ~2 ~ air run setblock ~ ~3 ~ minecraft:acacia_wood replace
/execute if entity @p[scores={1=30..31}] if block ~ ~2 ~ air run setblock ~ ~4 ~ minecraft:acacia_wood replace
/execute if entity @p[scores={1=40..41}] if block ~ ~2 ~ air run setblock ~ ~5 ~ minecraft:acacia_wood replace
/execute if entity @p[scores={1=50..51}] if block ~ ~2 ~ air run setblock ~ ~6 ~ minecraft:acacia_wood replace
Zamiast jednego przedziału np. 1-10 zrobiłem osobne bloki poleceń dla malutkich przedziałów

Możesz nawet nie robić tych małych przedziałów tylko ustawiać sztywno wartości
/execute if entity @p[scores={1=10}] if block ~ ~2 ~ air run setblock ~ ~2 ~ minecraft:acacia_wood replace
/execute if entity @p[scores={1=20}] if block ~ ~2 ~ air run setblock ~ ~3 ~ minecraft:acacia_wood replace
Tylko by osiągnąć ten sam % będziesz musiał tworzyć więcej bloków.

Nie wiem czy da się to zmieścić w jednym bloku poleceń

Można też dość łatwo wprowadzić tu modyfikatory szans np. zamiast móc otrzymywać drewienko tylko w tym przypadku score 1=10
/execute if entity @p[scores={1=10}] if block ~ ~2 ~ air run setblock ~ ~3 ~ minecraft:acacia_wood replace
to będzie można go otrzymać jeszcze w przypadku posiadania 20 pkt score "1" jeśli spełnimy dodatkowy warunek. Ja wybrałem za dodatkowy warunek zacnosc=2
/execute if entity @p[scores={1=20}] if entity @p[scores={zacnosc=2}] if block ~ ~2 ~ air run setblock ~ ~3 ~ minecraft:acacia_wood replace
Wtedy dodatkowe drewienko pojawi się tylko gdy score 1 będzie równe 20, nad blokiem poleceń będzie blok powietrza czyli nic i poziom zacności będzie wynosił 2,
a poziomy zacności będzie się otrzymywało za np. 10 diaxów. Trzeba oczywiście stworzyć nowe score o nazwie zacnosc

Edytowane przez Ersanek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@Ersanek Dzięki, twój sposób działa. Napotkałem jednak kolejny problem. Innym ficzerem mojej mapy ma być to, że poszczególne bloki pojawiają się tylko, gdy gracz posiada odpowiednie narzędzie (czyli drewniany kilof dla kamienia, siekiera dla drewna itd., tym bardziej, że mapa będzie w trybie Adventure, co uniemożliwi niszczenie bloków jakimkolwiek narzędziem, a tylko tym, które będzie posiadało odpowiednie NBT). No i, korzystając z twojego sposobu, nie jest to możliwe (no dobra, jest, jednak wymaga stworzenia rzędu bloków poleceń dla każdej możliwej kombinacji, czyli np.: gdy posiadasz tylko kilof, gdy kilof i łopatę, gdy łopatę i siekierę itd.; to wszystko zwiększyło by czas pracy nad mapą i samą ilość bloków poleceń kilkakrotnie, jeśli nie więcej). Dla ścisłości, ma to wyglądać tak, że gdy posiadasz np. tylko siekierę, to będą pojawiać się tylko bloki przypisane do tej siekiery (czyli drewno, dynia itp.), a inne bloki nie będą się pojawiać/będą zastępowane dopóki nie zdobędziesz odpowiedniego narzędzia. Teoretycznie, wykorzystując twoje rozwiązanie, można po prostu ustawić wykrywanie, czy gracz posiada dane narzędzie, czy nie i za pomocą tego, włączać/wyłączać odpowiednie komendy spawnujące odpowiednie bloki. Jednak powoduje to pozostawanie powietrza w miejscu spawnowania bloków, do momentu, gdy pojawi się valid blok.

Przez to wszystko, ponownie zastanowiłem się nad wykorzystaniem Armor Standów (chrzanić lagi, coś wymyślę 😛 ). Zauważyłem jednak, że od wersji 1.13 Mojangowcy zmienili trochę komendy: Wywalili /testforblock i zrobili kompletny overhaul komendy /execute. Czy mógłbyś wytłumaczyć mi jak działa ta komenda na przykładzie mojej mapy? (wiem, że pewnie powiedziałbyś: "Poszukaj w internecie, na YouTube, tam znajdziesz poradniki", ale takie poradniki są bardzo ogólne, a ja potrzebuję dowiedzieć się jak dokładnie wykorzystać /execute w mojej mapie)

Byłbym bardzo wdzięczny za pomoc.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Później wytłumaczę.

Na czym polega ten sposób z armorstandami? Jeśli wyjaśnisz to może wskażę lepszą alternatywę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wygląda to tak:

 

1.Najpierw sprawdzamy, czy w danym miejscu jest powietrze.

2. Jeśli tak, uruchamiany jest blok poleceń, który losuje jeden spośród iluśtam armor standów za pomocą selektora @r (każdy armor stand jest przypisany do innego bloku, jaki ma się pojawić. Jeśli chcemy aby jakiś blok pojawiał się częściej, dodajemy w jednym miejscu więcej AS, przez co zwiększa się szansa, że dany AS będzie wylosowany dla tego bloku, gdzie jest tego więcej).

3. Następnie stawiamy blok redstone'a do command blocka przypisanego do wylosowanego bloku, który ten blok spawniuje.

 

Chyba wyjaśniłem w miarę dokładnie. 😕

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do rozmowy!

Możesz napisać odpowiedź teraz, a następnie się zarejestrować. Jeżeli już masz konto, zaloguj się teraz.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.


  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...