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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
: P" ~% P9 i- Z& ^% L! l1 s* |Сборка        L2j) d+ T1 S; k6 y8 M
Пример основан на сборке L2J.
5 w3 n3 n% F7 S; b, j  ?. P5 Z2 K: y! w+ _: O- k1 s
Первое что нужно сделать, это добавить необходимые Java классы в квест.
+ ^7 o6 P4 r) T& \- @

  1. 5 s* c% z0 X' @0 F. y( Y
  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>4 S2 u* D9 Y9 c/ \8 F% u( m

  3. 1 A' L- \/ n/ c$ T" b7 s$ `
  4. </div>
Скопировать код
  1. import sys( G2 S5 r) a. C" o1 I2 G
  2. from net.sf.l2j.gameserver.model.quest import State* @, L6 E3 C- k, k1 z
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    ) H% F8 t7 b, A. j" d! i
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    - K4 x: N" h1 V* ^- E- T
  2. FANGS_ITEM_ID = 1859+ j4 d# ?7 o5 |0 `! [! ^' ?
  3. DROP_RATE = 500000" m. u* ]$ W6 ^1 K. S
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :3 p7 Q( M; h* B% \, t6 g8 O# r  d
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):7 R$ N2 Y. }6 F, b1 B( d

: D: c: }! `, H; P: v0 J4 ^7 Q0 K
  1. def completed(st) :
    7 o( X$ t- R: X& [: T& [1 J8 Y
  2. st.setState(COMPLETED)5 K' v, @  l/ O; b
  3. st.clearQuestDrops()
    1 f. X; u) S% B- U. P4 V! J
  4. st.takeItems(FANGS_ITEM_ID,-1)4 ?4 K# g7 F4 i- U. l
  5. st.giveItems(WORLD_MAP_ITEM_ID,1); }$ }2 e- f! ^- W- P' ?9 G. z! p
  6. st.exitQuest(False)
      P8 j; u# {% y* N
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))% q' s2 ]  o1 S2 @! K6 H# J( T
5 _+ T2 b! f/ h8 }% M

. \- }7 C  G4 h. z" J/ J3 |, c

9 o) W! G) a: ^И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
4 ~) O  J8 p5 T  Y4 ]- F! ]* S
* a* a2 Z5 x: S" Y: i; M
  1. def check(st) :) O; O$ {2 I( S
  2. if getCount(st) >= 4 :. t, C& B5 I! V8 `- _' ~
  3. completed(st)9 f6 C1 ~; p7 f3 J( ~
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.6 e; I- D$ p$ L( ?' \6 A6 O$ V

2 a) c, E8 i1 ]8 s( @1 w0 G  X# [: g
  1. class Quest (JQuest):
    / b0 B: V" V. F/ m, Z9 H) x7 H
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)0 k' ^; O* N$ b5 i4 a1 ]5 n* B
  3. def onEvent (self,event,st):
    ' h6 f( L3 H: L+ n
  4. id = st.getState()
      ]  s* m  d- z/ |7 r
  5. if id == CREATED : st.setState(STARTED): Y8 c6 n/ N2 e, P; u
  6. elif id == COMPLETED: pass* k5 b4 @4 I/ N" {' t
  7. elif id == STARTED : check(st)
    # I# C, y7 D& a, L, U. x
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)1 Q- W- b0 O9 ?
  2. QUEST.addStartNpc(7056)
Скопировать код

5 M0 q5 u8 o9 j$ @: p6 s
! B( |! A9 W5 a




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