天堂2单机版

QQ群号16947726
 
首页日历常见问题与解答 (FAQ)搜索会员群组注册登录

分享 | 
 

 【教程】任务编写教学----转载

向下 
作者留言
376455778



帖子数 : 19
注册日期 : 13-07-16

帖子主题: 【教程】任务编写教学----转载   周二 八月 20, 2013 11:05 am

1. 在py檔裡先呼叫任務的 java class

代碼:
import sys
from net.sf.l2j.gameserver.model.quest import State
from net.sf.l2j.gameserver.model.quest import QuestState
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest



Class QuestJython 是關於任務的資訊
Class State 是關於任務中每一個階段的狀態
Class QuestState 是關於玩家在進行任務的狀態或資訊
一般而言在編寫任務時,都要先呼叫這三個。

2. 宣告任務NPC、道具等等

代碼:
KELTIR_NPC_ID = 12082            // 任務NPC
FANGS_ITEM_ID = 1859             // 任務道具
DROP_RATE     = 500000           // 任務道具掉落率
WORLD_MAP_ITEM_ID = 1665      // 任務獎勵




我們盡量用這種方式,直接使用代碼也可以,不過會造成修改上的問題。
所以儘量使你的py檔具有可讀性。

3. 宣告一些可以幫助任務判別的功能

代碼:
def getCount(st) :       // st是指QuestState
 return st.getQuestItemsCount(FANGS_ITEM_ID)




這個功能是用來得知玩家在任務過程中,獲得多少任務道具。

代碼:
def completed(st) :    // st是指QuestState
 st.setState(COMPLETED)     // ?]定任務完成狀態
 st.clearQuestDrops()    
 st.takeItems(FANGS_ITEM_ID,-1)    // 將任務道具收回
 st.giveItems(WORLD_MAP_ITEM_ID,1)    // 給玩家獎勵
 st.exitQuest(False)    // 此任務不能重複執行
 return




這個功能是用來幫助任務結束。
將玩家身上的任務道具收回,並給予獎勵,並且將任務結束。

代碼:
def check(st) :
 if getCount(st) >= 4 :    // 任務道具4個以上
   completed(st)
 return




這個功能來幫助我們確認玩家身上的道具數量,而使任務結束。

4. 宣告任務本身

代碼:
class Quest (JQuest):

 def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

 def onEvent (self,event,st):
   id = st.getState()
   if   id == CREATED  : st.setState(STARTED)
   elif id == COMPLETED: pass
   elif id == STARTED  : check(st)
   return




任務是由 python class 所構成的,它是由 java class 延伸出來的。
在這裡我們用了一個任務觸發的方法 (onEvent)。

在 def __init__(self,id,name,descr) 裡的定義:

代碼:
self    // 關於任務
id    // 任務在客戶端的編號代碼
name    // 任務名稱,必須與L2jserver的任務名稱相同
descr    // 任務描述,會在客戶端顯示出來




而 def onEvent (self,event,st) 裡的定義:

代碼:
self    // 關於目前這個任務
event    // 一個字串的定義,可以被java?{式觸發
st    // QuestState的狀態,可以提供玩家目前任務進行的資訊




5. 說明 onEvent 的方法

代碼:
id = st.getState()




我們將玩家目前任務進行的狀態數值宣告,它會被存入 id 。

接著我們檢查任務的狀態,並且使任務狀態轉移到新的狀態。

代碼:
if   id == CREATED  : st.setState(STARTED)




如果玩家觸發了任務,狀態為 (state CREATED) ,那麼任務狀態
將轉移至 (state STARTED) 。

代碼:
elif id == COMPLETED: pass




如果玩家已經完成任務,那我們在這就不處理它。

代碼:
elif id == STARTED  : check(st)




如果玩家仍然在任務進行中,那麼我們呼叫
我們之前所宣告的功能,來檢查任務道具數量。

代碼:
def check(st) :
 if getCount(st) >= 4 :    // 任務道具4個以上
   completed(st)
 return




如果玩家身上的道具數量足夠的話,那任務狀態
就直接進入結束狀態 (state COMPLETED) 。

在這個範例中,我們並沒有檢查 (event) 的狀態,因為
所有的 (Event) 的發生狀態都是經由與 NPC 對話所發生的
,所以 (onEvent) 被呼叫的話,一定是玩家與 NPC 對話。

6. 宣告任務狀態

