Skocz do zawartości

Kormic

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

    11012
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    230

Treść opublikowana przez Kormic

  1. Nie jest to możliwe dla wersji 1.18+, ponieważ w trybie przetrwania klient nie wysyła pakietu o takim typie kliknięcia do serwera. Jedynym wyjątkiem od tej zasady jest sytuacja, w której slot kursora (ang. 'cursor slot') nie jest pusty. Pozdrawiam.
  2. Kormic

    skrypt po relognięciu

    Proszę uprzejmie. Komenda /setspawn wymaga permisji do jej użycia. Może Pan zauważyć komentarz 'wait 1 tick'. Jeśli skrypt działa bez zarzutu, może Pan go usunąć. Jeśli jednak teleportacja nie będzie następowała, proszę usunąć znak "#" na początku tej linijki, przeładować skrypt i sprawdzić ponownie. on join: #wait 1 tick {serverLocations::spawn} is set teleport player to {serverLocations::spawn} command /setspawn: executable by: players permission: server.command.setspawn trigger: set {serverLocations::spawn} to player's location send "&aLokalizacja spawnu została zaktualizowana." to player Pozdrawiam.
  3. W ten sposób Pan nie ustawi nazwy przywołanego bytu (pillagera w tym przypadku). Należy najpierw przywołać go, a następnie ustawić jego nazwę ('name' lub 'display name', zależy czy ma być widoczna tylko przy najechaniu na byt, czy też niezależnie od tego). Może Pan to zrobić na dwa sposoby. # Sposób nr 1: spawn pillager at loop-player set display name of last spawned pillager to "&cPillager" # Sposób nr 2 (w mojej ocenie lepszy): spawn pillager at loop-player: set display name of pillager to "&cPillager" Różnica między nimi jest taka, że w przypadku pierwszego kodu nazwa jest ustawiana po pojawieniu się bytu, natomiast w przypadku drugiego kodu jest ona ustawiana przed pojawieniem się bytu. Jak może Pan zauważyć, napisałem, że druga wersja jest według mnie bardziej poprawna. Wynika to z następującego faktu - unikamy odwoływania się do ostatnio przywołanego bytu na serwerze. Co prawda takie odwoływanie się działa, jednakże jest ono mało eleganckie i czasem generuje wątpliwości dotyczące pewnych sytuacji (na przykład pojawienie się dwóch bytów jednocześnie, to znaczy w tym samym cyklu zegara gry). Pozdrawiam.
  4. No dobrze, więc tak... Niech Pan sprawdzi czy aby przypadkiem nie posiada Pan jakiegokolwiek innego skryptu zawierającego ten kod. Skript wskazuje jako winny plik "skrypt.sk". Proszę wykonać komendę "/sk reload all". Spowoduje to przeładowanie wszystkich skryptów i plików konfiguracyjnych. Jeśli nie poskutkują powyższe propozycje, proszę usunąć (uprzednio skopiować w bezpieczne miejsce rzecz jasna) na chwilę wszystkie skrypty jeśli to możliwe i sprawdzić czy problem nadal występuje. Jeśli problem ustąpi, może Pan rozpocząć wrzucanie skryptów z powrotem na serwer (jeden po jednym, nie wszystkie jednocześnie!). W ramach ostatecznego aktu rozpaczy proszę odinstalować wszystkie dodatki do Skripta (wystarczy wyciągnąć z folderu 'plugins') i uruchomić serwer z samym Skriptem, bez dodatków do niego. Następnie może Pan próbować uruchomić na serwerze (ciągle tylko Skript, bez dodatków) skrypty niewymagające dodatków. Jeśli wszystko będzie w normie, może Pan rozpocząć przywracanie dodatków i skryptów wymagających ich. W samym skrypcie rzecz jasna nie widzę jakiegokolwiek błędu, jednakże Pan pokazał tylko jego wycinek, więc nie wiem czy Pan na przykład nie patrzy na złą linijkę. Opcjonalnie proszę próbować dalej restartować serwer i sprawdzać konsolę w poszukiwaniu ewentualnych błędów zgłaszanych przez serwer i/lub Skript. Pozdrawiam.
  5. Kormic

    Strony w GUI

    Przy założeniu, że indeksy listy zmiennych {ItemyRynek::*} to liczby naturalne (0, 1, 2, ...), a jej zawartość to przedmioty wystawiane na rynku, funkcję można zmodyfikować w poniższy sposób. options: numberOfItemsPerPage: 45 function createGUIPage(page: number) :: inventory: set {_gui} to chest inventory with 6 rows named "&7Strona &b%{_page}%" loop {@numberOfItemsPerPage} times: # Ustawienie indeksu pobieranego przedmiotu z listy # Na przykład, dla page = 2 i trzeciego przedmiotu na stronie otrzymujemy: (2 - 1) * 45 + 3 = 48 <- to jest indeks pobieranego przedmiotu w liście set {_index} to ({_page} - 1) * {@numberOfItemsPerPage} + loop-number if {ItemyRynek::%{_index}%} is not set: exit loop set slot (loop-number - 1) of {_gui} to {ItemyRynek::%{_index}%} if {_page} > 1: set slot 45 of {_gui} to arrow named "&7Wróć na stronę &6%{_page} - 1%" set {_nextPageIndex} to {_page} * {@numberOfItemsPerPage} + 1 # Sprawdzenie czy istnieją jeszcze jakieś przedmioty, które można wyświetlić na kolejnych stronach if {ItemyRynek::%{_nextPageIndex}%} is set: set slot 53 of {_gui} to arrow named "&7Przejdź na stronę &6%{_page} + 1%" return {_gui} Jeśli pojawią się jakieś wątpliwości, proszę pytać. Pozdrawiam.
  6. W mojej pierwszej odpowiedzi przyjąłem standard NBT dla wersji 1.20.4 i niżej, stąd znacznik 'display' zamiast znacznika 'minecraft:custom_name'. Co do tej głowy, o którą Pan zapytał - poniżej znajduje się jej całe NBT dla wersji 1.20.5+. {[minecraft:custom_name='{"text":"Light Gray 1","color":"gold","underlined":true,"bold":true,"italic":false}',minecraft:lore=['{"text":"Custom Head ID: 10026","color":"gray","italic":false}','{"text":"www.minecraft-heads.com","color":"blue","italic":false}'],profile={id:[I;1617766936,-1189326977,-1693600819,841912852],properties:[{name:"textures",value:"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2FmMWIyODBjYWI1OWY0NDY5ZGFiOWYxYTJhZjc5MjdlZDk2YTgxZGYxZTI0ZDUwYThlMzk4NGFiZmU0MDQ0In19fQ=="}]}]} Może Pan sobie wstawić te NBT na stronie "upiększającej" (de facto czyniącej zapis bardziej czytelnym) format JSON, na przykład na tej. Oczywiście NBT i JSON to dwie różne rzeczy, jednakże do tego zadania ta strona jest wystarczająca. Proszę się nie przejmować tym, że strona uzupełnia NBT o niewielkie poprawki, gdyż Pan i tak używa jej jedynie w celu poprawy czytelności. Jak najbardziej można wkleić całe NBT (pamiętając o podwojeniu cudzysłowów) i wtedy wyżej wspomniane "upiększanie" jest zbędne, ale dla nas informacje o nazwie i lore są niepotrzebne, więc możemy je usunąć. Tak więc usuwamy wszystko poza znacznikiem 'profile' i jego zawartością. W rezultacie otrzymujemy poniższy wycinek NBT zawierający jedynie informacje o właścicielu i teksturze głowy. {profile={id:[I;1617766936,-1189326977,-1693600819,841912852],properties:[{name:""textures"",value:""eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2FmMWIyODBjYWI1OWY0NDY5ZGFiOWYxYTJhZjc5MjdlZDk2YTgxZGYxZTI0ZDUwYThlMzk4NGFiZmU0MDQ0In19fQ==""}]}} Pozdrawiam.
  7. Kormic

    Strony w GUI

    Poniżej udostępniam prosty przykład realizujący wspomniany przez Pana mechanizm. Skrypt tworzy kilkustronicowe GUI o numerach stron od 1 do 5. Wydaje mi się, że z dydaktycznego punktu widzenia jest to dobry skrypt, ponieważ nie zawiera niepotrzebnych urozmaiceń. Realizuje tylko tę jedną funkcjonalność. function createGUIPage(n: number) :: inventory: set {_gui} to chest inventory with 3 rows named "&7Strona &b%{_n}%" set slot (integers from 0 to 26) of {_gui} to black stained glass pane if {_n} > 1: set slot 18 of {_gui} to arrow named "&7Wróć na stronę &6%{_n} - 1%" if {_n} < 5: set slot 26 of {_gui} to arrow named "&7Przejdź na stronę &6%{_n} + 1%" return {_gui} command /multipagegui: executable by: players trigger: open createGUIPage(1) to player on inventory click: event-inventory is not player's inventory event-inventory's name contains "&7Strona &b" cancel event index of clicked slot is 18 or 26 type of clicked slot is arrow set {_split::*} to uncoloured name of event-inventory split at " " set {_page} to {_split::2} parsed as number if index of clicked slot is 18: open createGUIPage({_page} - 1) to player stop open createGUIPage({_page} + 1) to player W razie pytań proszę śmiało je zadawać. Pozdrawiam.
  8. Jak SkBee wskazuje, zapomniał Pan o nawiasie klamrowym na początku i końcu NBT. Niech Pan również usunie nawias kwadratowy obejmujący całe NBT (nie ma sensu w tworzeniu jednoelementowej listy) i powinno zadziałać.
  9. Może Pan zedytować wiadomość (wyrażenie 'message') za pomocą efektu 'replace'. Przykład poniżej. # Zamiana wszelkich spacji w wiadomości na znak "_" replace all " " in message with "_" W Pana przypadku wystarczy zamienić wszystkie znaki "@" na "". Jeśli Pan potrzebuje więcej przykładów, odsyłam do dokumentacji Skript. Wstawiłem wyżej linki do jej fragmentów, które powinny się przydać. Pozdrawiam.
  10. Kormic

    Top

    Pan złożył dwa tygodnie temu podobne zlecenie, więc proszę nie powielać wątków. Podjąłem się wykonania zlecenia i Pan nie odpowiedział na nie, więc założyłem, że wszystko działa jak należy. Już pominę fakt braku zwykłej wdzięczności z Pana strony za napisanie skryptu. Pozdrawiam.
  11. Proszę pokazać jak Pan wpisał NBT do skryptu. Proszę podać również wersję serwera i linki do stron z głowami, które chce Pan ustawić.
  12. Najlepszym rozwiązaniem będzie zdefiniowanie aliasu komendy w pliku commands.yml. Może Pan go znaleźć w folderze głównym serwera. Jak najbardziej można to rozwiązać poprzez dodanie aliasu w Skript (listener zdarzenia 'on command'), jednakże nie zalecam podchodzić do tego problemu w ten sposób. Jest to nieeleganckie i w dłuższej perspektywie czasu chęć dodania większej ilości aliasów komend będzie skutkowała niepotrzebnym tworzeniem ogromnych skryptów. Pozdrawiam.
  13. Kormic

    skrypt na miecz z efektami

    W takim razie proszę uprzejmie. Skrypt nie był testowany. Sekcję konfiguracyjna skryptu znajduje się na samej górze. Listę efektów mikstur dostępnych w Skript można znaleźć tutaj. Jeśli jest taka potrzeba, można dodać na końcu 26. linijki ('apply potion [...]') frazę 'replacing existing effect'. Dzięki temu nadany efekt nie nałoży się na istniejący już, a go zastąpi. options: # Typ przedmiotu (drewniany miecz, żelazna łopata, itd.) swordType: diamond sword # Nazwa przedmiotu swordName: "&6Miecz" # Lore przedmiotu swordLore: "&aLinijka nr 1", "&bLinijka nr 2" and "&cLinijka nr 3" # Cooldown nadawania efektu przy atakowaniu swordEffectCooldown: 25 seconds # Typ nadawanego efektu swordEffectType: poison # Poziom nadawanego efektu swordEffectTier: 2 # Długość trwania nadanego efektu swordEffectDuration: 10 seconds on damage of player: attacker is a player type of attacker's tool is {@swordType} name of attacker's tool is {@swordName} lore of attacker's tool is {@swordLore} if {swordEffect::cooldown::%attacker's uuid%} is set: difference between {swordEffect::cooldown::%attacker's uuid%} and now is smaller than {@swordEffectCooldown} stop set {swordEffect::cooldown::%attacker's uuid%} to now apply potion of {@swordEffectType} of tier {@swordEffectTier} to victim for {@swordEffectDuration} command /effectsword: executable by: players permission: server.command.effectsword permission message: &cNie posiadasz wystarczających uprawnień do wykonania tej komendy. trigger: give player {@swordType} named {@swordName} with lore {@swordLore} Pozdrawiam.
  14. Należy pamiętać, że lokalizacja gracza oprócz informacji o współrzędnych i świecie, przechowuje również informację o tym w jakim kierunku spogląda gracz (yaw i pitch). Jeśli Pan chce aby teleportacja następowała pomimo obracania się podczas odliczania, musi Pan sprawdzać jedynie koordynaty i świat. Może Pan to zrobić w poniższy sposób. set {tpa::position::%player%} to location at (x-loc of player, y-loc of player, z-loc of player) in player's world # ... # Sprawdzanie warunku teleportacji (porównanie lokalizacji) set {_teleportedPlayerLoc} to location at (x-loc of {_}, y-loc of {_}, z-loc of {_}) in {_}'s world if {_teleportedPlayerLoc} is not {tpa::position::%{_}%}: # Dalszy kod... Powiem jeszcze o kilku innych rzeczach, które przykuły moją uwagę. Dlaczego u Pana typ argumentu komendy (1. linijka) to 'gracz', a nie 'player'? Mam duże wątpliwości co do poprawności takiego zapisu. Dlaczego Pan zapisuje gracza podanego w argumencie komendy jako tekst do zmiennej, a nie jako obiekt gracza? Jest to dla mnie niezrozumiałe. Nie rozumiem również dlaczego Pan przyrównuje argument komendy do tekstu. Schludniejszym zapisem jest operowanie na obiekcie gracza. Jaki jest powód czyszczenia zawartości listy {tpa::*} przy każdorazowym wyjściu dowolnego gracza z serwera? Konsekwencją tego jest uniemożliwienie teleportacji wszystkim graczom na serwerze, ponieważ wszystkie zmienne z tej listy są czyszczone. Pan powinien cyklicznie sprawdzać przy teleportacji (na przykład co sekundę) czy gracz się poruszył. Lepiej od razu przerwać teleportację przy poruszeniu się i ją ponowić niż czekać aż upłynie 15 sekund (tak jak jest to ustalone w skrypcie). Pozdrawiam.
  15. Kormic

    skrypt na miecz z efektami

    Można prosić o więcej szczegółów? W jaki sposób i komu ma być nadawany ten efekt? Do czego ma być zastosowany cooldown 25-sekundowy?
  16. Rozumiem. W takim razie proszę uprzejmie, skrypt nie był testowany. Ponieważ Pan nie podał wersji serwera, przyjąłem założenie, że kod ma działać na wersji 1.20.5+. Za pomocą komendy /lightswand może Pan sobie dać różdżkę, która pozwala ustawiać sygnalizatory świetlne. Lewy przycisk myszy ustawia zielone sygnalizatory, a prawy czerwone. Jeśli Pan chce usunąć sygnalizator, wystarczy kliknąć ponownie, aby został on usunięty z listy danych sygnalizatorów. Co prawda kod mógłby być nieco krótszy poprzez zastosowanie funkcji, jednakże byłoby to przyczyną problemów z zapisaniem w niej wiadomości wysyłanych do gracza. Pozdrawiam.
  17. Kormic

    Kilof 3x3

    To dziwne. Jest Pan pewien, że użył Pan kilofa danego przez komendę /cuboidpickaxe? Proszę również pamiętać, że dodałem listener zdarzenia 'on mine'. Zdarzenie te jest wywoływane tylko jeśli z wykopanego bloku wypadną jakieś przedmioty, tak więc najlepiej to przetestować na przykład na kamieniu. Być może problem jest z warunkiem w linijce 15. po Pana stronie, trudno mi to ocenić. Dla świętego spokoju niech Pan spróbuje go zastąpić warunkiem 'loop-block is not bedrock' i sprawdzi czy skrypt już poprawnie działa. Pozdrawiam.
  18. Proszę uprzejmie. Skrypt nie był testowany. Jeśli jest taka potrzeba, można śmiało usunąć permisję z komendy wraz z wiadomością przy jej braku. options: fireworkName: "&bNieskończona fajerwerka" fireworkLore: "&7Fajerwerka, która nie zużywa się przy użyciu." command /fajerwerka: executable by: players permission: server.command.fajerwerka permission message: &cNie posiadasz uprawnień do użycia tej komendy. trigger: give player firework rocket named {@fireworkName} with lore {@fireworkLore} on right click: name of player's tool is {@fireworkName} lore of player's tool is {@fireworkLore} add 1 of player's tool to player's inventory Pozdrawiam.
  19. Jeśli arena PVP na Pana serwerze znajduje się w innym świecie, nie ma przeszkód w użyciu wbudowanej komendy /gamerule, ponieważ ustawia ona reguły gry osobno dla każdego świata. Zakładam jednak, że problem jest nieco bardziej złożony. Mianowicie, arena PVP znajduje się w tym samym świecie co strefy, w których gracze nie mają tracić przedmiotów w przypadku śmierci. Rozwiązań jest co prawda kilka, jednakże najprostszym wydaje się być utworzenie regionu obejmującego arenę PVP w pluginie "WorldGuard" i zainstalowanie pluginu "WorldGuard Extra Flags" pozwalającego na ustawienie wartości flagi 'keep-inventory' we wspomnianym regionie. Pozdrawiam.
  20. Niech Pan jasno określi czy jest to zlecenie, czy też prosi Pan o jakąś podpowiedź. Jeśli to drugie, może Pan to rozwiązać na dwa sposoby. Tworzymy trzy listy lokalizacji dla każdego światła (zielone, żółte i czerwone), a następnie przy podmianie sprawdzamy w której z list jest lokalizacja danej główki. W ten sposób jesteśmy w stanie jednoznacznie wskazać jaki ona reprezentuje kolor sygnalizatora świetlnego. Sprawdzamy przy podmianie świateł NBT główki i porównujemy (prawie) cały znacznik 'SkullOwner' z zapisanymi gdzieś ich wartościami. Innymi słowy, sprawdzamy w NBT jaką wartość ma tekstura główki, a więc sprawdzamy jakiego jest ona koloru. Mimo wszystko, nie wytłumaczył Pan dokładnej zasady działania tych sygnalizatorów świetlnych (jak zmieniają się kolory, itp.). Prosiłbym więc o taką informację. Pozdrawiam.
  21. W takim wypadku sugeruję zaktualizowanie pluginu Skript do możliwie najnowszej wersji. Jeśli jednak z jakichkolwiek powodów Pan nie może tego zrobić, jedynym wyjściem jest zapisanie alternatywy z użyciem zmiennej lokalnej, jak poniżej. set {_cond} to false if arg-1 is not set: set {_cond} to true if arg-1 is "on": set {_cond} to true if {_cond} is true: # Dalszy kod... % Identyczny kod, ale zapisany bardziej zwięźle: set {_cond} to false set {_cond} to true if arg-1 is not set set {_cond} to true if arg-1 is "on" if {_cond} is true: # Dalszy kod... Pozdrawiam.
  22. Są to dwa osobne warunki z punktu widzenia Skripta, należy więc je rozdzielić na dwa osobne warunki. Można je zapisać w poniższy sposób. if any: arg-1 is not set arg-1 is "on" then: # Dalszy kod... Źródło: https://docs.skriptlang.org/sections.html?search=#SecConditional Pozdrawiam.
  23. Jak najbardziej, ale nie obędzie się tutaj bez dodatku. Ściślej mówiąc, potrzebny będzie dodatek SkBee. Pozwala on na działanie na NBT, a więc tym samym na otrzymywanie dowolnych główek. Poradnik dla wersji 1.20.5+ może Pan znaleźć tutaj. Jeśli jednak Pan korzysta z jednej ze starszych wersji, proszę posłużyć się tym poradnikiem. W razie wątpliwości proszę pytać. Pozdrawiam.
  24. Najprościej będzie napisać w skrypcie kod cyklicznie wykonywany (znany również jako periodical). Może w nim Pan ustawiać osobno każdy blok w danej lokalizacji jak poniżej. every 5 minutes: set {_block} to block at location (100, 100, 100) in world "world" if {_block} is red stained hardened clay: set {_block} to lime stained hardened clay else if {_block} is lime stained hardened clay: set {_block} to red stained hardened clay Nietrudno jednak zauważyć, że takie rozwiązanie jest skrajnie niewydajne. Gdyby Pan miał 50 świateł, musiałby Pan przekopiować taki kod 50 razy. Dlatego lepiej jest utworzyć listę lokalizacji sygnalizatorów świetlnych i ją zapętlić. every 5 minutes: loop {trafficLights::locations::*}: set {_block} to block at loop-location if {_block} is red stained hardened clay: set {_block} to lime stained hardened clay else if {_block} is lime stained hardened clay: set {_block} to red stained hardened clay Może Pan tę listę zapełnić właściwie na dwa sposoby. Ręcznie dodać wszystkie lokalizacje po kolei do listy. Dodać jakiś mechanizm dodawania lokalizacji sygnalizatora przy prawym kliknięciu na niego lub wpisaniu odpowiedniej komendy. Szczerze mówiąc, próba oceny tego czy Pan zlecił napisanie skryptu, czy też poprosił o pomoc, przyprawiła mi nieco trudności. Stwierdziłem więc, że wytłumaczę jak ten kod można napisać. Pozdrawiam.
  25. Proszę uprzejmie. Skrypt był testowany. Aby otrzymać różdżkę, wystarczy wykonać komendę /getwand. Proszę mieć na względzie, że wymagana jest permisja do jej użycia. W razie potrzeby można spokojnie usunąć konfigurację komendy ('permission' i 'permission message'). options: wandItem: stick wandName: &bRóżdżka teleportacji wandMaxDurability: 2 wandDurabilityLore: &7Pozostało użyć command /getwand: executable by: players permission: server.command.getwand permission message: &cNie posiadasz wystarczających uprawnień do użycia tej komendy. trigger: set {_wand} to {@wandItem} named "{@wandName}" set lore of {_wand} to "{@wandDurabilityLore}: &a{@wandMaxDurability}" give {_wand} to player on right click: targeted block is set type of player's tool is {@wandItem} name of player's tool is "{@wandName}" teleport player above targeted block set {_splitLore::*} to (uncoloured line 1 of lore of player's tool) split at " " set {_usagesLeft} to {_splitLore::3} parsed as number if {_usagesLeft} = 1: remove 1 of player's tool from player's inventory send "&cTwoja różdżka teleportacji uległa zniszczeniu." to player wait 1 tick play sound "ENTITY_ITEM_BREAK" to player stop subtract 1 from {_usagesLeft} set lore of player's tool to "{@wandDurabilityLore}: &6%{_usagesLeft}%" wait 1 tick play sound "ENTITY_ENDERMAN_TELEPORT" to player Pozdrawiam.
×
×
  • Dodaj nową pozycję...