Skocz do zawartości

Kormic

Zasłużony
  • Ilość zawartości

    11012
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    230

Treść opublikowana przez Kormic

  1. Rozumiem, że chodzi o blokowanie tworzenia pewnych przedmiotów, tak? Czy też mowa o blokowaniu użycia pewnych przedmiotów jako składników w wytwarzaniu? Nie ukrywam, że pierwszy wariant jest prostszy w realizacji, gdyż polega jedynie na sprawdzeniu czy wytworzony przedmiot nie jest jednym z tych zakazanych.
  2. Czy Pan używa pluginu Essentials czy też jednej z jego pochodnych (np. EssentialsX)? Odpowiedź na pytanie Pana wyżej również jest ważna.
  3. Kod generalnie wygląda dobrze, ale jest związany z nim jeden krytyczny problem. Gracze mogą otrzymać do 60 kluczy na minutę, gdyż Pan nie sprawdza godziny z dokładnością do sekundy, a jedynie z dokładnością do minuty. Niech Pan dorzuci do formatu 'now' sekundy (a więc ":ss") i powinno być wszystko w porządku. Drugie możliwe rozwiązanie jest takie, że Pan sprawdza co minutę, ale po rozdaniu kluczy ustawia Pan jakąś zmienną globalną. Jeśli ta zmienna jest ustawiona, rozdanie kluczy nie następuję. Dopiero gdy będzie następna minuta, owa zmienna zostanie wyczyszczona.
  4. Kormic

    Placeholder na serca

    Wedle mojej wiedzy bez odpowiedniego rozszerzenia taka operacja nie zadziała - jak Pan chciałby wstawić dzielenie placeholdera chociażby w pliku konfiguracyjnym pluginu? Wydaje mi się, że najprostszym rozwiązaniem jest użycie rozszerzenia Math do PlaceholderAPI. Idąc za krótką instrukcją tego rozszerzenia, po pobraniu może Pan spróbować użyć poniższego placeholdera będącego de facto wyrażeniem matematycznym z użyciem placeholdera. %math_<{player_health}/2>%
  5. Zakładam, że Pan nie zmienił {_item} na swój przedmiot tak jak prosiłem. Błędu nie było, gdyż Skript nie informuje o zmiennych lokalnych, które nie zostały poprawnie zainicjalizowane. Zwracam uwagę, że nie dałem Panu gotowej instrukcji, a jedynie przykład jej wykorzystania. Gotowy kod prawie niczego nie uczy, gdyż nie stoi za nim jakikolwiek wysiłek intelektualny. A tutaj Pan w swoim kodzie używa tej instrukcji jak prosiłem, gdyż Pan zamienił {_item} na 'tool', czyli przedmiot trzymany w ręce gracza.
  6. Czy taki kod Pan ma na myśli? on command "twojeip-sound": sender is a player play sound "BLOCK_NOTE_BLOCK_XYLOPHONE" to sender
  7. Ciekawe skąd wynika opóźnienie dwóch minut. Gdy Pan powiedział o wielkim opóźnieniu, założyłem, że Pan mówi o opóźnieniu rzędu godziny. Odpowiadając na Pana pytanie - bez zewnętrznych API nie jest to możliwe. Musiałby Pan do takiego API wysyłać zapytania z IP gracza, aby otrzymać jego strefę czasową. Pytanie brzmi czy gra jest warta świeczki. Musiałbym jednak zobaczyć Pana kod, aby dokonać diagnozy problemu.
  8. Może Pan użyć poniższej instrukcji. remove mending from enchantments of {_item} W miejsce {_item} może Pan wstawić dowolny przedmiot, na przykład przedmiot, który gracz trzyma w ręce. Rzecz jasna ta instrukcja działa dla dowolnego enchantu.
  9. Z początku próbowałem znaleźć odpowiednią flagę w WorldGuard, jednak zauważyłem, że próba pogodzenia tego z faktem, iż każdy gracz może posiadać wiele działek, może być trudna. Tak więc przejrzałem ProtectionStones API i napisałem dla Pana poniższy skrypt. Wydaje mi się, że dobrze zrozumiałem zasadę działania pluginu i jego API. Jeśli tak, skrypt powinien działać tak długo jak trzymamy się założenia, że działki różnych graczy nie mogą na siebie nachodzić. Istnieje jeszcze ryzyko, że skript-reflect nie będzie w stanie rzutować typu String na typ UUID (mówię o wyrażeniu 'player's uuid'. Ostatnia informacja - latanie jest jedynie możliwe dla pierwotnego właściciela działki. Do działania skryptu wymagany jest dodatek skript-reflect. EDIT: Może Pan zauważyć w skrypcie zakomentowaną linijkę w listenerze zdarzenia 'on any move:'. Dodałem ją gdyby Pan przewidywał jakąś permisję poza byciem operatorem serwera. import: dev.espi.protectionstones.PSRegion command /fly: executable by: players permission: server.rank.premium permission: &cNie posiadasz wystarczających uprawnień do użycia tej komendy. trigger: if player's flight mode is true: send "&cWyłączyłeś latanie w obrębie tego regionu." set {_closestPSRegion} to PSRegion.fromLocation(player's location) if {_closestPSRegion}.isOwner(player's uuid) is false: send "&cNie możesz tutaj latać." to player stop set player's flight mode to true send "&aWłączyłeś latanie w obrębie tego regionu." to player on player move: player's flight mode is true player is not op #player doesn't have permission "server.your.permission" set {_closestPSRegion} to PSRegion.fromLocation(player's location) {_closestPSRegion}.isOwner(player's uuid) is false send "&cNie możesz tutaj latać." to player set player's flight mode to false set {protectionStones::noFallDamage::%player's uuid%} to true on damage of player: damage cause is fall {protectionStones::noFallDamage::%player's uuid%} is true cancel event clear {protectionStones::noFallDamage::%player's uuid%}
  10. Proszę uprzejmie. Dodałem opóźnienie ze względu na to, aby uniknąć sytuacji, w której ów gracz podnosi te kości tuż przed swoją śmiercią. Wymaga to jednak testu, Pan może to sprawdzić na swoim serwerze. Jeśli bez drugiej linijki wszystko będzie dobrze działało, można ją usunąć. on death of player: wait 1 tick drop (random number between 3 and 5) of bone at event-location
  11. Kormic

    Dozwolone znaki

    Skript oferuje dwa warunki pozwalające sprawdzić czy dany tekst spełnia nasze wymagania. Sprawdzenie czy dany tekst jest alfanumeryczny (ang. alphanumeric), a więc czy zawiera jedynie litery a-z (A-Z również) i cyfry 0-9. Sprawdzenie czy dany tekst jest zgodny z pewnym wzorcem łańcucha znaków, znanym również jako regularne wyrażenie (regex).
  12. Niech Pan pokaże swój kod i powie w jakiej strefie czasowej znajduje się Pana serwer. Sama godzina bez strefy czasowej również wystarczy. Jeśli Pan chce szybko sprawdzić jaki jest obecny czas systemowy serwera, proszę użyć poniższej komendy. command /getrealtime: trigger: send "%now%" to sender
  13. Problem prosty w rozwiązaniu, jednak samo rozwiązanie jest względnie niemiłe dla oka. Opiszę jak może Pan napisać taki skrypt. Przy śmierci Ender Dragona należy zapisać do jakiejś zmiennej globalnej obecny czas systemowy serwera z wykorzystaniem wyrażenia 'now'. Następnie, w periodicalu 'every 1 minute:' sprawdza Pan czy 'now' (czas obecny) jest większy od czasu zapisanego we wcześniej wspomnianej zmiennej (można wykorzystać zwykłe porównania takie jak 'is bigger than or equal to' czy też '>=', więcej informacji znajdzie Pan w dokumentacji). Jeśli tak, może Pan zespawnować kolejnego smoka. Może Pana zastanawiać dlaczego nie zaproponowałem użycia opóźnienia 'wait 24 hours'. Odpowiedź jest prosta - jeśli w ciągu tych 24 godzin serwer zostałby wyłączony, opóźnienie zostałoby anulowane, a po ponownym włączeniu serwera dalszy kod (następujący po opóźnieniu) nigdy nie zostałby wykonany. Namyśliłem się i stwierdziłem, że mój pomysł był dość głupi. Jeśli Pan oczekuje pomiaru czasu z dokładnością do sekundy, proszę zmienić periodical na 'every 1 second:'. W przypadku samego pomiaru i sprawdzania czasu nie powinno to obciążać serwera.
  14. Niestety Skript nie posiada listenera zdarzenia czasu rzeczywistego, tak więc należy posiłkować się tzw. periodicalami, czyli fragmentami kodu wykonywanymi w pewnych chwilach czasu. Dodatkowo należy w owym periodicalu sprawdzać godzinę i minutę z użyciem wyrażenia 'formatted date'. Udostępniam przykład poniżej. every 1 minute: set {_time} to now formatted as "HH:mm" if {_time} is "00:00": # ... else if {_time} is "12:00": # ... # Dalszy kod... Oczywiście może Pan korzystać chociażby z zewnętrznych API w celu sprawdzania czasu rzeczywistego, jednakże w tym przypadku jest to rozwiązanie w zupełności wystarczające. Wystarczy, że Pan użyje instrukcji (efektu) 'command'. Jeśli Pan chce rozdać wszystkim graczom o danej godzinie klucze, musi pan zapętlić listę 'all players'. Tak więc Pan w środku pętli po uprzednim sprawdzeniu godziny może wstawić %loop-player% w miejsce [gracz] w Pana komendzie. EDIT: @micmit123 Dodam, że możliwe jest użycie API pluginu ExcellentCrates. W mojej ocenie jest to lepsze rozwiązanie, gdyż unikamy wywoływania komendy przez konsolę. Wiki: https://nightexpress.gitbook.io/excellentcrates/general/developer-api Github: https://github.com/nulli0n/ExcellentCrates-spigot/blob/master/src/main/java/su/nightexpress/excellentcrates/CratesAPI.java Podam przykład wykorzystania powyższego API. import: su.nightexpress.excellentcrates.CratesAPI on death of ender dragon: attacker is a player set {_keyManager} to cratesAPI.getKeyManager() set {_key} to {_keyManager}.getKeyById("legendary") {_keyManager}.give(attacker, {_key}, 1) send "Otrzymałeś legendarny klucz!" to attacker
  15. Co prawda Pan zapytał jak napisać taki skrypt, ale jednocześnie stworzył Pan wątek w dziale Zlecenia, a więc przyjmuję Pana pytanie jako zlecenie. on inventory click: if type of clicked inventory is crafting table inventory: index of clicked slot is between 1 and 4 cancel event send "Wytwarzanie przedmiotów jest zablokowane." to player else if type of clicked inventory is workbench inventory: index of clicked slot is between 1 and 9 cancel event send "Wytwarzanie przedmiotów jest zablokowane." to player on craft: cancel event send "Wytwarzanie przedmiotów jest zablokowane." to player Proszę uprzejmie. Skrypt blokuje zarówno stół rzemieślniczy 3x3, jak i jego "podręczną" wersję 2x2. Listener zdarzenia 'on craft:' został zastosowany w celu dodatkowego zabezpieczenia, gdyż niekiedy listener zdarzenia 'on inventory click:' nie jest wywoływany.
  16. Nie ma sprawy. Cieszę się, że mogłem pomóc. Ja również dziękuję Panu za cierpliwość i chęć nauki, doceniam to. Już rozumiem Pana wątpliwości. Tutaj mieliśmy na tyle wygodną sytuację, że nie było potrzeby importowania jakichkolwiek klas. Można podsumować to w ten sposób, że wszystko jest zawarte w samej instancji pluginu.
  17. Już rozumiem Pana problem - Pan nie wie jak czytać wzorce (ang. patterns) w dokumentacji. Przeprowadzę więc Pana przez szybki kurs czytania tego enigmatycznego zapisu nawiasów. Nawiasy okrągłe '( )' oznaczają wybór. Każda opcja do wyboru oddzielana jest kreską (ang. pipeline) '|'. Nawiasy kwadratowe '[ ]' zaś oznaczają opcjonalność, nie musi Pan pisać danej rzeczy, a i tak Skript zrozumie co Pan ma na myśli. Jeśli coś nie jest ujęte w jakiekolwiek nawiasy, trzeba to napisać w kodzie. Dla przykładu odniosę się do wzorca wyrażenia zwracającego instancję pluginu, który Pan podał. Proszę zauważyć, że wszystkie rzeczy, nad którymi Pan się zastanawiał, są ujęte w kwadratowe nawiasy. Tak więc nie musi Pan ich w ogóle dodawać do kodu, a i tak wszystko będzie działało dokładnie tak samo. Rozszerzając moje wyjaśnienia, warto zwrócić uwagę na to, że jeśli Pan by się zdecydował na coś z pierwszego kwadratowego nawiasu (mowa o '[(an|the)]'), musi Pan wybrać albo 'an', albo 'the'. Tak to działa. Aby rozwiać wszelkie wątpliwości, pokażę każdą możliwą wersję powyższego wzorca w użyciu dla pluginu SternalBoard. set {_instance} to instance of plugin "SternalBoard" # Lub: set {_instance} to the instance of the plugin "SternalBoard" # Lub: set {_instance} to an instance of the plugin "SternalBoard" # Lub: set {_instance} to the instance of plugin "SternalBoard" # Lub: set {_instance} to an instance of plugin "SternalBoard" Przy okazji Pan właśnie dowiedział się jak wykorzystać te wyrażenie. Co do wszelkich importów, od razu mogę powiedzieć, że niczego nie trzeba dodawać w sekcji 'import', którą skript-reflect dodaje. Więcej informacji o niej znajdzie Pan tutaj. Ta linijka oznacza, że "na podstawie" instancji pluginu SternalBoard zapisujemy do zmiennej {_sManager} instancję menadżera scoreboardu, który jest oferowany przez plugin SternalBoard. Innymi słowy, instancja pluginu SternalBoard zawiera informacje o menadżerze scoreboardu, które nas interesują. Ma Pan całkowitą rację, niemniej jednak w obliczu Pana wysiłków i chęci nauki czegoś nowego (a rzadko się obserwuje taką postawę na forum, pochwalam) jestem w stanie przystać na Pana prośbę. command /tabela: executable by: players trigger: set {_instance} to instance of plugin "SternalBoard" set {_scoreboardManager} to {_instance}.getScoreboardManager() {_scoreboardManager}.toggle(player) Proszę uprzejmie. Gdybym miał napisać taki skrypt, zrobiłbym to jak wyżej. Nie za bardzo rozumiem Pana pytanie, można jaśniej? Czy chodzi o komendę, która tworzy nową tabelę?
  18. Zaznaczam, iż rozumiem Pana post jako zlecenie. on command "sklep": sender is a player play sound "BLOCK_NOTE_BLOCK_XYLOPHONE" to sender Proszę bardzo.
  19. Rozumiem Pana, sam na początku miałem problemy z rozumieniem tej dokumentacji, dlatego też zaoferowałem swoją pomoc. Cieszy mnie jednak, że Pan ma pojęcie o programowaniu obiektowym. Skoro Pan miał już styczność z C++ (notabene prekursorem Javy), z pewnością Pan wie jak działa wywoływanie metod na danym obiekcie. {_obiekt}.twojaMetoda({_argumenty::*}) Dokładnie tak samo to działa w skript-reflect. Tutaj nie wchodzimy w jakiekolwiek niuanse programistyczne, w przypadku Pana kodu wystarczy wywołanie dwóch metod. Pierwsza metoda to getScoreboardManager(), której wartość zwracaną zapisujemy do zmiennej. Należy ją wywołać na instancji pluginu zapisanej do jakiejś zmiennej (na przykład {_instance}). Pokazałem Panu wcześniej wyrażenie w skript-reflect zwracające instancję pluginu. set {_sManager} to {_instance}.getScoreboardManager() Pokazałem wyżej przykład jak należy to zrobić. Rzecz jasna nazwy naszych zmiennych nie mają żadnego znaczenia (jedynie kwestia czytelności kodu), ważne jest to co przechowują. Druga metoda to toggle(Player player), do której wystarczy przesłać np. wyrażenie 'player'. Jej wartości nie trzeba zapisywać (zresztą nie ma czego, gdyż typ zwracanej wartości to void), po prostu trzeba ją wywołać na instancji zwróconej przez metodę z punktu 1. Jeśli nadal będzie Pan miał problemy z napisaniem tego skryptu, proszę dać znać. Tutaj pokazałem mniej szczegółowe wyjaśnienie, tak więc po zapoznaniu się z tym postem proszę wrócić do mojego poprzedniego.
  20. Zadam myślę, że oczywiste pytanie. Czy posiada Pan plugin PlaceholderAPI (w skrócie PAPI) na swoim serwerze? Jeśli nie, proszę go pobrać i spróbować ponownie. Trzeba mieć na uwadze to, iż PAPI nie zawsze jest w stanie od razu pobrać wartości oferowanych przez inne pluginy (bądź rozszerzenia) placeholderów. W takiej sytuacji należy wyszukać interesujące nas placeholdery na stronie Github pluginu PAPI i sprawdzić czy jest podana do nich komenda do pobrania. Jeśli tak - należy ją wpisać, aby uzyskać dostęp do danych placeholderów. Dodam, że nazwa gracza jest zawarta w rozszerzeniu Player, do którego pobrania jest przeznaczona komenda podana na stronie w powyższym załączniku. Ponadto, plugin Vault wedle wykazu ze strony Githuba PAPI nie oferuje placeholderu %vault_rank%. Myślę, że Pan miał na myśli placeholder %vault_group%.
  21. Niech Pan pokaże swój kod, w którym próbuje Pan zaimplementować cały kod komendy. Wskażę przyczyny błędów oraz podam rozwiązania Pana problemu. Co do samej dokumentacji, jeśli Pan napotkał trudności przy próbie zrozumienia jej zawartości, proszę wskazać o których jej fragmentach mowa. Postaram się przełożyć informacje w niej zawarte na język możliwie prosty.
  22. Widzę, że nie rozumie Pan działania komendy '/kick <target> [<reason>]'. Drugi argument (reason) to wiadomość, która wyświetla się na ekranie graczowi wyrzuconemu z serwera. Co prawda nie jest to oficjalne źródło, jednakże polecam zapoznać się z tym artykułem. Jeśli natomiast odnieść się do Pana propozycji, mało prawdopodobnym wydaje się scenariusz, w którym gracz w przeciągu kilku sekund (optymistyczny wariant względem Pana sugestii) przeczyta ze zrozumieniem cały powód wyrzucenia z serwera. Zresztą, w ogólności dodawanie opóźnień do kodu nie jest wskazane, a w tym szczególnym przypadku zgodnie ze zdrowym rozsądkiem wyrzucenie powinno być natychmiastowe, a nie opóźnione.
  23. Jestem przeciwnikiem wręczania gotowego kodu, bo człowiek się niewiele uczy z niego. Sprecyzuję i opiszę dokładnie co należy zrobić. 1. Należy dodać instrukcję 'stop' do warunku. if arg-1 or arg-2 isn't set: send "&c&lBETA&f&lTESTY &7Poprawne uzycie: /kicka [gracz] [powod]" stop # Dalszy kod... Tak powinien wyglądać Pana warunek. 2. Linijkę wykonującą komendę 'kick' execute console command "kick %arg 1% %arg 2%" powinien Pan zastąpić linijką kick arg-1 due to arg-2 wykorzystującą efekt 'kick' wspomniany przeze mnie w moim poprzednim poście. Myślniki są opcjonalne, skrypt będzie działał i bez nich. W razie wątpliwości co do poprawnego zapisu argumentów, odsyłam do dokumentacji, w której nie brakuje przykładów wykorzystania wszelkiej maści instrukcji.
  24. Silnik serwera to sprawa drugorzędna w przypadku tego dodatku, najważniejsza jest wersja serwera. Jeśli Pan posiada wersję Minecraft starszą niż 1.18.2, proszę wejść na Githuba z wydaniami tego dodatku i poszukać jakiejś starszej wersji SkBee, która będzie odpowiednia dla Pana serwera. Natomiast, jeśli Pan posiada wersję 1.18.2+, proszę pobrać dodatek bezpośrednio ze strony Spigot lub powyższego linku do Githuba. Wszystko powinno być w porządku.
  25. Mogę wiedzieć dlaczego Pan nie może pobrać SkBee? Czy to wynika z ograniczeń Pana serwera, czy też z czegoś innego? Uprzedzam, że próba wyświetlania jest możliwa i na subtitle, i na actionbar. Problem tkwi w tym, że wykonanie będzie nieco mniej eleganckie, gdyż będzie z pewnością zawierało zapętlanie graczy co chwilę. Dlatego proszę przemyśleć czy rzeczywiście nie jest w stanie Pan zainstalować dodatku SkBee na swoim serwerze. Szanowny Panie, doceniam chęć edukacji użytkowników forum i pochwalam takie działanie, jednakże zwracam uwagę, iż znajdujemy się w dziale "Skript > Zlecenia", a nie w dziale "Skript > Pytania i problemy".
×
×
  • Dodaj nową pozycję...