Skocz do zawartości
  • 0

on inventory click


Psycho1337

Pytanie

Witam, mam problem ze skryptem. Jest to skrypt na akcesoria. Działa wszystko poza jedną funkcją. Chodzi o to, że po kliknięciu założonej skóry powinna odjąć się odporność oraz maksymalny poziom życia gracza, jednak to się nie dzieje.
Tu udostępniam część kodu, która według mnie się sypie:

on inventory click:
    if inventory name of player's current inventory is "  &6&lAkcesoria":
        cancel event
        if clicked slot is 8:
            close player's inventory
# SKÓRA
        if clicked slot is 0:
            if {skoraeq.%player%} is 0:
                send "  &8» &cNie masz ubranej Skóry!" to player
            if {skoraeq.%player%} is 1:
                wait a tick
                set slot 0 of player's current inventory to cyan glass named " &eSkóra " with lore "  &7Brak "
                set {skoraeq.%player%} to 0
                set {_lore5::*} to uncoloured line 5 of event-item's lore split at ":"
                set {_odp1} to {_lore5::2} parsed as an number
                set {_lore6::*} to uncoloured line 6 of event-item's lore split at ":"
                set {_hp1} to {_lore6::2} parsed as an number
                remove {_hp1} from the maximum health of the player
                remove {_odp1} / 10 from {odpornoscbonus::%player%}
                give 1 of {skora::item} to player
                send "  &8» &7Zdjąłeś Skórę!" to player
                stop


Tu udostępniam cały kod: 

 

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/
Udostępnij na innych stronach

18 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Więc na sam początek, może trochę estetycznie, ale jak sprawdzasz sloty to lepiej robić to:

if clicked slot is 0:
	[]
else if clicked slot is 8:
	[]

mianowicie chodzi o else, aczkolwiek to nic raczej nie zmienia.

Identycznie tutaj:

if {skoraeq.%player%} is 0:
else if {skoraeq.%player%} is 1:

 

1 godzinę temu, Psycho1337 napisał:

send " &8» &7Zdjąłeś Skórę!" to player

Czy ta linijka się wykonuje?

1 godzinę temu, Psycho1337 napisał:

wait a tick

Usuń, zbędne - pozwoli na bugowanie.

 

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276067
Udostępnij na innych stronach

  • 0
7 minut temu, CoFFeIN04 napisał:

Więc na sam początek, może trochę estetycznie, ale jak sprawdzasz sloty to lepiej robić to:


if clicked slot is 0:
	[]
else if clicked slot is 8:
	[]

mianowicie chodzi o else, aczkolwiek to nic raczej nie zmienia.

Identycznie tutaj:


if {skoraeq.%player%} is 0:
else if {skoraeq.%player%} is 1:

 

Czy ta linijka się wykonuje?

Usuń, zbędne - pozwoli na bugowanie.

 

linijka z sendem się wykonuje
 

                set {_lore5::*} to uncoloured line 5 of event-item's lore split at ":"
                set {_odp1} to {_lore5::2} parsed as an number
                set {_lore6::*} to uncoloured line 6 of event-item's lore split at ":"
                set {_hp1} to {_lore6::2} parsed as an number
                remove {_hp1} from the maximum health of the player
                remove {_odp1} / 10 from {odpornoscbonus::%player%}

to raczej się nie wykonuje

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276069
Udostępnij na innych stronach

  • 0

najprościej będzie dodać jakąś wiadomość w celu zdebugowania:


send "- %{_lore5::*}%"
send "- %{_lore5::2}%"
send "- %{_odp1}%"
send "- %{_odp6::*}%"
send "- %{_lore6::2}%"
send "- %{_hp1}%"
send "- %{odpornoscbonus::%player%}%"

 

Edytowane przez CoFFeIN04
Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276070
Udostępnij na innych stronach

  • 0
Godzinę temu, CoFFeIN04 napisał:

najprościej będzie dodać jakąś wiadomość w celu zdebugowania:



send "- %{_lore5::*}%"
send "- %{_lore5::2}%"
send "- %{_odp1}%"
send "- %{_odp6::*}%"
send "- %{_lore6::2}%"
send "- %{_hp1}%"
send "- %{odpornoscbonus::%player%}%"

 

https://imgur.com/a/kfF1fyX

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276071
Udostępnij na innych stronach

  • 0

Mam nadzieję, że dodałeś te sendy od razu po :

                set {_lore5::*} to uncoloured line 5 of event-item's lore split at ":"
                set {_odp1} to {_lore5::2} parsed as an number
                set {_lore6::*} to uncoloured line 6 of event-item's lore split at ":"
                set {_hp1} to {_lore6::2} parsed as an number
                remove {_hp1} from the maximum health of the player
                remove {_odp1} / 10 from {odpornoscbonus::%player%}

 

