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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
, |: L  W/ f% K% t: u4 M) L: `; Y* O" {Сборка        L2j
* X% N0 ^7 y$ o' o# BПример основан на сборке L2J.
& B0 j; z( P5 q( v' M' N7 V0 e& i! H1 Q5 g
Первое что нужно сделать, это добавить необходимые Java классы в квест.) ?* p, o; B+ ~) C* U5 }4 K( P" g

  1. 7 @  V& Y2 @% d" W8 a, Z) l  \' R# U
  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>
    # M7 m: k% p* E. @+ Z1 n

  3. 4 I% J0 U: }  z8 Z8 `
  4. </div>
Скопировать код
  1. import sys. A, h/ y! g- u1 A
  2. from net.sf.l2j.gameserver.model.quest import State
    0 q; y8 i6 z  `5 P2 g! j+ S" m
  3. from net.sf.l2j.gameserver.model.quest import QuestState  F" i6 a; C$ s) x& e% Z
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082: J1 X' Q7 A$ g
  2. FANGS_ITEM_ID = 1859
    . T0 B( @, h5 w
  3. DROP_RATE = 500000* Y, P- ^2 C% A4 B; a# H  F
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :+ l! ?1 ]7 I$ M$ }( @
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):" C$ b7 T9 l( e4 _
% M! Z$ e; l& b% T% w* `: ~
  1. def completed(st) :
    % Y2 e/ T9 B! `6 [* @: S- d
  2. st.setState(COMPLETED)
    0 E" b6 ~4 Q' t  A9 V
  3. st.clearQuestDrops()8 t& @1 X; m/ C% g
  4. st.takeItems(FANGS_ITEM_ID,-1)
    ; Y* N$ f- p4 M* X
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)
    2 r/ C' F& P8 V3 U
  6. st.exitQuest(False)
    # s# n" d' T& Q' F  Z
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
  J. w- }" _/ A' m8 E3 Y* H) |5 V
8 {4 g& J+ r% F+ q3 `  d/ F" n; o) {6 z6 t. O7 R9 h  P  H
  G) L6 M; b+ w. T8 n
И наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):
: ^+ _  `; Q- b$ V+ m( C, t' v( V8 G7 n
  1. def check(st) :  @5 U! k! I! {
  2. if getCount(st) >= 4 :  N- W2 d( t  c5 x+ p( f" I; U
  3. completed(st)4 @% V8 M& Q6 v; @8 o) ^+ w+ x; x
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.) Y3 E# l7 r" A

% ~9 v3 `$ p4 q" [; k) E0 V
  1. class Quest (JQuest):
    3 Z1 v' _$ Z9 \) a' d" v
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)& T; w  F7 x1 l/ c! ?' ]; _0 _- p
  3. def onEvent (self,event,st):) ^: O7 @. n5 \( @
  4. id = st.getState()
    5 D3 \8 \4 ?* c/ u" B4 T$ e$ g
  5. if id == CREATED : st.setState(STARTED)
    9 h8 `- E3 }/ D/ a# f6 s" B7 O
  6. elif id == COMPLETED: pass3 ?0 h6 s2 W+ K2 q8 A: C
  7. elif id == STARTED : check(st)
    " S& T! @* h. R! J8 D- _3 |
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)* M% U1 S' @" ~' H
  2. QUEST.addStartNpc(7056)
Скопировать код

6 ]7 {7 x5 n. J2 R) g' Z  G
0 [/ B" V( ~+ j) t




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