2015年4月—2024年4月,论坛已建立9周年,欢迎加入QQ群讨论:419848937

任务编写教学

主要是游戏中一些经典任务、游戏资料的科普.
回复
头像
hagcse
Mr.GL
Mr.GL
帖子: 151
注册时间: 2018-02-25 15:50

任务编写教学

帖子 hagcse » 2018-03-10 15:24

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對話或是獵殺任務怪物死亡後呼叫的功能。
图片

回复