請耐心看完..本貼長度不短 在此使用任務編號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 . . .
看一看有沒有你所編輯的該任務出現,假如有,就是語法正確 (詳細設定不一定跟你想的一樣,但是至少伺服器會有該任務的資料) 假設沒有出現 那就是語法錯誤了 |
|