[Skryptowanie Lua%XML z Seminari] Tworzenie i usuwanie przedmiotu na danej pozycji

OP
T

The_Hide

Banned User
Joined
Dec 11, 2012
Messages
389
Reaction score
10
Wiesz w ogole czemu niektore zmienne powinno sie trzymac w funkcji a niektore ponad nia? Nie chodzi tutaj o zaden dostep do nich.
chodzi też o dostęp jeśli stworzysz sobie funkcje, która się odnosi do innej funkcji, to ta do, której się ona odnosi musi być ponad nią by pierwsza została wczytana, gdyż wywali poprostu erro jeśli funkcja, która ma się odnieść do innej będzie wczytywana przed wczytaniem funkcji, do której się odnosi, bo poprostu wywali błąd, że nie wie do czego się odnieść

np.:

funkcja A:
Lua:
function BB_GNOME_add_player_reputation(cid, rep)
	if BB_GNOME_get_player_reputation(cid) < 0 then
		BB_GNOME_setPlayerStorageValue(cid, BB_GNOME_REPUTATION_STG, 0)
	end
	BB_GNOME_setPlayerStorageValue(cid, BB_GNOME_REPUTATION_STG, BB_GNOME_get_player_reputation(cid) + rep)
	BB_GNOME_advanceInRankIfRequiredReputationAchieved(cid)
end
funkcja B:
Lua:
function BB_GNOME_get_player_reputation(cid)
	return BB_GNOME_getPlayerStorageValue(cid, BB_GNOME_REPUTATION_STG)
end
funkcja B musi być przed A bo inaczej A się nie wczyta gdyż nie będzie wiedzieć o co chodzi z poleceniem:
Lua:
if BB_GNOME_get_player_reputation(cid) < 0 then
- - - Updated - - -

A wiesz co to sa stale? Jak cos wsadzisz do tablicy, ktora jest zadeklarowana poza funkcja, to ta tablica wcale nie jest stala, bo wlasnie ja modyfikujesz. Idac dalej tym tropem, wsadzajac cos do niej, to cos zostanie tam na zawsze, do czasu az na nowo wczytasz skrypt. ID kamienia, pozycje, efekty nie sa nigdzie zmieniane, dlatego nic nie stoi na przeszkodzie zeby umiescic je poza funkcja. Co w przypadku duzych (bardzo duzych) tablic przyspieszy wykonanie sie skryptu.

Deklarowanie funkcji wewnatrz funkcji jest jeszcze weksza glupota.
aj zapomniałem właśnie, że do addeventa powininem dodać wszystkie parametry, których potem będę używał w danej funkcji, zaraz to zrobię

- - - Updated - - -

dobra już się gubie, jeśli damy c = {} poprostu do LIB'a to powinno zadziałać tak?

- - - Updated - - -

try this?

Lua:
function onUse(cid, item, fromPosition, itemEx, toPosition)

	local c = {
			[1] = {item_id = 1354, pozycja = {x=1050,y=5000,z=7}, ilosc = 1, efekt_create = 25, efekt_remove = 13},
			[2] = {item_id = 1354, pozycja = {x=1051,y=5000,z=7}, ilosc = 1, efekt_create = 25, efekt_remove = 13},
			[3] = {item_id = 1354, pozycja = {x=1052,y=5000,z=7}, ilosc = 1, efekt_create = 25, efekt_remove = 13},
			}

	local czas_tworzenia_scian = 60 * 1000 --<-- 60 * 1000 = 60 sekund
	local usuniete_sciany = 0
	local stworzone_sciany = 0
	
	local function stworz_sciany_po_czasie(g)
		for j = 1, #g do
			if getTileItemById(g[j].pozycja, g[j].item_id).uid > 0 then
				stworzone_sciany = stworzone_sciany + 1
				doCreateItem(g[j].item_id, g[j].pozycja)
				doSendMagicEffect(g[j].pozycja, g[j].efekt_create)
			end
		end
	end
	
	if item.itemid == 1945 then 
		for i = 1, #c do
			if getTileItemById(c[i].pozycja, c[i].item_id).uid > 0 then
				usuniete_sciany = usuniete_sciany + 1
				doRemoveThing(getTileItemById(c[i].pozycja, c[i].item_id).uid, c[i].ilosc)
				doSendMagicEffect(c[i].pozycja, c[i].efekt_remove)
			end
		end
		doCreatureSay(cid, "Przesuwajac dzwignie usunales ".. usuniete_sciany .." scian. Odnowia sie po ".. czas_tworzenia_scian/1000 .." sekundach.", TALKTYPE_MONSTER)
		doTransformItem(item.uid, 1946)
		tworzenie_na_nowo = addEvent(stworz_sciany_po_czasie(), czas_tworzenia_scian, c)
	elseif item.itemid == 1946 then 
		for k = 1, #c do
			if getTileItemById(c[k].pozycja, c[k].item_id).uid > 0 then
				stworzone_sciany = stworzone_sciany + 1
				doCreateItem(c[k].item_id, c[k].pozycja)
				doSendMagicEffect(c[k].pozycja, c[k].efekt_create)
			end
		end
		doCreatureSay(cid, "Przesuwajac dzwignie stworzyles ".. stworzone_sciany .." scian.", TALKTYPE_MONSTER)
		doTransformItem(item.uid, 1945)
		stopEvent(tworzenie_na_nowo)
	end

	return true
