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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude. [( L3 u& Y8 `
Сборка        L2j: \0 e$ C8 `4 @' n- V1 _1 S
Пример основан на сборке L2J.
" ]9 t3 {' W- O& x8 e, Y5 L7 m7 H# r! F
Первое что нужно сделать, это добавить необходимые Java классы в квест.
7 Y9 O" y/ e+ o; n7 ]/ E5 B
  1. 4 L% w- I) y6 D
  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>; U3 D) @3 q  Z  y( n' M, K5 O
  3. + h, h( @" @2 b9 W( H
  4. </div>
Скопировать код
  1. import sys6 f9 Y# x& I, R$ M$ ?( L
  2. from net.sf.l2j.gameserver.model.quest import State
    0 Y6 v( Z6 s% t7 l3 i' P1 Q
  3. from net.sf.l2j.gameserver.model.quest import QuestState3 q: ^" E- C+ y; B6 c
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082% n1 b, r' s; c/ Z% o$ k4 T
  2. FANGS_ITEM_ID = 1859+ ]: J. `6 s& M) [  B% C8 z
  3. DROP_RATE = 500000
    6 n( z/ [' z/ B# u" h, g# |
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :2 p: m$ g3 B1 A6 Q9 r, i+ @
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
4 z/ a9 ^8 r1 g( m. j
" j4 H) x6 h' {$ G! |) \2 ], W
  1. def completed(st) :- p; A7 Y3 i& k" Q& d- R# p$ R  }# `
  2. st.setState(COMPLETED)9 C' L- _5 c' G
  3. st.clearQuestDrops()
    ; o. B$ \% x$ I; {
  4. st.takeItems(FANGS_ITEM_ID,-1)/ E( t; I+ i% u, K, Y0 F# I
  5. st.giveItems(WORLD_MAP_ITEM_ID,1), o# }* U( F( n% S, ]; r
  6. st.exitQuest(False)/ e2 H: Q+ h# d2 v5 A' R- S
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False)). [8 ]" R) `. t/ t( `; p
, Q, S9 t6 T4 u5 e* z8 W/ u

# {9 X9 G7 n# P& p& V

& m; X1 ]% }! oИ наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):9 D4 e4 F0 S9 x4 ^6 j8 d) J

8 Q) I: R0 n8 g0 Z/ P
  1. def check(st) :
    8 Z9 v7 ~* ^6 T- D8 y
  2. if getCount(st) >= 4 :% c% \2 P  a* R4 }6 v' w* V
  3. completed(st)
    * A" D9 ~3 z2 F: N$ U
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
$ Y) X, c% {# t" A9 p$ z4 v8 f# C/ W8 \8 r/ h, N
  1. class Quest (JQuest):
    9 o+ \2 |' r8 y9 r
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    7 a" T' e/ I) M8 Y1 |5 R" E# {( M7 r
  3. def onEvent (self,event,st):
    " {) D' {& ?& K3 A
  4. id = st.getState()  p. N" M3 k) r
  5. if id == CREATED : st.setState(STARTED)5 Y. c! I4 q7 S- S/ g
  6. elif id == COMPLETED: pass- L- U) z  U' J
  7. elif id == STARTED : check(st)
    , g6 g1 f/ @( w0 W- c0 q. V: f$ {
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED): l4 m; U/ ?8 ]5 J& m2 l0 X
  2. QUEST.addStartNpc(7056)
Скопировать код

2 ~) C7 N; h. w
" F: B8 i( W( D9 D* s( w( X6 m




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