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

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

Автор: admin    Время: 2024-9-17 18:39
Название: Создаём собственные квесты (часть 1)
Хроники        Interlude
9 h) V- v5 T# D* F9 d4 u0 Y+ AСборка        L2j; ?! T, O" i) i8 ~0 G/ O. Y
Пример основан на сборке L2J.% y  e8 ]( _4 X, }/ ~9 F7 B

" q$ p7 s; J5 G- m, pПервое что нужно сделать, это добавить необходимые Java классы в квест.4 f# u7 P0 [3 u

  1. + k5 P* G& E2 ^
  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>3 F3 T, y. z, o( S6 ~* \

  3. 8 y# {1 Y9 f# P' ?: c
  4. </div>
Скопировать код
  1. import sys
    $ u! W5 q; w8 H/ n! k4 m5 C- c
  2. from net.sf.l2j.gameserver.model.quest import State
    $ p8 \# Z9 m7 W, X: R4 G
  3. from net.sf.l2j.gameserver.model.quest import QuestState8 j1 }- ?7 D" H( H
  4. from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest
Скопировать код
  1. KELTIR_NPC_ID = 12082
    & b" q" {  D; I, R% l
  2. FANGS_ITEM_ID = 1859" x3 k, m. ^1 l" D& L9 s& E5 d
  3. DROP_RATE = 500000
    6 X: d# a. a% G5 J
  4. WORLD_MAP_ITEM_ID = 1665
Скопировать код
  1. def getCount(st) :
    + y3 V: C% {+ i; x: f9 M4 V; T/ A
  2. return st.getQuestItemsCount(FANGS_ITEM_ID)
Скопировать код
Функция для завершения квеста (st должна быть в QuestState):
$ W! x- @, J6 D! ~) Q
1 z2 o; g' T) P3 R: B6 |  P1 T
  1. def completed(st) :3 _) c( ~# m8 u, Y$ z* O3 k
  2. st.setState(COMPLETED)5 C3 ^" E- H# {1 V7 o
  3. st.clearQuestDrops()
    $ Q9 Y6 U# I8 h, k, U$ E8 m5 u
  4. st.takeItems(FANGS_ITEM_ID,-1)
    0 L2 i+ E/ i3 t  H; R
  5. st.giveItems(WORLD_MAP_ITEM_ID,1)3 a, C( {$ _: d8 o/ J
  6. st.exitQuest(False)
    8 d$ G" i% g3 f& V& K3 l
  7. return
Скопировать код
Тут объявляем квест выполненным, сбрасываем квестовый дроп, забираем все клыки у игрока и даем ему награду. Затем сообщаем серверу, что квест завершен и больше не повторяется. (st.exitQuest(False))
7 O) L$ Y: _4 I1 L% R8 _
6 l" v/ o: ?3 X% g2 L, V% ~( ]1 y3 m% `/ u

6 }  t8 o2 ~& n$ c4 lИ наконец вспомогательная функция для проверки необходимого количества клыков у игрока для завершения квеста. (st должна быть в QuestState):% W/ x0 c6 J: x5 Y% E7 x
" K1 }+ u* G5 N( k' v8 i
  1. def check(st) :
    / S: D; q) C- _. b# Y" y$ [8 F
  2. if getCount(st) >= 4 :
    0 w- d) T/ s+ |$ O9 X( n- {$ y
  3. completed(st)/ d$ L' w. Y3 Z7 {
  4. return
Скопировать код
Затем мы объявляем непосредственно сам класс quest. Quest – класс python, который расширяет java класс net.sf.l2j.gameserver.model.quest.jython.QuestJython. Затем мы объявляем метод onEvent, который вызывается Явой, если квест кто то начал.
5 o6 S! J' h3 {! v
3 ]! k! b5 E; z; I" O% N! f+ q. H
  1. class Quest (JQuest):
    / Y1 u; j7 B0 X9 [0 c
  2. def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)  A' a; R/ l) S7 Y: w1 K" c: g
  3. def onEvent (self,event,st):. N3 L9 v0 \, |  {
  4. id = st.getState(). g+ |/ o% H7 ~- n; A; Q
  5. if id == CREATED : st.setState(STARTED): {9 A, Q; M3 k+ W  Y
  6. elif id == COMPLETED: pass
    4 U: t, E+ Q, U& r
  7. elif id == STARTED : check(st)
    7 F6 |3 S' _2 B$ q3 _* g
  8. return
Скопировать код
  1. QUEST.setInitialState(CREATED)% ^- ]. N4 ^- [  g
  2. QUEST.addStartNpc(7056)
Скопировать код
% m& M1 A4 B. @1 c
8 I- @, ]8 y7 C5 i3 L! r7 q9 L, X





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