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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
  U5 |5 n; K$ w- PСборка        L2j
7 i; N1 K7 g# T& D+ q/ RПример основан на сборке L2J.5 r9 Q6 X! Y! @$ Z' A& t9 R
+ G' |# h  B8 `
Первое что нужно сделать, это добавить необходимые Java классы в квест.
4 ^( B. c) }4 p  J$ a" u
  1. % }$ s' }. y4 P* d; C( ~; t- 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>4 @  V" A/ G6 w8 X0 W) C- ~

  3. - n5 J, z3 m$ M$ j" {. s
  4. </div>
Скопировать код
  1. import sys
    6 Q) S: M6 w3 O
  2. from net.sf.l2j.gameserver.model.quest import State
    8 x' Y2 S) f# \- ]: B$ M5 ?9 g( r
  3. from net.sf.l2j.gameserver.model.quest import QuestState; y2 M5 H& H, ?; ~
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    ( _. v  `1 q+ \) e
  2. FANGS_ITEM_ID = 1859
    # R* @$ n. f% C  L8 P7 w
  3. DROP_RATE = 500000
    , j$ q8 d5 ~4 J7 F4 v) H
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :
    % s) l! T, P% Z3 q9 ?* j
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
) c8 W, H7 P8 M9 C7 f9 E$ d& z& R% x( {: F) s) h( g# a: ^) ?
  1. def completed(st) :
    + ]: f' a, h! b+ I1 {8 j- r$ f7 A/ w
  2. st.setState(COMPLETED)5 S. c( L) E2 c5 A# R+ u5 @, t$ C4 \
  3. st.clearQuestDrops()
    ; w! n) x% s$ m# Z* f8 N
  4. st.takeItems(FANGS_ITEM_ID,-1)
    , q% u6 T- H* w) f: c
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)+ u) d- S4 Y' [( G8 Q) k
  6. st.exitQuest(False): A$ \" _+ Q: ~+ \/ b% d
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))+ i7 J, C/ @6 }& \
5 N  V9 P' L( w& n/ h, H" B; U

" t- l6 Q4 E2 T" _

: R5 e! }- p5 B' j' M- _И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
2 f* q' N1 u+ i
, T6 g5 \5 O: J) z) p" R
  1. def check(st) :
    + r! {) f0 B' g
  2. if getCount(st) >= 4 :" z; P* p; \) }; X/ d" g! J
  3. completed(st). c9 W& q4 p! c0 @. O; W* R
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.1 S9 q7 m  t3 v4 Q; c6 P3 e

8 [8 J5 K  ~. C! I: T
  1. class Quest (JQuest):5 G8 J9 ^5 S* K9 M: g: K) y
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)* \, A  L  d) ]+ ~# f0 v" Y
  3. def onEvent (self,event,st):
    % k$ f% y6 X2 b8 I1 k
  4. id = st.getState()9 O! j: [% Z( Q( Q, U
  5. if id == CREATED : st.setState(STARTED): u& G7 m9 G) f1 x' n: T0 `
  6. elif id == COMPLETED: pass
    " E# r# P( q0 d+ n
  7. elif id == STARTED : check(st)
    : f1 _& C5 I6 T- b$ ?2 N
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)4 l; S2 c/ P3 U4 ~1 T
  2. QUEST.addStartNpc(7056)
Скопировать код
% Z6 [3 L0 i$ O" U

5 F% p3 c( M5 N9 U" {2 @% L




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