-
Ilość zawartości
11012 -
Rejestracja
-
Ostatnia wizyta
-
Wygrane w rankingu
230
Treść opublikowana przez Kormic
-
Ten temat został przeniesiony do kosza!
-
Nie zrozumieliśmy się, być może z mojej winy. Ja odniosłem się do samego czyszczenia 'display name' uderzonego bytu po x sekundach, które jest nie do końca dobrze zaimplementowane. Proszę sobie wyobrazić taką sytuację: Ustawiamy czas usuwania na 5 sekund. Gracz uderza zombie, odczekuje 3 sekundy i ponownie go uderza. Pytanie: Po ilu sekundach od ostatniego uderzenia zostanie wyczyszczony 'display name' tego zombie? Odpowiedź: Po 2 sekundach. Dlaczego tak się dzieje? Te usunięcie po 2 sekundach wynika z pierwszego uderzenia gracza. Po pierwszym uderzeniu gracz odczekał 3 sekundy i ponownie uderzył, więc po odczekaniu kolejnych 2 sekund 'display name' zombie został wyczyszczony. To, że gracz uderzył drugi raz, nie znaczy, że pięciosekundowe opóźnienie związane z pierwszym uderzeniem zostało odwołane. A teraz proszę sobie wyobrazić co będzie się działo przy ciągłym biciu takiego zombie. Otrzymamy efekt migotania, ponieważ kod związany ze wcześniejszymi uderzeniami będzie czyścił 'display name' ustawiane w kodzie związanym z późniejszymi uderzeniami. Mam nadzieję, że teraz jest to zrozumiałe. Swoją drogą, warto też zauważyć, że jeśli serwer zostanie wyłączony przed zakończeniem opóźnienia w kodzie, nazwa bytu nie będzie wyczyszczona i będzie ją miał po restarcie serwera tak długo aż ktoś go ponownie nie uderzy. Nie jest to nic strasznego, ale można się nad tym pochylić. Tutaj najprostszym rozwiązaniem byłoby zapętlenie wszystkich żywych bytów w listenerze zdarzenia 'on skript stop' i usunięcie owej nazwy jeśli byt posiada określoną wartość wcześniej wspomnianej przeze mnie 'metadata'. Na koniec wspomnę, że skrypt powinien sprawdzać tak właściwie czy uderzony byt jest żywym bytem i czy nie jest graczem. victim is a living entity Zapobiegnie to ustawianiu nazwy nieżywym bytom (obrazy, przedmioty leżące na ziemi, strzały, itd.). Pozdrawiam.
-
Całkiem nieźle. Podoba mi się użycie sekcji 'options' w celu umożliwienia podstawowej konfiguracji skryptu. Niestety skrypt ten ma jedną wadę - resetowanie 'display name' bytu po odczekaniu x sekund będzie wiązało się z migotaniem jego nazwy przy ciągłym biciu. Należałoby więc zapisywać jakąś informację w bycie sprawdzającą czy był uderzony w ciągu ostatnich x sekund. Jeśli tak, skrypt nic nie robi. Jeśli nie, 'display name' jest czyszczone. Najlepiej będzie tu skorzystać z tzw. 'metadata', ponieważ są to dane przechowywane bezpośrednio w bycie do momentu wyłączenia serwera, więc jest to rozwiązanie niemalże idealne. Pozdrawiam.
-
Ten temat został przeniesiony.
-
Ten temat został przeniesiony.
-
Te funkcję można lepiej napisać. Wiem, jestem czepialski, ale skoro funkcja znajduje się w dziale z poradnikami, powinna ona obsłużyć możliwie dużo przypadków. Brakuje obsługi dni, tygodni i lat. W dodatku zamiana przy spójniku "and" tworzy brzydką przerwę na 3 spacje. Kod sam w sobie można skrócić, ponieważ słowo kluczowe 'else' jest niepotrzebne, co jest związane z tym, iż zwracanie wartości kończy wykonywanie funkcji. Poniżej pokazałem co mam na myśli. function dodajCD(p: player, v: text, t: text, s: timespan) :: boolean: # [...] send "%{_t}% %{_s}%" to {_p} return false set {cooldown::%{_v}%::%{_p}%} to now return true Dziwnie to wytłumaczyłeś i zdaje się, że niepoprawnie. @CoFFeIN04 Owszem, można użyć wbudowanych w Minecraft'cie cooldownów, ale trzeba się liczyć z pewnymi konsekwencjami - podążając za przykładem z początku wątku, cooldown będzie obowiązywał dla wszystkich diamentowych mieczy w ekwipunku gracza, a nie tylko dla tego konkretnego diamentowego miecza. Mówiąc ogólniej, działa ona na dany typ przedmiotu, nie na konkretny przedmiot. Dla potwierdzenia można zajrzeć do kodu źródłowego Skripta (ściślej mówiąc, klasy ExprItemCooldown) i zauważyć, że te wyrażenie przy ustawianiu go wykorzystuje metodę HumanEntity#setCooldown(org.bukkit.Material material, int ticks). Pozdrawiam.
-
Nie widzę zrzutu ekranu, więc nie wiem czego tyczy się druga część pytania. Co do samej implementacji cooldownu w Skript, jest ona dość prosta. Przy użyciu przedmiotu należy zapisywać czas użycia go w zmiennej przypisanej do gracza, aby przy kolejnych próbach sprawdzać czy odstęp czasu między obecną chwilą a ostatnim użyciem przedmiotu jest większy niż zadany przez nas okres czasu. Jeśli nie, wysyłamy graczowi wiadomość informująca o konieczności odczekania. Rzecz jasna moim celem nie jest rzucanie na głęboką wodę, więc pokażę prosty przykład kodu wprowadzającego taki cooldown. Można go wstawić wszędzie tam gdzie go potrzebujemy. # [...] if {itemCooldown::%uuid of player%} is set: difference between {itemCooldown::%uuid of player%} and now is smaller than 5 seconds send "&6Odczekaj chwilę." to player stop set {itemCooldown::%uuid of player%} to now # [...] Powyższy fragment sprawdza czy upłynęło co najmniej 5 sekund od ostatniej akcji, a więc cooldown wynosi 5 sekund. Tak jak wspomniałem wcześniej, ten kod się nada niemalże do wszystkiego, niekoniecznie tylko do cooldownu na przedmiot. Przykładowe wykorzystanie tego kodu można znaleźć tutaj. Jednym z wyjątków będzie cooldown komendy, ponieważ twórcy Skripta wykonali ukłon w stronę graczy i umożliwili dodawanie go w bardzo prosty i przyjemny sposób. Na ten temat i kilka innych rozpisał się mój dobry przyjaciel, @PanMaruda, w tym temacie. Po więcej informacji odsyłam do dokumentacji Skripta. Pozdrawiam.
-
Ten temat został przeniesiony do kosza!
-
Można znaleźć poradniki na YouTubie, na przykład ten. Warto również przeczytać ten artykuł, który opisuje krok po kroku jak należy stworzyć paczkę zasobów i co można do niej dodać. Pozdrawiam.
-
Ten temat został przeniesiony.
-
Dwie uwagi co do kodu: Kod zadziała tylko w przypadku gdy miecz nie jest uszkodzony. Dlaczego? Ano dlatego, że uszkodzony miecz już nie spełni warunku sprawdzającego narzędzie gracza. Jak sobie z tym poradzić? Podam dwa rozwiązania: Należy zapisać w mieczu jakąś informację, która będzie jednoznacznie wskazywała, że to jest ten miecz. Można wykorzystać dowolny element NBT (wliczając nazwę i lore) lub też 'custom model data'. Należy rozbić warunek sprawdzający miecz na szereg warunków sprawdzających jego poszczególne cechy (typ przedmiotu, jego nazwa, lore, itd.). Używanie systemu cooldownu wbudowanego w Minecraft'cie niesie za sobą pewną konsekwencję - w powyższym kodzie cooldown będzie ustawiony na każdy diamentowy miecz, który gracz posiada. Lepiej będzie po prostu przypisać graczowi zmienną służącą do pomiaru czasu ostatniego użycia miecza. Skrypt więc powinien wyglądać +/- tak: options: sword: type: diamond sword name: &5&lKosa effect: type: weakness 1 duration: 5 seconds cooldown: 1 minute on right click on player: type of player's tool is {@sword.type} name of player's tool is "{@sword.name}" if {swordEffect::cooldown::%uuid of player%} is set: difference between {swordEffect::cooldown::%uuid of player%} and now is smaller than {@sword.effect.cooldown} send "&cOdczekaj chwilę." to player stop set {swordEffect::cooldown::%uuid of player%} to now apply {@sword.effect.type} to clicked player for {@sword.effect.duration} Pojawia się jeszcze kwestia możliwej niejednoznaczności wyrażenia 'player'. Co prawda Skript powinien rozumieć, że poprzez 'player' mówimy o graczu, który kliknął, ale należy to sprawdzić. Mam na myśli to, że istnieje ryzyko, iż Skript uzna 'player' za tego klikniętego gracza. Pozdrawiam.
-
Problem został rozwiązany.
-
Jeżeli to tak Pana interesuje, zawsze można spróbować skontaktować się z samym twórcą FunnyGuilds (dzikoysk). Zakładam, że jest w posiadaniu takich danych, a nawet jeśli nie, z pewnością pamięta ile mniej więcej serwerów korzystało z FG w poprzednich latach. Sięgając pamięcią wstecz, kojarzę, że jeszcze kilka lat temu istniało co najmniej 500 serwerów korzystających z FunnyGuilds. Zaproszenie na serwer Discord można znaleźć na głównej stronie repozytorium FunnyGuilds na GitHubie. Pozdrawiam.
-
Problem został rozwiązany.
-
Błąd jest związany z brakiem cudzysłowów przy wywoływaniu funkcji. Do skryptu wkradł się jeszcze jeden błąd. Proszę zauważyć, że opóźnienie powinno znajdować się w kodzie komendy, a nie w kodzie funkcji, ponieważ opóźnienie działa jedynie w sekcji, w której się znajduje. Efekt będzie taki, że wszystkie 10 wiadomości skrypt wyświetli w jednej chwili czasu i opóźnienie niczego nie zmieni w działaniu kodu. Opóźnienie w funkcji ma jedynie sens jeśli w kodzie funkcji znajdowałaby się pętla lub korzystalibyśmy z mechanizmu rekurencji. Ja pokażę jak można to lepiej zrobić. command /odliczanie [<text>]: executable by: console trigger: set {_colors::*} to "&a", "&e", "&c", "&4" set {_colorsNumbers::*} to 10, 5, 2, 1 set {_n} to 10 set {_color} to 1 loop {_n} times: set {_countdown} to {_n} - loop-number + 1 if {_countdown} <= {_colorsNumbers::%{_color} + 1%}: add 1 to {_color} send title "" with subtitle "%{_colors::%{_color}%}%%{_countdown}%" to all players play sound "ENTITY_EXPERIENCE_ORB_PICKUP" to all players wait 1 second Coś takiego na szybko wykombinowałem. Przetestowałem i działa jak należy. Pozdrawiam.
-
Ten temat został przeniesiony.
-
Zlecenie zostało wykonane.
-
Tak. Można w tym celu użyć dodatku SkBee, który oferuje taką możliwość. Po więcej informacji odsyłam do wiki dodatku. Przykładów tam jest pod dostatkiem. Pozdrawiam.
-
Tak. import: org.bukkit.inventory.ItemFlag command /hideenchants [<text>]: executable by: players trigger: player's tool is not air set {_item} to player's tool set {_meta} to {_item}.getItemMeta() {_meta}.addItemFlags(ItemFlag.HIDE_ENCHANTS) {_item}.setItemMeta({_meta}) clear lore of {_item} set player's tool to {_item}
-
Nie rozumiem. O to chodzi? command /killboss [<text>]: permission: server.command.killboss permission message: &6Nie posiadasz wystarczających uprawnień do wykonania tej komendy. trigger: kill all blazes where [name of entity input contains "{@golemBoss.name}"] Błędów przy przeładowaniu skryptu brak, więc wszystko powinno być w porządku. Liczba mnoga w przypadku słowa 'blazes' nie ma znaczenia, nawet 'blaze' zadziała.
-
Proszę. Jak wspomniałem wyżej, wymagany jest dodatek skript-reflect. import: org.bukkit.inventory.ItemFlag command /hideenchants [<text>]: executable by: players trigger: player's tool is not air set {_item} to player's tool set {_meta} to {_item}.getItemMeta() {_meta}.addItemFlags(ItemFlag.HIDE_ENCHANTS) {_item}.setItemMeta({_meta}) set player's tool to {_item} Pozdrawiam.
-
Czytanie ze zrozumieniem jeszcze nikogo nie zabiło. Pozdrawiam.
-
Odpowiedzi na powyższe pytania nie znam, ale gdybym chciał je poznać, z pewnością rozejrzałbym się po najpopularniejszych polskich serwerach (zakładam, że celuje Pan w społeczność polską). Które serwery są obecnie popularne? Wymienię kilka przykładowych: anarchia.gg, minestar.pl, kokscraft.pl. Przykłady podałem z głowy, ale więcej serwerów wartych uwagi można znaleźć na wszelkiej maści listach polskich serwerów Minecraft takich jak chociażby ta. Co do samych serwerów z gildiami (rozumiem, że mowa o chociażby EasyHC, MegaDrop, itp.), popularność można estymować na podstawie bStats. Jak widać, wtyczka FunnyGuilds jest na ten moment zainstalowana na co najmniej 214 serwerach. Dlaczego powiedziałem "co najmniej"? Ano dlatego, że bStats zawsze można wyłączyć, nikt tego nie zabrania. Niemniej jednak, jego udział w obciążeniu serwera jest bliski zera, a też rozumiem chęć twórców pluginów do posiadania wiedzy na temat użytku ich produktów (ile serwerów z nich korzysta, na jakich wersjach, itd.), dlatego zalecam zostawić go w spokoju. Pozdrawiam.
-
Ten temat został przeniesiony.
