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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
" u4 `& k0 F  o) S  VСборка        L2j
  N4 q2 D. C% G) X" xПример основан на сборке L2J.
# n5 c  _( u& [/ R2 N* g. D+ c( K( |8 j! E
Первое что нужно сделать, это добавить необходимые Java классы в квест.( }- Y2 C3 i$ p: i/ w2 X

  1. 1 O; m( }/ N$ r6 B+ @. J% Z7 V
  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>/ N- s4 ~6 i& H, f

  3. , H% R* m0 C  S, R; A& ~& @
  4. </div>
Скопировать код
  1. import sys
    * A' F. N  ?( @1 a3 d- P
  2. from net.sf.l2j.gameserver.model.quest import State
    / w7 m" W. V. x
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    ) [3 O1 M: R3 s5 |2 ^, U" L+ X
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082/ s, I4 f$ ^1 F1 B" Y6 r- g2 H  d
  2. FANGS_ITEM_ID = 1859" A! Y0 a4 F5 M7 X/ P$ Z% J5 r& F
  3. DROP_RATE = 500000
    / ^; _0 P4 T& Y+ @, I0 y
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :' P1 W/ `3 h  O# i+ G/ i
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):6 s- s! j% f( x) u! k

* E! a+ Z# h3 w6 K
  1. def completed(st) :
    ( i& b; F# \0 V, t* f
  2. st.setState(COMPLETED)! t9 t% J0 |" S, ?
  3. st.clearQuestDrops()
    1 G/ v. k# J) n/ @& k) m" }
  4. st.takeItems(FANGS_ITEM_ID,-1)0 s- y) s- u1 N% @8 g  N
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)* }8 g/ X# J/ M9 Q/ F4 d, t" N
  6. st.exitQuest(False)
    + W2 `( F7 O" b: x
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))/ A# F4 S! S+ }0 Q
7 _6 s$ x6 r7 K+ a1 C8 I& y" I

9 P4 S8 y9 m1 r" W2 Y# Y
! n+ q; T# n/ Y" {: W4 z6 t
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):4 [/ ], w$ r6 D0 w' d1 J4 m5 m
4 J/ B6 S6 U1 }1 j( I
  1. def check(st) :
    ) x- R& q$ b. E+ h0 [* t! L. B
  2. if getCount(st) >= 4 :
    - x' O2 \0 @7 C! c8 c' l
  3. completed(st)
    + B9 q5 R2 _1 Q
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
5 s$ |% o1 g/ `! N* D+ X
% T* s# h8 I! ~5 @
  1. class Quest (JQuest):
    5 G7 ^: r# e7 J3 i- J' A
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)$ C  q  d, D) x" X
  3. def onEvent (self,event,st):
    6 y  L) D3 t' V8 w4 m1 K* k
  4. id = st.getState()
    6 t2 Q. [/ e! h1 ^1 b
  5. if id == CREATED : st.setState(STARTED)
    8 L( r2 b9 M8 }3 g1 V
  6. elif id == COMPLETED: pass
    % c# _2 i& H% u
  7. elif id == STARTED : check(st)2 Q( L8 S* k; Y  q; v
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    * p7 ~+ F  K. e0 a2 Q  t5 `
  2. QUEST.addStartNpc(7056)
Скопировать код
. A. t' E" y# V" i" {
. l; }- _: J1 H$ j. g) a& M





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