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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude+ d$ r1 k( W4 n
Сборка        L2j" R, {( z, W/ k' _: P1 Y5 u$ Y
Пример основан на сборке L2J.  _9 ~1 i% a1 X& k
0 K. r% O/ t8 {1 D7 X
Первое что нужно сделать, это добавить необходимые Java классы в квест.
) d+ a; B( T, A# H, @

  1. 2 X2 G9 j  v+ }$ }+ C# j
  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>
    & p. g8 Q8 [% G9 P8 s: v

  3. ) b; M+ K" k1 K4 }6 S7 X! F1 y: v% u
  4. </div>
Скопировать код
  1. import sys
    : I) S: d; X  {& W) X; q: u9 b
  2. from net.sf.l2j.gameserver.model.quest import State
    : j# |! ^  f4 V  x. w+ d
  3. from net.sf.l2j.gameserver.model.quest import QuestState
    ' f+ z. X% j% R7 T
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082; n! p  R; U  S. e1 U/ ?) K
  2. FANGS_ITEM_ID = 1859
    ' _5 }3 Z$ f! x6 ^: z, Q* m
  3. DROP_RATE = 500000
    % B) q' _: A- H1 ]
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :
    - L. e+ [, i7 Z' q1 }
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
9 v+ Y! c2 d' K  i7 x3 ~
- I0 q) Q! [# N
  1. def completed(st) :6 P& l3 O% d& \3 l( R+ n, U) Z) E8 k
  2. st.setState(COMPLETED), n* S7 L# W8 M$ Y! j
  3. st.clearQuestDrops()
    ! b3 {! ]4 }. S) ^7 G) ]
  4. st.takeItems(FANGS_ITEM_ID,-1)
    7 g; J/ j' I  M) `' `
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)
    4 D3 {- ?+ q7 M7 h. h' C5 G2 V0 Y. J/ t
  6. st.exitQuest(False)
    5 R; c( y' i5 C0 U0 d# m% I
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
" {( _. m" a3 g, Y+ N; P" F# [
! h' c! |$ _) b* x; P( r5 V. {- a5 \! s0 ?3 o

9 D9 ~% Q7 W$ S! B$ T# `3 {/ m2 gИ наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):, u& B% c6 O7 Y
. K* X& T, Z9 J7 v: o
  1. def check(st) :+ J) S9 r  u0 u' j# w% i
  2. if getCount(st) >= 4 :
    0 ]1 p; w7 O1 l1 H7 f: X
  3. completed(st)
    2 \- h& E9 h, @$ B
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
, g( i3 L/ h5 Y4 I1 L3 q, A7 a& l  j
  1. class Quest (JQuest):. {( l; ]9 X# H& B) q
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)4 x1 G/ n; `2 g- P4 R2 p% F
  3. def onEvent (self,event,st):
    5 |" K) c! A+ {- J' Y
  4. id = st.getState()) _) c: f; u* t) U
  5. if id == CREATED : st.setState(STARTED)
    % I0 W: p9 k& {" I1 O
  6. elif id == COMPLETED: pass
    ! n0 j/ o3 B7 l; S9 e! F$ J1 }  r
  7. elif id == STARTED : check(st)( V- e5 r3 e6 b/ L/ z9 C( w
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)
    1 D- J2 X' E/ a0 d  O( w
  2. QUEST.addStartNpc(7056)
Скопировать код
9 U- f' l$ I$ O! t3 y' y4 D
/ g$ H' D- n: g$ c8 Q7 y





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