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

LUA - od Zera do Skryptera !


Badar

Rekomendowane odpowiedzi

Opublikowano

Witajcie.

 

W końcu postanowiłem zrobić dla Was, userów tego forum ogromny tutorial pt "LUA - od Zera do Skryptera !" .

 

Tutek nie będzie krótki... będzie wyczerpujący, porządny i długi.

 

 

LUA - co potrzebne, wybieramy edytor, jak zacząć pisać, co to LUA .

 

 

 

 

LUA - lekki język skryptowy o wysokiej wydajności, często stosowany jako biblioteka w językach takich jak : C, C#, C++ .

 

LUA posiada własny manual, link (podaję link do wersji 5.0, gdyż takiej używamy w metinie) :

www.lua.org/manual/5.0/"]http://www.lua.org/manual/5.0

 

 

Pora na wybór edytora .. Osobiście polecam program pt "Notepad ++" jest bardzo wygodny, szybki i przydatny =).

Poniżej umieszczam link do pobrania mojego "stylu" robionego specjalnie pod pisanie "questów" ułatwi on pracę nawet starym wyjadaczom.

By go dodać wchodzimy do : widok --> definiowanie własnego stylu --> import .

link :

http://www.sendspace.com/file/askn0u

skan :

https://www.virustotal.com/file/c23d648e5fd03226e09a98f216f9c5a19c2723b0cad5611adf7d17d296238518/analysis/1330078932/

 

By móc pisać w LUA potrzebujemy :

  • Chęci
  • Logicznego myślenia
  • Drobnej wiedzy o językach programowania
  • Programu typu notepad ++
  • brain.sh =)..

To na tyle tego krótkiego wstępu, przechodzimy dalej.

 

 

 

Pierwszy quest

 

 

 

 

No to po tym krótkim wstępie pora na pierwszy, prosty quest =).

 

Quest musi rozpoczęty od frazy "quest - begin".

Np :

 quest nazwa-questa begin

Jest to rozpoczęcie ciała skryptu, kompilator poznaje jego nazwę i wie od czego ma zacząć.

 

Kolejnym krokiem jest rozpoczęcie skryptu, w metinie jest to "state"

Np :

 state start begin

W przypadku pierwszego state jest to zawsze "state start"

State wyznacza nam "rozdział" questa

 

Następnie musimy postawić pierwszy warunek, zawsze jest nim "when - begin".

Np :

when funkcja begin

Jest to warunek wymyślony przez twórców gry oznacza : "gdy / kiedy funkcja to" .

 

Przykład :

 

 when login begin

Oznacza to : "gdy / kiedy zaloguje to coś się wydarzy"

 

Gdy mamy już te trzy warunki, powinniśmy uzyskać następujący efekt :

1330332846-U330049.jpg

 

No to teraz pora dać mu coś do roboty =).

 

Użyjemy prostej funkcji "say()"

Dla naszego przykładowego skryptu :

say("Hello World")

W tym przypadku wyświetli nam napis "Hello World", czyli "Witaj Świecie" .

 

Po tym dodatku należałoby zakończyć nasz skrypt za pomocą frazy "end" .

 

Krótka instrukcja dot end'ów :

 

end zamyka nam konkretny warunek, pętle, state, lub cały quest .

 

Na end kończy się :

  • quest - begin
  • state - begin
  • when - begin
  • if - then
  • for - do
  • while - do

W naszym przykładzie znajdą się trzy end'y, będzie to wyglądać następująco :

1330332990-U330049.jpg

 

Jak widać obok : quest, state, when pojawiły się tzw "drzewka" . Wyznaczają one początek i zakończenie danej instrukcji warunkowej, quest'a, when'a, state, pętli .

 

Niestety nasz quest nie jest schludny i niewygodnie czyta się go, szczególnie gdy jest długi - jak temu zaradzić ?

Odpowiedź jest prosta - TAB'y ! .

 

Każdy szanujący się programista komentuje swój program / skrypt jak i go "tabuje" .

Pokażę wam mój przykładowy sposób tabowania :

1330333062-U330049.jpg

 

Efekt takiego dzialania jest następujący :

1330333155-U330049.jpg

 

W ten sposób uzyskaliśmy "drzewo" a skrypt jest bardzo schludny i przejrzysty :)

O komentarzach w następnej cześci tutoriala .

 

To już wszystko co do prostego questa, przechodzimy dalej

 

 

 

Zmienne i Tablice

 

 

 

No to przyszła pora na zmienne i tablice, czyli najlepszych przyjaciół każdego programisty, chcącego wydajnie uprościć swój program :).

 

Wyróżniamy dwa typy zmiennych :

  • lokalne
  • globalne

Zmienna lokalna działa jedynie w obrębie jednego state, nie możemy wykorzystać jej w następnym dla niego "umarła" .

Zmienną lokalną wyznaczamy w następujący sposób :

