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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
. M1 J) D2 ?& tСборка        L2j
& h7 z3 S* t. p/ ^Пример основан на сборке L2J.# J: J; c3 ?' ?9 M- g9 X6 Z

0 c) b; }0 G1 w8 ?$ @( t" E* q7 U5 RПервое что нужно сделать, это добавить необходимые Java классы в квест.
; h2 O* R: b! P$ ~; G% u. ^

  1. 4 A( v7 G) U# ^
  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 R  x  H' a  R
  3. 5 [. r7 M$ m1 R1 E$ E2 }
  4. </div>
Скопировать код
  1. import sys
    ) n, B" I+ Z* \5 P+ ~. Z
  2. from net.sf.l2j.gameserver.model.quest import State2 a! P" F; t# `2 g' m& ]
  3. from net.sf.l2j.gameserver.model.quest import QuestState5 C( Q4 j0 ?0 @
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    ; ~- A, v3 ?7 L: ]
  2. FANGS_ITEM_ID = 1859
    ) i' l* J4 B+ m
  3. DROP_RATE = 500000
    , `! H6 T7 D, `: X$ R8 b
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :
    & x5 i  Y& ?/ J* T# |9 M
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):; R' c3 P1 E2 C+ M+ u& K

! X+ O/ {" |4 ]: z* e  y
  1. def completed(st) :' a* v/ z- J7 @
  2. st.setState(COMPLETED)
    ! s$ X* |) o9 n
  3. st.clearQuestDrops()6 D" O0 M% s0 l/ d* @
  4. st.takeItems(FANGS_ITEM_ID,-1)
    5 i3 x  J2 i5 i# H% |. y
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)
    : c  ^+ k; S# X
  6. st.exitQuest(False)
    . J% d: T! I) ^4 A7 j: M# e
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
/ l; S; H; r4 j+ M- i8 Q
4 i6 }( S4 L- o/ l& N/ L
/ ^! G. R' c7 B8 {; n7 \. U8 B# p" x

% T  l' d- n, P3 N( u. R+ b$ vИ наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):1 e- d8 S& v5 t7 }( L2 v

3 F$ P. E# o, P/ O6 w
  1. def check(st) :
    0 i9 k0 G% G" |
  2. if getCount(st) >= 4 :
    6 K  y+ C; R& @+ C* l& w( E
  3. completed(st)
    : U" S% `" Z4 p" ?9 n, u2 @
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.( D- r' {! L1 N, h# X6 }$ ]8 |

5 b3 n+ K5 z! D5 D9 o
  1. class Quest (JQuest):
    $ _$ G0 T; O+ u- c0 s; {$ n% ~1 V
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)- F( n: @" l8 s" L: H6 B3 }, Z, R
  3. def onEvent (self,event,st):9 A( _. I7 {  s1 g. P& o" S
  4. id = st.getState()
    6 y5 j7 T" F8 Y  s/ T
  5. if id == CREATED : st.setState(STARTED)
    7 G' Z: @* z  Z. x, P. u* j
  6. elif id == COMPLETED: pass$ s+ @3 Y7 k# y/ l8 u; Z
  7. elif id == STARTED : check(st)
    0 b$ t5 r4 ^7 e  {9 k* d/ ^* d0 T
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    / u* n/ F+ j1 I! j
  2. QUEST.addStartNpc(7056)
Скопировать код
) p/ {. P* l* ]7 G
, W3 T, Z2 Z; u" D  {% d; s





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