Witamy na GTAOnline Obecny czas to 2018-12-15, 14:38 Użytkowników: 76997
Strona główna | Użytkownicy | Grupy | Faq | Regulamin | Zaloguj

Poprzedni temat :: Następny temat
Lua Kurs Lekcja nr. 7
Autor Wiadomość

marcin778 
Krytyk serwerów MTA





Informacje
Nick w MP: Marcineg
Wiek: 30
Na forum: 1422 dni
Posty: 2183
Piwa: 4862
Respekt: 1086,8
Respekt: 1086,8

Wysłany: 2017-12-21, 17:33   Lua Kurs Lekcja nr. 7



Witam!
W siódmej części poznamy funkcje z lua a konkretnie funkcje 'string.' były 'math.' to czas na stringi. Oprócz tego zajmę się wytłumaczeniem funkcji getTickCount oraz przypomnimy sobie setTimer.

string.byte
Funkcja string.byte zwraca kod liczbowy danego znaku z ciągu.
Przykładowo

print(string.byte("LUA",3))
Taki kod zwróci nam
Kod:

65
Czyli wartość liczbową liczby "A", jeśli zrobilibyśmy zamiast 3 to 1 to zwróciło by nam
Kod:

76
czyli wartość liczbową liczb "L".

string.char
Funkcja ta generuje literowy ciąg znaków z podanych liczb. Jak wcześniej wspomniałem liczbową wartością "A" jest 65 a "L" 76, więc
print(string.char(65,76))
wygeneruje nam znaki spod tych liczby czyli A i L. Zwróci nam
Kod:

AL


string.dump
Funkcja string.dump zwraca funkcje w postaci kodu binarnego. Funkcja musi być funkcją lua, czyli w mta za bardzo tego nie mamy jak wykorzystać.

string.find
Funkcja string.find służy np. do sprawdzania czy jest jakiś znak w ciągu, aczkolwiek zwraca pewne wartości, konkretnie liczbę znaku od którego zaczyna się nasz wyszukiwany znak i liczbę znaku gdzie się kończy. Przykładowo

