• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

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

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
 
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
 
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.
 
Back
Top