Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TUT]Makra


tk371

Rekomendowane odpowiedzi

Opublikowano

WSTĘP

Makra jest to algorytm komputerowy, który ma do wykonania pewna aplikacja - Runes of Magic. W tutorialu tym postaram się Ci pokazać/nauczyć jak samemu tworzyć makra i automatyzować grę. Zapraszam do lektury.

PODSTAWY

  • Jak zacząć pisać makra?
    Z tym nie powinno być większego problemu, gdyż wystarczy jedynie wejść do menu gry (ESC), następnie z listy wybrać "Makra", w wolnym polu wybrać "Nowe" lub zaznaczyć istniejące i wybrać "Modyfikuj".
    Powinien się Ci otworzyć edytor makr wbudowany w grę, który ma możliwość obsługi jedynie 255 znaków - na początek wystarczy. Dodam już teraz, że makr używa się tak jak zwykłych umiejętności.
    Okno edytora powinno wyglądać tak:
    oknot.png
    - Strzałką na lewo od ikony wybierasz ikonę makra
    - W polu na prawo od ikony wpisujesz nazwę makra (nieobowiązkowe)
    - Pod kreską masz miejsce na swój skrypt
  • Już się łapię, ale jakie są podstawowe funkcje?
    Podstawowych funkcji jest tylko kilka, oto one:
    /s <treść> - wypisuje wiadomość na kanale "Powiedz"
    /z <treść> - wypisuje wiadomość na kanale "Strefa"
    /g <treść> - wypisuje wiadomość na kanale "Gildia"
    /w <gracz> <treść> - wypisuje wiadomość dla gracza na szept
    /cast <umiejętność> - używa umiejętności na aktualnym celu
    /use <przedmiot> - używa przedmiotu
    /wait <liczba sekund> - zatrzymuje działanie skryptu na określony czas


  • Coś mi nie wychodzi... może jakiś przykład?
    Proszę bardzo:
    /cast Oszroniona Strzała
    /wait 1
    /s Oszroniona Strzała została użyta

    Przykład działa tylko na postaci posiadającej umiejętność Oszronionej Strzały i na Polskim Cliencie