local nazwa-zmiennej = string / int / bool / funkcja

 

Przykład zmiennej lokalnej :

 

local zmienna = '12'

Na przykładzie ukazaliśmy zmienną, która przechowuje wartość liczbową (int) : 12 .

 

Możemy użyć jej w instrukcji warunkowej, dodać, odjąć etc.

Zmienne lokalne są bardzo często wykorzystywane w questach - ułatwiają pracę .

 

Zmienna globalna dla różnicy działa w obrębie całego questa, możemy ją wykorzystać gdzie i jak chcemy .

Zmienna globalna wyznaczamy w następujący sposób :

 

nazwa-zmiennej = string / int / bool / funkcja

 

Przykład zmiennej globalnej :

 

zmienna = '12'

Tak jak w przypadku zmiennej lokalnej, zmienna globalna przyjmuje wartość liczbową (int) : 12 .

Rozpoznać je można po braku przedrostka "local" w przypadku zmiennej globalnej .

 

 

Możemy użyć jej w instrukcji warunkowej, dodać, odjąć etc.

Zmienne globalne są bardzo rzadko wykorzystywane w questach - zwykle wystarczają lokalne .

 

Każdy typ zmiennej definiujemy za pomocą znaku równości (=) a po nim deklarujemy wartość zmiennej .

 

Zmienne dzielą się jeszcze na trzy rodzaje :

  • string
  • int
  • bool

Zmienna typu string jest łańcuchem tekstowym", wyznaczamy ją rozpoczynając od cudzysłowia " i kończąc tym samym .

 

Przykład zmiennej typu string :

local zmienna = "jakis tam tekst"

Są często stosowane by móc szybko użyć jakiegoś dialogu w dalszej części questa, spotkać je możemy w : locale.lua, lecz w formie globalnej .

 

Zmienna typu int jest "liczbą całkowitą", wyznaczamy ją rozpoczynając od pojedynczego cudzysłowia i kończąc tym samym .

Przykład zmiennej typu int :

local zmienna = '12'

Są często stosowane w działaniach matematycznych, by osiągnąć rządany wynik .

 

Zmienna typu bool (bolean) jest "prawdą lub fałszem - true or false" , wyznaczamy ją od razu po znaku równości .

 

Przykład zmiennej typu bool :

local zmienna = true

Są często stosowane by uzyskać "wynik" funkcji, i móc go "wywołać" - tu kłania się tzw logika .

Np gdy coś jest prawdą to wtedy coś się wydarzy, jeśli nie - wydarzy sie co innego .

 

Warto też wspomnieć o zwrocie tj "return ".

 

Zwraca on wartości z różnych działań .

 

Przykład :

 

 zmienna = '20'
zmienna2 = '10'
zmienna3 = zmienna - zmienna2
return zmienna3

Powyższe użycie returna zwróci wynik z różnicy zmienna i zmienna2 .

Jest to jedno z wielu jego zastosowań, które opiszę później .

 

Teraz pora na tablice w LUA, można je potocznie nazwać "magazynem zmiennych" .

 

Tablice są często gęsto stosowane by kilka różnych wartości zamknąć pod jedną zmienną .

Tablice również dzielą się na :

lokalne

globalne

Według tej samej reguły co zwykłe zmienne .

 

Przykładowe tablice lokalne i globalne (jak już wiecie z zmiennych różni je przedrostek "local") :

local tablica = {id, id, id, id}

 

Tego typu tablica zawiera ciąg danych pod jedną zmienną - ma to częste zastosowanie w pętlach for .

Jak widzicie deklarujemy je tak samo jak zmienne z tą różnicą, że stosujemy klamry :).

 

Inny rodzaj tablicy :

 local tablica =
{
	[1] = {1, 2},
	[2] = {5, 7},
	[3] = {11, 22}
}

 

Tego typu tablica wygląda następująco, numery w nawiasach kwadratowych są numerami pod zmienną tzn np "local tablica[1]" .

W ten sposób zmienna lokalna o nazwie "tablica" przyjmuje wartość z pod cyfry jeden, czyli : od 1 do 2 . Można również wpisać jedną cyfrę i mieć pojedynczą wartość :).

 

W części o pętlach pokażę Wam praktyczne zastosowanie takich tablic, a w chwili obecnej to już koniec tej części - lecimy do instrukcji warunkowych :) .

 

 

 

Instrukcje warunkowe

 

 

 

 

Instrukcje warunkowe są jedną z najważniejszych części skryptu - to one nadają mu ręce i nogi :).

 

W LUA wyróżniamy następujące instrukcje warunkowe :

  • when - begin
  • if - then
  • elseif - then
  • else

Trzy ostatnie możemy nazwać "rodziną", gdyż ze sobą współpracują .

 

Krótkie definicje instrukcji warunkowych :

 

