任務修改教學


  請耐心看完..本貼長度不短
在此使用任務編號101團結之劍當範例

請注意格式,格式不對無法正常
包含if...elif...else...def...return的位置..一定要對好
還不熟的時候,請找任務執行方式差不多的任務來改,只須改物品,npc,各項編號及htm的那種最好
還有elif的用法要注意....非必要別使用
盡量使用if跟else


print "importing quests: 101: Sword Of Solidarity Quest"

印出訊息"置入任務:101:團結之劍"

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

導入設定,不須更動

ROIENS_LETTER_ID = 796
HOWTOGO_RUINS_ID = 937
BROKEN_SWORD_HANDLE_ID = 739
BROKEN_BLADE_BOTTOM_ID = 740
BROKEN_BLADE_TOP_ID = 741
ALLTRANS_NOTE_ID = 742
SWORD_OF_SOLIDARITY_ID = 738

設定任務中出現的物品,等號右邊指定給等號左邊
右邊是物品id,務必對應到etcitem的號碼


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

主要程式碼開始,這兩行不須更動

def onEvent (self,event,st) :
  htmltext = event
  if event == "1" :
    st.set("id","0")
    htmltext = "7008-04.htm"
    st.setState(STARTED)
    st.playSound("ItemSound.quest_accept")
    st.giveItems(ROIENS_LETTER_ID,1)
  elif event == "101_1" :
      htmltext = "7283-02.htm"
      st.takeItems(ROIENS_LETTER_ID,st.getQuestItemsCount(ROIENS_LETTER_ID))
      st.giveItems(HOWTOGO_RUINS_ID,1)
  return htmltext

定義事件
  指定事件給html
  假設發生事件1:
-----事件開始-----
    設定id為0
    指定7008-04.htm給htm
    設定狀況為已開始
    設定播放音效"接受任務"
    設定給予道具"ROIENS_LETTER_ID"
-----事件結束-----
  另外假設事件101_1發生:(elif就是else if的縮寫)
-----事件開始-----
    指定7283-02.htm給htm
    設定從玩家身上取回道具"ROIENS_LETTER_ID"

----------------------------------------------------
這個地方有兩種寫法
第一種不指定數量(有多少算多少):
st.takeItems(ROIENS_LETTER_ID,st.getQuestItemsCount(ROIENS_LETTER_ID))
第二種指定數量(在此設定為1):
st.takeItems(ROIENS_LETTER_ID,1)
----------------------------------------------------

    設定給予道具"HOWTOGO_RUINS_ID"
-----事件結束-----
  返回 html
   

def onTalk (Self,npcId,st):
  htmltext = "<html><head><body>I have nothing to say you</body></html>"
  id = st.getState()
  if id == CREATED :
  st.setState(STARTING)
  st.set("cond","0")
  st.set("onlyone","0")
  st.set("id","0")

定義對話
  指定"<html>....</html>"給html
  設定id為讀取狀況
  假設讀取狀況為創造:
  設定狀況為"開始"
  設定步驟為0
  設定任務限制未啟動
  設定id為0

  if npcId == 7008 and int(st.get("cond"))==0 and int(st.get("onlyone"))==0 :
    if int(st.get("cond"))<15 :
      if st.getPlayer().getRace().ordinal() != 0 :
        htmltext = "7008-00.htm"
      elif st.getPlayer().getLevel() >= 9 :
        htmltext = "7008-02.htm"
        st.set("cond","1")
        return htmltext
      else:
        htmltext = "7008-08.htm"
    else:
      htmltext = "7008-08.htm"

  假設npc的id是7008,玩家的步驟是0,任務限制未啟動(設定在讀取狀況為創造底下):
    假設玩家步驟小於15
      假設玩家種族不是人類
        指定7008-00.htm給htm
      另外假設玩家等級大於等於9
        指定7008-02.htm給htm
        設定步驟為1
        返回html
      非假設中的狀況(對應玩家等級大於等於9的假設)
        指定7008-08.htm給htm
    非假設中的狀況(對應玩家種族不是人類的假設)
      指定7008-08.htm給htm
     
  elif npcId == 7008 and int(st.get("cond"))==0 and int(st.get("onlyone"))==1 :
    htmltext = "<html><head><body>This quest have already been completed.</body></html>"

    另外假設npc的id是7008,玩家的步驟是0,任務限制已啟動(設定在讀取狀況為創造底下)
    指定"<html>....</html>"給htm
這裡的意思是假如完家已經解過就不能再解了

  elif npcId == 7008 and int(st.get("cond"))==1 and (st.getQuestItemsCount(ROIENS_LETTER_ID)==1) and int(st.get("onlyone"))==0 :
    htmltext = "7008-05.htm"

    另外假設npc的id是7008,玩家的步驟是1,擁有任務道具"ROIENS_LETTER_ID",任務限制未啟動(設定在讀取狀況為創造底下):
      指定7008-05.htm給htm  
