Tanuljunk meg Questet írni!

Indította EltonIK, 2013-02-23, 01:04:22

2013-02-23, 01:04:22 Utolsó szerkesztés: 2013-02-24, 12:28:06 Szerző: EltonIK
Sziasztok!

Hoztam nektek egy tutorialt, NEM ÉN KÉSZÍTETTEM, de gondoltam sok ember hasznát veheti majd !


Ebben a témában alap dolgokat fogok leírni a questekről.

1. Mi is az a quest?

Quest angolul küldetést jelent, viszont a metinben nemcsak küldetésekre tudjuk használni. A határ a csillagos ég, csak a fantáziánk szabja meg mire akarjuk használni. =) LUA programnyelvet használ, de kivan bővítve rengeteg funkcióval, ami egyedivé teszi. Mivel LUA nyelvet használ, ezért nem kell deklarálni a változókat előre, bármilyen típust felvehetnek a változók, sőt válthatnak is típust.

Tipp: Notepad++ könnyebben áttekinthető!


2. Alapok: Logikai változók:

= legyen egyenlő
== Pontosan egyenlő
< nagyobb
> kisebb
<= nagyobb egyenlő
>= kisebb egyenlő
or VAGY
xor kizáró vagy
and és
not nem
nil Üres lista / Logikai hamis


2/1 Logikai változók  használata:

