What's new

-Średni [Lua] Dodatkowa funkcja wykonawcza

Yoxino

Advanced User
Joined
Aug 12, 2009
Messages
478
Reaction score
51
Witam!
Dzi? chcia?bym zabra? g?o? w sprawie dot. tworzenia dodatkowych funkcji wykonawczych. Jest to rzecz bardzo przydatna w programowaniu, kt?ra sprawi ?e kod b?dzie bardziej przejrzysty. Pisz? to dlatego i? prawie nikt z pocz?tkuj?cych i ?rednio zaawansowanych skrypter?w tego nie u?ywa (zak?adam ?e nie potrafi). A wi?c do dzie?a:

1. Przyk?ad zastosowania dodatkowej funkcji
Oto przyk?ad w/w funkcji, jest to skrypt talkactions, kt?ry atakuje po wypowiedzieniu !attack. Jest to skrypt wy??cznie na potrzeby tematu, nikomu go NIE POLECAM! Na pocz?tku kod bez u?ycia funkcji:
PHP:
function onSay(cid, words, param, channel)
local config = {
	wymagany_lvl = 45,
	wymagany_mlvl = 15,
	lvl = getPlayerLevel(cid),
	mlvl = getPlayerMagLevel(cid),
	target = getCreatureTarget(cid),
	cid_pos = getPlayerPosition(cid)}

	target_pos =  getPlayerPosition(config.target.uid)
	atk_min = (config.lvl * 2 + config.mlvl *3) * 1.2 - 30
	atk_max = (config.lvl * 2 + config.mlvl *3) * 1.6
	atk = math.random(atk_min, atk_max)

if isPlayer(target.uid) == true then
	if lvl >= config.wymagany_lvl then
		if mlvl >= config.wymagany_mlvl then
				doPlayerAddHealth(config.target.uid,-atk)
		else
			doPlayerSendTextMessage(cid,22,"Musisz miec " .. config.wymagany_mlvl .. " poziom magiczny aby uzywac tego czaru")
		end
	else
		doPlayerSendTextMessage(cid,22,"Musisz miec " .. config.wymagany_lvl .. " poziom aby uzywac tego czaru")
	end
end
if isCreature(target.uid) == true then
	if lvl >= config.wymagany_lvl then
		if mlvl >= config.wymagany_mlvl then
				doCreatureAddHealth(config.target.uid,-config.atk)
		else
			doPlayerSendTextMessage(cid,22,"Musisz miec " .. config.wymagany_mlvl .. " poziom magiczny aby uzywac tego czaru")
		end
	else
		doPlayerSendTextMessage(cid,22,"Musisz miec " .. config.wymagany_lvl .. " poziom aby uzywac tego czaru")
	end
end
end

Jak wida? jest to d?ugi kod, musimy osobno deklarowa? wszystkie warunki dla gracza i dla playera. A teraz zr?bmy to za pomoc? dodatkowej funkcji:
PHP:
function onSay(cid, words, param, channel)
	lvl = getPlayerLevel(cid)
	mlvl = getPlayerMagLevel(cid)
	target = getCreatureTarget(cid)
	cid_pos = getPlayerPosition(cid)
	target_pos =  getPlayerPosition(target.uid)
	atk_min = (lvl * 2 + mlvl *3) * 1.2 - 30
	atk_max = (lvl * 2 + mlvl *3) * 1.6
	atk = math.random(atk_min, atk_max)

	attack(cid, target.uid, atk, lvl, mlvl)

end	

function attack(cid, who, how_much, lvl, mlvl)
local config = {
wymagany_lvl = 45,
wymagany_mlvl = 15}

	if lvl >= config.wymagany_lvl then
		if mlvl >= config.wymagany_mlvl then
				if isPlayer(who) == true then
					doPlayerAddHealth(who,-how_much)
				end
				if isCreature(who) == true then
					doCreatureAddHealth(who,-how_much)
				end
		else
			doPlayerSendTextMessage(cid,22,"Musisz miec " .. config.wymagany_mlvl .. " poziom magiczny aby uzywac tego czaru")
		end
	else
		doPlayerSendTextMessage(cid,22,"Musisz miec " .. config.wymagany_lvl .. " poziom aby uzywac tego czaru")
	end
