Skocz do zawartości
  • 0

stawianie blokow na danym terenie


Pytanie

9 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Jestem zawiedziony poziomem interpretacji w postach skryptowiczów powyżej. Użytkownik jasno stwierdza, że potrzebuje skryptu na regenerację kowadeł w danym regionie. Zarys skryptu, który opublikował @CoFFeIN04 jest okej, jednakże zamienia on wszystkie bloki na kowadła, zamiast kowadła na kowadła. Jeszcze bardziej zagłębiając się w sens pierworodnego posta można domyślić się, iż użytkownikowi bardziej przydał by się na skrypt na niezniszczalne kowadła niż na regenerację ich co przykładowe 10 minut.

Opcja z regeneracją kowadeł:

every 10 minutes:
	set {_anvils::*} to all blocks in region "kowadla" where [block input is an anvil]
	loop {_anvils::*}:
		set block at loop-value to an anvil


Domysłowe lepsze rozwiązanie z ich niezniszczalnością (Niestety ta wersja anuluje zniszczenie wszystkich kowadeł, nawet tych poza regionem):

on anvil damage:
	cancel event


 

Odnośnik do komentarza
https://skript.pl/temat/57995-stawianie-blokow-na-danym-terenie/#findComment-344541
Udostępnij na innych stronach

  • 0

Muszę sprostować moją wypowiedź: tyczy się ona regionu, w którym kowadła są ustawione w wielki stos w prostopadłościanie. Taką wizję tego regionu "kowadla" przyjąłem po przeczytaniu posta.

11 godzin temu, CoFFeIN04 napisał:
every 10 minutes:
	set all blocks in region "kowadla" to anvil

 

 

Jeśli jest jednak trochę inaczej - jedną z opcji może być:

on rightclick on anvil:
	region at location of clicked block = "kowadla"
	cancel event
	open anvil inventory to player

lub

on rightclick on anvil:
	region at location of clicked block = "kowadla"
	set event-block to anvil

 

Odnośnik do komentarza
https://skript.pl/temat/57995-stawianie-blokow-na-danym-terenie/#findComment-344543
Udostępnij na innych stronach

  • 0

@CoFFeIN04 @polsatgraniepl @Xyntegi_ok

Zanim zamknę temat, chciałbym powiedzieć, że wszystkie powyższe kody nie działają na wersji 1.21 z najnowszą wersją Skripta i WorldGuarda, ponieważ:

  • Skript nie jest w stanie zrozumieć tekstu jako regionu (to znaczy, pobrać regionu na podstawie jego nazwy),
  • porównywanie obiektu regionu z tekstem nigdy nie zadziała, co jest bezpośrednio powiązane z tym co napisałem wyżej.

Jak można więc pobrać region na podstawie nazwy? Cóż, jedyny działający sposób w czystym Skript'cie to użycie wyrażenia '%text% parsed as %*type%'. Przykład poniżej.

set {_region} to "kowadla" parsed as region

Dzięki powyższej linijce uzyskujemy region na podstawie jego nazwy. Należy jednak uważać, ponieważ nie zadziała on dla regionów dzielących tę samą nazwę, ale istniejących w różnych światach (WorldGuard dopuszcza tworzenie takich regionów).

Po otrzymaniu obiektu reprezentującego region reszta kodu regenerującego uszkodzone kowadła staje się trywialna.

every 10 seconds:
	set {_region} to "kowadla" parsed as region
	set (blocks in region {_region} where [input is any anvil]) to anvil

Wspomnę jeszcze tylko o tym, że choć wedle dokumentacji słowo 'region' w składni wyrażenia 'blocks in %region%' jest opcjonalne, ze względu na kolizję składni musi ono się tam znaleźć.

Finalnie, jeszcze mam trzy uwagi- jedną do Coffeina i dwie do polsatgranie.


@CoFFeIN04: otwieranie GUI kowadła poprzez Skripta co prawda zadziała, ale takie GUI jest bezużyteczne, ponieważ nic nie da się w nim zrobić. Warto tu powiedzieć, że jest to problem związany z Bukkit API, a nie z samym Skriptem. Aby uporać się z tym problemem, należy wykorzystać albo wysyłanie pakietów, albo pakiet NMS. Można się tutaj posłużyć biblioteką AnvilGUI, która zdecydowanie ułatwia te zadanie.

@polsatgraniepl:

  1. Alias 'an anvil' obejmuje jedynie nieuszkodzone kowadło. Aby skrypt obsługiwał kowadła w dowolnym stanie, należy użyć aliasu 'any anvil'.
  2. Zalecam nie podawać typu przy wyrażeniu 'input', ponieważ czasem powoduje to brak działania filtru. Przynajmniej tak było w wersji Skripta 2.9.0, nie miałem okazji przetestować tego w wersji 2.9.1.
W dniu 6.08.2024 o 00:12, polsatgraniepl napisał:

Domysłowe lepsze rozwiązanie z ich niezniszczalnością (Niestety ta wersja anuluje zniszczenie wszystkich kowadeł, nawet tych poza regionem):

on anvil damage:
	cancel event

Zdarzenie 'anvil damage' jest jednym z tych zdarzeń, których użyteczność jest niemalże bliska zerowej, ponieważ (najprawdopodobniej) nie posiada jakichkolwiek wartości możliwych do pobrania związanych ze zdarzeniem, co jest następstwem wpakowania go do klasy SimpleEvents, która "przechowuje" dziesiątki innych takich mało użytecznych zdarzeń.

Pozdrawiam.

Odnośnik do komentarza
https://skript.pl/temat/57995-stawianie-blokow-na-danym-terenie/#findComment-344580
Udostępnij na innych stronach

  • 0
32 minuty temu, Kormic napisał:

że wszystkie powyższe kody nie działają na wersji 1.21 z najnowszą wersją Skripta i WorldGuarda

Dementuje. Swoje kody testowałem na wersji purpur-1.21-2275, Skript-2.9.1 oraz worldguard-bukkit-7.0.11-beta1-dist wraz z worldedit-bukkit-7.3.5. Kod działał oraz nie zwracał żadnego błędu.

Odnośnik do komentarza
https://skript.pl/temat/57995-stawianie-blokow-na-danym-terenie/#findComment-344586
Udostępnij na innych stronach

  • 0
1 godzinę temu, polsatgraniepl napisał:

Dementuje. Swoje kody testowałem na wersji purpur-1.21-2275, Skript-2.9.1 oraz worldguard-bukkit-7.0.11-beta1-dist wraz z worldedit-bukkit-7.3.5. Kod działał oraz nie zwracał żadnego błędu.

Faktycznie, zwracam honor. Wyrażenie zwraca listę bloków i je ustawia. Niemniej jednak, moja uwaga co do 'an anvil' nadal jest słuszna, ponieważ skrypt podmienia jedynie nieuszkodzone kowadła, więc nie ma mowy o regeneracji. Wątpię aby silnik miał wpływ na to, bo aliasy są zdefiniowane w samym Skript'cie. Mogę tutaj tylko powiedzieć, że mój serwer postawiony na localhost'cie jest oparty o silnik Paper 1.21-111. a wymienione wtyczki mają dokładnie te same wersje co Twoje.

Przetestowałem również kod Coffeina i warunek porównujący region z tekstem działa, więc musiałem najprawdopodobniej zapomnieć o usunięciu drugiego takiego samego regionu w innym świecie (choć byłem święcie przekonany, że go usunąłem). Ewentualnie doznałem jakiegoś bardzo rzadkiego błędu ze strony Skripta.
Nadal jednak oba kody Coffeina borykają się z błędami, o których wspominałem wyżej i wymienię je ponownie: otwieranie niefunkcjonalnego GUI kowadła i działanie naprawiającego skryptu jedynie po kliknięciu na nieuszkodzone kowadło. Aby on działał, należałoby wykorzystać zdarzenie 'on rightclick on any anvil'.

Przepraszam za zamieszanie i pozdrawiam.

Odnośnik do komentarza
https://skript.pl/temat/57995-stawianie-blokow-na-danym-terenie/#findComment-344589
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ę...