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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude4 Y8 r' n1 Y0 S9 a, |3 i
Сборка        L2j
4 ?3 g0 l4 y0 ]Пример основан на сборке L2J.
* ^5 [' q6 |2 ^0 k4 y( i( Z# |( x2 o- J/ ]4 t9 ]6 K
Первое что нужно сделать, это добавить необходимые Java классы в квест.8 @+ X# A" P& Z, ?, J
  1. 5 ^6 W. X5 j: M4 M6 p
  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>
    8 ~3 J* B. M5 |) }! C

  3. - D/ T1 T) w! \/ }0 z
  4. </div>
Скопировать код
  1. import sys! r& N8 I7 s4 D# U
  2. from net.sf.l2j.gameserver.model.quest import State
    $ Q$ h+ c- k  G* y
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    " k& n# Z! r$ n& ^8 T6 l7 G
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082; R7 ~* m/ [8 |3 r! N* j* i
  2. FANGS_ITEM_ID = 1859
    3 _' L+ V) U) ]7 O. L, d' s3 T
  3. DROP_RATE = 500000
    $ P" ^! y2 L. ^. ^1 u  F0 e
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :
    : t) y7 x5 z* U9 o( t
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):8 R4 G- P- N% |! `5 o' X1 I
4 b5 d9 E3 i. P' j  V% W; O  w& Q
  1. def completed(st) :8 i8 M/ H& i7 m0 M6 l! d! {
  2. st.setState(COMPLETED)
    % Z  g' |( p* L; c) r! t4 }
  3. st.clearQuestDrops()
    6 ?; [# `3 k4 B8 z0 S
  4. st.takeItems(FANGS_ITEM_ID,-1)
    * h  ~3 m9 k6 Z- I1 ~
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)
    4 w9 o" [4 o" I1 u
  6. st.exitQuest(False)
    & V0 j/ m  r- T
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
4 Q2 x6 [* N: r/ L1 y; |4 s( \5 ?1 q2 n) q& ~, }5 _: M. s
, O+ K- K- U9 x: m3 G, o( V
' X9 E! Q5 |3 ^. d+ y" F
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):* `# z. M! e1 B  u! O
+ L' f! y0 F/ B2 ~, E  t  e
  1. def check(st) :
    & P# o* s3 o4 u  p3 L2 p( V! V4 }
  2. if getCount(st) >= 4 :
    6 F) {5 z. P2 ~6 ?7 s1 ~+ R. Q5 ^
  3. completed(st)
      r: n* v4 \; v+ l. J2 B
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
/ h5 l3 F7 v" W8 H4 p; _  h) T  w, Q) W" x( P
  1. class Quest (JQuest):, B  F7 N) @4 g0 ?' K
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
      _" }' p+ ?+ v+ S
  3. def onEvent (self,event,st):& {/ u+ v0 s, j1 k/ z9 z+ n7 U. w8 q
  4. id = st.getState()4 a( F1 u, |" X1 l' M  l
  5. if id == CREATED : st.setState(STARTED), L6 M! H" ^. w% E) y4 A7 c
  6. elif id == COMPLETED: pass) `9 H* Y, j) l) o3 o8 ~) c2 n
  7. elif id == STARTED : check(st)  [% ?* l- \0 q
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)' o5 M* [4 a2 e5 L( Q
  2. QUEST.addStartNpc(7056)
Скопировать код

- E  {# G. Q6 a* ?! F: r9 p' Z8 m+ T" D





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