A questek adják a szerver lelkét: ők felelnek az NPC-k párbeszédeiért, a küldetésekért, az eventekért és rengeteg egyedi funkcióért.
Ez az útmutató lépésről lépésre végigvezet az alapokon, és részletes példákkal mutatja meg, hogyan építheted fel a saját questjeidet.
---
A questek Lua-szerű nyelven íródnak, és a quest/ mappában található `.quest` fájlokban helyezkednek el.
Feladataik:
- NPC párbeszédek megjelenítése
- Küldetések és feladatok kezelése (pl. ölj meg 10 mobot, gyűjts össze tárgyakat)
- Eventek, minijátékok, dungeon belépések
- Egyedi rendszerek megvalósítása (pl. pontgyűjtő rendszer, kasztfejlesztés)
---
Minden quest 3 fő részből áll:
1. Quest név
2. State-ek (állapotok)
3. Események (when blokkok)
Egyszerű keretszerkezet:
Kód: Egész kijelölése
quest quest_neve begin
state start begin
when login begin
say("Ez egy egyszerű quest példa.")
end
end
end
- quest quest_neve: a quest neve (egyedi kell legyen).
- state start: a quest állapota. Egy quest több state-ből is állhat (pl. kezdés, feladat, jutalom).
- when login: esemény, ami kiváltja a kódot (itt: játékos belépéskor).
- say(): szöveget jelenít meg a játékosnak.
---
Néhány gyakran használt esemény:
Kód: Egész kijelölése
when login begin
-- amikor a játékos belép a játékba
end
when 20095.chat."Üdv!" begin
-- amikor a játékos az ID 20095-ös NPC-re kattint és a "Üdv!" szöveget választja
end
when 101.kill begin
-- amikor a játékos megöl egy 101-es vnumú mobot
end
when 50052.use begin
-- amikor a játékos elhasználja az 50052-es tárgyat
end
when levelup begin
-- amikor a játékos szintet lép
end
A játékosnak látható szövegeket a következő parancsokkal írhatjuk ki:
Kód: Egész kijelölése
say_title("Küldetés címe")
say("Ez a szöveg több sorban is megjelenhet.")
say("")
say_reward("Jutalmad: 1.000 Yang")
- say: normál szöveg (új sorokat üres `say("")` választ el).
- say_reward: jutalomként kiírt szöveg.
---
A questek állapotokból épülnek fel. A set_state() parancs váltja az aktuális állapotot.
Példa:
Kód: Egész kijelölése
quest kutya_quest begin
state start begin
when login begin
set_state(kill_dogs)
end
end
state kill_dogs begin
when letter begin
send_letter("Ölj meg 10 vadkutyát!")
end
when 101.kill begin
pc.setqf("dog_count", pc.getqf("dog_count") + 1)
if pc.getqf("dog_count") >= 10 then
set_state(reward)
end
end
end
state reward begin
when letter begin
send_letter("Jutalom átvétele")
end
when button or info begin
say("Gratulálok, teljesítetted a küldetést!")
pc.change_money(1000000)
set_state(__COMPLETE__)
end
end
end
A játékoshoz kapcsolt változók a pc.setqf és pc.getqf függvényekkel működnek.
Kód: Egész kijelölése
pc.setqf("kulcs", 1) -- beállítja a "kulcs" változót 1-re
pc.getqf("kulcs") -- kiolvassa az értékét
---
A questek általában küldetéslevél formájában jelennek meg a játékban:
Kód: Egész kijelölése
when letter begin
send_letter("Vadkutya küldetés")
end
when info begin
say("Feladatod: ölj meg 10 vadkutyát!")
end
- info: részletek, ha a játékos rákattint a levélre.
---
Egy NPC-hez így kötünk questet:
Kód: Egész kijelölése
when 20095.chat."Segítség!" begin
say("Szia kalandor!")
say("Hozz el nekem 5 Vörös virágot.")
end
- A chat menüpont neve `"Segítség!"`.
---
Item használatakor:
Kód: Egész kijelölése
when 50052.use begin
say("Felhasználtad a varázsitalt!")
pc.change_hp(500)
item.remove()
end
---
Kód: Egész kijelölése
pc.change_money(1000) -- pénz adása
pc.give_item2(27003, 1) -- tárgy adása (ID, mennyiség)
pc.change_exp(1000) -- tapasztalat adása
pc.get_name() -- játékos neve
pc.get_level() -- játékos szintje
pc.get_sex() -- játékos neme
pc.get_job() -- karakter kasztja
pc.warp(x,y) -- teleportálás koordinátára
1. Másold a quest fájlt a quest/ mappába.
2. Fordítsd le SSH alatt:
Kód: Egész kijelölése
qc questnev.quest
vagy az összeset:
Kód: Egész kijelölése
qc
3. Indítsd újra a szervert, vagy:
Kód: Egész kijelölése
/reload q
---
- Mindig adj beszédes nevet a questnek (pl. boss_hunt.quest).
- Teszteléshez használj egyszerű feltételeket, majd bővítsd a kódot.
- Hiba esetén ellenőrizd a syserr logot.
- Ne felejtsd el az item_proto/mob_proto szerkesztést, ha új itemet/NPC-t használsz.
- Kerüld a felesleges „végtelen ciklusokat” vagy rosszul zárt feltételeket, mert összeomlaszthatják a szervert.
Kezdj kicsiben, majd építs összetettebb rendszereket – ha elakadsz, oszd meg itt a fórumon, és segít a közösség!