Logikai változó:  Használat                                                 Magyarázat
=  local szint = pc.get_level() Szint nevű változó egyenlő lesz a játékos szintjével.
== if szint == 30 Akkor teljesül ha a szint változó értéke pontosan 30
> if szint > 30 Akkor teljesül ha a szint változó értéke nagyobb mint 30
< if szint < 30 Akkor teljesül ha a szint változó értéke kisebb mint 30
>= if szint >= 30 Akkor teljesül ha a szint változó értéke nagyobb vagy egyenlő 30-cal
<= if szint <= 30 Akkor teljesül ha a szint változó értéke kisebb vagy egyenlő 30-cal
or if szint == 30 or szint == 31 Akkor teljesül ha a szint változó értéke vagy 30 vagy 31 (elég ha az egyik teljesül)
xor if szint == 30 xor szint >= 30 Akkor teljesül ha csak az egyik feltétel teljesül (tehát nem lesz igaz ha a szint30, mivel az mindkettőre illik)
and if szint > 30 and szint > 35 Akkor teljesül ha a szint változó értéke nagyobb mint 30 és nagyobb mint 35 (tehát csak a 35 felettiek)
not if szint > 30 not and szint > 31 Akkor teljesül ha a szint változó értéke nagyobb mint 30 és nem nagyobb mint 32 (tehát lvl 31
nil if szint == nil Akkor teljesül ha a szint logikai változó nem kapott értéket, tehát üres.


3. Alapok: parancsok és használatuk
Ez a rész hosszú lesz, példákat nem fogok ebben a részben adni, majd egy későbbiben. A quest különleges parancsait megtaláhatjátok a quest_function nevű fájlban, enterrel elválasztva. Megpróbálok ezeken sorbamenni és leírni a használatukat.

affect.add(bónusz, mértéke, időtartam másodpercben) --> 1000-es type-al készíti el a bónuszt
affect.remove(Type)-->Type-hoz be kell írni a bónusz type amit le akarsz venni (pl.: 1000)
affect.remove_bad()-->leveszi a negatív hatásokat (ájulás, méreg, lassulás, elesés)
affect.remove_good() -->leveszi a pozitív hatásokat (buffok stb.)
chat("szöveg") --> chat sorba ír egy szöveget
cmdchat("szöveg")-->parancsot küld a kliensnek
complete_quest()-->teljesítettnek tekinti a questet, sose használom
complete_quest_state(stateneve)-->teljesítettnek tekinti a statet, sose használom
delay(időtartam)-->ez végül is egy várakozás, amit másodpercben adsz meg
find_npc_by_vnum(szám)-->nyilat tesz az npc-re
find_pc_by_name(szöveg)-->nyilat tesz npc-re
game.drop_item(id, mennyiség)-->kidob egy tárgyat
game.get_event_flag(szöveg)-->eventflaget lekérdez
game.get_guild_name(szöveg)-->céhnevet lekérdez
game.get_safebox_level(szám)-->lekérdezi a raktár szintjét (0 vagy 1, a raktárnyitásnál van használva)
game.open_mall()-->megnyitja az itemshop raktárat
game.open_safebox()-->megnyitja a raktárat
game.set_event_flag(szöveg, értéke)-->eventflaget állít be
game.set_safebox_level(szám)-->átírja a raktár szintjét
get_global_time()-->lekéri a szervergép idejét
get_time()-->elkezd visszaszámolni a meghatározott időtől
horse.advance()-->növeli a ló szintjét eggyel
horse.feed()-->megeteti a lovat
horse.get_grade()-->lekéri a rangját a lónak
horse.get_health()-->lekéri az életét a lónak
horse.get_level()-->lekéri a ló szintjét
horse.get_stamina()-->lekéri a ló kitartását
horse.is_dead()-->a ló halott (logikai, értéke TRUE vagy FALSE)
horse.is_mine()-->a ló a játékosé-e (logikai, értéke TRUE vagy FALSE)
horse.is_riding()-->a ló lovagolva van-e (logikai, értéke TRUE vagy FALSE)
horse.revive()-->elküldi a lovat
horse.ride()-->meglovagolja a lovat
horse.set_level(szám)-->beállítja a ló szintjét
horse.summon()-->ló megidézése
horse.unride()-->lóról leszállás
horse.unsummon()-->ló elküldése
input-->beviteli mezőt hoz létre
item.get_count(szám)-->megszámolja hány darab van a tárgyból
item.get_level(szám)-->a tárgy hordhatósági szintjét mutatja meg
item.get_name(szám)-->a tárgy nevét írja ki
item.get_refine_vnum(szám)-->a tárgy kovácsolási számát írja
item.get_size(szám)-->a tárgy méretét (1,2,3) írja ki
item.get_socket(szám)-->a tárgy köveit mutatja
item.get_sub_type(szám)-->a tárgy sub_type értékét mutatja
item.get_type(szám)-->a tárgy típusát mutatja
item.get_vnum(szöveg)-->a tárgy ID-jét írja ki
item.remove(szám, darab)-->a tárgyat elveszi
item.set_socket(szám, socket)-->beállít egy követ a tárgynak
loop_timer(szöveg)-->létrehoz egy ismétlődő időzítőt
notice(szöveg)-->GM szövegként látja a játékos az írást


4. Quest felépítése: alapok

Minden questet "quest" előtaggal kezdünk:
quest uj_kuldetes123 begin end
A questneve angol abc betűit+számokat+ "_" jelet használhat. Számmal és "_" jellel nem kezdődhet. Minden BEGIN tagot END taggal zárjuk.
Ezután megadunk neki egy "state"-t, státuszt. A kezdő státusz értelemszerűen a "start" (mindig ezzel kell kezdődnie először)

quest uj_kuldetes123 begin
  state start begin
  end
end

Van egy státuszunk és egy küldetésünk, ami semmit nem csinál. Ráadásul sosem kezdődik el. Akkor megmondjuk neki mikor kezdődjön. Legyen most amikor a játékos bejelentkezik:
quest uj_kuldetes123 begin
   state start begin
      when login begin
        notice("Köszöntelek a szerveren!")
      end
   end
end

When login begin-->Amikor bejelentkezik kezdődjön. Ezután a WHEN részbe tartozó dolgok kezdenek el lefutni. Jelen esetben csak egy notice (GM szöveg, lásd fentebb), amit észrevesz a játékos.

Ha azt akarjuk, hogy csak 1x fusson le, akkor több dolgot csinálhatunk.
1. Váltunk egy új státuszra amit semmit nem fog csinálni (számomra legkönyebb):

quest uj_kuldetes123 begin
   state start begin
      when login begin
        notice("Köszöntelek a szerveren!")
        set_state(vege)
      end
   end

   state vege begin
   end
end

2. Létrehozunk egy számlálót ami számolja, hogy csak 1x fusson le:
quest uj_kuldetes123 begin
   state start begin
      when login begin
        if pc.getqf("darab") == 0 then
           notice("Köszöntelek a szerveren!")
           pc.setqf("darab", 1)
        else
           return
        end
      end
   end
end

4/1. Quest felépítése: feltételek
A küldetésekben nagyon sokszor használunk feltételeket. Pl.: mikor induljon a küldetés. Ezeket többféleképpen meg tudjuk oldani. Most maradunk az előző küldetésünknél, ami kiír egy szöveget. A feltételek a következők. Akkor írja ki HA:
-bejelentkezik az illető
-legalább 30-as szintű
-férfi karakter

1. Megoldás: WHEN-be belesűrítjük a feltételeket.

quest uj_kuldetes123 begin
  state start begin
    when login or levelup with pc.level>= 30 begin
      local nem = pc.get_sex()
      if nem == 1 then
        notice("Köszöntelek a szerveren!")
      else
        return
      end
    end
  end
end

Na nézzük is: az OR miatt két részre lehet bontani:
when login with pc.level >= 30
when levelup with pc.level >= 30
A "with" összekötő szócska azt jelenti, hogy csak együtt teljesülhet.
Ezután egy "nem" változóba elmentjük a karakter nemét. 1 férfi, 2 lány
Megnézzük hogy fiú-e. Ha fiú (if nem == 1 then), akkor kiírja a szöveget, különben (else) nem ír semmit.

2. Változat: rengeteg IF-fel írjuk

quest uj_kuldetes123 begin
  state start begin
    when login begin
      local nem = pc.get_sex()
      if pc.level >= 30 then
        if nem == 1 then
          notice("Köszöntelek a szerveren!")
        else
           return
        end
       end
     end
  end
end

Ez sokkal komplikáltabb, ráadásul lassabb is. Érdemesebb az elsőt használni.



Hamarosan jön a Quest változokról a leírás, addig is tanulj meg te is questet írni ! ;)

A leírást nem én csináltam ! Én csak elhoztam nektek hogy lehetőséget legyen megtanulni questet írni!
Próbálok segíteni, de ha nem jó akkor nem kell negatívot adni! :/