Mudlet 2.1 - Mapper + zestaw prostych niezawodnych skryptów

Forum techniczne Arkadii.
Awatar użytkownika
Adremen
Posty: 232
Rejestracja: 31 gru 2009 11:13

Re: Mudlet 3.0.0 - zestaw prostych niezawodnych skryptów

Post autor: Adremen » 04 gru 2015 22:34

Narmaniel pisze:Mam taką wątpliwość, czy skrypty, które zrobiłeś są zgodne z zasadami Arkadii.

Łazik, który otwiera bramy po drodze? Jakiś chodzik, który wysyła komendy po określonym czasie zamiast korzystać ze standardowych "marszem" "biegiem" itd?

To raczej nie przejdzie, ale mogę się mylić.
Racja. Wydaje mi się, że legalnym za to będzie zrobienie aliasa na podstawie triggera ("Nie możesz przejść przez zamknieta brame." --> naciśnij F5 aby otworzyć bramę. takie coś jest (wydaje mi się) w porządku).
Sam łazik jest zrobiony bez użycia arkadiowego, gdyż jest to jeden działający system i jest go łatwiej spiąć z całym mapperem gdy ma się swoje rozwiązanie. Taki łazik to jednak nic innego jak uruchomienie aliasa z kierunkami z opóźnieniem między każdą komendą, więc wydaje mi się to w porządku, ale 100% pewności nie mam.

Słusznie jednak zauważyłeś, że akcja automatyczna na podstawie triggera jest złamaniem zasad i muszę tu usunąć. Dzięki za uwagę.

Narmaniel

Re: Mudlet 3.0.0 - zestaw prostych niezawodnych skryptów

Post autor: Narmaniel » 05 gru 2015 10:30

Brama po naciśnięciu F5 jest w porządku.

Chodzik wciąż budzi moje wątpliwości. Bo widzisz, pod to można świetnie dopiąć automatyczne zbieranie ziół. ;) Przydałby się jakiś inny głos w sprawie.

Numeron
Posty: 137
Rejestracja: 31 paź 2010 08:30

Re: Mudlet 3.0.0 - zestaw prostych niezawodnych skryptów

Post autor: Numeron » 05 gru 2015 14:59

@Narmaniel: a pod arkadyjskie "idz niespiesznie/marszem/truchem" tez jest bardzo latwo podpiac automat do zbierania ziol. Poki klient nie wysyla komend bez Twojej wiedzy (poza kierunkami) lazik jest w zupelnosci OK.

To ze niektore skrypty sa robione na podstawie triggera, wcale nie oznacza ze sa z gory zabronione, wiele subow lub chodzby komunikatow informacyjnych (patrz "wcisnij to i tamto by otworzyc brame") jest robiony na podstawie triggera.

Poki bedziesz mial swiadomosc ze lazik idzie w takim i konkretnym kierunku, taki lazik nie powinien stanowic problemu. Jak napisal to kolega wyzej, lazik otwierajacy bramy jest sprzeczny z zasadami. Ale poki bedzie tylko "lazil" jest ok.

Awatar użytkownika
Adremen
Posty: 232
Rejestracja: 31 gru 2009 11:13

Re: Mudlet 3.0.0 - zestaw prostych niezawodnych skryptów

Post autor: Adremen » 14 gru 2015 19:34

Ok, to czas na aktualizację:

1. Mapper
Zrobiłem już w zasadzie wszystko i przetestowałem na sporej części Ishtar. Nie wiem jedynie jak ogarnąć linie specjalne. W manualu jest, aby użyć

Kod: Zaznacz cały

addCustomLine(roomID, id_to, direction, style, color, arrow)

z zaznaczeniem, że jest to od Mudleta 2.1. Na moim 2.1 to nie działa (wersja na OSX), ale spróbowałem też z ciekawości na delcie 3.0.0 i również ten API call zdaje się nie działać. Graficznie chyba można to dodać, ale dość topornie to działa. Czy ktoś ma z tym jakieś doświadczenia?

Śledzenie drużyny postanowiłem rozwiązać tak, że mam handlera na gmcp.room i jak go wyłapuję to:
a) jeśli dostępne są koordynaty to można je stąd wziąć i na tym się kończy, bo można znaleźć bezpośrednio room_id
b) jeśli a) nie pokaże koordynatów to patrzę w (standardowy) kierunek, który wyłapany zostaje przez trigger i kieruję pozycję na mapperze tam gdzie był wykonany ruch
c) jeśli nie jest to standardowy kierunek to chwilowo zakładam, że każdy w drużynie musi sam przejść, np: "zejdz po lancuchu", wtedy handler na gmcp.room zaskoczy, a skrypt po wykonanej komendzie przeskoczy na odpowiednią lokację.

