What's new

Actions TFS 0.3.6+ Prosty quest skrzynkowy:

Status
Not open for further replies.

Samman

Senior User
Joined
Aug 23, 2009
Messages
782
Reaction score
39
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"/>
 

ersiu

Active User
Joined
Apr 7, 2008
Messages
95
Reaction score
7
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
 

GOD Booos

Active User
Joined
Sep 30, 2009
Messages
58
Reaction score
0
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
 

Imaginium

User
Joined
Dec 25, 2013
Messages
28
Reaction score
1
Odp: TFS 0.3.6+ Prosty quest skrzynkowy:

skrypt dziala na 2 skrzynki chyba wez pare takich zr?b po 2 i zobacz
 

iSanto

Demetri-World.net
Joined
Jan 8, 2011
Messages
922
Reaction score
87
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]
 

Dantez

Moim sekretem jest ciasto
Joined
May 22, 2008
Messages
1,206
Reaction score
202
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]
 

Govern

Advanced User
Joined
Jun 6, 2011
Messages
308
Reaction score
35
Odp: TFS 0.3.6+ Prosty quest skrzynkowy:

Temat zamykam.
 
Status
Not open for further replies.
Top