end
Jak wida? kod jest bardziej przejrzysty. Zastosowalismy tutaj 2 funkcje: onSay, attack(w?asn?). W funkcji attack dodali?my parametry, a w funkcji onSay zainicjowali?my j?. O tym wszystkim w nast?pnych cz?sciach.

2. Tworzenie prostej funkcji zwracaj?cej:
Napiszemy teraz prost? funkcj? zwracaj?c? true w razie powodzenia i false w razie niepowodzenia.
PHP:
function onUse(cid, item, fromPosition, itemEx, toPosition)
if wykonaj() == true then
	doPlayerSendTextMessage(cid, 22, "Udalo sie")
else
	doPlayerSendTextMessage(cid, 22, "Nie udalo sie")
end
end

function wykonaj()
local rand = math.random(0,1)
if rand == 0 then
	return false
else
	return true
end
end

W funkcji onUse wykonujemy warunek w kt?rym wykonujemy metod? "wykonaj" i sprawdzamy czy metoda wykonaj zwraca true lub false (decyduje o tym funckcja random, kt?ra wybiera losowo liczb? pomi?dzy 0 a 1 a potem zmienia jej posta? 0 - false/1-true). Nast?pnie je?eli metoda "wykonaj" zwr?ci true wy?wietla si? text "Uda?o si?", w odwrotny wypadku "Nie uda?o si?".

3. Przekazanie paramet?w do funkcji

W tym rozdziale zajemiemy si? przekazaniem parametr?w(informacji) do funkcji dodatkowej. Na podstawie powy?szego kodu przeka?emy parametry (liczba1, liczba2) spo?r?d nich metoda b?dzie wybiera?a liczb? kt?r? zwr?ci:

PHP:
function onUse(cid, item, fromPosition, itemEx, toPosition)
local liczba = wykonaj(1,30)
doPlayerSendTextMessage(cid, 22, liczba)
end

function wkonaj(liczba1, liczba2)
return math.random(liczba1, liczb2)

end

4. Prawa autorskie:

Zezwalam na rozpowszechnianie tego skryptu tylko je?eli znajdzie si? tam stopka:
"Created by Yoxino (forum.tibia.net.pl)"

No i to by?o by na tyle. Mam nadziej? ?e komu? si? to przyda i ?e nie pisa?em tego na marno ;P

#Down :
1, 2 - pomy?ka przy pisaniu kodu, po prostu liter?wki. Zmieniaj?c go kilka razy wcze?niej nie zauwa?y?em ich. (Poprawione)
3 - nazwa "wykonaj" jest po to aby by?o ?atwiej zrozumie?... Funkcja random w funkcji wykonaj jest tylko po to aby co? dzia?o si? z parametrem przes?anym do tej funkcji. Co do return to specjanie nie zrobi?em tak jak ty napisa?e? aby by?o ?atwiej zrozumie?... Napewno nie ka?dy pocz?tkuj?cy skrypter zrozumie:
Code:
return rand == 0 and false or true
lepiej jest to roz?o?y? na if'y...


Pozdrawiam!
Yoxino
 

Sharky

Active User
Joined
Apr 6, 2008
Messages
97
Reaction score
11
Odp: [Lua] Dodatkowa funkcja wykonawcza

