347Aza 3 Opublikowano 28 lipca 2024 Udostępnij Opublikowano 28 lipca 2024 Prosty skrypt na hp mobków. Cytuj Odnośnik do komentarza https://skript.pl/temat/57962-prosty-skrypt-na-hp-mobk%C3%B3w/ Udostępnij na innych stronach Więcej opcji udostępniania...
Kormic 1951 Opublikowano 28 lipca 2024 Udostępnij Opublikowano 28 lipca 2024 51 minut temu, 347Aza napisał: Prosty skrypt na hp mobków. 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. Cytuj Odnośnik do komentarza https://skript.pl/temat/57962-prosty-skrypt-na-hp-mobk%C3%B3w/#findComment-344305 Udostępnij na innych stronach Więcej opcji udostępniania...
347Aza 3 Opublikowano 28 lipca 2024 Autor Udostępnij Opublikowano 28 lipca 2024 (edytowane) 42 minuty temu, Kormic napisał: 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. Moim zdaniem to nie jest najlepsze rozwiązanie, skrypt ma wyświetlać hp mobka po każdym uderzeniu, jeżeli bym zablokował ponowną zmiane nazwy by nie było widać hp moba po drugim walnięciu. Bardzo dziękuję za kulturalną odpowiedź. Użyję twojej propozycji w innych skryptach bo ma sens, ale wydaje mi się, że z tym zamysłem nie ma sensu dawania tego. Edytowane 28 lipca 2024 przez 347Aza Cytuj Odnośnik do komentarza https://skript.pl/temat/57962-prosty-skrypt-na-hp-mobk%C3%B3w/#findComment-344306 Udostępnij na innych stronach Więcej opcji udostępniania...
Kormic 1951 Opublikowano 28 lipca 2024 Udostępnij Opublikowano 28 lipca 2024 1 godzinę temu, 347Aza napisał: Moim zdaniem to nie jest najlepsze rozwiązanie, skrypt ma wyświetlać hp mobka po każdym uderzeniu, jeżeli bym zablokował ponowną zmiane nazwy by nie było widać hp moba po drugim walnięciu. Bardzo dziękuję za kulturalną odpowiedź. Użyję twojej propozycji w innych skryptach bo ma sens, ale wydaje mi się, że z tym zamysłem nie ma sensu dawania tego. 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. Cytuj Odnośnik do komentarza https://skript.pl/temat/57962-prosty-skrypt-na-hp-mobk%C3%B3w/#findComment-344311 Udostępnij na innych stronach Więcej opcji udostępniania...
347Aza 3 Opublikowano 28 lipca 2024 Autor Udostępnij Opublikowano 28 lipca 2024 Fakt, nie zrozumieliśmy się. Po tym jak mi wytłumaczyłeś wyobraziłem to sobie i rzeczywiście wymaga to poprawy. Bardzo dziękuję, za tak wyczerpującą odpowiedź, pomaga to zrozumieć jak działa Skript oraz jak robić coś "lepiej". W wolnym czasie siądę i poprawię, liczę, że znowu spojrzysz i się wypowiesz Miłego! EDIT: @Kormic działa, podczas bicia sie nie usuwa, jak sie nie bijesz to sie usuwa. Cos moglbym tu zrobic lepiej? Łączę posty. Notatka dodana przez Kormic Kormic 1 Cytuj Odnośnik do komentarza https://skript.pl/temat/57962-prosty-skrypt-na-hp-mobk%C3%B3w/#findComment-344313 Udostępnij na innych stronach Więcej opcji udostępniania...
Kormic 1951 Opublikowano 29 lipca 2024 Udostępnij Opublikowano 29 lipca 2024 20 godzin temu, 347Aza napisał: działa, podczas bicia sie nie usuwa, jak sie nie bijesz to sie usuwa. Cos moglbym tu zrobic lepiej? Generalnie wygląda w porządku, ale mam dwie uwagi. Dlaczego w kodzie znajduje się opóźnienie o jedną sekundę ('wait 1 second')? Nie widzę powodu, aby je tu zostawić. Użycie metadaty w skrypcie pozwala na rezygnację z użycia zmiennych (zwłaszcza globalnych), a tutaj widzę, że użył Pan zmiennej globalnej '{zycie_pierwszy_atak}'. W mojej ocenie jest ona niepotrzebna i sama metadata wystarczy. Podpowiedź: Można zauważyć, że trudno będzie z oparciem skryptu na samych wartościach logicznych prawda/fałsz. Da się to zrobić w ten sposób, ale można prościej i wygodniej. Metadata może przechowywać właściwie dowolną informację, więc wykorzystamy tę możliwość do zapisania w niej informacji o czasie ostatniego uderzenia ofiary (wyrażenie 'now'), a po odczekaniu x sekund będziemy sprawdzali czy różnica czasu między ostatnim zapisanym czasem uderzenia a obecnym jest większa lub równa x sekund. Jeśli tak, oznacza to, że byt został uderzony co najmniej x sekund temu, więc możemy usunąć jego 'display name'. Zostawiam w spoilerze poniżej propozycję tego jak ja bym to napisał wraz z wyczerpującym komentarzem. Spoiler on damage of living entity: attacker is a player victim is not a player if {@debug_mode} is true: send "1" to attacker set display name of victim to "{@nazwa_mobka}" set metadata "lastHitTime" of victim to now wait {@cooldown} seconds set {_t} to metadata "lastHitTime" of victim if {@debug_mode} is true: send difference between {_t} and now to attacker difference between {_t} and now >= ("%{@cooldown} - 0.1% seconds" parsed as a timespan) delete metadata "lastHitTime" of victim reset display name of victim Jeśli byt zostanie uderzony w ciągu tych x sekund opóźnienia, wartość metadaty "lastHitTime" zostanie nadpisana czasem obecnym, co sprawi, że po opóźnieniu warunek nie będzie spełniony. Można zauważyć dwie zmiany: wykorzystanie składni 'on damage of %entity type%', co skraca nieco kod, użycie tzw. 'inline conditionals' tam gdzie to było możliwe. 'inline conditionals' to warunki bez wcięć, wykonują cały kod pod nimi o ile są spełnione. Pozwala to na porządkowanie wielu szeregowych warunków zamiast tworzenia drabinki 'if' jak poniżej. if arg is between 1 and 3: if arg is an integer: if mod(arg, 2) = 0: # [...] Idealnym kodem byłby taki, który usuwa opóźnienia wynikające z poprzednich uderzeń bytu, ale niestety nie jesteśmy w stanie tego zrobić, ponieważ Skript nie daje takiej możliwości. W konsekwencji trzeba liczyć się z tym, że jednocześnie może działać tyle opóźnień, ile razy jest w stanie gracz uderzyć ów byt w ciągu x sekund. Słabszy serwer z wieloma graczami oparty na walce z bytami mógłby odczuć z tego tytułu pewien dyskomfort. Na koniec wspomnę o jednej pułapce powyższego kodu - pomiar czasu, a właściwie to pomiar czasu wykonywany w opóźnieniach nie jest idealny, ponieważ jest on zależny od wartości wskaźnika TPS ('ticks per second'), który jest z kolei zależny od stabilności pracy serwera. Im niższa wartość tego wskaźnika, tym gorzej, bo opóźnienia trwają dłużej niż powinny. Można to interpretować jako spowolnienie czasu gry, co jest bardzo złym zjawiskiem świadczącym o zaburzeniu poprawnej pracy serwera i jego dużym obciążeniu - zwyczajnie nie nadąża. Umownie, wszystko powyżej 19 i możliwie blisko 20 TPS jest traktowane jako dobre. Wszystko poniżej jest traktowane jako powód do zastanowienia się nad źródłem problemu i możliwie szybkiego wyeliminowania go. Testując powyższy kod, otrzymywałem pomiary czasu równe 4.98 sekundy, co już sprawia, że kod nie zadziała, bo wymaga co najmniej 5 sekund różnicy. Należy więc wziąć pewien margines błędu pod uwagę i go zaimplementować. Ja dla przykładu zrobiłem zmniejszanie ilości sekund o jedną dziesiątą (w tym przypadku 2% czasu opóźnienia), ale warto z tego zrobić na przykład zmniejszanie o właśnie te wspomniane 2% dla każdej zadanej długości czasu opóźnienia, aby nie działało to na podstawie sztywno zadanej wartości. Należałoby jeszcze właściwie zdefiniować przedział z większą tolerancją powyżej x sekund, ponieważ wskaźnik TPS wynosi raczej mniej niż 20, a nie więcej niż 20. "%{@cooldown} - {@cooldown} * 0.02% seconds" parsed as a timespan Pozdrawiam. Cytuj Odnośnik do komentarza https://skript.pl/temat/57962-prosty-skrypt-na-hp-mobk%C3%B3w/#findComment-344316 Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.