• logo_cipsoft
    Nowe serwery zostały otwarte 27 Paź 2025:
    Idyllia (Optional PvP) Hostera (Open PvP) us_logo Dracobra (Open PvP)

Actions TFS 0.3.6+ Prosty quest skrzynkowy:

Status
Zamknięty.

Samman

Senior User
Witajcie,

A tak z nud?w napisa?em prosty quest skrzynkowy. Bardzo prosty config no i ?atwo?? wykonania :)

Tworzymy plik chest.lua w folderze data/actions/scripts/. Oto skrypt:
[LUA]
--[[ ### Autor: Jakub98
### Free to use
### Quest system with using ActionIDs
]]--
function onUse(cid, item, frompos, item2, topos)
local chests = {
[3000] = {level = 600, name = "nazwa itemu", item_id = 3843, count = 1, experience = 1000, text = "Testowy napis"},
}

-- ### TEGO PONI?EJ PROSZ? NIE EDYTOWA?!!! ### --
for i, v in pairs(chests) do
if item.actionid == i and getPlayerStorageValue(cid, i) == -1 and getPlayerLevel(cid) >= v.level then
doPlayerAddItem(cid, v.item_id, v.count)
doPlayerSendTextMessage(cid, 18, "You have found '..v.name..'.")
doSendMagicEffect(topos, CONST_ME_MAGIC_BLUE)
doPlayerAddExp(cid, v.experience)
setPlayerStorageValue(cid, i, 1)
else
doPlayerSendCancel(cid, 'Sorry, not possible')
doSendMagicEffect(topos, CONST_ME_PUFF)
return 1
end
end
end[/LUA]

Jak wida? w tablicy "chests" mamy kilka warto?ci. Pierwsza strona tablicy oznacza ActionID skrzynki, druga natomiast definicje warto?ci.
Skrzynka, kt?ra b?dzie posiada? ActionID 3000 b?dzie zwraca?a przedmiot o ID 3843, w liczbie 1, oraz zwr?ci napis "Testowy napis", wymagany poziom to 600, dodatkowo gracz otrzyma 1000 expa.

Aby doda? nast?pn? pozycj?, musimy po "," doda? nast?pn? warto??, na przyk?ad:

[LUA]local chests = {
[3000] = {level = 600, item_id = 3843, count = 1, experience = 1000, text = "Testowy napis"},
[3001] = {level = 250, item_id = 2237, count = 1, experience = 2500, text = "Testowy napis drugi"},
}[/LUA]

I to wszystko co musicie wykona?. Reszt? zrobi skrypt. Teraz na mapie tworzycie jak?? skrzyneczk? i nadajecie jej ActionID 3001. Gotowe, quest jest gotowy do przetestowania przez pierwszego ?mia?ka :)

Actions.xml:
PHP:
<action actionid="3000" script="chest.lua"/>
<action actionid="3001" script="chest.lua"/>
 

Our partners and their custom servers:

Odp: TFS 0.3.6+ Prosty quest skrzynkowy:

dodaj do tabeli opcj? z uniqueid(opcjonaln?) to b?dzie mo?na robi? t? prost? metod? questy z wyborem
 
Odp: TFS 0.3.6+ Prosty quest skrzynkowy:

Wiecie co, jako? mi to nie dzia?a : / Na pocz?tku zadzia?a?o- jedynie dwie skrzynki, a reszta ju? nie. Hmmm
 
Odp: TFS 0.3.6+ Prosty quest skrzynkowy:

1. Nie potrzebnie u?ywasz p?tli.
2. Z?e u?ycie p?tli, a bardziej z?e postawione warunki... Nie wiem czy wiesz, ale prawie zawsze w tej p?tli wykona si? else, po kt?rym nast?puj? zako?czenie kodu, przez co nie zd??y doj?? p?tla do w?a?ciwego miejsca.
3. Name itema mog?e? pobra? skryptem, nie musi tego wpisywa? u?ytkownik.
4. Nie mo?esz u?ywa? w po?owie tych cudzys?ow?w "" a w po?owie tych ' '.

Poprawi?em ten kod:

[lua]local chests = {
[3000] = {level = 10, item_id = 3843, count = 1, experience = 700},
[3001] = {level = 1, item_id = 2400, count = 1, experience = false},
}

function onUse(cid, item, frompos, item2, topos)
if chests[item.actionid] then
if getPlayerLevel(cid) >= chests[item.actionid].level then
if getPlayerStorageValue(cid, item.actionid) == -1 then
if chests[item.actionid].item_id then doPlayerAddItem(cid, chests[item.actionid].item_id, chests[item.actionid].count) end
if chests[item.actionid].experience then doPlayerAddExp(cid, chests[item.actionid].experience) end
setPlayerStorageValue(cid, item.actionid, 1)
doPlayerSendTextMessage(cid, 18, "You have found "..getItemDescriptionsById(chests[item.actionid].item_id)..".")
return true
else
doPlayerSendCancel(cid, 'This chest is empty.')
return true
end
else
doPlayerSendCancel(cid, 'To get award you have to have '..chests[item.actionid].level..' level.')
end
end
end[/lua]
 
Odp: TFS 0.3.6+ Prosty quest skrzynkowy:

Poza tym co napisa? Santo, nale?y u?y? uniqueid w actions.xml, by nie dopisywa? tam kolejnych aid w przypadku nowej skrzynki.

Dodatkowo rozszerz? punkt 1, t?umacz?c co zrobi?e? ?le. Pos?u?ymy si? konkretnym przyk?adem, kt?ry napisa?em tak, by? m?g? zobaczy? sw?j b??d.
[LUA]local tablica = {
[20] = "Junk",
[40] = "Junk",
-- np. 40 innych elementow
[90] = "O, wlasciwy element"
}

for i,v in pairs(tablica) do
if(i == 90) then
print(i .. " - " .. v)
else
print("Jakis syf")
end
end[/LUA]

Mamy tablic? posiadaj?c? 3 elementy. Za???my, ?e tablica ta ma 10000 element?w. Zgodnie z tym co napisa?e?, je?li potrzebny jest nam w danej chwili ostatni element, to p?tla wykona si? 10000 razy (pomijam b??d z else, kt?ry powoduje, ?e p?tla wykona si? tylko raz). P?tl? pairs i ipairs (o r??nicach poczytaj sobie na wiki) stosuje si? tylko wtedy, gdy potrzebna nam jest operacja na wszystkich elementach tabeli. W Twoim przypadku p?tla dos?ownie przepierdala si? przez wszystkie elementy a? do natrafienia na ten w?a?ciwy, co jest zupe?nie niepotrzebne bo oczekujemy na tylko jeden z nich. Wystarczy si? do niego odwo?a? stosuj?c operator indeksu - [], co widzisz ju? w przyk?adzie Santo.

Wynik skryptu podanego powy?ej:
[LUA]Jakis syf
Jakis syf
90 - O, wlasciwy element[/LUA]

Swoj? drog? zaobserwowa?em dziwne dzia?anie p?tli pairs przy zmianie indeksu ostatniego elementu tablicy na 100:
[LUA]Jakis syf
100 - O, wlasciwy element
Jakis syf[/LUA]

I przy wi?kszej ilo?ci element?w:
[LUA]20 = Junk
899 = Junk
40 = Junk
4000 = Junk
90 - O, wlasciwy element[/LUA]
 
Status
Zamknięty.
Back
Do góry Bottom