Z tego co widzę to nie. Zmienne z _ to zmienne tymczasowe, czyli usuwają się po zakończeniu eventu

Edytowane przez CoFFeIN04
Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276072
Udostępnij na innych stronach

  • 0
7 godzin temu, Psycho1337 napisał:

Witam, mam problem ze skryptem. Jest to skrypt na akcesoria. Działa wszystko poza jedną funkcją. Chodzi o to, że po kliknięciu założonej skóry powinna odjąć się odporność oraz maksymalny poziom życia gracza, jednak to się nie dzieje.
Tu udostępniam część kodu, która według mnie się sypie:

Według mnie skrypt się sypie z powodu źle przechwytywanego lore, gdyż niemalże cały skrypt opiera się na nim.

Pokaż cały przedmiot (tę skórę), zrób jego screenshot i podeślij.

Co do samego kodu...

  1. W mojej ocenie wszelkie 'wait 1 tick' powinny zostać usunięte z tego kodu, gdyż nie mają większego wpływu na działanie kodu, a dają jedynie pole do popisu wszelkim pajacom chcącym bugować każde GUI.
  2. Żaden ze 'stop' nie jest potrzebny w kodzie i nie ma jakiegokolwiek wpływu na jego działanie.
  3. W nazwie zmiennej {skoraeq.*} zamień kropkę na podwójny dwukropek, pozwoli ci to na o wiele prostsze operowanie na tej zmiennej u wszystkich graczy, gdyż to będzie lista zmiennych, a nie zwykła zmienna.
    # Listę zmiennych możesz wyczyścić
    clear {skoraeq::*}
    
    # Listę zmiennych możesz zapętlić (w przypadku {skoraeq::*} loop-index to będzie nazwa gracza, a loop-value to będzie wartość tej zmiennej)
    loop {skoraeq::*}:
    	send "%loop-index% - %loop-value%"
        
    # Możesz sprawdzić jej rozmiar w łatwy sposób
    send "%size of {skoraeq::*}%"
    
    # Żadnej z powyższych rzeczy nie wykonasz przy pomocy zwykłych zmiennych
  4. W evencie 'on inventory click' tuż po sprawdzaniu nazwy GUI powinieneś sprawdzać czy gracz aby przypadkiem nie kliknął swojego ekwipunku. Wykonasz to za pomocą tego warunku.
    if clicked inventory is not player's inventory:
    	# Dalszy kod
        
    # Dzięki temu kliknięcie chociażby slotu nr 8 w naszym ekwipunku nie spowoduje zamknięcia go.

 

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276082
Udostępnij na innych stronach

  • 0
2 godziny temu, Kormic napisał:

Według mnie skrypt się sypie z powodu źle przechwytywanego lore, gdyż niemalże cały skrypt opiera się na nim.

Pokaż cały przedmiot (tę skórę), zrób jego screenshot i podeślij.

Co do samego kodu...

  1. W mojej ocenie wszelkie 'wait 1 tick' powinny zostać usunięte z tego kodu, gdyż nie mają większego wpływu na działanie kodu, a dają jedynie pole do popisu wszelkim pajacom chcącym bugować każde GUI.
  2. Żaden ze 'stop' nie jest potrzebny w kodzie i nie ma jakiegokolwiek wpływu na jego działanie.
  3. W nazwie zmiennej {skoraeq.*} zamień kropkę na podwójny dwukropek, pozwoli ci to na o wiele prostsze operowanie na tej zmiennej u wszystkich graczy, gdyż to będzie lista zmiennych, a nie zwykła zmienna.
    
    
    # Listę zmiennych możesz wyczyścić
    clear {skoraeq::*}
    
    # Listę zmiennych możesz zapętlić (w przypadku {skoraeq::*} loop-index to będzie nazwa gracza, a loop-value to będzie wartość tej zmiennej)
    loop {skoraeq::*}:
    	send "%loop-index% - %loop-value%"
        
    # Możesz sprawdzić jej rozmiar w łatwy sposób
    send "%size of {skoraeq::*}%"
    
    # Żadnej z powyższych rzeczy nie wykonasz przy pomocy zwykłych zmiennych
  4. W evencie 'on inventory click' tuż po sprawdzaniu nazwy GUI powinieneś sprawdzać czy gracz aby przypadkiem nie kliknął swojego ekwipunku. Wykonasz to za pomocą tego warunku.
    
    
    if clicked inventory is not player's inventory:
    	# Dalszy kod
        
    # Dzięki temu kliknięcie chociażby slotu nr 8 w naszym ekwipunku nie spowoduje zamknięcia go.

 