1.Najpierw deklarujesz:
Code:
local config = [COLOR="RoyalBlue"]{[/COLOR] 
    wymagany_lvl = 45, 
    wymagany_mlvl = 15, 
    lvl = getPlayerLevel(cid), 
    mlvl = getPlayerMagLevel(cid), 
    target = getCreatureTarget(cid), 
    cid_pos = getPlayerPosition(cid)[COLOR="RoyalBlue"]}[/COLOR] 

    target_pos =  getPlayerPosition(config.target.uid) 
    atk_min = (config.lvl * 2 + config.mlvl *3) * 1.2 - 30 
    atk_max = (config.lvl * 2 + config.mlvl *3) * 1.6 
    atk = math.random(atk_min, atk_max)

a potem u?ywasz:
Code:
-config.atk

2.
Code:
function [COLOR="Blue"]wkonaj [/COLOR]
local rand = math.random(0,1) 
if rand == 0 then 
    return false 
else 
    return true 
end 
end

Co to kurwa jest? Gdzie s? nawiasy? (pomijamy przekr?con? nazw?).
To raz. Druga sprawa, naucz sie korzysta? z operatora warunkowego!
Code:
function wykonaj()
local rand = math.random(0,1) 
return rand == 0 and false or true
end
Tak to powinno wygl?da?. (sorry za brak tab.)

3.
Code:
function wkonaj(liczba1, liczba2) 
local rand = math.random(liczba1, liczb2) 
return rand 
end
Po co zmienna skoro mo?na zwr?ci? od razu math.random(x,y)?


Pisz? to dlatego i? prawie nikt z pocz?tkuj?cych i ?rednio zaawansowanych skrypter?w tego nie u?ywa (zak?adam ?e nie potrafi).
Na tym forum zaledwie garstka os?b ma prawdziwe poj?cie o lua. Reszta to pseudo skrypterzy, kt?rzy umiej? przerobi? kilka prostych kod?w, wi?c nie opowiadaj takich rzeczy :D.

Nie powiniene? tego pisa?, bo uczysz niepoprawnych nawyk?w, sam masz problemu z pisaniem kodu i jeste? nieodpowiedzialny (nie przetestowa?e? go!).

Btw, dawaj funkcjom jakie? konkretne nazwy (np. losuj, dodaj) bo "wykonaj" za wiele nam nie m?wi.
 
Last edited:

Yoxino

Advanced User
Joined
Aug 12, 2009
Messages
478
Reaction score
51
Odp: [Lua] Dodatkowa funkcja wykonawcza

1, 2 - pomy?ka przy pisaniu kodu, po prostu liter?wki. Zmieniaj?c go kilka razy wcze?niej nie zauwa?y?em ich. (Poprawione)
3 - nazwa "wykonaj" jest po to aby by?o ?atwiej zrozumie?... Funkcja random w funkcji wykonaj jest tylko po to aby co? dzia?o si? z parametrem przes?anym do tej funkcji. Co do return to specjanie nie zrobi?em tak jak ty napisa?e? aby by?o ?atwiej zrozumie?... Napewno nie ka?dy pocz?tkuj?cy skrypter zrozumie:
Code:
return rand == 0 and false or true
lepiej jest to roz?o?y? na if'y...

Nie u?ywa? bym okre?lenia "pseudo" skrypterzy... Ka?dy by? kiedy? pocz?tkuj?czym i uczy? si? podstaw. Ale s?dz? ?e to przyda si? nawet nim

Sorki za b??dy, artyku? poprawiony. Prosz? o komentowanie :)
 
Last edited:

laseczka1991

Advanced User
Joined
Jul 11, 2009
Messages
260
Reaction score
5
Age
32
Odp: [Lua] Dodatkowa funkcja wykonawcza

?adny poradnik, wszystko czytelnie rozpisane. Du?o mi to wyja?ni?o .
Ocena: 8/10
Pozdrawiam​
 

Yoxino

Advanced User
Joined
Aug 12, 2009
Messages
478
Reaction score
51
Odp: [Lua] Dodatkowa funkcja wykonawcza

@UP Dzi?ki ;)

Prosz? o nast?pne komentarze. :p
 
Top