点击投放广告点击投放广告点击投放广告点击投放广告
点击投放广告点击投放广告点击投放广告点击投放广告
广告
广告
广告
广告
广告
搜索
Hi~登录注册
查看: 1336|回复: 0

[游戏修改教程] 三国天堂2任务编写教学

[复制链接]

24

主题

24

帖子

61

积分

常驻人口

Rank: 2

积分
61

最佳新人

发表于 2022-6-7 22:29:03 | 显示全部楼层 |阅读模式


任务编写教学


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、游乐论坛-游乐网单-游乐单机游戏所有网单资源来源于网络,仅供学习交流之用,切勿用于商业用途.

2、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意.

3、游乐论坛游戏提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!

4、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担.

5、游乐论坛游戏所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站.

6、游乐论坛游戏使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,游乐论坛游戏不承担任何责任,本站已经进行告知义务.

7、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束.

8、游乐论坛游戏以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!

9、游乐论坛游戏如无意中侵犯了某个企业或个人的知识产权,请联系站长邮箱:zhl5@zhl5.com告之,本站将立即删除并致以最深的歉意.

游客
回复
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

广告
广告
广告
广告
广告
快速回复 返回顶部 返回列表