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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
' P6 a; L5 S. A) V4 nСборка        L2j9 ^' x4 z9 I7 l' p) U: Q/ e
Пример основан на сборке L2J.
8 o6 {/ B# k  q. Q5 A
3 u- P" O5 \* H4 S& b/ Q& ?' QПервое что нужно сделать, это добавить необходимые Java классы в квест.8 U0 h5 k* E4 p4 A7 `

  1. 9 y  s/ k! H, M
  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>  j) C: M5 ^: O
  3. 1 w0 k% E( z8 N
  4. </div>
Скопировать код
  1. import sys; q, ^) r2 w7 a7 X
  2. from net.sf.l2j.gameserver.model.quest import State
    : E8 e3 G9 c' Y% |3 e" N3 y
  3. from net.sf.l2j.gameserver.model.quest import QuestState6 n% ?9 K! }0 K5 G; ^
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    : W; Z( v+ r6 c' E9 O
  2. FANGS_ITEM_ID = 1859  ]$ k& |; ~. |
  3. DROP_RATE = 5000004 C( a) Y  v2 Z. z2 z* A) c1 W
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :; s1 L+ W* y4 Q% D& `1 C
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):1 f  ~; v0 T2 j7 M% Y$ B$ m( K
3 r9 q3 O0 [3 `/ h1 J1 |
  1. def completed(st) :
    7 o6 c, W( u) A# _
  2. st.setState(COMPLETED)+ e5 e2 |3 ^/ R7 k
  3. st.clearQuestDrops()0 `! E6 w; s) O- `; z
  4. st.takeItems(FANGS_ITEM_ID,-1)
    5 p0 o1 ^0 H$ X
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)1 R5 o+ x4 m: f/ N( M
  6. st.exitQuest(False)5 }& b8 W  z3 ^% U7 q- q
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))8 @* B: b) v+ m+ Z1 A2 y2 \5 g
/ g1 L, `' D$ K  y9 L1 v

% n5 Z) m/ O, _' k6 T
) g. V" @% {: x5 o" a1 Y
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):0 @! O* p" B+ w" |
+ t2 l, M  t, Z( B' N4 i* k
  1. def check(st) :4 K" l, o: g+ _& v6 ~
  2. if getCount(st) >= 4 :; p8 r8 N" y0 B# I6 K3 _
  3. completed(st)
    & _  D0 J7 C+ S( A7 N  K
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
. }' X+ M6 z6 y1 g( \/ `; Y, {+ f: k) n" q
  1. class Quest (JQuest):
    & j; o2 G" v  F1 z* `" ~) Z1 W
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    2 |6 B2 {3 D" [. N, i
  3. def onEvent (self,event,st):
    3 _; {6 U" n9 g; l& Y+ t
  4. id = st.getState()
    ( r: ^  x5 ~' M
  5. if id == CREATED : st.setState(STARTED)
    . i( s! ~" ^/ R% y9 [" j
  6. elif id == COMPLETED: pass
    / [2 ^: s( Q) x, R3 c0 U6 g
  7. elif id == STARTED : check(st)
    . x7 p3 c5 H- Q# w+ _. M
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED); @3 Q, O; |  L3 R9 {) R
  2. QUEST.addStartNpc(7056)
Скопировать код

4 D# a. Z/ [8 y$ c9 @( N) h9 N) Z5 j3 J" `! n6 S( k: j# `- F( Q" l9 u





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