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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude! {5 w" C, d$ N: J; t
Сборка        L2j
, _+ q' F) `0 i1 vПример основан на сборке L2J.
) l1 q/ d' L" a% P- i6 n/ s1 X
" T; J" u% K2 lПервое что нужно сделать, это добавить необходимые Java классы в квест.0 ^! f4 I( s6 }! r8 k
  1. * [9 E+ w: ]& }% X/ R1 ^
  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 F) d" h5 u+ m/ o

  3. 5 d7 ]+ ]. {) H9 M7 b3 c
  4. </div>
Скопировать код
  1. import sys
    # r3 R& U" b' Z* \! c) U0 B- Q
  2. from net.sf.l2j.gameserver.model.quest import State
    3 `  V7 p1 T8 @
  3. from net.sf.l2j.gameserver.model.quest import QuestState" u$ C; a6 z1 G: w) U8 [# I6 Y* ?
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082) W: f) F' C( z  l5 m5 e7 Q
  2. FANGS_ITEM_ID = 1859: H  ^' ~2 |. C# J
  3. DROP_RATE = 500000: a: U. |- G7 H1 S' U
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :  ^: g/ `! y) K% A+ d/ f
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
9 ~6 ?: Q  N2 M4 A" v4 e7 X0 Q$ C; a/ r) `2 c- q! u7 H( D. u8 {
  1. def completed(st) :* z' \. ^$ F8 c4 N( Z2 N' }. Y
  2. st.setState(COMPLETED)
    ! g2 u) K8 k) @
  3. st.clearQuestDrops()
    1 V2 e6 @; E& H# [7 m
  4. st.takeItems(FANGS_ITEM_ID,-1)
    ( S/ S* R2 k, l5 a7 v
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)
    4 k% D: M  t  L; O
  6. st.exitQuest(False)
    . j' d, E' m( _7 G
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
; d- U7 i; B" R+ }1 g% J, y
* N& j. w. ~( @* O( {: D" P/ ]1 K- g& a: Y1 U

" G9 J; L# j4 d4 _- \И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):# L. s/ F; f/ Z! ?, [3 W

" M' @6 I3 s+ k5 p( u( i
  1. def check(st) :8 _" u7 k" X0 {
  2. if getCount(st) >= 4 :* M5 M* A2 K3 l3 W+ H7 R2 k
  3. completed(st)
      H1 P) E9 d& J  Z4 Y% D
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.4 j- v' o( ?; a/ T1 p3 h9 j: S4 \1 T  e
7 `/ P6 s- y( G3 V% R* t
  1. class Quest (JQuest):
    " K% I- T5 [* G: F0 ?1 K
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)0 a3 R* e/ p4 H) e, t. k% [
  3. def onEvent (self,event,st):
    6 g7 [3 v* G! _/ Y
  4. id = st.getState()) \* q! ]( b2 u
  5. if id == CREATED : st.setState(STARTED)
    $ `& r# v: e- U* m: T, x  @2 I$ H
  6. elif id == COMPLETED: pass
    ) }5 u. _0 u1 z$ [; T4 b
  7. elif id == STARTED : check(st)
    * x3 v, k9 [. a' `0 j
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    - \5 M, Q. o# ?0 s' F* M( x
  2. QUEST.addStartNpc(7056)
Скопировать код

  n& W8 h4 J3 Y! R  z, M2 b  E) E9 |, u6 E7 O9 t$ S+ M+ k+ N





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