Chodzik na jakiejkolwiek przeszkodzie (wrota miast) się zatrzymuje i wyświetla informację o bindzie, który trzeba nacisnąć aby wykonać akcję otwarcia.

2. Skrypt drużynowy.
Postanowiłem jednak dodać jedno małe okienko w prawym górnym rogu, którego zawartość wygląda tak:

Kod: Zaznacz cały

[ 0][##############] [0,2,3]JA
[ 1][##############]        teammate1
[ 2][##############] [1]    teammate2
[ 0][##############]        enemy0
[ 2][##############]        enemy1
[ 1][##############]        enemy2
[ 3][----##########]        enemy3
[  ][##############]        NPC
- pierwsza kolumna to id, które służą do komend (poniżej). Numerowanie osobne dla drużyny, osobne dla wrogów (NPCe nie walczące na lokacji nie otrzymują id). Kolorowanie dość intuicyjnie: drużyna na zielono, wrogowie na fioletowo (aktualne bity na czerwono).
- druga kolumna to kondycja (zastanawiam się nad zamianą na [4/6], będzie równie przejrzyście a większa oszczędność ekranu)
- trzecia kolumna to które id wrogów dana postać trzyma ([0,2,3] oznacza, że moja postać trzyma wrogów o id 0, 2 oraz 3

Okno się przeładowuje z każdym nadejściem objects.data, czyli: zmiana kondycji, zmiana atakującego, zasłona itp itd. W związku z tym, wszystkie bindy opisane poniżej działają na identyfikatorach dostarczanych przez gmcp (typu ob_245213 itp) i wyglądają następująco:

/za [id] - wykonuje 'zaslon _teammate_o_tym_id_'
/zas [id] - wykonuje 'zaslon przed _enemy_o_tym_id_'
/prze [id] - wykonuje 'przelam obrone _enemy_o_tym_id_'

jeśli skrypt wykryje, że walczący walczy z wrogiem innym niż prowadzący to podepnie akcję wsparcia pod ALT+2 i pokaże komunikat na ekranie, że postać bije innego i należy nacisnąć odpowiedniego binda aby wesprzeć.

3. Napisałem też proste wsparcie do lampy.

Kod: Zaznacz cały

/zap - zapala lampę, liczy ile jest butelek i pokazuje informację na ekranie
/nlo - dopełnia lampę resetując timer
/zg - zgaś lampę i wyłącz skrypt
po uruchomieniu ustawiany jest timer (początkowy na ~75 sekund). Po tym czasie wyskakuje informacja na ekranie o dopełnieniu lampy odpowiednim bindem (aktualnie ALT+3). Następny timer to 2/3 aktualnego czasu (czyli 50 sekund). Każdy następny jest 2/3 wartości poprzedniego z wyjątkiem kiedy wartość będzie <20 sekund, wtedy ustawiam go na 20 sekund i każdy następny również na 20 sekund. Dopełnienie lampy w którymkolwiek momencie spowoduje zresetowanie timera i liczenie od początku (od 75 sekundowego timera).
Jeśli wyłapany jest trigger '.*opróżniając calkowicie butelke\.$' to odkładam aktualną i biorę następną aktualizując licznik. Jeśli jest to ostatnia butelka to pokaże się komunikat informujący o tym.

Jak na razie mam tyle i mnie zdaje się to w zupełności wystarczać. Wszelkie komentarze oraz informacje jak to ulepszyć i poprawić jak zwykle mile widziane.
Jeśli będą chętni to mogę w zasadzie już udostępnić (2) i (3) część, tylko je uprzątnę. Mappera jeszcze dopracuję i przetestuję, a konkretniej część z podążaniem za drużyną. Powinien być niebawem gotowy do udostępnienia.

Awatar użytkownika
Tercoral
Posty: 712
Rejestracja: 30 sty 2013 13:44

Re: Mudlet 3.0.0 - zestaw prostych niezawodnych skryptów

Post autor: Tercoral » 14 gru 2015 19:54

Moze licznik poziomow i postepow?

Okno się przeładowuje z każdym nadejściem objects.data, czyli: zmiana kondycji, zmiana atakującego, zasłona itp itd. W związku z tym, wszystkie bindy opisane poniżej działają na identyfikatorach dostarczanych przez gmcp (typu ob_245213 itp) i wyglądają następująco:

/za [id] - wykonuje 'zaslon _teammate_o_tym_id_'
/zas [id] - wykonuje 'zaslon przed _enemy_o_tym_id_'
/prze [id] - wykonuje 'przelam obrone _enemy_o_tym_id_'
No jeszcze mam taka opcje, ze jak ktos z kims walczy i np jest drugi w kolejce ID to i tak go binduje jako pierwsze id. Czyli

Kod: Zaznacz cały

[ 0][##############] [0,2,3]JA
[ 1][##############]        teammate1
[ 2][##############] [1]    teammate2
[ 3][##############]        teammate3
[ 4][##############] [1]    teammate4
[ 0][##############]        enemy0
[ 2][##############]        enemy1
[ 1][##############]        enemy2
[ 3][----##########]        enemy3
[  ][##############]        NPC

Binduje mi teammate2 jako /za 1 a nie /za 2 i pozniej /za 2 a nie /za 4
Tęczowe serce... :oops:

Awatar użytkownika
Adremen
Posty: 232
Rejestracja: 31 gru 2009 11:13

Re: Mudlet 3.0.0 - zestaw prostych niezawodnych skryptów

Post autor: Adremen » 14 gru 2015 22:12

Tercoral pisze:Moze licznik poziomow i postepow?
Licznik postepów już roboczy mam, także go dokończę i wrzucę do paczki. Poziomy (gagowanie) też jest.
No jeszcze mam taka opcje, ze jak ktos z kims walczy i np jest drugi w kolejce ID to i tak go binduje jako pierwsze id. Czyli
czy coś takiego jest możliwe? Wartości w trzeciej kolumnie biorę z pól "attack_num" z obiektów wrogów, a to są integery. Chyba, że źle rozumiem Twój przykład. Możesz dokładniej wyjaśnić "jest drugi w kolejce ID"?

Awatar użytkownika
Tercoral
Posty: 712
Rejestracja: 30 sty 2013 13:44

Re: Mudlet 3.0.0 - zestaw prostych niezawodnych skryptów

Post autor: Tercoral » 15 gru 2015 12:42

Jest mozliwe tylko ze chyba nie z gmcp. ja biore swoja zmienna poprzez trigger 'atakuje go|ja|je' i podbindowuje w kolejnosci do zaslon. Zeby sie nie bawic sie w patrzenie ktory czlonek druzyny w kolejnosci jest aktualnie atakowany. Zawsze to sekunde do przodu.


Przyklad glebszy:
jest 6 czlonkow druzyny. 2 i 5 jest atakowany. Poprzez magie skryptow mam podbindowane id 2 czlonka druzyny pod f1 a pod f2 5. Nie musze klikac np za 5 bo mi to automatem binduje
Tęczowe serce... :oops:

Awatar użytkownika
Adremen
Posty: 232
Rejestracja: 31 gru 2009 11:13

Re: Mudlet 3.0.0 - zestaw prostych niezawodnych skryptów

Post autor: Adremen » 15 gru 2015 15:41

Poruszasz dwie różne kwestie.
Tercoral pisze:Jest mozliwe tylko ze chyba nie z gmcp. ja biore swoja zmienna poprzez trigger 'atakuje go|ja|je' i podbindowuje w kolejnosci do zaslon. Zeby sie nie bawic sie w patrzenie ktory czlonek druzyny w kolejnosci jest aktualnie atakowany. Zawsze to sekunde do przodu.
GMCP jest niezawodne, bo jest dostarczane przez silnik Arkadii i chcę, aby moje skrypty tam gdzie się da z tego korzystały (tak już teraz robią w mapperze i drużynowych skryptach). Raz, że Administracja dodając to dodała to z myślą o tym aby zacząć tego używać w skryptach, dwa, że pisanie i włączanie multum triggerów spowolni Ci klienta znacznie znacznie bardziej niż odczyt hashtable z pojedynczego eventa ;)

Teraz patrząc na moje rozwiązanie: Trzymam sobie hashtable 'ateam.objs' gdzie kluczami są id obiektów dostarczane przez Arkadię (254252 itp), a wartościami są tablice, które nadeszły z gmcp (czyli klucz to np kondycja, wartość to wartość kondycji). Jeśli nadchodzi update to po prostu pola, które nadeszły aktualizuję dla poszczególnych id'ków (aktualizacje bardzo wydajna, bo wszędzie są hashtable).
Co więcej, Arkadiowe GMCP działa o tyle rewelacyjnie, że nie będzie wysyłało pełnych tablic za każdym razem tylko pola, które się zmieniły, więc jest to bardzo wygodne i wydajne jednocześnie.

Skojarzenia id arkadiowych z id moimi (0,1,2,3...) to bardzo proste rozwiązanie. Co do drużyny to trzymam po prostu skojarzenie: (ateam.team_ids = {12345: 1, 1: 12345} i nigdy tego nie aktualizuję. Dlatego też '/za 2' to będzie zawsze zasłona tego samego członka drużyny (bo komenda jest 'zaslon xxx' i jest zawsze taka sama niezależnie ile i jakich wrogów bijemy).
Natomiast tablica z id'kami wrogów jest tworzona gdy nadchodzi objects.data. Sprawdziłem timestampy na 6 osobowej drużynie na sporej ilości wrogów i jest to bardzo szybkie i w dodatku niezawodne, bo bazuje na informacjach od Arkadii. To ta tablica jest wykorzystana przy '/zas 3', kiedy chcesz zaslonic przed konkretnym wrogiem (wtedy właśnie komenda byłaby 'zaslon przed xxx yyy stworem').
Tercoral pisze: Przyklad glebszy:
jest 6 czlonkow druzyny. 2 i 5 jest atakowany. Poprzez magie skryptow mam podbindowane id 2 czlonka druzyny pod f1 a pod f2 5. Nie musze klikac np za 5 bo mi to automatem binduje
A to jest dodanie prostego keybinda, którego mogę teraz bez problemu dodać :) W żaden sposób nie koliduje to z GMCP ani z tym co mam teraz.

Awatar użytkownika
Adremen
Posty: 232
Rejestracja: 31 gru 2009 11:13

Re: Mudlet 2.1 - zestaw prostych niezawodnych skryptów

Post autor: Adremen » 01 sty 2016 06:11

Ok, czas udostępnić skrypty do walki włączając w to drużynowe. Jest to wersja początkowa, dlatego wszelkie uwagi i komentarze na temat ulepszeń/co nie działa/co nie działa jak powinno bardzo mile widziane. Kilka uwag:

1. Koniecznie włączyć w ustawieniach GMCP. Bez tego skrypty nie działają. Zasłony, przełamywanie i wszystko inne działa na GMCP.
2. alt+1 jest użyty jako keybind gdy bijemy innego wroga niż prowadzący drużyny i jest to jedyny używany keybind w tych skryptach. Można to sobie zmodyfikować w kodzie. Wyświetla się info w postaci:

Kod: Zaznacz cały

      
      cecho ("<red>***************************************\n")
      cecho ("<red>*       Lejesz innego! ALT+1          *\n")
      cecho ("<red>***************************************\n")
3. komenda '/ateam_help' aby zobaczyć wszystkie możliwe aliasy. Okno kondycji jest w prawym górnym rogu. W oknie każdy wiersz to: 1 kolumna to id (druzyna i wrogowie numerowani niezaleznie od 0!), 2 kolumna to kondycje, 3 kolumna to: dla członków drużyny: których wrogów id postać trzyma, dla wrogów: którego id członka drużyny wróg bije, 4 kolumna to opis (imię lub long).

Polecam utworzenie nowego profilu, załadowanie paczki i podejście na jakieś stworki aby zobaczyć jak to działa. Wszystko można sobie po swojemu modyfikować, aczkolwiek planuję aktualizacje.
I jeszcze raz - uwagi, komentarze dotyczące czegokolwiek mile widziane! Mapper zostanie udostępniony wkrótce.
Załączniki
ateam.xml.zip
(3.61 KiB) Pobrany 96 razy

Awatar użytkownika
Tercoral
Posty: 712
Rejestracja: 30 sty 2013 13:44

Re: Mudlet 2.1 - zestaw prostych niezawodnych skryptów

Post autor: Tercoral » 03 sty 2016 10:40

Kawalek ladnie napisanego kodu :)

ale za wczesnie jak dla mnie zeby cos oceniac bo mozna by dodac kilka rzeczy (np klikalne zaslony,ataki, oznaczenie celu ataku/celu obrony).

Kolejne zagadnienie to jak ustawic w GUI ten pasek zeby bylo wygodnie czytac i korzystac z tego.
(ja bym skrocil do 1 # na kondycje, i dal jakies buttony do przesuwania tego i powiekszania)

Komendy w aliasach tez mozna pozmieniac na jakies ify, bo nie kazdy chce rozkazywac przy ataku. (Ale z tego robi sie jakis kombajn)

Dodac obsluge zawodow ktore maja zaslone grupowa poprzez gui.

Duzo sie tego robi... :)
Tęczowe serce... :oops:

ODPOWIEDZ