Skocz do zawartości
  • 0

Funkcja na losowy teleport


nnisu

Pytanie

Witam. Mam funkcję na losowe tp, którą napisał jeden z użytkowników forum, niestety nie wiem dlaczego ale teleportuje ona na wodę pomimo tego, że jednym z jej głównych założeń było właśnie to, żeby na wodę nie teleportowała. Tak na prawdę to w większości przypadków tepa ona na sam środek oceanu. Próbowałem różnymi sposobami to naprawić ale niestety moja wiedza nie jest wystarczająca :D Próbowałem też do zablokowanych bloków dodać wszystkie typy liści i wygląda na to, że to akurat działa. Jeśli byłby ktoś w stanie przebudować tą funkcję w taki sposób, aby nie tepała ona na: wodę, lawę oraz wszystkie typy liści to byłbym bardzo wdzięczny. Możliwe że problemem jest również to, że używam nowszej wersji Minecraft (1.20.4). Nie wiem. Za każdą pomoc z góry bardzo dziękuję.

Funkcja:


function getRandomLoc(xmin: integer=-1000, xmax: integer=1000, zmin: integer=-1000, zmax: integer=1000, world: text="world") :: location:
	while {_return} is not set:
		set {_x} to random integer between {_xmin} and {_xmax}
		set {_z} to random integer between {_zmin} and {_zmax}
		set {_loc} to highest solid block at location at {_x}, 0, {_z} in world ({_world} parsed as world)
		if block at {_loc} != oak leaves or spruce leaves or birch leaves or jungle leaves or acacia leaves or dark oak leaves or mangrove leaves or cherry leaves or azalea leaves or flowering azalea leaves or water:
			add 1 to y-loc of {_loc}
			if (block at {_loc}) and (block above block at {_loc}) != lava:
				set {_return} to {_loc}
	return {_return}

 

Odnośnik do komentarza
https://skript.pl/temat/57663-funkcja-na-losowy-teleport/
Udostępnij na innych stronach

4 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
1 godzinę temu, nnisu napisał:

Witam. Mam funkcję na losowe tp, którą napisał jeden z użytkowników forum, niestety nie wiem dlaczego ale teleportuje ona na wodę pomimo tego, że jednym z jej głównych założeń było właśnie to, żeby na wodę nie teleportowała. Tak na prawdę to w większości przypadków tepa ona na sam środek oceanu. Próbowałem różnymi sposobami to naprawić ale niestety moja wiedza nie jest wystarczająca :D Próbowałem też do zablokowanych bloków dodać wszystkie typy liści i wygląda na to, że to akurat działa. Jeśli byłby ktoś w stanie przebudować tą funkcję w taki sposób, aby nie tepała ona na: wodę, lawę oraz wszystkie typy liści to byłbym bardzo wdzięczny. Możliwe że problemem jest również to, że używam nowszej wersji Minecraft (1.20.4). Nie wiem. Za każdą pomoc z góry bardzo dziękuję.

Zastanawia mnie to w jaki sposób Panu ten skrypt w ogóle zadziałał. Proszę zauważyć, że do zmiennej {_loc} zapisujemy informację o bloku (nie jego lokalizację!), a następnie używamy tej zmiennej tak jakby przechowywała informację o lokalizacji. Być może jest to jakaś specyfika Skript, ewentualnie twórcy dodali takie zabezpieczenie, aby mniej doświadczeni skrypterzy nie wyrywali sobie włosów, bo właściwie proszą o 'block at highest solid block at %location%...'.

Druga sprawa to to, że nie musi Pan wypisywać wszystkich rodzajów liści. Wystarczy użyć aliasu 'any leaves' w celu porównania bloku.

Proszę bardzo. Bazując na Pana poście, uznałem go jako zlecenie. Na następny raz proszę zwracać na to uwagę, gdyż ten post powinien się znaleźć w dziale "Skript > Zlecenia". Dział "Skript > Pytania i problemy" służy do odpowiedzi na pewne pytania bądź nakierowywania borykających się z problemami na poprawne odpowiedzi.

Może Pan zauważyć, że dla bezpieczeństwa użyłem wyrażenia 'type of %block%'. Co prawda Skript jest w tej kwestii "inteligentny" i zrozumiałby porównanie bloku z typem bloku, jednakże w ten sposób dajemy sobie gwarancję poprawnego sprawdzenia zgodności typów bloków.

Zaznaczam, że skrypt nie był testowany.

function getRandomLoc(xmin: integer=-1000, xmax: integer=1000, zmin: integer=-1000, zmax: integer=1000, world: text="world") :: location:
	while {_return} is not set:
		set {_x} to random integer between {_xmin} and {_xmax}
		set {_z} to random integer between {_zmin} and {_zmax}
		set {_loc} to location of highest solid block at location at ({_x}, 0, {_z}) in world {_world}
		if type of block at {_loc} != any leaves or water or lava:
			add 1 to y of {_loc}
			type of block at {_loc} != lava
			type of block above block at {_loc} != lava
			set {_return} to {_loc}
	return {_return}

