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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
' S8 k5 i6 `& N, B5 gСборка        L2j
- F8 g- o! d( b) y* aПример основан на сборке L2J.+ i1 w( d3 Y9 ^& L" p- E
; `  E* P/ E! u: \
Первое что нужно сделать, это добавить необходимые Java классы в квест.
+ r& Y% Y+ j7 `0 r

  1. 8 G+ F; E' }8 r. T7 C1 ^6 s
  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>
    4 g. K# A) U) V# V

  3. 6 ~  ~$ k) y) I/ R. t" V( M. w
  4. </div>
Скопировать код
  1. import sys
    * J1 X5 o: }8 v. g
  2. from net.sf.l2j.gameserver.model.quest import State
    . ]/ ~) s& H. h
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    4 b; k" I3 Z% k6 k5 [7 t5 o# r
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    - ^1 X* Z' ^3 Y3 k% y( q- H
  2. FANGS_ITEM_ID = 18591 P* c6 k- z1 ]- z& C( v2 {& F# ?
  3. DROP_RATE = 500000
    9 Z. F, @0 f1 ?! [! |& x1 t1 `  n
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :* ^+ I8 \1 t) p# v+ b7 |# U
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
- ]8 E/ K0 g5 j, ^% p; j( j2 Y1 i* D! _4 H" S
  1. def completed(st) :
    / E0 k& F, K& j9 |6 p7 R& c1 _
  2. st.setState(COMPLETED)
    + D8 U" K% X1 ~4 e
  3. st.clearQuestDrops()
    ! q" |8 S( l: |5 E/ a4 O
  4. st.takeItems(FANGS_ITEM_ID,-1)8 p7 R) p: P# Y
  5. st.giveItems(WORLD_MAP_ITEM_ID,1), U- x0 e9 k/ H' |0 e/ m  \
  6. st.exitQuest(False)* S, [8 f  r: T) {
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
6 N3 Z) N9 k4 @- O
" L% n  b, I% H2 p+ L; }
' ~& a& R( o3 K5 L* Q3 S/ C' v

2 _7 M0 m. ?/ h* C( P# BИ наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
- [# S6 Y5 d$ |" u$ d7 Z0 V
  y9 G( S' ]; z, o% x) c
  1. def check(st) :# s' Y% P, K6 j) j, q/ z& u
  2. if getCount(st) >= 4 :
    * Y% h" t2 F5 h0 K, F
  3. completed(st): v7 P5 G+ V; C. z3 Y3 u
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
  m* j3 L$ I# l1 m' J7 R' D6 I+ l3 q; j4 x0 J
  1. class Quest (JQuest):# Q/ i  i( E1 z; T
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
    ) J8 s' V  e2 @0 u9 r& Q
  3. def onEvent (self,event,st):9 Q: ?: a* U. w6 A
  4. id = st.getState(); o$ _) J* t+ l$ j. X
  5. if id == CREATED : st.setState(STARTED)
    ' E+ ~# Z8 U  n. F: x
  6. elif id == COMPLETED: pass
    / t' X3 w+ t( d' _+ ]$ N
  7. elif id == STARTED : check(st)3 _5 s; w* f1 r& w; Z1 V, a. @
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    - Y' c( `$ C8 U5 M3 J* X  _, ~4 F9 K
  2. QUEST.addStartNpc(7056)
Скопировать код

$ e" H! o1 y1 p0 O' b
, M6 t, _& x, v! i




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