-
Ilość zawartości
11012 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
230
Treść opublikowana przez Kormic
-
Racja, nie zauważyłem tego błędu. Pan źle zapisuje warunek sprawdzający różne możliwości nazwy narzędzia gracza. # Źle: if name of event-item is "Test1" or name of event-item is "Test2": # Dalszy kod... # Dobrze: if name of event-item is "Test1" or "Test2": # Dalszy kod... Skript nie wspiera sprawdzania wielu wartości różnych wyrażeń/zmiennych w jednym warunku, a tutaj pan poniekąd to implementuje (chociaż wyrażenie 'name of event-item' jest użyte w obu przypadkach). Pokażę przykład ilustrujący to co mam na myśli. # Źle: if name of event-item is "Test1" or player's name is "Kormic": # Dalszy kod... # Dobrze: if any: event-item is "Test1" player's name is "Kormic" then: # Dalszy kod... Więcej o warunkach 'if any' oraz dodatkowo 'if [all]' można przeczytać w dokumentacji. Nie nie, wina jest po mojej stronie. Pan, który poprosił o pomoc, nie jest winny, gdyż 'event-item' powinno w ten sam sposób zadziałać. Z tego co widzę, Skript w kodzie źródłowym sam korzysta z PlayerInteractEvent#getItem(), które zwraca przedmiot trzymany w ręce gracza. Pozdrawiam.
-
Sugeruję sprawdzać nazwę narzędzia gracza, a nie przedmiot możliwy do pobrania ze zdarzenia. if player's tool's name is "&6Test": # Dalszy kod... Jeśli nadal skrypt nie działa, istnieją dwie możliwości. Nazwy podane w warunku nie są zgodne z nazwą przedmiotu trzymanego w ręce gracza. Warunek sprawdzający region nie jest spełniony. Proszę zauważyć, że warunek ten wymaga obiektu typu %region%, nie %text%. Sposób w jaki Pan to zapisał, może, ale nie musi zadziałać. Na wszelki wypadek pokażę jak można w inny sposób sprawdzić czy gracz jest w danym regionie. if "%regions at player%" contains "[nazwa regionu] in world [nazwa świata]": # Dalszy kod... Wystarczy wstawić nazwę regionu i nazwę świata w zaznaczone przeze mnie wyżej miejsca w kodzie (na przykład "spawn in world world"; world to domyślna nazwa świata, musi Pan sobie sprawdzić nazwę świata, w którym znajduje się ów region). Pozdrawiam.
-
Czy da się zoptymalizować ten skrypt?
Kormic odpowiedział(a) na Pixeel133 pytanie w Pytania i problemy
Od razu mogę stwierdzić, że ten skrypt jest obciążający dla serwera. Wynika to z dwóch powodów: 1. Zapętla Pan dla każdego rodzaju nasiona ogromny prostopadłościan bloków. Proszę zwrócić uwagę chociażby na pierwszą pętlę sprawdzającą wszystkie bloki między dwoma lokalizacjami dla nasion pszenicy. Lokalizacje to (-8, 24, -251) i (83, 32, -165). Obliczając różnice dla wszystkich trzech współrzędnych, otrzymujemy łącznie 92*8*87 = 72036 bloków. Jest to ilość co najmniej astronomiczna, a nie jest to przecież jedyna pętla sprawdzająca wszystkie bloki, ponieważ jest ich w sumie siedem. Rozwiązanie: Rekomenduję Panu, aby dodawać przy sadzeniu nasion ich lokalizacje do listy zmiennych, którą będzie Pan zapętlał. Dzięki temu ze wcześniej wspomnianych ponad 72000 zejdziemy do zapewne kilku tysięcy. Nie podaję dokładnej liczby, gdyż zależy ona od tego czy mówimy o jakiejś wielopiętrowej uprawie, czy też pojedynczych polach. 2. Wszystkie operacje podmiany bloków (nasion) Skript stara się wykonać w jednej dyskretnej chwili czasu. Jest to oczywiście niedobre z punktu widzenia wydajności pracy serwera. Rozwiązanie: Tutaj zalecam rozłożyć w czasie wyżej wspomniane pętle. Idealnym rozwiązaniem byłoby stworzyć kilka niezależnych od siebie pętli 'while', dla których będziemy mieli pewność, że będą się rozpoczynały w różnych chwilach czasu. W tym przypadku podejrzewam niestety, że nie jest to możliwe, a więc trzeba będzie to niejako wymusić. Pomysły mam dwa. Między każdą pętlą może Pan po prostu dodać opóźnienia rzędu paru ticków tak, aby były one równe z dokładnością do jednego ticka. Jest to mało eleganckie rozwiązanie, aczkolwiek powinno ono dać nieco odetchnąć serwerowi. Może Pan również wykorzystać listener zdarzenia 'on script load', w którym Pan doda wywołanie jakiejś funkcji, której ciałem (kodem w niej zawartym) będzie pętla while. Funkcja może pobierać kilka parametrów (nazwa listy zmiennych z lokalizacjami bloków, typ bloku sprawdzanego w warunku, typ nowego bloku, itd.). Wtedy funkcja będzie wywołana z jakimiś odstępami czasu (wait x ticks) dla każdego typu nasiona, a więc będzie ich w sumie siedem. EDIT: @Pixeel133 Podaję dla drugiej propozycji rozwiązanie problemu nr 2 przykładowy kod. options: checkPlantsInterval: 2 # W sekundach function startCheckingSeedsLoop(plantName: text, oldPlant: block, newPlant: block): while script is loaded: loop {%{_plantName}%::locations::*}: if block at loop-value is {_oldPlant}: # ... wait {@checkPlantsInterval} seconds on script load: set {_interval} to ceil({@checkPlantsInterval} * 20 / 7) # 2 sekundy = 40 ticków. Podzielone przez 7 (dla każdej pętli), aby dodać równe odstępy czasu set {_intervalTimespan} to "%{_interval}% ticks" parsed as timespan startCheckingSeedsLoop("placedSeeds::carrots", stage 2 carrot plant, stage 7 carrot plant) wait {_intervalTimespan} # ... startCheckingSeedsLoop("placedSeeds::potatoes", stage 2 potato plant, stage 7 potato plant) wait {_intervalTimespan} Mam wątpliwości co do tego czy Skript dobrze zinterpretuje wyrażenia 'stage 2 carrot plant' i tym podobne występujące w wywołaniach funkcji, ale myślę, że Pan rozumie ideę. Pozdrawiam. -
Problem z tłumaczeniem pluginu BentoBox (BSkyBlock)
Kormic odpowiedział(a) na mateusz2987 temat w Spolszczenia pluginów
Nie wiem czy jest to jakkolwiek powiązane i czy jest to aktualne, jednakże autorzy BentoBox wskazują, że plugin wraz ze wszelkimi dodatkami jest przetłumaczony w 77% na język polski. Informacja znajduje się tutaj. Co do samego tłumaczenia - plik, o który Panu chodzi, znajduje się tutaj. Czy jest jakaś inna możliwość poza bezpośrednią zmianą tekstu w pliku .json? Być może da się to dopisać w pliku "locales/pl.yml", ale nie jestem w stanie znaleźć informacji jak można tego dokonać. Na discordzie BentoBox sądzę, że Pan dostanie odpowiedź z najlepszym możliwym rozwiązaniem. -
Problem z tłumaczeniem pluginu BentoBox (BSkyBlock)
Kormic odpowiedział(a) na mateusz2987 temat w Spolszczenia pluginów
Nie rozumiem stwierdzenia "Wszystko mam już po polsku [...]". Co do dalszej części, w samym BSkyBlock nie widzę opcji bezpośredniej konfiguracji języka w pliku config.yml. Widzę natomiast możliwość ustawienia języka w pliku konfiguracyjnym BentoBox ("default-language"). -
Pomoc przy wykonaniu skrypta na animację rąk armor standu.
Kormic odpowiedział(a) na Pixeel133 pytanie w Pytania i problemy
Nie był w stanie Pan znaleźć jak można taki mechanizm zaimplementować w Skript'cie, gdyż nie wspiera on takich operacji. W mojej ocenie najprostszym rozwiązaniem będzie wspomożenie się dodatkiem skript-reflect. Od razu informuję, że Pan tutaj nie ucieknie od matematyki (głównie mowa o układach współrzędnych, ich transformowaniu i radianach). Więc tak. Bukkit API wspiera obracanie poszczególnymi częściami stojaka na zbroję, warto zwrócić szczególną uwagę na wszystkie metody zawierające słowo "Pose". Odpowiadają one za ustawianie kątów obrotów względem każdej z osi układów współrzędnych, co jest realizowane przy pomocy obiektów typu EulerAngle. Więcej o kątach Eulera można poczytać tutaj. Należy odnotować fakt, iż kąty te są podawane w radianach, nie stopniach. Pokażę Panu przykładowy kod jak można w najprostszy możliwy sposób obrócić prawą rękę stojaka na zbroję względem osi X o pi/4 rad (ekwiwalent 45°). import: java.lang.Math command /armorstandrotate: executable by: players trigger: spawn armor stand at player set {_armorStand} to last spawned armor stand {_armorStand}.setArms(true) wait 3 seconds set {_oldEulerAngle} to {_armorStand}.getRightArmPose() set {_oldRotX} to {_oldEulerAngle}.getX() set {_rotation} to Math.toRadians(45) set {_newRotX} to {_oldRotX} + {_rotation} set {_newEulerAngle} to {_oldEulerAngle}.setX({_newRotX}) {_armorStand}.setRightArmPose({_newEulerAngle}) Opóźnienie dodałem, aby było widać różnicę przed i po pojawieniu się stojaka na zbroję. Rzecz jasna jest to najbardziej podstawowa operacja, symulacja animacji kopania jest bardziej złożona w implementacji z dwóch względów: obrót układu współrzędnych już nie będzie następował tylko dla jednej, a dla dwóch osi (jeśli nie trzech, jest to prawdopodobne), w celu symulacji płynności animacji będzie musiał Pan w pętli wykonać takie obracanie o mały kąt (na przykład: zamiast wykonywać obrót o 45 stopni, lepszym rozwiązaniem jest dodanie pętli wykonującej 10 razy obrót o 4,5 stopnia). W razie pytań służę pomocą. Pozdrawiam. -
Mam problem ze skryptem dokladniej z funkcja
Kormic odpowiedział(a) na M3w_Q pytanie w Pytania i problemy
@M3w_Q Samo wywołanie funkcji jest całkowicie zgodne z jej definicją, nie widzę u Pana jakichkolwiek błędów. Alias 'hay bale' jest zgodny z wykazem aliasów dostępnym tutaj. Zastanawia mnie jednak sama definicja komendy, a mówiąc ściślej, jej ostatni parametr typu 'location'. Wcześniej Pan miał tam parametr typu 'block' i kod miał sens, jednakże teraz proszę zauważyć, że w kodzie funkcji dochodzi do porównań lokalizacji z blokiem (patrz linijka 2.) jak i pobierania lokalizacji z lokalizacji, jakkolwiek absurdalnie to nie brzmi (patrz linijki 9. i 10.). -
Proszę uprzejmie, skrypt nie był testowany. Wymagane dodatki skript-reflect i SkQuery. Co prawda można zrealizować połączenie z Vaultem za pomocą samego skript-reflect, jednakże pozwoliłem sobie na odrobinę lenistwa w tej kwestii. import: org.bukkit.entity.Monster script options: $ use permissions on join: {hostileMobKills::%player%} is not set set {hostileMobKills::%player%} to 0 on death: attacker is a player victim is instance of Monster {hostileMobKills::%attacker%} < 20 add 1 to {hostileMobKills::%attacker%} {hostileMobKills::%attacker%} is 20 add "server.permission" to attacker's permissions send "&aOtrzymałeś permisję." to attacker
-
Mam problem ze skryptem dokladniej z funkcja
Kormic odpowiedział(a) na M3w_Q pytanie w Pytania i problemy
I rozumiem, że jak Pan wstawia 'hay bale' w wywołaniu funkcji to Skript zgłasza błąd, tak? Proszę pokazać kod jak Pan wstawia 'hay bale'. -
Ależ skrypt usuwa jedynie pajęczyny w zadanym promieniu, przecież go przetestowałem i działa tak jak Zleceniodawca sobie zażyczył. Jeśli Panu nie działa (choć nie Pan zlecił napisanie skryptu), proszę podać wersję Skript, wszystkie dodatki do niego zainstalowane na serwerze oraz wersję serwera.
-
Jest to wyrażenie służące do sortowania istniejącej listy dowolnych wartości. Co ważne, obiekty zawarte w liście muszą być pod dowolnym względem porównywalne (alfabetycznie, liczbowo, czasowo). W innym wypadku wyrażenie zwróci <none>. Poniżej udostępniam przykład wykorzystania owego wyrażenia. command /sortlist: trigger: set {_list::*} to 1, 8, 7 and 3 set {_sortedList::*} to sorted {_list::*} send "Lista przed sortowaniem: %{_list::*}%" and "Lista po sortowaniu: %{_sortedList::*}%" to sender Jak wspomniałem wyżej, zakres zastosowań tego wyrażenia nie ogranicza się tylko do ułożenia liczb rosnąco, ale jest możliwe wykorzystanie go do sortowania alfabetycznego ciągów znaków oraz okresów czasów i dat. Warto tutaj dodać, że dla sortowania alfabetycznego istnieje specjalnie stworzone do tego zadania wyrażenie, które w przypadku ciągów znaków zachowuje się identycznie jak zwykłe sortowanie. W ramach dodatkowej informacji dopowiem, że uzyskanie listy posortowanej malejąco wymaga posortowania jej rosnąco, a następnie odwrócenia jej za pomocą tego wyrażenia. Pozdrawiam.
-
No dobrze. Pokażę jak ja bym to zrobił. command /pun <player>: usage: &c/pun <nazwa gracza na serwerze> executable by: players trigger: set {punishedPlayer::%player%} to arg 1 set {_gui} to chest inventory with 5 rows named "&cPanel Admina" set slot 20 of {_gui} to paper named "&cZbanuj %arg 1% za: Zlamanie regulaminu" with lore "" open {_gui} to player on inventory click: if name of clicked inventory is "&cPanel Admina": cancel event if index of clicked slot is 20: execute player command "ban %{punishedPlayer::%player%}%" close player's inventory clear {punishedPlayer::%player%} Może Pan sobie porównać mój kod z tym co napisałem i zauważy Pan analogię. Jedyna różnica to to, że nie zaimplementowałem listenera zdarzenia 'on inventory close' - ręcznie w kodzie zamykam GUI po ukaraniu gracza i czyszczę zmienną. Instrukcja 'cancel event' została dodana w celu zablokowania wyjmowania przedmiotów z panelu administratora. Jeśli ma Pan pytania do konfiguracji komendy ('usage' oraz 'executable by'), odsyłam do artykułu napisanego przez mojego przyjaciela. Link poniżej.
-
Mam problem ze skryptem dokladniej z funkcja
Kormic odpowiedział(a) na M3w_Q pytanie w Pytania i problemy
Jest Pan pewien, że Pan posiada najnowszą wersję Skripta? Proszę dla upewnienia się podać wersję Skripta, listę dodatków do niego i wersję serwera. Wyrażenie 'clicked block' zostało wprowadzone już w wersjach 2.1-2.2, więc nie powinno być z nim problemu. Czy Pan użył listenera zdarzenia 'on right click', który Panu podałem? Co on Panu wyświetlił na czacie po kliknięciu prawym przyciskiem myszy na blok siana? Jeśli Skript zgłasza błąd w owym listenerze (a dokładniej w linijce z wyrażeniem 'clicked block'), proszę zamienić je na 'target block' i spróbować znowu. Pomocne będzie również jeśli Pan udostępni cały swój kod - zarówno kod funkcji jak i kod tych dwóch listenerów zdarzenia 'on right click' (jeden napisany przez Pana, drugi przeze mnie). Wiem, dlatego próbuję sprawdzić jakie nazewnictwo Skript stosuje na Pana serwerze. -
Sprawdziłem skrypt i błędne okazały się być dwie rzeczy. Skript nie wspiera operacji arytmetycznych na wartościach typu 'timespan', a więc muszę użyć 'difference between [...]' zamiast odejmowania. Co prawda różnica żadna, ale i tak zdziwiłem się (problem może wynikać z testów na nieco starszym serwerze). Próba ustawienia listy bloków {_cobwebs::*} jako powietrze kończyła się nadpisywaniem wartości listy, nie zmianą bloków. Również jest to dziwne zachowanie, aczkolwiek rozumiem, że dla Skripta jest to przypadek niejednoznaczny (nie sposób określić czy mowa o nadpisaniu listy, czy też ustawieniu bloków w niej). Poprawiłem skrypt i przetestowałem go. Wszystko już powinno działać u Pana jak należy. Muszę na koniec powiedzieć, że nie podoba mi się podwójne pobranie tej samej listy bloków, ale dopiero po uczynieniu tego skrypt zaczął działać należycie. options: cobwebRemoverRadius: 3 cobwebRemoverPermission: server.commands.cobwebremover cobwebRemoverCooldown: 30 seconds function translateSecondsCooldown(t: timespan) :: text: set {_tText} to "%{_t}%" replace all "seconds" with "sekund" in {_tText} return {_tText} command /usuwaczpajeczyn: permission: {@cobwebRemoverPermission} permission message: &cNie możesz użyć tej komendy. executable by: players trigger: set {_cobwebRemover} to blaze rod named "&6&lUsuwacz Pajęczyn" with lore "&8x &7tym itemem usuniesz &fcobweby!" give {_cobwebRemover} to player on right click: player's tool is blaze rod named "&6&lUsuwacz Pajęczyn" with lore "&8x &7tym itemem usuniesz &fcobweby!" if {cobwebRemover::cooldown::%uuid of player%} is set: set {_cooldown} to {@cobwebRemoverCooldown} set {_timeElapsed} to difference between {cobwebRemover::cooldown::%uuid of player%} and now {_timeElapsed} < 30 seconds play sound "ENTITY_VILLAGER_NO" to player set {_remainingTime} to difference between {_cooldown} and {_timeElapsed} send "%{_cooldown}% %{_timeElapsed}% %{_remainingTime}%" to player send "%{_remainingTime}%" send "&cMusisz odczekać jeszcze &4%translateSecondsCooldown({_remainingTime})%!" to player stop set {cobwebRemover::cooldown::%uuid of player%} to now set cooldown of player's tool for player to {@cobwebRemoverCooldown} play sound "ENTITY_PLAYER_LEVELUP" to player set {_cobwebs} to size of ((all blocks in radius {@cobwebRemoverRadius} of player) where [block input is cobweb]) set (all blocks in radius {@cobwebRemoverRadius} of player) where [block input is cobweb] to air send title "&7" with subtitle "&cUsunięto &4%{_cobwebs}% &cpajęczyn" to player for 2 seconds
-
Mam problem ze skryptem dokladniej z funkcja
Kormic odpowiedział(a) na M3w_Q pytanie w Pytania i problemy
Mówiłem Panu o miejscu wywołania funkcji, nie jej definicji. W linijce wywołującej funkcję upgradeGen miał Pan spróbować zamienić 'block' na 'clicked block'. Podejrzewam jednak, że 'hay bale' jest tutaj problemem i nie rozumiem dlaczego. Jedyne co mi przychodzi do głowy to to, aby Pan spróbował wyświetlić na czacie nazwę snopu siana w Skript. on right click: send "%clicked block%" to player Niech Pan spróbuje kliknąć prawym przyciskiem myszy na blok snopu siana i zobaczy co zwraca Skript. Następnie Pan może spróbować wstawić wyświetloną nazwę na czacie do wywołania funkcji. -
Ale dlaczego nie może Pan tak zrobić? Nie rozumiem z czym Pan się zmaga w tym momencie. Mam wrażenie, że Pan nie przeczytał drugiej części mojego wczorajszego posta. Tam wyjaśniłem jak można przekazać informację o karanym graczu do listnera zdarzenia 'on inventory click:' - za pomocą zmiennych.
-
Jeśli komenda pochodzi z pluginu, wystarczy zastąpić linijkę z efektem 'ban' linijką wykonującą instrukcję 'execute %command sender% command "/ban ..."'. Na Pana miejscu zastąpiłbym wywoływanie komendy korzystaniem z metod zawartych w API pluginu, jednakże rozumiem, że nie jest to łatwa rzecz dla początkujących. Może więc Pan pozostać przy wywoływaniu komendy. Na koniec dodam, że może Pan jako wykonawcę komendy (command sender) podać konsolę (console) lub gracza (player).
-
Potrzebna pomoc w wykrywaniu poziomu enchantu narzędzia!
Kormic odpowiedział(a) na Pixeel133 pytanie w Pytania i problemy
Szczerze mówiąc, nie powinno to działać w ten sposób, gdyż ten problem został wcześniej rozwiązany, ale cóż. Może Pan używa starszej wersji Skript. Najprostszym rozwiązaniem jest sprawdzanie poziomu zaklęcia od najwyższego do najniższego. EDIT: @Pixeel133 Można również sprawdzać poziom konkretnego zaklęcia tym wyrażeniem. Powinno pomóc. -
Mam problem ze skryptem dokladniej z funkcja
Kormic odpowiedział(a) na M3w_Q pytanie w Pytania i problemy
Zgodnie z plikiem z aliasami wyrażenie 'hay block' powinno zadziałać. Możliwe, że błąd wynika z jakiejś starszej wersji Skripta. W tej sytuacji sugeruję zmianę wyrażenia na 'hay bale'. Jeśli to nie pomoże, proponuję również zmianę 'block' w wywołaniu funkcji na 'clicked block' (choć jest mało prawdopodobnym, aby to był powód problemu). -
Mam problem ze skryptem dokladniej z funkcja
Kormic odpowiedział(a) na M3w_Q pytanie w Pytania i problemy
Uproszczę Pana problem. Musi Pan zamienić przesyłanie bloków w formie tekstu do funkcji na zwykłe przesyłanie bloków. Parametry 2. i 3. powinny być typu 'block', nie 'text'. Wtedy skrypt powinien działać. Gdy już Panu uda się to naprawić, może Pan wrócić do zastanawiania się nad resztą moich uwag. -
Mam problem ze skryptem dokladniej z funkcja
Kormic odpowiedział(a) na M3w_Q pytanie w Pytania i problemy
Według mnie Pan w ogóle nie powinien zmieniać wartości tej zmiennej. Proszę jeszcze raz przeczytać to co napisałem i w razie wątpliwości dać mi znać. -
@Procix94 Pana kod zawiera wiele błędów. Nie istnieje takie wyrażenie w Skript jak 'current time'. Myślę, że Panu chodziło po głowie użycie wyrażenia 'now'. Pan w zły sposób zapisuje efekt odtwarzania dźwięku. Najpierw należy podać opcjonalnie poziom głośności oraz wysokość dźwięku, a dopiero później adresatów. Odsyłam do dokumentacji. Nie może Pan po prostu usunąć wszystkich pajęczyn w zadanym promieniu. Należy pobrać listę bloków w promieniu r od gracza, przefiltrować ją, a następnie zapisane w niej bloki ustawić jako powietrze. Zapisywanie zmiennej {_cobwebs} jest powiązane z punktem 3. Należy to zrobić w ten sam sposób z tą różnicą, że przed wyrażeniem dopisujemy 'size of', aby pobrać wielkość tej listy bloków. Efekt wysyłający tytuł na ekranie gracza rozpoczyna się słowem 'send', nie 'show'. Dodam również od siebie kilka uwag dotyczący zapisu pewnych rzeczy i ogólnego działania Pana skryptu. Zleceniodawca poprosił, aby przy klikaniu z "usuwaczem pajęczyn" w ręku pajęczyny były usuwane, a nie przy wpisywaniu komendy. Nietrudno zauważyć, że jest to niewygodne rozwiązanie. Jeśli Pan chce tworzyć cooldown, są prostsze sposoby. command /test: executable by: players trigger: if {testCooldown::%uuid of player%} is set: set {_cooldown} to 30 seconds set {_timeElapsed} to difference between {testCooldown::%uuid of player%} and now {_timeElapsed} < {_cooldown} send "Wait %{_cooldown} - {_timeElapsed}%." to player stop set {testCooldown::%uuid of player%} to now # Dalszy kod... Alternatywą jest skrypt AxCooldown autorstwa mojego dobrego kolegi xAxee. Nawiązując jeszcze do cooldownów, nie używa Pan list zmiennych, a powinien. Listę można w bardzo łatwy sposób zapętlić i ją modyfikować. Przykłady poniżej. % Zapętlanie listy cooldownów wszystkich graczy loop {testCooldown::*}: # Dalszy kod... # Czyszczenie cooldownów wszystkich graczy clear {testCooldown::*} Nie ma sensu ustawiać poziomu głośności dźwięku i jego wysokości jako 1, gdyż są to domyślne wartości. Nie zaimplementował Pan systemu cooldownu przedmiotu wyświetlanego na nim w ekwipunku. Poniżej znajduje się moja propozycja wykonania zlecenia. Proszę uprzejmie. Wszystko powinno być w porządku, choć kodu nie testowałem. Wymagany jedynie Skript w wersji 2.8.0 lub wyższej. U góry może Pan sobie ustawić: zasięg działania usuwacza (sugeruję nie ustawiać go zbyt dużego, aby nie lagował serwera), permisję wymaganą do jego użycia cooldown usuwacza. options: cobwebRemoverRadius: 3 cobwebRemoverPermission: server.commands.cobwebremover cobwebRemoverCooldown: 30 seconds function translateSecondsCooldown(t: timespan) :: text: set {_tText} to "%{_t}%" replace all "seconds" with "sekund" in {_tText} return {_tText} command /usuwaczpajeczyn: permission: {@cobwebRemoverPermission} permission message: &cNie możesz użyć tej komendy. executable by: players trigger: set {_cobwebRemover} to blaze rod named "&6&lUsuwacz Pajęczyn" with lore "&8x &7tym itemem usuniesz &fcobweby!" give {_cobwebRemover} to player on right click: player's tool is blaze rod named "&6&lUsuwacz Pajęczyn" with lore "&8x &7tym itemem usuniesz &fcobweby!" if {cobwebRemover::cooldown::%uuid of player%} is set: set {_cooldown} to {@cobwebRemoverCooldown} set {_timeElapsed} to difference between {cobwebRemover::cooldown::%uuid of player%} and now {_timeElapsed} < 30 seconds play sound "ENTITY_VILLAGER_NO" to player set {_remainingTime} to {_cooldown} - {_timeElapsed} send "&cMusisz odczekać jeszcze &4%translateSecondsCooldown({_remainingTime})%!" to player stop set {cobwebRemover::cooldown::%uuid of player%} to now set cooldown of player's tool for player to {@cobwebRemoverCooldown} play sound "ENTITY_PLAYER_LEVELUP" to player set {_cobwebs::*} to (all blocks in radius {@cobwebRemoverRadius} of player) where [input is cobweb] set {_cobwebs::*} to air send title "&7" with subtitle "&cUsunięto &4%size of {_cobwebs::*}% &cpajęczyn" to player for 2 seconds Pozdrawiam.
-
Dokładnie tak. Pokażę przykład, aby rozwiać wszelkie wątpliwości. command /testcommand: trigger: # Kod komendy otwierający GUI... on inventory click: # Kod wyzwalany przy kliknięciu w dowolnym GUI... Proszę zwrócić uwagę na to, że listener jest wywoływany przy każdym kliknięciu w dowolne GUI. Należy więc sprawdzić nazwę GUI, w które gracz klika. Nie chcemy przecież sytuacji, aby przy kliknięciu slotu 0 w dowolnym GUI ktoś był banowany na serwerze. if name of clicked inventory is "&6Nazwa GUI": # Dalszy kod... Dodam, że porównywanie klikniętego slotu do liczby nie zawsze musi działać. Sugeruję tutaj użycie wyrażenia 'index of clicked slot'. if index of clicked slot is 0: # Dalszy kod... Dzięki tej niewielkiej zmianie Skript będzie miał absolutną pewność, że pytamy o indeks (numer) slotu, nie o jego zawartość. Można co prawda wstawić instrukcję wykonywania komendy w listenerze zdarzenia 'on inventory click' (po uprzednim sprawdzeniu czy to jest odpowiednie GUI oraz czy został kliknięty odpowiedni slot), jednakże istnieje lepsze rozwiązanie. Może Pan skorzystać z efektu 'ban', który znajduje się w samym Skript. Jeśli Pan chce widzieć w konsoli gdy ktoś kogoś banuje w owym GUI, może Pan wysłać wiadomość do konsoli. send "Gracz %{_banned}% został zbanowany przez %player%." to console Pojawia się tu jeszcze problem związany z koniecznością wiedzy o jakiego gracza chodzi przy klikaniu w GUI. Musi Pan więc zapisać graczowi, który użył komendy /pun zmienną przechowującą gracza, którego chce zbanować. Tutaj również pokażę przykład. command /pun <player>: trigger: # Otwieranie GUI... set {punishingPlayer::%uuid of player%} to arg on inventory click: # Sprawdzanie GUI i indeksu slotu... ban {punishingPlayer::%uuid of player%} due to "Złe zachowanie." Jeśli Pan czuje taką potrzebę, przy zamknięciu tego GUI (listener zdarzenia 'on inventory close' i sprawdzenie nazwy GUI) może Pan czyścić zmienną przechowującą karanego gracza. clear {punishingPlayer::%uuid of player%} Na koniec dodam, że kwadratowe nawiasy przy argumencie oznaczają jego opcjonalność - bez jego podania komenda zadziała, a argument 1. przyjmie wartość '<none>'. Wtedy musi Pan sprawdzić czy argument jest ustawiony ('if arg-1 is set') i jakoś to obsłużyć. Prościej jednak jest po prostu usunąć te kwadratowe nawiasy, wtedy podanie argumentu jest wymagane. Pozdrawiam.
-
Gdziekolwiek w tym pliku (może być nawet w innym skrypcie), byleby poza kodem komendy. Jeśli chodzi o dokumentację Skript, można ją znaleźć tutaj. Co do przykładowych kodów - można je znaleźć w dziale Skript > Skrypty. Co prawda znajdują się tam kody zawierające złe praktyki, ale wystarczy, że Pan znajdzie jakiś prosty implementujący w sobie listener zdarzenia 'on inventory click'.
-
Mam problem ze skryptem dokladniej z funkcja
Kormic odpowiedział(a) na M3w_Q pytanie w Pytania i problemy
Skrypt nie działa z prostego powodu. Dlaczego Pan porównuje w pierwszej linijce funkcji parametr typu tekstowego z parametrem typu 'block'? Jedno nigdy nie będzie równe drugiemu, więc ten warunek zawsze zwróci fałsz. Co więcej, w skrypcie doszukałem się kilku co najmniej zastanawiających operacji, więc przedstawię moje uwagi i spostrzeżenia. Zalecam nie nadpisywać parametrów przesyłanych do funkcji, ponieważ kod staje się mniej czytelny. Jeśli Pan potrzebuje coś zapisać do lokalnej zmiennej (takiej, która zaczyna się znakiem podłogi "_" (ang. underscore)), warto utworzyć nową zmienną. Dlaczego parametr funkcji {_b} zawierający kliknięty blok jest nadpisywany przez Pana wartością tekstową, a później Pan używa tej samej zmiennej (już zawierającej tekst) do odtworzenia efektów wizualnych tak jakby ciągle przechowywała informację o bloku? Zbędnym jest zapisywanie UUID gracza w nazwie lokalnej zmiennej. To są zmienne lokalne - są one czyszczone i tworzone na nowo przy każdorazowym wywołaniu funkcji. Wracając do punktu 3., Pan czyści zmienne lokalne, co również jest bezsensowne. Skript automatycznie to robi za Pana, a właściwie to te zmienne są tylko tymczasowo przechowywane w pamięci serwera tak długo jak kod zawierający je nie zostanie wykonany do końca. Nie rozumiem sensu przesyłania bloków w formie tekstu do funkcji. Nie może Pan ich przesłać po prostu jako bloki w niezmienionej formie (np. 'upgradeGen(player, hay block, coal block, 50, block)')? Oczywiście wymaga to modyfikacji definicji funkcji upgradeGen. Pozdrawiam.