local ciag "jacekmarekjozek"
if string.find(ciag"marek"then
 print("find",string.find(ciag,"marek"))
else
 print("not find")
end
Taki kod zwróci nam
Kod:

find
, ponieważ w całym tym ciągu znajduje się wyraz "marek". Oraz zwróci nam
Kod:

6,10
Dlaczego? a no dlatego, że nasz ciąg znaków "jacekmarekjozek" ma w sumie 15 liter, a wyraz "marek" zaczyna się od 6 litery i kończy na 10 literze stąd te wartości.

string.format
Funkcja string.format formatuje nasz string zgodnie z podanymi argumentami. Informacja jest dodatkowa, że %q formuje nam string w cytat. Głównym elementem w tej funkcji jest metoda formatowania, czym jest takowa metoda? Otóż jest to tak zwany "regex" w wielu językach programowania jest on używany. Przykładowo

print(string.format("%s %q %d""LUA""lua","30"))
Taki kod zwróci nam
Kod:


LUA
"lua"
30
Bardzo ważna tutaj jest umiejętność i wiedza na temat regex'u. Regex to wyrażenia regularne. Czym jest regex i kurs: klik W każdym kursie jest znak / zamiast %. % jest używany w lua zamiast /. Funkcja przyjmuje nieskończenie wiele argumentów, możemy ich podać ile chcemy.

string.gmatch
Funkcja string.gmatch zwraca sformatowany string, tutaj również kłania się regex.

for word in string.gmatch("Lua kurs jest fajny""%a+") do print(wordend
Taki kod zwróci nam
Kod:


Lua
kurs
jest
fajny
Czyli rozdzieli nam słowa po spacji.

string.gsub
Funkcja string.gsub jest potężną funkcją. Można za jej pomocą zamienić jakiś znak z całego ciągu, opcjonalny argument 'n' ogranicza nam ilość zamian. Kolejno, funkcja ta przyjmuje argument s,pattern,replace i opcjonalne n.
Kod:


s- string/ciąg znaków, z którego będziemy coś zamieniać.
pattern- znak do zamiany
replace- zastąpienie, znak którym ma zostać zastąpiony ten z argumentu pattern.
n- ilość zamian.
Czyli

local string "jacek to wacek"
print(string)
taki kod zwróci nam
Kod:

jacek to wacek
a więc zamieniamy,

local string "jacek to wacek"
local formated string.gsub(string,"wacek","fajny kolega")
print(formated)
i taki kod zwróci nam
Kod:


jacek to fajny kolega
Teraz coś z przykładem wykorzystania argumentu n.

local string "jazek to zool ziom"
print(string)
taki kod zwróci nam
Kod:

jazek to zool ziom
bez sens prawda? Trzeba to napawić

local string "jazek to zool ziom"
local formated string.gsub(string,"z","c")
print(formated)
i taki kod zwróci nam złą wartość bo
Kod:

jacek to cool ciom
Dlatego musimy użyć argumentu n, który spowoduje zamianę "z" na "c" podaną ilość razy.

local string "jazek to zool ziom"
local formated string.gsub(string,"z","c",2)
print(formated)
i taki kod zwróci nam nasz oczekiwany efekt
Kod:


jacek to cool ziom
W przypadku znaków specjalnych jest również pewna zasada,

local kwota "200 $"
local formated string.gsub(kwota,"$","PLN")
print(formated)
taki kod nie zamieni nam $ na PLN a zamieni nam na
Kod:


200 $PLN
Dlaczego? Ponieważ $ to znak specjalny a zarazem można powiedzieć, że wyrażenie regularne tak więc trzeba odpowiednio to oznaczyć, znakiem z regexu domyślnie / a w lua %.

local kwota "200 $"
local formated string.gsub(kwota,"%$","PLN")
print(formated)
No i wynik
Kod:

200 PLN
.

string.len
Funkcja string.len zwraca długość czy też ilość znaków, podanego ciągu znaków.

local string ="jacekmarekjozek"
print(string.len(string))
Zwróci nam
Kod:

15
Gdyż jest to po prostu 15 liter. Aczkolwiek jak wiadomo ciągi znaków w lua mają rozmiar 8 bajtów więc np

local string "jacekmarek{TEXT}0jozek"
print(string.len(string))
Taki kod zwróci nam również
Kod:

15
gdyż \000 zostanie zignorowane. Tam jest
Cytat:

\000
gtao zamienia to na "(TEXT)".

string.lower
Funkcja string.lower zamienia nam podany ciąg znaków na małe litery.

local string "LUA kurS"
print(string.lower(string))
Wynik
Kod:


lua kurs


string.upper
Funkcja string.upper zamienia nam w przeciwieństwie string.lower podany ciąg znaków na duże litery.

local string "lua kurS"
print(string.upper(string))
i wynik
Kod:

LUA KURS


string.match
Funkcja string.match wyodrębnia tylko podane ciągi. Czyli również mamy doczynienia z regexem.

local string "Kurs lua 7 część"

local m string.match(string,"%a+ %d+")

print(m)
Kod zwraca nam
Kod:


lua 7
Dlaczego to każdy będzie wiedział, gdy zrozumie regex.

string.rep
Funkcja string.rep przyjmuje dwa argumenty 's' który jest ciągiem znaków i 'n' który jest ilością powtórzeń.
Czyli funkcja ta jakby 'klonuje' nam podany ciąg ileś razy.

local string "lua kurs"
print(string.rep(string,7))
Wynik
Kod:


lua kurs lua kurs lua kurs lua kurs lua kurs lua kurs lua kurs
Można też tak

local string "lua kurs\n"
print(string.rep(string,7))
Wynik
Kod:


lua kurs
lua kurs
lua kurs
lua kurs
lua kurs
lua kurs
lua kurs


string.reverse
Funkcja string.reverse odwraca nam podany ciąg znaków,

local string "lua kurs"
print(string.reverse(string))
Wynik
Kod:


sruk aul


string.sub
Funkcja string.sub zwraca jakby część ciągu znaku od podanej liczby jako argument i kończy się na opcjonalnym argumencie jeśli jest.

local string "lua kurs"
print(string.sub(string,3))
Taki kod zwróci nam
Kod:

a kurs
czyli zacznie od 3 znaku i skończy się na końcu ciągu, gdyż nie podaliśmy opcjonalnego argumentu końca.

local string "lua kurs"
print(string.sub(string,3,6))
i wynik
Kod:

a ku
czyli zacznie od 3 znaku a skończy na 6. Spacja też się liczy jako znak Możemy też operować od końca,

local string "lua kurs"
print(string.sub(string,-8,-3))
i wynik
Kod:

lua ku
, bo -8 to od końca "L", czyli l, a -3 to od końca "U" czyli u. Tak więc leci nam od -8 (L) do -3 (u)
Myślę, że chyba prościej wytłumaczyć się tego nie da.

Funkcje te możemy ze sobą łączyć, używać string.format w string.gsub itd jeśli zachodzi konieczność.

Wszystkie te string. możemy zamienić na krótszą wersję, czyli nasza zmienna ciągu znaku:funkcja np.

local string "lua kurs"
print(string:reverse())
zwróci nam również
Kod:

sruk aul


Tak samo możemy z wszystkimi pozostałymi funkcjami. Czas na temat numer dwa.

getTickCount
Funkcja getTickCount jest spotykana coraz częściej, zazwyczaj używana jest w animacjach gui czy też dx. Funkcja ta zwraca czas w milisekundach od uruchomienia serwera, na stronie client zwraca czas w milisekundach od momentu połączenia się z serwerem. Dzięki tej funkcji możemy sprawdzić ile czasu minęło między jakimiś zdarzeniami. Przykładowo

addCommandHandler("startTick",function(plr,cmd)
tick getTickCount()
outputChatBox("Ruszyło odliczanie.",plr)
end)

addCommandHandler("czas",function(plr,cmd)
  local newTick getTickCount()
  local result = (newTick tick) * 1000
  outputChatBox("Upłynęło "..result.." sekund od wystartowania.",plr)
end)
Taki kod gdy wpiszemy /startTick rozpocznie naliczać czas w milisekundach a gdy wpiszemy /czas to pokaże nam się informacja ile czasu minęło między wpisaniem startTick a czas w milisekundach, a że jest * 1000 to informacja pokaże nam w sekundach. Jedna sekunda to 1000 milisekund(ms)

Przykładowo robimy system AFK i chcemy co 30 sekund sprawdzać czy gracz nie ma elementdaty "afk", nie zrobimy tego w timerze tylko chcemy to zrobić w renderze. Więc użyjemy funkcji getTickCount.


lastAction getTickCount()
addEventHandler("onClientRender",root,function()
 if getTickCount() - lastAction >= 1000 30 then
    if not getElementData(localPlayer,"afk"then
     setElementData(localPlayer,"afk",true)
   end
 end
end)

addEventHandler("onClientRestore",root,function()
 lastAction getTickCount()
 setElementData(localPlayer,"afk",false)
end)

addEventHandler("onClientMinimize",root,function()
  setElementData(localPlayer,"afk",true)
end)

addEventHandler("onClientCursorMove",root,function()
 lastAction getTickCount()
   if getElementData(localPlayer,"afk"then
     setElementData(localPlayer,"afk",false)
  end
end)

addEventHandler("onClientKey",root,function()
  lastAction getTickCount()
   if getElementData(localPlayer,"afk"then
     setElementData(localPlayer,"afk",false)
   end
end)
Czyli pokrótce, w renderze sprawdzamy czy czas między obecną chwilą a ostatnią akcją gracza jest większy lub równy 30 sekund, jeśli tak to ustawia gracza jako afk. Następne zdarzenia są gdy gracz zminimalizuje grę wtedy ustawiamy mu afk, gdy wróci do gry to zdejmujemy afk. Gdy gracz poruszy kursorem to odnawiamy naszego ticka z ostatnią akcją, ponieważ gracz właśnie ją wykonał to ustawiamy go od nowa, no i jeśli jest afk to zdejmujemy mu afk ponownie. Jeśli wcisnął jakiś klawisz to również ustawiamy od nowa ticka gdyż wykonał akcję i odlicza od nowa. Gdy po 30 lub ponad 30 sekundach gracz nie ruszył myszką, nie wcisnął klawisza no to ponownie ustawiamy mu afk.

Chyba dość prosto i jasno to wytłumaczyłem.

setTimer
No i funkcja setTimer jak wiadomo jest to taki minutnik tyle, że w milisekundach. Przykładowo jeśli co minutę (60 sekund, 60000 milisekund) ma się wyświetlać jakiś komunikat to nie będziemy robić ticków bo to bez sensu w tym wypadku, ustawimy timer.


setTimer(function()
   outputChatBox("Minęła minuta.",root)
end60*1000,0)
60*1000 Bo 60000 ms, możemy wpisać zamiast 60*1000 to 60000 ale jak kto woli. 60*1000 czyli 60000 ms, czyli 60 sekund, a 60 sekund to minuta. 0 To ilość powtórzeń, jak wiadomo gdyby 0 miało oznaczać dosłowne zero to byłoby to bez sensu, jeśli nie ma być timera to go nie dajemy. Dlatego 0 oznacza bez przerwy czyli co minutę będzie się to działo. Jeśli byśmy dali 1 to tylko raz po minucie, jeśli 5 to co minutę 5 razy itd. Jak wiadomo timer zawiera argument funkcji, w przykładzie wyżej podałem funkcję od razu w argumencie, a możemy tam podać gotową funkcję np

setTimer(setElementData30*1000,1,gracz,"data",false)
czyli po 30 sekundach ustawi elementdatę "data" dla gracza na false.
W przypadku gdy stosujemy taką budowę jak w 1 przykładzie i przekazujemy argument to musimy go zadeklarować odpowiednio.


addCommandHandler("ots",function(plr,cmd)
   setTimer(function(plr)
     outputChatBox("timer opanowany !",plr)
   end10*1000,plr)
end)
Po 10 sekundach od wpisania ots wyświetli się informacja na chacie. Przekazujemy plr gdyż to argument z funkcji addCommandHandler i dlatego musimy go przekazać również do timera.

Przydatne linki
Spis funkcji string. w lua: http://lua-users.org/wiki/StringLibraryTutorial
Wyrażenia regularne(Regex): ftp://ftp.kis.p.lodz.pl/p...sik/LM_Lab3.pdf
Lua demo online (do testowania różnych funkcji LUA, nie obsługuje funkcji mta.): https://www.lua.org/cgi-bin/demo

Cieszę się, że po tylu częściach nadal te poradniki się komuś przydają a kolejne części są ciepło witane. Jest to już 7 część z czego jestem zadowolony, że nadal się nie znudziło.



_________________
Pomagam w miarę możliwości Discord: marcin778#7316
Również robię skrypty na zamówienie.

Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

Jak to rzekł pewien mądry człowiek, są ludzie, którym lepiej ustąpić. Nie z powodu strachu lecz z powodu ich głupoty, która prowadzi donikąd.

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- obecnie
Postaw piwo autorowi tego posta
 
Więcej szczegółów
Wystawiono 7 piw(a):
BarteQ03, Szydlo, Eitho, PolskiHaski, ORIEL, kamilryb1, WaskiGaming

koxpl2x22 
MAPPER-ALLEREK





Informacje
Nick w MP: ALLEREK
Wiek: 15
Na forum: 1828 dni
Posty: 366
Piwa: 1221
Respekt: 76,8

Wysłany: 2018-01-03, 22:25   



Dawaj MySQL(tworzenie skryptu do exportów i obsługiwanie samych exportów - np wyciągniecie czegoś z bazy danych i ustawienie tego jako element datę etc.

_________________

Destiny, czy znasz swoje przeznaczenie?
Postaw piwo autorowi tego posta
 

PolskiSebek12 
Programista





Informacje
Nick w MP: CrosRoad95
Wiek: 20
Na forum: 1619 dni
Posty: 370
Piwa: 2390
Respekt: 293,5
Respekt: 293,5Respekt: 293,5Respekt: 293,5

Wysłany: 2018-01-07, 19:36   



poradnik nie tłumaczy jak działają dane funkcje
zamiast
Kod:

string.byte
Funkcja string.byte zwraca kod liczbowy danego znaku z ciągu.


powinno być
Kod:


table/int string.byte (string s [,int i [,int j]])
s - ciąg znaków z którego chcesz otrzymać kody znaków
i - indeks znaku którego kod chcesz otrzymać / początek zakresu indeksów. Domyślna wartość: 1
j - koniec zakresu indeksów. Zwraca tabelę kodów znaków od indeksu i do j

jak dla mnie poradnik jest bezużyteczny gdyż źle tłumaczy dość ważne metody w języku lua

_________________
Kontakt discord: CrosRoad95#4425
Szeryf polskiej sceny mta.
Współpracuje z twórcami MTA:SA.

Tworzę serwer RPG REALM. www.mtarealm.pl
Discord tegoż serwera: https://discord.gg/UDasvH

Postaw piwo autorowi tego posta
 

Szydlo 
Stance Works





Informacje
Nick w MP: Szydlo
Wiek: 18
Na forum: 857 dni
Posty: 346
Piwa: 3
Respekt: 85,3

Wysłany: 2018-02-14, 21:59   



PolskiSebek12, Wystarczy myśleć logicznie, masz przykłady. Tak w ogóle ty podałeś składnie, a marcin778, napisał co robi ta funkcja. Poradnik jest użyteczny, ponieważ wszystko jest w jednym miejscu oraz jest wszystko opisane.

_________________
Aktualny najlepszy kontakt do mnie: Szydlo#8134 (Discord)
Postaw piwo autorowi tego posta
 
Tagi: lua :: kurs :: lekcja :: nr.
Anonymous



Dołaczył: Wczoraj 0:00
Posty: 1
Skad: google.com


Anonymous Koniecznie zajrzyj na:







Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Wersja do druku

Skocz do:  


phpBB by Przemo modified by xXx 2003-2016

Template GTAONLINE created by gtaonline.pl



Strona wygenerowana w 0,67 sekundy. Zapytań do SQL: 19