when - instrukcja warunkowa wymyślona przez twórców gry. Rozpoczyna skrypt po "state" . Oznacza - gdy / kiedy coś to coś sie wydarzy . Kończymy ją end'em.

 

if - instrukcja warunkowa "jeśli", oznacza - jeśli coś równe czemuś / jeśli coś jest prawdą lub fałszem etc . Kończymy ją end'em.

 

elseif - przedłużenie instrukcji warunkowej "if", służy do weryfikacji innej wartości pod tym samym warunkiem . Przykładowo by nie pisac 30 if'ów pod to samo, stosuje się jeden if i elseif'ów. Nie kończymy jej end'em.

 

else - zaprzeczenie głównego warunku instrukcji warunkowej "if" . Jeśli coś jest prawdą to coś sie wydarzy, jeśli nie jest (else) wydarzy sie co innego . Nie kończymy jej end'em.

 

Przykłady :

 

when :

 when login begin
say("Zalogowales sie !")
end

 

if :

if 12 == 12 then
say("To sie zgadza !")
end

 

elseif :

 if 12 == 12 then
say("To sie zgadza !")
elseif 12 < 12 then
say("No to to sie nie zgadza, bo jest rowne")
end

 

else :

if 12 == 13 then
say("To sie nie zgadza !")
else
("No sie zgadza, bo zaprzeczylismy glównemu !")
end

 

Skoro już mówimy o funkcjach wspomnijmy również o znakach używanych przy warunkach :

 

= - służy do deklarowania zmiennej , pętli itd.

== - coś równe czemuś

> - coś większe od czegoś

< - coś mniejsze od czegoś

>= - coś większe lub równe od czegoś

<= - coś mniejsze lub równe od czegoś

 

Mam nadzieję, iż takie przykłady Wam wystarczą by zrozumieć działanie i sens instrukcji warunkowych :). - przechodzimy dalej .

 

 

 

Pętle

 

 

 

 

Przyszła pora na pętle...

Pętle służą do zapętlenia, zautomatyzowania konkretnego bloku kodu .

Jest to podstawa dla szanującego się programisty .

 

w LUA wyróżniamy następujące pętle :

  • for - do
  • while - do
  • while true - do
  • repeat - until

Pętla for ma szerokie zastosowanie w LUA, jak pisałem przy niej wspomnę jeszcze o tablicach .

Dzięki pętli for możemy przykładowo zautomatyzować rozdawanie itemków w queście startowym .

Po co 300 x pisać "pc.give_item2()" ?

Możemy to zrobić za pomocą pętli for i tablicy !

 

Przykład :

 

 local tabliczka = {1,2,3,4,5,6,7,8}
for item 1, tabliczka do
pc.give_item2(item)
end

 

W powyższym przykładzie pętla for zakończy się, gdy funkcja przekaże wszystkie itemki wg id podanych przez pętle .

Pętlę for oczywiście kończymy end'em.

 

Pętla while również jest dosyć często stosowana w skrypterstwie .

Może przyjmować różnorakie warunki .

 

Przykład :

 i = 0 -- wyzerowanie licznika
while i == 0 do
i = i+1
if i == 10 then
break
end
end

 

Powyższy kod będzie wykonywał się tak długo, aż zmienna globalna "i" osiągnie wartość 10 . Wtedy instrukcja warunkowa "if" wychwyci to i przerwie pętle za pomocą "break" .

Poleceniem "break" można przerwać pętle while i while true, pamiętamy oczywiście o end na koniec .

 

Pętla while true jest jedyną pętlą "nieskończoną" w LUA .

Dlaczego nieskończoną ?

Nie przyjmuje pod siebie warunków wpisujemy jedynie "while true do" a przerywamy ją poleceniem "break" - i tak kończymy ją end'em.

 

Przykład :

 

 while true do
say("To jest przyklad")
licznik = licznik+1
if licznik == 10 then
break
else
-- kod wykonuje sie dalej.
end
end

 

Powyższy kod będzie się wykonywał do momentu, w którym licznik osiągnie wartość 10 i nasz kochany "if" przerwie pętle poleceniem "break" .

 

Pętla repeat jest jedną z ciekawych .

Jak jej nazwa mówi, powtarza kod, który był już wykonany .

Jest to przeciwieństwo pętli while, gdyż zakłada, że warunek nie został spełniony i dąży do jego spełnienia .

 

Przykład :

 

i=0
alkochol = "trzeźwy"
repeat
i=i+1
if i ==2 then
czlowiek = "upojenie"
end
until alkochol ~= "upojenie"   -- powtarzaj proces dopóki człowiek nie będzie piany .

 

Taki żartobliwy sposób użycia tej pętli :).

Jest ona bardzo rzadko stosowana, a co najważniejsze - nie kończymy jej end'em! .

 

Uważam, że dość dokładnie opisałem pętle - przechodzimy dalej.

 

 

 

Komentarze

 

 

 

 

