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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
  C$ p/ j, n% }Сборка        L2j
9 o( S/ N+ `. H* v. |' k% WПример основан на сборке L2J.8 K; {0 p- O7 j/ u9 ~  i+ E

9 |6 E5 z0 i2 U# a0 ?4 D& tПервое что нужно сделать, это добавить необходимые Java классы в квест.2 \& O2 M  R/ c% Q+ c2 G

  1. 5 [! S* o6 t7 y  ^, S5 t
  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>
    / G  S  _/ k9 H6 A. a( m/ h. g: n
  3. 6 M8 ^; x8 L7 p; m: K1 c  |: a
  4. </div>
Скопировать код
  1. import sys- x+ c# h% d9 ~
  2. from net.sf.l2j.gameserver.model.quest import State' n* H& Q! F$ _/ G" |7 O
  3. from net.sf.l2j.gameserver.model.quest import QuestState- C% Z, p9 r4 T6 f/ R
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    ( L# e4 y! _. \- A( c  t
  2. FANGS_ITEM_ID = 1859
    ; k9 q: Z# G, ]; b1 s  w. z
  3. DROP_RATE = 500000/ M8 V7 ^3 G' Y% N0 L$ n
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :4 i1 Z5 F; w( {7 Y, t4 }
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
3 ~3 a/ x$ y) B' ?1 b3 ]
/ s& U& X2 o! r  r) [. ^. U
  1. def completed(st) :& P% W+ B" R/ [  U$ ?' H' j
  2. st.setState(COMPLETED)' u  I. m; V( j
  3. st.clearQuestDrops()
    % ~5 {3 c4 C3 @0 R
  4. st.takeItems(FANGS_ITEM_ID,-1)1 x* D7 z; K1 {3 i
  5. st.giveItems(WORLD_MAP_ITEM_ID,1). U8 S" G1 \  j3 ]+ z) x
  6. st.exitQuest(False)
    9 g( R& g9 H$ I( l# b
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
5 R6 l6 L: Y* E/ _  O4 M. I4 z. G
! t5 }- {$ M  O; }. l: F
* N, i3 C! Z8 |/ J
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):3 y3 O; V. ]3 `* z# A2 Y  o( z+ x3 h

& `4 M, `! D7 k9 L# Y) U: S' Z4 p
  1. def check(st) :- U$ C/ r) i* c0 S2 _
  2. if getCount(st) >= 4 :
    % @$ _+ ]% O2 g) a
  3. completed(st)1 z4 m0 ~: E* u7 K
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.8 D0 r# h4 L, F

" V& u4 E0 b6 h+ y" V
  1. class Quest (JQuest):
    7 k2 `) z( Z! }* @0 `+ z9 P- j  [
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)$ d& E+ r% U( J& `: H
  3. def onEvent (self,event,st):
    2 ?. E! L6 S; l
  4. id = st.getState()
    8 [' b) w. j3 S* x
  5. if id == CREATED : st.setState(STARTED)0 M$ V) v% j% u" u5 d3 b
  6. elif id == COMPLETED: pass* k2 J6 U+ ^3 J+ Y# ]+ ~
  7. elif id == STARTED : check(st)
    , H( W; n' ^: Q4 p! N/ I; N
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    : ~+ |* ?" @* B2 S6 ~+ n
  2. QUEST.addStartNpc(7056)
Скопировать код

9 r6 ^. P* s- d# C' B3 h. v8 d0 v6 F/ k" |  A# T; M! E  ~





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