Skocz do zawartości

Kormic

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

    11015
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    231

Treść opublikowana przez Kormic

  1. Należy określić adresata wiadomości tuż po samej wiadomości. W tym przypadku wystarczy wykorzystać wyrażenie 'all players'. Na przyszłość zalecam korzystać z dokumentacji. Jest to obowiązkowe narzędzie każdego skryptera ("skriptera"). Co do drugiego zdania - zgadzam się. Tworzenie mało skomplikowanych mechanizmów gdzie pisanie pluginu jest nieefektywne, jest specjalnością Skripta. Jeśli chodzi o pierwsze zdanie, wysyłanie 100 razy wiadomości do każdego gracza jest poprawne, ale mało wydajne. Proszę zauważyć, że dla każdego gracza musi Pan (chyba Pan) wykonać pętlę 100 razy, a więc złożoność obliczeniowa takiej operacji czyszczenia czatu wynosi 100n, gdzie n to liczba graczy obecnych na serwerze. Przykładowo, powyższe rozwiązanie dla 50 graczy będzie tworzyło pętlę wykonującą się 5000 razy, a to już jest dość duża liczba. Jak najlepiej podejść do tego problemu? Radzę stworzyć sobie ciąg znaków (string) składający się z 99 przejść do nowej linii, a następnie zapisać sobie go w jakiejś zmiennej globalnej i wysyłać jedynie tę zmienną do wszystkich graczy. Pokażę przykład poniżej jak można to zrobić. # [...] set {_clearChatText} to "" loop 99 times: set {_clearChatText} to "%{_clearChatText}%%nl%" set {clearChat::emptyLines} to {_clearChatText} # [...] Rzecz jasna, powyższy kod wystarczy wywołać jeden raz, aby móc używać tego napisu służącego do czyszczenia czatu kiedy tylko potrzebujemy. Nie ma potrzeby, a właściwie to nie powinien Pan wywoływać go przy każdym czyszczeniu czatu, gdyż jest to całkowicie zbędne. Następnie, można się odwołać do tej zmiennej. send {clearChat::emptyLines} to all players Pozdrawiam.
  2. Proszę uprzejmie. Skrypt nie był testowany. Teraz omówię zwięźle sposób działania poniższego kodu. Jeśli gracz posiada kilof z zaklęciem jedwabnego dotyku (ang. silk touch), nic się nie dzieje. W innym przypadku obliczana jest szansa na podstawie bazowej szansy (opcja 'baseChance' na samej górze skryptu) i stosunku poziomu zaklęcia szczęścia (ang. fortune) do maksymalnego poziomu zaklęcia szczęścia możliwego do uzyskania na serwerze. Wzór na bonus do szansy dla przypadku ogólnego można opisać jak poniżej: bonusowa szansa = (100 - bazowa szansa) * poziom zaklęcia szczęścia / maksymalny poziom zaklęcia szczęścia Na górze skryptu dodałem możliwość zmiany podstawowej szansy otrzymania przedmiotów z rudy i maksymalnego poziomu zaklęcia szczęścia. Jeśli będzie potrzeba, można zwiększyć maksymalny poziom szczęścia na przykład o 1, aby nigdy nie było możliwości 100% szans na drop. options: baseChance: 60 maxFortuneLevel: 3 on mine: event-block is any ore if level of silk touch of player's tool > 0: stop set {_fortuneLevel} to level of fortune of player's tool set {_fortuneLevel} to 0 if {_fortuneLevel} is not set set {_bonusChance} to (100 - {@baseChance}) * {_fortuneLevel} / {@maxFortuneLevel} chance of (100 - {@baseChance} - {_bonusChance})%: cancel item drops send "&6Nie udało się wydropić bloku!" to player Pozdrawiam.
  3. Proszę bardzo. Skrypt nie był testowany. Gdyby skrypt nie działał jak należy, proszę zamienić 'type of victim' na 'victim'. Dodam od siebie, że możliwe jest wykorzystanie API pluginu Lib's Disguises, co pozwoli na uniknięcie wykonywania komendy przez gracza. on damage: attacker is a player victim is a living entity victim is not a player make attacker execute command "dis %type of victim%" Pozdrawiam.
  4. Kormic

    Spolszczenie komendy

    @Sergio_YT123 W normalnym przypadku (to znaczy takim, gdzie wystarczyłoby dodać alias bez nowej permisji) zaleciłbym edycję pliku 'commands.yml'. W tej sytuacji takie podejście byłoby niewystarczające. Proszę bardzo. Skrypt nie był testowany, ale strukturalnie jest na tyle prosty, że nie powinny wystąpić jakiekolwiek problemy. Proszę tylko pamiętać, że nadal wymagane są permisje z pluginu Head Database, aby gracz mógł używać komendy '/glowki'. command /glowki [<text>] [<text>]: permission: deskcraft.perm.adm.glowki permission message: &6Nie posiadasz wystarczających uprawnień do wykonania tej komendy. executable by: players trigger: if arg-1 is not set: make player execute command "hdb" stop if arg-1 is not "szukaj": send "&cPoprawne użycie:", "&6- &c/glowki" and "&6- &c/glowki szukaj <nazwa>" to player stop if arg-2 is not set: send "&cPoprawne użycie /glowki szukaj <nazwa>" to player stop make player execute command "hdb search %arg-2%" Pozdrawiam.
  5. Kormic

    Spolszczenie komendy

    Ten temat został przeniesiony.
  6. @Stilus__ Skript pozwala na skonfigurowanie komendy wedle swoich potrzeb. To samo tyczy się permisji. https://docs.skriptlang.org/structures.html?search=#StructCommand Ponieważ temat jest umieszczony w dziale "Skript > Zlecenia", przesyłam poniżej kod skrypt z permisją dodaną do komendy. Co więcej, poprawiłem kilka rzeczy w kodzie, aby skrypt działał lepiej. Permisję można edytować w polu 'permission'. Wiadomość wyświetlana przy braku jej posiadania jest ustawiana w polu 'permission message'. command /swieta [<text>]: executable by: players permission: server.command.swieta permission message: &6Nie posiadasz wystarczających uprawnień do wykonania tej komendy. trigger: set {_lastUsage} to {ostatniczasuzycia::%player%} if {_lastUsage} is set: difference between {_lastUsage} and now is smaller than 24 hours send "&cTej komendy mozesz uzywac co 24h!" to player stop send "&aDostales item!" to player give 1 dragon egg named "&5&lPuszka Pandory" to player set {ostatniczasuzycia::%player%} to now Pozdrawiam.
  7. Problem został rozwiązany.
  8. Proszę bardzo. Jedyną wadą poniższego skryptu jest to, że obrażenia od krzaków jagód, stalaktytów, stalagmitów, itp. będą również blokowane. on damage of player: damage cause is contact cancel event Pozdrawiam.
  9. Oczywiście, nie ma problemu. Proszę bardzo. command /resetrozdaj [<text>]: permission: server.command.resetrozdaj permission message: &cNie posiadasz wystarczających uprawnień do wykonania tej komendy. executable by: players trigger: set {_player} to arg parsed as offline player if {_player} hasn't played before: send "&6Ten gracz nigdy wcześniej nie był na tym serwerze." to sender stop clear {rozdajCommand::cooldown::%uuid of {_player}%} send "&aPomyślnie zresetowano cooldown komendy &6/rozdaj &adla gracza &b%arg%&a." to sender Pozdrawiam.
  10. Kormic

    glowki gracza

    Problem został rozwiązany.
  11. Proszę bardzo. Skrypt nie był testowany. Dodam od siebie, że najprawdopodobniej jest możliwość, aby przy pomocy dodatku skript-reflect zastąpić wywoływanie komend przez konsolę instrukcjami z API pluginu zarządzającego skrzynkami. options: cooldownTime: 24 hours function formatTimespan(t: timespan) :: text: set {_tText} to "%{_t}%" replace all "and " with "" in {_tText} replace all ", " with " " in {_tText} replace all "days" with "d" in {_tText} replace all "hours" with "h" in {_tText} replace all "minutes" with "m" in {_tText} replace all "seconds" with "s" in {_tText} set {_split::*} to {_tText} split at " " loop (size of {_split::*}) times: if mod(loop-number, 2) is 1: add "%ceil({_split::%loop-number%} parsed as number)%" to {_timeNumbers::*} continue add {_split::%loop-number%} to {_timeUnits::*} set {_returnTimespan} to "" loop {_timeNumbers::*}: if (loop-index parsed as number) is 1: set {_returnTimespan} to "%loop-value%%{_timeUnits::%loop-index%}%" continue set {_returnTimespan} to "%{_returnTimespan}%, %loop-value%%{_timeUnits::%loop-index%}%" return {_returnTimespan} command /rozdaj: permission: deskcraft.perm.rozdaj permission message: &cNie posiadasz wystarczających uprawnień do wykonania tej komendy. executable by: players trigger: set {_lastUsageDate} to {rozdajCommand::cooldown::%uuid of player%} set {_cooldown} to {@cooldownTime} if {_lastUsageDate} is set: set {_timeElapsed} to difference between {_lastUsageDate} and now {_timeElapsed} is smaller than {_cooldown} set {_timeRemaining} to difference between {_timeElapsed} and {_cooldown} send "&6Odczekaj &e%formatTimespan({_timeRemaining})% &6przed ponownym wykonaniem tej komendy." to player stop set {rozdajCommand::cooldown::%uuid of player%} to now set {_rNum} to random integer between 1 and 3 if {_rNum} is 1: execute console command "case key giveall Rzadki_Klucz 3 " execute console command "case key giveall Legendarny_Klucz 1" else if {_rNum} is 2: execute console command "case key giveall Epicki_Klucz 2" execute console command "case key giveall Boski_Klucz 1" else if {_rNum} is 3: execute console command "case key giveall Rzadki_Klucz 3" execute console command "case key giveall Epicki_Klucz 1" Pozdrawiam.
  12. Tak, jak najbardziej można pobrać tę informację. Proszę wykorzystać zdarzenie 'on points change' i nasłuchiwać do niego. Może Pan w nim pobrać informację o zmianie punktów za pomocą wyrażenia 'change' (czy też 'points change' dla tego przypadku). Dla pewności można również sprawdzić czy powodem tej zmiany jest "COMBAT". "%cause%" is "COMBAT" Co prawda dokumentacja FunnySkAddon nie wspomina o takim możliwym powodzie, ale po przejrzeniu kodu źródłowego dodatku, stwierdzam, że powinno to zadziałać. Pozdrawiam.
  13. Problem został rozwiązany.
  14. Proszę bardzo. Skrypt był testowany. options: crownHelmet: netherite helmet named "&6Korona" on death of player: set {_playerItems::*} to slot (integers from 0 to 40) of victim's inventory {_playerItems::*} contains {@crownHelmet} set {giveCrownOnRespawn::%uuid of victim%} to true on respawn: {giveCrownOnRespawn::%uuid of player%} is set give player {@crownHelmet} clear {giveCrownOnRespawn::%uuid of player%} Pozdrawiam.
  15. Mowa jest o argumencie, a więc zakładam, że pytanie dotyczy sprawdzania poprawności argumentu komendy. Pokażę przy pomocy poniższego przykładu jak można to zrobić gdy posiadamy zmienną globalną (tutaj dla przykładu: {rozsypankaEvent::answer}) przechowującą poprawną odpowiedź. command /rozsypanka [<text>]: executable by: players trigger: # [...] if arg is not {rozsypankaEvent::answer}: send "&cTwoja odpowiedź jest niepoprawna." to player stop send "&aGratulujemy poprawnej odpowiedzi!" to player # [...] W miejscach trzech kropek znajduje się pozostały kod komendy - nad (przed) powyższym warunkiem mogą występować dodatkowe warunki sprawdzające chociażby czy argument został podany i czy wydarzenie (event) jest aktywne. Pod (po) powyższym warunku może znajdować się pozostały kod komendy wręczający graczom nagrodę za poprawną odpowiedź i dodatkowo kod kończący event. Gdyby pojawiły się jakieś pytania, proszę pytać śmiało. Pozdrawiam.
  16. Kormic

    glowki gracza

    Nie, wystarczy jedynie przeładować skrypt i wszystko powinno działać jak należy. Co do samego problemu, najprawdopodobniej w Pana skrypcie doszło do kolizji składni wyrażeń 'head [location] of %living entity%' i 'head of %offline player%'. Proszę zauważyć, że wyrażenie 'head of {_player}' (gdzie {_player} przechowuje informację o graczu, a więc również o żywym bycie) spełnia oba warianty składni, a więc kolizja jest nieunikniona. Najwidoczniej składnia tego pierwszego jest można powiedzieć, że "silniejsza" - możliwe, że jest rejestrowana po składni tego drugiego wyrażenia, a więc niejako ją nadpisuje. Niemniej jednak, to tylko dygresja, mało znacząca. Jeżeli po zapisaniu wartości zmiennej {_head} wyświetli sobie ją Pan na czacie, najprawdopodobniej ukaże się Panu '<none>', ponieważ Pan pobiera lokalizację głowy gracza (mnie) nieistniejącego na serwerze. Gdyby Pan natomiast wpisał siebie, wyświetliłaby się lokalizacja Pana głowy wraz z jej rotacją. Jak sobie z tym poradzić? Rozwiązanie jest banalnie proste - proszę zastąpić słowo 'head' słowem 'skull', ponieważ jest ono dozwolone przez składnię drugiego (tego) wyrażenia. Pozdrawiam.
  17. Kormic

    glowki gracza

    Faktycznie, nie zwróciłem na to uwagi. Charakter postu utwierdził mnie w przekonaniu, że jesteśmy w dziale "Pytania i problemy", ale to nie jest istotne. Podam przykład jak można stworzyć główkę dowolnego gracza. set {_player} to "Kormic" parsed as offline player set {_head} to head of {_player} Pokażę również jak można stworzyć prostą komendę wręczającą wykonującemu komendę głowę dowolnego gracza. command /gethead [<text="Kormic">]: executable by: players trigger: set {_playerArg} to arg parsed as offline player set {_head} to head of {_playerArg} give player {_head} Przykład użycia: '/gethead Sashie'. Pozdrawiam.
  18. Kormic

    glowki gracza

    Aby stworzyć głowę danego gracza, wystarczy sam Skript, gdyż oferuje on wyrażenie 'head of %offline player%'. Jeżeli potrzebuje Pan dowolnego gracza (może być na serwerze, ale nie musi, de facto nawet nigdy nie musiał do niego dołączać), warto skorzystać z wyrażenia '%text% parsed as offline player' (podałem przykład bardziej szczególny dla Pana problemu), który zwróci obiekt gracza, a ten obiekt można wykorzystać w wyrażeniu podanym wyżej ('head of...'). Korzystanie z dodatku SkBee w tej sytuacji jest niepotrzebne. Oczywiście można tak do tego podejść, ale dobrą praktyką jest ograniczenie liczby wykorzystywanych dodatków. Jedyny sens wykorzystywania go (SkBee) jest w przypadku posiadania jedynie tekstury głowy gracza. Pozdrawiam.
  19. To nie pomoże, ponieważ Skript nie posiada instrukcji pozwalających na operowanie na placeholderach. Należy w tej sytuacji użyć dodatku skript-placeholders, co zresztą zostało powiedziane wyżej. Po błędzie mogę stwierdzić, że Pan powyższy kod wstawił w funkcję i użył wyrażenia 'player's balance'. Proszę pamiętać, że funkcja sama w sobie nie posiada wyrażenia 'player' - musi Pan je przesłać do niej w formie parametru i dalej wykorzystywać jako zmienną lokalną, na przykład '{_p}'s balance', gdzie zmienna {_p} przechowuje informację o graczu przesłaną wcześniej do funkcji. Po więcej informacji odsyłam do starego, ale nadal aktualnego poradnika dotyczącego funkcji autorstwa piratjsk. Jeżeli nadal będą występowały problemy, mogą one być spowodowane niepoprawnym podłączeniem się Skripta do Vaulta. Pozdrawiam.
  20. Problem został rozwiązany.
  21. Ten temat został przeniesiony.
  22. Ten temat został przeniesiony do archiwum.
  23. Ten temat został zamknięty.
  24. Problem został rozwiązany.
  25. Skript oferuje nasłuchiwanie do zdarzenia 'player trade'. Tak jak dokumentacja mówi, wymagany jest silnik Paper, wersja nie niższa niż 1.16.5. Nie wiem jednak ile informacji udostępnia te zdarzenie w Skript, możliwe, że pozwala ono na pobranie jedynie 'event-player' i 'event-entity'. W tej sytuacji może Pan chcieć nasłuchiwać do zdarzenia PlayerTradeEvent przy pomocy dodatku skript-reflect, które posiada wiele metod, co jest szczególnie widoczne w klasie PlayerPurchaseEvent (klasa PlayerTradeEvent dziedziczy po klasie PlayerPurchaseEvent). Pozdrawiam.
×
×
  • Dodaj nową pozycję...