Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2017-12-21, 17:33


marcin778

Krytyk serwerów MTA






Wiek: 24
Na forum: 4149 dni
Posty: 2268
Nick w MP: Marcineg

Piwa: 4662

Respekt: 1436,8
Respekt: 1436,8

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.



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

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- dawniej
Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 9 piw(a):
Avenged, Szydlo, Eitho, PolskiHaski, ORIEL, kamilryb1, WaskiGaming, kamison, Maniekxx
Wysłany: 2018-01-03, 22:25


koxpl2x22

MAPPER-ALLEREK






Wiek: 23
Na forum: 4556 dni
Posty: 375
Nick w MP: ALLEREK

Piwa: 1726

Respekt: 142,5
Respekt: 142,5

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.

Postaw piwo autorowi tego posta
 

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


PolskiSebek12

Programista






Wiek: 28
Na forum: 4347 dni
Posty: 343
Nick w MP: CrosRoad95

Piwa: 3883

Respekt: 288,8
Respekt: 288,8Respekt: 288,8Respekt: 288,8

Ostrzeżeń: 100%
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

Podpis
Postaw piwo autorowi tego posta
 

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


Szydlo

Stance Works






Wiek: 25
Na forum: 3585 dni
Posty: 343
Nick w MP: Szydlo

Piwa: 4

Respekt: 105,3
Respekt: 105,3

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.

Podpis
Aktualny najlepszy kontakt do mnie: Szydlo#8134 (Discord)
Postaw piwo autorowi tego posta
 

 
Tagi: lua :: kurs :: lekcja :: nr.
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » LUA » Poradniki do LUA » Lua Kurs Lekcja nr. 7 Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

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
Dodaj temat do Ulubionych
Wersja do druku