Для этого квеста больше ничего не надо. Все необходимое для корректной работы квеста уже добавили. Вот полный текст квеста:5 f& n7 U9 W8 i" K5 u' `5 C9 t
. Z! Y6 r# I/ ?2 G! b
if getCount(st) >= 4 :8 d' q* s% _/ n
completed(st) # h: q s. i: Y2 |" f. Q
return ; B+ D, c: J0 \, s
6 h: ?9 h2 i \, j5 w* t3 U3 p
class Quest (JQuest):; A1 ~$ V' m5 L" I
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)# Y( @! g" F' o5 X4 S4 A: h/ F0 a
Теперь рассмотрим, как это работает. 2 O( a0 F. f& V# t. D& Q3 JИгрок подходит к начальному NCP (в данном случае 7056), нажимает на «Quest». Квест будет создан и состояние квеста перейдет к CREATED и игроку будет показана страничка Start.htm с описанием квеста. Тогда метод onEvent, поле открытия странички Start.htm переведет состояние квеста в STARTED и игроку будет показана страничка Started.htm, где будет опсание того, как найти keltirs и .т.д. , H, S8 C- i" A0 y7 f % f+ A# B' s# S+ h% W- T4 ] X5 J; r, M8 h
При состоянии STARTED будет зарегистрирован дроп «fangs» при убийстве keltirs. Игрок может вернуться к стартовому NCP и спросить о квесте – метод onEvent будет вызван снова. Если у игрока не хватает необходимого количества предметов, то метод check() не переведет квест в следующее состояние и Started.htm будет показана снова. Но если игрок собрал необходимее количество предметов (в данном случае 4 клыка), то метод check() вызовет метод completed() который переведет квест в новое состояние COMPLETED, заберет все клыки, даст карту мира, т.к. это награда за квест, покажет Completed.htm и завершит квест.% Q2 S* R7 j" {* G4 j
# b5 V' w4 p" b* {3 u : O- g- @& p/ W' @4 iТеперь давайте сделаем наш квест более похожим на то, что он должен из себя представлять. y9 K3 j- W" e. Q, P2 @- I' X
Прежде всего у нас есть 3 метода для объявления их в Яве – onTalk, onKill и onEvent. Если методы onTalk и onKill не объявлены, то за них все будет делать метод onEvent, т.е. определять квестовых монстров и вызывать диалоги NCP. Есть примечание, методы onTalk и onKill будут вызывать только диалоги с NCP в зависимости от текущего состояния квеста. Метод onKill будет вызываться только тогда, когда мы убиваем квестового монстра.3 I9 F/ q3 T* {7 z% A$ E
* I( D- H- U5 g+ {. w* G: L0 w& L. [1 `( g! A
Давайте рассмотрим как вызывается метод onKill при убийстве keltir в состоянии квеста STARTED: " u- k( T) n( \
STARTED.addKillId(KELTIR_NPC_ID)
Скопировать код
и метод onKill в классе Quest: 9 u. r: I m+ D8 c% v4 C% B : \; a; Q3 {' r. G% E9 |4 ?
elif n == 1:! g- W: p+ [8 w2 l# M: l# d3 Y& `- I$ U
return "Chat1.htm" 5 E" M% U/ K+ ?! N3 D: X
elif n >= 4:: j5 w/ D0 {7 \8 [1 q
return "Chat4.htm" ?! B5 Z/ Z8 z+ v5 z/ g) I
return "Collected "+str(n)+" of 4 fangs"2 m1 d' ]) [( s( @
return
Скопировать код
Метод onKill (а так же метод onTalk) имеет следующие параметры: & G5 Z2 ~( \3 G! ~0 Z' e: S U: I- S1 @7 ]
% V% r9 N0 q a. H0 Q: Q& \• self – квест * p. x& U2 s/ K Y• npcId – ID NCP, которого мы должны убивать (если это метод onTalk, то ID того NCP, с которым мы должны поговорить). ! e% |1 h* L# H• st – текущее состояние игрока.+ O8 Q, T+ w; T$ O
8 F; @5 D( r' } V/ t % O8 R7 |6 M* wВ этом методе мы проверяем и отмечаем, является ли убитый NCP keltir’ом. В основном эта проверка не нужна, т.к. у нас только KELTIR_NPC_ID. - u& a$ b4 N7 Y+ a) U. s$ c+ o ) e- Z A# v1 k }5 d; J) r" m0 [$ PЗатем проверяем количество предметов (в данном случае количество клыков), и если их вообще нет, то возвращаем строку "Chat0.htm", если только один предмет, то возвращаем строку "Chat1.htm", если же предметов 4 или больше, то "Chat4.htm". Если строка возвращена из методов onEvent, onKill или onTalk, то сервер покажет соответствующие htm. В Chat0.htm может иметь следующий текст: «Вы не имеете ни одного клыка, возвращайтесь позже, когда соберете 4 штуки и бла, бла, бла…», в Chat1.htm может быть следующий текст: «У Вас всего 1 клык, по этому соберите еще…». В Chat4.htm – «Вы собрали необходимое количество предметов, возвращайтесь к вашему тренеру, что бы завершить квест…» 8 P. E* t2 ?$ Z. `: R/ O9 W1 h/ ?# {8 { \$ U
2 g( Y+ \ N M2 B- \# l0 U8 d& n- EПримечание: если в строка return начинается с "<html>", то будет показана страничка html с текстом, который стоит далее. Так вместо: ( p; u! w1 J; t2 y- O" Lreturn "Chat4.htm"4 L" l7 H& ~& p9 z- c
return "<html><body>Return to your trainer to complete the quest</body></html>"
Скопировать код
Так же если строка заканчивается без .htm или в начале нет <html>, то текст будет выведен, как системное сообщение в окне чата. В нашем случае мы сделаем так, что бы при каждом убийстве keltik выводилось системное сообщение: «Собрано N из 4-х клыков». 6 k6 O0 V1 w7 E. M+ X( X. S" i9 |- m9 i. ~$ q" X) Z
8 `5 u9 O: f, _& Y
Наш код для onKill имеет один недостаток. Он будет постоянно показывать Chat0.htm, Chat1.htm и Chat4.htm, нам же необходимо, что бы Chat0.htm и Chat1.htm показывались только один раз. Как нам это сделать? С помощью переменных. * |; b, W. d$ L' U, q) J1 L" \, a2 y! ~. z5 ]0 A
( }: I( P' H$ b4 Q4 tВ каждом квесте строки могут храниться с помощью переменных. Эти переменные сохраняются в Вашей БД. В каждом методе мы можем назначить, прочитать и удалить переменные. Давайте изменим метод onKill, так что бы каждый диалог вызывался только один раз. 8 ^. h! v9 f: |* l' o0 x& d
def onKill (self,npcId,st):' N0 `# f# [! ^4 M9 y
if npcId == KELTIR_NPC_ID:4 f3 ~0 @$ i+ v- e6 K: E6 w! d
if st.get('chat1') == None :) f& S4 e+ [1 p5 ?4 M4 O
st.set("chat1", "true") 0 D$ t0 c) X! S7 {
return "Chat1.htm" , F# y! S8 X, ?" M8 P8 {3 K$ ?
elif n >= 4:2 `: p$ U3 Z7 c( t& R# S
return "Chat4.htm"' \1 D! c, U& V) E
return "Collected "+str(n)+" of 4 fangs"! d" `' z. f3 d% t; _+ ~
return
Скопировать код
Если у игрока нет клыков (n=0), то мы получаем занчение переменной 'chat0'. Когда метод onKill вызван в первый раз, то пока ни каких переменных не имеется и python возвращает значение None. В этом случае объявляется переменная и показывается диалог Chat0.htm. Когда мы убиваем keltir, но не получаем с него клык, функция st.get('chat0') возвращает строку true, а не None. И во второй раз окно с Chat0.htm не появится, но в окне чата появится строчка «Collected 0 of 4 fangs». По тому же принципу сделано и с Chat1.htm.; g. f' X$ G( R( N. R
% i" E8 z1 s! A1 Q+ r! [! w. g. ]* g' \8 G6 w3 W+ [
Вот конечный рабочий вариант квеста: 5 d1 I4 y6 x- |
import sys , \2 t8 `9 a( O1 ]% e; v
from net.sf.l2j.gameserver.model.quest import State1 ]9 P n) L* t- g
from net.sf.l2j.gameserver.model.quest import QuestState " k: H" q7 z% L0 h
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest H+ a1 @/ n5 K, O