Komentarze to drugi po tabach pomocnik programisty .

Służą do opisania bloku kodu .

 

Wyróżniamy dwa rodzaje komentarzy :

  • pojedynczy
  • blokowy

Komentarz pojedynczy rozpoczynamy od dwóch myślników tj "--" po czym wpisujemy tekst .

 

Przykład :

 -- to jest komentarz !

 

Komentarz tego typu służy do opisania jednej linijki kodu w programie .

 

Natomiast komentarze blokowe służą do wieloliniowego opisania całego bloku programu .

Rozpoczynamy je po przez "--[[" a kończymy "]]--" .

 

Przykład :

 --[[ to pierwsza linia komentarza
to druga
a to trzecia]]--

 

Więcej o komentarzach pisać nie trzeba - przejdźmy dalej :) .

 

 

 

Moduły

 

 

 

 

LUA dzieli się na wiele modułów, ja postanowiłem opisać Wam wszystkie, które mogą się przydać ! :).

  • io
  • os
  • math
  • string

modul io

 

 

 

 

Moduł io sluży do manipulacji plikami tekstowymi, jak i bez formatów / o innych formatach .

 

 

Przydatne funkcje zawarte w module :

io.input() - otwiera plik w trybie domyślnym np : io.input("/ścieżka/plik.txt")
io.open() - otwiera plik, tryb ustalamy samodzielnie np : io.open("/ścieżka/plik.txt", "tryb-otwarcia")
io.flush() - odświeża i zamyka plik
io.close() - zamyka plik
io.write() - wpisuje nową linię do pliku np io.write("to jakis tekst")
io.read() - odczytuje dane z pliku, jedną linię lub wszystko . W przypadku jednej lini io.read("*1"), w przypadku wszystkiego io.read("*all"), lub io.read()
io.lines() - odczytuje linię po lini, często stosowane w pętli for
io.tmpfile() - tworzy i otwiera plik, po czym usuwa go po zakończeniu działania skryptu np : io.tmpfile("/ściezka/plik")
io.type() - sprawdza, czy plik jest otwarty, czy zamknięty

 

Tryby otwarcia pliku :

1330438934-U330049.jpg

 

Jak widzicie moduł io jest bardzo orientacyjny i prosty w obsłudze :).

Pokażę Wam jeszcze jak za pomocą pętli for wyświetlić linijkę po linijce z pliku .

 

file = io.open("/home/badar/pliczek.txt")
for line in io.lines("/home/badar/pliczek.txt") do
say(line)
end
file:close()

 

Ten o to prosty kod wyświetli nam linijke po linijce z naszego pliku :).

 

To w sumie na tyle co do tego modułu - przejdźmy do modułu os

 

 

 

moduł os

 

 

 

 

Moduł os służy zwykle do manipulacji plikami z innego języka / manipulacji środowiskiem lub innymi tego typu operacjami .

 

Przydatne funkcje zawarte w module :

os.clock() - zwraca czas systemowy w sekundach
os.date() - zwraca systemową datę i czas w formacie : d/m/y h:m np : 13/05/05 10:32
os.difftime() - zwraca różnicę między jednym a drugim czasem tj między dwiema zmiennymi z funkcją os.clock
os.execute() - wykonuje plik np : os.execute("język pliku /ścieżka/plik.format") -- os.execute("php /home/badar/select.php")
os.exit() - zabija proces po podaniu jego nazwy np : os.exit(badar.sh)
os.getenv() - zwraca format pliku, jakim posługuje się proces np : os.getenv(badar) zwróci np badar.sh
os.remove() - usuwa plik np : os.remove("/badar/home/plik")
os.rename() - zmienia nazwę pliku np : os.rename("badar", "matias")
os.time() - zwraca obecny czas systemowy gdy podamy argument "*t"
os.tmpname() - tworzy losowy plik, ale go nie otwiera

[size=3][font=tahoma,geneva,sans-serif][b]Podsumowując najczęściej używanymi funkcjami są : os.remove, os.execute .
Osobiście używałem tych dwóch przez cały czas - reszta nie była mi potrzebna .

Myślę, że tyle wystarczy - przejdźmy do modułu math[/b][/font][/size]

 

 

 

moduł math

 

 

 

 

Moduł math jak widać służy do wykonywania obliczeń matematycznych i różnych działań .

 

Przydatne funkcje zawarte w module :

math.abs - zamienia liczby ujemne na dodatnie
math.pow - potęguje liczby pierwszym argumentem jest liczba a drugim stopień potęgi np : math.pow(7,2) zwróci 49
math.min - zwraca maksymalną minimalną liczbę
math.max - zwraca maksymalną liczbę
math.sqrt - wyciąga pierwiastek drugiego stopnia z liczby
math.ceil - zaokrągla liczby np : math.ceil(0,5) zwróci 1

 

Moduł ten jest dosyć często używany - bardzo ułatwia życie, bynajmniej mi .

Nie ma co tu więcej opisywać wg mnie - wszystko jest jasne .

 

Przejdźmy dalej do modułu string

 

 

 

moduł string

 

 

 

 

Moduł string służy do manipulowania łańcuchami tekstowymi .

 

Przydatne funkcje zawarte w module :

string.len - zlicza ilość znaków w łańcuchu tekstowym np : string.len("Badar") zwróci wartość : 5

Dlaczego opisałem jedynie ta jedną funkcję ?

Ponieważ według mnie tylko ona jest potrzebna dla questera :).

 

 

 

 

 

Własne funkcje

 

 

 

 

Każdy programista czasem potrzebuje własnej, wygodnej funkcji - teraz dowiecie się jak takową zrobić .

Zaczniemy od podstawy funkcji, czyli jej szkieletu .

 

Wygląda on następująco :

 

function nazwa-funkcji(argument) -- może być ich więcej
--kod funkcji--
end

 

Jest to podstawowy szkielet funkcji, możemy dodać tam dosłownie wszystko .

Teraz pewnie zadajecie sobie pytanie - ale jak uzyskać wynik ?!

To proste - return !

 

Przykład :

 

function przykład(liczba1, liczba2)
wynik = liczba 1 - liczba2
return wynik
end

 

Ta funkcja wykona działanie matematyczne tj odejmowanie i zwróci jego wynik .

Nie wiem co by tu więcej pisać o własnych funkcjach, myślę, że tyle wystarczy .

Składnia i konstrukcja zawsze będzie taka sama :).

 

 

 

funkcje metin2

 

 

 

Tu bez owijania w bawełnę, w code umieszczam wszystkie funkcje + przykład i definicję :)

 

Funkcje dungeon (prefix d. / dungeon. / pc.) -- stosowane w dungeonach .

 

 

 


 

 

Funkcje ox (prefix ox.) -- stosowane podczas eventu ox .

[/size]
[size=3]oxevent.close -- zamyka event ox (wstęp na event)[/size]
[size=3]oxevent.end_event -- kończy event ox[/size]
[size=3]oxevent.end_event_force -- nie wiem[/size]
[size=3]oxevent.get_attender -- nie wiem[/size]
[size=3]oxevent.get_status -- sprawdza, czy ox jest włączony[/size]
[size=3]oxevent.give_item -- daje nagrode za event[/size]
[size=3]oxevent.open -- otwiera konkurs ox[/size]
[size=3]oxevent.quiz -- zadaje pytanie[/size]
[size=3]add_ox_quiz -- dodaje event ox[/size]
[size=3]end.oxevent - zakańcza event ox[/size]
[size=3]

Funkcja arena (prefiks arena.) -- stosowane przy arenie PvP .

[/size]
[size=3]arena.add_map - dodaje index mapy pod arenę np arena.add_map(index)[/size]
[size=3]arena.add_observer - dodaje obserwatora na arenę[/size]
[size=3]arena.get_duel_list - pobiera listę walk na arenie[/size]
[size=3]arena.is_in_arena - sprawdza, czy gracz na arenie[/size]
[size=3]arena.start_duel - rozpoczyna walkę na arenie[/size]
[size=3]

funkcje forked (prefiks forked.) -- stosowane podczas wojny królestw .

forked.getbosskillcount  nie wiem[/size]
[size=3]forked.getdeadcount  nie wiem[/size]
[size=3]forked.getlevellimit  nie wiem[/size]
[size=3]forked.getpassmapindex  nie wiem[/size]
[size=3]forked.getpassmapindexbyempire  nie wiem[/size]
[size=3]forked.getpasspath  nie wiem[/size]
[size=3]forked.getpasspathbyempire  nie wiem[/size]
[size=3]forked.getpassstartposx  nie wiem[/size]
[size=3]forked.getpassstartposy  nie wiem[/size]
[size=3]forked.getsungzimapindex  nie wiem[/size]
[size=3]forked.getsungziposx  nie wiem[/size]
[size=3]forked.getsungziposy  nie wiem[/size]
[size=3]forked.get_dead_count  nie wiem[/size]
[size=3]forked.get_pass_path_by_empire  nie wiem[/size]
[size=3]forked.get_pass_start_pos  nie wiem[/size]
[size=3]forked.get_sungzi_start_pos  nie wiem[/size]
[size=3]forked.incbosskillcount  nie wiem[/size]
[size=3]forked.init  nie wiem[/size]
[size=3]forked.initforked  nie wiem[/size]
[size=3]forked.initkillcount  nie wiem[/size]
[size=3]forked.initmobkillcount  nie wiem[/size]
[size=3]forked.init_kill_count_per_empire  nie wiem[/size]
[size=3]forked.isforkedmapindex  nie wiem[/size]
[size=3]forked.issungzimapindex  nie wiem[/size]
[size=3]forked.is_forked_mapindex  nie wiem[/size]
[size=3]forked.is_registered_user  nie wiem[/size]
[size=3]forked.is_sungzi_mapindex  nie wiem[/size]
[size=3]forked.pass_mapindex_by_empire  nie wiem[/size]
[size=3]forked.pass_mapindex_by_empire  nie wiem[/size]
[size=3]forked.purge_all_monsters  nie wiem[/size]
[size=3]forked.register_user  nie wiem[/size]
[size=3]forked.setdeadcount  nie wiem[/size]
[size=3]forked.set_dead_count  nie wiem[/size]
[size=3]forked.sungzi_mapindex  nie wiem[/size]
[size=3]forked.sungzi_start_pos  nie wiem[/size]
[size=3]forked.warp_all_in_map  nie wiem[/size]

[size=3]

funkcje gildi (prefiks guild. / building.) -- stosowane przy questach gildii .

[/size]

[size=3]

funkcje item (prefiks item.) -- sprawdzają id itemków, ilość, + ulepszenia, ile kratek zajmują, na jaki są poziom, czy są w odpowiednim polu etc .

[/size]
[size=3]item.can_over9refine[/size]
[size=3]item.change_to_over9[/size]
[size=3]item.get_cell[/size]
[size=3]item.get_count[/size]
[size=3]item.get_id[/size]
[size=3]item.get_level[/size]
[size=3]item.get_name[/size]
[size=3]item.get_over9_material_vnum[/size]
[size=3]item.get_refine_vnum[/size]
[size=3]item.get_size[/size]
[size=3]item.get_socket[/size]
[size=3]item.get_sub_type[/size]
[size=3]item.get_type[/size]
[size=3]item.get_value[/size]
[size=3]item.get_value[/size]
[size=3]item.get_vnum[/size]
[size=3]item.has_flag[/size]
[size=3]item.next_refine_vnum[/size]
[size=3]item.over9refine[/size]
[size=3]item.remove[/size]
[size=3]item.select[/size]
[size=3]item.select_cell[/size]
[size=3]item.set_socket[/size]
[size=3]item_log[/size]
[size=3]item_name[/size]
[size=3]item.vnum[/size]
[size=3]

funkcje pc (prefiks pc.) -- pobierają informacje o graczu, grupie skili etc. Tu wymienione same "get" i inne sprawdzające .

[/size]

[size=3]

funkcje mountów -- do jazdy etc .

 

 

[/size]
pc.is_mount -- sprawdza, czy gracz siedzi na mouncie
pc.unmount -- usuwa gracza z mounta
pc.mount -- usadza gracza na mouncie
pc.mount_bonus -- dodaje bonus od mounta (działa tylko, gdy gracz siedzi na mouncie)
[size=3]

 

funkcje npc (prefiks npc.)

 

 

 

npc.dec_remain_hairdye_count
npc.dec_remain_skill_book_count
npc.getrace
npc.get_empire
npc.get_guild
npc.get_race
npc.get_remain_hairdye_count
npc.get_remain_skill_book_count
npc.is_near
npc.is_near_vid
npc.is_pc
npc.is_quest
npc.kill
npc.lock
npc.open_shop
npc.purge
npc.unlock
npc_get_job
npc_is_same_empire
npc_is_same_job

 

 

 

 

funkcje mariage (prefiks marriage.) -- funkcje stosowane w questach ślubu .

 

 

 

marriage.divorce_time_check
marriage.end_wedding
marriage.engage_to
marriage.find_married_vid
marriage.get_married_time
marriage.get_wedding_list
marriage.in_my_wedding
marriage.join_wedding
marriage.marry_to
marriage.remove
marriage.set_to_marriage
marriage.warp_to_my_marriage_map
marriage.wedding_client_command
marriage.wedding_dark
marriage.wedding_is_playing_music
marriage.wedding_music
marriage.wedding_snow

 

 

 

LUA-SQL

 

 

 

LUA-SQL - co to i do czego słuzy ?

 

LUA-SQL to sposób na pobieranie danych z bazy lub dodawanie nowych .

Stosujemy do tego "query" .

Opis i kurs SQL macie w przydatne linki .

 

Do questlib.lua


function query(query,user,pw)
local var = {}
var.pre = ''
if user ~= nil then
var.pre = var.pre..' -u'..user
end
if pw ~= nil then
var.pre = var.pre..' -p'..pw
end
var.scriptfile = 'sc_'..pc.get_name()
var.outputfile = 'op_'..pc.get_name()
query= string.gsub(query,'"',"'")
var.str = "mysql -N -L "..var.pre.." < "..var.scriptfile.." > "..var.outputfile
script = io.open(var.scriptfile,"a+")
script:write(query)
script:close()
os.execute(var.str)
zwroc = io.open(var.outputfile)
pc.setqf("quer", zwroc:read())
zwroc:flush()
zwroc:close()
os.remove(var.scriptfile)
os.remove(var.outputfile)
return pc.getqf("quer")
end

 

