Сообщений: 433
Тем: 35
Зарегистрирован: Jun 2009
Репутация:
1,392
В Таблицах SQL сборки 482, в родных ТП указанна только требуемое количество итемов, а не их ID. Мне нужно сделать так, чтобы при наличии определенного итема, НПС телепортировал в определенную точку карты и забирал итем.
Пробовал переделать квест 1104_NewbieTravelToken
Открыть спойлер
Спойлер# Newbie Travel Token Teleport - by DrLecter
import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest
qn = "1104_NewbieTravelToken"
DATA={
30600:[ 12111, 16686,-4584], #DE
30601:[115632,-177996, -896], #DW
30599:[ 45475, 48359,-3056], #EV
30602:[-45032,-113598, -192], #OV
30598:[-84081, 243227,-3728], #TI
32135:[-119697, 44532, 360] #KM
}
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def onEvent (self,event,st):
if event.isdigit() :
dest = int(event)
if dest in DATA.keys() :
x,y,z = DATA[dest]
if x and y and z :
st.getPlayer().teleToLocation(x,y,z)
st.exitQuest(1)
return
def onTalk (Self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
if player.getLevel() >= 20 :
htmltext = "1.htm"
st.exitQuest(1)
else:
htmltext = str(npcId)+".htm"
return htmltext
QUEST = Quest(1104,qn,"Teleports")
for i in DATA.keys() :
QUEST.addStartNpc(i)
QUEST.addTalkId(i)
, для себя, но неполучилось. НПС просто игнорит. Помогите пожалуйста разобраться как самому сделать ТП за определенные итемы.
Сообщений: 6,450
Тем: 262
Зарегистрирован: Nov 2007
Репутация:
44,165
Хороший скрипт взяли для "фундамента", но вот одного не понял, куда Вы удалили TOKEN, в котором и был указан ID предмета, который забирают?
[SOURCE="py"]qn = "1104_NewbieTravelToken"
TOKEN = 8542 # предмет, который мы наглым образом отберем у бедного персонажа
DATA={
30600:[ 12160, 16554,-4583],# Деревня Темных Эльфов
30601:[115594,-177993, -912],# Деревня Гномов
30599:[ 45470, 48328,-3059],# Деревня Эльфов
30602:[-45067,-113563, -199],# Деревня Орков
30598:[-84053, 243343,-3729],# Деревня Людей
32135:[-119712, 44519, 368] # Деревня Камаель
}[/SOURCE]
Где указывать нужный предмет, я думаю вам понятно стало. Идем дальше.
[SOURCE="py"] def onAdvEvent (self,event,npc, player) :
htmltext = event
st = player.getQuestState(qn)
if not st : return
if event.isdigit():
dest=int(event)
if dest in DATA.keys():
x,y,z=DATA[dest]
if x and y and z:
if st.getQuestItemsCount(TOKEN): # проверка, есть ли у персонажа предмет с id 8542
st.takeItems(TOKEN,1) # предмет(ы) с id 8542 найден(ы), отберем 1 шт.
st.getPlayer().teleToLocation(x,y,z) # телепортируем на указанные в DATA координаты
else: # предмет с id 8542 не найден у персонажа, отсылаем его на... рынок
st.exitQuest(1) # выходим из квеста
return "Incorrect item count" # выводим сообщение о том, что нехватает предмета
st.exitQuest(1)
return[/SOURCE]
Все расписал, думаю вопросов не будет. И последнее, квест будет работать только у персонажей < 20 уровня, ведь там есть проверка.
[SOURCE="py"] def onTalk (Self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
if player.getLevel() >= 20: # проверяем персонажа и если его уровень больше или равен 20, то даем отбой
htmltext="1.htm"
st.exitQuest(1)
else:
htmltext=str(npcId)+".htm"
return htmltext[/SOURCE]
Приводим все в такое состояние и радуемся жизни.
[SOURCE="py"] def onTalk (Self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
#if player.getLevel() >= 20: # проверяем персонажа и если его уровень больше или равен 20, то даем отбой
# htmltext="1.htm"
# st.exitQuest(1)
#else:
htmltext=str(npcId)+".htm"
return htmltext[/SOURCE]
Сообщений: 433
Тем: 35
Зарегистрирован: Jun 2009
Репутация:
1,392
Спасибо Вам за правку скрипта. Сделал как Вы сказали, но скрипт не работает.
1) Итоговый вид моего скрипта:
Открыть спойлер
Спойлер
# Newbie Travel Token Teleport - by DrLecter
import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest
qn = "997_NewbieTP"
TOKEN = 8542
DATA={
7777:[ -112570, 87174,-12935], #1
7778:[-112381,87177, -12974], #2
7779:[ -112189, 87178,-12974], #3
}
class Quest (JQuest) :
def __init__(self,id,name,descr): JQuest.__init__(self,id,name,descr)
def onAdvEvent (self,event,npc, player) :
htmltext = event
st = player.getQuestState(qn)
if not st : return
if event.isdigit():
dest=int(event)
if dest in DATA.keys():
x,y,z=DATA[dest]
if x and y and z:
if st.getQuestItemsCount(TOKEN):
st.takeItems(TOKEN,1)
else:
st.exitQuest(1)
return "Incorrect item count"
st.exitQuest(1)
return
def onTalk (Self,npc,player):
st = player.getQuestState(qn)
npcId = npc.getNpcId()
if player.getLevel() >= 20:
htmltext = "1.htm"
st.exitQuest(1)
else:
htmltext = str(npcId)+".htm"
return htmltext
QUEST = Quest(997,qn,"custom")
for i in DATA.keys() :
QUEST.addStartNpc(i)
QUEST.addTalkId(i)
2) Файл ошибки __init__.py.error
Открыть спойлер
Спойлер
Error on: D:\Aristo-L2jServer\Work\l2emurt-game\dist\data\scripts\custom\997_NewbieTP\__init__.py.error.log
Line: -1 - Column: -1
Traceback (innermost last):
(no code object) at line 0
ValueError: Strings added to sha hashes must not contain characters with value > 255
------
Дословно понял, что какое-то значение превышает допустимую длину, но как с этим бороться, не знаю.
Буду весьма признателен, если Вы поможете мне разобраться в этом скрипте. Также буду очень благодарен, если Вы поделитесь ссылочкой на мануал по этим скриптам(основные Команды, Ввод переменных, привязка к ядру сервера.)
Сообщений: 6,450
Тем: 262
Зарегистрирован: Nov 2007
Репутация:
44,165
Я вам дал рабочий вариант, проверенный, то что Вы показываете что-то кривое, питон не может работать без правильных переносов\пробелов и т.д. В массиве DATA (последняя строка) ошибка, откуда там появилась запятая?
Сообщений: 433
Тем: 35
Зарегистрирован: Jun 2009
Репутация:
1,392
Спасибо. Извините, что отнял Ваше время. Буду разбираться.
Сообщений: 38
Тем: 3
Зарегистрирован: Oct 2008
Репутация:
0
Добрые люди подскажите в чем косяк. Пытаюсь сделать квест для новичков, но почему то квест не запускается и никаких ошибок не выдает. Сборка таже, хтмлки все сделаны. Вот сам квест:
Открыть спойлер
СпойлерКод: import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest
qn = "201_NewbieQuest"
ITEM_ID = 9754
ADENA = 57
class Quest (JQuest) :
def __init__(self,id,name,descr):
JQuest.__init__(self,id,name,descr)
self.questItemIds = [ITEM_ID]
def onEvent (self,event,st) :
htmltext = event
if event == "90011-04.htm" :
st.set("cond","1")
st.setState(State.STARTED)
st.playSound("ItemSound.quest_accept")
return htmltext
def onTalk (self,npc,player):
htmltext = "<html><body>You are either not on a quest that involves this NPC, or you don't meet this NPC's minimum quest requirements.</body></html>"
st = player.getQuestState(qn)
if not st : return htmltext
npcId = npc.getNpcId()
id = st.getState()
if id == State.CREATED :
st.set("cond","0")
if st.getInt("cond")==0 :
if player.getLevel() >= 18 :
htmltext = "90011-03.htm"
else:
htmltext = "90011-02.htm"
st.exitQuest(1)
else :
if st.getQuestItemsCount(ITEM_ID)<10 :
htmltext = "90011-05.htm"
else :
st.takeItems(ITEM_ID,-1)
st.rewardItems(ADENA,2000000)
st.exitQuest(1)
st.playSound("ItemSound.quest_finish")
htmltext = "90011-06.htm"
return htmltext
def onKill (self,npc,player,isPet) :
st = player.getQuestState(qn)
if not st : return
if st.getState() != State.STARTED : return
chance=22+(((npc.getNpcId()-20000)^34)/4)
count=st.getQuestItemsCount(ITEM_ID)
if count < 10 and st.getRandom(100) < chance :
st.giveItems(ITEM_ID,1)
if count == 9 :
st.playSound("ItemSound.quest_middle")
st.set("cond","2")
else :
st.playSound("ItemSound.quest_itemget")
return
QUEST = Quest(201,qn,"Help")
QUEST.addStartNpc(90011)
QUEST.addTalkId(90011)
QUEST.addKillId(90501)
QUEST.addKillId(90502)
Сообщений: 38
Тем: 3
Зарегистрирован: Oct 2008
Репутация:
0
всем спасибо. сам все нашел и исправил
Открыть спойлер
СпойлерКод: import sys
from net.l2emuproject.gameserver.model.quest import State
from net.l2emuproject.gameserver.model.quest import QuestState
from net.l2emuproject.gameserver.model.quest.jython import QuestJython as JQuest
qn = "201_NewbieQuest"
ITEM_ID = 9754
ADENA = 57
class Quest (JQuest) :
def __init__(self,id,name,descr):
JQuest.__init__(self,id,name,descr)
self.questItemIds = [ITEM_ID]
def onEvent (self,event,st) :
htmltext = event
if event == "90011-04.htm" :
st.set("cond","1")
st.setState(State.STARTED)
st.playSound("ItemSound.quest_accept")
return htmltext
def onTalk (self,npc,player):
htmltext = "<html><body>You are either not on a quest that involves this NPC, or you don't meet this NPC's minimum quest requirements.</body></html>"
st = player.getQuestState(qn)
if not st : return htmltext
npcId = npc.getNpcId()
id = st.getState()
if id == State.CREATED :
st.set("cond","0")
if st.getInt("cond")==0 :
if player.getLevel() >= 20 :
htmltext = "90011-03.htm"
else:
htmltext = "90011-02.htm"
st.exitQuest(1)
else :
if st.getQuestItemsCount(ITEM_ID)<10 :
htmltext = "90011-05.htm"
else :
st.takeItems(ITEM_ID,-1)
st.rewardItems(ADENA,2000000)
st.exitQuest(1)
st.playSound("ItemSound.quest_finish")
htmltext = "90011-06.htm"
return htmltext
def onKill(self,npc,player,isPet):
st = player.getQuestState(qn)
if not st : return
if st.getState() != State.STARTED : return
chance=22+(((npc.getNpcId()-20000)^34)/4)
count=st.getQuestItemsCount(ITEM_ID)
if count < 10 and st.getRandom(100) < chance :
st.giveItems(ITEM_ID,1)
if count == 9 :
st.playSound("ItemSound.quest_middle")
st.set("cond","2")
else :
st.playSound("ItemSound.quest_itemget")
return
QUEST = Quest(201,qn,"Kill Zombi")
QUEST.addStartNpc(90011)
QUEST.addTalkId(90011)
QUEST.addKillId(90501)
QUEST.addKillId(90502)
|