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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
1 i4 q4 p* l) ]Сборка        L2j
1 q( ]  n# m( I0 AПример основан на сборке L2J.
( q, a3 U' q% z: o5 A. O6 M+ g6 a, B+ q! T' I! J
Первое что нужно сделать, это добавить необходимые Java классы в квест.
# j/ X: G4 h# X4 Z0 B, k

  1. 4 n, ]& E7 d* D! a7 T  L
  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>
    . a1 W/ A! E2 S& M- G
  3. 7 J* v; p/ @- O$ H9 I% d; C1 Q, b
  4. </div>
Скопировать код
  1. import sys7 R: a4 ^' s. ]3 C, Y) ]* n2 j$ w
  2. from net.sf.l2j.gameserver.model.quest import State
    * R: h& E' f" y
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    1 ~% b4 s- x4 h5 `6 E
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082# [# a4 P  m6 B1 d
  2. FANGS_ITEM_ID = 1859: U8 j0 _! k7 B  T
  3. DROP_RATE = 500000
    0 K- T# x: `$ V7 d
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :0 l! d) Y! `: [; Q
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
5 a( H) k/ m% {5 z# _. a. a% l2 F1 l5 A" y* T
  1. def completed(st) :
    ( ?, a6 j$ M5 C, e9 c0 p3 g0 i
  2. st.setState(COMPLETED)3 z2 n# J  {% |$ l8 e: V$ ?
  3. st.clearQuestDrops(). i0 [  `8 |& `0 l
  4. st.takeItems(FANGS_ITEM_ID,-1)  r* ~# b6 J9 g
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)9 \+ S2 D" Z0 h( l7 ~* i% q8 F& q
  6. st.exitQuest(False)
    7 g' c6 \" j# F, M9 _: Y
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False)), D# i8 Q6 m  Y( e5 U
" M. a/ z! H! m9 w9 J, ^

' q4 ~7 E2 X/ m9 n

0 s5 _. j% C8 v, x/ x+ E# K, \И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
# m& `5 ^, R" b/ r# O: S! i, n0 H2 ]8 C
  1. def check(st) :
    7 d; a* p' P5 Q
  2. if getCount(st) >= 4 :( T! ]! R4 D% c4 G
  3. completed(st)
    - u7 M" Z3 e4 I; e9 U
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
2 E# }, h! o  z5 O" z, M! X1 Z6 E- X! {% D3 ]# G3 c* S) i# J% f
  1. class Quest (JQuest):
    7 Z  J2 P$ _: _
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    : ^% ^& s; P$ {. g3 M# I8 r
  3. def onEvent (self,event,st):
    1 Z2 X. i) M* x  e! U6 N
  4. id = st.getState(): |5 h2 p: E4 H' @
  5. if id == CREATED : st.setState(STARTED)
    8 Z0 J+ u4 I$ D+ H
  6. elif id == COMPLETED: pass2 J+ D" H" U+ d( p  b: j0 Q2 p' n
  7. elif id == STARTED : check(st)
    ; x/ R# E, T0 H1 b2 B4 u* O
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    8 Y& Q+ I6 t' ?1 R! o/ T
  2. QUEST.addStartNpc(7056)
Скопировать код
6 o4 Y1 c" a4 a$ R% U
6 J* c; N) U# @6 Z% S6 H  y





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