找回密码
 立即注册

QQ登录

只需一步,快速开始

Close
查看: 3587|回复: 4

[L2J] DIY 自己動手做腳本 教學分享 (歡迎參考, 抄襲, 修改, 轉載)

[复制链接]
  • 打卡等级:尐伊娃
  • 打卡总天数:192
  • 打卡月天数:9
  • 打卡总奖励:1854
发表于 2015-3-24 09:24:09 | 显示全部楼层 |阅读模式
今天爬文的时候、才发现o大早已发布了这个教程、只是我们没发现而已!!!
看来还是要多多爬文、多多动手、多多学习!!!{:1_103:}
转自:l2jtw
原作者:otfnir
原文地址:
http://www.l2jtw.com/l2jtwbbs/viewtopic.php?f=39&t=10240

  • 腳本編寫

    • 腳本應該放在那裡?:
      這個有規定的 (其實可以亂放的 但不建意)
      在 gameserver\data\scripts\custom 開一個資料夾 名字任你改
      以先前寫的轉生腳本為例 (參考
      http://www.l2jtw.com/l2jtwbbs/viewtopic.php?f=82&t=10234  )
      檔案都放在 gameserver\data\scripts\custom\Rebirth 資料夾裡
    • 主要腳本檔:
      這個也是沒有規定的 你喜歡用那個名也行 不過要注意副檔名
      py --- jython 的腳本 (目前大部份腳本使用)
      java -- java 的腳本
      js -- javascript 腳本 (暫時沒發現)
      bsh -- BeanShell 腳本 (暫時沒發現)
      你可以用你喜歡的腳本語言來寫
    • 腳本格式:
      以 jpython 為例

      1. <font color="deepskyblue">import sys
      2. from com.l2jserver.gameserver.model.quest                import State
      3. from com.l2jserver.gameserver.model.quest                import QuestState
      4. from com.l2jserver.gameserver.model.quest.jython        import QuestJython as JQuest
      5. </font>
      复制代码

      參考 L2J 任務說明文件 gameserver\data\scripts\quests\documentation.txt (英文的)
      這幾行是一般任務會用到的
      作用是把 java 的幾個 class (中文好像稱"類") 引入
      要用到那個 class 便引入那個
      1. <font color="deepskyblue">qID = -1                #任務 ID
      2. qn = "Rebirth"                #任務名
      3. qDesc = "custom"        #任務簡介/通常用於搜尋 htm 的資料夾位置 /gameserver/data/script/*****/*.htm
      4. </font>
      复制代码

      然後定義 3 個變數 (其實次序沒關係 不過我習慣把會改動的變數 集中在前面 當是設定檔般修改)
      這三個變數 是對應到程式最尾 註冊任務時會用到
      1. <font color="deepskyblue">QUEST = Rebirth(qID, qn, qDesc)
      2. </font>
      复制代码

      qID 是任務的 ID, 在遊戲中 "重新載入任務" 時會用到
      qn 是任務的名稱, 跟 NPC 對話時的 HTM 會用到 "重新載入任務" 時也會用到
      qDesc 是任務簡介 或用作尋找 HTM 檔時的其中一個路徑
      1. <font color="deepskyblue">NPCID = [65535]                #觸發的 NPC ID, 可多個 NPC [65535, 88888, 99999]
      2. </font>
      复制代码

      NPCID 是觸發這個任務的 NPC ID 剛才我們不是自訂了一個 65535 的 NPC..
      1. <font color="deepskyblue">class Rebirth(JQuest):
      2.         def __init__(self, id, name, descr):
      3.                 JQuest.__init__(self, id, name, descr)
      4. </font>
      复制代码

      定義一個 class 用來 extends (延伸) com.l2jserver.gameserver.model.quest.jython.QuestJython 這個 class
      及初始化

      1. <font color="deepskyblue">        def onFirstTalk(self, npc, player):
      2.                 return "onFirstTalk.htm"
      3. </font>
      复制代码

      onFirstTalk 是直接點 NPC 的第一次對話
      這裡為了簡單講解 所以只是回傳一個 HTM 檔的內容
      或者你可以直接回傳 HTM 的內文 像這樣寫

      1. <font color="deepskyblue">        def onFirstTalk(self, npc, player):
      2.                 return "<html><body>你好</body></html>"
      3. </font>
      复制代码

      .........

      1. <font color="deepskyblue">QUEST = Rebirth(qID, qn, qDesc)
      2. for id in NPCID:
      3.         QUEST.addStartNpc(id)
      4.         QUEST.addFirstTalkId(id)
      5.         QUEST.addTalkId(id)
      6. </font>
      复制代码

      addStartNpc 註冊那個 NPC, 點了自動申請任務. 註:每個 NPC 只可註冊一個任務作為自動申請
      addFirstTalkId 註冊那個 NPC, 點了會跳到 onFirstTalk
      addTalkId 註冊那個 NPC, 會回應 onTalk. 另外 onFirstTalk 的 bypass Quest 也需要註冊這個
      整個看起來便是這樣

      1. <font color="deepskyblue">import sys
      2. from com.l2jserver.gameserver.model.quest                import State
      3. from com.l2jserver.gameserver.model.quest                import QuestState
      4. from com.l2jserver.gameserver.model.quest.jython        import QuestJython as JQuest
      5. qID = -1                #任務 ID
      6. qn = "Rebirth"                #任務名
      7. qDesc = "custom"        #任務簡介/通常用於搜尋 htm 的資料夾位置 /gameserver/data/script/*****/*.htm
      8. NPCID = [65535]                #觸發的 NPC template ID, 可多個 NPC [65535, 88888, 99999]
      9. class Rebirth(JQuest):
      10.         def __init__(self, id, name, descr):
      11.                 JQuest.__init__(self, id, name, descr)
      12.         def onFirstTalk(self, npc, player):
      13.                 return "<html><body>你好</body></html>"
      14. QUEST = Rebirth(qID, qn, qDesc)
      15. for id in NPCID:
      16.         QUEST.addStartNpc(id)
      17.         QUEST.addFirstTalkId(id)
      18.         QUEST.addTalkId(id)
      19. </font>
      复制代码

      很簡單吧
      當然這個腳本 只會說一句 "你好" 沒其他功能
      留待以後再慢慢詳細解說

  • 腳本測試及除錯

    • 註冊自訂腳本:
      自訂腳本寫好後 要在 gameserver\data\scripts.cfg 裡註冊
      所謂註冊 其實只是在檔案裡 加入腳本的路徑檔案
      以轉生腳本為例
      加入一句便註冊了
      1. <font color="deepskyblue">custom/Rebirth/__init__.py
      2. </font>
      复制代码

    • 召喚 "自訂 NPC" 及測試:
      在遊戲內用管理員指令 輸入 //admin
      出現畫面
      輸入 "自訂 NPC" 的 ID 然後按 召喚
      點看看 會說 "你好" 便成功了
    • 除錯:
      當出現錯誤時 通常會有錯誤訊息
      這裡有個很重要的資訊
      它會記錄你錯誤的行號..
    • 重新載入腳本:
      你可以在遊戲運行中 重載腳本 打腳本的名稱 或 ID
      例如要重載轉生腳本 可以打
      1. <font color="deepskyblue">//quest_reload Rebirth</font>
      复制代码

      可以不停修改腳本 及重載 方便測試
      但如果修改腳本後 重載時出現錯誤 你會發現 即使修正了問題 還是不能重載
      那麼 可以用另一個指令 //script_load 路徑
      例如要載入轉生腳本 便是
      1. <font color="deepskyblue">//script_load custom/Rebirth/__init__.py</font>
      复制代码

      這個方法也可以在 GS 初始化時 腳本已經出錯的時候用
      很方便吧 :)




回复

使用道具 举报

发表于 2015-3-24 13:53:52 | 显示全部楼层
這個... 有點過時了 哈..
謝謝分享....
小弟也沒有爬文的習慣...
寫完這個後.. 後來(幾年後?) 才發現 之前也有前輩寫過類似的教學.. 哈.
回复

使用道具 举报

  • 打卡等级:尐伊娃
  • 打卡总天数:192
  • 打卡月天数:9
  • 打卡总奖励:1854
 楼主| 发表于 2015-3-24 15:17:32 | 显示全部楼层
xxx001 发表于 2015-3-24 13:53
這個... 有點過時了 哈..
謝謝分享....
小弟也沒有爬文的習慣...

不能说过时、能有教程来学习就是新的、
知识是死的、人是活的!!!!
回复

使用道具 举报

发表于 2020-12-22 20:28:57 | 显示全部楼层
感謝分享~~~
回复

使用道具 举报

  • 打卡等级:尐精灵
  • 打卡总天数:16
  • 打卡月天数:0
  • 打卡总奖励:175
发表于 2022-10-23 14:42:34 | 显示全部楼层
谢谢分享,学习学习
回复

使用道具 举报

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

本版积分规则

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