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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude  F' q1 ]# M+ B) H
Сборка        L2j
3 b- Y6 G" }6 ]' SПример основан на сборке L2J.( x$ w1 I4 C* G9 @

9 h& B/ R+ o7 ]- l4 h) rПервое что нужно сделать, это добавить необходимые Java классы в квест.
5 t) c) F; [  o/ l6 U8 n% o

  1. $ E. o0 X$ a; k# u$ A% e
  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>. _; U5 m; p9 P' _+ @$ d/ V0 y

  3. 0 b2 b# p) k6 H! V: Q: x7 x
  4. </div>
Скопировать код
  1. import sys
    1 G* i+ D# f- v$ ]. T6 O, j/ E
  2. from net.sf.l2j.gameserver.model.quest import State2 q/ t! A% o* v" s
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    5 K- L7 Q$ Q; Q5 d' x
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 120826 n6 Z: m% |8 J. K
  2. FANGS_ITEM_ID = 1859* X5 l, j+ n( N' Q1 s9 z
  3. DROP_RATE = 500000
    & u% P& b" U2 e* A0 u$ ]) M1 Q  _
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :4 x5 P* I3 B( W3 {1 `  {
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
( m" ^& U! @- u9 D  [
& |  R) f4 |( \$ W
  1. def completed(st) :! [/ e! u% b, L( z
  2. st.setState(COMPLETED)$ M/ B$ U; P- ^. \- O( T% ?% K- I3 x
  3. st.clearQuestDrops()+ e* e" g* k. |3 x5 L
  4. st.takeItems(FANGS_ITEM_ID,-1)$ \+ R  ?: n* [0 B6 T3 O
  5. st.giveItems(WORLD_MAP_ITEM_ID,1), C4 R- n$ L. @6 l
  6. st.exitQuest(False)9 {& ~' I! m6 N- m2 H
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))- c; u8 W- H* L! M
9 [3 R1 \& h$ R' ?8 M
5 N2 n- \- E! X/ r2 T

) E# U3 j- w: y  x4 NИ наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
  J. d+ }# R' z9 ]$ K% c
- |: w, f" F- }
  1. def check(st) :
    & T3 j: Y6 b# v! j& P" {/ W1 a6 o4 k5 ]
  2. if getCount(st) >= 4 :1 E7 u/ z/ ~$ B6 U
  3. completed(st). u9 m: `% R2 q5 C% f/ K# b5 [2 ]  z
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
) F; {5 s( X5 [# [3 g
5 b! G/ C4 K7 \2 Z
  1. class Quest (JQuest):/ M7 P0 s  m1 ?/ ^3 G
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)6 {1 \; [4 D8 D2 S- a* |
  3. def onEvent (self,event,st):
    5 M. Z* i  J* L% _! v
  4. id = st.getState()
    ( V" t  o$ J& R4 _  `) i$ H( u
  5. if id == CREATED : st.setState(STARTED)# q# o) k% I9 `  l
  6. elif id == COMPLETED: pass- i5 p* Y2 ^$ m% a2 X0 Z
  7. elif id == STARTED : check(st)
    * ~/ j0 q$ V1 T
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    ! J3 E5 t. b, f! g
  2. QUEST.addStartNpc(7056)
Скопировать код

* H9 l! y  i, W/ F4 x/ i7 `8 a# O) o  N4 `% }





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