artace.ru - творческий сектор

Название: Создаём собственные квесты (часть 1) [Версия для печати]

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude9 J4 Y$ ]$ }: Z8 z. ~- x( U: N: L% f
Сборка        L2j
1 h. V! R) T9 y6 s/ J- V9 Z1 RПример основан на сборке L2J.  a! y* U8 u% r) X8 y$ j; B

. O1 ]% F6 x, e+ y. |5 S0 FПервое что нужно сделать, это добавить необходимые Java классы в квест.
- Y6 h9 y0 ~0 v* |, S, A
  1. 9 d4 x3 {# R: ~8 A- O
  2. <div><span style="color: rgb(20, 20, 20); font-family: Monaco, Menlo, Consolas, &quot;Roboto Mono&quot;, &quot;Andale Mono&quot;, &quot;Ubuntu Mono&quot;, monospace; font-size: 12px; white-space-collapse: preserve; background-color: rgb(245, 245, 245);">(net.sf.l2j.gameserver.model.quest).</span>
    7 o& b; s1 y. s+ d. Y, b% Z
  3. * G. {4 h& I% l* l  [: B2 ]: e; e
  4. </div>
Скопировать код
  1. import sys
    , w8 T7 K) I7 ?
  2. from net.sf.l2j.gameserver.model.quest import State8 E4 ?! r2 L6 F: s, i9 V
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    1 @. W. x4 ]6 L6 \/ f
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 120820 m/ M. l; J9 O+ D2 Z3 ?  N& {9 i! |
  2. FANGS_ITEM_ID = 1859
    . ^. |; b4 w# n3 J* a$ w
  3. DROP_RATE = 5000004 k" J3 a) q, J- \. D& k
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :
    8 U1 L3 d! p6 T' E3 N$ ^. y3 W3 A
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
! S* \* u9 I- V) ~% Z/ Q' m- k' L# p7 {( L
  1. def completed(st) :
    9 M! N" N9 j0 \! W- L
  2. st.setState(COMPLETED)! [: r, z8 \3 e/ P) @
  3. st.clearQuestDrops()- r, E' I2 f0 _3 K' Q9 H- E% _, u; L& D! m
  4. st.takeItems(FANGS_ITEM_ID,-1)
    , O" v9 y7 _  O, ^
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)7 F% [; w. f( K. t5 f. r6 p
  6. st.exitQuest(False)
    7 N4 B0 n7 g0 \) d4 F
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))' m2 y' y4 U5 X! q. Y. m2 S

( f! `. b! v0 c" w4 O. F  J: y  d& ]$ D' m0 D* D8 A  x5 I

6 ^7 Z& Q7 F& }3 YИ наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
8 u9 c/ F; A% ]2 E9 t+ X9 W; |4 x0 L
  1. def check(st) :
    3 A" C: [7 T8 N% e! }1 u
  2. if getCount(st) >= 4 :
    7 e; o* _2 R7 ]
  3. completed(st)
    & `$ E/ a- e; n( h& @
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
) o" [/ P6 C* z2 F) D$ F. ^" m2 P% H
  1. class Quest (JQuest):
    5 N% |$ t9 q- [. W
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    3 [7 L2 b" C3 s, z3 q+ P
  3. def onEvent (self,event,st):
    . _4 E# }) d% a7 S
  4. id = st.getState()
    0 o6 Z6 s2 I0 s# X9 W. {
  5. if id == CREATED : st.setState(STARTED)
    , z! ?& c% i0 ?1 I" }
  6. elif id == COMPLETED: pass
      ]+ q  @# r& r; s1 F
  7. elif id == STARTED : check(st)
    4 `0 h; y9 }, ?# B: m0 X+ `. m
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)% @  N. A& M( u, p9 M
  2. QUEST.addStartNpc(7056)
Скопировать код
: n$ \* w) [- `
8 o( z: s6 m6 s; `: Q





Добро пожаловать artace.ru - творческий сектор (https://artace.ru/) Powered by Discuz! X3.5