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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
) @& ]6 x4 E. }' K6 TСборка        L2j2 r- b# r3 o5 x3 r. K3 ?5 A
Пример основан на сборке L2J.
8 f1 g: |7 ^1 m7 L. p
6 V$ z; i$ J) K4 w! u1 L1 fПервое что нужно сделать, это добавить необходимые Java классы в квест.
3 w: `: R; |& a+ Q
  1. 5 m, ?/ \7 w% v( I! @+ l& h+ C
  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>
    , S: X0 z- b$ O1 h, Q

  3. 1 V# R* a8 ?, Z8 q5 p5 q$ p
  4. </div>
Скопировать код
  1. import sys% {+ b+ A# q  y
  2. from net.sf.l2j.gameserver.model.quest import State
    8 E3 q: g0 Z# J9 I5 `/ i* m& u  W! ?
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    6 D; {. i0 Q( Y
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082- m9 S2 i4 r6 J3 ]3 k+ a) j
  2. FANGS_ITEM_ID = 18591 D( o) z3 v5 ]
  3. DROP_RATE = 500000/ s* I# B+ f+ J9 w& M0 e* v; w, g
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :4 M! B9 ]  J) z/ ^) s1 B+ P& |; w5 j
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):( T  A" [) Z/ K
/ n9 Z7 T/ T. h2 F0 x5 L& o  ]
  1. def completed(st) :
    5 c( T6 _% q1 o5 v9 b3 r% E0 j5 _
  2. st.setState(COMPLETED)
    8 {5 t* L7 ^1 Q/ [8 d  @
  3. st.clearQuestDrops()$ x! i6 U6 \; r! p
  4. st.takeItems(FANGS_ITEM_ID,-1)
    - N. _" V1 a1 P& g" s+ X
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)
    / b( \/ \3 B0 h) n
  6. st.exitQuest(False)) C7 t  R8 P. s
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
0 x: u' U* V( \' N, U3 M  u0 Y% q1 y3 n# G* h# E

3 X$ y+ n, n4 L6 z( S4 c3 H, l
0 ?4 D1 R  _$ ?1 C
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
7 P8 j( t$ r8 g2 u) R$ g1 Z+ R7 F+ T: t+ z$ \, l& a
  1. def check(st) :0 s0 H& z' J9 ?. ?( b$ }
  2. if getCount(st) >= 4 :3 s4 l6 B: F1 K. \! S! Q$ r( |
  3. completed(st)" c5 D. g  t8 _
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
- T6 C1 H1 V$ ~' K/ h1 V; p% \5 x  x' h9 g( N% E6 l
  1. class Quest (JQuest):1 V9 F! d- Q( K: {8 w/ A
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    1 G! @+ o9 r8 f* x
  3. def onEvent (self,event,st):
    2 e5 J1 u1 s4 R  g. I
  4. id = st.getState()
    & J  f& V3 f1 K
  5. if id == CREATED : st.setState(STARTED); v( L1 @0 o' H2 G! H. O& k( a) L
  6. elif id == COMPLETED: pass6 A/ |. ]5 v" _
  7. elif id == STARTED : check(st)
    . @' J7 x  \' E1 o4 u6 ]9 S9 _
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)7 N* U; d1 p. C; e5 V- J4 u
  2. QUEST.addStartNpc(7056)
Скопировать код
" w* Z! j2 V8 O* G* a

7 ^8 D  p0 Z& b  y) C




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