Pozdrawiam.

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/57663-funkcja-na-losowy-teleport/#findComment-343001
Udostępnij na innych stronach

  • 0
Godzinę temu, Kormic napisał:

Zastanawia mnie to w jaki sposób Panu ten skrypt w ogóle zadziałał. Proszę zauważyć, że do zmiennej {_loc} zapisujemy informację o bloku (nie jego lokalizację!), a następnie używamy tej zmiennej tak jakby przechowywała informację o lokalizacji. Być może jest to jakaś specyfika Skript, ewentualnie twórcy dodali takie zabezpieczenie, aby mniej doświadczeni skrypterzy nie wyrywali sobie włosów, bo właściwie proszą o 'block at highest solid block at %location%...'.

Druga sprawa to to, że nie musi Pan wypisywać wszystkich rodzajów liści. Wystarczy użyć aliasu 'any leaves' w celu porównania bloku.

Proszę bardzo. Bazując na Pana poście, uznałem go jako zlecenie. Na następny raz proszę zwracać na to uwagę, gdyż ten post powinien się znaleźć w dziale "Skript > Zlecenia". Dział "Skript > Pytania i problemy" służy do odpowiedzi na pewne pytania bądź nakierowywania borykających się z problemami na poprawne odpowiedzi.

Może Pan zauważyć, że dla bezpieczeństwa użyłem wyrażenia 'type of %block%'. Co prawda Skript jest w tej kwestii "inteligentny" i zrozumiałby porównanie bloku z typem bloku, jednakże w ten sposób dajemy sobie gwarancję poprawnego sprawdzenia zgodności typów bloków.

Zaznaczam, że skrypt nie był testowany.

function getRandomLoc(xmin: integer=-1000, xmax: integer=1000, zmin: integer=-1000, zmax: integer=1000, world: text="world") :: location:
	while {_return} is not set:
		set {_x} to random integer between {_xmin} and {_xmax}
		set {_z} to random integer between {_zmin} and {_zmax}
		set {_loc} to location of highest solid block at location at ({_x}, 0, {_z}) in world {_world}
		if type of block at {_loc} != any leaves or water or lava:
			add 1 to y of {_loc}
			type of block at {_loc} != lava
			type of block above block at {_loc} != lava
			set {_return} to {_loc}
	return {_return}

Pozdrawiam.

Dziękuję za pomoc. Okazuje się, że funkcja działa tylko w momencie gdy jedynym wykluczonym blokiem jest woda. Wtedy nie tepa do wody. W momencie gdy dodaje liście lub lawę, zaczyna ona tepać do wody. Wystarczy mi funkcja z samym wykluczeniem wody, także dziękuję bardzo za pomoc. Co do ustawienia odpowiedniego tematu posta, na następny raz będę wiedział. Wie Pan skąd może wychodzić takie zjawisko? Z tepaniem na wodę tylko po wykluczeniu większej ilości bloków? dodam też, że przy wykluczeniu liści, lawy i wody, wykluczenie liści oraz lawy działa. To znaczy, nie jestem tepany na te bloki (tylko i wyłącznie na wodę). Dziwne zjawisko, czy to jakiś błąd? Dziękuję jeszcze raz i pozdrawiam serdecznie.

Odnośnik do komentarza
https://skript.pl/temat/57663-funkcja-na-losowy-teleport/#findComment-343002
Udostępnij na innych stronach

  • 0
19 minut temu, nnisu napisał:

Dziękuję za pomoc. Okazuje się, że funkcja działa tylko w momencie gdy jedynym wykluczonym blokiem jest woda. Wtedy nie tepa do wody. W momencie gdy dodaje liście lub lawę, zaczyna ona tepać do wody. Wystarczy mi funkcja z samym wykluczeniem wody, także dziękuję bardzo za pomoc. Co do ustawienia odpowiedniego tematu posta, na następny raz będę wiedział. Wie Pan skąd może wychodzić takie zjawisko? Z tepaniem na wodę tylko po wykluczeniu większej ilości bloków? dodam też, że przy wykluczeniu liści, lawy i wody, wykluczenie liści oraz lawy działa. To znaczy, nie jestem tepany na te bloki (tylko i wyłącznie na wodę). Dziwne zjawisko, czy to jakiś błąd? Dziękuję jeszcze raz i pozdrawiam serdecznie.

W rzeczy samej ciekawe. Będąc szczerym, nie mam pojęcia dlaczego wykluczenie innych bloków poza wodą powoduje takie zachowanie. Z ciekawości, niech Pan sprawdzi co się dzieje gdy Pan wykluczy tylko lawę i wodę. Być może alias 'any leaves' w połączeniu z wodą jest przyczyną tego problemu.

Wracając do meritum, myślę, że mam remedium na to. Wykorzystam instrukcję warunkową 'if any'.