2QK14uu.png
 - to jest screen itemku

Zmieniłem w kodzie wszystko, co napisałeś

Edytowane przez xNightPower_
Nieaktywny

Zamieniam link w obraz.

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276108
Udostępnij na innych stronach

  • 0
34 minuty temu, Psycho1337 napisał:

2QK14uu.png
 - to jest screen itemku

Zmieniłem w kodzie wszystko, co napisałeś

Tak też myślałem, źle przechwytujesz lore. Splitujesz linijkę lore na dwukropku i pokażę na przykładzie linijki 7., że źle to robisz. Zauważ, że przed liczbą masz spację i zapewne ona odpowiada za niedziałający skrypt.

# Linijka nr 7 twojego lore to "&7Wymagany poziom: &f4"
# Po splitowaniu na dwukropku niekolorowanej linijki 7. otrzymujesz:
# {_lore7::1} to jest "Wymagany poziom"
# {_lore7::2} to jest " 4"

Na twoim miejscu przechwytywałbym tę liczbę za pomocą subtextu, byłoby to o wiele wygodniejsze. Podam przykład do linijki 7, resztę dorobisz sobie samemu.

set {_lore} to uncoloured line 7 of player's tool's lore
set {_wartosc} to last (length of {_lore} - 17) characters of {_lore}
add ({_wartosc} parsed as number) to {twojaZmienna}

# 'length of {_lore}' reprezentuje długość niekolorowanej linijki 7.
# Odejmujemy od niej 17, gdyż tyle jest znaków przed tą liczbą (wliczając spacje!)

 

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276117
Udostępnij na innych stronach

  • 0
2 minuty temu, Kormic napisał:

Tak też myślałem, źle przechwytujesz lore. Splitujesz linijkę lore na dwukropku i pokażę na przykładzie linijki 7., że źle to robisz. Zauważ, że przed liczbą masz spację i zapewne ona odpowiada za niedziałający skrypt.


# Linijka nr 7 twojego lore to "&7Wymagany poziom: &f4"
# Po splitowaniu na dwukropku niekolorowanej linijki 7. otrzymujesz:
# {_lore7::1} to jest "Wymagany poziom"
# {_lore7::2} to jest " 4"

Na twoim miejscu przechwytywałbym tę liczbę za pomocą subtextu, byłoby to o wiele wygodniejsze. Podam przykład do linijki 7, resztę dorobisz sobie samemu.


set {_lore} to uncoloured line 7 of player's tool's lore
set {_wartosc} to last (length of {_lore} - 17) characters of {_lore}
add ({_wartosc} parsed as number) to {twojaZmienna}

# 'length of {_lore}' reprezentuje długość niekolorowanej linijki 7.
# Odejmujemy od niej 17, gdyż tyle jest znaków przed tą liczbą (wliczając spacje!)

 

Wydaje mi się, że to nie w tym leży problem. Już tłumaczę:
Po kliknięciu prawym na przedmiot mając go w ekwipunku, wszystko działa. Przedmiot pojawia się w GUI Akcesroiów, dodaje się odporność.
Jednak w przypadku klikania tego przedmiotu w GUI, on się wyjmuje stamtąd, dostaje się go do z powrotem do ewkipunku, ale nie czyta żadnej lore ani nic z tego przedmiotu.
Chodzi mi o:

                set {_lore5::*} to uncoloured line 5 of event-item's lore split at ":"
                set {_odp1} to {_lore5::2} parsed as an number
                set {_lore6::*} to uncoloured line 6 of event-item's lore split at ":"
                set {_hp1} to {_lore6::2} parsed as an number
                remove {_hp1} from the maximum health of the player
                remove {_odp1} / 10 from {odpornoscbonus::%player%}

Moim zdaniem chodzi o event-item, bo kod został przepisany jak w przypadku klikania prawym, gdzie wszystko działa, tylko tam jest "player's tool's" a nie "event-item's" i myślę, że gdzieś w tym jest błąd, ale nie wiem jak to zastąpić.

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276120
Udostępnij na innych stronach

  • 0
18 minut temu, Psycho1337 napisał:

