-
Ilość zawartości
11015 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
231
Treść opublikowana przez Kormic
-
Proszę bardzo. Skrypt nie był testowany. W sekcji 'options' możliwe jest ustawienie obszaru, do którego może być teleportowany gracz. Proszę to robić z głową, ponieważ jeżeli obszar będzie obejmował jedynie zbiornik wodny (lub w bardzo dużej części), pętla losująca koordynaty nigdy się nie zakończy, co doprowadzi do zatrzymania pracy serwera. Dodatkowo, w tej samej sekcji możliwe jest ustawienie nazwy świata, w którym gracz może użyć komendy /rtp (fromWorld) i nazwy świata, do którego gracz będzie teleportowany (toWorld). local function randomSafeLocation(minX: number, maxX: number, minZ: number, maxZ: number, w: world) :: location: set {_foundLocation} to false while {_foundLocation} is false: set {_x} to random integer between {_minX} and {_maxX} set {_y} to 0 set {_z} to random integer between {_minZ} and {_maxZ} set {_highestBlock} to highest block at location({_x}, {_y}, {_z}, {_w}) {_highestBlock} is not water or lava block above {_highestBlock} is not water or lava set {_foundLocation} to true return location of {_highestBlock} options: minX: -5000 maxX: 5000 minZ: -5000 maxZ: 5000 fromWorld: word toWorld: word1 command /rtp [<text>]: executable by: players trigger: if player isn't in world "{@fromWorld}": send "&6Możesz wykonać tę komendę jedynie w świecie &e{@fromWorld}&6." to player stop teleport player to randomSafeLocation({@minX}, {@maxX}, {@minZ}, {@maxZ}, world "{@toWorld}") send "&aZostałeś przeteleportowany do świata &b{@toWorld}&a." to player Mogę również dodać fragment z teleportacją do Netheru i Kresu, ale muszę mieć więcej informacji. W jaki sposób gracz może się do nich teleportować i w jakich godzinach? Pozdrawiam.
-
Ten temat został przeniesiony.
-
Problem został rozwiązany.
-
@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.
