-
Ilość zawartości
11015 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
231
Treść opublikowana przez Kormic
-
Niech mi Pan uwierzy, że chciałbym. Problem w tym, że trzeba wykonać kilka kroków i jest to nieuniknione. Najpierw należy zamienić okres czasu na tekst, pousuwać przecinki, spójniki "and" i podstawić pod jednostki czasu ich skrótowe wersje. Następnie trzeba podzielić ten tekst na fragmenty dzieląc go na każdej spacji i zapisać do listy zmiennych. Parzyste elementy (czyli reszta z dzielenia równa 0) to jednostki czasu, a nieparzyste elementy (reszta z dzielenia równa 1) to ich wartości. Dzielimy je według tego kryterium na dwie listy i dodatkowo zaokrąglamy wartości do najbliższych liczb całkowitych. W ramach ostatniego kroku musimy połączyć te dwie listy ponownie w jeden napis. Gdyby wykonać go dla przypadku szczególnego (na przykład zakładamy, że będą tylko godziny i minuty), być może skrypt byłby nieco krótszy. Niemniej jednak uważam, iż zawsze warto szukać rozwiązania dla przypadku ogólnego, bo mamy pewność, że ono zawsze zadziała.
-
Niestety trudno tutaj o przykładowy kod. Mogę jedynie pokazać jak ja bym napisał taką funkcję. Wiem, że z dawania gotowego kodu pożytku praktycznie brak, ale mam nadzieję, że Pan sobie przeanalizuje ten skrypt i zrozumie jego działanie. Może Pan sobie używać w środku funkcji instrukcję 'broadcast', aby wyświetlić wartość danej zmiennej i widzieć "na bieżąco" co się dzieje. Proszę uprzejmie. W razie wątpliwości proszę pytać, chętnie odpowiem. Dodatkowo odsyłam do dokumentacji, którą się już kilkukrotnie posiłkowałem w moim poprzednim poście. function formatTimespan(t: timespan) :: text: set {_tText} to "%{_t}%" replace all "and " with "" in {_tText} replace all ", " with " " 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 "%round({_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 /testformat: trigger: set {_time} to "6 hours and 11.17 minutes" parsed as timespan send formatTimespan({_time}) to sender
-
Z tego co widzę, nie musi Pan w tym kodzie używać zmiennych globalnych, gdyż są one niepotrzebnie zapisywane w pliku variables.csv (przy założeniu, że nie ustawił sobie Pan jakiejkolwiek bazy danych). Zamiast tego może Pan używać zmiennych lokalnych, które są automatycznie czyszczone po wykonaniu całego kodu, w którym są obecne. Zmienne lokalne tworzymy poprzez dodanie podłogi (ang. underscore) '_' na początku nazwy zmiennej. Przykład: `set {_test} to "Test"`. Oczywiście, jeśli Pan gdzieś indziej wykorzystuje te zmienne, nie ma problemu. Nie może Pan tak robić, ponieważ efekt 'replace' może być używany tylko na zmiennej zawierającej tekst. Musi Pan więc zamienić wartość zmiennej {test1} na wartość typu tekst, co można najprościej uzyskać za pomocą poniższej linijki. set {_textTest} to "%{test1}%" replace ... Jeśli natomiast chce Pan zaokrąglić ilość minut dla danego okresu czasu, musi Pan użyć wyrażenia 'split' w celu podzielenia tekstu na spacji " ", a następnie zapisać jego wynik do jakiejś listy zmiennych lokalnych. Dalej, należałoby na podstawie wielkości listy (wyrażenie 'amount') określić ile mamy jednostek czasu (tylko sekundy, sekundy i minuty, godziny, a może i nawet dni), a następnie na podstawie tego wziąć odpowiedni element z tej listy, parse'ować go jako liczbę, zaokrąglić i zapisać ponownie do tekstu. Jak widać, roboty jest trochę. Istnieje również druga opcja - myślę, że prostsza. Jak wcześniej, dzielimy tekst z czasem na spacji i zapisujemy do listy zmiennych lokalnych. Następnie zapętlamy tę listę i próbujemy każdy element parse'ować jako liczbę i zapisać do jakiejś zmiennej. Jeśli ta zmienna będzie pusta, oznacza to, że zapętlany element nie był liczbą, a jakimś napisem (na przykład "hours", a nie "2"). Tutaj z pewnością przyda się ten warunek. Jeśli zmienna posiada jakąś wartość (a więc warunek 'is set' zwrócił 'true'), można ją dodać jako kolejnej listy i próbować to formatować. W skrócie - w Skript nie istnieje łatwa i przyjemna w użyciu instrukcja pozwalająca na formatowanie typu 'timespan'. A szkoda.
-
Nie ma problemu. Cieszę się, że Pan zrozumiał. Co do matematyki, oczywiście nie pamięta wół jak cielęciem był, ale w mojej ocenie nie jest jej tutaj zbyt wiele poza wykorzystaniem trygonometrii do tworzenia okręgu. Funkcje sinus i cosinus najlepiej jest graficznie zrozumieć jako współrzędne x i y przy poruszaniu się po okręgu o promieniu 1. Współrzędna x-owa (potocznie: lewo, prawo) to cosinus, natomiast współrzędna y-owa (potocznie: góra, dół) to sinus. Jeśli kąt jest równy 0, zaczynamy po prawej stronie. Uzasadnieniem tego jest fakt, iż cos(0) = 1, a sin(0) = 0. Tak więc, tłumacząc to na współrzędne, otrzymujemy punkt (X,Y) = (1,0). Zwiększając kąt będący argumentem obu funkcji, poruszamy się po wcześniej wspomnianym okręgu przeciwnie do ruchu wskazówek zegara. W celu dalszego zrozumienia polecam Panu wyszukanie sobie wykresów funkcji sinus i cosinus. Przydatne również mogą okazać się materiały do nauki obrazujące wyżej wspomniane poruszanie się po okręgu. Oczywiście zastosowałem w swoim wywodzie kilka skrótów myślowych i pominąłem nieskończenie wiele innych przypadków, jednakże najprościej zacząć od jakiegoś przypadku i próbować zrozumieć całą stojącą za tym teorię drogą indukcji (od szczegółu do ogółu). Na koniec dodam, że nietrudno wywnioskować pewną rzecz. Jeśli chcemy poruszać się po okręgu o promieniu r (gdzie r to dowolna liczba rzeczywista), wystarczy przemnożyć obie współrzędne przez ten promień.
-
@maloy78 Zakładam, że składnia tworząca GUI pochodzi z dodatku SkQuery. Na tym forum wielokrotnie było mówione, że przez te opóźnienie (jak dobrze pamiętam, bez niego kod nie zadziała) istnieje ryzyko szybkiego otwarcia jakiejś skrzynki i duplikowania przedmiotów. Sugeruję Panu skorzystać z domyślnej składni w Skript'cie. Jest to w mojej ocenie bezpieczniejsze rozwiązanie. command /creategui: trigger: set {_gui} to chest inventory with 3 rows named "&6Test" set slot 1 of {_gui} to iron ingot set slot 2 of {_gui} to iron ingot open {_gui} to player on inventory click: if name of clicked inventory is "&6Test": index of clicked slot is 1 or 2 cancel event close player's inventory
-
Ktoś napisał by mi skrypt na /home?
Kormic odpowiedział(a) na creepereks pytanie w Pytania i problemy
Tak się składa, że już kiedyś pisałem taki skrypt. Proszę uprzejmie. -
Czy sprawdził Pan rzeczy, o których mówiłem? Pomijam literówkę przy 'or', bo to jest nieistotne. Proszę pokazać zawartość listy {dragon::*} i nazwy tych GUI, o których Pan mówi.
-
Ta część jest prosta w napisaniu. Wystarczy zmienić display name, tablist name i natemag gracza oraz ustawić skin. W internecie można znaleźć kilka skryptów i pluginów czyniących to. Jeśli gracze w zależności od permisji mają widzieć różne nazwy, wymaga to obsługi pakietów. Jest to możliwe do napisania, trzeba wysyłać je przy każdorazowej zmianie trybu incognito gracza i przy dołączaniu na serwer. Moja odpowiedź jest lakoniczna i pomija wszelkie technikalia, natomiast mogę od razu powiedzieć, że do tego zadania lepszy byłby plugin. Zdaje się, że plugin HaoNick wprowadza to czego Pan chce i z pewnością nie jest to jedyny publiczny plugin wprowadzający takie funkcjonalności.
-
Nie zaszyfrowanych, a hashowanych. Jest to ogromna różnica. Coś zaszyfrowanego zawsze można odszyfrować jeśli zna się sam mechanizm danego szyfru, więc jest to operacja wykonywalna w obie strony. Hashowanie natomiast jest operacją nieodwracalną, działa tylko w jedną stronę. Mając jakieś dane możemy łatwo wyznaczyć ich hash, w drugą stronę jest to z praktycznego punktu widzenia niemożliwe biorąc pod uwagę moc obliczeniową dzisiejszych komputerów. Oczywiście istnieje jeszcze prawdopodobieństwo kolizji hashów (dwie różne wartości wejściowe mające taki sam hash), ale jest ono na tyle niskie w przypadku SHA-256, że po znalezieniu jej Pan stałby się sławny. Jest jeszcze opcja hashowania funkcją MD5, ale odradzam korzystania z niej. Jest to zdecydowanie mniej bezpieczny algorytm, podatny na wyżej wspomniane kolizje hashów. Ponieważ funkcja hash jest funkcją działającą tylko w jedną stronę, należy poddać wiadomość napisaną przez gracza hashowaniu i porównać wynikowy hash wiadomości z wartością zmiennej przechowującej hash hasła gracza. Ja rozumiem Pana działanie i po przemyśleniu sprawy zgadzam się z Panem. Po prostu pokazałem drugą stronę medalu takiego rozwiązania i fakt, że takie podejście w przypadku graczy ze zmiennym IP tworzy w konsekwencji wiele niepotrzebnych zmiennych w bazie. Na Pana miejscu stworzyłbym jakąś zmienną gracza zapisująca adres IP, na którym się ostatnio logował na serwer (na przykład 'set {autoLogin::%player's uuid%} to player's ip'). Jeśli przy dołączeniu adres jest inny niż ostatnio, autologin nie następuje. Wtedy zmienna od autologinu będzie posiadała w nazwie tylko UUID gracza, a zapisywanie w nazwie dodatkowo adresu IP będzie już niepotrzebne.
- 43 odpowiedzi
-
Trudno jest mi jednoznacznie określić przyczynę braku działania Pana skryptu, ponieważ nie wiem jak wygląda zawartość listy {dragons::*} i nie wiem jak wygląda GUI tworzone przez Pana skrypt. W tej sytuacji mogę wskazać dwa najbardziej prawdopodobne scenariusze. Przy kliknięciu na wspomniane smoki numer 3 i 7 warunek porównujący zawartość listy {dragons::*} z nazwą klikniętego inwentarza nie jest spełniony. Tutaj sugeruję dodanie jakiejś instrukcji 'send' po przejściu przez warunek (wyświetlający jakąkolwiek wiadomość, ma to być jedynie informacja) i dodatkowo 'send' przed tym warunkiem wyświetlający nazwę inwentarza 'name of event-inventory'. Dla porównania może Pan również sprawdzić 'name of clicked inventory'. Może mieć Pan w tym lub w jakimkolwiek innym skrypcie (a nawet w pluginie) listener zdarzenia 'on inventory click' (Bukkit API: InventoryClickEvent), który odwołuje anulowanie zdarzenia. Plugin/skrypt może mieć wyższy priorytet dla tego listenera i w tych specyficznych warunkach jest powodem tego dziwnego problemu. Nie traktowałbym tej sugestii na ten moment poważnie, gdyż jest to mało prawdopodobne. Pan powinien na razie się skupić na samym tym skrypcie, później na innych skryptach i finalnie na pluginach. Na pierwszy rzut oka skrypt wygląda całkowicie w porządku, niemniej jednak nie widzę całej prawdy, więc w tej chwili wróżę z fusów. Oczywiście najlepsza i jedyna metoda debuggingu to wysyłanie wiadomości na czacie. Niech Pan sprawdzi wszystkie kluczowe zmienne i wyrażenia, które Pan wykorzystuje w tym skrypcie. Jest szansa, że Pan zauważy jakąś nieprawidłowość. Kończąc mój wywód, do ewentualnego tworzenia testowego kodu listenera 'on inventory click:' może Pan wspomóc się tym warunkiem.
-
@milonn Co prawda skrypt ma wiele błędów i usterek, ale odniosę się do tych najbardziej krytycznych/rażących. To nie jest prawda i to jest Pana największy grzech. Pan zapisuje hasła użytkowników do zmiennych w postaci niezmodyfikowanego tekstu. Jeśli ktoś nieupoważniony uzyska dostęp do plików serwera, może równie dobrze pobrać kopię bazy danych czy też pliku variables.csv i wtedy konta wszystkich użytkowników będą zagrożone. Zdaje się, że Pan pytał około tydzień temu jak sprawić, aby taki skrypt miał zabezpieczone hasła. Powiedziałem Panu, że dobrym rozwiązaniem będzie hashowanie haseł. Nie rozumiem dlaczego Pan tego nie wdrożył. Rozumiem, że to jest swego rodzaju ukłon w stronę graczy, ale w mojej ocenie wystarczyłby jedna zmienna automatycznego logowania na jedno konto. Trzeba mieć na uwadze to, że niektórzy gracze mogą korzystać z internetu mobilnego lub po prostu mieć router, który zmienia adres IP każdorazowo przy resecie. Nie zapominajmy również o proxy i VPN. Jeżeli coś jest niedopracowane, nie powinien Pan tego dodawać do skryptu. Zamiast tego lepszym podejściem byłoby dopracowanie tej komendy i dodanie jej do kodu przy aktualizacji skryptu. Brakuje jeszcze informacji o tym jakie dodatki są wymagane do działania skryptu. Zdarzenie 'on any movement' to element składni dodatku SkQuery. Nie ma jednak potrzeby korzystania z niego, gdyż Skript posiada swoje własne zdarzenie odpowiadające mu. Mówię o tym zdarzeniu. No dobrze, a teraz odnieśmy się do samego kodu. W kodzie można uświadczyć wiele zagnieżdżonych warunków, które zmniejszają czytelność kodu. Pokażę Panu jak można je poprawić. # Zły sposób: if [warunek]: if [warunek]: if [warunek]: # Dalszy kod... else: # Alternatywny kod else: # Alternatywny kod else: # Alternatywny kod # Dobry sposób (odwracanie warunków): if not [warunek]: # Alternatywny kod stop if not [warunek]: # Alternatywny kod stop if not [warunek]: # Alternatywny kod stop # Dalszy kod... Myślę, że powyższy przykład jest dla Pana wystarczająco przekonujący. Z niezrozumiałych mi powodów Pan używa w kodzie bardzo dużo opóźnień, czasem w miejscach, w których nie mają żadnego sensu. Proszę mieć na względzie to, że dobry kod powinien posiadać możliwie mało opóźnień. Wynika to z tego, że wszelkie opóźnienia są czyszczone przy wyłączeniu serwera, a więc kod po nich następujący nigdy nie zostanie wykonany. Można podążać za następującą regułą - jeśli nie ma potrzeby odliczania lub celowego opóźnienia kodu w celu polepszenia wrażeń z użytkowania skryptu (proszę interpretować wedle uznania), niech Pan nie używa opóźnień. Nie rozumiem na przykład dlaczego Pan wstawił opóźnienia przed zapisem zmiennych. Nie pojmuję również tego dlaczego Pan wstawił w pętlach 'while' opóźnienia trwające 14 dni, choć możliwe, że wynika to tylko i wyłącznie z tego title mającego trwać lata. Niemniej jednak, skłaniam Pana do refleksji w tej kwestii. Nie ma potrzeby rozdzielania listenera zdarzenia 'on join' na dwa osobne listenery. Czyni to kod mniej czytelnym. Jeśli Pan usunie z drugiego listenera te 2-sekundowe opóźnienie, będzie mógł Pan spokojnie połączyć oba te listenery. Przy rejestracji Pan w dziwny sposób sprawdza czy ilość znaków w haśle mieści się w dozwolonym zakresie. Zamiast dodawać i odejmować 1, proszę zastosować operatory porównania '>=' i '<='. Proszę nie brać moich uwag jako złośliwości z mojej strony, a przyjąć je z pokorą i postarać się poprawić ten skrypt. Pozdrawiam.
- 43 odpowiedzi
-
W takim wypadku proszę sprawdzić poniższą komendą co zwraca wyrażenie 'placeholder %text% from %player%'. command /smpplaceholdertest: executable by: players trigger: set {_value} to placeholder "dropsmp_speed" from player send "Kasa: %{_value}%" to player Jest Pan pewien, że to jest placeholder, o który Panu chodzi? Moja intuicja podpowiada mi, że placeholder "dropsmp_speed" zwraca wartość szybkości gracza ustawioną komendą, którą Pan podał, a nie jego stan konta (zakładając, że temu ma odpowiadać zmienna {kasa::*}).
-
W takim razie wystarczy, że sprawdzi Pan czy gracz trzyma książkę w ręce. if player's tool is book: # Dalszy kod Jeżeli Pan chce do tego wiadomość w przypadku braku książki w ręce, można to napisać w poniższy sposób. if player's tool is not book: send "&cBrak książki." to player stop # Dalszy kod Pozdrawiam.
-
Nie wiem skąd Pan wziął wyrażenie 'placeholder %text% from %players%', więc zakładam, że pochodzi ono z jakiegoś dodatku (najpewniej Skellett). on join: set {kasa::%player's uuid%} to placeholder "dropsmp_speed" from player if {kasa::%player's uuid%} >= 210: execute console command "dropsmp player %player's name% set szybkosc 200" Proszę uprzejmie. Wydaje mi się, że dobrze zrozumiałem Pana zlecenie. Jedynie zastanawiałem się nad Pana sformułowaniem "będzie powyżej 210", bo Pan napisał warunek sprawdzający czy zmienna jest większa, bądź równa 210. Mimo to, zostawiłem tak jak Pan napisał. Na koniec powiem o błędach w Pana kodzie. Nie ma potrzeby rozdzielania tak prostego kodu na dwa listenery zdarzenia 'on join'. Takie działanie czyni kod mniej czytelnym. W pierwszym listenerze zdarzenia 'on join' zabrakło apostrofu w wyrażeniu 'player's UUID'. Niezrozumiałym dla mnie jest dlaczego Pan próbował zapisać wartości tego placeholderu wszystkich graczy do zmiennej jednego konkretnego gracza. EDIT: @Żelazio Dodam, że jeśli Pan nie wykorzystuje w jakimkolwiek innym kodzie wartości zmiennej {kasa::%player's uuid%}, zbędnym jest jej tworzenie. Lepiej w takiej sytuacji wykorzystać zmienne lokalne. Podam przykład. # Jeżeli potrzebujemy tej zmiennej w jakimś innym kodzie, tak jest w porządku. set {kasa::%player's uuid%} to placeholder "dropsmp_speed" from player # Jeżeli nie wykorzystujemy w jakimkolwiek innym kodzie tej zmiennej, lepiej zrobić tak jak jest pokazane poniżej. set {_kasa} to placeholder "dropsmp_speed" from player Nie ma potrzeby zapełniania sobie pliku variables.csv (czy też przeznaczonej do zapisu zmiennych bazy danych) niepotrzebnymi nam zmiennymi globalnymi. Zmienne lokalne są tworzone tylko na potrzebę danego kodu - gdy on się zakończy, wszystkie zmienne lokalne są czyszczone.
-
Gdy pisałem artykuł, zamieściłem w nim definicje każdej funkcji wraz z opisem każdego z parametrów. Dodałem również przykłady użycia skryptu. Jeśli Pan ich nie przeczytał, proszę się z nimi zapoznać. Jeżeli jednak Pan mnie prosi o pomoc po przeczytaniu artykułu, śpieszę z tłumaczeniem. Więc tak. Każda z tych funkcja zwraca listę bloków, którą warto sobie zapisać do lokalnej listy zmiennych. Podkreślam, jest to lista bloków, nie lokalizacji. Mając zapisaną listę z owymi blokami, używamy efektu 'set %blocks% to %item type%'. Z początku może się wydawać to skomplikowane, ale zapewniam o jednym - skrypt został napisany w taki sposób, aby jego użytkowanie było możliwie proste. Jeśli Pan ma jeszcze jakieś pytania/wątpliwości, proszę dać znać. Ewentualny kod jest mile widziany. Pozdrawiam.
-
Faktycznie. Zapomniałem, że te wyrażenia zostały przeznaczone do usunięcia w wersji 2.8.0. Miło widzieć, że twórcy faktycznie chcą uczynić wektory w Skript wektorami w sensie matematycznym, a nie ich marnymi imitacjami. Być może jednak w najnowszej wersji jest już możliwy iloczyn skalara z wektorem (nie mylić z iloczynem skalarnym). Nie rozumiem jednak dlaczego Skript sugeruje dodanie tych wektorów. Zakładam, że twórcy tylko jedną taką wskazówkę dla dodawania. Nam rzecz jasna zależy na operacji iloczynu skalara i wektora. Niech Pan w takim razie spróbuje napisać tę instrukcję na dwa poniższe sposoby i po zapisaniu zmiennej {_cel} wyświetli ją na czacie. # 1. sposób (o ile można dokonać przemnożenia współrzędnych wektora przez skalar): set {_cel} to 0.8 * {_v} # Powyższa linijka powinna zwrócić wektor, którego moduł jest równy 80% modułu wektora {_v} # Moduł wektora: https://docs.skriptlang.org/expressions.html#ExprVectorLength # 2. sposób (o ile wystarczy pojedynczy znak mnożenia): set {_cel} to {_scalarVector} * {_v} Mam duże wątpliwości co do drugiego, gdyż matematycznie jest to operacja niedopuszczalna - mowa o mnożeniu macierzowym, gdzie ilość kolumn w pierwszej macierzy jest różna od ilości wierszy w drugiej macierzy (przy założeniu, że to są wektory wierszowe). Niemniej jednak warto to przetestować.
-
Aktualizacja v. 2.0 Nowości: - gruntowna przebudowa artykułu opisującego skrypt, - gruntowna przebudowa i optymalizacja kodu (m.in. zastosowanie funkcji trygonometrycznych do części rozwiązań). Z tego miejsca chciałbym serdecznie podziękować mojemu przyjacielowi (@PanMaruda) za wszystkie udzielone mi wcześniej porady. Nie sądziłem, że powrócę do tej abominacji po tylu latach, a jednak. Zapraszam Państwa do zapoznania się z wprowadzonymi zmianami i przetestowania skryptu pod kątem wszelkich błędów oraz sugestii jego udoskonalenia. Pozdrawiam.
-
Jeśli kod został zawarty w listenerze zdarzenia 'on damage:' i sprawdzono czy obaj uczestnicy zdarzenia (victim i attacker) to gracze, to prawie bezbłędnie Pan to napisał, bardzo ładnie. Jedyny błąd to pojedynczy znak mnożenia. Jeśli chcemy przemnożyć dwa wektory przez siebie (a więc wszystkie współrzędne pierwszego przez odpowiadające współrzędne drugiego), należy użyć podwójnego znaku mnożenia '**'. W razie niepewności ponownie odsyłam do dokumentacji.
-
SkWand Witam Państwa, jest to już moje trzecie publicznie udostępnione na tym forum dzieło. Jak można się domyślić po nazwie, jest to prosty skrypt dodający różdżkę, którą można strzelać. Cechy: - zestaw funkcji implementujących mechanizm strzelania z różdżki, - odrzucające pociski (a więc możliwość tzw. "rocket jumpingu"), - efekty dźwiękowo-wizualne przy zderzeniu pocisku ze ścianą, - możliwość konfiguracji właściwości różdżki i jej pocisków. Dodatkowo: - komenda /magicwand dająca graczowi z odpowiednią permisją różdżkę, - listener zdarzenia 'on right click:' obsługujący strzelanie z różdżki wraz z cooldownem. Wymagania: - Skript (min. 2.2-dev28) Użycie: Korzystanie ze skryptu jest banalnie proste. Po jego instalacji na serwerze wystarczy dać sobie różdżkę przy pomocy komendy /magicwand. Mając ją w ręce, możemy z niej strzelać poprzez wciskanie prawego przycisku myszy. Konfiguracja skryptu: Należy jeszcze wspomnieć o tym jak należy konfigurować ten skrypt w sekcji 'options' na górze kodu. Uznałem, że najlepiej będzie to zawrzeć w kilku moich zaleceniach, punkt po punkcie. 1. Prędkość pocisku powinna być dostosowana do wielkości pocisku (jego hitboxu). Jeśli prędkość będzie zbyt duża, a hitbox zbyt mały, skrypt nie będzie w stanie wykrywać bytów i ścian. 2. Nie należy ustawiać zbyt dużej maksymalnej odległości jaką może pokonać pocisk. Pozwala to uniknąć scenariusza, w którym wiele pocisków jest wystrzeliwanych jednocześnie. 3. Cooldown różdżki natomiast nie powinien być zbyt mały. Ponownie, wszystko sprowadza się do utrzymania stabilności serwera. 4. Zasięg odrzutu różdżki należy ustawić odpowiednio mały. Im jest on większy, tym silniejszy jest odrzut, dlatego należy ustawiać tę wielkość roztropnie. Informacje dodatkowe: W związku ze zmianami w arytmetyce wektorowej, które zostały wprowadzone w wersji 2.8.0, w przypadku posiadania tej wersji lub nowszych, należy zmienić każde podwojone wystąpienie znaków +, -, *, / na pojedyncze ich wystąpienie, na przykład: ++ -> +. Wtedy ostrzeżenie przy przeładowaniu skryptu zniknie. Pobieranie: https://code.skript.pl/7gO6bkfa Dziękuję za poświęcony czas na czytanie, życzę miłej zabawy ze skryptem. W razie problemów lub sugestii, proszę je zgłosić w sekcji komentarzy pod tym artykułem.
-
Miło mi to słyszeć. Proszę uprzejmie. Wydaje mi się, że o to Panu chodziło. options: worldName: world function hornCoralPlantsReduce(p: player): {hornCoralPlants::removeFifty::%uuid of {_p}%} is set set {_item} to living horn coral plant named "&6Rozgwiazda" with lore "&8» &7Waluta z &eEventu wakacyjnego &f(2024)" and "&8» &7Wymienisz ją na &fklucze &7pod &f/event" set {_number} to amount of {_item} in {_p}'s inventory {_number} > 0 set {_reducedNumber} to ceil({_number} / 2) remove {_reducedNumber} of {_item} from {_p}'s inventory clear {hornCoralPlants::removeFifty::%uuid of {_p}%} on death of player: "%regions at event-location%" contains "event-wakacyjny in world {@worldName}" keep inventory victim doesn't have permission "wakacje.drop1" set {hornCoralPlants::removeFifty::%uuid of victim%} to true on respawn: hornCoralPlantsReduce(player) on join: hornCoralPlantsReduce(player) Tutaj proponuję Panu zainteresowanie się pluginem WorldGuard Extra Flags. Po jego zainstalowaniu może Pan ustawić dla tego regionu blokadę latania przy pomocy elytry. Co prawda można to zablokować w Skript, ale jeśli plugin już to oferuje, lepiej wybrać takie rozwiązanie.
-
Jakby poszukać po forum, z pewnością by się coś takiego znalazło. Niemniej jednak, nikt nie pisze skryptów o tak niskiej złożoności. Opiszę krok po kroku jak można samemu stworzyć taki skrypt. Nasłuchujemy do listenera zdarzenia 'on death:'. Sprawdzamy czy victim (ofiara) to gracz. Można również skorzystać po prostu ze zdarzenia 'on death of player:'. Sprawdzamy czy attacker (atakujący) to gracz. Ten warunek należy napisać w poniższy sposób. if attacker is a player: Przedimek 'a' ma tu znaczenie, gdyż samo 'player' oznaczałoby, że się próbujemy odnieść do któregoś z uczestników tego zdarzenia (ofiary lub atakującego). Dzięki temu przedimkowi Skript rozumie, że jest to warunek sprawdzający czy ktoś po prostu jest graczem, nie jakimś konkretnym. Jeśli powyższe warunki zostały spełnione, wysyłamy wiadomość do attackera (atakującego) za pomocą efektu 'message/send'. Proszę zwrócić uwagę na to, że w dokumentacji podane są również przykłady do każdej instrukcji. Powinny one pomóc w zrozumieniu.
-
Proszę zauważyć, że w moich skryptach wklejam sekcję import zawsze nad wszelkim kodem, aby Skript w pierwszej kolejności pobrał z innych API wszystkie potrzebne rzeczy. Sam autor skript-reflect zaleca tak czynić, więcej o tym można poczytać tutaj. Niemniej jednak dobrze, że się to wyjaśniło. Niech Pan jeszcze raz przejrzy wszystko to o czym pisałem i da znać czy działa jak należy.
-
Jak najbardziej. Wyjaśnię w kilku krokach jak można taki skrypt napisać. Nasłuchujemy do listenera zdarzenia 'on damage:'. Sprawdzamy czy ofiara (victim) to gracz. Zapisujemy do jakiejś zmiennej lokalnej (na przykład {_v}) wektor zaczynający się w lokalizacji zaatakowanego i kończący się w lokalizacji atakującego. Tutaj przyda się te wyrażenie z dokumentacji. Normalizujemy ów wektor (zmniejszamy jego moduł (długość) do 1). Powinniśmy tak zrobić, gdyż obrażenia zadawane przez strzałę zależą od jej prędkości, a bez normalizacji mielibyśmy sytuację, że im dalej stałby atakujący, tym szybciej strzała wędrowałaby w jego kierunku (a więc zadawałaby więcej obrażeń). Możemy przemnożyć (ale nie musimy) ten wektor przez jakąś stałą, aby zmienić prędkość strzały. Niestety, Skript nie wspiera mnożenia wektorów przez skalar. Jesteśmy zmuszeni więc stworzyć wektor o identycznych współrzędnych (np. 'set {_scalarVector} to vector 0.8, 0.8, 0.8'). Gdy już stworzyliśmy sobie taki wektor, możemy go przemnożyć przez nasz wektor z punktu 3 i zapisać wynik tego mnożenia (który jest rzecz jasna wektorem) do jakiejś zmiennej lokalnej. Najprościej jest posłużyć się tym wyrażeniem. Finalnie, możemy użyć efektu 'shoot'. Na końcu musimy dodać nasz wektor, aby Skript wiedział w jakim kierunku ma zostać wystrzelona strzała.
-
Niech Pan wyłączy serwer, usunie mój skrypt i spróbuje ponownie go włączyć. Jak już Pan to zrobi i serwer się uruchomi (co będzie oznaczało, że zawinił mój skrypt, choć nie wiem w jaki sposób), niech Pan sprawdzi rozmiar listy i powie mi co skrypt wyświetla na czacie. Mowa o wcześniej przeze mnie udostępnionej komendzie /coralslist. Po tym zdecyduję co dalej. Zapewne kolejnym krokiem będzie sprawdzenie za pomocą komendy pluginu ile istnieje takich hologramów i ręczne pousuwanie ich.
-
W takim razie Pan dobrze zrobił jeśli Pan przeczytał wszystko to co napisałem. Mam nadzieję, że Pan najpierw przeczytał cały post, a dopiero później wkleił kod komendy. Przejrzałem logi i zauważyłem wiele błędów z różnych pluginów, ale też znalazłem błędy przy samym Skript'cie. Szczerze mówiąc, nie jestem w stanie wywnioskować co jest przyczyną. Abstrahując, na przyszłość zalecam wrzucać wszelkie logi i dłuższe skrypty na serwis code.skript.pl. Wydaje mi się, że plugin powinien udostępniać jakąś komendę wyświetlającą nazwy wszystkich istniejących hologramów. Proszę poszukać.
