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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
, s3 b/ e0 X0 Q$ J5 B3 gСборка        L2j! C1 E! {- }# g5 G
Пример основан на сборке L2J.
! u7 s3 y- ]" B% O( d$ f8 Q6 ?9 }
" n2 o9 Y  G) V) fПервое что нужно сделать, это добавить необходимые Java классы в квест.
! B! V2 X! `5 L) C
  1. 2 _' ?% a2 x4 k2 i% \
  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>
    % Y1 {  G( }, q. F& G$ d  R1 f- @

  3. ; c: G3 p7 N; c5 U- \
  4. </div>
Скопировать код
  1. import sys
    ; P, }, c, e8 W8 x. o
  2. from net.sf.l2j.gameserver.model.quest import State& S; N- J3 i8 L: F8 u9 U7 U0 u" `0 O" M
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    # X2 I( {2 r+ l5 {- F
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082/ _6 A! E) j4 ~- W$ m/ F1 P
  2. FANGS_ITEM_ID = 1859
    & x& ?9 z' m. A( R) M
  3. DROP_RATE = 500000
    & T+ C1 H: {; l; C1 [6 g& q
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :6 @8 a. c7 H! F6 G
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):$ x% n4 M. y9 q, U
3 K: L% g+ w( E$ b1 C
  1. def completed(st) :4 y. I4 p4 N/ `! k1 I1 _. z" L2 x: I
  2. st.setState(COMPLETED)% q5 M- J- m: z' l/ N+ b
  3. st.clearQuestDrops()2 E, t) W/ x/ q' w) p: w
  4. st.takeItems(FANGS_ITEM_ID,-1)$ ]- @% \; f! t# H8 U
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)
    8 Z$ I$ N" ^1 ^2 Y0 z
  6. st.exitQuest(False)
    2 a% }' L) L: s7 l
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))2 A/ x0 I, b% o+ `. J; a" T- ~% ]
/ l5 f1 X' i. p" J" ]4 d$ r- ~1 k

# ]2 v# h; B0 d

& W; D5 \) t/ X8 TИ наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):0 |! ?+ a" Z! ?& N& T1 }$ m0 X( b
7 Y* M# n4 W+ U. T3 t2 u, S
  1. def check(st) :  U6 A- z) q/ h! k
  2. if getCount(st) >= 4 :( f  f* G6 Q& v" p" z
  3. completed(st)' s% I8 ^0 R6 i: s& a- C
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.( R3 N2 y  E5 h; k% q$ h9 b
/ Z3 Q/ Y4 Q* n1 Y# j
  1. class Quest (JQuest):# O! z. }& @9 T4 I# R' W) p
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    1 x" `, C- z  |
  3. def onEvent (self,event,st):
    2 A; V5 I: A: n) A- Y! |' V8 U: w
  4. id = st.getState()
    3 K: A: t1 ~' A7 R
  5. if id == CREATED : st.setState(STARTED)
    $ O; }4 A% d' K' V7 ~" p# w
  6. elif id == COMPLETED: pass
    " w; R( Y% w2 Q/ o) O0 C
  7. elif id == STARTED : check(st)8 y; {: t  V4 n/ U
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    4 p4 z! Y: w5 G3 W+ M# T# f$ {
  2. QUEST.addStartNpc(7056)
Скопировать код
6 D  T, Q) t, T7 I$ T; k2 |

/ S2 l0 N0 {3 C9 j8 P! R( J; J




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