function getRandomLoc(xmin: integer=-1000, xmax: integer=1000, zmin: integer=-1000, zmax: integer=1000, world: text="world") :: location:
	while {_return} is not set:
		set {_x} to random integer between {_xmin} and {_xmax}
		set {_z} to random integer between {_zmin} and {_zmax}
		set {_loc} to location of highest solid block at location at ({_x}, 0, {_z}) in world {_world}
		if any:
			type of block at {_loc} = any leaves
			type of block at {_loc} = water
			type of block at {_loc} = lava
		then:
			stop
		add 1 to y of {_loc}
		type of block at {_loc} != lava
		type of block above block at {_loc} != lava
		set {_return} to {_loc}
	return {_return}

Można również rozwiązać to za pomocą listy, która będzie zawierała zabronione typy bloków.

function getRandomLoc(xmin: integer=-1000, xmax: integer=1000, zmin: integer=-1000, zmax: integer=1000, world: text="world") :: location:
	while {_return} is not set:
		set {_x} to random integer between {_xmin} and {_xmax}
		set {_z} to random integer between {_zmin} and {_zmax}
		set {_loc} to location of highest solid block at location at ({_x}, 0, {_z}) in world {_world}
		set {_forbiddenBlockTypes::*} to any leaves, water and lava
		if {_forbiddenBlockTypes::*} contains type of block at {_loc}:
			stop
		add 1 to y of {_loc}
		type of block at {_loc} != lava
		type of block above block at {_loc} != lava
		set {_return} to {_loc}
	return {_return}

Oczywiście możliwym jest również zapętlenie listy {_forbiddenBlockTypes::*} i porównywanie w środku pętli 'loop-value' z 'type of block at {_loc}', ale powinny wystarczyć Panu powyższe dwa warianty.

Pozdrawiam.

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/57663-funkcja-na-losowy-teleport/#findComment-343003
Udostępnij na innych stronach

  • 0
20 minut temu, Kormic napisał:

W rzeczy samej ciekawe. Będąc szczerym, nie mam pojęcia dlaczego wykluczenie innych bloków poza wodą powoduje takie zachowanie. Z ciekawości, niech Pan sprawdzi co się dzieje gdy Pan wykluczy tylko lawę i wodę. Być może alias 'any leaves' w połączeniu z wodą jest przyczyną tego problemu.

Wracając do meritum, myślę, że mam remedium na to. Wykorzystam instrukcję warunkową 'if any'.

function getRandomLoc(xmin: integer=-1000, xmax: integer=1000, zmin: integer=-1000, zmax: integer=1000, world: text="world") :: location:
	while {_return} is not set:
		set {_x} to random integer between {_xmin} and {_xmax}
		set {_z} to random integer between {_zmin} and {_zmax}
		set {_loc} to location of highest solid block at location at ({_x}, 0, {_z}) in world {_world}
		if any:
			type of block at {_loc} = any leaves
			type of block at {_loc} = water
			type of block at {_loc} = lava
		then:
			stop
		add 1 to y of {_loc}
		type of block at {_loc} != lava
		type of block above block at {_loc} != lava
		set {_return} to {_loc}
	return {_return}

Można również rozwiązać to za pomocą listy, która będzie zawierała zabronione typy bloków.

function getRandomLoc(xmin: integer=-1000, xmax: integer=1000, zmin: integer=-1000, zmax: integer=1000, world: text="world") :: location:
	while {_return} is not set:
		set {_x} to random integer between {_xmin} and {_xmax}
		set {_z} to random integer between {_zmin} and {_zmax}
		set {_loc} to location of highest solid block at location at ({_x}, 0, {_z}) in world {_world}
		set {_forbiddenBlockTypes::*} to any leaves, water and lava
		if {_forbiddenBlockTypes::*} contains type of block at {_loc}:
			stop
		add 1 to y of {_loc}
		type of block at {_loc} != lava
		type of block above block at {_loc} != lava
		set {_return} to {_loc}
	return {_return}

Oczywiście możliwym jest również zapętlenie listy {_forbiddenBlockTypes::*} i porównywanie w środku pętli 'loop-value' z 'type of block at {_loc}', ale powinny wystarczyć Panu powyższe dwa warianty.

Pozdrawiam.

Dziękuję bardzo za pomoc, okazuje się, że na serwerze jakiś plugin najprawdopodobniej gryzie się ze skryptem. Po usunięciu wszystkich pluginów i przetestowaniu tylko funkcji zaproponowanych przez Pana wszystko działa bez problemu. Także przepraszam za lekki problem z racji że problem występował po mojej stronie. Jednocześnie dziękuję za pomoc. Pozdrawiam

Odnośnik do komentarza
https://skript.pl/temat/57663-funkcja-na-losowy-teleport/#findComment-343004
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Odpowiedz na pytanie...

×   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.

  • Ostatnio przeglądający   0 użytkowników

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