Для этого квеста больше ничего не надо. Все необходимое для корректной работы квеста уже добавили. Вот полный текст квеста:: R: C+ t. ^4 l/ @& _
7 \# m0 z1 u& y
Теперь рассмотрим, как это работает.$ C8 j/ l+ j2 [0 G, @2 v2 I$ _
Игрок подходит к начальному NCP (в данном случае 7056), нажимает на «Quest». Квест будет создан и состояние квеста перейдет к CREATED и игроку будет показана страничка Start.htm с описанием квеста. Тогда метод onEvent, поле открытия странички Start.htm переведет состояние квеста в STARTED и игроку будет показана страничка Started.htm, где будет опсание того, как найти keltirs и .т.д.9 q# ^& |0 e4 M# O
. \7 z( N# M( ^; H* D! E1 Z: t
( ]/ v: T2 t2 RПри состоянии STARTED будет зарегистрирован дроп «fangs» при убийстве keltirs. Игрок может вернуться к стартовому NCP и спросить о квесте – метод onEvent будет вызван снова. Если у игрока не хватает необходимого количества предметов, то метод check() не переведет квест в следующее состояние и Started.htm будет показана снова. Но если игрок собрал необходимее количество предметов (в данном случае 4 клыка), то метод check() вызовет метод completed() который переведет квест в новое состояние COMPLETED, заберет все клыки, даст карту мира, т.к. это награда за квест, покажет Completed.htm и завершит квест. . e1 h0 z. d) n% c' s* c X1 {; c6 u
. _% _* K7 t v" I3 l6 i
Теперь давайте сделаем наш квест более похожим на то, что он должен из себя представлять. ; D5 z6 M: z: K8 u$ S/ {$ _Прежде всего у нас есть 3 метода для объявления их в Яве – onTalk, onKill и onEvent. Если методы onTalk и onKill не объявлены, то за них все будет делать метод onEvent, т.е. определять квестовых монстров и вызывать диалоги NCP. Есть примечание, методы onTalk и onKill будут вызывать только диалоги с NCP в зависимости от текущего состояния квеста. Метод onKill будет вызываться только тогда, когда мы убиваем квестового монстра.1 q) z7 A' a9 x, w5 d% T6 h
* L* g: B- r; ]9 l$ Q. V
& w7 I3 R2 A5 V; r2 o7 h$ T. nДавайте рассмотрим как вызывается метод onKill при убийстве keltir в состоянии квеста STARTED: ) s" ?/ b9 m/ E! ]3 i/ G
STARTED.addKillId(KELTIR_NPC_ID)
Скопировать код
и метод onKill в классе Quest: 7 c! X* M( u4 Y% h3 h4 a) c; Y9 ^6 q2 Q! k5 Z# F
class Quest (JQuest):$ s8 ]* ?1 m8 \' K) |+ [- n9 V {
return "Collected "+str(n)+" of 4 fangs" " ]$ s7 x4 o; q+ |. z& ?7 T5 g
return
Скопировать код
Метод onKill (а так же метод onTalk) имеет следующие параметры: 7 H# V- Q7 a5 ? A2 T; i & p/ r) G7 b. j2 y ' D. i, E `/ q3 g5 ]• self – квест , b5 D) S0 L/ _, G. b• npcId – ID NCP, которого мы должны убивать (если это метод onTalk, то ID того NCP, с которым мы должны поговорить).% F9 o" k# [) Q$ w
• st – текущее состояние игрока., |0 x2 ]& [: X- ^, J2 h5 H
8 B0 k8 _( m. A. D3 p( w# u# D6 c) z9 {' C5 ^
В этом методе мы проверяем и отмечаем, является ли убитый NCP keltir’ом. В основном эта проверка не нужна, т.к. у нас только KELTIR_NPC_ID.# A6 h& p/ Y: {/ P5 J! a
5 {8 v l; x! M/ v : W. q2 w9 B$ C; D. M2 o5 T6 T0 w7 jЗатем проверяем количество предметов (в данном случае количество клыков), и если их вообще нет, то возвращаем строку "Chat0.htm", если только один предмет, то возвращаем строку "Chat1.htm", если же предметов 4 или больше, то "Chat4.htm". Если строка возвращена из методов onEvent, onKill или onTalk, то сервер покажет соответствующие htm. В Chat0.htm может иметь следующий текст: «Вы не имеете ни одного клыка, возвращайтесь позже, когда соберете 4 штуки и бла, бла, бла…», в Chat1.htm может быть следующий текст: «У Вас всего 1 клык, по этому соберите еще…». В Chat4.htm – «Вы собрали необходимое количество предметов, возвращайтесь к вашему тренеру, что бы завершить квест…» ) g; b0 E6 F0 i/ i1 g: F5 K7 g+ U' Z * Z: D4 I' V3 R. W$ H" @3 L8 n 7 o" c7 p7 X+ SПримечание: если в строка return начинается с "<html>", то будет показана страничка html с текстом, который стоит далее. Так вместо: 4 g' X- b5 j0 Treturn "Chat4.htm" 9 m+ U6 J8 `! j) Y1 L) l ; L2 |% T2 S* t* F! N, X' c! i8 ]9 R1 D7 Y. S3 R1 h
можно поставить: 5 A0 s# R r" u& l* x
return "<html><body>Return to your trainer to complete the quest</body></html>"
Скопировать код
Так же если строка заканчивается без .htm или в начале нет <html>, то текст будет выведен, как системное сообщение в окне чата. В нашем случае мы сделаем так, что бы при каждом убийстве keltik выводилось системное сообщение: «Собрано N из 4-х клыков». $ K6 Q" t: d( G' Y8 Q6 _ " E j- i! T3 K3 ]% u2 h3 i2 j; g+ I3 d2 |% e8 ^
Наш код для onKill имеет один недостаток. Он будет постоянно показывать Chat0.htm, Chat1.htm и Chat4.htm, нам же необходимо, что бы Chat0.htm и Chat1.htm показывались только один раз. Как нам это сделать? С помощью переменных.) V* z- v- m) J& L2 c* M- {- R
1 K) m1 V) y) i4 \- h! ?7 c
. [, b2 H6 A. }( ^В каждом квесте строки могут храниться с помощью переменных. Эти переменные сохраняются в Вашей БД. В каждом методе мы можем назначить, прочитать и удалить переменные. Давайте изменим метод onKill, так что бы каждый диалог вызывался только один раз. 6 G8 d- O2 q- h& G* L
def onKill (self,npcId,st):+ X6 A. u2 p8 }* P- k
if npcId == KELTIR_NPC_ID:+ M. X( `" j* N+ ~
n = getCount(st) 4 ~1 k3 H. N& e9 I8 a' e
if n == 0: Y4 K4 [ b2 U
if st.get('chat0') == None : 3 ~. G% [# H- ~+ `0 c6 a
st.set("chat0", "true") ! z% M5 `9 F0 U' L- x
return "Chat0.htm" ) o3 r1 p9 D9 [$ X' {+ X/ U8 u
elif n == 1: ~; x& @8 s9 G8 d9 B: ]
if st.get('chat1') == None :+ H6 i8 n& x8 f+ G
st.set("chat1", "true") ) x/ b5 t" H2 Z z% S
return "Chat1.htm"8 C5 |3 u0 {/ W8 {# h3 [$ [
elif n >= 4:: U& P: D& y9 U, z/ L$ H2 E5 Y
return "Chat4.htm" & L( x# F3 L4 f y3 a, T
return "Collected "+str(n)+" of 4 fangs"" c8 [- |: G, D. h$ K
return
Скопировать код
Если у игрока нет клыков (n=0), то мы получаем занчение переменной 'chat0'. Когда метод onKill вызван в первый раз, то пока ни каких переменных не имеется и python возвращает значение None. В этом случае объявляется переменная и показывается диалог Chat0.htm. Когда мы убиваем keltir, но не получаем с него клык, функция st.get('chat0') возвращает строку true, а не None. И во второй раз окно с Chat0.htm не появится, но в окне чата появится строчка «Collected 0 of 4 fangs». По тому же принципу сделано и с Chat1.htm. % w7 t! d! I0 F/ u : W+ `1 X; z' p6 i( | * Z! p5 C, U, N3 ?! PВот конечный рабочий вариант квеста: ) @+ S; s" F' X! c9 w
import sys& B, N3 I4 v' M. D
from net.sf.l2j.gameserver.model.quest import State 2 \$ {* o1 `" Q
from net.sf.l2j.gameserver.model.quest import QuestState5 S& k& h' m; \* Y
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest0 D; }$ P* O8 }& ^' f' ^- k
7 O6 i$ ]0 T& H% L7 u
KELTIR_NPC_ID = 12082 @; G+ W5 E$ d. q! a% P
FANGS_ITEM_ID = 1859: Y2 o* f2 y z) r0 e4 O6 r4 k2 I