-
Ilość zawartości
11012 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
230
Treść opublikowana przez Kormic
-
@mimiwester '%entities%' to fragment szablonu składni, który należy wypełnić bytem (lub bytami), które sprawdzamy w tym warunku. W tym przypadku sprawdzamy czy gracz pływa w łódce, a więc warunek powinien wyglądać jak niżej. if player is riding boat: # Dalszy kod... # Poprawniejsza wersja zgodnie z gramatyką języka angielskiego: if player is riding a boat: # Dalszy kod... Co więcej, warto szybko wytłumaczyć jak należy czytać składnię podaną w dokumentacji: (...|...|...) - należy wybrać jeden z podanych elementów, a więc jest to fragment obowiązkowy, [] - opcjonalność, a więc wszystko zawarte w nawiasie kwadratowym jest nieobowiązkowe. Dodam, że jeżeli chcemy zablokować pływanie na łódce w danym regionie, warto sprawdzić do jakiego regionu gracz wpływa na niej. if "%regions at player%" contains "nazwa_regionu in world ""nazwa_świata""": # Dalszy kod... # Przykład: on region enter: if "%regions at player%" contains "no_boats_region in world ""spawn""": # Dalszy kod... EDIT: Chciałbym jeszcze polecić kilka źródeł wiedzy o Skript'cie: dokumentacja Skripta, wiki Skripta prowadzone przez te forum, sekcje z poradnikami i promowanymi skryptami w dziale Skript na tym forum. Pozdrawiam.
-
Proszę pokazać kod. To znaczy? Można przepłynąć lub wejść do łódki pomimo ustawienia flagi zabraniającej tego?
-
Problem został rozwiązany.
-
Nie sposób nie zadać pytania: dlaczego? Jedyne sensowne wyjaśnienie jakie przychodzi mi do głowy to chęć ominięcia lanuchera, choć i tak jest to dziwne. Komenda do uruchomienia Minecrafta z poziomu wiersza poleceń jest długa chociażby ze względu na konieczność uwierzytelnienia użytkownika. Pomocne mogą okazać się poniższe linki: How to launch minecraft java ediction from the command line (github.com), minecraft-launcher-cmd · PyPI. Pozdrawiam.
-
Ten temat został przeniesiony.
-
@Dawidek21 Ponieważ napisał Pan do mnie wiadomość prywatną z prośbą o pokazanie trochę kodu, opisuję jak można podejść do tego problemu. Cieszy mnie Pana entuzjazm, bo jest to jedyny możliwy sposób sprawdzenia nazwy xD. Blok po postawieniu traci (prawie) wszystkie informacje z okresu bycia przedmiotem w ekwipunku gracza i nazwa nie jest tutaj wyjątkiem. Oba sposoby są w pełni poprawne, ale moja intuicja podpowiada mi, że właśnie ten drugi sposób z obliczaniem koordynatów chunku jest bardziej solidny pod względem sposobu działania. W porządku. Przejdźmy więc do pisania samego kodu. Zaznaczam, że nie podam na srebrnej tacy całego kodu. Warto, aby Pan również poznał podstawy Skripta. Myślę, że pokazanie wszystkiego na bazie pseudokodu i dalsze objaśnianie w razie potrzeby będzie najsensowniejsze. Podam również przydatne linki do nauki podstaw Skripta. Kod z wykorzystaniem pętli while, która kończy się gdy gracz wyjdzie z obszaru chunku i nie wróci przed kolejną iteracją pętli: przy postawieniu bloku: narzędzie gracza to ten konkretny blok diamentu: {pętlaDziała::%lokalizacja bloku%} == true: wyślij wiadomość "W tym miejscu działa wyrzucanie jeszcze poprzedniego bloku. Wykop go, odczekaj chwilę i spróbuj ponownie." do gracza stop {_blokChunkX} = floor(x bloku / 16) {_blokChunkZ} = floor(z bloku / 16) {pętlaDziała::%lokalizacja bloku%} = true tak długo jak {pętlaDziała::%lokalizacja bloku%} == true: {_graczChunkX} = floor(x gracza / 16) {_graczChunkZ} = floor(z gracza / 16) jeżeli {_graczChunkX} != {_blokChunkX} lub {_graczChunkZ} != {_blokChunkZ} lub {blokZniszczony::%lokalizacja bloku%} == true: wyjdź z pętli wyrzuć diament w miejscu bloku nad postawionym blokiem diamentu odczekaj 10 sekund wyczyść {pętlaDziała::%lokalizacja bloku%} i {blokZniszczony::%lokalizacja bloku%} przy zniszczeniu bloku: zmienna globalna {pętlaDziała::%lokalizacja bloku%} jest ustawiona: {blokZniszczony::%lokalizacja bloku%} = true przy wyładowaniu skryptu: wyczyść listy {pętlaDziała::*} i {blokZniszczony::*} Zaleta powyższego rozwiązania: łatwiej jest pobrać gracza, który postawił blok. Wada powyższego rozwiązania: zarządzanie pętlą jest trudniejsze ze względu na konieczność zapobieżenia tworzeniu wielu pętl while (co jest obciążające dla serwera). Kod z wykorzystaniem periodicala (kodu wykonującego się okresowo) tak długo jak gracz jest w obszarze chunku: przy postawieniu bloku: narzędzie gracza to ten konkretny blok diamentu: dodaj lokalizację bloku do listy {generatory::*} {graczStawiającyBlok::%lokalizacja bloku%} = gracz przy zniszczeniu bloku: # opcjonalnie w tym miejscu: czy blok to blok diamentu lista {generatory::*} zawiera lokalizację bloku: usuń lokalizację bloku z listy {generatory::*} wyczyść {graczStawiającyBlok::%lokalizacja bloku%} co 10 sekund: zapętl listę {generatory::*}: {_gracz} = {graczStawiającyBlok::%loop-value%} jeżeli {_gracz} jest offline: pomiń tę iterację (continue) {_blokChunkX} = floor(x loop-value / 16) {_blokChunkZ} = floor(z loop-value / 16) {_graczChunkX} = floor(x {_gracz} / 16) {_graczChunkZ} = floor(z {_gracz} / 16) jeżeli {_graczChunkX} != {_blokChunkX} lub {_graczChunkZ} != {_blokChunkZ}: pomiń tę iterację (continue) {_lokalizacjaNad} = loop-value dodaj 1 do y {_lokalizacjaNad} wyrzuć diament w miejscu {_lokalizacjaNad} Zaleta powyższego rozwiązania: łatwiej zarządza się pętlą, nie musimy się martwić tworzeniem wielu pętl działających jednocześnie. Wada powyższego rozwiązania: trzeba przechowywać informację o graczu, który postawił blok. Powyższe kody można zmodyfikować tak, aby działały na dowolnych graczy. W istocie, jest to niewielkie rozwinięcie obu kodów. Przydatne linki do nauki Skripta: dokumentacja Skript, wiki Skripta prowadzone przez te forum, całe forum skript.pl, szczególnie sekcje z poradnikami i promowanymi skryptami. Pozdrawiam.
-
Zlecenie zostało wykonane.
-
No dobrze. Zadam więc szereg pytań. Czy ustawił Pan wyświetlanie efektu w istniejącym świecie? Czy jest Pan w tym świecie, który Pan wpisał? Czy jest Pan w miejscu wpisanych koordynatów? Czy ma Pan wersję skript-reflect zgodną z wersją Skripta? Jeżeli nie jest Pan pewien, proszę podać wersję Skripta, wersje zainstalowanych dodatków do Skripta i wersję serwera. Jeżeli odpowiedział Pan zgodnie na wszystkie powyższe pytania "tak", możemy przejść dalej. Niech Pan w wywołaniu funkcji World#spawnParticle spróbuje wpisać 0 lub 1 zamiast parametru {_note}. Jedna z tych liczb musi być końcem przedziału. Jeżeli oba warianty zawiodą, proszę również zmienić ostatni parametr równy 1 na przykład na 0.1. W normalnym przypadku powinna to być widoczność efektu, gdzie 0 oznacza całkiem niewidoczny, a 1 oznacza w pełni widoczny. Bez tego dodatku Skript zwróciłby błędy przy przeładowaniu skryptu. Nie zmienia to jednak faktu, iż pytanie o wersję jest jak najbardziej na miejscu. Pozdrawiam.
-
Już rozumiem. W takim razie warto będzie wyczyścić niepotrzebne informacje zapisane o wykopanych blokach. Proszę wykonać poniższą komendę. command /wyczyscdane: trigger: clear {bloki::*} send "&6Liczniki wykopanych bloków zostały wyczyszczone dla wszystkich graczy." to sender Jak już to Pan zrobi, proszę podmienić skrypt na poniższy i przetestować czy wszystko działa jak należy. Dodatkowo, ustawiłem nieco bardziej skomplikowaną nazwę listy zmiennych, aby przypadkiem kiedyś nie doszło do kolizji nazw zmiennych na Pana serwerze. options: miningGoal: 10 on mine: event-block is coal ore or iron ore add 1 to {minedBlocks::counter::%player%} if {minedBlocks::counter::%player%} >= {@miningGoal}: execute console command "/say Gracz %player% zniszczył co najmniej {@miningGoal} bloków." clear {minedBlocks::counter::%player%} stop send "&aMusisz wykopać jeszcze &6%{@miningGoal} - {minedBlocks::counter::%player%}% &abloków." to player Pozdrawiam.
-
Proszę. Skrypt nie był testowany. Do poprawnego działania skryptu wymagany jest dodatek skript-reflect. Koordynaty może Pan ustawić w ostatniej linijce. Parametry drugi, trzeci i czwarty to odpowiednio koordynaty x, y, z. Nazwę świata można zmienić w pierwszej linijce periodicala. Nie mam pewności czy poniższy kod zadziała, ponieważ bazowałem go na swoich przeszłych doświadczeniach, gdzie nuty przyjmowały tylko 24 dyskretne wartości reprezentujące różne kolory w przedziale od 0 do 1. Nie mam pewności również jak dokładnie jest zdefiniowany przedział barw, to znaczy w jaki sposób jest domknięty. Przyjąłem więc, że jest prawostronnie otwarty, a więc barwa nuty o wartości 24/24 = 1 nie istnieje. import: org.bukkit.Particle every 4 ticks: set {_world} to world "world" set {_note} to (random integer between 0 and 23) / 24 {_world}.spawnParticle(Particle.NOTE, 100, 100, 100, 0, {_note}, 0, 0, 1) Pozdrawiam.
-
Ta informacja niewiele mi mówi, jest niemalże bezwartościowa. Jak Pan sprawdził działanie skryptu? Proszę opisać krok po kroku. Dodatkowo, co konkretnie nie działa? Na którym etapie skrypt zawodzi? Cenna będzie również informacja o wersji Skripta, wersjach zainstalowanych dodatków do Skript i wersji serwera. Pozdrawiam.
-
Problem został rozwiązany.
-
Czy da się sprawdzić że gracz wcisnął np shift w mc i kliknął prawym przyciskiem myszy
Kormic odpowiedział(a) na ghgSFGdf pytanie w Pytania i problemy
Ten temat został przeniesiony. -
Nie istnieje zdarzenie w Skript rejestrujące zmiany maksymalnej ilości życia gracza. Jedyne co można zrobić w tej sytuacji to nasłuchiwać do zdarzenia 'on heal'. Innymi słowy, jest to kwestią mądrego zarządzania takim systemem tak, aby nie dochodziło do bugów i powielania serc. Pozdrawiam.
-
Czy da się sprawdzić że gracz wcisnął np shift w mc i kliknął prawym przyciskiem myszy
Kormic odpowiedział(a) na ghgSFGdf pytanie w Pytania i problemy
Jeżeli pytanie dotyczy zwykłego wciśnięcia takiej kombinacji chodząc po świecie, wystarczy nasłuchiwać do zdarzenia 'on right click' i sprawdzić czy gracz kuca w tym momencie. on right click: player is sneaking # Dalszy kod... Możemy również sprawdzić taką kombinację w ekwipunku nasłuchując do zdarzenia 'on inventory click'. on inventory click: click type is shift+rmb # Dalszy kod... Pozdrawiam. -
Jak najbardziej. Tak długo jak są w osobnych plikach, ich lokalność jest gwarancją braku kolizji między skryptami i ich ciała (kod znajdujący się w funkcjach) nie mają żadnego znaczenia. Dziwię się, że Pan tego nie przetestował na własną rękę. Pozdrawiam.
-
Proszę. Skrypt nie był testowany. options: protectionDurationAfterDeath: 120 minutes on damage of player: attacker is a player final damage > health of victim set {_lastKilledAttacker} to {lastKilledByPlayer::%uuid of attacker%} if {_lastKilledAttacker} is set: difference between {_lastKilledAttacker} and now < {@protectionDurationAfterDeath} cancel event send "&c&lNie możesz zabijać innych graczy po uzyskaniu ochrony." to attacker stop set {_lastKilledVictim} to {lastKilledByPlayer::%uuid of victim%} if {_lastKilledVictim} is set: difference between {_lastKilledVictim} and now < {@protectionDurationAfterDeath} cancel event send "&c&lTen gracz został niedawno zabity." to attacker stop set {lastKilledByPlayer::%uuid of victim%} to now send "&a&lUzyskałeś ochronę na pewien czas." to victim Pozdrawiam.
-
Problem został rozwiązany.
-
Co prawda problem został już rozwiązany, ale mimo to chciałbym udostępnić źródła pomocne w nauce Skripta. Dokumentacja Skript: https://docs.skriptlang.org/ Kompendium wiedzy o Skript'cie prowadzone przez te forum: https://wiki.skript.pl/Kategoria:Skript Artykuł autorstwa PoweredDragon opisujący pokrótce większość błędów zwracanych przez Skripta: Pozdrawiam.
-
Problem został rozwiązany.
-
Zlecenie zostało wykonane.
-
Proszę. options: GUIName: &6&lNazwa GUI local function execCommandCloseInv(p: player, t: text): close {_p}'s inventory make {_p} execute command {_t} on right click: name of player's tool is "&6&lSerwery" set {_gui} to chest inventory with 3 rows named "{@GUIName}" set slot (integers from 0 to 26) of {_gui} to lime glass pane named " " set slot 12 of {_gui} to iron sword named "TEKST" with lore "LORE" set slot 13 of {_gui} to iron pickaxe named "TEKST" with lore "LORE" set slot 14 of {_gui} to diamond block named "TEKST" with lore "LORE" open {_gui} to player on inventory click: event-inventory is not player's inventory name of event-inventory is "{@GUIName}" cancel event if index of clicked slot is 12: executeCommandCloseInv(player, "/komenda1") else if index of clicked slot is 13: executeCommandCloseInv(player, "/komenda2") else if index of clicked slot is 14: executeCommandCloseInv(player, "/komenda3") Pozdrawiam.
-
Problem został rozwiązany.
-
Zegar i kompas to dwa różne przedmioty. Proszę się upewnić czy ten kompas różni się od najzwyczajniejszego kompasu jedynie tą ustawioną nazwą. Jeżeli posiada on jakikolwiek lore, bądź nałożone zaklęcia, a nawet różnice w NBT, skrypt nie zadziała. Jeżeli jednak Panu wystarczy samo sprawdzanie nazwy narzędzia gracza, można zamienić linijkę 'player's tool is compass named ...' na: name of player's tool is "&6&lSerwery" Pozdrawiam.
-
Funkcje lokalne różnią się od globalnych tym, że jak poniekąd sama nazwa wskazuje, mogą być używane tylko w skrypcie, w którym zostały zdefiniowane. Próba użycia ich poza plikiem, w którym są zdefiniowane, zakończy się błędem zwróconym przez Skripta. Druga różnica to to, że są one ładowane przed funkcjami globalnymi, czyli mają zagwarantowane pierwszeństwo w przypadku kolizji nazw. Można to łatwo pokazać przy pomocy kodu. Dla przykładu stworzymy dwa pliki skryptowe. # plik testfunkcji1.sk local function myFunction(): broadcast "local - Hello world!" command /test: trigger: myFunction() # plik testfunkcji2.sk function myFunction(): broadcast "global - Hello world!" Która funkcja zostanie wywołana przy wykonaniu komendy /test? Odpowiedź brzmi: lokalna funkcja myFunction (ta obecna w pliku testfunkcji1.sk). EDIT: Zapomniałem dopowiedzieć o możliwych zastosowaniach. W mojej ocenie lokalne funkcje są przydatne, ponieważ mamy pewność, iż to właśnie kod naszej funkcji zostanie wykonany. Zresztą, dwie globalne funkcje nie mogą być zdefiniowane jednocześnie, ponieważ Skript zwróci błąd przy przeładowaniu skryptu (bądź skryptów). Poza tym, jeżeli dana funkcja jest używana tylko w danym skrypcie, nie ma sensu udostępniać jej wszystkim skryptom załadowanym na serwerze. Jest to swego rodzaju higiena pracy, coś na zasadzie enkapsulacji w Javie (choć pojęcia funkcji lokalnej i enkapsulacji są dalekie od siebie, ale myślę, że analogia jest widoczna). Mam nadzieję, że wyjaśniłem co nieco. Jeżeli pojawią się jakieś pytania, śmiało. Pozdrawiam.