end
 
OP
T

The_Hide

Banned User
Joined
Dec 11, 2012
Messages
389
Reaction score
10
Nie osmieszaj sie. https://i.imgur.com/nt9mwyj.png
Pojecia o lua to Ty za wiele nie posiadasz. Lepiej doucz siebie, a potem staraj sie pisac poradniki.
jakoś w przypadku ładowania LIB'u w odwrotnej kolejności to nie działało u mnie (przykład, który podałem wyżej)

- - - Updated - - -

Okey, teraz działa, skrypt:

Lua:
local c = {
                        [1] = {item_id = 1025, pozycja = {x=391,y=274,z=8}, ilosc = 1, efekt_create = 25, efekt_remove = 13},
                        [2] = {item_id = 1025, pozycja = {x=389,y=274,z=8}, ilosc = 1, efekt_create = 25, efekt_remove = 13},
                        [3] = {item_id = 1025, pozycja = {x=393,y=274,z=8}, ilosc = 1, efekt_create = 25, efekt_remove = 13},
                        }
local czas_tworzenia_scian = 5 * 1000 --<-- 60 * 1000 = 60 sekund
local usuniete_sciany = 0
local stworzone_sciany = 0
	function stworz_sciany_po_czasie()
		for j = 1, #c do
			if not(getTileItemById(c[j].pozycja, c[j].item_id).uid > 0) then
				stworzone_sciany = stworzone_sciany + 1
				doCreateItem(c[j].item_id, c[j].pozycja)
				doSendMagicEffect(c[j].pozycja, c[j].efekt_create)
			end
		end
		stworzone_sciany = 0
		return true
	end
	
	
function onUse(cid, item, fromPosition, itemEx, toPosition)

	if item.itemid == 1945 then 
		for i = 1, #c do
			if getTileItemById(c[i].pozycja, c[i].item_id).uid > 0 then
				usuniete_sciany = usuniete_sciany + 1
				doRemoveThing(getTileItemById(c[i].pozycja, c[i].item_id).uid, c[i].ilosc)
				doSendMagicEffect(c[i].pozycja, c[i].efekt_remove)
			end
		end
		doCreatureSay(cid, "Przesuwajac dzwignie usunales ".. usuniete_sciany .." scian. Odnowia sie po ".. czas_tworzenia_scian/1000 .." sekundach.", TALKTYPE_MONSTER)
		doTransformItem(item.uid, 1946)
		tworzenie_na_nowo = addEvent(stworz_sciany_po_czasie, czas_tworzenia_scian)
	elseif item.itemid == 1946 then 
		for k = 1, #c do
			if not(getTileItemById(c[k].pozycja, c[k].item_id).uid > 0) then
				stworzone_sciany = stworzone_sciany + 1
				doCreateItem(c[k].item_id, c[k].pozycja)
				doSendMagicEffect(c[k].pozycja, c[k].efekt_create)
			end
		end
		doCreatureSay(cid, "Przesuwajac dzwignie stworzyles ".. stworzone_sciany .." scian.", TALKTYPE_MONSTER)
		doTransformItem(item.uid, 1945)
		stopEvent(tworzenie_na_nowo)
	end
	stworzone_sciany = 0
	usuniete_sciany = 0
	return true
end
 

Evalor

The Ancient One(Cahir)
Joined
Nov 19, 2009
Messages
76
Reaction score
18
Location
PL.
Iteracja to nie rekurencja.

Nic dziwnego, ze w takiej kolejnosci cos nie dziala (robiac od tylu zawsze pod gore).
Poznoej sa tematy typu "czemu nie dziala? Zaplace" i tacy jak Hive zarabiaja. Glowiac sie nad 1k+ liniami skryptu/kodu. Struktura ssie.

Tak, lubie archeologie.
 
Top