-
Ilość zawartości
11012 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
230
Treść opublikowana przez Kormic
-
Tak, da się tak zrobić. Rzecz jasna, poniższe rozwiązanie wymaga pluginu zarządzającego placeholderami (PlaceholderAPI lub MVdWPlaceholderAPI, polecam ten pierwszy, gdyż ilość jego użytkowników jest większa, a też zastosowanie MVdW jest ograniczone do pluginów jego autora). Najlepsza będzie rejestracja placeholderu za pomocą dodatku skript-placeholders. Przykłady można znaleźć tutaj. Co prawda załączona przeze mnie wiki nie jest najnowsza, ale pokazane tam kody są cały czas aktualne. Dodam, iż możliwe jest również pobranie rozszerzenia Skript z eClouda (Expansion Cloud) od PlaceholderAPI i użycie placeholderu ze zmienną Skripta tak jak jest to pokazane na wiki PlaceholderAPI. Niemniej jednak, prostsze jest zarejestrowanie własnego placeholderu. Pozdrawiam.
-
Jak to koniec końców z tym skriptem, obciąża serwer czy nie?
Kormic odpowiedział(a) na vaerz pytanie w Pytania i problemy
Zachęcam do lektury poniższego postu, w którym dość szczegółowo wyraziłem swoją opinię na ten temat. Odpowiadając jeszcze bezpośrednio na Pana pytania, w mojej ocenie skrypty o tak prostej strukturze nie będą dużym obciążeniem dla serwera (tak długo jak będą napisane w sposób schludny i sensowny). Kod implementujący te mechanizmy z pewnością będzie można oprzeć na listenerach zdarzeń, więc stosowanie chociażby tzw. pętli 'periodical' (czyli pętli wykonujących się okresowo) nie będzie konieczne. Pozdrawiam. -
Można jaśniej? Jak to miałoby działać? Nie rozumiem w jaki sposób bloki miałyby mieć punkty życia. Jedyna opcja to stworzenie bytu bloku (o ile dobrze rozumiem). Pozdrawiam.
-
Nie znam pluginu implementującego taki mechanizm, ale skrypt jak najbardziej jestem w stanie napisać. Proszę uprzejmie. Umożliwiłem wygodną zmianę czasu ochrony na początku skryptu. options: protectionDurationAfterDeath: 2 minutes on damage of player: attacker is a player final damage > health of victim set {_lastKilled} to {lastKilledByPlayer::%uuid of victim%} if {_lastKilled} is set: difference between {_lastKilled} and now < {@protectionDurationAfterDeath} cancel event send "&cTen gracz został niedawno zabity." to attacker stop set {lastKilledByPlayer::%uuid of victim%} to now send "&aUzyskałeś ochronę na pewien czas." to victim Pozdrawiam.
-
Problem został rozwiązany.
-
W takim razie sugeruję użyć wbudowanej funkcji pluginu, która pozwala na tworzenie wielostronicowych hologramów. Przydatne linki: https://wiki.decentholograms.eu/general/setup/#add-another-page https://wiki.decentholograms.eu/general/setup/#setup-actions Pozdrawiam.
-
Po primo, z jakiego pluginu dodającego hologramy Pan korzysta? Po secundo, czy ten plugin nie udostępnia możliwości stronicowania hologramów? Pozdrawiam.
-
Zauważyłem w Pana kodzie pewną interesującą rzecz. Mianowicie, narzędzia sprawdzane w skrypcie zwykle posiadają nazwę. Tym samym, mam podstawy ku myśleniu, że poniższe dwa warunki są przyczyną niepoprawnego działania skryptu. if player's tool is pickaxe: if player's tool is blaze rod: Proszę zauważyć, że powyższe warunki spełnią tylko zwykłe kilofy i płomienne różdżki. Zwykłe, to znaczy nieposiadające nazwy, lore, zaklęć, itp. Jeżeli przedmiot posiada choćby jedną z wymienionych rzeczy, warunek nie zostanie spełniony, ponieważ porównywanie przedmiotów jest rygorystyczne - nawet niewielkie różnice w przedmiotach takie jak uszkodzenie przedmiotu sprawiają, że dalszy kod się nie wykonuje. Jak można to więc sprawdzić? Sposoby są dwa, z czego drugi można rozbić na kolejne dwa. Rozdzielenie porównywania przedmiotów na porównywanie poszczególnych ich właściwości. Przykład poniżej. type of player's tool is any pickaxe name of player's tool is "Kilof" lore of player's tool is "Lore 1", "Lore 2" and "Lore 3" level of efficiency of player's tool is 3 # [...] Jest to najprostszy sposób spośród tych, które opiszę. Zdefiniowanie systemu identyfikatorów. NBT (wymagany dodatek obsługujący NBT, na przykład SkBee). string tag "ItemID" of nbt of player's tool is "moneyPickaxe" # [...] Więcej na temat użycia NBT w dodatku SkBee można znaleźć w wiki dodatku. Custom Model Data - możliwy do zaimplementowania o ile serwer lub dowolny plugin/skrypt ich nie wykorzystuje. custom model data of player's tool is 823 # [...] Niewykluczone, że jeszcze inne instrukcje w kodzie wprowadzają ten problem. Na przykład kod funkcji od dropu nie został załączony, ale rozumiem, że chodzi o te listenery zdarzeń 'on break' z wypadaniem groszy. Pozdrawiam.
-
Problem został rozwiązany.
-
Jak najbardziej. Odsyłam Pana do jednej z moich odpowiedzi na podobne pytanie. Jeżeli po lekturze będą wątpliwości, postaram się je rozwiać. Pozdrawiam.
-
Niech Pan zauważy, że format top listy jest ustawiony na "&f[INDEX]. &f[PLAYER]&f: &e[VALUE]" i następuje próba użycia tego tekstu jako nazwy gracza do pobrania tekstury jego głowy. Jeżeli Pan chce tworzyć głowy graczy na jej podstawie, należy stworzyć top listę z parametrem "[PLAYER]", bez indeksu i wartości. Oczywiście można wydzielić fragment z nazwą gracza za pomocą wyrażenia 'split at', jednakże nie wydaje mi się, aby to było konieczne. Niemniej jednak, zależy to od tego co Pan chce osiągnąć. Pozdrawiam.
-
Skript będzie oferował częściowe wsparcie dla flag przedmiotów (odpowiadają one za widoczność informacji przy najeżdżaniu na przedmiot w ekwipunku) dopiero dla wersji serwera 1.20.5 w wersji 2.9. Na ten moment rozwiązanie tego problemu przy pomocy samego Skripta jest niemożliwe, więc należy skorzystać z któregoś z dodatków. Osobiście polecam do tego celu dodatek skript-reflect. Wymaga on wiedzy na temat Javy, jednakże oferuje korzystanie z zdecydowanej większości instrukcji dostępnych dla pluginów. Nie będę się zagłębiał w tłumaczenie jak ma wyglądać kod, gdyż zakładam iż Pan nie jest zaznajomiony z tym językiem. Potraktuję więc post jako zlecenie. import: org.bukkit.inventory.ItemFlag on death of spider: set {_apple} to apple set {_itemMeta} to {_apple}.getItemMeta() {_itemMeta}.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_ENCHANTS) {_apple}.setItemMeta({_itemMeta}) enchant {_apple} with unbreaking 1 add {_apple} to drops Wydaje mi się, że zastosowałem dobre flagi. W razie czego proszę dać znać. Jeżeli chce Pan zrozumieć jak działają powyższe instrukcje, odsyłam do poniższych źródeł. dokumentacja dodatku skript-reflect: https://tpgamesnl.gitbook.io/skript-reflect, klasa ItemStack: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/ItemStack.html, interfejs ItemMeta: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/meta/ItemMeta.html, enum ItemFlag: https://helpch.at/docs/1.20/org/bukkit/inventory/ItemFlag.html, darmowe kompendium wiedzy objaśniające podstawy języka Java: https://javastart.pl/baza-wiedzy, tworzenie pluginów - kluczowe dla zrozumienia logiki stojącej za powyższym kodem: https://www.spigotmc.org/wiki/spigot-plugin-development/. Gdyby były jakieś pytania, proszę śmiało je zadawać. Postaram się pomóc. Pozdrawiam.
-
Błąd wynika z tego, że wyrażenie 'skull of %offline player%' wymaga obiektu gracza, który nie musi być obecny na serwerze. Pan popełnił czeski błąd - wyrażenie 'parsed as offline player' powinno być poza cudzysłowem, nie w jego środku. Z punktu widzenia Skript wygląda to tak jakby Pan dołączał do wyrażenia 'skull of...' tekst, a nie obiekt gracza. Mam jeszcze dwie uwagi odnośnie Pana kodu. Zalecam najpierw tworzyć ekwipunek i dodawać do niego przedmioty, a dopiero później otwierać go graczom. Przykład poniżej. set {_gui} to chest inventory with 3 rows named "&aTest" set slot (integers from 0 to 26) of {_gui} to red stained glass pane set slot 13 of {_gui} to green wool named "&aWełna" open {_gui} to player Może Pan również zauważyć drobną optymalizację z mojej strony. Zamieniłem pętlę z ustawianiem szyb w ekwipunku na samo wyrażenie korzystające z listy indeksów slotów. Dlaczego w listenerze zdarzenia 'on join' przemianowuje Pan stan konta (który jest typem 'number', a ściślej mówiąc to typem 'money') gracza na tekst, a następnie z powrotem na liczbę zmiennoprzecinkową ('number')? W mojej ocenie wystarczy zapisać do zmiennej samą wartość wyrażenia 'player's balance', bez jakiegokolwiek parse'owania jako tekst i inne typy. Pozdrawiam.
-
Funkcja 'createTop' pochodzi ze skryptu PyraTop REBORN autorstwa Pana Marudy. Link do skryptu poniżej. Pozdrawiam.
-
Czy Pan przeczytał to co napisałem? Jeśli tak, proszę podać wersję serwera, Skripta i dodatku skript-reflect.
-
Czy ktoś może pomóc mi z tym skryptem?
Kormic odpowiedział(a) na szymonYT pytanie w Pytania i problemy
Proszę opisać w jaki sposób ma działać skrypt i podać listę błędów podanych przez Skript. Bez tych informacji Pan najprawdopodobniej nie doczeka się pomocy, gdyż będzie to niezwykle trudne. Pozdrawiam. -
Ach tak, proszę dodać procenty wokół 'player', jak poniżej. W przypadku domyślnego argumentu należy go traktować jak wstawianie wyrażenia do tekstu. command /czas [<offlineplayer=%player%>]: Teraz wszystko powinno działać jak należy. Pozdrawiam.
-
Cieszę się, że mogłem pomóc. Odnosząc się do Pani pytania, problem leży w odnoszeniu się do argumentu komendy gdy komenda nie posiada jakichkolwiek zdefiniowanych argumentów. Wystarczy zamienić wszelkie wystąpienia frazy 'arg-1' w kodzie komendy na 'player'. Proszę jednak zauważyć, że można łatwo złączyć komendy /czas i /postęp. Należy zdefiniować argument komendy /czas jako opcjonalny i jako domyślną jego wartość ustawić gracza wykonującego komendę. Argument przyjmuje domyślną wartość tylko jeśli nie zostanie podany przez wykonującego komendę. Innymi słowy, jeśli gracz wykona komendę /czas bez podania argumentu, wyświetlony zostanie na czacie jego postęp. Dodałem również jedno dodatkowe ograniczenie - tylko gracze mogą wykonywać komendę. Zapobiegnie to przypadkowi gdzie konsola serwera wykona komendę /czas bez podania jej argumentu. Oczywiście minusem tego jest fakt, iż konsola nie będzie w stanie sprawdzać czasu dyżuru i punktów gracza. Można sprawić, aby również dla konsoli działała ta komenda, ale będzie to wymagało lekkiej modyfikacji. Poniższy przykład powinien działać bezproblemowo, ale nie jestem w stanie tego teraz sprawdzić. command /czas [<offlineplayer=player>]: executable by: players permission: {@timePermission} permission message: {@noPermissionMessage} usage: &c/czas <nazwa gracza> trigger: send "&6%arg-1% &aposiada łącznie &b%formatTimespan({onDuty::totalTime::%uuid of arg-1%})% &aczasu dyżuru." to sender send "&6%arg-1% &ama łącznie &b%{helpAnswerPoints::%uuid of arg-1%}% &apunktów." to sender Pozdrawiam.
-
Nie ma problemu. Proszę dodać do skryptu wysłanego wyżej poniższy fragment i powinno wszystko działać. Dodanie do tego samego skryptu jest ważne, no chyba że Pani usunie słowo 'local' w nagłówku (pierwszej linijce) funkcji 'endOnDutyTime'. Komenda dodatkowo posiada "zabezpieczenie" sprawdzające czy gracz podany jako argument posiada permisję do odpowiadania na pytania. Mało sensownym wydaje się czyszczenie zmiennych gracza, które prawdopodobnie i tak nie istnieją (w końcu jak miałby zdobyć punkty za odpowiadanie bez permisji). Dużyr natomiast uznałem, że może być wykonywany przez każdego kto ma uprawnienia do komendy /odp. command /wyczyscpostep <offlineplayer>: permission: {@clearProgressPermission} permission message: {@noPermissionMessage} usage: &c/wyczyscpostep <nazwa gracza> trigger: if arg-1 doesn't have permission "{@answerPermission}": send "&6Ten gracz nie posiada dostępu do odpowiadania graczom." to sender stop if {onDuty::isOn::%uuid of arg-1%} is true: endOnDutyTime(arg-1, true) set {onDuty::totalTime::%uuid of arg-1%} to "0 seconds" parsed as timespan set {helpAnswerPoints::%uuid of arg-1%} to 0 send "&aWyczyszczono postęp gracza &6%arg-1%&a." to sender Dodatkowo, zaktualizowałem listę opcji poprzez dodanie permisji 'clearProgressPermission', która jest używana w definicji powyższej komendy. options: helpPrefix: &6[&bPomoc&6] answerPermission: server.command.odp timePermission: server.command.czas onDutyPermission: server.command.dyzur clearProgressPermission: server.command.wyczyscpostep noPermissionMessage: &6Nie posiadasz wystarczających uprawnień do wykonania tej komendy. PS. Szanuję za podjęcie próby napisania samodzielnie reszty skryptu. To się ceni. Pozdrawiam.
-
Ten temat został przeniesiony.
-
Wystarczy to zrobić tak jak poniżej. Nawias nie jest istotny, dodałem go jedynie dla czytelności kodu. command /gethead: executable by: players trigger: give player (skull of player) named "%player's prefix% %player's name%" Wymagany jest plugin Vault wraz z pluginem obsługującym czat i wspierającym Vault. Pozdrawiam.
-
Nie ma problemu. Proszę. Dodałem na górze skryptu możliwość konfigurowania czasu (w tickach) przed eksplozją po pojawieniu się TNT. Do działania skryptu wymagany jest dodatek skript-reflect, ponieważ Skript nie oferuje możliwości zmiany czasu oczekiwania na eksplozję. options: maxExplosionRange: 3 knockbackAmplification: 3 ticksUntilExplosion: 10 function constantToVector(n: number) :: vector: return vector({_n}, {_n}, {_n}) command /bankatnt: executable by: players permission: deskcraft.perm.tnt permission message: &6Nie posiadasz wystarczających uprawnień do wykonania tej komendy. trigger: spawn tnt at player: set explosive yield of event-entity to 0 event-entity.setFuseTicks({@ticksUntilExplosion}) set metadata tag "harmlessNoGriefTNT" of event-entity to true on explosion: event is not cancelled metadata tag "harmlessNoGriefTNT" of event-entity is true loop all living entities in radius {@maxExplosionRange} around event-entity: set {_dirV} to vector from event-entity to loop-entity set {_maxV} to constantToVector({@knockbackAmplification}) * (normalized {_dirV}) push loop-entity ({_maxV} - {_dirV}) Tak z ciekawości. Czy sprawdził Pan to o co pytałem? O tym mówię: Pozdrawiam.
-
Ten temat został przeniesiony.
-
Przeniosłem ten temat, ponieważ utworzył go Pan w dziale "Skript > Pytania i problemy", a jest to zlecenie. Proszę bardzo. Skrypt był testowany. Na górze skryptu może Pan modyfikować zasięg odrzutu TNT (to znaczy w jakim promieniu od TNT należy stać, aby zostać odrzuconym) i siłę (wzmocnienie) odrzutu. options: maxExplosionRange: 3 knockbackAmplification: 3 function constantToVector(n: number) :: vector: return vector({_n}, {_n}, {_n}) command /bankatnt: executable by: players permission: deskcraft.perm.tnt permission message: &6Nie posiadasz wystarczających uprawnień do wykonania tej komendy. trigger: spawn tnt at player: set explosive yield of event-entity to 0 set metadata tag "harmlessNoGriefTNT" of event-entity to true on explosion: event is not cancelled metadata tag "harmlessNoGriefTNT" of event-entity is true loop all living entities in radius {@maxExplosionRange} around event-entity: set {_dirV} to vector from event-entity to loop-entity set {_maxV} to constantToVector({@knockbackAmplification}) * (normalized {_dirV}) push loop-entity ({_maxV} - {_dirV}) Opcjonalnie, może Pan sprawdzić czy w przypadku zamiany przedostatniej linijki ('set {_maxV} to...') na poniższą skrypt nadal będzie działał i da mi znać. Jeśli zadziała, może Pan usunąć całą funkcję 'constantToVector' ze skryptu, ponieważ będzie ona już niepotrzebna. Z góry dziękuję za chęci. set {_maxV} to {@knockbackAmplification} * (normalized {_dirV}) Pozdrawiam.
-
W takim razie jest to kwestia dostosowania wektora popchnięcia gracza. Czy trójząb znika? Jeśli nie, postaram się poprawić rzucanie tak, aby to miało więcej sensu, ale najpierw muszę wiedzieć czy sam trójząb nie trafia gracza (a właściwie to nie koliduje z nim).
