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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude$ B: n& h# L3 u7 U# S
Сборка        L2j
2 @# X8 O# t- J- w5 iПример основан на сборке L2J.
9 }' `5 [$ A( l5 N1 O
( o5 B, t3 @  d/ E: Y% A! `Первое что нужно сделать, это добавить необходимые Java классы в квест.
2 m7 a0 g/ R/ i, V& h% U, ^" ?
  1. . B) H1 K+ y  s: R
  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>
    , E7 w) O% z/ _; B

  3. 9 ]; L2 B7 U7 o1 s
  4. </div>
Скопировать код
  1. import sys
    5 J7 Q% m9 K/ y% O) W% Z3 H& u
  2. from net.sf.l2j.gameserver.model.quest import State( H+ `. q- |- `
  3. from net.sf.l2j.gameserver.model.quest import QuestState9 Z" A1 e& g4 _7 n  b7 K% Z) p
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    # F: ~! s- e) Y6 V  _
  2. FANGS_ITEM_ID = 1859' h$ x/ F4 s1 S3 f7 N( D
  3. DROP_RATE = 5000009 z2 ^7 n$ e0 ^
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :
    ' w* B9 ^' G7 D) J0 d
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
$ e2 b! V8 [( C: I( d
' @7 o+ M8 W0 D) l1 U9 u: [
  1. def completed(st) :3 ~* M' C& j% Z8 X
  2. st.setState(COMPLETED)
    $ F+ f3 O8 I" L: M; ^
  3. st.clearQuestDrops()
    9 F+ J! f( k; m% ]. g$ }9 i/ c3 @
  4. st.takeItems(FANGS_ITEM_ID,-1)
    # L; K' o4 T/ K3 d# \
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)4 n( n1 T  ^( |4 v6 H6 T  c0 E
  6. st.exitQuest(False)
    6 t" q5 Y8 f7 m5 F9 {' a  d
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
/ ~& g/ \+ u& [
( S4 ~& f/ c8 u$ U2 y# Z& A4 d% x% X
. Y, \. c4 o4 U: t
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
2 f6 `, k: j. k
/ p3 q- O( U! R( `  i& G9 r
  1. def check(st) :( s. g$ \3 w" N: h: A9 x* y
  2. if getCount(st) >= 4 :3 w7 e/ r. c' M. R
  3. completed(st)( K$ B9 ]0 @( U& ^6 t5 ]% e
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.; b' f1 B6 Q- F; Y  D4 D

( @/ H2 i. j' b. ~" m
  1. class Quest (JQuest):
    " E' d' [8 w' A) P4 A* I8 {
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    6 L/ b! @6 J9 d7 |' v; j
  3. def onEvent (self,event,st):
    1 M, z, b% I; |3 M( e
  4. id = st.getState()7 c0 m3 t0 o+ ~2 M: @7 h$ M3 \
  5. if id == CREATED : st.setState(STARTED)* }- T9 Z9 r8 B% @& s2 u
  6. elif id == COMPLETED: pass+ h- P+ B' W- _/ L- E  \& R$ f
  7. elif id == STARTED : check(st)4 d/ ]. h. B- O+ v, l
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)6 a& I3 |3 L4 _" Q
  2. QUEST.addStartNpc(7056)
Скопировать код

) @% q7 r9 V: t' _
1 J/ |1 {- h1 q  j4 Q7 t" R9 }




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