Do quest_functions

 

query

 

Przykład :

 

quest test begin
state start begin
when 11.use begin
local c = query("SELECT job FROM player.player", "mt2", "mt2!@#")
say("Twoja klasa to "..c.."")
end
end
end

 

 

 

przydatne linki

 

 

Tu będę zamieszczał wszystkie linki, które mogą się Wam przydać podczas ćwiczeń / nauki LUA :).

Znajdą się tu też różne ciekawe kursy, które Was wspomogą .

Wszystko stosownie podzieliłem według kategorii .

 

LUA :

 

http://lua-users.org/wiki/

http://www.psp-programming.com/forums/index.php/topic,1269.0.html

 

SQL :

 


http://www.php.rk.edu.pl/w/p/podstawy-jezyka-sql/

http://www.php.rk.edu.pl/w/p/pobieranie-rekordw/

http://www.wykop.pl/ramka/531833/darmowy-kurs-pl-sql/

przydatne funkcje

 

 

 

Tu umieszczam funkcje, które pisałem dla siebie - mi ułatwiły robotę .

Dodajemy je do questlib.lua i quest_functions .

Mam nadzieję, że się przydadzą :).

 

stoper_sec() -- używamy na początku questa, zwracamy sobie na końcu i podaje nam czas ukończenia czegoś w sekundach.

function stoper_sec()
pc.setqf("stop", get_time())
return get_time()-pc.getqf("stop")
end

 

wpis() -- ta funkcja wpisuje nam jakąś treść do podanego pliku w podanej ścieżce.


function wpis(sciezka,nazwa,text)
io.output(sciezka..nazwa)
io.write(text)
io.flush()
io.close()
end

 

 

 

Ostatnia aktualizacja : 2.03.2012 godzina : 12:56

Planowane zakończenie poprawek : 2.03.2012 godzina : 21:00

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

____________________________________________________________________

Wykonał badar specjalnie dla mpcforum.pl © 2012 all rights reserved !

Zakaz kopiowania, cytowania i temu podobnych .

  • Odpowiedzi 75
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

Oooo... No, no jak mówiłeś, tak jest. Tutorial super, dzięki wielkie :)

Poszukuje pluginu Gr2 do 3Ds max 2012.

haac.jpg

 

Jestem jaki jestem i tego NIE zmienię!

 

 

 

Moje Tut'y

 

Video tut jak dodać mapę na swój serwer:

http://www.mpcforum.pl/topic/416201-videotut-jak-dodac-mape-na-wlasny-serwer/page__gopid__2960589#entry2960589

Texture Mod:

http://www.mpcforum.pl/topic/406659-download-texture-mod/page__p__2892270__fromsearch__1#entry2892270

Znaczek GM:

http://www.mpcforum.pl/topic/367597-dl-znaczek-gm/page__p__2603024__fromsearch__1#entry2603024

Nowe Zbroje By Baso:

http://www.mpcforum.pl/topic/478940-dltutzbroje-by-baso/

 

Opublikowano

Na pewno się przyda . osobiście poczytam wszystko . Może się czegoś nauczę a może i nie , ale zawsze te 10% treści zapamiętam . Dziękuję . <3

Opublikowano

Widzę, że tutorial cieszy się zainteresowaniem =).

 

Dziś poprawię estetykę, dodam przydatne linki, i dopiszę resztę funkcji :).

 

 

@Down - wiem, to za 30 min + poprawie, bo odpocząć chcę ; p

Opublikowano

Popraw, że najpierw piszesz rozpocznij quest, a później when, a na końcu state.

A tak to nice tut :D

 

Poprawione, taka mała pomyłka ^^

Opublikowano

Szczerze mówiąc napracowałeś się, ale ten kto choć trochę uczył się kiedyś języka C++, tak jak ja, wszelkie pętle, include'owanie, stringi i inne będzie znał na pamięć, ale nie zaszkodzi sobie przypomnieć bądź utrwalić, zaskoczyło mnie to że posiadasz tak wiele funkcji dla Metin2, monstrualna ilość :D

 

@Edit

 

A dla osób zainteresowanych językiem C++ polecam książkę Jerzego Grębosza -> Symfonia C++ Standard, warto kupić :)

screenshot_10.jpg


Opublikowano

Up kusicielka.. jedna prośba.. daj to w spoiler. To tak nie wiele a tak dużo zarazem.

 

Arthir już nic, admin skasował post wyżej.

sygnatura2.png


Opublikowano

Szczerze mówiąc napracowałeś się, ale ten kto choć trochę uczył się kiedyś języka C++, tak jak ja, wszelkie pętle, include'owanie, stringi i inne będzie znał na pamięć, ale nie zaszkodzi sobie przypomnieć bądź utrwalić, zaskoczyło mnie to że posiadasz tak wiele funkcji dla Metin2, monstrualna ilość :D

 