代碼:
QUEST     = Quest(201,"Tutorial", "Tutorial quest")
CREATED   = State('Start',     QUEST)
STARTED   = State('Started',   QUEST)
COMPLETED = State('Completed', QUEST)




每一個狀態都連結一個對話 (html) ,所以當狀態發生時,
都會顯示一個對話:
狀態 (CREATED) 發生時,出現 start.htm
狀態 (STARTED) 發生時,出現 started.htm
狀態 (COMPLETED) 發生時,出現 Completed.htm

代碼:
QUEST.setInitialState(CREATED)
QUEST.addStartNpc(7056)    // 任務觸發 NPC




現在我們要為這個任務宣告觸發狀態及任務觸發 NPC 。

代碼:
<a action="bypass -h npc_%objectId%_Quest">任務</a>



在觸發 NPC 的 html 裡要有這段連結來觸發任務。

7. 宣告任務道具掉落

代碼:
STARTED.addQuestDrop(KELTIR_NPC_ID,FANGS_ITEM_ID,DROP_RATE)




設定玩家在 (STARTED) 狀態時,任務道具掉落、機率及獵殺的怪物。

8. 任務編寫完成

代碼:
import sys
from net.sf.l2j.gameserver.model.quest import State
from net.sf.l2j.gameserver.model.quest import QuestState
from net.sf.l2j.gameserver.model.quest.jython import QuestJython as JQuest


KELTIR_NPC_ID = 12082
FANGS_ITEM_ID = 1859
DROP_RATE     = 500000
WORLD_MAP_ITEM_ID = 1665


def getCount(st) :
 return st.getQuestItemsCount(FANGS_ITEM_ID)

def completed(st) :
 st.setState(COMPLETED)
 st.clearQuestDrops()
 st.takeItems(FANGS_ITEM_ID,-1)
 st.giveItems(WORLD_MAP_ITEM_ID,1)
 st.exitQuest(False)
 return

def check(st) :
 if getCount(st) >= 4 :
   completed(st)
 return

class Quest (JQuest):

 def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)

 def onEvent (self,event,st):
   id = st.getState()
   if   id == CREATED  : st.setState(STARTED)
   elif id == COMPLETED: pass
   elif id == STARTED  : check(st)
   return

QUEST     = Quest(201,"Tutorial", "Tutorial quest")
CREATED   = State('Start',     QUEST)
STARTED   = State('Started',   QUEST)
COMPLETED = State('Completed', QUEST)

QUEST.setInitialState(CREATED)
QUEST.addStartNpc(7056)

STARTED.addQuestDrop(KELTIR_NPC_ID,FANGS_ITEM_ID,DROP_RATE)




這個任務已經完成,並可以在伺服器上執行了。
我們來說明一下這個任務的流程:

I. 玩家向 NPC (ID 7056) 對話並觸發任務,此時任務的狀態
為 CREATED ,同時顯示對話 Start.htm 。

II. 而 Start.htm 會呼叫 (onEvent) 這個功能,使得任務的狀態
轉變為 STARTED ,同時顯示對話 Started.htm 。

III. 在 STARTED 的狀態下,會使任務怪物掉落任務道具。
在這個狀態下,玩家也許會回去找 NPC 對話,此時 (onEvent)
功能會被再呼叫,在這個狀態下, check(st) 功能會檢查玩家
身上是否有足夠的任務道具,如果沒有足夠的任務道具,會再
次出現 Started.htm 。如果玩家有足夠的道具, check(st) 會
將任務狀態轉換至 COMPLETED 的狀態,收回玩家身上的任務
道具,並給予玩家獎勵,而同時會出現對話 Completed.htm 。

以上這個任務只用了 onEvent 這個功能,其實還有另外兩個功能
尚未使用到, onTalk 和 onKill ,這兩個功能類似 onEvent,
使用時機不同而已。

在以上的範例中,我們並沒有宣告 onTalk or onKill 這兩種功能,
所以整個任務的流程都是使用 onEvent 這個功能。
onEvent 功能和這兩個功能不同的地方是, onTalk or onKill 是針對
在任務中玩家與NPC對話或是獵殺任務怪物死亡後呼叫的功能。
返回页首 向下
查阅用户资料
 
【教程】任务编写教学----转载
返回页首 
1页/共1

您在这个论坛的权限:不能在这个论坛回复主题
天堂2单机版 :: 服务端技术区 :: 教程区-
转跳到: