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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
- ]+ F- ?* b0 N2 O' f$ ]' wСборка        L2j  t, Z8 C/ \  N
Пример основан на сборке L2J.
" W; m9 \/ \# C1 `
) v# d7 y9 n) X% WПервое что нужно сделать, это добавить необходимые Java классы в квест.
; H1 `" e2 F3 }3 Z& I4 E

  1. 0 \2 F$ H* e( m+ a8 |
  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>: x, h# o2 H" u$ H, S- D" \7 m; I8 l

  3. - Z( n; b' x5 h0 |% ^9 o
  4. </div>
Скопировать код
  1. import sys
    6 p7 Y6 K2 a7 R9 o# ?
  2. from net.sf.l2j.gameserver.model.quest import State  b/ f1 ^, t/ F( Q! G
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    2 @, ?# o2 e5 W4 N+ u/ C
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    ( u* V5 C# Q8 G4 n
  2. FANGS_ITEM_ID = 1859/ ^: U- E+ q- o9 u, H+ |* T- q
  3. DROP_RATE = 500000
    & e5 s3 G/ [; D0 `9 j  H- @
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :& y3 T) W" _" c
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
9 W) I% i) S; s  ^6 G4 x" W" h3 N. [; ^  I
  1. def completed(st) :
    : T( A6 y: c: A; T1 @" S
  2. st.setState(COMPLETED)
    ' _. X0 ?6 k3 q: w. i* K
  3. st.clearQuestDrops()
    ( `/ H8 u( U! e' V! B
  4. st.takeItems(FANGS_ITEM_ID,-1)
    7 p* T+ Z9 `) s5 ?! O1 F+ ^
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)( Z. Y9 n8 h8 v7 A
  6. st.exitQuest(False)
    5 a/ T8 O: ~  A1 V0 s
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))  i& R: [. w% [' C* s( _/ x+ [
! @5 ], t; y( d* x/ O
% w* Z' t6 G$ Q& O) I/ i6 ~
* _) R% r1 {% C
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):0 v4 L( `3 w* d/ j

- f8 x+ B, l) c$ I! ~  h( F* m+ ?
  1. def check(st) :
    ' E( g: W; {& W2 p) p& T9 _5 q
  2. if getCount(st) >= 4 :
    1 S# c: X9 \. P. T. Q  X1 _
  3. completed(st)
    & G% a' B& n- m4 g+ B) `. p# f: d
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.6 W0 x+ L4 r$ [' K6 r

* z+ A! b. E8 d
  1. class Quest (JQuest):) [  D2 p$ v+ e% A! ]* G" k( z6 O
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)5 m0 h- O- P1 s  b# |; a) s
  3. def onEvent (self,event,st):
    1 H' d% q/ b  v9 I; P' @
  4. id = st.getState()" W! G* m/ p9 D! Y/ W* e
  5. if id == CREATED : st.setState(STARTED)
    * R% z% W7 k) @# i
  6. elif id == COMPLETED: pass
    ! q7 j" |  B* @) a& M
  7. elif id == STARTED : check(st)* K7 O7 M0 q3 N; L9 f5 i' f
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)( g# n8 {" p5 `; m$ y, H
  2. QUEST.addStartNpc(7056)
Скопировать код

3 Q* X+ y# A1 p2 I8 }3 u0 @7 z; _. Y$ g) T0 n





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