@Edit

 

A dla osób zainteresowanych językiem C++ polecam książkę Jerzego Grębosza -> Symfonia C++ Standard, warto kupić :)

 

Ja tego tutka jeszcze nie skończyłem :).

 

Zajrzyj tu jutro max po 21:00 i zobaczysz znaczne różnice =)

 

Cieszę się, że pomogłem .

Opublikowano

Pytanie do Badara , czy resztę funkcji Metin2 wyjaśnisz ? Tamte co są praktycznie od połowy . =\

 

Jasne, że tak - postaram się wszystkie =).

 

Po prostu teraz odpoczywam, do jutra wykończę tutka.

Opublikowano

Wystarczy w małym stopniu znać j.angielski, i prawie wszystkie funkcje są zrozumiałe :P

screenshot_10.jpg


Opublikowano

for item 1,#tabliczka do

To raczej wywali błąd w konsoli typu : unexpected symbol near '#'.

 

umarł

Opublikowano

for item 1,#tabliczka do

To raczej wywali błąd w konsoli typu : unexpected symbol near '#'.

 

Nie wywali, gdyż tak jest w oryginalnym LUA (upewniałem się, nim się za to brałem) . Jeśli jednak wywali, to jest to bardzo, ale to bardzo dziwne Oo .

 

@Topic - nie długo skończę poprawiać estetykę + dodam "przydatne linki"

Opublikowano

Specjalnie to sprawdziłem i u mnie wywaliło błąd.

 

http://desmond.image....png&res=medium

 

Na 100% zadziała to ale w czystym lua, ale wątpię aby tutaj.

 

 

quest testicho begin
state start begin
when 20011.chat."TABLICA" begin
local tabliczka = {19,29}
for tablica = 1, 2 do
pc.give_item2(tabliczka[tablica])
end
end
end
end

W ten sposób działa, ale używając zamiast '2' : '..tabliczka..' czy łatewa to nie zadziała.

Dobrze Cię zrozumiałem ?

 

@edit

dodatkowo dodaj :

d.set_warp_at_eliminate -- ustala warp po wyeliminowaniu potworów np. : d.set_warp_at_eliminate(2, d.get_map_index(), (2048+103), (6656+430), "data/dungeon/trolo/trolo_resp1.txt") -- 2 oznacza po jakim czasie (w sekundach) ma przenosić, zamiast "data/dungeon..." można użyć każdej innej funkcji

 

 

table.foreachi :

local t = {" = jeden" , " = dwa" , " = trzy"}
table.foreachi(t, say)

 

efekt :

forea.png

 

Nie widzę zastosowania ale zawsze będzie dodatkiem.

Tak samo można użyć table.foreach

table.foreach({" = jeden" , " = dwa" , " = trzy"}, say)

Efekt ten sam.

 

 

table.insert :

local tabela = {}
table.insert(tabela, 1, "tekst")
table.insert(tabela, 2, "HEHE")

for i = 1, 2 do
say(i.." = "..tabela[i])
end

efekt :

insertl.png

 

Oczywiście można użyć innego zastosowania, to są tylko przykłady.

 

table.remove :

local tabela = {"test", "test2", "test3", "test4"}
table.remove(tabela, 1)
for i = 1, 4 do
say(i.." = "..tabela[i])
end

 

efekt :

removeb.png

 

Mam nadzieję, że się przyda. peace.

 

 

edit2@

 

select_table :

local tabela = {"WYNIK 1" , "WYNIK 2" , "WYNIK 3" , "WYNIK 4"}
local sprawdz = select_table(tabela)
if sprawdz == 1 then
say("Wybrałeś jedynkę.")
elseif sprawdz == 2 then
say("Wybrałeś dwójkę.")
end

 

efekt :

 

selectc.png

 

Dodaj to wszystko do swojego tutka oraz dodaj, że funkcje typu os. trzeba najpierw wgrać do quest_functions, inaczej pokażę błąd, że nieznana funkcja (po prostu dzieciom odkrywam niebo).

 

umarł

Opublikowano

Specjalnie to sprawdziłem i u mnie wywaliło błąd.

 

http://desmond.image....png&res=medium

 

Na 100% zadziała to ale w czystym lua, ale wątpię aby tutaj.

 

No to wtedy #tabliczka zamienić na tabliczka a w pc.give_item2(item) tylko dać ^^

 

Zaraz to poprawię - jeśli możesz to stestuj i daj edit, ale ot musi śmigać ; D

Opublikowano

No tut zajebisty!

Ja i tak nie za bardzo lubię skryptować.. Jakoś mam tą satysfakcje jak po napisaniu kodu klikne build etc. ;D

Mi się puki co nie przyda ale szacun za napisanie tyle wyrazów, zdań etc.

 

I Like It ;P

1365881062-U68160.png

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...