Wydaje mi się, że to nie w tym leży problem. Już tłumaczę:
Po kliknięciu prawym na przedmiot mając go w ekwipunku, wszystko działa. Przedmiot pojawia się w GUI Akcesroiów, dodaje się odporność.
Jednak w przypadku klikania tego przedmiotu w GUI, on się wyjmuje stamtąd, dostaje się go do z powrotem do ewkipunku, ale nie czyta żadnej lore ani nic z tego przedmiotu.
Chodzi mi o:


                set {_lore5::*} to uncoloured line 5 of event-item's lore split at ":"
                set {_odp1} to {_lore5::2} parsed as an number
                set {_lore6::*} to uncoloured line 6 of event-item's lore split at ":"
                set {_hp1} to {_lore6::2} parsed as an number
                remove {_hp1} from the maximum health of the player
                remove {_odp1} / 10 from {odpornoscbonus::%player%}

Moim zdaniem chodzi o event-item, bo kod został przepisany jak w przypadku klikania prawym, gdzie wszystko działa, tylko tam jest "player's tool's" a nie "event-item's" i myślę, że gdzieś w tym jest błąd, ale nie wiem jak to zastąpić.

W Skript raczej nie ma wyrażenia 'event-item', jest 'event-slot', który zawiera informację o klikniętym slocie i jego zawartości (przedmiocie w nim). Zamień 'event-item' na 'event-slot' i sprawdź jeszcze raz jak działa kod.

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276131
Udostępnij na innych stronach

  • 0
6 minut temu, Kormic napisał:

W Skript raczej nie ma wyrażenia 'event-item', jest 'event-slot', który zawiera informację o klikniętym slocie i jego zawartości (przedmiocie w nim). Zamień 'event-item' na 'event-slot' i sprawdź jeszcze raz jak działa kod.

Nawet nie mam jak sprawdzić działania skryptu. Przeładowuje bez errorów, ale jak teraz klikam Skórę, aby ją założyć, to od razu wywala serwer.
Tutaj błąd z konsoli:

[13:56:51] [Server thread/ERROR]: Encountered an unexpected exception
java.lang.AssertionError: TRAP
        at net.minecraft.server.v1_16_R2.ItemStack.checkEmpty(ItemStack.java:99) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.ItemStack.setCount(ItemStack.java:890) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.PlayerInteractManager.a(PlayerInteractManager.java:407) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.PlayerConnection.a(PlayerConnection.java:1347) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:28) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:1) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.TickTask.run(SourceFile:18) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.IAsyncTaskHandler.executeTask(SourceFile:144) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.IAsyncTaskHandler.executeNext(SourceFile:118) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.MinecraftServer.ba(MinecraftServer.java:941) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.MinecraftServer.executeNext(MinecraftServer.java:934) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.IAsyncTaskHandler.awaitTasks(SourceFile:127) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.MinecraftServer.sleepForTick(MinecraftServer.java:918) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.MinecraftServer.w(MinecraftServer.java:850) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at net.minecraft.server.v1_16_R2.MinecraftServer.lambda$0(MinecraftServer.java:164) ~[spigot-1.16.3.jar:git-Spigot-17d78db-f8d4da0]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]

 

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276132
Udostępnij na innych stronach

  • 0
Teraz, Psycho1337 napisał:

Nawet nie mam jak sprawdzić działania skryptu. Przeładowuje bez errorów, ale jak teraz klikam Skórę, aby ją założyć, to od razu wywala serwer.
Tutaj błąd z konsoli:

Podaj:

  • wersję serwera
  • silnik serwera
  • wersję Skripta
  • listę dodatków do Skripta wraz z wersjami

Rozumiem, że przy event-item nie było problemu, tak?

Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276133
Udostępnij na innych stronach

  • 0
7 minut temu, Kormic napisał:

Podaj:

  • wersję serwera
  • silnik serwera
  • wersję Skripta
  • listę dodatków do Skripta wraz z wersjami

Rozumiem, że przy event-item nie było problemu, tak?

Z tym błędem był problem już od usunięcia "wait a tick" (nie wiem czy akurat to było powodem, ale właśnie po tym był ten błąd).

Wersja serwera: 1.16.3
Silnik serwera: spigot-1.16.3.jar
Wersja Skripta: 2.5.3
Dodatki:
- Umbaska 3.3
- Skellet 1.9.10
- skUnity 1.1
- skRayFall 1.9.21
- SkQuery 4.1.3
- GuiSk 1.0

EDIT: Dodałem dla sprawdzenia wait a tick w pewnych miejscach i już nie stopuje serwera.
EDIT2: W konsoli błędu tego już nie ma, gdy jest wait a tick, ale dalej nie działa to samo, a zmienione jest na event-slot.

Edytowane przez Psycho1337
Odnośnik do komentarza
https://skript.pl/temat/44053-on-inventory-click/#findComment-276134
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ę...