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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude7 m2 G  S3 J/ i
Сборка        L2j
. p2 |* @6 x4 E, U% a7 L! XПример основан на сборке L2J.
+ d  F4 h/ F4 o! v5 T
7 X; s0 A  u5 V1 m+ ^3 G( PПервое что нужно сделать, это добавить необходимые Java классы в квест.
, s5 T, e8 I8 g- A" P! r# W1 N
  1. 2 i  g: X% V+ i: [. N
  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>7 ?$ T2 i: s) \# L2 D

  3. 8 m4 I! U- R$ J6 e: v6 E# j
  4. </div>
Скопировать код
  1. import sys
      g6 E" y' L- Q  ?2 O" Q) ]$ A
  2. from net.sf.l2j.gameserver.model.quest import State
    . \! [6 y$ `0 S7 L& b- }& R
  3. from net.sf.l2j.gameserver.model.quest import QuestState/ Y9 v2 N: `2 m( c% J
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082+ h' b; a( I  I; X- ?% v" h
  2. FANGS_ITEM_ID = 18597 V6 V' A- @2 Q
  3. DROP_RATE = 5000004 U  H) r* ?9 K! a; k( S
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :
    & J# c3 s( P# K2 j+ J/ V; W
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
, v: ?' G( _" k; i* H. J
* x, S% b. @$ H% D" z4 f, C
  1. def completed(st) :
    & i$ E9 `: y" g. A
  2. st.setState(COMPLETED)" Q, K+ u" G& }( ~  B/ V& ?9 A
  3. st.clearQuestDrops()# A$ ?' ~* l% m& l$ j! S* c" i
  4. st.takeItems(FANGS_ITEM_ID,-1)" p' ]# \8 Q7 K$ b
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)
    # s- u/ X: K7 C9 h, }
  6. st.exitQuest(False): n. t$ J5 d1 b: A- D8 T) _# C
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))' i9 y* `/ Q' g: s

- e$ [5 W, K  c! m; H' l) p9 p# W+ v9 v# _& k7 }
9 k% @- s6 i. B
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
5 j! e, c' e' Z, a  ?. }
0 [9 X( Y2 Q( j- Z7 g7 _9 M* m
  1. def check(st) :% [/ ~! M* W* q" d$ E
  2. if getCount(st) >= 4 :9 b- \! N4 Q/ \' l  {5 G
  3. completed(st)/ u1 |' h- g! q- A. ^
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.4 w6 \! L, d1 F" T1 V& l, \' q
4 o0 o0 b" B% Z% h" |2 \
  1. class Quest (JQuest):
    3 ]6 a1 p' ~  b/ H* Q2 O& a
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    2 ^& S6 r# {- v; ^2 `* K
  3. def onEvent (self,event,st):4 v- G+ o: D( h8 t. C
  4. id = st.getState()( R: o+ E. o( n# \2 _
  5. if id == CREATED : st.setState(STARTED)+ j& R* r3 G9 X$ C
  6. elif id == COMPLETED: pass  n% j7 |) L  J  J
  7. elif id == STARTED : check(st)9 a' q# |, O- q6 V" j
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    ) k9 T, z& j& [; t- I
  2. QUEST.addStartNpc(7056)
Скопировать код
( q0 h3 u' x# Z
7 D" ?( @: u: c9 b9 }2 h) I% K7 y





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