就好像你還沒達成任務要求,跟npc講話...他會叫你加油之類的    
.
.
.
這一段省略(不重要,沒什麼可以教的)
.
.
.


  elif npcId == 7008 and int(st.get("cond"))==1 and int(st.get("onlyone"))==0 and st.getQuestItemsCount(ROIENS_LETTER_ID)==0 and st.getQuestItemsCount(ALLTRANS_NOTE_ID) :
    if st.getQuestItemsCount(ALLTRANS_NOTE_ID) :
      if int(st.get("id")) != 101 :
        st.set("id","101")
        htmltext = "7008-06.htm"           st.takeItems(ALLTRANS_NOTE_ID,st.getQuestItemsCount(ALLTRANS_NOTE_ID))
        st.giveItems(BROKEN_SWORD_HANDLE_ID,1)

  另外假設npc的id是7008,玩家的步驟是1,任務限制未啟動,玩家未擁有"ROIENS_LETTER_ID",但是擁有"ALLTRANS_NOTE_ID":  
      假設擁有"ALLTRANS_NOTE_ID":
        假設整數(id)的數值不等於101:
          設定id為101
          指定"7008-06.htm"給htm
          從玩家身上取回道具ALLTRANS_NOTE_ID
          給予玩家道具BROKEN_SWORD_HANDLE_ID一個
p.s.這裡一樣是設定在讀取狀況為創造底下
.
.
.
這一段省略(不重要,沒什麼可以教的)
.
.
.


  elif npcId == 7283 and int(st.get("cond"))==1 and st.getQuestItemsCount(BROKEN_SWORD_HANDLE_ID)>0 and int(st.get("onlyone"))==0 :
    st.takeItems(BROKEN_SWORD_HANDLE_ID,st.getQuestItemsCount(BROKEN_SWORD_HANDLE_ID))
    st.giveItems(SWORD_OF_SOLIDARITY_ID,1)
    st.set("cond","0")
    st.setState(COMPLETED)
    st.playSound("ItemSound.quest_finish")
    htmltext = "7283-06.htm"
    st.set("onlyone","1")
  return htmltext

  另外假設npc的id是7283,玩家的步驟是1,玩家擁有"ROKEN_SWORD_HANDLE_ID",任務限制未啟動:
    設定從玩家身上取回道具BROKEN_SWORD_HANDLE_ID
    設定給予玩家道具SWORD_OF_SOLIDARITY_ID
    設定步驟為0
    設定狀況為完成
    設定播放音效"完成任務"
    指定"7283-06.htm"給htm
    設定任務限制已啟動(不能再解)
  返回html
 
 
def onKill (self,npcId,st):
  if npcId == 362 :
    st.set("id","0")
    if st.getQuestItemsCount(HOWTOGO_RUINS_ID)>0 :
      if st.getQuestItemsCount(BROKEN_BLADE_TOP_ID) == 0 :
        if st.getRandom(5) == 0 :
        st.giveItems(BROKEN_BLADE_TOP_ID,1)
        if st.getQuestItemsCount(BROKEN_BLADE_BOTTOM_ID) == 1 :
          st.playSound("ItemSound.quest_middle")
        else:
          st.playSound("ItemSound.quest_itemget")
      else:
        if st.getQuestItemsCount(BROKEN_BLADE_BOTTOM_ID) == 0 :
        if st.getRandom(5) == 0 :
          st.giveItems(BROKEN_BLADE_BOTTOM_ID,1)
          if st.getQuestItemsCount(BROKEN_BLADE_TOP_ID) == 1 :
            st.playSound("ItemSound.quest_middle")
          else:
            st.playSound("ItemSound.quest_itemget")

定義 獵殺
  假設npc的id是362
    設定id是0
    假設玩家擁有"HOWTOGO_RUINS_ID"
      假設玩家身上BROKEN_BLADE_TOP_ID數量為0
        假設為隨機狀況(應該是5分之1...)
          設定給予玩家道具"BROKEN_BLADE_TOP_ID"1個
          假設玩家身上有"BROKEN_BLADE_BOTTOM_ID"
            設定播放音效"任務中間"
          其他(對應玩家身上有"BROKEN_BLADE_BOTTOM_ID",就是沒有的意思)
            設定播放音效"取得道具"
      其他(對應玩家身上BROKEN_BLADE_TOP_ID數量為0)
        假設BROKEN_BLADE_BOTTOM_ID數量為0
          假設為隨機狀況
          設定給予玩家道具"BROKEN_BLADE_BOTTOM_ID"1個
          假設玩家身上有"BROKEN_BLADE_TOP_ID"
            設定播放音效"任務中間"
          其他(對應玩家身上有"BROKEN_BLADE_BOTTOM_ID",就是沒有的意思)
            設定播放音效"取得道具"

  elif npcId == 361 :
    st.set("id","0")
    if st.getQuestItemsCount(HOWTOGO_RUINS_ID)>0 :
      if st.getQuestItemsCount(BROKEN_BLADE_TOP_ID) == 0 :
        if st.getRandom(5) == 0 :
        st.giveItems(BROKEN_BLADE_TOP_ID,1)
        if st.getQuestItemsCount(BROKEN_BLADE_BOTTOM_ID) == 1 :
          st.playSound("ItemSound.quest_middle")
        else:
          st.playSound("ItemSound.quest_itemget")
      else:
        if st.getQuestItemsCount(BROKEN_BLADE_BOTTOM_ID) == 0 :
        if st.getRandom(5) == 0 :
          st.giveItems(BROKEN_BLADE_BOTTOM_ID,1)
          if st.getQuestItemsCount(BROKEN_BLADE_TOP_ID) == 1 :
            st.playSound("ItemSound.quest_middle")
          else:
            st.playSound("ItemSound.quest_itemget")
  return

另外假設npc的id是361
    設定id是0
    假設玩家擁有"HOWTOGO_RUINS_ID"
      假設玩家身上BROKEN_BLADE_TOP_ID數量為0
        假設為隨機狀況
          設定給予玩家道具"BROKEN_BLADE_TOP_ID"1個
          假設玩家身上有"BROKEN_BLADE_BOTTOM_ID"
            設定播放音效"任務中間"
          其他(對應玩家身上有"BROKEN_BLADE_BOTTOM_ID",就是沒有的意思)
            設定播放音效"取得道具"
      其他(對應玩家身上BROKEN_BLADE_TOP_ID數量為0)
        假設BROKEN_BLADE_BOTTOM_ID數量為0
          假設為隨機狀況
          設定給予玩家道具"BROKEN_BLADE_BOTTOM_ID"1個
          假設玩家身上有"BROKEN_BLADE_TOP_ID"
            設定播放音效"任務中間"
          其他(對應玩家身上有"BROKEN_BLADE_BOTTOM_ID",就是沒有的意思)
            設定播放音效"取得道具"
      返回      
         

這裡有點小複雜....不仔細看還以為重複...
其實就是打兩種怪都會掉這兩種東西的設定



QUEST     = Quest(101,"101_SwordOfSolidarityQuest","Sword Of Solidarity Quest")
CREATED   = State('Start', QUEST)
STARTING   = State('Starting', QUEST)
STARTED   = State('Started', QUEST)
COMPLETED   = State('Completed', QUEST)

最後的設定作業
只有第一行需要更動
Quest(101,"101_SwordOfSolidarityQuest","Sword Of Solidarity Quest")
任務(編號,"該資料夾的全名","任務名稱")


QUEST.setInitialState(CREATED)

不須更動

QUEST.addStartNpc(7008)

設定觸發任務的npc編號


STARTED.addTalkId(7008)
STARTED.addTalkId(7283)

新增對話的npc
任務中出現幾個可以談話的npc都要在此設定


STARTED.addKillId(361)
STARTED.addKillId(362)

新增獵殺npc的id
任務中出現哪些要去獵殺的npc在此設定


STARTED.addQuestDrop(7283,ALLTRANS_NOTE_ID,1)
STARTED.addQuestDrop(7283,HOWTOGO_RUINS_ID,1)
STARTED.addQuestDrop(362,BROKEN_BLADE_TOP_ID,1)
STARTED.addQuestDrop(361,BROKEN_BLADE_TOP_ID,1)
STARTED.addQuestDrop(362,BROKEN_BLADE_BOTTOM_ID,1)
STARTED.addQuestDrop(361,BROKEN_BLADE_BOTTOM_ID,1)
STARTED.addQuestDrop(7008,ROIENS_LETTER_ID,1)
STARTED.addQuestDrop(7008,BROKEN_SWORD_HANDLE_ID,1)

設定npc的給予道具
注意,任務完成給予的最後一樣東西不在範圍內
格式為
STARTED.addQuestDrop(npc編號,給予的物品名稱,數量)

好累...大多都只是在玩邏輯的概念
其實不難


怎麼測試?

假設你已經編輯好,想要測試
請重開伺服器,會有一整排的


importing quests: 1: xxx
importing quests: 2: xxx
importing quests: 3: xxx
importing quests: 4: xxx
.
.
.


看一看有沒有你所編輯的該任務出現,假如有,就是語法正確
(詳細設定不一定跟你想的一樣,但是至少伺服器會有該任務的資料)
假設沒有出現
那就是語法錯誤了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章