ZAAWANSOWANE MAKRA Z LUA

  • Co to jest Lua i co mi będzie potrzebne do pisania długich makr?
    Lua jest to skryptowy język programowania, który powstał na potrzeby rozwinięcia możliwości aplikacji. Cały język Lua może być użyty jako dodatek do języka C. Kompilator traktuje wszystko po -- jako komętarz.
    Do pisania w tym języku będzie Ci potrzebne odpowiednie środowisko, lecz na potrzeby gry Runes of Magic wystarczy jedynie Notepad++
    http://notepad-plus-plus.org/


    Na potrzeby pisania długich makr stworzyłem addona, który pobiera treść makra z pliku. Możesz go pobrać stąd:

    http://www.mediafire.com/?kjiehx22ckc3oug

    http://www.virustotal.com/file-scan/report.html?id=ce61a00faa27df2db92b4e13049957d4d9cd84dba3a873e2b5fe2e362ef7af03-1312134830


  • Jak mam użyć tego addona?
    Nie jest to trudne. Archiwum należy rozpakować do:
    <katalog gry>\Interface\AddOns\

    Jeśli po włączeniu gry pojawi Ci się komunikat w oknie czatu informujący o obecności tego addona to wszystko jest ok.
    W addonie jest katalog Scripts, gdzie są wszystkie skrypty - póki co jest tylko jeden, który używa nam buffa, ale możesz tam dodawać swoje. Do testów najlepiej przestawić wartość mh.showmsg na true w pliku MacroHelper.lua.
    Własne makra zapisane do plików uruchamiamy wpisując w czasie gry:

    /mh <nazwa makra>
    /MH <nazwa makra>
    /Mh <nazwa makra>
    /mH <nazwa makra>


    Wszystkie komendy mają takie samo działanie.
    Przykładowo jeśli masz do wywołania plik o nazwie 1.lua należy wpisać:

    /mh 1


    Oczywiście byłoby to dość niezręcznie, gdyby cały czas wpisywać komendy do czatu, dlatego warto jest zrobić makro w grze, które będzie zawierać kamęde wpisywaną do czatu.
    Tutaj jest uwaga - jeśli w makrze jest błąd, a Ty zechcesz je wywołać z makra w grze to gra się wyłączy. Dlatego za pierwszym razem ZAWSZE sprawdź działanie makra wywołując je ręcznie - w takim wypadku makro się najwyżej nie wykona.

  • No ale w końcu jak pisać te makra?
    Do tego będzie Ci potrzebna znajomość pewnych funkcji związanych z grą, których lista jest na tej stronie:
    http://www.theromwiki.com/index.php/List_of_Functions


    Oczywiście nie musisz ich wszystkich mieć w głowie. Najczęściej używane same Ci tam wejdą.
    Jak już wspomniałem istnieje w folderze Scripts jedno makro. Przeanalizujmy je razem dla zrozumienia jak to wzystko działa:

    function buff()
    for i=1,100,1 do
    	local name, icon, count, ID = UnitBuff( "player", i );
    	if (name == "Oszroniona Strza\197\130a") then Oszroniona_Strzala = true end;
    end;
    if (not Oszroniona_Strzala) then CastSpellByName("Oszroniona Strza\197\130a") end;
    end;
    buff()


    function buff() - jest to zaznaczenie, gdzie funkcja ma się zaczynać i jaką ma mieć nazwę
    for i=1,100,1 do - jedyna działająca pętla z Lua w grze. Wykonuje nam ona zwiększenie i od 1 do 100 co 1 co każdy obrót. Pętla ta jest jedyną obsługiwaną przez grę - inne pętle ją zawieszają.
    local name, icon, count, ID = UnitBuff( "player", i ); - zadeklarowanie zmiennych, które mają być TYLKO dla funkcji. Przyjmują one wartości zwracane przez funkcję UnitBuff. ; na końcu nie jest konieczny.
    if (name == "Oszroniona Strza\197\130a") then Oszroniona_Strzala = true end; - jeśli zmienna name (przechowująca nazwę buffa) zawiera w sobie nazwę interesującego nas buffa, to zmienna Oszroniona_Strzala przyjmuje wartość true - ta ostatnia to znacznik dla nas, czy dany buff jest aktualnie włączony na danej postaci, czy nie.
    end; - koniec. W tym wypadku koniec funkcji.
    buff() - wywołanie napisanej przed chwilą funkcji
    Całe makro mogło by się obyć bez funkcji - wyglądało by to tak:

    for i=1,100,1 do
    local name, icon, count, ID = UnitBuff( "player", i );
    if (name == "Oszroniona Strza\197\130a") then Oszroniona_Strzala = true end;
    end;
    if (not Oszroniona_Strzala) then CastSpellByName("Oszroniona Strza\197\130a") end;


  • Czemu zamiast polskich znaków są jakieś ukośniki i liczby?
    Ten sposób wprowadzania makr toleruje tylko alfabet łaciński - wszelkie rozszerzenia nie działają, dlatego wszelakie inne znaki należy zamieniać. Oto lista co na co zamienić:
    ł = \197\130
    ą = \196\133
    ż = \197\188
    ć = \196\135
    ę = \196\153
    ś = \197\155
    ó = \195\179
    ź = \197\186
    ń = \195\177


  • Widzi mi się gigantyczne makro. Jak szybko pozamieniać polskie znaki?
    Notepad++ ma rozbudowaną opcję zamiany znaków - należy jej użyć.
    notepadc.png
  • Pomóż mi napisać makro od nowa!
    Na początek dobrze się zastanówmy co ma robić takie makro. Moje makro będzie zaznaczało najbliższego wroga - o ile taki nie istnieje, a następnie go atakowało z tym, że ma używać innych umiejętności przy różnych wartościach HP przeciwnika.
    Przydadzą mi się funkcje:
    TargetNearestEnemy() - zaznacza najbliższego przeciwnika.
    UnitHealth("target") - zwraca obecną ilość HP celu.
    UnitMaxHealth("target") - zwraca maksymalną ilość HP celu.
    CastSpellByName("<umiejętność>") - używa umiejętności.
    Więc zaczynajmy:
    if (not UnitExist("target")) then TargetNearestEnemy();-- zaznaczenie wroga
    end;
    if (((UnitHealth("target")/UnitMaxHealth("target"))*100)>=50 then-- warunek określający ilość HP celu w %
    CastSpellByName("Wietrzne Strza\197\130y");-- użycie umiejętności
    else
    CastSpellByName("Strza\197\130");-- życie innej umiejętności
    end;

    Oto i cała historia - myślę, że zrozumiałe.

  • Marzy mi się napisanie makra mającego cechy bota, ale nigdzie nie ma mowy o zatrzymaniu działania makra na jakiś czas. Co zrobić?
    Twórcy zabezpieczyli się przed botami nie dając im funkcji zatrzymującej makra. Niektórzy użytkownicy to obeszli i zrobili swoje UDFy (funkcje użytkowników), które odliczają czas do wywołania funkcji. Oto jedna z nich:
    --[[
       TimedExample
    
       Example code to have timed functions/operations in RoM.
    
       Author: Peryl
       License: Public Domain
    --]]
    
    
    -- Create an add-on namescape
    local TimedExample = {}
    _G.TimedExample = TimedExample
    
    
    -- Create an empty list of "objects" to be timed
    TimedExample.ObjList = {}
    
    
    -- Create a frame so we can have an OnUpdate callback
    -- This is only needed for this example since I don't have
    -- a frame made in an XML file.
    TimedExample.Frame = CreateUIComponent("Frame", "FrameForTimedExample", "UIParent")
    
    -- Remove the global variable made by CreateUIComponent
    -- This is done because I don't need it as a global variable
    -- so I don't polute the global namespace needlessly.
    _G.FrameForTimedExample = nil
    
    -- Set the frame's OnUpdate callback
    TimedExample.Frame:SetScripts("OnUpdate", [=[ TimedExample.UpdateHandler(elapsedTime) ]=])
    
    
    -- Helper function to add an item to the list of delayed "objects"
    local function DelayCall(delay, funcName, arg1, arg2, arg3, arg4)
       table.insert(TimedExample.ObjList, { DelayTimer = delay, FuncToCall = funcName, args = { arg1, arg2, arg3, arg4 }, } )
    end
    
    
    -- The OnUpdate handler itself.
    -- The method used to actually call the function needed when
    -- the timer has expired is a little funky, but it allows us
    -- to use a string to call pretty much any function in the
    -- add-on's namespace.
    function TimedExample.UpdateHandler(elapsed)
       -- Go through the list of objects
       for k,v in ipairs(TimedExample.ObjList) do
           -- Tick off some time
           v.DelayTimer = v.DelayTimer - elapsed
           -- Check if timer is done yet
           if v.DelayTimer <= 0 then
               -- Yup, so remove it from the list...
               table.remove(TimedExample.ObjList, k)
               -- ...and call the function
               TimedExample[v.FuncToCall](v.args[1], v.args[2], v.args[3], v.args[4])
           end
       end
    end
    
    
    -- The function that will get called by above OnUpdate
    function TimedExample.ShowMessage(text,red,green,blue)
       DEFAULT_CHAT_FRAME:AddMessage(text, red, green, blue)
    end
    
    
    -- A function to test above
    function TimedExample.Test()
       DelayCall(3, "ShowMessage", "3 sec delay", 1, 1, 1)
       DelayCall(1, "ShowMessage", "1 sec delay", 0.5, 1.0, 0.6)
       DelayCall(5, "ShowMessage", "5 sec delay", 0.2, 0.5, 1.0)
       DelayCall(2, "ShowMessage", "2 sec delay", 0.9, 0.8, 0.2)
    end

FAQ

Czekam na pytanie od Ciebie!

roomy.png

Wczoraj do ciebie nie należy. Jutro niepewne... Tylko dziś jest twoje.

Opublikowano

Fajny poradnik szkoda ze tak malo osob doceniło twa prace no polskie forum rom to wrzuc trochę mi rozjaśniłeś te makra . Ja mam pytanie czy mogl bys zrobic przykladowe makro do odpalek gram mag/woj i zeby w pelni sie odpalic musze zapodac sobie az 7bufkow w odpowiedniej kolejnosci i czasie trzeba sie wykazac szybkim klikaniem a nie zawsze sie to udaje co skutkuje sporym spadkiem dps;/ uzywam kolejno :wzmocnienie, ezoteryczny, woda ducha, szał, płomień, kataliza, plasma arrow da sie w makro wpisac "zarcie i eliksiry" zeby automatycznie uzylo? czy moze prosciej jest na to jakis adon o.O

?

 

ps http://www.theromwiki.com/index.php/List_of_Functions ta stronka nie dziala niewiem moze awarie dzis maja

Opublikowano

Jak w odpowiednim czasie to makro w grze raczej.

/cast <umiejętność>
/wait <czas w sekundach (rzucania umiejętności)>
/cast <następna umiejętność>
itd...

Z tym, że jeśli trzeba dokładny czas to wpisuj w komendzie wait czas w formie dziesiętnej, setnej itp. z tym, że gra może mieć odchylenia w wykonywaniu makr dochodzące do 50 ms.

Umiejętności mogą mieć polskie nazwy.

Stronka działa.

Da się w makro zrobić używanie żarcia i eliksirów.

 

Dzięki

roomy.png

Wczoraj do ciebie nie należy. Jutro niepewne... Tylko dziś jest twoje.

Opublikowano

Super nie będę raczej z tego korzystał bo to dla bardziej obcykanych w tym temacie ale doceniam twoją pracę i trud jaki w to włożyłeś

 

 

 

 

 

 

 

 

1248991649.gifDziękuje!

Pomogłem? Kliknij na +

  • 1 miesiąc temu...
Opublikowano

Mam problem:

 

Robię wszystko jak napisałeś i nie chce mi działać, żadne marko. Po prostu się nie odpala w grze. Nie wiem co z tym dalej zrobić :/

  • 10 miesięcy temu...
Opublikowano

Sorka za odkop ale mam pytanie.

Mój kolega ma problemy z makrem... poprostu nie może go napisać (umie ale nie działa mu nic).

Jest możliwość zrobienia takiego makra w formie addona?

Chce aby makro na odliczanie było w formie addona właśnie.

Oto makro:

 

/s 10

/wait 1

/s 9

/wait 1

/s 8

/wait 1

/s 7

/wait 1

/s 6

/wait 1

/s 5

/wait 1

/s 4

/wait 1

/s 3

/wait 1

/s 2

/wait 1

/s 1

/wait 1

/s GOOO !!

Zrobiłem coś co niby wygląda jak makro w lua ale coś nie chce się odpalać.

Proszę o pomoc.

Opublikowano

Ok, podziekuje ci bo nie spojrzalem na date. Zaawansowane komendy kiedys dzialały, ale je wyłączyli, bo ludzie pisali sobie boty. Teraz większość z nich nie dziala, sam sprawdzalem. Za odkop warn dla kolegi. Macro jest dobrze napisane, powinno działać. Nie wiem o co ci chodzi z formą addona.

Albo macro jest za długie albo każ mu pozmieniac np. 1 na Jeden.

  • 3 miesiące temu...
Opublikowano

Ładny poradnik, ale oczywiście się do czegoś przyczepię :D

 

  • Czemu zamiast polskich znaków są jakieś ukośniki i liczby?
    Ten sposób wprowadzania makr toleruje tylko alfabet łaciński - wszelkie rozszerzenia nie działają, dlatego wszelakie inne znaki należy zamieniać. Oto lista co na co zamienić:
    [*]ł = \197\130
    [*]ą = \196\133
    [*]ż = \197\188
    [*]ć = \196\135
    [*]ę = \196\153
    [*]ś = \197\155
    [*]ó = \195\179
    [*]ź = \197\186
    [*]ń = \195\177


 

 

Ewentualnie, jeśli mamy wpisane polskie znaki w Notepadzie ++ rozwijamy menu

Format

i wybieramy

Konwertuj na format UTF-8 bez BOM

 

 

 

http://www.theromwiki.com/index.php/List_of_Functions

 

 

to w tym tygodniu powinno być przetłumaczone przeze mnie

 

( postępy w tłumaczeniu wiki: tutaj )

 

Wyłapałem kilka błędów, popraw a usunę to z posta i się nikt nie dowie :P

 

Lua jest to skryptowy język programowania, który powstał na potrzeby rozwinięcia możliwości aplikacji. Cały język Lua może być użyty jako dodatek do języka C. Kompilator traktuje wszystko po -- jako komentarz.

 

Oczywiście byłoby to dość niezręcznie, gdyby cały czas wpisywać komendy do czatu, dlatego warto jest zrobić makro w grze, które będzie zawierać komendę wpisywaną do czatu.

 

i w jednym kodzie

 

CastSpellByName("Strza\197\130");-- życie innej umiejętności

 

umiejętności żyją :O popraw na użycie

 

 

możesz też do tematu dodać Download większej ilości ikonek ( addon More Macro Icons )

 

Pozdrawiam, odie2

BestiariuszSignature.png
Moje aktualne zajęcia:

  • Spolszczanie Wikipedii RoM-a
  • Nadzorowanie addonów: pbInfo, ComeOnIn, GridCliqueIt, RuneCraft, SlashAFK, nkCooldown
Opublikowano

Nie działa mi skrypt na bufa, zmieniłem nazwy na bufa z kapcia i pisze mi że skrypt wykonano ale bufa nie zarzuca. To znaczy że funkcje odpalające umiejętności są już wyłączone?Chciałem zrobić też skrypt który by sprawdzał co x sekund poziom hp celu i jak by było poniżej xx% to zapodaje skila leczącego ale też mi coś nie idzie :/

Znalazłem zaznaczenie osoby w drużynie które działa w makrze:

 

/script FollowUnit("party1");

 

Co jeszcze działa bo prawie wszystkie funkcje pewnie powyłączane :/

  • 3 tygodnie później...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...