天堂2单机论坛

 找回密码
 立即注册
查看: 5612|回复: 6

[l2jtw]任务编写教学

[复制链接]
  • TA的每日心情
    郁闷
    2022-5-30 11:17
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    283

    主题

    398

    帖子

    7万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    76412
    发表于 2020-10-6 17:28:46 | 显示全部楼层 |阅读模式
    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對話或是獵殺任務怪物死亡後呼叫的功能。
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2025-3-27 20:42
  • 签到天数: 448 天

    [LV.9]以坛为家II

    10

    主题

    640

    帖子

    2266

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    2266
    发表于 2020-10-19 06:24:20 | 显示全部楼层
    感谢分享,支持大神
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2024-4-6 17:17
  • 签到天数: 573 天

    [LV.9]以坛为家II

    39

    主题

    1139

    帖子

    1万

    积分

    VIP会员

    Rank: 8Rank: 8

    积分
    11538
    发表于 2020-10-30 19:47:36 | 显示全部楼层
    感谢分享!!
    回复

    使用道具 举报

  • TA的每日心情

    2022-11-22 07:06
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    18

    帖子

    18

    积分

    新手上路

    Rank: 1

    积分
    18
    发表于 2022-11-20 21:13:31 | 显示全部楼层
    感谢LZ分享~!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-2-1 09:32
  • 签到天数: 57 天

    [LV.5]常住居民I

    0

    主题

    80

    帖子

    460

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    460
    发表于 2022-11-21 11:52:20 | 显示全部楼层
    感谢分享受教
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 08:09
  • 签到天数: 661 天

    [LV.9]以坛为家II

    1

    主题

    694

    帖子

    3038

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    3038
    发表于 2023-2-16 19:06:49 | 显示全部楼层
    感谢楼主的分享,谢谢!
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    5 小时前
  • 签到天数: 294 天

    [LV.8]以坛为家I

    0

    主题

    332

    帖子

    1515

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1515
    发表于 2025-1-22 22:12:28 | 显示全部楼层
    感謝版大分享,還是好難啊
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|监狱|天堂2单机论坛 ( 粤ICP备20030366号 )

    GMT+8, 2025-6-16 06:44 , Processed in 0.058060 second(s), 21 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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