Skocz do zawartości
  • 0
Szkło

"Jak sprawdzić czy na chunku znajduje się blok"

Pytanie

Użytkownik

Próbuję od paru dni zrobić skrypt który sprawdzałby czy na danym chunku znajduje się blok danego typu. Jeżeli takiego bloku nie ma na chunku gracz może go normalnie postawić, w przeciwnym wypadku próba postawienia drugiego bloku jest blokowana lub poprzedni jest usuwany. Przejżałem tematy i znalazłem podobny temat a w nim prawie idealny skrypt do tego co potrzebuję napisany przez xAxee:

on place:
	if event-block is mob spawner:
		set {_s} to false
		loop {SP::*}:
			if loop-value is chunk of event-block:
				set {_s} to true
		if {_s} is true:
			cancel event
			send "&7Jest ograniczenie!"
		else:
			set {SP::%location of event-block%} to chunk of event-block
on break:
	if event-block is mob spawner:
		delete {SP::%location of event-block%}

Problem w tym, że działa on na event zniszczenia bloku przez gracza oraz, że nie sprawdza obecności tego bloku na bierząco za każdym razem tylko dowiaduje się o obecności tego bloku ze zmiennej ale tym sposobem skrypt nie zalicza bloków które zostały postawione zanim uruchomiono go pierwszy raz a ze względu na konieczność użycia eventu break przy zniszczeniu tego bloku w inny sposób niż wykopanie, czyl np. za pomocą tnt nie da się już postawić tego bloku wogóle nawet jeśli go tam niema.

Chciałbym zmodyfikować to jakoś, żeby skrypt nie musiał robić nic przy niszczeniu bloku i żeby sprawdzanie czy w chunku znajduje się już taki blok odbywało się na nowo za każdą próbą postawienia tego bloku. Rozumiem tyle, że najpierw skrypt przelatuje przez wszystkie zmienne {SP::*} a potem sprawdza nie "czy na danym chunku znajduje się blok" ale "czy istnieje zmienna {SP::*} dla której w miejscu '*' znajduje się lokalizacja chunka postawionego bloku, jeśli tak to anuluje event jeśli nie to tworzy tą zmienną i nie da się już więcej postawić tego bloku a przy zniszczeniu bloku ją usuwa". (btw. Nie rozumiem natomiast czemu nie działa tak samo jeśłi zrobimy tak:)

Spoiler
on place:
	if event-block is mob spawner:
		loop {SP::*}:
			if loop-value is chunk of event-block:
				cancel event
                send "&7Jest ograniczenie!" #nie wiem czemu tutaj w kodzie pokazuje 2 taby za mało
			else:
				set {SP::%location of event-block%} to chunk of event-block
on break:
	if event-block is mob spawner:
		delete {SP::%location of event-block%}

 

Natomiast moje ostateczne pytanie jest, czy da się zrobić coś w rodzaju tego co by działało:

on place:
	if event-block is mob spawner:
		loop blocks within chunk of event-block: #tu wywala błąd
			if loop-block is event-block:
				cancel event
                send "&7Jest ograniczenie!"

"Czy da się wogóle jakoś zrobić loop wszystkich bloków w chunku a sprawdzić if'em cz w danym chunku znajduje się jakiś blok i wykonać akcję jeśli taki blok się tam znajduje i inną akcję jeżeli nie, czy jest wogóle coś takiego w skripcie?"

 

Edytowane przez Szkło

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

8 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

Użytkownik
  • 0

[ciach], ja to robię na 1.8.8 sprawdziłem na 1.14.4 i nie wywala błędu. skQuery pojawiał się przy wpisaniu /pl ale prawdopodobnie nie działał wogóle. (w przeciwieństwie do samego skripta który działa normalnie).

 

Ayyyyyy [ciach] udało się! Wykopałem gdzieś fork skripta oraz SkQuery pod 1.8:

Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!

Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!

Najnowszy build z ich discorda, jeszcze nie dali na githuba:

Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!

 

Nie da się wejść normalnie w /Skript-1.8/releases z głównej strony bo przekierowuje na jakieś Skript-1/releases/ i to wogóle coś innego ale naszczęście na discordzie był podany dobry link.

I działa (!):

on place of tnt:
	loop blocks within chunk at event-block:
		loop-block is tnt:
			add 1 to {spafnery}
	broadcast "na tym chunku jest %{spafnery}% spafneruw"
	if {spafnery} > 1:
		cancel event
		send "o %{spafnery} - 1% spafneruw za durzo"
	delete {spafnery}

To znaczy działa praktycznie dla każdego bloku oprócz mob spawnera xD. Mob spawner mi właściwie nie potrzebny bo ja chcę blokować co innego, ale tak z ciekawości to czemu/jaki jest alias na spawener? próbowałem mob_spawener mob-spawner ale [ciach] nie działa nic. Chyba że to tylko w tym forku skripta na 1.8 (Zarejestruj się lub zaloguj, aby zobaczyć ukrytą treść!)

#= For blocks that aren't in the creative mode menu in any category or that generally can't be obtained in the inventory.

(...)

# Unlisted blocks that had a different ID before the flattening.
unlisted before flattening:
	minecraft version = 1.12.2 or older
	[nether] portal [block¦s] = minecraft:portal
	[monster] spawner¦s = minecraft:mob_spawner

i na nowszej wersji by działało normalnie? Ale yea! Działa nareszcie, dzięki za pomoc! Będę jeszcze kombinował później bo potrzebuje jednak do wykrycia niszczenia albo zapobiegnięcia zniszczeniu tego bloku przez tnt (i endermana, ale to łatwiej) ale mam już chyba pomysł a jeśli nie to to na inny temat. Thx!

Edytowane przez BrixNW
BrixNW

Nie używaj wulgarnych słów.

Notatka dodana przez BrixNW

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Użytkownik
  • 0

Takie wyrażenie posiada dodatek SkQuery:

blocks within %chunk%

Kod powinien działać chyba w taki sposób:

set {lista::*} to blocks within (chunk at event-block)
loop {lista::*}:
  if loop-value = event-block:
    send "ograniczenie"
    cancel event
    stop loop

*Żeby nie było - taki sposób nie jest najlepszym rozwiązaniem na większe serwery.

Edytowane przez LuckyPotato

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
VIP
  • 0

A bez loopowania nie da rady? 

set {lista::*} to blocks within (chunk at event-block)
If {lista::*} contain mob spawner:
    Cancel event 
    Send "&4Blokawa"

No chyba że contain będzie zbugowane. 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Użytkownik
  • 0
8 godzin temu, xAxee napisał:

A bez loopowania nie da rady? 

set {lista::*} to blocks within (chunk at event-block)
If {lista::*} contain mob spawner:
    Cancel event 
    Send "&4Blokawa"

No chyba że contain będzie zbugowane. 

Zależnie od wersji skripta, któraś chyba to naprawiała.

Ogólnie to takim kodem nie unikasz pętli, unikasz tylko wykonywania jej w skrypcie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Użytkownik
  • 0

Dzięki za pomoc, dodałem skQuery ale niestety przy:

on place of a mob-spawner:
set {lista::*} to blocks within (chunk at event-block) #wywala błąd "chunk is not a number", próbowałem to jakoś zmieniać ale zawsze to samo 
	If {lista::*} contain mob spawner:
	    Cancel event 
	    Send "&4Blokada"

No chyba, żeby jednak użyć tego pierwszego ale trzeba by wtedy nakombinować się, żeby albo nie dało sie rowalić teogo bloku przez tnt albo inne gówno albo to wszystko po kolei uwzględniać, szkoda że nie ma w skripcie eventu na usunięcie bloku, obojętnie wykopanie, eksplozja czy komenda. A jest może jakiś dodatek taki jak SkQuery który by to dodawał?

Edytowane przez Szkło

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Użytkownik
  • 0
on place of mob spawner
	loop blocks within chunk at event-block:
		if loop-block is mob spawner:
			send "&cMmm ziemnioczki ( ͡° ͜ʖ ͡°)" to player
			exit loop
	stop

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Losowy awatar
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.

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

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

×